flash.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108
  1. /*
  2. * (C) Copyright 2004-2005
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * (C) Copyright 2002 Jun Gu <jung@artesyncp.com>
  6. * Add support for Am29F016D and dynamic switch setting.
  7. *
  8. * See file CREDITS for list of people who contributed to this
  9. * project.
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License as
  13. * published by the Free Software Foundation; either version 2 of
  14. * the License, or (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  24. * MA 02111-1307 USA
  25. */
  26. /*
  27. * Modified 4/5/2001
  28. * Wait for completion of each sector erase command issued
  29. * 4/5/2001
  30. * Chris Hallinan - DS4.COM, Inc. - clh@net1plus.com
  31. */
  32. #include <common.h>
  33. #include <ppc4xx.h>
  34. #include <asm/processor.h>
  35. #ifdef DEBUG
  36. #define DEBUGF(x...) printf(x)
  37. #else
  38. #define DEBUGF(x...)
  39. #endif /* DEBUG */
  40. flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
  41. /*
  42. * Mark big flash bank (16 bit instead of 8 bit access) in address with bit 0
  43. */
  44. static unsigned long flash_addr_table[][CFG_MAX_FLASH_BANKS] = {
  45. {0xffc00001}, /* 0:boot from big flash */
  46. };
  47. /*
  48. * include common flash code (for amcc boards)
  49. */
  50. /*-----------------------------------------------------------------------
  51. * Functions
  52. */
  53. static int write_word(flash_info_t * info, ulong dest, ulong data);
  54. #ifdef CFG_FLASH_2ND_16BIT_DEV
  55. static int write_word_1(flash_info_t * info, ulong dest, ulong data);
  56. static int write_word_2(flash_info_t * info, ulong dest, ulong data);
  57. static int flash_erase_1(flash_info_t * info, int s_first, int s_last);
  58. static int flash_erase_2(flash_info_t * info, int s_first, int s_last);
  59. static ulong flash_get_size_1(vu_long * addr, flash_info_t * info);
  60. static ulong flash_get_size_2(vu_long * addr, flash_info_t * info);
  61. #endif
  62. void flash_print_info(flash_info_t * info)
  63. {
  64. int i;
  65. int k;
  66. int size;
  67. int erased;
  68. volatile unsigned long *flash;
  69. if (info->flash_id == FLASH_UNKNOWN) {
  70. printf("missing or unknown FLASH type\n");
  71. return;
  72. }
  73. switch (info->flash_id & FLASH_VENDMASK) {
  74. case FLASH_MAN_AMD:
  75. printf("AMD ");
  76. break;
  77. case FLASH_MAN_STM:
  78. printf("STM ");
  79. break;
  80. case FLASH_MAN_FUJ:
  81. printf("FUJITSU ");
  82. break;
  83. case FLASH_MAN_SST:
  84. printf("SST ");
  85. break;
  86. case FLASH_MAN_MX:
  87. printf("MIXC ");
  88. break;
  89. default:
  90. printf("Unknown Vendor ");
  91. break;
  92. }
  93. switch (info->flash_id & FLASH_TYPEMASK) {
  94. case FLASH_AM040:
  95. printf("AM29F040 (512 Kbit, uniform sector size)\n");
  96. break;
  97. case FLASH_AM400B:
  98. printf("AM29LV400B (4 Mbit, bottom boot sect)\n");
  99. break;
  100. case FLASH_AM400T:
  101. printf("AM29LV400T (4 Mbit, top boot sector)\n");
  102. break;
  103. case FLASH_AM800B:
  104. printf("AM29LV800B (8 Mbit, bottom boot sect)\n");
  105. break;
  106. case FLASH_AM800T:
  107. printf("AM29LV800T (8 Mbit, top boot sector)\n");
  108. break;
  109. case FLASH_AMD016:
  110. printf("AM29F016D (16 Mbit, uniform sector size)\n");
  111. break;
  112. case FLASH_AM160B:
  113. printf("AM29LV160B (16 Mbit, bottom boot sect)\n");
  114. break;
  115. case FLASH_AM160T:
  116. printf("AM29LV160T (16 Mbit, top boot sector)\n");
  117. break;
  118. case FLASH_AM320B:
  119. printf("AM29LV320B (32 Mbit, bottom boot sect)\n");
  120. break;
  121. case FLASH_AM320T:
  122. printf("AM29LV320T (32 Mbit, top boot sector)\n");
  123. break;
  124. case FLASH_AM033C:
  125. printf("AM29LV033C (32 Mbit, top boot sector)\n");
  126. break;
  127. case FLASH_SST800A:
  128. printf("SST39LF/VF800 (8 Mbit, uniform sector size)\n");
  129. break;
  130. case FLASH_SST160A:
  131. printf("SST39LF/VF160 (16 Mbit, uniform sector size)\n");
  132. break;
  133. case FLASH_STMW320DT:
  134. printf ("M29W320DT (32 M, top sector)\n");
  135. break;
  136. case FLASH_MXLV320T:
  137. printf ("MXLV320T (32 Mbit, top sector)\n");
  138. break;
  139. default:
  140. printf("Unknown Chip Type\n");
  141. break;
  142. }
  143. printf(" Size: %ld KB in %d Sectors\n",
  144. info->size >> 10, info->sector_count);
  145. printf(" Sector Start Addresses:");
  146. for (i = 0; i < info->sector_count; ++i) {
  147. /*
  148. * Check if whole sector is erased
  149. */
  150. if (i != (info->sector_count - 1))
  151. size = info->start[i + 1] - info->start[i];
  152. else
  153. size = info->start[0] + info->size - info->start[i];
  154. erased = 1;
  155. flash = (volatile unsigned long *)info->start[i];
  156. size = size >> 2; /* divide by 4 for longword access */
  157. for (k = 0; k < size; k++) {
  158. if (*flash++ != 0xffffffff) {
  159. erased = 0;
  160. break;
  161. }
  162. }
  163. if ((i % 5) == 0)
  164. printf("\n ");
  165. printf(" %08lX%s%s",
  166. info->start[i],
  167. erased ? " E" : " ", info->protect[i] ? "RO " : " ");
  168. }
  169. printf("\n");
  170. return;
  171. }
  172. /*
  173. * The following code cannot be run from FLASH!
  174. */
  175. #ifdef CFG_FLASH_2ND_16BIT_DEV
  176. static ulong flash_get_size(vu_long * addr, flash_info_t * info)
  177. {
  178. /* bit 0 used for big flash marking */
  179. if ((ulong)addr & 0x1) {
  180. return flash_get_size_2((vu_long *)((ulong)addr & 0xfffffffe), info);
  181. } else {
  182. return flash_get_size_1(addr, info);
  183. }
  184. }
  185. static ulong flash_get_size_1(vu_long * addr, flash_info_t * info)
  186. #else
  187. static ulong flash_get_size(vu_long * addr, flash_info_t * info)
  188. #endif
  189. {
  190. short i;
  191. CFG_FLASH_WORD_SIZE value;
  192. ulong base = (ulong) addr;
  193. volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *) addr;
  194. DEBUGF("FLASH ADDR: %08x\n", (unsigned)addr);
  195. /* Write auto select command: read Manufacturer ID */
  196. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  197. addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  198. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00900090;
  199. udelay(1000);
  200. value = addr2[0];
  201. DEBUGF("FLASH MANUFACT: %x\n", value);
  202. switch (value) {
  203. case (CFG_FLASH_WORD_SIZE) AMD_MANUFACT:
  204. info->flash_id = FLASH_MAN_AMD;
  205. break;
  206. case (CFG_FLASH_WORD_SIZE) FUJ_MANUFACT:
  207. info->flash_id = FLASH_MAN_FUJ;
  208. break;
  209. case (CFG_FLASH_WORD_SIZE) SST_MANUFACT:
  210. info->flash_id = FLASH_MAN_SST;
  211. break;
  212. case (CFG_FLASH_WORD_SIZE) STM_MANUFACT:
  213. info->flash_id = FLASH_MAN_STM;
  214. break;
  215. default:
  216. info->flash_id = FLASH_UNKNOWN;
  217. info->sector_count = 0;
  218. info->size = 0;
  219. return (0); /* no or unknown flash */
  220. }
  221. value = addr2[1]; /* device ID */
  222. DEBUGF("\nFLASH DEVICEID: %x\n", value);
  223. switch (value) {
  224. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV040B:
  225. info->flash_id += FLASH_AM040;
  226. info->sector_count = 8;
  227. info->size = 0x0080000; /* => 512 ko */
  228. break;
  229. case (CFG_FLASH_WORD_SIZE) AMD_ID_F040B:
  230. info->flash_id += FLASH_AM040;
  231. info->sector_count = 8;
  232. info->size = 0x0080000; /* => 512 ko */
  233. break;
  234. case (CFG_FLASH_WORD_SIZE) STM_ID_M29W040B:
  235. info->flash_id += FLASH_AM040;
  236. info->sector_count = 8;
  237. info->size = 0x0080000; /* => 512 ko */
  238. break;
  239. case (CFG_FLASH_WORD_SIZE) AMD_ID_F016D:
  240. info->flash_id += FLASH_AMD016;
  241. info->sector_count = 32;
  242. info->size = 0x00200000;
  243. break; /* => 2 MB */
  244. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV033C:
  245. info->flash_id += FLASH_AMDLV033C;
  246. info->sector_count = 64;
  247. info->size = 0x00400000;
  248. break; /* => 4 MB */
  249. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV400T:
  250. info->flash_id += FLASH_AM400T;
  251. info->sector_count = 11;
  252. info->size = 0x00080000;
  253. break; /* => 0.5 MB */
  254. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV400B:
  255. info->flash_id += FLASH_AM400B;
  256. info->sector_count = 11;
  257. info->size = 0x00080000;
  258. break; /* => 0.5 MB */
  259. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV800T:
  260. info->flash_id += FLASH_AM800T;
  261. info->sector_count = 19;
  262. info->size = 0x00100000;
  263. break; /* => 1 MB */
  264. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV800B:
  265. info->flash_id += FLASH_AM800B;
  266. info->sector_count = 19;
  267. info->size = 0x00100000;
  268. break; /* => 1 MB */
  269. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV160T:
  270. info->flash_id += FLASH_AM160T;
  271. info->sector_count = 35;
  272. info->size = 0x00200000;
  273. break; /* => 2 MB */
  274. case (CFG_FLASH_WORD_SIZE) AMD_ID_LV160B:
  275. info->flash_id += FLASH_AM160B;
  276. info->sector_count = 35;
  277. info->size = 0x00200000;
  278. break; /* => 2 MB */
  279. default:
  280. info->flash_id = FLASH_UNKNOWN;
  281. return (0); /* => no or unknown flash */
  282. }
  283. /* set up sector start address table */
  284. if (((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) ||
  285. ((info->flash_id & FLASH_TYPEMASK) == FLASH_AM040) ||
  286. ((info->flash_id & FLASH_TYPEMASK) == FLASH_AMD016)) {
  287. for (i = 0; i < info->sector_count; i++)
  288. info->start[i] = base + (i * 0x00010000);
  289. } else {
  290. if (info->flash_id & FLASH_BTYPE) {
  291. /* set sector offsets for bottom boot block type */
  292. info->start[0] = base + 0x00000000;
  293. info->start[1] = base + 0x00004000;
  294. info->start[2] = base + 0x00006000;
  295. info->start[3] = base + 0x00008000;
  296. for (i = 4; i < info->sector_count; i++) {
  297. info->start[i] =
  298. base + (i * 0x00010000) - 0x00030000;
  299. }
  300. } else {
  301. /* set sector offsets for top boot block type */
  302. i = info->sector_count - 1;
  303. info->start[i--] = base + info->size - 0x00004000;
  304. info->start[i--] = base + info->size - 0x00006000;
  305. info->start[i--] = base + info->size - 0x00008000;
  306. for (; i >= 0; i--) {
  307. info->start[i] = base + i * 0x00010000;
  308. }
  309. }
  310. }
  311. /* check for protected sectors */
  312. for (i = 0; i < info->sector_count; i++) {
  313. /* read sector protection at sector address, (A7 .. A0) = 0x02 */
  314. /* D0 = 1 if protected */
  315. addr2 = (volatile CFG_FLASH_WORD_SIZE *)(info->start[i]);
  316. /* For AMD29033C flash we need to resend the command of *
  317. * reading flash protection for upper 8 Mb of flash */
  318. if (i == 32) {
  319. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0xAAAAAAAA;
  320. addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x55555555;
  321. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x90909090;
  322. }
  323. if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST)
  324. info->protect[i] = 0;
  325. else
  326. info->protect[i] = addr2[2] & 1;
  327. }
  328. /* issue bank reset to return to read mode */
  329. addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00F000F0;
  330. return (info->size);
  331. }
  332. static int wait_for_DQ7_1(flash_info_t * info, int sect)
  333. {
  334. ulong start, now, last;
  335. volatile CFG_FLASH_WORD_SIZE *addr =
  336. (CFG_FLASH_WORD_SIZE *) (info->start[sect]);
  337. start = get_timer(0);
  338. last = start;
  339. while ((addr[0] & (CFG_FLASH_WORD_SIZE) 0x00800080) !=
  340. (CFG_FLASH_WORD_SIZE) 0x00800080) {
  341. if ((now = get_timer(start)) > CFG_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. return 0;
  352. }
  353. #ifdef CFG_FLASH_2ND_16BIT_DEV
  354. int flash_erase(flash_info_t * info, int s_first, int s_last)
  355. {
  356. if (((info->flash_id & FLASH_TYPEMASK) == FLASH_AM320B) ||
  357. ((info->flash_id & FLASH_TYPEMASK) == FLASH_AM320T) ||
  358. ((info->flash_id & FLASH_TYPEMASK) == FLASH_STMW320DT) ||
  359. ((info->flash_id & FLASH_TYPEMASK) == FLASH_MXLV320T)) {
  360. return flash_erase_2(info, s_first, s_last);
  361. } else {
  362. return flash_erase_1(info, s_first, s_last);
  363. }
  364. }
  365. static int flash_erase_1(flash_info_t * info, int s_first, int s_last)
  366. #else
  367. int flash_erase(flash_info_t * info, int s_first, int s_last)
  368. #endif
  369. {
  370. volatile CFG_FLASH_WORD_SIZE *addr = (CFG_FLASH_WORD_SIZE *) (info->start[0]);
  371. volatile CFG_FLASH_WORD_SIZE *addr2;
  372. int flag, prot, sect, l_sect;
  373. int i;
  374. if ((s_first < 0) || (s_first > s_last)) {
  375. if (info->flash_id == FLASH_UNKNOWN) {
  376. printf("- missing\n");
  377. } else {
  378. printf("- no sectors to erase\n");
  379. }
  380. return 1;
  381. }
  382. if (info->flash_id == FLASH_UNKNOWN) {
  383. printf("Can't erase unknown flash type - aborted\n");
  384. return 1;
  385. }
  386. prot = 0;
  387. for (sect = s_first; sect <= s_last; ++sect) {
  388. if (info->protect[sect]) {
  389. prot++;
  390. }
  391. }
  392. if (prot) {
  393. printf("- Warning: %d protected sectors will not be erased!\n",
  394. prot);
  395. } else {
  396. printf("\n");
  397. }
  398. l_sect = -1;
  399. /* Disable interrupts which might cause a timeout here */
  400. flag = disable_interrupts();
  401. /* Start erase on unprotected sectors */
  402. for (sect = s_first; sect <= s_last; sect++) {
  403. if (info->protect[sect] == 0) { /* not protected */
  404. addr2 = (CFG_FLASH_WORD_SIZE *) (info->start[sect]);
  405. if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) {
  406. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  407. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  408. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00800080;
  409. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  410. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  411. addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00500050; /* block erase */
  412. for (i = 0; i < 50; i++)
  413. udelay(1000); /* wait 1 ms */
  414. } else {
  415. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  416. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  417. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00800080;
  418. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  419. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  420. addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00300030; /* sector erase */
  421. }
  422. l_sect = sect;
  423. /*
  424. * Wait for each sector to complete, it's more
  425. * reliable. According to AMD Spec, you must
  426. * issue all erase commands within a specified
  427. * timeout. This has been seen to fail, especially
  428. * if printf()s are included (for debug)!!
  429. */
  430. wait_for_DQ7_1(info, sect);
  431. }
  432. }
  433. /* re-enable interrupts if necessary */
  434. if (flag)
  435. enable_interrupts();
  436. /* wait at least 80us - let's wait 1 ms */
  437. udelay(1000);
  438. /* reset to read mode */
  439. addr = (CFG_FLASH_WORD_SIZE *) info->start[0];
  440. addr[0] = (CFG_FLASH_WORD_SIZE) 0x00F000F0; /* reset bank */
  441. printf(" done\n");
  442. return 0;
  443. }
  444. /*-----------------------------------------------------------------------
  445. * Copy memory to flash, returns:
  446. * 0 - OK
  447. * 1 - write timeout
  448. * 2 - Flash not erased
  449. */
  450. int write_buff(flash_info_t * info, uchar * src, ulong addr, ulong cnt)
  451. {
  452. ulong cp, wp, data;
  453. int i, l, rc;
  454. wp = (addr & ~3); /* get lower word aligned address */
  455. /*
  456. * handle unaligned start bytes
  457. */
  458. if ((l = addr - wp) != 0) {
  459. data = 0;
  460. for (i = 0, cp = wp; i < l; ++i, ++cp) {
  461. data = (data << 8) | (*(uchar *) cp);
  462. }
  463. for (; i < 4 && cnt > 0; ++i) {
  464. data = (data << 8) | *src++;
  465. --cnt;
  466. ++cp;
  467. }
  468. for (; cnt == 0 && i < 4; ++i, ++cp) {
  469. data = (data << 8) | (*(uchar *) cp);
  470. }
  471. if ((rc = write_word(info, wp, data)) != 0) {
  472. return (rc);
  473. }
  474. wp += 4;
  475. }
  476. /*
  477. * handle word aligned part
  478. */
  479. while (cnt >= 4) {
  480. data = 0;
  481. for (i = 0; i < 4; ++i) {
  482. data = (data << 8) | *src++;
  483. }
  484. if ((rc = write_word(info, wp, data)) != 0) {
  485. return (rc);
  486. }
  487. wp += 4;
  488. cnt -= 4;
  489. }
  490. if (cnt == 0) {
  491. return (0);
  492. }
  493. /*
  494. * handle unaligned tail bytes
  495. */
  496. data = 0;
  497. for (i = 0, cp = wp; i < 4 && cnt > 0; ++i, ++cp) {
  498. data = (data << 8) | *src++;
  499. --cnt;
  500. }
  501. for (; i < 4; ++i, ++cp) {
  502. data = (data << 8) | (*(uchar *) cp);
  503. }
  504. return (write_word(info, wp, data));
  505. }
  506. /*-----------------------------------------------------------------------
  507. * Copy memory to flash, returns:
  508. * 0 - OK
  509. * 1 - write timeout
  510. * 2 - Flash not erased
  511. */
  512. #ifdef CFG_FLASH_2ND_16BIT_DEV
  513. static int write_word(flash_info_t * info, ulong dest, ulong data)
  514. {
  515. if (((info->flash_id & FLASH_TYPEMASK) == FLASH_AM320B) ||
  516. ((info->flash_id & FLASH_TYPEMASK) == FLASH_AM320T) ||
  517. ((info->flash_id & FLASH_TYPEMASK) == FLASH_STMW320DT) ||
  518. ((info->flash_id & FLASH_TYPEMASK) == FLASH_MXLV320T)) {
  519. return write_word_2(info, dest, data);
  520. } else {
  521. return write_word_1(info, dest, data);
  522. }
  523. }
  524. static int write_word_1(flash_info_t * info, ulong dest, ulong data)
  525. #else
  526. static int write_word(flash_info_t * info, ulong dest, ulong data)
  527. #endif
  528. {
  529. volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *) (info->start[0]);
  530. volatile CFG_FLASH_WORD_SIZE *dest2 = (CFG_FLASH_WORD_SIZE *) dest;
  531. volatile CFG_FLASH_WORD_SIZE *data2 = (CFG_FLASH_WORD_SIZE *) & data;
  532. ulong start;
  533. int i;
  534. /* Check if Flash is (sufficiently) erased */
  535. if ((*((vu_long *)dest) & data) != data) {
  536. return (2);
  537. }
  538. for (i = 0; i < 4 / sizeof(CFG_FLASH_WORD_SIZE); i++) {
  539. int flag;
  540. /* Disable interrupts which might cause a timeout here */
  541. flag = disable_interrupts();
  542. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  543. addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  544. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00A000A0;
  545. dest2[i] = data2[i];
  546. /* re-enable interrupts if necessary */
  547. if (flag)
  548. enable_interrupts();
  549. /* data polling for D7 */
  550. start = get_timer(0);
  551. while ((dest2[i] & (CFG_FLASH_WORD_SIZE) 0x00800080) !=
  552. (data2[i] & (CFG_FLASH_WORD_SIZE) 0x00800080)) {
  553. if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
  554. return (1);
  555. }
  556. }
  557. }
  558. return (0);
  559. }
  560. #ifdef CFG_FLASH_2ND_16BIT_DEV
  561. #undef CFG_FLASH_WORD_SIZE
  562. #define CFG_FLASH_WORD_SIZE unsigned short
  563. /*
  564. * The following code cannot be run from FLASH!
  565. */
  566. static ulong flash_get_size_2(vu_long * addr, flash_info_t * info)
  567. {
  568. short i;
  569. int n;
  570. CFG_FLASH_WORD_SIZE value;
  571. ulong base = (ulong) addr;
  572. volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *) addr;
  573. DEBUGF("FLASH ADDR: %08x\n", (unsigned)addr);
  574. /* issue bank reset to return to read mode */
  575. addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00F000F0;
  576. /* Write auto select command: read Manufacturer ID */
  577. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  578. addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  579. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00900090;
  580. udelay(1000);
  581. value = addr2[0];
  582. DEBUGF("FLASH MANUFACT: %x\n", value);
  583. #if 0 /* TODO: remove ifdef when Flash responds correctly */
  584. switch (value) {
  585. case (CFG_FLASH_WORD_SIZE) AMD_MANUFACT:
  586. info->flash_id = FLASH_MAN_AMD;
  587. break;
  588. case (CFG_FLASH_WORD_SIZE) FUJ_MANUFACT:
  589. info->flash_id = FLASH_MAN_FUJ;
  590. break;
  591. case (CFG_FLASH_WORD_SIZE) SST_MANUFACT:
  592. info->flash_id = FLASH_MAN_SST;
  593. break;
  594. case (CFG_FLASH_WORD_SIZE) STM_MANUFACT:
  595. info->flash_id = FLASH_MAN_STM;
  596. break;
  597. case (CFG_FLASH_WORD_SIZE) MX_MANUFACT:
  598. info->flash_id = FLASH_MAN_MX;
  599. break;
  600. default:
  601. info->flash_id = FLASH_UNKNOWN;
  602. info->sector_count = 0;
  603. info->size = 0;
  604. return (0); /* no or unknown flash */
  605. }
  606. #endif /* TODO: remove ifdef when Flash responds correctly */
  607. /*
  608. * TODO: Start
  609. * uncomment block above when Flash responds correctly.
  610. * also remove the lines below:
  611. */
  612. info->flash_id = FLASH_MAN_AMD;
  613. DEBUGF("FLASH MANUFACT: FLASH_MAN_AMD\n");
  614. /* TODO: End */
  615. value = addr2[1]; /* device ID */
  616. DEBUGF("\nFLASH DEVICEID: %x\n", value);
  617. #if 0 /* TODO: remove ifdef when Flash responds correctly */
  618. switch (value) {
  619. case (CFG_FLASH_WORD_SIZE)AMD_ID_LV320T:
  620. info->flash_id += FLASH_AM320T;
  621. info->sector_count = 71;
  622. info->size = 0x00400000; break; /* => 4 MB */
  623. case (CFG_FLASH_WORD_SIZE)AMD_ID_LV320B:
  624. info->flash_id += FLASH_AM320B;
  625. info->sector_count = 71;
  626. info->size = 0x00400000; break; /* => 4 MB */
  627. case (CFG_FLASH_WORD_SIZE)STM_ID_29W320DT:
  628. info->flash_id += FLASH_STMW320DT;
  629. info->sector_count = 67;
  630. info->size = 0x00400000; break; /* => 4 MB */
  631. case (CFG_FLASH_WORD_SIZE)MX_ID_LV320T:
  632. info->flash_id += FLASH_MXLV320T;
  633. info->sector_count = 71;
  634. info->size = 0x00400000; break; /* => 4 MB */
  635. default:
  636. info->flash_id = FLASH_UNKNOWN;
  637. return (0); /* => no or unknown flash */
  638. }
  639. #endif /* TODO: remove ifdef when Flash responds correctly */
  640. /*
  641. * TODO: Start
  642. * uncomment block above when Flash responds correctly.
  643. * also remove the lines below:
  644. */
  645. DEBUGF("\nFLASH DEVICEID: FLASH_AM320T\n");
  646. info->flash_id += FLASH_AM320T;
  647. info->sector_count = 71;
  648. info->size = 0x00400000; /* => 4 MB */
  649. /* TODO: End */
  650. /* set up sector start address table */
  651. if (((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) ||
  652. ((info->flash_id & FLASH_TYPEMASK) == FLASH_AM040) ||
  653. ((info->flash_id & FLASH_TYPEMASK) == FLASH_AMD016)) {
  654. for (i = 0; i < info->sector_count; i++)
  655. info->start[i] = base + (i * 0x00010000);
  656. } else if ((info->flash_id & FLASH_TYPEMASK) == FLASH_STMW320DT) {
  657. /* set sector offsets for top boot block type */
  658. base += info->size;
  659. i = info->sector_count;
  660. /* 1 x 16k boot sector */
  661. base -= 16 << 10;
  662. --i;
  663. info->start[i] = base;
  664. /* 2 x 8k boot sectors */
  665. for (n=0; n<2; ++n) {
  666. base -= 8 << 10;
  667. --i;
  668. info->start[i] = base;
  669. }
  670. /* 1 x 32k boot sector */
  671. base -= 32 << 10;
  672. --i;
  673. info->start[i] = base;
  674. while (i > 0) { /* 64k regular sectors */
  675. base -= 64 << 10;
  676. --i;
  677. info->start[i] = base;
  678. }
  679. } else if ( ((info->flash_id & FLASH_TYPEMASK) == FLASH_MXLV320T) ||
  680. ((info->flash_id & FLASH_TYPEMASK) == FLASH_AM320T) ) {
  681. i = info->sector_count - 1;
  682. info->start[i--] = base + info->size - 0x00002000;
  683. info->start[i--] = base + info->size - 0x00004000;
  684. info->start[i--] = base + info->size - 0x00006000;
  685. info->start[i--] = base + info->size - 0x00008000;
  686. info->start[i--] = base + info->size - 0x0000a000;
  687. info->start[i--] = base + info->size - 0x0000c000;
  688. info->start[i--] = base + info->size - 0x0000e000;
  689. info->start[i--] = base + info->size - 0x00010000;
  690. for (; i >= 0; i--) {
  691. info->start[i] = base + i * 0x00010000;
  692. }
  693. }
  694. else {
  695. if (info->flash_id & FLASH_BTYPE){
  696. /* set sector offsets for bottom boot block type */
  697. info->start[0] = base + 0x00000000;
  698. info->start[1] = base + 0x00004000;
  699. info->start[2] = base + 0x00006000;
  700. info->start[3] = base + 0x00008000;
  701. for (i = 4; i < info->sector_count; i++) {
  702. info->start[i] =
  703. base + (i * 0x00010000) - 0x00030000;
  704. }
  705. } else {
  706. /* set sector offsets for top boot block type */
  707. i = info->sector_count - 1;
  708. info->start[i--] = base + info->size - 0x00004000;
  709. info->start[i--] = base + info->size - 0x00006000;
  710. info->start[i--] = base + info->size - 0x00008000;
  711. for (; i >= 0; i--) {
  712. info->start[i] = base + i * 0x00010000;
  713. }
  714. }
  715. }
  716. /* check for protected sectors */
  717. for (i = 0; i < info->sector_count; i++) {
  718. /* read sector protection at sector address,(A7 .. A0) = 0x02 */
  719. /* D0 = 1 if protected */
  720. addr2 = (volatile CFG_FLASH_WORD_SIZE *)(info->start[i]);
  721. /* For AMD29033C flash we need to resend the command of *
  722. * reading flash protection for upper 8 Mb of flash */
  723. if (i == 32) {
  724. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0xAAAAAAAA;
  725. addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x55555555;
  726. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x90909090;
  727. }
  728. if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST)
  729. info->protect[i] = 0;
  730. else
  731. info->protect[i] = addr2[2] & 1;
  732. }
  733. /* issue bank reset to return to read mode */
  734. addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00F000F0;
  735. return (info->size);
  736. }
  737. /*
  738. * TODO: FIX: this wait loop sometimes fails: DQ7 indicates the erase command
  739. * never was accepted (i.e. didn't start) - why????
  740. */
  741. static int wait_for_DQ7_2(flash_info_t * info, int sect)
  742. {
  743. ulong start, now, last, counter = 0;
  744. volatile CFG_FLASH_WORD_SIZE *addr =
  745. (CFG_FLASH_WORD_SIZE *) (info->start[sect]);
  746. start = get_timer(0);
  747. DEBUGF("DQ7_2: start = 0x%08lx\n", start);
  748. last = start;
  749. while ((addr[0] & (CFG_FLASH_WORD_SIZE) 0x00800080) !=
  750. (CFG_FLASH_WORD_SIZE) 0x00800080) {
  751. DEBUGF("DQ7_2: start = 0x%08lx, now = 0x%08lx\n", start, now);
  752. if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
  753. printf("Timeout\n");
  754. return -1;
  755. }
  756. /* show that we're waiting */
  757. if ((now - last) > 1000) { /* every second */
  758. putc('.');
  759. last = now;
  760. }
  761. udelay(1000000); /* 1 sec */
  762. putc('.');
  763. counter++;
  764. if (counter > 5) {
  765. return -1;
  766. }
  767. DEBUGF("DQ7_2: now = 0x%08lx, last = 0x%08lx\n", now, last);
  768. }
  769. return 0;
  770. }
  771. static void wr_flash_cmd(ulong sector, ushort addr, CFG_FLASH_WORD_SIZE value)
  772. {
  773. int fw_size;
  774. fw_size = sizeof(value);
  775. switch (fw_size)
  776. {
  777. case 1:
  778. out8((ulong)(sector + addr), value);
  779. break;
  780. case 2:
  781. out16((ulong)(sector + (addr << 1)), value);
  782. break;
  783. default:
  784. printf("flash_erase: error incorrect chip programing size.\n");
  785. }
  786. return;
  787. }
  788. static int flash_erase_2(flash_info_t * info, int s_first, int s_last)
  789. {
  790. volatile CFG_FLASH_WORD_SIZE *addr = (CFG_FLASH_WORD_SIZE *) (info->start[0]);
  791. volatile CFG_FLASH_WORD_SIZE *addr2;
  792. int flag, prot, sect, l_sect, count = 0;
  793. int i;
  794. if ((s_first < 0) || (s_first > s_last)) {
  795. if (info->flash_id == FLASH_UNKNOWN) {
  796. printf("- missing\n");
  797. } else {
  798. printf("- no sectors to erase\n");
  799. }
  800. return 1;
  801. }
  802. if (info->flash_id == FLASH_UNKNOWN) {
  803. printf("Can't erase unknown flash type - aborted\n");
  804. return 1;
  805. }
  806. prot = 0;
  807. for (sect = s_first; sect <= s_last; ++sect) {
  808. if (info->protect[sect]) {
  809. prot++;
  810. }
  811. }
  812. if (prot) {
  813. printf("- Warning: %d protected sectors will not be erased!\n",
  814. prot);
  815. } else {
  816. printf("\n");
  817. }
  818. l_sect = -1;
  819. /* Disable interrupts which might cause a timeout here */
  820. flag = disable_interrupts();
  821. /* Start erase on unprotected sectors */
  822. for (sect = s_first, count = 0; sect <= s_last; sect++) {
  823. if (info->protect[sect] == 0) { /* not protected */
  824. addr2 = (CFG_FLASH_WORD_SIZE *) (info->start[sect]);
  825. if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) {
  826. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  827. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  828. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00800080;
  829. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  830. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  831. addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00500050; /* block erase */
  832. for (i = 0; i < 50; i++)
  833. udelay(1000); /* wait 1 ms */
  834. } else {
  835. /*
  836. * TODO: fix code
  837. */
  838. wr_flash_cmd((ulong)addr, 0, (CFG_FLASH_WORD_SIZE) 0x00F000F0);
  839. wr_flash_cmd((ulong)addr, CFG_FLASH_ADDR0, (CFG_FLASH_WORD_SIZE) 0x00AA00AA);
  840. wr_flash_cmd((ulong)addr, CFG_FLASH_ADDR1, (CFG_FLASH_WORD_SIZE) 0x00550055);
  841. wr_flash_cmd((ulong)addr, CFG_FLASH_ADDR0, (CFG_FLASH_WORD_SIZE) 0x00800080);
  842. wr_flash_cmd((ulong)addr, CFG_FLASH_ADDR0, (CFG_FLASH_WORD_SIZE) 0x00AA00AA);
  843. wr_flash_cmd((ulong)addr, CFG_FLASH_ADDR1, (CFG_FLASH_WORD_SIZE) 0x00550055);
  844. wr_flash_cmd((ulong)addr2, 0, (CFG_FLASH_WORD_SIZE) 0x00300030);
  845. udelay(2000000); /* 2 sec */
  846. wr_flash_cmd((ulong)addr, 0, (CFG_FLASH_WORD_SIZE) 0x00F000F0);
  847. #if 0
  848. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  849. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  850. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00800080;
  851. addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  852. addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  853. addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00300030; /* sector erase */
  854. #endif
  855. }
  856. l_sect = sect;
  857. printf("..");
  858. printf("..");
  859. /*
  860. * Wait for each sector to complete, it's more
  861. * reliable. According to AMD Spec, you must
  862. * issue all erase commands within a specified
  863. * timeout. This has been seen to fail, especially
  864. * if printf()s are included (for debug)!!
  865. */
  866. wait_for_DQ7_2(info, sect);
  867. count++;
  868. }
  869. }
  870. /* re-enable interrupts if necessary */
  871. if (flag)
  872. enable_interrupts();
  873. /* wait at least 80us - let's wait 1 ms */
  874. udelay(1000);
  875. /* reset to read mode */
  876. addr = (CFG_FLASH_WORD_SIZE *) info->start[0];
  877. addr[0] = (CFG_FLASH_WORD_SIZE) 0x00F000F0; /* reset bank */
  878. printf(" done\n");
  879. if (count > 0) {
  880. return 0;
  881. } else {
  882. return 1;
  883. }
  884. }
  885. static int write_word_2(flash_info_t * info, ulong dest, ulong data)
  886. {
  887. volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *) (info->start[0]);
  888. volatile CFG_FLASH_WORD_SIZE *dest2 = (CFG_FLASH_WORD_SIZE *) dest;
  889. volatile CFG_FLASH_WORD_SIZE *data2 = (CFG_FLASH_WORD_SIZE *) & data;
  890. ulong start;
  891. int i;
  892. /* Check if Flash is (sufficiently) erased */
  893. if ((*((vu_long *)dest) & data) != data) {
  894. return (2);
  895. }
  896. for (i = 0; i < 4 / sizeof(CFG_FLASH_WORD_SIZE); i++) {
  897. int flag;
  898. /* Disable interrupts which might cause a timeout here */
  899. flag = disable_interrupts();
  900. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
  901. addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
  902. addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00A000A0;
  903. dest2[i] = data2[i];
  904. /* re-enable interrupts if necessary */
  905. if (flag)
  906. enable_interrupts();
  907. /* data polling for D7 */
  908. start = get_timer(0);
  909. while ((dest2[i] & (CFG_FLASH_WORD_SIZE) 0x00800080) !=
  910. (data2[i] & (CFG_FLASH_WORD_SIZE) 0x00800080)) {
  911. if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
  912. return (1);
  913. }
  914. }
  915. }
  916. return (0);
  917. }
  918. #endif /* CFG_FLASH_2ND_16BIT_DEV */
  919. /*-----------------------------------------------------------------------
  920. * Functions
  921. */
  922. static ulong flash_get_size(vu_long * addr, flash_info_t * info);
  923. static int write_word(flash_info_t * info, ulong dest, ulong data);
  924. /*-----------------------------------------------------------------------
  925. */
  926. unsigned long flash_init(void)
  927. {
  928. unsigned long total_b = 0;
  929. unsigned long size_b[CFG_MAX_FLASH_BANKS];
  930. unsigned short index = 0;
  931. int i;
  932. index = 0;
  933. DEBUGF("\n");
  934. DEBUGF("FLASH: Index: %d\n", index);
  935. /* Init: no FLASHes known */
  936. for (i = 0; i < CFG_MAX_FLASH_BANKS; ++i) {
  937. flash_info[i].flash_id = FLASH_UNKNOWN;
  938. flash_info[i].sector_count = -1;
  939. flash_info[i].size = 0;
  940. /* check whether the address is 0 */
  941. if (flash_addr_table[index][i] == 0) {
  942. continue;
  943. }
  944. /* call flash_get_size() to initialize sector address */
  945. size_b[i] = flash_get_size((vu_long *) flash_addr_table[index][i],
  946. &flash_info[i]);
  947. flash_info[i].size = size_b[i];
  948. if (flash_info[i].flash_id == FLASH_UNKNOWN) {
  949. printf("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
  950. i, size_b[i], size_b[i] << 20);
  951. flash_info[i].sector_count = -1;
  952. flash_info[i].size = 0;
  953. }
  954. /* Monitor protection ON by default */
  955. (void)flash_protect(FLAG_PROTECT_SET, CFG_MONITOR_BASE,
  956. CFG_MONITOR_BASE + CFG_MONITOR_LEN - 1,
  957. &flash_info[i]);
  958. #if defined(CFG_ENV_IS_IN_FLASH)
  959. (void)flash_protect(FLAG_PROTECT_SET, CFG_ENV_ADDR,
  960. CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1,
  961. &flash_info[i]);
  962. #if defined(CFG_ENV_IS_IN_FLASH) && defined(CFG_ENV_ADDR_REDUND)
  963. (void)flash_protect(FLAG_PROTECT_SET, CFG_ENV_ADDR_REDUND,
  964. CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1,
  965. &flash_info[i]);
  966. #endif
  967. #endif
  968. total_b += flash_info[i].size;
  969. }
  970. return total_b;
  971. }