2
0

onenand.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. /*
  2. * OneNAND flash memories emulation.
  3. *
  4. * Copyright (C) 2008 Nokia Corporation
  5. * Written by Andrzej Zaborowski <andrew@openedhand.com>
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2 or
  10. * (at your option) version 3 of the License.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License along
  18. * with this program; if not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include "qemu-common.h"
  21. #include "hw.h"
  22. #include "flash.h"
  23. #include "irq.h"
  24. #include "blockdev.h"
  25. #include "memory.h"
  26. #include "exec-memory.h"
  27. #include "sysbus.h"
  28. #include "qemu-error.h"
  29. /* 11 for 2kB-page OneNAND ("2nd generation") and 10 for 1kB-page chips */
  30. #define PAGE_SHIFT 11
  31. /* Fixed */
  32. #define BLOCK_SHIFT (PAGE_SHIFT + 6)
  33. typedef struct {
  34. SysBusDevice busdev;
  35. struct {
  36. uint16_t man;
  37. uint16_t dev;
  38. uint16_t ver;
  39. } id;
  40. int shift;
  41. target_phys_addr_t base;
  42. qemu_irq intr;
  43. qemu_irq rdy;
  44. BlockDriverState *bdrv;
  45. BlockDriverState *bdrv_cur;
  46. uint8_t *image;
  47. uint8_t *otp;
  48. uint8_t *current;
  49. MemoryRegion ram;
  50. MemoryRegion mapped_ram;
  51. uint8_t current_direction;
  52. uint8_t *boot[2];
  53. uint8_t *data[2][2];
  54. MemoryRegion iomem;
  55. MemoryRegion container;
  56. int cycle;
  57. int otpmode;
  58. uint16_t addr[8];
  59. uint16_t unladdr[8];
  60. int bufaddr;
  61. int count;
  62. uint16_t command;
  63. uint16_t config[2];
  64. uint16_t status;
  65. uint16_t intstatus;
  66. uint16_t wpstatus;
  67. ECCState ecc;
  68. int density_mask;
  69. int secs;
  70. int secs_cur;
  71. int blocks;
  72. uint8_t *blockwp;
  73. } OneNANDState;
  74. enum {
  75. ONEN_BUF_BLOCK = 0,
  76. ONEN_BUF_BLOCK2 = 1,
  77. ONEN_BUF_DEST_BLOCK = 2,
  78. ONEN_BUF_DEST_PAGE = 3,
  79. ONEN_BUF_PAGE = 7,
  80. };
  81. enum {
  82. ONEN_ERR_CMD = 1 << 10,
  83. ONEN_ERR_ERASE = 1 << 11,
  84. ONEN_ERR_PROG = 1 << 12,
  85. ONEN_ERR_LOAD = 1 << 13,
  86. };
  87. enum {
  88. ONEN_INT_RESET = 1 << 4,
  89. ONEN_INT_ERASE = 1 << 5,
  90. ONEN_INT_PROG = 1 << 6,
  91. ONEN_INT_LOAD = 1 << 7,
  92. ONEN_INT = 1 << 15,
  93. };
  94. enum {
  95. ONEN_LOCK_LOCKTIGHTEN = 1 << 0,
  96. ONEN_LOCK_LOCKED = 1 << 1,
  97. ONEN_LOCK_UNLOCKED = 1 << 2,
  98. };
  99. static void onenand_mem_setup(OneNANDState *s)
  100. {
  101. /* XXX: We should use IO_MEM_ROMD but we broke it earlier...
  102. * Both 0x0000 ... 0x01ff and 0x8000 ... 0x800f can be used to
  103. * write boot commands. Also take note of the BWPS bit. */
  104. memory_region_init(&s->container, "onenand", 0x10000 << s->shift);
  105. memory_region_add_subregion(&s->container, 0, &s->iomem);
  106. memory_region_init_alias(&s->mapped_ram, "onenand-mapped-ram",
  107. &s->ram, 0x0200 << s->shift,
  108. 0xbe00 << s->shift);
  109. memory_region_add_subregion_overlap(&s->container,
  110. 0x0200 << s->shift,
  111. &s->mapped_ram,
  112. 1);
  113. }
  114. static void onenand_intr_update(OneNANDState *s)
  115. {
  116. qemu_set_irq(s->intr, ((s->intstatus >> 15) ^ (~s->config[0] >> 6)) & 1);
  117. }
  118. static void onenand_pre_save(void *opaque)
  119. {
  120. OneNANDState *s = opaque;
  121. if (s->current == s->otp) {
  122. s->current_direction = 1;
  123. } else if (s->current == s->image) {
  124. s->current_direction = 2;
  125. } else {
  126. s->current_direction = 0;
  127. }
  128. }
  129. static int onenand_post_load(void *opaque, int version_id)
  130. {
  131. OneNANDState *s = opaque;
  132. switch (s->current_direction) {
  133. case 0:
  134. break;
  135. case 1:
  136. s->current = s->otp;
  137. break;
  138. case 2:
  139. s->current = s->image;
  140. break;
  141. default:
  142. return -1;
  143. }
  144. onenand_intr_update(s);
  145. return 0;
  146. }
  147. static const VMStateDescription vmstate_onenand = {
  148. .name = "onenand",
  149. .version_id = 1,
  150. .minimum_version_id = 1,
  151. .minimum_version_id_old = 1,
  152. .pre_save = onenand_pre_save,
  153. .post_load = onenand_post_load,
  154. .fields = (VMStateField[]) {
  155. VMSTATE_UINT8(current_direction, OneNANDState),
  156. VMSTATE_INT32(cycle, OneNANDState),
  157. VMSTATE_INT32(otpmode, OneNANDState),
  158. VMSTATE_UINT16_ARRAY(addr, OneNANDState, 8),
  159. VMSTATE_UINT16_ARRAY(unladdr, OneNANDState, 8),
  160. VMSTATE_INT32(bufaddr, OneNANDState),
  161. VMSTATE_INT32(count, OneNANDState),
  162. VMSTATE_UINT16(command, OneNANDState),
  163. VMSTATE_UINT16_ARRAY(config, OneNANDState, 2),
  164. VMSTATE_UINT16(status, OneNANDState),
  165. VMSTATE_UINT16(intstatus, OneNANDState),
  166. VMSTATE_UINT16(wpstatus, OneNANDState),
  167. VMSTATE_INT32(secs_cur, OneNANDState),
  168. VMSTATE_PARTIAL_VBUFFER(blockwp, OneNANDState, blocks),
  169. VMSTATE_UINT8(ecc.cp, OneNANDState),
  170. VMSTATE_UINT16_ARRAY(ecc.lp, OneNANDState, 2),
  171. VMSTATE_UINT16(ecc.count, OneNANDState),
  172. VMSTATE_BUFFER_UNSAFE(otp, OneNANDState, 0, ((64 + 2) << PAGE_SHIFT)),
  173. VMSTATE_END_OF_LIST()
  174. }
  175. };
  176. /* Hot reset (Reset OneNAND command) or warm reset (RP pin low) */
  177. static void onenand_reset(OneNANDState *s, int cold)
  178. {
  179. memset(&s->addr, 0, sizeof(s->addr));
  180. s->command = 0;
  181. s->count = 1;
  182. s->bufaddr = 0;
  183. s->config[0] = 0x40c0;
  184. s->config[1] = 0x0000;
  185. onenand_intr_update(s);
  186. qemu_irq_raise(s->rdy);
  187. s->status = 0x0000;
  188. s->intstatus = cold ? 0x8080 : 0x8010;
  189. s->unladdr[0] = 0;
  190. s->unladdr[1] = 0;
  191. s->wpstatus = 0x0002;
  192. s->cycle = 0;
  193. s->otpmode = 0;
  194. s->bdrv_cur = s->bdrv;
  195. s->current = s->image;
  196. s->secs_cur = s->secs;
  197. if (cold) {
  198. /* Lock the whole flash */
  199. memset(s->blockwp, ONEN_LOCK_LOCKED, s->blocks);
  200. if (s->bdrv_cur && bdrv_read(s->bdrv_cur, 0, s->boot[0], 8) < 0) {
  201. hw_error("%s: Loading the BootRAM failed.\n", __func__);
  202. }
  203. }
  204. }
  205. static void onenand_system_reset(DeviceState *dev)
  206. {
  207. onenand_reset(FROM_SYSBUS(OneNANDState, sysbus_from_qdev(dev)), 1);
  208. }
  209. static inline int onenand_load_main(OneNANDState *s, int sec, int secn,
  210. void *dest)
  211. {
  212. if (s->bdrv_cur)
  213. return bdrv_read(s->bdrv_cur, sec, dest, secn) < 0;
  214. else if (sec + secn > s->secs_cur)
  215. return 1;
  216. memcpy(dest, s->current + (sec << 9), secn << 9);
  217. return 0;
  218. }
  219. static inline int onenand_prog_main(OneNANDState *s, int sec, int secn,
  220. void *src)
  221. {
  222. int result = 0;
  223. if (secn > 0) {
  224. uint32_t size = (uint32_t)secn * 512;
  225. const uint8_t *sp = (const uint8_t *)src;
  226. uint8_t *dp = 0;
  227. if (s->bdrv_cur) {
  228. dp = g_malloc(size);
  229. if (!dp || bdrv_read(s->bdrv_cur, sec, dp, secn) < 0) {
  230. result = 1;
  231. }
  232. } else {
  233. if (sec + secn > s->secs_cur) {
  234. result = 1;
  235. } else {
  236. dp = (uint8_t *)s->current + (sec << 9);
  237. }
  238. }
  239. if (!result) {
  240. uint32_t i;
  241. for (i = 0; i < size; i++) {
  242. dp[i] &= sp[i];
  243. }
  244. if (s->bdrv_cur) {
  245. result = bdrv_write(s->bdrv_cur, sec, dp, secn) < 0;
  246. }
  247. }
  248. if (dp && s->bdrv_cur) {
  249. g_free(dp);
  250. }
  251. }
  252. return result;
  253. }
  254. static inline int onenand_load_spare(OneNANDState *s, int sec, int secn,
  255. void *dest)
  256. {
  257. uint8_t buf[512];
  258. if (s->bdrv_cur) {
  259. if (bdrv_read(s->bdrv_cur, s->secs_cur + (sec >> 5), buf, 1) < 0)
  260. return 1;
  261. memcpy(dest, buf + ((sec & 31) << 4), secn << 4);
  262. } else if (sec + secn > s->secs_cur)
  263. return 1;
  264. else
  265. memcpy(dest, s->current + (s->secs_cur << 9) + (sec << 4), secn << 4);
  266. return 0;
  267. }
  268. static inline int onenand_prog_spare(OneNANDState *s, int sec, int secn,
  269. void *src)
  270. {
  271. int result = 0;
  272. if (secn > 0) {
  273. const uint8_t *sp = (const uint8_t *)src;
  274. uint8_t *dp = 0, *dpp = 0;
  275. if (s->bdrv_cur) {
  276. dp = g_malloc(512);
  277. if (!dp || bdrv_read(s->bdrv_cur,
  278. s->secs_cur + (sec >> 5),
  279. dp, 1) < 0) {
  280. result = 1;
  281. } else {
  282. dpp = dp + ((sec & 31) << 4);
  283. }
  284. } else {
  285. if (sec + secn > s->secs_cur) {
  286. result = 1;
  287. } else {
  288. dpp = s->current + (s->secs_cur << 9) + (sec << 4);
  289. }
  290. }
  291. if (!result) {
  292. uint32_t i;
  293. for (i = 0; i < (secn << 4); i++) {
  294. dpp[i] &= sp[i];
  295. }
  296. if (s->bdrv_cur) {
  297. result = bdrv_write(s->bdrv_cur, s->secs_cur + (sec >> 5),
  298. dp, 1) < 0;
  299. }
  300. }
  301. if (dp) {
  302. g_free(dp);
  303. }
  304. }
  305. return result;
  306. }
  307. static inline int onenand_erase(OneNANDState *s, int sec, int num)
  308. {
  309. uint8_t *blankbuf, *tmpbuf;
  310. blankbuf = g_malloc(512);
  311. if (!blankbuf) {
  312. return 1;
  313. }
  314. tmpbuf = g_malloc(512);
  315. if (!tmpbuf) {
  316. g_free(blankbuf);
  317. return 1;
  318. }
  319. memset(blankbuf, 0xff, 512);
  320. for (; num > 0; num--, sec++) {
  321. if (s->bdrv_cur) {
  322. int erasesec = s->secs_cur + (sec >> 5);
  323. if (bdrv_write(s->bdrv_cur, sec, blankbuf, 1)) {
  324. goto fail;
  325. }
  326. if (bdrv_read(s->bdrv_cur, erasesec, tmpbuf, 1) < 0) {
  327. goto fail;
  328. }
  329. memcpy(tmpbuf + ((sec & 31) << 4), blankbuf, 1 << 4);
  330. if (bdrv_write(s->bdrv_cur, erasesec, tmpbuf, 1) < 0) {
  331. goto fail;
  332. }
  333. } else {
  334. if (sec + 1 > s->secs_cur) {
  335. goto fail;
  336. }
  337. memcpy(s->current + (sec << 9), blankbuf, 512);
  338. memcpy(s->current + (s->secs_cur << 9) + (sec << 4),
  339. blankbuf, 1 << 4);
  340. }
  341. }
  342. g_free(tmpbuf);
  343. g_free(blankbuf);
  344. return 0;
  345. fail:
  346. g_free(tmpbuf);
  347. g_free(blankbuf);
  348. return 1;
  349. }
  350. static void onenand_command(OneNANDState *s)
  351. {
  352. int b;
  353. int sec;
  354. void *buf;
  355. #define SETADDR(block, page) \
  356. sec = (s->addr[page] & 3) + \
  357. ((((s->addr[page] >> 2) & 0x3f) + \
  358. (((s->addr[block] & 0xfff) | \
  359. (s->addr[block] >> 15 ? \
  360. s->density_mask : 0)) << 6)) << (PAGE_SHIFT - 9));
  361. #define SETBUF_M() \
  362. buf = (s->bufaddr & 8) ? \
  363. s->data[(s->bufaddr >> 2) & 1][0] : s->boot[0]; \
  364. buf += (s->bufaddr & 3) << 9;
  365. #define SETBUF_S() \
  366. buf = (s->bufaddr & 8) ? \
  367. s->data[(s->bufaddr >> 2) & 1][1] : s->boot[1]; \
  368. buf += (s->bufaddr & 3) << 4;
  369. switch (s->command) {
  370. case 0x00: /* Load single/multiple sector data unit into buffer */
  371. SETADDR(ONEN_BUF_BLOCK, ONEN_BUF_PAGE)
  372. SETBUF_M()
  373. if (onenand_load_main(s, sec, s->count, buf))
  374. s->status |= ONEN_ERR_CMD | ONEN_ERR_LOAD;
  375. #if 0
  376. SETBUF_S()
  377. if (onenand_load_spare(s, sec, s->count, buf))
  378. s->status |= ONEN_ERR_CMD | ONEN_ERR_LOAD;
  379. #endif
  380. /* TODO: if (s->bufaddr & 3) + s->count was > 4 (2k-pages)
  381. * or if (s->bufaddr & 1) + s->count was > 2 (1k-pages)
  382. * then we need two split the read/write into two chunks.
  383. */
  384. s->intstatus |= ONEN_INT | ONEN_INT_LOAD;
  385. break;
  386. case 0x13: /* Load single/multiple spare sector into buffer */
  387. SETADDR(ONEN_BUF_BLOCK, ONEN_BUF_PAGE)
  388. SETBUF_S()
  389. if (onenand_load_spare(s, sec, s->count, buf))
  390. s->status |= ONEN_ERR_CMD | ONEN_ERR_LOAD;
  391. /* TODO: if (s->bufaddr & 3) + s->count was > 4 (2k-pages)
  392. * or if (s->bufaddr & 1) + s->count was > 2 (1k-pages)
  393. * then we need two split the read/write into two chunks.
  394. */
  395. s->intstatus |= ONEN_INT | ONEN_INT_LOAD;
  396. break;
  397. case 0x80: /* Program single/multiple sector data unit from buffer */
  398. SETADDR(ONEN_BUF_BLOCK, ONEN_BUF_PAGE)
  399. SETBUF_M()
  400. if (onenand_prog_main(s, sec, s->count, buf))
  401. s->status |= ONEN_ERR_CMD | ONEN_ERR_PROG;
  402. #if 0
  403. SETBUF_S()
  404. if (onenand_prog_spare(s, sec, s->count, buf))
  405. s->status |= ONEN_ERR_CMD | ONEN_ERR_PROG;
  406. #endif
  407. /* TODO: if (s->bufaddr & 3) + s->count was > 4 (2k-pages)
  408. * or if (s->bufaddr & 1) + s->count was > 2 (1k-pages)
  409. * then we need two split the read/write into two chunks.
  410. */
  411. s->intstatus |= ONEN_INT | ONEN_INT_PROG;
  412. break;
  413. case 0x1a: /* Program single/multiple spare area sector from buffer */
  414. SETADDR(ONEN_BUF_BLOCK, ONEN_BUF_PAGE)
  415. SETBUF_S()
  416. if (onenand_prog_spare(s, sec, s->count, buf))
  417. s->status |= ONEN_ERR_CMD | ONEN_ERR_PROG;
  418. /* TODO: if (s->bufaddr & 3) + s->count was > 4 (2k-pages)
  419. * or if (s->bufaddr & 1) + s->count was > 2 (1k-pages)
  420. * then we need two split the read/write into two chunks.
  421. */
  422. s->intstatus |= ONEN_INT | ONEN_INT_PROG;
  423. break;
  424. case 0x1b: /* Copy-back program */
  425. SETBUF_S()
  426. SETADDR(ONEN_BUF_BLOCK, ONEN_BUF_PAGE)
  427. if (onenand_load_main(s, sec, s->count, buf))
  428. s->status |= ONEN_ERR_CMD | ONEN_ERR_PROG;
  429. SETADDR(ONEN_BUF_DEST_BLOCK, ONEN_BUF_DEST_PAGE)
  430. if (onenand_prog_main(s, sec, s->count, buf))
  431. s->status |= ONEN_ERR_CMD | ONEN_ERR_PROG;
  432. /* TODO: spare areas */
  433. s->intstatus |= ONEN_INT | ONEN_INT_PROG;
  434. break;
  435. case 0x23: /* Unlock NAND array block(s) */
  436. s->intstatus |= ONEN_INT;
  437. /* XXX the previous (?) area should be locked automatically */
  438. for (b = s->unladdr[0]; b <= s->unladdr[1]; b ++) {
  439. if (b >= s->blocks) {
  440. s->status |= ONEN_ERR_CMD;
  441. break;
  442. }
  443. if (s->blockwp[b] == ONEN_LOCK_LOCKTIGHTEN)
  444. break;
  445. s->wpstatus = s->blockwp[b] = ONEN_LOCK_UNLOCKED;
  446. }
  447. break;
  448. case 0x27: /* Unlock All NAND array blocks */
  449. s->intstatus |= ONEN_INT;
  450. for (b = 0; b < s->blocks; b ++) {
  451. if (b >= s->blocks) {
  452. s->status |= ONEN_ERR_CMD;
  453. break;
  454. }
  455. if (s->blockwp[b] == ONEN_LOCK_LOCKTIGHTEN)
  456. break;
  457. s->wpstatus = s->blockwp[b] = ONEN_LOCK_UNLOCKED;
  458. }
  459. break;
  460. case 0x2a: /* Lock NAND array block(s) */
  461. s->intstatus |= ONEN_INT;
  462. for (b = s->unladdr[0]; b <= s->unladdr[1]; b ++) {
  463. if (b >= s->blocks) {
  464. s->status |= ONEN_ERR_CMD;
  465. break;
  466. }
  467. if (s->blockwp[b] == ONEN_LOCK_LOCKTIGHTEN)
  468. break;
  469. s->wpstatus = s->blockwp[b] = ONEN_LOCK_LOCKED;
  470. }
  471. break;
  472. case 0x2c: /* Lock-tight NAND array block(s) */
  473. s->intstatus |= ONEN_INT;
  474. for (b = s->unladdr[0]; b <= s->unladdr[1]; b ++) {
  475. if (b >= s->blocks) {
  476. s->status |= ONEN_ERR_CMD;
  477. break;
  478. }
  479. if (s->blockwp[b] == ONEN_LOCK_UNLOCKED)
  480. continue;
  481. s->wpstatus = s->blockwp[b] = ONEN_LOCK_LOCKTIGHTEN;
  482. }
  483. break;
  484. case 0x71: /* Erase-Verify-Read */
  485. s->intstatus |= ONEN_INT;
  486. break;
  487. case 0x95: /* Multi-block erase */
  488. qemu_irq_pulse(s->intr);
  489. /* Fall through. */
  490. case 0x94: /* Block erase */
  491. sec = ((s->addr[ONEN_BUF_BLOCK] & 0xfff) |
  492. (s->addr[ONEN_BUF_BLOCK] >> 15 ? s->density_mask : 0))
  493. << (BLOCK_SHIFT - 9);
  494. if (onenand_erase(s, sec, 1 << (BLOCK_SHIFT - 9)))
  495. s->status |= ONEN_ERR_CMD | ONEN_ERR_ERASE;
  496. s->intstatus |= ONEN_INT | ONEN_INT_ERASE;
  497. break;
  498. case 0xb0: /* Erase suspend */
  499. break;
  500. case 0x30: /* Erase resume */
  501. s->intstatus |= ONEN_INT | ONEN_INT_ERASE;
  502. break;
  503. case 0xf0: /* Reset NAND Flash core */
  504. onenand_reset(s, 0);
  505. break;
  506. case 0xf3: /* Reset OneNAND */
  507. onenand_reset(s, 0);
  508. break;
  509. case 0x65: /* OTP Access */
  510. s->intstatus |= ONEN_INT;
  511. s->bdrv_cur = NULL;
  512. s->current = s->otp;
  513. s->secs_cur = 1 << (BLOCK_SHIFT - 9);
  514. s->addr[ONEN_BUF_BLOCK] = 0;
  515. s->otpmode = 1;
  516. break;
  517. default:
  518. s->status |= ONEN_ERR_CMD;
  519. s->intstatus |= ONEN_INT;
  520. fprintf(stderr, "%s: unknown OneNAND command %x\n",
  521. __func__, s->command);
  522. }
  523. onenand_intr_update(s);
  524. }
  525. static uint64_t onenand_read(void *opaque, target_phys_addr_t addr,
  526. unsigned size)
  527. {
  528. OneNANDState *s = (OneNANDState *) opaque;
  529. int offset = addr >> s->shift;
  530. switch (offset) {
  531. case 0x0000 ... 0xc000:
  532. return lduw_le_p(s->boot[0] + addr);
  533. case 0xf000: /* Manufacturer ID */
  534. return s->id.man;
  535. case 0xf001: /* Device ID */
  536. return s->id.dev;
  537. case 0xf002: /* Version ID */
  538. return s->id.ver;
  539. /* TODO: get the following values from a real chip! */
  540. case 0xf003: /* Data Buffer size */
  541. return 1 << PAGE_SHIFT;
  542. case 0xf004: /* Boot Buffer size */
  543. return 0x200;
  544. case 0xf005: /* Amount of buffers */
  545. return 1 | (2 << 8);
  546. case 0xf006: /* Technology */
  547. return 0;
  548. case 0xf100 ... 0xf107: /* Start addresses */
  549. return s->addr[offset - 0xf100];
  550. case 0xf200: /* Start buffer */
  551. return (s->bufaddr << 8) | ((s->count - 1) & (1 << (PAGE_SHIFT - 10)));
  552. case 0xf220: /* Command */
  553. return s->command;
  554. case 0xf221: /* System Configuration 1 */
  555. return s->config[0] & 0xffe0;
  556. case 0xf222: /* System Configuration 2 */
  557. return s->config[1];
  558. case 0xf240: /* Controller Status */
  559. return s->status;
  560. case 0xf241: /* Interrupt */
  561. return s->intstatus;
  562. case 0xf24c: /* Unlock Start Block Address */
  563. return s->unladdr[0];
  564. case 0xf24d: /* Unlock End Block Address */
  565. return s->unladdr[1];
  566. case 0xf24e: /* Write Protection Status */
  567. return s->wpstatus;
  568. case 0xff00: /* ECC Status */
  569. return 0x00;
  570. case 0xff01: /* ECC Result of main area data */
  571. case 0xff02: /* ECC Result of spare area data */
  572. case 0xff03: /* ECC Result of main area data */
  573. case 0xff04: /* ECC Result of spare area data */
  574. hw_error("%s: imeplement ECC\n", __FUNCTION__);
  575. return 0x0000;
  576. }
  577. fprintf(stderr, "%s: unknown OneNAND register %x\n",
  578. __FUNCTION__, offset);
  579. return 0;
  580. }
  581. static void onenand_write(void *opaque, target_phys_addr_t addr,
  582. uint64_t value, unsigned size)
  583. {
  584. OneNANDState *s = (OneNANDState *) opaque;
  585. int offset = addr >> s->shift;
  586. int sec;
  587. switch (offset) {
  588. case 0x0000 ... 0x01ff:
  589. case 0x8000 ... 0x800f:
  590. if (s->cycle) {
  591. s->cycle = 0;
  592. if (value == 0x0000) {
  593. SETADDR(ONEN_BUF_BLOCK, ONEN_BUF_PAGE)
  594. onenand_load_main(s, sec,
  595. 1 << (PAGE_SHIFT - 9), s->data[0][0]);
  596. s->addr[ONEN_BUF_PAGE] += 4;
  597. s->addr[ONEN_BUF_PAGE] &= 0xff;
  598. }
  599. break;
  600. }
  601. switch (value) {
  602. case 0x00f0: /* Reset OneNAND */
  603. onenand_reset(s, 0);
  604. break;
  605. case 0x00e0: /* Load Data into Buffer */
  606. s->cycle = 1;
  607. break;
  608. case 0x0090: /* Read Identification Data */
  609. memset(s->boot[0], 0, 3 << s->shift);
  610. s->boot[0][0 << s->shift] = s->id.man & 0xff;
  611. s->boot[0][1 << s->shift] = s->id.dev & 0xff;
  612. s->boot[0][2 << s->shift] = s->wpstatus & 0xff;
  613. break;
  614. default:
  615. fprintf(stderr, "%s: unknown OneNAND boot command %"PRIx64"\n",
  616. __FUNCTION__, value);
  617. }
  618. break;
  619. case 0xf100 ... 0xf107: /* Start addresses */
  620. s->addr[offset - 0xf100] = value;
  621. break;
  622. case 0xf200: /* Start buffer */
  623. s->bufaddr = (value >> 8) & 0xf;
  624. if (PAGE_SHIFT == 11)
  625. s->count = (value & 3) ?: 4;
  626. else if (PAGE_SHIFT == 10)
  627. s->count = (value & 1) ?: 2;
  628. break;
  629. case 0xf220: /* Command */
  630. if (s->intstatus & (1 << 15))
  631. break;
  632. s->command = value;
  633. onenand_command(s);
  634. break;
  635. case 0xf221: /* System Configuration 1 */
  636. s->config[0] = value;
  637. onenand_intr_update(s);
  638. qemu_set_irq(s->rdy, (s->config[0] >> 7) & 1);
  639. break;
  640. case 0xf222: /* System Configuration 2 */
  641. s->config[1] = value;
  642. break;
  643. case 0xf241: /* Interrupt */
  644. s->intstatus &= value;
  645. if ((1 << 15) & ~s->intstatus)
  646. s->status &= ~(ONEN_ERR_CMD | ONEN_ERR_ERASE |
  647. ONEN_ERR_PROG | ONEN_ERR_LOAD);
  648. onenand_intr_update(s);
  649. break;
  650. case 0xf24c: /* Unlock Start Block Address */
  651. s->unladdr[0] = value & (s->blocks - 1);
  652. /* For some reason we have to set the end address to by default
  653. * be same as start because the software forgets to write anything
  654. * in there. */
  655. s->unladdr[1] = value & (s->blocks - 1);
  656. break;
  657. case 0xf24d: /* Unlock End Block Address */
  658. s->unladdr[1] = value & (s->blocks - 1);
  659. break;
  660. default:
  661. fprintf(stderr, "%s: unknown OneNAND register %x\n",
  662. __FUNCTION__, offset);
  663. }
  664. }
  665. static const MemoryRegionOps onenand_ops = {
  666. .read = onenand_read,
  667. .write = onenand_write,
  668. .endianness = DEVICE_NATIVE_ENDIAN,
  669. };
  670. static int onenand_initfn(SysBusDevice *dev)
  671. {
  672. OneNANDState *s = (OneNANDState *)dev;
  673. uint32_t size = 1 << (24 + ((s->id.dev >> 4) & 7));
  674. void *ram;
  675. s->base = (target_phys_addr_t)-1;
  676. s->rdy = NULL;
  677. s->blocks = size >> BLOCK_SHIFT;
  678. s->secs = size >> 9;
  679. s->blockwp = g_malloc(s->blocks);
  680. s->density_mask = (s->id.dev & 0x08)
  681. ? (1 << (6 + ((s->id.dev >> 4) & 7))) : 0;
  682. memory_region_init_io(&s->iomem, &onenand_ops, s, "onenand",
  683. 0x10000 << s->shift);
  684. if (!s->bdrv) {
  685. s->image = memset(g_malloc(size + (size >> 5)),
  686. 0xff, size + (size >> 5));
  687. } else {
  688. if (bdrv_is_read_only(s->bdrv)) {
  689. error_report("Can't use a read-only drive");
  690. return -1;
  691. }
  692. s->bdrv_cur = s->bdrv;
  693. }
  694. s->otp = memset(g_malloc((64 + 2) << PAGE_SHIFT),
  695. 0xff, (64 + 2) << PAGE_SHIFT);
  696. memory_region_init_ram(&s->ram, NULL, "onenand.ram", 0xc000 << s->shift);
  697. ram = memory_region_get_ram_ptr(&s->ram);
  698. s->boot[0] = ram + (0x0000 << s->shift);
  699. s->boot[1] = ram + (0x8000 << s->shift);
  700. s->data[0][0] = ram + ((0x0200 + (0 << (PAGE_SHIFT - 1))) << s->shift);
  701. s->data[0][1] = ram + ((0x8010 + (0 << (PAGE_SHIFT - 6))) << s->shift);
  702. s->data[1][0] = ram + ((0x0200 + (1 << (PAGE_SHIFT - 1))) << s->shift);
  703. s->data[1][1] = ram + ((0x8010 + (1 << (PAGE_SHIFT - 6))) << s->shift);
  704. onenand_mem_setup(s);
  705. sysbus_init_irq(dev, &s->intr);
  706. sysbus_init_mmio_region(dev, &s->container);
  707. vmstate_register(&dev->qdev,
  708. ((s->shift & 0x7f) << 24)
  709. | ((s->id.man & 0xff) << 16)
  710. | ((s->id.dev & 0xff) << 8)
  711. | (s->id.ver & 0xff),
  712. &vmstate_onenand, s);
  713. return 0;
  714. }
  715. static SysBusDeviceInfo onenand_info = {
  716. .init = onenand_initfn,
  717. .qdev.name = "onenand",
  718. .qdev.size = sizeof(OneNANDState),
  719. .qdev.reset = onenand_system_reset,
  720. .qdev.props = (Property[]) {
  721. DEFINE_PROP_UINT16("manufacturer_id", OneNANDState, id.man, 0),
  722. DEFINE_PROP_UINT16("device_id", OneNANDState, id.dev, 0),
  723. DEFINE_PROP_UINT16("version_id", OneNANDState, id.ver, 0),
  724. DEFINE_PROP_INT32("shift", OneNANDState, shift, 0),
  725. DEFINE_PROP_DRIVE("drive", OneNANDState, bdrv),
  726. DEFINE_PROP_END_OF_LIST()
  727. }
  728. };
  729. static void onenand_register_device(void)
  730. {
  731. sysbus_register_withprop(&onenand_info);
  732. }
  733. void *onenand_raw_otp(DeviceState *onenand_device)
  734. {
  735. return FROM_SYSBUS(OneNANDState, sysbus_from_qdev(onenand_device))->otp;
  736. }
  737. device_init(onenand_register_device)