m25p80.c 57 KB

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