flash.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. /*
  2. * (C) Copyright 2000
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. * (C) Copyright 2001-2003
  5. *
  6. * Changes for MATRIX Vision mvBLUE devices
  7. * MATRIX Vision GmbH / hg,as info@matrix-vision.de
  8. *
  9. * SPDX-License-Identifier: GPL-2.0+
  10. */
  11. #include <common.h>
  12. #include <mpc824x.h>
  13. #if 0
  14. #define mvdebug(p) printf ##p
  15. #else
  16. #define mvdebug(p)
  17. #endif
  18. flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
  19. #define FLASH_BUS_WIDTH 8
  20. #if (FLASH_BUS_WIDTH==32)
  21. #define FLASH_DATA_MASK 0xffffffff
  22. #define FLASH_SHIFT 1
  23. #define FDT vu_long
  24. #elif (FLASH_BUS_WIDTH==16)
  25. #define FLASH_DATA_MASK 0xff
  26. #define FLASH_SHIFT 0
  27. #define FDT vu_short
  28. #elif (FLASH_BUS_WIDTH==8)
  29. #define FLASH_DATA_MASK 0xff
  30. #define FLASH_SHIFT 0
  31. #define FDT vu_char
  32. #else
  33. #error FLASH_BUS_WIDTH undefined
  34. #endif
  35. /*-----------------------------------------------------------------------
  36. * Functions
  37. */
  38. static ulong flash_get_size (vu_long *address, flash_info_t *info);
  39. static int write_word (flash_info_t *info, ulong dest, ulong data);
  40. static void flash_get_offsets (ulong base, flash_info_t *info);
  41. /*-----------------------------------------------------------------------
  42. */
  43. unsigned long flash_init (void)
  44. {
  45. unsigned long size_b0;
  46. int i;
  47. for (i=0; i<CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
  48. flash_info[i].flash_id = FLASH_UNKNOWN;
  49. }
  50. size_b0 = flash_get_size((vu_long *)0xffc00000, &flash_info[0]);
  51. if (flash_info[0].flash_id == FLASH_UNKNOWN) {
  52. printf ("## Unknown FLASH : Size = 0x%08lx = %ld MB\n",
  53. size_b0, size_b0<<20);
  54. }
  55. flash_get_offsets (0xffc00000, &flash_info[0]);
  56. flash_info[0].size = size_b0;
  57. /* monitor protection OFF by default */
  58. flash_protect ( FLAG_PROTECT_CLEAR, 0xffc00000, 0x2000, flash_info );
  59. return size_b0;
  60. }
  61. /*-----------------------------------------------------------------------
  62. */
  63. static void flash_get_offsets (ulong base, flash_info_t *info)
  64. {
  65. int i;
  66. /* set up sector start address table */
  67. if (info->flash_id & FLASH_BTYPE)
  68. { /* bottom boot sector types - these are the useful ones! */
  69. /* set sector offsets for bottom boot block type */
  70. if ((info->flash_id & FLASH_TYPEMASK) == FLASH_AM320B)
  71. { /* AMDLV320B has 8 x 8k bottom boot sectors */
  72. for (i = 0; i < 8; i++) /* +8k */
  73. info->start[i] = base + (i * (0x00002000 << FLASH_SHIFT));
  74. for (; i < info->sector_count; i++) /* +64k */
  75. info->start[i] = base + (i * (0x00010000 << FLASH_SHIFT)) - (0x00070000 << FLASH_SHIFT);
  76. }
  77. else
  78. { /* other types have 4 bottom boot sectors (16,8,8,32) */
  79. i = 0;
  80. info->start[i++] = base + 0x00000000; /* - */
  81. info->start[i++] = base + (0x00004000 << FLASH_SHIFT); /* +16k */
  82. info->start[i++] = base + (0x00006000 << FLASH_SHIFT); /* +8k */
  83. info->start[i++] = base + (0x00008000 << FLASH_SHIFT); /* +8k */
  84. info->start[i++] = base + (0x00010000 << FLASH_SHIFT); /* +32k */
  85. for (; i < info->sector_count; i++) /* +64k */
  86. info->start[i] = base + (i * (0x00010000 << FLASH_SHIFT)) - (0x00030000 << FLASH_SHIFT);
  87. }
  88. }
  89. else
  90. { /* top boot sector types - not so useful */
  91. /* set sector offsets for top boot block type */
  92. if ((info->flash_id & FLASH_TYPEMASK) == FLASH_AM320T)
  93. { /* AMDLV320T has 8 x 8k top boot sectors */
  94. for (i = 0; i < info->sector_count - 8; i++) /* +64k */
  95. info->start[i] = base + (i * (0x00010000 << FLASH_SHIFT));
  96. for (; i < info->sector_count; i++) /* +8k */
  97. info->start[i] = base + (i * (0x00002000 << FLASH_SHIFT));
  98. }
  99. else
  100. { /* other types have 4 top boot sectors (32,8,8,16) */
  101. for (i = 0; i < info->sector_count - 4; i++) /* +64k */
  102. info->start[i] = base + (i * (0x00010000 << FLASH_SHIFT));
  103. info->start[i++] = base + info->size - (0x00010000 << FLASH_SHIFT); /* -32k */
  104. info->start[i++] = base + info->size - (0x00008000 << FLASH_SHIFT); /* -8k */
  105. info->start[i++] = base + info->size - (0x00006000 << FLASH_SHIFT); /* -8k */
  106. info->start[i] = base + info->size - (0x00004000 << FLASH_SHIFT); /* -16k */
  107. }
  108. }
  109. }
  110. /*-----------------------------------------------------------------------
  111. */
  112. void flash_print_info (flash_info_t *info)
  113. {
  114. int i;
  115. if (info->flash_id == FLASH_UNKNOWN) {
  116. printf ("missing or unknown FLASH type\n");
  117. return;
  118. }
  119. switch (info->flash_id & FLASH_VENDMASK) {
  120. case FLASH_MAN_AMD: printf ("AMD "); break;
  121. case FLASH_MAN_FUJ: printf ("FUJITSU "); break;
  122. case FLASH_MAN_STM: printf ("ST "); break;
  123. default: printf ("Unknown Vendor "); break;
  124. }
  125. switch (info->flash_id & FLASH_TYPEMASK) {
  126. case FLASH_AM160B: printf ("AM29LV160B (16 Mbit, bottom boot sect)\n");
  127. break;
  128. case FLASH_AM160T: printf ("AM29LV160T (16 Mbit, top boot sector)\n");
  129. break;
  130. case FLASH_AM320B: printf ("AM29LV320B (32 Mbit, bottom boot sect)\n");
  131. break;
  132. case FLASH_AM320T: printf ("AM29LV320T (32 Mbit, top boot sector)\n");
  133. break;
  134. case FLASH_STMW320DB: printf ("M29W320B (32 Mbit, bottom boot sect)\n");
  135. break;
  136. case FLASH_STMW320DT: printf ("M29W320T (32 Mbit, top boot sector)\n");
  137. break;
  138. default: printf ("Unknown Chip Type\n");
  139. break;
  140. }
  141. printf (" Size: %ld MB in %d Sectors\n", info->size >> 20, info->sector_count);
  142. printf (" Sector Start Addresses:");
  143. for (i=0; i<info->sector_count; ++i) {
  144. if ((i % 5) == 0)
  145. printf ("\n ");
  146. printf (" %08lX%s", info->start[i], info->protect[i] ? " (RO)" : " ");
  147. }
  148. printf ("\n");
  149. }
  150. /*
  151. * The following code cannot be run from FLASH!
  152. */
  153. #define AMD_ID_LV160T_MVS (AMD_ID_LV160T & FLASH_DATA_MASK)
  154. #define AMD_ID_LV160B_MVS (AMD_ID_LV160B & FLASH_DATA_MASK)
  155. #define AMD_ID_LV320T_MVS (AMD_ID_LV320T & FLASH_DATA_MASK)
  156. #define AMD_ID_LV320B_MVS (AMD_ID_LV320B & FLASH_DATA_MASK)
  157. #define STM_ID_W320DT_MVS (STM_ID_29W320DT & FLASH_DATA_MASK)
  158. #define STM_ID_W320DB_MVS (STM_ID_29W320DB & FLASH_DATA_MASK)
  159. #define AMD_MANUFACT_MVS (AMD_MANUFACT & FLASH_DATA_MASK)
  160. #define FUJ_MANUFACT_MVS (FUJ_MANUFACT & FLASH_DATA_MASK)
  161. #define STM_MANUFACT_MVS (STM_MANUFACT & FLASH_DATA_MASK)
  162. #if (FLASH_BUS_WIDTH >= 16)
  163. #define AUTOSELECT_ADDR1 0x0555
  164. #define AUTOSELECT_ADDR2 0x02AA
  165. #define AUTOSELECT_ADDR3 AUTOSELECT_ADDR1
  166. #else
  167. #define AUTOSELECT_ADDR1 0x0AAA
  168. #define AUTOSELECT_ADDR2 0x0555
  169. #define AUTOSELECT_ADDR3 AUTOSELECT_ADDR1
  170. #endif
  171. #define AUTOSELECT_DATA1 (0x00AA00AA & FLASH_DATA_MASK)
  172. #define AUTOSELECT_DATA2 (0x00550055 & FLASH_DATA_MASK)
  173. #define AUTOSELECT_DATA3 (0x00900090 & FLASH_DATA_MASK)
  174. #define RESET_BANK_DATA (0x00F000F0 & FLASH_DATA_MASK)
  175. static ulong flash_get_size (vu_long *address, flash_info_t *info)
  176. {
  177. short i;
  178. FDT value;
  179. FDT *addr = (FDT *)address;
  180. ulong base = (ulong)address;
  181. addr[AUTOSELECT_ADDR1] = AUTOSELECT_DATA1;
  182. addr[AUTOSELECT_ADDR2] = AUTOSELECT_DATA2;
  183. addr[AUTOSELECT_ADDR3] = AUTOSELECT_DATA3;
  184. __asm__ __volatile__("sync");
  185. udelay(180);
  186. value = addr[0]; /* manufacturer ID */
  187. switch (value) {
  188. case AMD_MANUFACT_MVS:
  189. info->flash_id = FLASH_MAN_AMD;
  190. break;
  191. case FUJ_MANUFACT_MVS:
  192. info->flash_id = FLASH_MAN_FUJ;
  193. break;
  194. case STM_MANUFACT_MVS:
  195. info->flash_id = FLASH_MAN_STM;
  196. break;
  197. default:
  198. info->flash_id = FLASH_UNKNOWN;
  199. info->sector_count = 0;
  200. info->size = 0;
  201. return (0); /* no or unknown flash */
  202. }
  203. #if (FLASH_BUS_WIDTH >= 16)
  204. value = addr[1]; /* device ID */
  205. #else
  206. value = addr[2]; /* device ID */
  207. #endif
  208. switch (value) {
  209. case AMD_ID_LV160T_MVS:
  210. info->flash_id += FLASH_AM160T;
  211. info->sector_count = 37;
  212. info->size = (0x00200000 << FLASH_SHIFT);
  213. break; /* => 2 or 4 MB */
  214. case AMD_ID_LV160B_MVS:
  215. info->flash_id += FLASH_AM160B;
  216. info->sector_count = 37;
  217. info->size = (0x00200000 << FLASH_SHIFT);
  218. break; /* => 2 or 4 MB */
  219. case AMD_ID_LV320T_MVS:
  220. info->flash_id += FLASH_AM320T;
  221. info->sector_count = 71;
  222. info->size = (0x00400000 << FLASH_SHIFT);
  223. break; /* => 4 or 8 MB */
  224. case AMD_ID_LV320B_MVS:
  225. info->flash_id += FLASH_AM320B;
  226. info->sector_count = 71;
  227. info->size = (0x00400000 << FLASH_SHIFT);
  228. break; /* => 4 or 8MB */
  229. case STM_ID_W320DT_MVS:
  230. info->flash_id += FLASH_STMW320DT;
  231. info->sector_count = 67;
  232. info->size = (0x00400000 << FLASH_SHIFT);
  233. break; /* => 4 or 8 MB */
  234. case STM_ID_W320DB_MVS:
  235. info->flash_id += FLASH_STMW320DB;
  236. info->sector_count = 67;
  237. info->size = (0x00400000 << FLASH_SHIFT);
  238. break; /* => 4 or 8MB */
  239. default:
  240. info->flash_id = FLASH_UNKNOWN;
  241. return (0); /* => no or unknown flash */
  242. }
  243. /* set up sector start address table */
  244. flash_get_offsets (base, info);
  245. /* check for protected sectors */
  246. for (i = 0; i < info->sector_count; i++) {
  247. /* read sector protection at sector address, (A7 .. A0) = 0x02 */
  248. /* D0 = 1 if protected */
  249. addr = (FDT *)(info->start[i]);
  250. info->protect[i] = addr[2] & 1;
  251. }
  252. /*
  253. * Prevent writes to uninitialized FLASH.
  254. */
  255. if (info->flash_id != FLASH_UNKNOWN) {
  256. addr = (FDT *)info->start[0];
  257. *addr = RESET_BANK_DATA; /* reset bank */
  258. }
  259. return (info->size);
  260. }
  261. /*-----------------------------------------------------------------------
  262. */
  263. #if (FLASH_BUS_WIDTH >= 16)
  264. #define ERASE_ADDR1 0x0555
  265. #define ERASE_ADDR2 0x02AA
  266. #else
  267. #define ERASE_ADDR1 0x0AAA
  268. #define ERASE_ADDR2 0x0555
  269. #endif
  270. #define ERASE_ADDR3 ERASE_ADDR1
  271. #define ERASE_ADDR4 ERASE_ADDR1
  272. #define ERASE_ADDR5 ERASE_ADDR2
  273. #define ERASE_DATA1 (0x00AA00AA & FLASH_DATA_MASK)
  274. #define ERASE_DATA2 (0x00550055 & FLASH_DATA_MASK)
  275. #define ERASE_DATA3 (0x00800080 & FLASH_DATA_MASK)
  276. #define ERASE_DATA4 ERASE_DATA1
  277. #define ERASE_DATA5 ERASE_DATA2
  278. #define ERASE_SECTOR_DATA (0x00300030 & FLASH_DATA_MASK)
  279. #define ERASE_CHIP_DATA (0x00100010 & FLASH_DATA_MASK)
  280. #define ERASE_CONFIRM_DATA (0x00800080 & FLASH_DATA_MASK)
  281. int flash_erase (flash_info_t *info, int s_first, int s_last)
  282. {
  283. FDT *addr = (FDT *)(info->start[0]);
  284. int prot, sect, l_sect, flag;
  285. ulong start, now, last;
  286. __asm__ __volatile__ ("sync");
  287. addr[0] = 0xf0;
  288. udelay(1000);
  289. printf("\nflash_erase: first = %d @ 0x%08lx\n", s_first, info->start[s_first] );
  290. printf(" last = %d @ 0x%08lx\n", s_last , info->start[s_last ] );
  291. if ((s_first < 0) || (s_first > s_last)) {
  292. if (info->flash_id == FLASH_UNKNOWN) {
  293. printf ("- missing\n");
  294. } else {
  295. printf ("- no sectors to erase\n");
  296. }
  297. return 1;
  298. }
  299. if ((info->flash_id == FLASH_UNKNOWN) || (info->flash_id > FLASH_AMD_COMP)) {
  300. printf ("Can't erase unknown flash type %08lx - aborted\n", info->flash_id);
  301. return 1;
  302. }
  303. prot = 0;
  304. for (sect=s_first; sect<=s_last; ++sect) {
  305. if (info->protect[sect]) {
  306. prot++;
  307. }
  308. }
  309. if (prot) {
  310. printf ("- Warning: %d protected sectors will not be erased!\n",
  311. prot);
  312. } else {
  313. printf ("\n");
  314. }
  315. l_sect = -1;
  316. /* Disable interrupts which might cause a timeout here */
  317. flag = disable_interrupts();
  318. addr[ERASE_ADDR1] = ERASE_DATA1;
  319. addr[ERASE_ADDR2] = ERASE_DATA2;
  320. addr[ERASE_ADDR3] = ERASE_DATA3;
  321. addr[ERASE_ADDR4] = ERASE_DATA4;
  322. addr[ERASE_ADDR5] = ERASE_DATA5;
  323. for (sect = s_first; sect <= s_last; sect++) {
  324. if (info->protect[sect] == 0) {
  325. addr = (FDT *)(info->start[sect]);
  326. addr[0] = ERASE_SECTOR_DATA;
  327. l_sect = sect;
  328. }
  329. }
  330. if (flag)
  331. enable_interrupts();
  332. /*
  333. * We wait for the last triggered sector
  334. */
  335. if (l_sect < 0)
  336. goto DONE;
  337. start = get_timer (0);
  338. last = start;
  339. addr = (FDT *)(info->start[l_sect]);
  340. while ((addr[0] & ERASE_CONFIRM_DATA) != ERASE_CONFIRM_DATA) {
  341. if ((now = get_timer(start)) > CONFIG_SYS_FLASH_ERASE_TOUT) {
  342. printf ("Timeout\n");
  343. return 1;
  344. }
  345. /* show that we're waiting */
  346. if ((now - last) > 1000) { /* every second */
  347. putc ('.');
  348. last = now;
  349. }
  350. }
  351. DONE:
  352. printf (" done\n");
  353. return 0;
  354. }
  355. /*-----------------------------------------------------------------------
  356. * Copy memory to flash, returns:
  357. * 0 - OK
  358. * 1 - write timeout
  359. * 2 - Flash not erased
  360. */
  361. int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
  362. {
  363. #define BUFF_INC 4
  364. ulong cp, wp, data;
  365. int i, l, rc;
  366. mvdebug (("+write_buff %p ==> 0x%08lx, count = 0x%08lx\n", src, addr, cnt));
  367. wp = (addr & ~3); /* get lower word aligned address */
  368. /*
  369. * handle unaligned start bytes
  370. */
  371. if ((l = addr - wp) != 0) {
  372. mvdebug ((" handle unaligned start bytes (cnt = 0x%08lx)\n", cnt));
  373. data = 0;
  374. for (i=0, cp=wp; i<l; ++i, ++cp) {
  375. data = (data << 8) | (*(uchar *)cp);
  376. }
  377. for (; i<BUFF_INC && cnt>0; ++i) {
  378. data = (data << 8) | *src++;
  379. --cnt;
  380. ++cp;
  381. }
  382. for (; cnt==0 && i<BUFF_INC; ++i, ++cp) {
  383. data = (data << 8) | (*(uchar *)cp);
  384. }
  385. if ((rc = write_word(info, wp, data)) != 0) {
  386. return (rc);
  387. }
  388. wp += BUFF_INC;
  389. }
  390. /*
  391. * handle (half)word aligned part
  392. */
  393. mvdebug ((" handle word aligned part (cnt = 0x%08lx)\n", cnt));
  394. while (cnt >= BUFF_INC) {
  395. data = 0;
  396. for (i=0; i<BUFF_INC; ++i) {
  397. data = (data << 8) | *src++;
  398. }
  399. if ((rc = write_word(info, wp, data)) != 0) {
  400. return (rc);
  401. }
  402. wp += BUFF_INC;
  403. cnt -= BUFF_INC;
  404. }
  405. if (cnt == 0) {
  406. return (0);
  407. }
  408. /*
  409. * handle unaligned tail bytes
  410. */
  411. mvdebug ((" handle unaligned tail bytes (cnt = 0x%08lx)\n", cnt));
  412. data = 0;
  413. for (i=0, cp=wp; i<BUFF_INC && cnt>0; ++i, ++cp) {
  414. data = (data << 8) | *src++;
  415. --cnt;
  416. }
  417. for (; i<BUFF_INC; ++i, ++cp) {
  418. data = (data << 8) | (*(uchar *)cp);
  419. }
  420. return (write_word(info, wp, data));
  421. }
  422. #if (FLASH_BUS_WIDTH >= 16)
  423. #define WRITE_ADDR1 0x0555
  424. #define WRITE_ADDR2 0x02AA
  425. #else
  426. #define WRITE_ADDR1 0x0AAA
  427. #define WRITE_ADDR2 0x0555
  428. #define WRITE_ADDR3 WRITE_ADDR1
  429. #endif
  430. #define WRITE_DATA1 (0x00AA00AA & FLASH_DATA_MASK)
  431. #define WRITE_DATA2 (0x00550055 & FLASH_DATA_MASK)
  432. #define WRITE_DATA3 (0x00A000A0 & FLASH_DATA_MASK)
  433. #define WRITE_CONFIRM_DATA ERASE_CONFIRM_DATA
  434. /*-----------------------------------------------------------------------
  435. * Write a byte to Flash, returns:
  436. * 0 - OK
  437. * 1 - write timeout
  438. * 2 - Flash not erased
  439. */
  440. static int write_char (flash_info_t *info, ulong dest, uchar data)
  441. {
  442. vu_char *addr = (vu_char *)(info->start[0]);
  443. ulong start;
  444. int flag;
  445. /* Check if Flash is (sufficiently) erased */
  446. if ((*((vu_char *)dest) & data) != data) {
  447. printf(" *** ERROR: Flash not erased !\n");
  448. return (2);
  449. }
  450. flag = disable_interrupts();
  451. addr[WRITE_ADDR1] = WRITE_DATA1;
  452. addr[WRITE_ADDR2] = WRITE_DATA2;
  453. addr[WRITE_ADDR3] = WRITE_DATA3;
  454. *((vu_char *)dest) = data;
  455. if (flag)
  456. enable_interrupts();
  457. /* data polling for D7 */
  458. start = get_timer (0);
  459. addr = (vu_char *)dest;
  460. while (( (*addr) & WRITE_CONFIRM_DATA) != (data & WRITE_CONFIRM_DATA)) {
  461. if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
  462. printf(" *** ERROR: Flash write timeout !");
  463. return (1);
  464. }
  465. }
  466. mvdebug (("-write_byte\n"));
  467. return (0);
  468. }
  469. /*-----------------------------------------------------------------------
  470. * Write a word to Flash, returns:
  471. * 0 - OK
  472. * 1 - write timeout
  473. * 2 - Flash not erased
  474. */
  475. static int write_word (flash_info_t *info, ulong dest, ulong data)
  476. {
  477. int i,
  478. result = 0;
  479. mvdebug (("+write_word : 0x%08lx @ 0x%08lx\n", data, dest));
  480. for ( i=0; (i < 4) && (result == 0); i++, dest+=1 )
  481. result = write_char (info, dest, (data >> (8*(3-i))) & 0xff );
  482. mvdebug (("-write_word\n"));
  483. return result;
  484. }
  485. /*---------------------------------------------------------------- */