github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/mount/mtd/doc.go (about) 1 // Copyright 2019 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Chips are made by vendors, and an individual vendor is 6 // defined by a 1 to 8 byte vendor id stored in the chip. 7 // An instance of a type of chip, with, e.g., a particular size, 8 // is defined by a 1 to 3 or so byte device id stored in the chip. 9 // The vendor, device id pair can be used to find both unique 10 // properties of a chip (e.g. size) and the common properties of a chip 11 // (e.g. erase value, voltages, erase blocks. etc.) 12 // It is not at all unusual to know a vendor but not a device id. 13 // Hence we need to be able to get a vendor given a vendor id, 14 // and then a chip given a chip id. It's ok, however, to know 15 // the vendor and fail to know the chip. 16 // 17 // Sadly, device ids are not unique; they are reused per vendor. 18 // And, as mentioned, both vendor and device id are variable length. 19 // In a not uncommon failure of vision, they started out as 1 byte 20 // each, grew to 2, then 3 in some cases, 7 in other. Good times. 21 // Life would be easier if everybody just made these things strings 22 // in the beginning. 23 // 24 // An ID identifies a vendor, but not the same vendor over time. 25 // Vendor names for a given ID change over time, due to buyouts, 26 // bankruptcies, and the occasional near depression. 27 // For example, what was AMD is now Spansion. 28 // This name changing complicates the picture a bit, 29 // so we maintain a list of vendor names for a given part, with 30 // the first name in the list being the current name. This will allow 31 // us to accomodate scripts that might have the wrong vendor name. 32 // As time goes by, and bankruptcies accumulate, this first name 33 // can change. 34 // 35 // Hence, it is useful to have 3 bits of knowledge 36 // o list of vendor names given a vendor id 37 // o list of chips and their unique properties given a device id 38 // o list of common properties which can be referenced from a chip 39 // 40 // We wish to embed this code in FLASH so if needed we can burn 41 // a chip from FLASH-embedded u-root. 42 // 43 // This code uses strings, not integers, 44 // since device and vendor IDs are now variable length, depending 45 // on year of manufacture. Further, it is just nicer to work with 46 // strings. 47 // 48 // In most cases, we will walk these tables once, so we design for 49 // exhaustive search. The tables are short and are traversed in 50 // microseconds, you only do it once, and it's important to keep data 51 // as compact as possible. 52 // 53 // A note on flashing. Writing is not zero cost: each erase/write 54 // cycle reduces chip lifetime. Data in the chip need not be erased to 55 // be written: 0xee can be changed to 0xcc without an erase cycle in 56 // many parts. Code can make a guess a guess at an optimal 57 // erase/write pattern based on the size of the regions to be written, 58 // the content of regions, and the size of the blocks available. 59 // Getting this calculation right has proven to be tricky, as it has 60 // to balance time costs of writing, expected costs of too many erase 61 // cycles, and several other factors I can not recall just now. Watch 62 // this space. 63 // 64 // TODO: figure out some minimum set of config options for Linux, with 65 // the proviso that this will be very kernel version dependent. 66 package mtd