m25p80.c 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860
  1. /*
  2. * ST M25P80 emulator. Emulate all SPI flash devices based on the m25p80 command
  3. * set. Known devices table current as of Jun/2012 and taken from linux.
  4. * See drivers/mtd/devices/m25p80.c.
  5. *
  6. * Copyright (C) 2011 Edgar E. Iglesias <edgar.iglesias@gmail.com>
  7. * Copyright (C) 2012 Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com>
  8. * Copyright (C) 2012 PetaLogix
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License as
  12. * published by the Free Software Foundation; either version 2 or
  13. * (at your option) a later version of the License.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License along
  21. * with this program; if not, see <http://www.gnu.org/licenses/>.
  22. */
  23. #include "qemu/osdep.h"
  24. #include "qemu/units.h"
  25. #include "sysemu/block-backend.h"
  26. #include "hw/block/block.h"
  27. #include "hw/block/flash.h"
  28. #include "hw/qdev-properties.h"
  29. #include "hw/qdev-properties-system.h"
  30. #include "hw/ssi/ssi.h"
  31. #include "migration/vmstate.h"
  32. #include "qemu/bitops.h"
  33. #include "qemu/log.h"
  34. #include "qemu/module.h"
  35. #include "qemu/error-report.h"
  36. #include "qapi/error.h"
  37. #include "trace.h"
  38. #include "qom/object.h"
  39. #include "m25p80_sfdp.h"
  40. /* 16 MiB max in 3 byte address mode */
  41. #define MAX_3BYTES_SIZE 0x1000000
  42. #define SPI_NOR_MAX_ID_LEN 6
  43. /* Fields for FlashPartInfo->flags */
  44. enum spi_flash_option_flags {
  45. ER_4K = BIT(0),
  46. ER_32K = BIT(1),
  47. EEPROM = BIT(2),
  48. HAS_SR_TB = BIT(3),
  49. HAS_SR_BP3_BIT6 = BIT(4),
  50. };
  51. typedef struct FlashPartInfo {
  52. const char *part_name;
  53. /*
  54. * This array stores the ID bytes.
  55. * The first three bytes are the JEDIC ID.
  56. * JEDEC ID zero means "no ID" (mostly older chips).
  57. */
  58. uint8_t id[SPI_NOR_MAX_ID_LEN];
  59. uint8_t id_len;
  60. /* there is confusion between manufacturers as to what a sector is. In this
  61. * device model, a "sector" is the size that is erased by the ERASE_SECTOR
  62. * command (opcode 0xd8).
  63. */
  64. uint32_t sector_size;
  65. uint32_t n_sectors;
  66. uint32_t page_size;
  67. uint16_t flags;
  68. /*
  69. * Big sized spi nor are often stacked devices, thus sometime
  70. * replace chip erase with die erase.
  71. * This field inform how many die is in the chip.
  72. */
  73. uint8_t die_cnt;
  74. uint8_t (*sfdp_read)(uint32_t sfdp_addr);
  75. } FlashPartInfo;
  76. /* adapted from linux */
  77. /* Used when the "_ext_id" is two bytes at most */
  78. #define INFO(_part_name, _jedec_id, _ext_id, _sector_size, _n_sectors, _flags)\
  79. .part_name = _part_name,\
  80. .id = {\
  81. ((_jedec_id) >> 16) & 0xff,\
  82. ((_jedec_id) >> 8) & 0xff,\
  83. (_jedec_id) & 0xff,\
  84. ((_ext_id) >> 8) & 0xff,\
  85. (_ext_id) & 0xff,\
  86. },\
  87. .id_len = (!(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))),\
  88. .sector_size = (_sector_size),\
  89. .n_sectors = (_n_sectors),\
  90. .page_size = 256,\
  91. .flags = (_flags),\
  92. .die_cnt = 0
  93. #define INFO6(_part_name, _jedec_id, _ext_id, _sector_size, _n_sectors, _flags)\
  94. .part_name = _part_name,\
  95. .id = {\
  96. ((_jedec_id) >> 16) & 0xff,\
  97. ((_jedec_id) >> 8) & 0xff,\
  98. (_jedec_id) & 0xff,\
  99. ((_ext_id) >> 16) & 0xff,\
  100. ((_ext_id) >> 8) & 0xff,\
  101. (_ext_id) & 0xff,\
  102. },\
  103. .id_len = 6,\
  104. .sector_size = (_sector_size),\
  105. .n_sectors = (_n_sectors),\
  106. .page_size = 256,\
  107. .flags = (_flags),\
  108. .die_cnt = 0
  109. #define INFO_STACKED(_part_name, _jedec_id, _ext_id, _sector_size, _n_sectors,\
  110. _flags, _die_cnt)\
  111. .part_name = _part_name,\
  112. .id = {\
  113. ((_jedec_id) >> 16) & 0xff,\
  114. ((_jedec_id) >> 8) & 0xff,\
  115. (_jedec_id) & 0xff,\
  116. ((_ext_id) >> 8) & 0xff,\
  117. (_ext_id) & 0xff,\
  118. },\
  119. .id_len = (!(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))),\
  120. .sector_size = (_sector_size),\
  121. .n_sectors = (_n_sectors),\
  122. .page_size = 256,\
  123. .flags = (_flags),\
  124. .die_cnt = _die_cnt
  125. #define JEDEC_NUMONYX 0x20
  126. #define JEDEC_WINBOND 0xEF
  127. #define JEDEC_SPANSION 0x01
  128. /* Numonyx (Micron) Configuration register macros */
  129. #define VCFG_DUMMY 0x1
  130. #define VCFG_WRAP_SEQUENTIAL 0x2
  131. #define NVCFG_XIP_MODE_DISABLED (7 << 9)
  132. #define NVCFG_XIP_MODE_MASK (7 << 9)
  133. #define VCFG_XIP_MODE_DISABLED (1 << 3)
  134. #define CFG_DUMMY_CLK_LEN 4
  135. #define NVCFG_DUMMY_CLK_POS 12
  136. #define VCFG_DUMMY_CLK_POS 4
  137. #define EVCFG_OUT_DRIVER_STRENGTH_DEF 7
  138. #define EVCFG_VPP_ACCELERATOR (1 << 3)
  139. #define EVCFG_RESET_HOLD_ENABLED (1 << 4)
  140. #define NVCFG_DUAL_IO_MASK (1 << 2)
  141. #define EVCFG_DUAL_IO_DISABLED (1 << 6)
  142. #define NVCFG_QUAD_IO_MASK (1 << 3)
  143. #define EVCFG_QUAD_IO_DISABLED (1 << 7)
  144. #define NVCFG_4BYTE_ADDR_MASK (1 << 0)
  145. #define NVCFG_LOWER_SEGMENT_MASK (1 << 1)
  146. /* Numonyx (Micron) Flag Status Register macros */
  147. #define FSR_4BYTE_ADDR_MODE_ENABLED 0x1
  148. #define FSR_FLASH_READY (1 << 7)
  149. /* Spansion configuration registers macros. */
  150. #define SPANSION_QUAD_CFG_POS 0
  151. #define SPANSION_QUAD_CFG_LEN 1
  152. #define SPANSION_DUMMY_CLK_POS 0
  153. #define SPANSION_DUMMY_CLK_LEN 4
  154. #define SPANSION_ADDR_LEN_POS 7
  155. #define SPANSION_ADDR_LEN_LEN 1
  156. /*
  157. * Spansion read mode command length in bytes,
  158. * the mode is currently not supported.
  159. */
  160. #define SPANSION_CONTINUOUS_READ_MODE_CMD_LEN 1
  161. #define WINBOND_CONTINUOUS_READ_MODE_CMD_LEN 1
  162. static const FlashPartInfo known_devices[] = {
  163. /* Atmel -- some are (confusingly) marketed as "DataFlash" */
  164. { INFO("at25fs010", 0x1f6601, 0, 32 << 10, 4, ER_4K) },
  165. { INFO("at25fs040", 0x1f6604, 0, 64 << 10, 8, ER_4K) },
  166. { INFO("at25df041a", 0x1f4401, 0, 64 << 10, 8, ER_4K) },
  167. { INFO("at25df321a", 0x1f4701, 0, 64 << 10, 64, ER_4K) },
  168. { INFO("at25df641", 0x1f4800, 0, 64 << 10, 128, ER_4K) },
  169. { INFO("at26f004", 0x1f0400, 0, 64 << 10, 8, ER_4K) },
  170. { INFO("at26df081a", 0x1f4501, 0, 64 << 10, 16, ER_4K) },
  171. { INFO("at26df161a", 0x1f4601, 0, 64 << 10, 32, ER_4K) },
  172. { INFO("at26df321", 0x1f4700, 0, 64 << 10, 64, ER_4K) },
  173. { INFO("at45db081d", 0x1f2500, 0, 64 << 10, 16, ER_4K) },
  174. /* Atmel EEPROMS - it is assumed, that don't care bit in command
  175. * is set to 0. Block protection is not supported.
  176. */
  177. { INFO("at25128a-nonjedec", 0x0, 0, 1, 131072, EEPROM) },
  178. { INFO("at25256a-nonjedec", 0x0, 0, 1, 262144, EEPROM) },
  179. /* EON -- en25xxx */
  180. { INFO("en25f32", 0x1c3116, 0, 64 << 10, 64, ER_4K) },
  181. { INFO("en25p32", 0x1c2016, 0, 64 << 10, 64, 0) },
  182. { INFO("en25q32b", 0x1c3016, 0, 64 << 10, 64, 0) },
  183. { INFO("en25p64", 0x1c2017, 0, 64 << 10, 128, 0) },
  184. { INFO("en25q64", 0x1c3017, 0, 64 << 10, 128, ER_4K) },
  185. /* GigaDevice */
  186. { INFO("gd25q32", 0xc84016, 0, 64 << 10, 64, ER_4K) },
  187. { INFO("gd25q64", 0xc84017, 0, 64 << 10, 128, ER_4K) },
  188. /* Intel/Numonyx -- xxxs33b */
  189. { INFO("160s33b", 0x898911, 0, 64 << 10, 32, 0) },
  190. { INFO("320s33b", 0x898912, 0, 64 << 10, 64, 0) },
  191. { INFO("640s33b", 0x898913, 0, 64 << 10, 128, 0) },
  192. { INFO("n25q064", 0x20ba17, 0, 64 << 10, 128, 0) },
  193. /* ISSI */
  194. { INFO("is25lq040b", 0x9d4013, 0, 64 << 10, 8, ER_4K) },
  195. { INFO("is25lp080d", 0x9d6014, 0, 64 << 10, 16, ER_4K) },
  196. { INFO("is25lp016d", 0x9d6015, 0, 64 << 10, 32, ER_4K) },
  197. { INFO("is25lp032", 0x9d6016, 0, 64 << 10, 64, ER_4K) },
  198. { INFO("is25lp064", 0x9d6017, 0, 64 << 10, 128, ER_4K) },
  199. { INFO("is25lp128", 0x9d6018, 0, 64 << 10, 256, ER_4K) },
  200. { INFO("is25lp256", 0x9d6019, 0, 64 << 10, 512, ER_4K) },
  201. { INFO("is25wp032", 0x9d7016, 0, 64 << 10, 64, ER_4K) },
  202. { INFO("is25wp064", 0x9d7017, 0, 64 << 10, 128, ER_4K) },
  203. { INFO("is25wp128", 0x9d7018, 0, 64 << 10, 256, ER_4K) },
  204. { INFO("is25wp256", 0x9d7019, 0, 64 << 10, 512, ER_4K),
  205. .sfdp_read = m25p80_sfdp_is25wp256 },
  206. /* Macronix */
  207. { INFO("mx25l2005a", 0xc22012, 0, 64 << 10, 4, ER_4K) },
  208. { INFO("mx25l4005a", 0xc22013, 0, 64 << 10, 8, ER_4K) },
  209. { INFO("mx25l8005", 0xc22014, 0, 64 << 10, 16, 0) },
  210. { INFO("mx25l1606e", 0xc22015, 0, 64 << 10, 32, ER_4K) },
  211. { INFO("mx25l3205d", 0xc22016, 0, 64 << 10, 64, 0) },
  212. { INFO("mx25l6405d", 0xc22017, 0, 64 << 10, 128, 0) },
  213. { INFO("mx25l12805d", 0xc22018, 0, 64 << 10, 256, 0) },
  214. { INFO("mx25l12855e", 0xc22618, 0, 64 << 10, 256, 0) },
  215. { INFO6("mx25l25635e", 0xc22019, 0xc22019, 64 << 10, 512,
  216. ER_4K | ER_32K), .sfdp_read = m25p80_sfdp_mx25l25635e },
  217. { INFO6("mx25l25635f", 0xc22019, 0xc22019, 64 << 10, 512,
  218. ER_4K | ER_32K), .sfdp_read = m25p80_sfdp_mx25l25635f },
  219. { INFO("mx25l25655e", 0xc22619, 0, 64 << 10, 512, 0) },
  220. { INFO("mx66l51235f", 0xc2201a, 0, 64 << 10, 1024, ER_4K | ER_32K) },
  221. { INFO("mx66u51235f", 0xc2253a, 0, 64 << 10, 1024, ER_4K | ER_32K) },
  222. { INFO("mx66u1g45g", 0xc2253b, 0, 64 << 10, 2048, ER_4K | ER_32K) },
  223. { INFO("mx66l1g45g", 0xc2201b, 0, 64 << 10, 2048, ER_4K | ER_32K),
  224. .sfdp_read = m25p80_sfdp_mx66l1g45g },
  225. /* Micron */
  226. { INFO("n25q032a11", 0x20bb16, 0, 64 << 10, 64, ER_4K) },
  227. { INFO("n25q032a13", 0x20ba16, 0, 64 << 10, 64, ER_4K) },
  228. { INFO("n25q064a11", 0x20bb17, 0, 64 << 10, 128, ER_4K) },
  229. { INFO("n25q064a13", 0x20ba17, 0, 64 << 10, 128, ER_4K) },
  230. { INFO("n25q128a11", 0x20bb18, 0, 64 << 10, 256, ER_4K) },
  231. { INFO("n25q128a13", 0x20ba18, 0, 64 << 10, 256, ER_4K) },
  232. { INFO("n25q256a11", 0x20bb19, 0, 64 << 10, 512, ER_4K) },
  233. { INFO("n25q256a13", 0x20ba19, 0, 64 << 10, 512, ER_4K),
  234. .sfdp_read = m25p80_sfdp_n25q256a },
  235. { INFO("n25q512a11", 0x20bb20, 0, 64 << 10, 1024, ER_4K) },
  236. { INFO("n25q512a13", 0x20ba20, 0, 64 << 10, 1024, ER_4K) },
  237. { INFO("n25q128", 0x20ba18, 0, 64 << 10, 256, 0) },
  238. { INFO("n25q256a", 0x20ba19, 0, 64 << 10, 512,
  239. ER_4K | HAS_SR_BP3_BIT6 | HAS_SR_TB),
  240. .sfdp_read = m25p80_sfdp_n25q256a },
  241. { INFO("n25q512a", 0x20ba20, 0, 64 << 10, 1024, ER_4K) },
  242. { INFO("n25q512ax3", 0x20ba20, 0x1000, 64 << 10, 1024, ER_4K) },
  243. { INFO("mt25ql512ab", 0x20ba20, 0x1044, 64 << 10, 1024, ER_4K | ER_32K) },
  244. { INFO_STACKED("mt35xu01g", 0x2c5b1b, 0x104100, 128 << 10, 1024,
  245. ER_4K | ER_32K, 2) },
  246. { INFO_STACKED("mt35xu02gbba", 0x2c5b1c, 0x104100, 128 << 10, 2048,
  247. ER_4K | ER_32K, 4),
  248. .sfdp_read = m25p80_sfdp_mt35xu02g },
  249. { INFO_STACKED("n25q00", 0x20ba21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
  250. { INFO_STACKED("n25q00a", 0x20bb21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
  251. { INFO_STACKED("mt25ql01g", 0x20ba21, 0x1040, 64 << 10, 2048, ER_4K, 2) },
  252. { INFO_STACKED("mt25qu01g", 0x20bb21, 0x1040, 64 << 10, 2048, ER_4K, 2) },
  253. { INFO_STACKED("mt25ql02g", 0x20ba22, 0x1040, 64 << 10, 4096, ER_4K | ER_32K, 2) },
  254. { INFO_STACKED("mt25qu02g", 0x20bb22, 0x1040, 64 << 10, 4096, ER_4K | ER_32K, 2) },
  255. /* Spansion -- single (large) sector size only, at least
  256. * for the chips listed here (without boot sectors).
  257. */
  258. { INFO("s25sl032p", 0x010215, 0x4d00, 64 << 10, 64, ER_4K) },
  259. { INFO("s25sl064p", 0x010216, 0x4d00, 64 << 10, 128, ER_4K) },
  260. { INFO("s25fl256s0", 0x010219, 0x4d00, 256 << 10, 128, 0) },
  261. { INFO("s25fl256s1", 0x010219, 0x4d01, 64 << 10, 512, 0) },
  262. { INFO6("s25fl512s", 0x010220, 0x4d0080, 256 << 10, 256, 0) },
  263. { INFO6("s70fl01gs", 0x010221, 0x4d0080, 256 << 10, 512, 0) },
  264. { INFO("s25sl12800", 0x012018, 0x0300, 256 << 10, 64, 0) },
  265. { INFO("s25sl12801", 0x012018, 0x0301, 64 << 10, 256, 0) },
  266. { INFO("s25fl129p0", 0x012018, 0x4d00, 256 << 10, 64, 0) },
  267. { INFO("s25fl129p1", 0x012018, 0x4d01, 64 << 10, 256, 0) },
  268. { INFO("s25sl004a", 0x010212, 0, 64 << 10, 8, 0) },
  269. { INFO("s25sl008a", 0x010213, 0, 64 << 10, 16, 0) },
  270. { INFO("s25sl016a", 0x010214, 0, 64 << 10, 32, 0) },
  271. { INFO("s25sl032a", 0x010215, 0, 64 << 10, 64, 0) },
  272. { INFO("s25sl064a", 0x010216, 0, 64 << 10, 128, 0) },
  273. { INFO("s25fl016k", 0xef4015, 0, 64 << 10, 32, ER_4K | ER_32K) },
  274. { INFO("s25fl064k", 0xef4017, 0, 64 << 10, 128, ER_4K | ER_32K) },
  275. /* Spansion -- boot sectors support */
  276. { INFO6("s25fs512s", 0x010220, 0x4d0081, 256 << 10, 256, 0) },
  277. { INFO6("s70fs01gs", 0x010221, 0x4d0081, 256 << 10, 512, 0) },
  278. /* SST -- large erase sizes are "overlays", "sectors" are 4<< 10 */
  279. { INFO("sst25vf040b", 0xbf258d, 0, 64 << 10, 8, ER_4K) },
  280. { INFO("sst25vf080b", 0xbf258e, 0, 64 << 10, 16, ER_4K) },
  281. { INFO("sst25vf016b", 0xbf2541, 0, 64 << 10, 32, ER_4K) },
  282. { INFO("sst25vf032b", 0xbf254a, 0, 64 << 10, 64, ER_4K) },
  283. { INFO("sst25wf512", 0xbf2501, 0, 64 << 10, 1, ER_4K) },
  284. { INFO("sst25wf010", 0xbf2502, 0, 64 << 10, 2, ER_4K) },
  285. { INFO("sst25wf020", 0xbf2503, 0, 64 << 10, 4, ER_4K) },
  286. { INFO("sst25wf040", 0xbf2504, 0, 64 << 10, 8, ER_4K) },
  287. { INFO("sst25wf080", 0xbf2505, 0, 64 << 10, 16, ER_4K) },
  288. /* ST Microelectronics -- newer production may have feature updates */
  289. { INFO("m25p05", 0x202010, 0, 32 << 10, 2, 0) },
  290. { INFO("m25p10", 0x202011, 0, 32 << 10, 4, 0) },
  291. { INFO("m25p20", 0x202012, 0, 64 << 10, 4, 0) },
  292. { INFO("m25p40", 0x202013, 0, 64 << 10, 8, 0) },
  293. { INFO("m25p80", 0x202014, 0, 64 << 10, 16, 0) },
  294. { INFO("m25p16", 0x202015, 0, 64 << 10, 32, 0) },
  295. { INFO("m25p32", 0x202016, 0, 64 << 10, 64, 0) },
  296. { INFO("m25p64", 0x202017, 0, 64 << 10, 128, 0) },
  297. { INFO("m25p128", 0x202018, 0, 256 << 10, 64, 0) },
  298. { INFO("n25q032", 0x20ba16, 0, 64 << 10, 64, 0) },
  299. { INFO("m45pe10", 0x204011, 0, 64 << 10, 2, 0) },
  300. { INFO("m45pe80", 0x204014, 0, 64 << 10, 16, 0) },
  301. { INFO("m45pe16", 0x204015, 0, 64 << 10, 32, 0) },
  302. { INFO("m25pe20", 0x208012, 0, 64 << 10, 4, 0) },
  303. { INFO("m25pe80", 0x208014, 0, 64 << 10, 16, 0) },
  304. { INFO("m25pe16", 0x208015, 0, 64 << 10, 32, ER_4K) },
  305. { INFO("m25px32", 0x207116, 0, 64 << 10, 64, ER_4K) },
  306. { INFO("m25px32-s0", 0x207316, 0, 64 << 10, 64, ER_4K) },
  307. { INFO("m25px32-s1", 0x206316, 0, 64 << 10, 64, ER_4K) },
  308. { INFO("m25px64", 0x207117, 0, 64 << 10, 128, 0) },
  309. /* Winbond -- w25x "blocks" are 64k, "sectors" are 4KiB */
  310. { INFO("w25x10", 0xef3011, 0, 64 << 10, 2, ER_4K) },
  311. { INFO("w25x20", 0xef3012, 0, 64 << 10, 4, ER_4K) },
  312. { INFO("w25x40", 0xef3013, 0, 64 << 10, 8, ER_4K) },
  313. { INFO("w25x80", 0xef3014, 0, 64 << 10, 16, ER_4K) },
  314. { INFO("w25x16", 0xef3015, 0, 64 << 10, 32, ER_4K) },
  315. { INFO("w25x32", 0xef3016, 0, 64 << 10, 64, ER_4K) },
  316. { INFO("w25q32", 0xef4016, 0, 64 << 10, 64, ER_4K) },
  317. { INFO("w25q32dw", 0xef6016, 0, 64 << 10, 64, ER_4K) },
  318. { INFO("w25x64", 0xef3017, 0, 64 << 10, 128, ER_4K) },
  319. { INFO("w25q64", 0xef4017, 0, 64 << 10, 128, ER_4K) },
  320. { INFO("w25q80", 0xef5014, 0, 64 << 10, 16, ER_4K) },
  321. { INFO("w25q80bl", 0xef4014, 0, 64 << 10, 16, ER_4K) },
  322. { INFO("w25q256", 0xef4019, 0, 64 << 10, 512, ER_4K),
  323. .sfdp_read = m25p80_sfdp_w25q256 },
  324. { INFO("w25q512jv", 0xef4020, 0, 64 << 10, 1024, ER_4K),
  325. .sfdp_read = m25p80_sfdp_w25q512jv },
  326. { INFO("w25q01jvq", 0xef4021, 0, 64 << 10, 2048, ER_4K),
  327. .sfdp_read = m25p80_sfdp_w25q01jvq },
  328. /* Microchip */
  329. { INFO("25csm04", 0x29cc00, 0x100, 64 << 10, 8, 0) },
  330. };
  331. typedef enum {
  332. NOP = 0,
  333. WRSR = 0x1,
  334. WRDI = 0x4,
  335. RDSR = 0x5,
  336. WREN = 0x6,
  337. BRRD = 0x16,
  338. BRWR = 0x17,
  339. JEDEC_READ = 0x9f,
  340. BULK_ERASE_60 = 0x60,
  341. BULK_ERASE = 0xc7,
  342. READ_FSR = 0x70,
  343. RDCR = 0x15,
  344. RDSFDP = 0x5a,
  345. READ = 0x03,
  346. READ4 = 0x13,
  347. FAST_READ = 0x0b,
  348. FAST_READ4 = 0x0c,
  349. DOR = 0x3b,
  350. DOR4 = 0x3c,
  351. QOR = 0x6b,
  352. QOR4 = 0x6c,
  353. DIOR = 0xbb,
  354. DIOR4 = 0xbc,
  355. QIOR = 0xeb,
  356. QIOR4 = 0xec,
  357. PP = 0x02,
  358. PP4 = 0x12,
  359. PP4_4 = 0x3e,
  360. DPP = 0xa2,
  361. QPP = 0x32,
  362. QPP_4 = 0x34,
  363. RDID_90 = 0x90,
  364. RDID_AB = 0xab,
  365. AAI_WP = 0xad,
  366. ERASE_4K = 0x20,
  367. ERASE4_4K = 0x21,
  368. ERASE_32K = 0x52,
  369. ERASE4_32K = 0x5c,
  370. ERASE_SECTOR = 0xd8,
  371. ERASE4_SECTOR = 0xdc,
  372. EN_4BYTE_ADDR = 0xB7,
  373. EX_4BYTE_ADDR = 0xE9,
  374. EXTEND_ADDR_READ = 0xC8,
  375. EXTEND_ADDR_WRITE = 0xC5,
  376. RESET_ENABLE = 0x66,
  377. RESET_MEMORY = 0x99,
  378. /*
  379. * Micron: 0x35 - enable QPI
  380. * Spansion: 0x35 - read control register
  381. * Winbond: 0x35 - quad enable
  382. */
  383. RDCR_EQIO = 0x35,
  384. RSTQIO = 0xf5,
  385. RNVCR = 0xB5,
  386. WNVCR = 0xB1,
  387. RVCR = 0x85,
  388. WVCR = 0x81,
  389. REVCR = 0x65,
  390. WEVCR = 0x61,
  391. DIE_ERASE = 0xC4,
  392. } FlashCMD;
  393. typedef enum {
  394. STATE_IDLE,
  395. STATE_PAGE_PROGRAM,
  396. STATE_READ,
  397. STATE_COLLECTING_DATA,
  398. STATE_COLLECTING_VAR_LEN_DATA,
  399. STATE_READING_DATA,
  400. STATE_READING_SFDP,
  401. } CMDState;
  402. typedef enum {
  403. MAN_SPANSION,
  404. MAN_MACRONIX,
  405. MAN_NUMONYX,
  406. MAN_WINBOND,
  407. MAN_SST,
  408. MAN_ISSI,
  409. MAN_GENERIC,
  410. } Manufacturer;
  411. typedef enum {
  412. MODE_STD = 0,
  413. MODE_DIO = 1,
  414. MODE_QIO = 2
  415. } SPIMode;
  416. #define M25P80_INTERNAL_DATA_BUFFER_SZ 16
  417. struct Flash {
  418. SSIPeripheral parent_obj;
  419. BlockBackend *blk;
  420. uint8_t *storage;
  421. uint32_t size;
  422. int page_size;
  423. uint8_t state;
  424. uint8_t data[M25P80_INTERNAL_DATA_BUFFER_SZ];
  425. uint32_t len;
  426. uint32_t pos;
  427. bool data_read_loop;
  428. uint8_t needed_bytes;
  429. uint8_t cmd_in_progress;
  430. uint32_t cur_addr;
  431. uint32_t nonvolatile_cfg;
  432. /* Configuration register for Macronix */
  433. uint32_t volatile_cfg;
  434. uint32_t enh_volatile_cfg;
  435. /* Spansion cfg registers. */
  436. uint8_t spansion_cr1nv;
  437. uint8_t spansion_cr2nv;
  438. uint8_t spansion_cr3nv;
  439. uint8_t spansion_cr4nv;
  440. uint8_t spansion_cr1v;
  441. uint8_t spansion_cr2v;
  442. uint8_t spansion_cr3v;
  443. uint8_t spansion_cr4v;
  444. bool wp_level;
  445. bool write_enable;
  446. bool four_bytes_address_mode;
  447. bool reset_enable;
  448. bool quad_enable;
  449. bool aai_enable;
  450. bool block_protect0;
  451. bool block_protect1;
  452. bool block_protect2;
  453. bool block_protect3;
  454. bool top_bottom_bit;
  455. bool status_register_write_disabled;
  456. uint8_t ear;
  457. int64_t dirty_page;
  458. const FlashPartInfo *pi;
  459. };
  460. struct M25P80Class {
  461. SSIPeripheralClass parent_class;
  462. FlashPartInfo *pi;
  463. };
  464. OBJECT_DECLARE_TYPE(Flash, M25P80Class, M25P80)
  465. static inline Manufacturer get_man(Flash *s)
  466. {
  467. switch (s->pi->id[0]) {
  468. case 0x20:
  469. return MAN_NUMONYX;
  470. case 0xEF:
  471. return MAN_WINBOND;
  472. case 0x01:
  473. return MAN_SPANSION;
  474. case 0xC2:
  475. return MAN_MACRONIX;
  476. case 0xBF:
  477. return MAN_SST;
  478. case 0x9D:
  479. return MAN_ISSI;
  480. default:
  481. return MAN_GENERIC;
  482. }
  483. }
  484. static void blk_sync_complete(void *opaque, int ret)
  485. {
  486. QEMUIOVector *iov = opaque;
  487. qemu_iovec_destroy(iov);
  488. g_free(iov);
  489. /* do nothing. Masters do not directly interact with the backing store,
  490. * only the working copy so no mutexing required.
  491. */
  492. }
  493. static void flash_sync_page(Flash *s, int page)
  494. {
  495. QEMUIOVector *iov;
  496. if (!s->blk || !blk_is_writable(s->blk)) {
  497. return;
  498. }
  499. iov = g_new(QEMUIOVector, 1);
  500. qemu_iovec_init(iov, 1);
  501. qemu_iovec_add(iov, s->storage + page * s->pi->page_size,
  502. s->pi->page_size);
  503. blk_aio_pwritev(s->blk, page * s->pi->page_size, iov, 0,
  504. blk_sync_complete, iov);
  505. }
  506. static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
  507. {
  508. QEMUIOVector *iov;
  509. if (!s->blk || !blk_is_writable(s->blk)) {
  510. return;
  511. }
  512. assert(!(len % BDRV_SECTOR_SIZE));
  513. iov = g_new(QEMUIOVector, 1);
  514. qemu_iovec_init(iov, 1);
  515. qemu_iovec_add(iov, s->storage + off, len);
  516. blk_aio_pwritev(s->blk, off, iov, 0, blk_sync_complete, iov);
  517. }
  518. static void flash_erase(Flash *s, int offset, FlashCMD cmd)
  519. {
  520. uint32_t len;
  521. uint8_t capa_to_assert = 0;
  522. switch (cmd) {
  523. case ERASE_4K:
  524. case ERASE4_4K:
  525. len = 4 * KiB;
  526. capa_to_assert = ER_4K;
  527. break;
  528. case ERASE_32K:
  529. case ERASE4_32K:
  530. len = 32 * KiB;
  531. capa_to_assert = ER_32K;
  532. break;
  533. case ERASE_SECTOR:
  534. case ERASE4_SECTOR:
  535. len = s->pi->sector_size;
  536. break;
  537. case BULK_ERASE:
  538. len = s->size;
  539. break;
  540. case DIE_ERASE:
  541. if (s->pi->die_cnt) {
  542. len = s->size / s->pi->die_cnt;
  543. offset = offset & (~(len - 1));
  544. } else {
  545. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: die erase is not supported"
  546. " by device\n");
  547. return;
  548. }
  549. break;
  550. default:
  551. abort();
  552. }
  553. trace_m25p80_flash_erase(s, offset, len);
  554. if ((s->pi->flags & capa_to_assert) != capa_to_assert) {
  555. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: %d erase size not supported by"
  556. " device\n", len);
  557. }
  558. if (!s->write_enable) {
  559. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: erase with write protect!\n");
  560. return;
  561. }
  562. memset(s->storage + offset, 0xff, len);
  563. flash_sync_area(s, offset, len);
  564. }
  565. static inline void flash_sync_dirty(Flash *s, int64_t newpage)
  566. {
  567. if (s->dirty_page >= 0 && s->dirty_page != newpage) {
  568. flash_sync_page(s, s->dirty_page);
  569. s->dirty_page = newpage;
  570. }
  571. }
  572. static inline
  573. void flash_write8(Flash *s, uint32_t addr, uint8_t data)
  574. {
  575. uint32_t page = addr / s->pi->page_size;
  576. uint8_t prev = s->storage[s->cur_addr];
  577. uint32_t block_protect_value = (s->block_protect3 << 3) |
  578. (s->block_protect2 << 2) |
  579. (s->block_protect1 << 1) |
  580. (s->block_protect0 << 0);
  581. if (!s->write_enable) {
  582. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: write with write protect!\n");
  583. return;
  584. }
  585. if (block_protect_value > 0) {
  586. uint32_t num_protected_sectors = 1 << (block_protect_value - 1);
  587. uint32_t sector = addr / s->pi->sector_size;
  588. /* top_bottom_bit == 0 means TOP */
  589. if (!s->top_bottom_bit) {
  590. if (s->pi->n_sectors <= sector + num_protected_sectors) {
  591. qemu_log_mask(LOG_GUEST_ERROR,
  592. "M25P80: write with write protect!\n");
  593. return;
  594. }
  595. } else {
  596. if (sector < num_protected_sectors) {
  597. qemu_log_mask(LOG_GUEST_ERROR,
  598. "M25P80: write with write protect!\n");
  599. return;
  600. }
  601. }
  602. }
  603. if ((prev ^ data) & data) {
  604. trace_m25p80_programming_zero_to_one(s, addr, prev, data);
  605. }
  606. if (s->pi->flags & EEPROM) {
  607. s->storage[s->cur_addr] = data;
  608. } else {
  609. s->storage[s->cur_addr] &= data;
  610. }
  611. flash_sync_dirty(s, page);
  612. s->dirty_page = page;
  613. }
  614. static inline int get_addr_length(Flash *s)
  615. {
  616. /* check if eeprom is in use */
  617. if (s->pi->flags == EEPROM) {
  618. return 2;
  619. }
  620. switch (s->cmd_in_progress) {
  621. case RDSFDP:
  622. return 3;
  623. case PP4:
  624. case PP4_4:
  625. case QPP_4:
  626. case READ4:
  627. case QIOR4:
  628. case ERASE4_4K:
  629. case ERASE4_32K:
  630. case ERASE4_SECTOR:
  631. case FAST_READ4:
  632. case DOR4:
  633. case QOR4:
  634. case DIOR4:
  635. return 4;
  636. default:
  637. return s->four_bytes_address_mode ? 4 : 3;
  638. }
  639. }
  640. static void complete_collecting_data(Flash *s)
  641. {
  642. int i, n;
  643. n = get_addr_length(s);
  644. s->cur_addr = (n == 3 ? s->ear : 0);
  645. for (i = 0; i < n; ++i) {
  646. s->cur_addr <<= 8;
  647. s->cur_addr |= s->data[i];
  648. }
  649. s->cur_addr &= s->size - 1;
  650. s->state = STATE_IDLE;
  651. trace_m25p80_complete_collecting(s, s->cmd_in_progress, n, s->ear,
  652. s->cur_addr);
  653. switch (s->cmd_in_progress) {
  654. case DPP:
  655. case QPP:
  656. case QPP_4:
  657. case PP:
  658. case PP4:
  659. case PP4_4:
  660. s->state = STATE_PAGE_PROGRAM;
  661. break;
  662. case AAI_WP:
  663. /* AAI programming starts from the even address */
  664. s->cur_addr &= ~BIT(0);
  665. s->state = STATE_PAGE_PROGRAM;
  666. break;
  667. case READ:
  668. case READ4:
  669. case FAST_READ:
  670. case FAST_READ4:
  671. case DOR:
  672. case DOR4:
  673. case QOR:
  674. case QOR4:
  675. case DIOR:
  676. case DIOR4:
  677. case QIOR:
  678. case QIOR4:
  679. s->state = STATE_READ;
  680. break;
  681. case ERASE_4K:
  682. case ERASE4_4K:
  683. case ERASE_32K:
  684. case ERASE4_32K:
  685. case ERASE_SECTOR:
  686. case ERASE4_SECTOR:
  687. case DIE_ERASE:
  688. flash_erase(s, s->cur_addr, s->cmd_in_progress);
  689. break;
  690. case WRSR:
  691. s->status_register_write_disabled = extract32(s->data[0], 7, 1);
  692. s->block_protect0 = extract32(s->data[0], 2, 1);
  693. s->block_protect1 = extract32(s->data[0], 3, 1);
  694. s->block_protect2 = extract32(s->data[0], 4, 1);
  695. if (s->pi->flags & HAS_SR_TB) {
  696. s->top_bottom_bit = extract32(s->data[0], 5, 1);
  697. }
  698. if (s->pi->flags & HAS_SR_BP3_BIT6) {
  699. s->block_protect3 = extract32(s->data[0], 6, 1);
  700. }
  701. switch (get_man(s)) {
  702. case MAN_SPANSION:
  703. s->quad_enable = !!(s->data[1] & 0x02);
  704. break;
  705. case MAN_ISSI:
  706. s->quad_enable = extract32(s->data[0], 6, 1);
  707. break;
  708. case MAN_MACRONIX:
  709. s->quad_enable = extract32(s->data[0], 6, 1);
  710. if (s->len > 1) {
  711. s->volatile_cfg = s->data[1];
  712. s->four_bytes_address_mode = extract32(s->data[1], 5, 1);
  713. }
  714. break;
  715. case MAN_WINBOND:
  716. if (s->len > 1) {
  717. s->quad_enable = !!(s->data[1] & 0x02);
  718. }
  719. break;
  720. default:
  721. break;
  722. }
  723. if (s->write_enable) {
  724. s->write_enable = false;
  725. }
  726. break;
  727. case BRWR:
  728. case EXTEND_ADDR_WRITE:
  729. s->ear = s->data[0];
  730. break;
  731. case WNVCR:
  732. s->nonvolatile_cfg = s->data[0] | (s->data[1] << 8);
  733. break;
  734. case WVCR:
  735. s->volatile_cfg = s->data[0];
  736. break;
  737. case WEVCR:
  738. s->enh_volatile_cfg = s->data[0];
  739. break;
  740. case RDID_90:
  741. case RDID_AB:
  742. if (get_man(s) == MAN_SST) {
  743. if (s->cur_addr <= 1) {
  744. if (s->cur_addr) {
  745. s->data[0] = s->pi->id[2];
  746. s->data[1] = s->pi->id[0];
  747. } else {
  748. s->data[0] = s->pi->id[0];
  749. s->data[1] = s->pi->id[2];
  750. }
  751. s->pos = 0;
  752. s->len = 2;
  753. s->data_read_loop = true;
  754. s->state = STATE_READING_DATA;
  755. } else {
  756. qemu_log_mask(LOG_GUEST_ERROR,
  757. "M25P80: Invalid read id address\n");
  758. }
  759. } else {
  760. qemu_log_mask(LOG_GUEST_ERROR,
  761. "M25P80: Read id (command 0x90/0xAB) is not supported"
  762. " by device\n");
  763. }
  764. break;
  765. case RDSFDP:
  766. s->state = STATE_READING_SFDP;
  767. break;
  768. default:
  769. break;
  770. }
  771. }
  772. static void reset_memory(Flash *s)
  773. {
  774. s->cmd_in_progress = NOP;
  775. s->cur_addr = 0;
  776. s->ear = 0;
  777. s->four_bytes_address_mode = false;
  778. s->len = 0;
  779. s->needed_bytes = 0;
  780. s->pos = 0;
  781. s->state = STATE_IDLE;
  782. s->write_enable = false;
  783. s->reset_enable = false;
  784. s->quad_enable = false;
  785. s->aai_enable = false;
  786. switch (get_man(s)) {
  787. case MAN_NUMONYX:
  788. s->volatile_cfg = 0;
  789. s->volatile_cfg |= VCFG_DUMMY;
  790. s->volatile_cfg |= VCFG_WRAP_SEQUENTIAL;
  791. if ((s->nonvolatile_cfg & NVCFG_XIP_MODE_MASK)
  792. == NVCFG_XIP_MODE_DISABLED) {
  793. s->volatile_cfg |= VCFG_XIP_MODE_DISABLED;
  794. }
  795. s->volatile_cfg |= deposit32(s->volatile_cfg,
  796. VCFG_DUMMY_CLK_POS,
  797. CFG_DUMMY_CLK_LEN,
  798. extract32(s->nonvolatile_cfg,
  799. NVCFG_DUMMY_CLK_POS,
  800. CFG_DUMMY_CLK_LEN)
  801. );
  802. s->enh_volatile_cfg = 0;
  803. s->enh_volatile_cfg |= EVCFG_OUT_DRIVER_STRENGTH_DEF;
  804. s->enh_volatile_cfg |= EVCFG_VPP_ACCELERATOR;
  805. s->enh_volatile_cfg |= EVCFG_RESET_HOLD_ENABLED;
  806. if (s->nonvolatile_cfg & NVCFG_DUAL_IO_MASK) {
  807. s->enh_volatile_cfg |= EVCFG_DUAL_IO_DISABLED;
  808. }
  809. if (s->nonvolatile_cfg & NVCFG_QUAD_IO_MASK) {
  810. s->enh_volatile_cfg |= EVCFG_QUAD_IO_DISABLED;
  811. }
  812. if (!(s->nonvolatile_cfg & NVCFG_4BYTE_ADDR_MASK)) {
  813. s->four_bytes_address_mode = true;
  814. }
  815. if (!(s->nonvolatile_cfg & NVCFG_LOWER_SEGMENT_MASK)) {
  816. s->ear = s->size / MAX_3BYTES_SIZE - 1;
  817. }
  818. break;
  819. case MAN_MACRONIX:
  820. s->volatile_cfg = 0x7;
  821. break;
  822. case MAN_SPANSION:
  823. s->spansion_cr1v = s->spansion_cr1nv;
  824. s->spansion_cr2v = s->spansion_cr2nv;
  825. s->spansion_cr3v = s->spansion_cr3nv;
  826. s->spansion_cr4v = s->spansion_cr4nv;
  827. s->quad_enable = extract32(s->spansion_cr1v,
  828. SPANSION_QUAD_CFG_POS,
  829. SPANSION_QUAD_CFG_LEN
  830. );
  831. s->four_bytes_address_mode = extract32(s->spansion_cr2v,
  832. SPANSION_ADDR_LEN_POS,
  833. SPANSION_ADDR_LEN_LEN
  834. );
  835. break;
  836. default:
  837. break;
  838. }
  839. trace_m25p80_reset_done(s);
  840. }
  841. static uint8_t numonyx_mode(Flash *s)
  842. {
  843. if (!(s->enh_volatile_cfg & EVCFG_QUAD_IO_DISABLED)) {
  844. return MODE_QIO;
  845. } else if (!(s->enh_volatile_cfg & EVCFG_DUAL_IO_DISABLED)) {
  846. return MODE_DIO;
  847. } else {
  848. return MODE_STD;
  849. }
  850. }
  851. static uint8_t numonyx_extract_cfg_num_dummies(Flash *s)
  852. {
  853. uint8_t num_dummies;
  854. uint8_t mode;
  855. assert(get_man(s) == MAN_NUMONYX);
  856. mode = numonyx_mode(s);
  857. num_dummies = extract32(s->volatile_cfg, 4, 4);
  858. if (num_dummies == 0x0 || num_dummies == 0xf) {
  859. switch (s->cmd_in_progress) {
  860. case QIOR:
  861. case QIOR4:
  862. num_dummies = 10;
  863. break;
  864. default:
  865. num_dummies = (mode == MODE_QIO) ? 10 : 8;
  866. break;
  867. }
  868. }
  869. return num_dummies;
  870. }
  871. static void decode_fast_read_cmd(Flash *s)
  872. {
  873. s->needed_bytes = get_addr_length(s);
  874. switch (get_man(s)) {
  875. /* Dummy cycles - modeled with bytes writes instead of bits */
  876. case MAN_SST:
  877. s->needed_bytes += 1;
  878. break;
  879. case MAN_WINBOND:
  880. s->needed_bytes += 8;
  881. break;
  882. case MAN_NUMONYX:
  883. s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
  884. break;
  885. case MAN_MACRONIX:
  886. if (extract32(s->volatile_cfg, 6, 2) == 1) {
  887. s->needed_bytes += 6;
  888. } else {
  889. s->needed_bytes += 8;
  890. }
  891. break;
  892. case MAN_SPANSION:
  893. s->needed_bytes += extract32(s->spansion_cr2v,
  894. SPANSION_DUMMY_CLK_POS,
  895. SPANSION_DUMMY_CLK_LEN
  896. );
  897. break;
  898. case MAN_ISSI:
  899. /*
  900. * The Fast Read instruction code is followed by address bytes and
  901. * dummy cycles, transmitted via the SI line.
  902. *
  903. * The number of dummy cycles is configurable but this is currently
  904. * unmodeled, hence the default value 8 is used.
  905. *
  906. * QPI (Quad Peripheral Interface) mode has different default value
  907. * of dummy cycles, but this is unsupported at the time being.
  908. */
  909. s->needed_bytes += 1;
  910. break;
  911. default:
  912. break;
  913. }
  914. s->pos = 0;
  915. s->len = 0;
  916. s->state = STATE_COLLECTING_DATA;
  917. }
  918. static void decode_dio_read_cmd(Flash *s)
  919. {
  920. s->needed_bytes = get_addr_length(s);
  921. /* Dummy cycles modeled with bytes writes instead of bits */
  922. switch (get_man(s)) {
  923. case MAN_WINBOND:
  924. s->needed_bytes += WINBOND_CONTINUOUS_READ_MODE_CMD_LEN;
  925. break;
  926. case MAN_SPANSION:
  927. s->needed_bytes += SPANSION_CONTINUOUS_READ_MODE_CMD_LEN;
  928. s->needed_bytes += extract32(s->spansion_cr2v,
  929. SPANSION_DUMMY_CLK_POS,
  930. SPANSION_DUMMY_CLK_LEN
  931. );
  932. break;
  933. case MAN_NUMONYX:
  934. s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
  935. break;
  936. case MAN_MACRONIX:
  937. switch (extract32(s->volatile_cfg, 6, 2)) {
  938. case 1:
  939. s->needed_bytes += 6;
  940. break;
  941. case 2:
  942. s->needed_bytes += 8;
  943. break;
  944. default:
  945. s->needed_bytes += 4;
  946. break;
  947. }
  948. break;
  949. case MAN_ISSI:
  950. /*
  951. * The Fast Read Dual I/O instruction code is followed by address bytes
  952. * and dummy cycles, transmitted via the IO1 and IO0 line.
  953. *
  954. * The number of dummy cycles is configurable but this is currently
  955. * unmodeled, hence the default value 4 is used.
  956. */
  957. s->needed_bytes += 1;
  958. break;
  959. default:
  960. break;
  961. }
  962. s->pos = 0;
  963. s->len = 0;
  964. s->state = STATE_COLLECTING_DATA;
  965. }
  966. static void decode_qio_read_cmd(Flash *s)
  967. {
  968. s->needed_bytes = get_addr_length(s);
  969. /* Dummy cycles modeled with bytes writes instead of bits */
  970. switch (get_man(s)) {
  971. case MAN_WINBOND:
  972. s->needed_bytes += WINBOND_CONTINUOUS_READ_MODE_CMD_LEN;
  973. s->needed_bytes += 4;
  974. break;
  975. case MAN_SPANSION:
  976. s->needed_bytes += SPANSION_CONTINUOUS_READ_MODE_CMD_LEN;
  977. s->needed_bytes += extract32(s->spansion_cr2v,
  978. SPANSION_DUMMY_CLK_POS,
  979. SPANSION_DUMMY_CLK_LEN
  980. );
  981. break;
  982. case MAN_NUMONYX:
  983. s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
  984. break;
  985. case MAN_MACRONIX:
  986. switch (extract32(s->volatile_cfg, 6, 2)) {
  987. case 1:
  988. s->needed_bytes += 4;
  989. break;
  990. case 2:
  991. s->needed_bytes += 8;
  992. break;
  993. default:
  994. s->needed_bytes += 6;
  995. break;
  996. }
  997. break;
  998. case MAN_ISSI:
  999. /*
  1000. * The Fast Read Quad I/O instruction code is followed by address bytes
  1001. * and dummy cycles, transmitted via the IO3, IO2, IO1 and IO0 line.
  1002. *
  1003. * The number of dummy cycles is configurable but this is currently
  1004. * unmodeled, hence the default value 6 is used.
  1005. *
  1006. * QPI (Quad Peripheral Interface) mode has different default value
  1007. * of dummy cycles, but this is unsupported at the time being.
  1008. */
  1009. s->needed_bytes += 3;
  1010. break;
  1011. default:
  1012. break;
  1013. }
  1014. s->pos = 0;
  1015. s->len = 0;
  1016. s->state = STATE_COLLECTING_DATA;
  1017. }
  1018. static bool is_valid_aai_cmd(uint32_t cmd)
  1019. {
  1020. return cmd == AAI_WP || cmd == WRDI || cmd == RDSR;
  1021. }
  1022. static void decode_new_cmd(Flash *s, uint32_t value)
  1023. {
  1024. int i;
  1025. s->cmd_in_progress = value;
  1026. trace_m25p80_command_decoded(s, value);
  1027. if (value != RESET_MEMORY) {
  1028. s->reset_enable = false;
  1029. }
  1030. if (get_man(s) == MAN_SST && s->aai_enable && !is_valid_aai_cmd(value)) {
  1031. qemu_log_mask(LOG_GUEST_ERROR,
  1032. "M25P80: Invalid cmd within AAI programming sequence");
  1033. }
  1034. switch (value) {
  1035. case ERASE_4K:
  1036. case ERASE4_4K:
  1037. case ERASE_32K:
  1038. case ERASE4_32K:
  1039. case ERASE_SECTOR:
  1040. case ERASE4_SECTOR:
  1041. case PP:
  1042. case PP4:
  1043. case DIE_ERASE:
  1044. case RDID_90:
  1045. case RDID_AB:
  1046. s->needed_bytes = get_addr_length(s);
  1047. s->pos = 0;
  1048. s->len = 0;
  1049. s->state = STATE_COLLECTING_DATA;
  1050. break;
  1051. case READ:
  1052. case READ4:
  1053. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) == MODE_STD) {
  1054. s->needed_bytes = get_addr_length(s);
  1055. s->pos = 0;
  1056. s->len = 0;
  1057. s->state = STATE_COLLECTING_DATA;
  1058. } else {
  1059. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
  1060. "DIO or QIO mode\n", s->cmd_in_progress);
  1061. }
  1062. break;
  1063. case DPP:
  1064. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
  1065. s->needed_bytes = get_addr_length(s);
  1066. s->pos = 0;
  1067. s->len = 0;
  1068. s->state = STATE_COLLECTING_DATA;
  1069. } else {
  1070. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
  1071. "QIO mode\n", s->cmd_in_progress);
  1072. }
  1073. break;
  1074. case QPP:
  1075. case QPP_4:
  1076. case PP4_4:
  1077. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
  1078. s->needed_bytes = get_addr_length(s);
  1079. s->pos = 0;
  1080. s->len = 0;
  1081. s->state = STATE_COLLECTING_DATA;
  1082. } else {
  1083. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
  1084. "DIO mode\n", s->cmd_in_progress);
  1085. }
  1086. break;
  1087. case FAST_READ:
  1088. case FAST_READ4:
  1089. decode_fast_read_cmd(s);
  1090. break;
  1091. case DOR:
  1092. case DOR4:
  1093. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
  1094. decode_fast_read_cmd(s);
  1095. } else {
  1096. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
  1097. "QIO mode\n", s->cmd_in_progress);
  1098. }
  1099. break;
  1100. case QOR:
  1101. case QOR4:
  1102. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
  1103. decode_fast_read_cmd(s);
  1104. } else {
  1105. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
  1106. "DIO mode\n", s->cmd_in_progress);
  1107. }
  1108. break;
  1109. case DIOR:
  1110. case DIOR4:
  1111. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
  1112. decode_dio_read_cmd(s);
  1113. } else {
  1114. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
  1115. "QIO mode\n", s->cmd_in_progress);
  1116. }
  1117. break;
  1118. case QIOR:
  1119. case QIOR4:
  1120. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
  1121. decode_qio_read_cmd(s);
  1122. } else {
  1123. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
  1124. "DIO mode\n", s->cmd_in_progress);
  1125. }
  1126. break;
  1127. case WRSR:
  1128. /*
  1129. * If WP# is low and status_register_write_disabled is high,
  1130. * status register writes are disabled.
  1131. * This is also called "hardware protected mode" (HPM). All other
  1132. * combinations of the two states are called "software protected mode"
  1133. * (SPM), and status register writes are permitted.
  1134. */
  1135. if ((s->wp_level == 0 && s->status_register_write_disabled)
  1136. || !s->write_enable) {
  1137. qemu_log_mask(LOG_GUEST_ERROR,
  1138. "M25P80: Status register write is disabled!\n");
  1139. break;
  1140. }
  1141. switch (get_man(s)) {
  1142. case MAN_SPANSION:
  1143. s->needed_bytes = 2;
  1144. s->state = STATE_COLLECTING_DATA;
  1145. break;
  1146. case MAN_MACRONIX:
  1147. s->needed_bytes = 2;
  1148. s->state = STATE_COLLECTING_VAR_LEN_DATA;
  1149. break;
  1150. case MAN_WINBOND:
  1151. s->needed_bytes = 2;
  1152. s->state = STATE_COLLECTING_VAR_LEN_DATA;
  1153. break;
  1154. default:
  1155. s->needed_bytes = 1;
  1156. s->state = STATE_COLLECTING_DATA;
  1157. }
  1158. s->pos = 0;
  1159. break;
  1160. case WRDI:
  1161. s->write_enable = false;
  1162. if (get_man(s) == MAN_SST) {
  1163. s->aai_enable = false;
  1164. }
  1165. break;
  1166. case WREN:
  1167. s->write_enable = true;
  1168. break;
  1169. case RDSR:
  1170. s->data[0] = (!!s->write_enable) << 1;
  1171. s->data[0] |= (!!s->status_register_write_disabled) << 7;
  1172. s->data[0] |= (!!s->block_protect0) << 2;
  1173. s->data[0] |= (!!s->block_protect1) << 3;
  1174. s->data[0] |= (!!s->block_protect2) << 4;
  1175. if (s->pi->flags & HAS_SR_TB) {
  1176. s->data[0] |= (!!s->top_bottom_bit) << 5;
  1177. }
  1178. if (s->pi->flags & HAS_SR_BP3_BIT6) {
  1179. s->data[0] |= (!!s->block_protect3) << 6;
  1180. }
  1181. if (get_man(s) == MAN_MACRONIX || get_man(s) == MAN_ISSI) {
  1182. s->data[0] |= (!!s->quad_enable) << 6;
  1183. }
  1184. if (get_man(s) == MAN_SST) {
  1185. s->data[0] |= (!!s->aai_enable) << 6;
  1186. }
  1187. s->pos = 0;
  1188. s->len = 1;
  1189. s->data_read_loop = true;
  1190. s->state = STATE_READING_DATA;
  1191. break;
  1192. case READ_FSR:
  1193. s->data[0] = FSR_FLASH_READY;
  1194. if (s->four_bytes_address_mode) {
  1195. s->data[0] |= FSR_4BYTE_ADDR_MODE_ENABLED;
  1196. }
  1197. s->pos = 0;
  1198. s->len = 1;
  1199. s->data_read_loop = true;
  1200. s->state = STATE_READING_DATA;
  1201. break;
  1202. case JEDEC_READ:
  1203. if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) == MODE_STD) {
  1204. trace_m25p80_populated_jedec(s);
  1205. for (i = 0; i < s->pi->id_len; i++) {
  1206. s->data[i] = s->pi->id[i];
  1207. }
  1208. for (; i < SPI_NOR_MAX_ID_LEN; i++) {
  1209. s->data[i] = 0;
  1210. }
  1211. s->len = SPI_NOR_MAX_ID_LEN;
  1212. s->pos = 0;
  1213. s->state = STATE_READING_DATA;
  1214. } else {
  1215. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute JEDEC read "
  1216. "in DIO or QIO mode\n");
  1217. }
  1218. break;
  1219. case RDCR:
  1220. s->data[0] = s->volatile_cfg & 0xFF;
  1221. s->data[0] |= (!!s->four_bytes_address_mode) << 5;
  1222. s->pos = 0;
  1223. s->len = 1;
  1224. s->state = STATE_READING_DATA;
  1225. break;
  1226. case BULK_ERASE_60:
  1227. case BULK_ERASE:
  1228. if (s->write_enable) {
  1229. trace_m25p80_chip_erase(s);
  1230. flash_erase(s, 0, BULK_ERASE);
  1231. } else {
  1232. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: chip erase with write "
  1233. "protect!\n");
  1234. }
  1235. break;
  1236. case NOP:
  1237. break;
  1238. case EN_4BYTE_ADDR:
  1239. s->four_bytes_address_mode = true;
  1240. break;
  1241. case EX_4BYTE_ADDR:
  1242. s->four_bytes_address_mode = false;
  1243. break;
  1244. case BRRD:
  1245. case EXTEND_ADDR_READ:
  1246. s->data[0] = s->ear;
  1247. s->pos = 0;
  1248. s->len = 1;
  1249. s->state = STATE_READING_DATA;
  1250. break;
  1251. case BRWR:
  1252. case EXTEND_ADDR_WRITE:
  1253. if (s->write_enable) {
  1254. s->needed_bytes = 1;
  1255. s->pos = 0;
  1256. s->len = 0;
  1257. s->state = STATE_COLLECTING_DATA;
  1258. }
  1259. break;
  1260. case RNVCR:
  1261. s->data[0] = s->nonvolatile_cfg & 0xFF;
  1262. s->data[1] = (s->nonvolatile_cfg >> 8) & 0xFF;
  1263. s->pos = 0;
  1264. s->len = 2;
  1265. s->state = STATE_READING_DATA;
  1266. break;
  1267. case WNVCR:
  1268. if (s->write_enable && get_man(s) == MAN_NUMONYX) {
  1269. s->needed_bytes = 2;
  1270. s->pos = 0;
  1271. s->len = 0;
  1272. s->state = STATE_COLLECTING_DATA;
  1273. }
  1274. break;
  1275. case RVCR:
  1276. s->data[0] = s->volatile_cfg & 0xFF;
  1277. s->pos = 0;
  1278. s->len = 1;
  1279. s->state = STATE_READING_DATA;
  1280. break;
  1281. case WVCR:
  1282. if (s->write_enable) {
  1283. s->needed_bytes = 1;
  1284. s->pos = 0;
  1285. s->len = 0;
  1286. s->state = STATE_COLLECTING_DATA;
  1287. }
  1288. break;
  1289. case REVCR:
  1290. s->data[0] = s->enh_volatile_cfg & 0xFF;
  1291. s->pos = 0;
  1292. s->len = 1;
  1293. s->state = STATE_READING_DATA;
  1294. break;
  1295. case WEVCR:
  1296. if (s->write_enable) {
  1297. s->needed_bytes = 1;
  1298. s->pos = 0;
  1299. s->len = 0;
  1300. s->state = STATE_COLLECTING_DATA;
  1301. }
  1302. break;
  1303. case RESET_ENABLE:
  1304. s->reset_enable = true;
  1305. break;
  1306. case RESET_MEMORY:
  1307. if (s->reset_enable) {
  1308. reset_memory(s);
  1309. }
  1310. break;
  1311. case RDCR_EQIO:
  1312. switch (get_man(s)) {
  1313. case MAN_SPANSION:
  1314. s->data[0] = (!!s->quad_enable) << 1;
  1315. s->pos = 0;
  1316. s->len = 1;
  1317. s->state = STATE_READING_DATA;
  1318. break;
  1319. case MAN_MACRONIX:
  1320. s->quad_enable = true;
  1321. break;
  1322. case MAN_WINBOND:
  1323. s->data[0] = (!!s->quad_enable) << 1;
  1324. s->pos = 0;
  1325. s->len = 1;
  1326. s->state = STATE_READING_DATA;
  1327. break;
  1328. default:
  1329. break;
  1330. }
  1331. break;
  1332. case RSTQIO:
  1333. s->quad_enable = false;
  1334. break;
  1335. case AAI_WP:
  1336. if (get_man(s) == MAN_SST) {
  1337. if (s->write_enable) {
  1338. if (s->aai_enable) {
  1339. s->state = STATE_PAGE_PROGRAM;
  1340. } else {
  1341. s->aai_enable = true;
  1342. s->needed_bytes = get_addr_length(s);
  1343. s->state = STATE_COLLECTING_DATA;
  1344. }
  1345. } else {
  1346. qemu_log_mask(LOG_GUEST_ERROR,
  1347. "M25P80: AAI_WP with write protect\n");
  1348. }
  1349. } else {
  1350. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", value);
  1351. }
  1352. break;
  1353. case RDSFDP:
  1354. if (s->pi->sfdp_read) {
  1355. s->needed_bytes = get_addr_length(s) + 1; /* SFDP addr + dummy */
  1356. s->pos = 0;
  1357. s->len = 0;
  1358. s->state = STATE_COLLECTING_DATA;
  1359. break;
  1360. }
  1361. /* Fallthrough */
  1362. default:
  1363. s->pos = 0;
  1364. s->len = 1;
  1365. s->state = STATE_READING_DATA;
  1366. s->data_read_loop = true;
  1367. s->data[0] = 0;
  1368. qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", value);
  1369. break;
  1370. }
  1371. }
  1372. static int m25p80_cs(SSIPeripheral *ss, bool select)
  1373. {
  1374. Flash *s = M25P80(ss);
  1375. if (select) {
  1376. if (s->state == STATE_COLLECTING_VAR_LEN_DATA) {
  1377. complete_collecting_data(s);
  1378. }
  1379. s->len = 0;
  1380. s->pos = 0;
  1381. s->state = STATE_IDLE;
  1382. flash_sync_dirty(s, -1);
  1383. s->data_read_loop = false;
  1384. }
  1385. trace_m25p80_select(s, select ? "de" : "");
  1386. return 0;
  1387. }
  1388. static uint32_t m25p80_transfer8(SSIPeripheral *ss, uint32_t tx)
  1389. {
  1390. Flash *s = M25P80(ss);
  1391. uint32_t r = 0;
  1392. trace_m25p80_transfer(s, s->state, s->len, s->needed_bytes, s->pos,
  1393. s->cur_addr, (uint8_t)tx);
  1394. switch (s->state) {
  1395. case STATE_PAGE_PROGRAM:
  1396. trace_m25p80_page_program(s, s->cur_addr, (uint8_t)tx);
  1397. flash_write8(s, s->cur_addr, (uint8_t)tx);
  1398. s->cur_addr = (s->cur_addr + 1) & (s->size - 1);
  1399. if (get_man(s) == MAN_SST && s->aai_enable && s->cur_addr == 0) {
  1400. /*
  1401. * There is no wrap mode during AAI programming once the highest
  1402. * unprotected memory address is reached. The Write-Enable-Latch
  1403. * bit is automatically reset, and AAI programming mode aborts.
  1404. */
  1405. s->write_enable = false;
  1406. s->aai_enable = false;
  1407. }
  1408. break;
  1409. case STATE_READ:
  1410. r = s->storage[s->cur_addr];
  1411. trace_m25p80_read_byte(s, s->cur_addr, (uint8_t)r);
  1412. s->cur_addr = (s->cur_addr + 1) & (s->size - 1);
  1413. break;
  1414. case STATE_COLLECTING_DATA:
  1415. case STATE_COLLECTING_VAR_LEN_DATA:
  1416. if (s->len >= M25P80_INTERNAL_DATA_BUFFER_SZ) {
  1417. qemu_log_mask(LOG_GUEST_ERROR,
  1418. "M25P80: Write overrun internal data buffer. "
  1419. "SPI controller (QEMU emulator or guest driver) "
  1420. "is misbehaving\n");
  1421. s->len = s->pos = 0;
  1422. s->state = STATE_IDLE;
  1423. break;
  1424. }
  1425. s->data[s->len] = (uint8_t)tx;
  1426. s->len++;
  1427. if (s->len == s->needed_bytes) {
  1428. complete_collecting_data(s);
  1429. }
  1430. break;
  1431. case STATE_READING_DATA:
  1432. if (s->pos >= M25P80_INTERNAL_DATA_BUFFER_SZ) {
  1433. qemu_log_mask(LOG_GUEST_ERROR,
  1434. "M25P80: Read overrun internal data buffer. "
  1435. "SPI controller (QEMU emulator or guest driver) "
  1436. "is misbehaving\n");
  1437. s->len = s->pos = 0;
  1438. s->state = STATE_IDLE;
  1439. break;
  1440. }
  1441. r = s->data[s->pos];
  1442. trace_m25p80_read_data(s, s->pos, (uint8_t)r);
  1443. s->pos++;
  1444. if (s->pos == s->len) {
  1445. s->pos = 0;
  1446. if (!s->data_read_loop) {
  1447. s->state = STATE_IDLE;
  1448. }
  1449. }
  1450. break;
  1451. case STATE_READING_SFDP:
  1452. assert(s->pi->sfdp_read);
  1453. r = s->pi->sfdp_read(s->cur_addr);
  1454. trace_m25p80_read_sfdp(s, s->cur_addr, (uint8_t)r);
  1455. s->cur_addr = (s->cur_addr + 1) & (M25P80_SFDP_MAX_SIZE - 1);
  1456. break;
  1457. default:
  1458. case STATE_IDLE:
  1459. decode_new_cmd(s, (uint8_t)tx);
  1460. break;
  1461. }
  1462. return r;
  1463. }
  1464. static void m25p80_write_protect_pin_irq_handler(void *opaque, int n, int level)
  1465. {
  1466. Flash *s = M25P80(opaque);
  1467. /* WP# is just a single pin. */
  1468. assert(n == 0);
  1469. s->wp_level = !!level;
  1470. }
  1471. static void m25p80_realize(SSIPeripheral *ss, Error **errp)
  1472. {
  1473. Flash *s = M25P80(ss);
  1474. M25P80Class *mc = M25P80_GET_CLASS(s);
  1475. int ret;
  1476. s->pi = mc->pi;
  1477. s->size = s->pi->sector_size * s->pi->n_sectors;
  1478. s->dirty_page = -1;
  1479. if (s->blk) {
  1480. uint64_t perm = BLK_PERM_CONSISTENT_READ |
  1481. (blk_supports_write_perm(s->blk) ? BLK_PERM_WRITE : 0);
  1482. ret = blk_set_perm(s->blk, perm, BLK_PERM_ALL, errp);
  1483. if (ret < 0) {
  1484. return;
  1485. }
  1486. trace_m25p80_binding(s);
  1487. s->storage = blk_blockalign(s->blk, s->size);
  1488. if (!blk_check_size_and_read_all(s->blk, DEVICE(s),
  1489. s->storage, s->size, errp)) {
  1490. return;
  1491. }
  1492. } else {
  1493. trace_m25p80_binding_no_bdrv(s);
  1494. s->storage = blk_blockalign(NULL, s->size);
  1495. memset(s->storage, 0xFF, s->size);
  1496. }
  1497. qdev_init_gpio_in_named(DEVICE(s),
  1498. m25p80_write_protect_pin_irq_handler, "WP#", 1);
  1499. }
  1500. static void m25p80_reset(DeviceState *d)
  1501. {
  1502. Flash *s = M25P80(d);
  1503. s->wp_level = true;
  1504. s->status_register_write_disabled = false;
  1505. s->block_protect0 = false;
  1506. s->block_protect1 = false;
  1507. s->block_protect2 = false;
  1508. s->block_protect3 = false;
  1509. s->top_bottom_bit = false;
  1510. reset_memory(s);
  1511. }
  1512. static int m25p80_pre_save(void *opaque)
  1513. {
  1514. flash_sync_dirty((Flash *)opaque, -1);
  1515. return 0;
  1516. }
  1517. static Property m25p80_properties[] = {
  1518. /* This is default value for Micron flash */
  1519. DEFINE_PROP_BOOL("write-enable", Flash, write_enable, false),
  1520. DEFINE_PROP_UINT32("nonvolatile-cfg", Flash, nonvolatile_cfg, 0x8FFF),
  1521. DEFINE_PROP_UINT8("spansion-cr1nv", Flash, spansion_cr1nv, 0x0),
  1522. DEFINE_PROP_UINT8("spansion-cr2nv", Flash, spansion_cr2nv, 0x8),
  1523. DEFINE_PROP_UINT8("spansion-cr3nv", Flash, spansion_cr3nv, 0x2),
  1524. DEFINE_PROP_UINT8("spansion-cr4nv", Flash, spansion_cr4nv, 0x10),
  1525. DEFINE_PROP_DRIVE("drive", Flash, blk),
  1526. DEFINE_PROP_END_OF_LIST(),
  1527. };
  1528. static int m25p80_pre_load(void *opaque)
  1529. {
  1530. Flash *s = (Flash *)opaque;
  1531. s->data_read_loop = false;
  1532. return 0;
  1533. }
  1534. static bool m25p80_data_read_loop_needed(void *opaque)
  1535. {
  1536. Flash *s = (Flash *)opaque;
  1537. return s->data_read_loop;
  1538. }
  1539. static const VMStateDescription vmstate_m25p80_data_read_loop = {
  1540. .name = "m25p80/data_read_loop",
  1541. .version_id = 1,
  1542. .minimum_version_id = 1,
  1543. .needed = m25p80_data_read_loop_needed,
  1544. .fields = (const VMStateField[]) {
  1545. VMSTATE_BOOL(data_read_loop, Flash),
  1546. VMSTATE_END_OF_LIST()
  1547. }
  1548. };
  1549. static bool m25p80_aai_enable_needed(void *opaque)
  1550. {
  1551. Flash *s = (Flash *)opaque;
  1552. return s->aai_enable;
  1553. }
  1554. static const VMStateDescription vmstate_m25p80_aai_enable = {
  1555. .name = "m25p80/aai_enable",
  1556. .version_id = 1,
  1557. .minimum_version_id = 1,
  1558. .needed = m25p80_aai_enable_needed,
  1559. .fields = (const VMStateField[]) {
  1560. VMSTATE_BOOL(aai_enable, Flash),
  1561. VMSTATE_END_OF_LIST()
  1562. }
  1563. };
  1564. static bool m25p80_wp_level_srwd_needed(void *opaque)
  1565. {
  1566. Flash *s = (Flash *)opaque;
  1567. return !s->wp_level || s->status_register_write_disabled;
  1568. }
  1569. static const VMStateDescription vmstate_m25p80_write_protect = {
  1570. .name = "m25p80/write_protect",
  1571. .version_id = 1,
  1572. .minimum_version_id = 1,
  1573. .needed = m25p80_wp_level_srwd_needed,
  1574. .fields = (const VMStateField[]) {
  1575. VMSTATE_BOOL(wp_level, Flash),
  1576. VMSTATE_BOOL(status_register_write_disabled, Flash),
  1577. VMSTATE_END_OF_LIST()
  1578. }
  1579. };
  1580. static bool m25p80_block_protect_needed(void *opaque)
  1581. {
  1582. Flash *s = (Flash *)opaque;
  1583. return s->block_protect0 ||
  1584. s->block_protect1 ||
  1585. s->block_protect2 ||
  1586. s->block_protect3 ||
  1587. s->top_bottom_bit;
  1588. }
  1589. static const VMStateDescription vmstate_m25p80_block_protect = {
  1590. .name = "m25p80/block_protect",
  1591. .version_id = 1,
  1592. .minimum_version_id = 1,
  1593. .needed = m25p80_block_protect_needed,
  1594. .fields = (const VMStateField[]) {
  1595. VMSTATE_BOOL(block_protect0, Flash),
  1596. VMSTATE_BOOL(block_protect1, Flash),
  1597. VMSTATE_BOOL(block_protect2, Flash),
  1598. VMSTATE_BOOL(block_protect3, Flash),
  1599. VMSTATE_BOOL(top_bottom_bit, Flash),
  1600. VMSTATE_END_OF_LIST()
  1601. }
  1602. };
  1603. static const VMStateDescription vmstate_m25p80 = {
  1604. .name = "m25p80",
  1605. .version_id = 0,
  1606. .minimum_version_id = 0,
  1607. .pre_save = m25p80_pre_save,
  1608. .pre_load = m25p80_pre_load,
  1609. .fields = (const VMStateField[]) {
  1610. VMSTATE_UINT8(state, Flash),
  1611. VMSTATE_UINT8_ARRAY(data, Flash, M25P80_INTERNAL_DATA_BUFFER_SZ),
  1612. VMSTATE_UINT32(len, Flash),
  1613. VMSTATE_UINT32(pos, Flash),
  1614. VMSTATE_UINT8(needed_bytes, Flash),
  1615. VMSTATE_UINT8(cmd_in_progress, Flash),
  1616. VMSTATE_UINT32(cur_addr, Flash),
  1617. VMSTATE_BOOL(write_enable, Flash),
  1618. VMSTATE_BOOL(reset_enable, Flash),
  1619. VMSTATE_UINT8(ear, Flash),
  1620. VMSTATE_BOOL(four_bytes_address_mode, Flash),
  1621. VMSTATE_UINT32(nonvolatile_cfg, Flash),
  1622. VMSTATE_UINT32(volatile_cfg, Flash),
  1623. VMSTATE_UINT32(enh_volatile_cfg, Flash),
  1624. VMSTATE_BOOL(quad_enable, Flash),
  1625. VMSTATE_UINT8(spansion_cr1nv, Flash),
  1626. VMSTATE_UINT8(spansion_cr2nv, Flash),
  1627. VMSTATE_UINT8(spansion_cr3nv, Flash),
  1628. VMSTATE_UINT8(spansion_cr4nv, Flash),
  1629. VMSTATE_END_OF_LIST()
  1630. },
  1631. .subsections = (const VMStateDescription * const []) {
  1632. &vmstate_m25p80_data_read_loop,
  1633. &vmstate_m25p80_aai_enable,
  1634. &vmstate_m25p80_write_protect,
  1635. &vmstate_m25p80_block_protect,
  1636. NULL
  1637. }
  1638. };
  1639. static void m25p80_class_init(ObjectClass *klass, void *data)
  1640. {
  1641. DeviceClass *dc = DEVICE_CLASS(klass);
  1642. SSIPeripheralClass *k = SSI_PERIPHERAL_CLASS(klass);
  1643. M25P80Class *mc = M25P80_CLASS(klass);
  1644. k->realize = m25p80_realize;
  1645. k->transfer = m25p80_transfer8;
  1646. k->set_cs = m25p80_cs;
  1647. k->cs_polarity = SSI_CS_LOW;
  1648. dc->vmsd = &vmstate_m25p80;
  1649. device_class_set_props(dc, m25p80_properties);
  1650. device_class_set_legacy_reset(dc, m25p80_reset);
  1651. mc->pi = data;
  1652. }
  1653. static const TypeInfo m25p80_info = {
  1654. .name = TYPE_M25P80,
  1655. .parent = TYPE_SSI_PERIPHERAL,
  1656. .instance_size = sizeof(Flash),
  1657. .class_size = sizeof(M25P80Class),
  1658. .abstract = true,
  1659. };
  1660. static void m25p80_register_types(void)
  1661. {
  1662. int i;
  1663. type_register_static(&m25p80_info);
  1664. for (i = 0; i < ARRAY_SIZE(known_devices); ++i) {
  1665. TypeInfo ti = {
  1666. .name = known_devices[i].part_name,
  1667. .parent = TYPE_M25P80,
  1668. .class_init = m25p80_class_init,
  1669. .class_data = (void *)&known_devices[i],
  1670. };
  1671. type_register(&ti);
  1672. }
  1673. }
  1674. type_init(m25p80_register_types)
  1675. BlockBackend *m25p80_get_blk(DeviceState *dev)
  1676. {
  1677. return M25P80(dev)->blk;
  1678. }