doc2001.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:26k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Linux driver for Disk-On-Chip Millennium
  3.  * (c) 1999 Machine Vision Holdings, Inc.
  4.  * (c) 1999, 2000 David Woodhouse <dwmw2@infradead.org>
  5.  *
  6.  * $Id: doc2001.c,v 1.35 2001/10/02 15:05:13 dwmw2 Exp $
  7.  */
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <asm/errno.h>
  11. #include <asm/io.h>
  12. #include <asm/uaccess.h>
  13. #include <linux/miscdevice.h>
  14. #include <linux/pci.h>
  15. #include <linux/delay.h>
  16. #include <linux/slab.h>
  17. #include <linux/sched.h>
  18. #include <linux/init.h>
  19. #include <linux/types.h>
  20. #include <linux/mtd/mtd.h>
  21. #include <linux/mtd/nand.h>
  22. #include <linux/mtd/nand_ids.h>
  23. #include <linux/mtd/doc2000.h>
  24. /* #define ECC_DEBUG */
  25. /* I have no idea why some DoC chips can not use memcop_form|to_io().
  26.  * This may be due to the different revisions of the ASIC controller built-in or
  27.  * simplily a QA/Bug issue. Who knows ?? If you have trouble, please uncomment
  28.  * this:*/
  29. #undef USE_MEMCPY
  30. static int doc_read(struct mtd_info *mtd, loff_t from, size_t len,
  31.     size_t *retlen, u_char *buf);
  32. static int doc_write(struct mtd_info *mtd, loff_t to, size_t len,
  33.      size_t *retlen, const u_char *buf);
  34. static int doc_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
  35. size_t *retlen, u_char *buf, u_char *eccbuf);
  36. static int doc_write_ecc(struct mtd_info *mtd, loff_t to, size_t len,
  37.  size_t *retlen, const u_char *buf, u_char *eccbuf);
  38. static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len,
  39. size_t *retlen, u_char *buf);
  40. static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len,
  41.  size_t *retlen, const u_char *buf);
  42. static int doc_erase (struct mtd_info *mtd, struct erase_info *instr);
  43. static struct mtd_info *docmillist = NULL;
  44. /* Perform the required delay cycles by reading from the NOP register */
  45. static void DoC_Delay(unsigned long docptr, unsigned short cycles)
  46. {
  47. volatile char dummy;
  48. int i;
  49. for (i = 0; i < cycles; i++)
  50. dummy = ReadDOC(docptr, NOP);
  51. }
  52. /* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */
  53. static int _DoC_WaitReady(unsigned long docptr)
  54. {
  55. unsigned short c = 0xffff;
  56. DEBUG(MTD_DEBUG_LEVEL3,
  57.       "_DoC_WaitReady called for out-of-line waitn");
  58. /* Out-of-line routine to wait for chip response */
  59. while (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B) && --c)
  60. ;
  61. if (c == 0)
  62. DEBUG(MTD_DEBUG_LEVEL2, "_DoC_WaitReady timed out.n");
  63. return (c == 0);
  64. }
  65. static inline int DoC_WaitReady(unsigned long docptr)
  66. {
  67. /* This is inline, to optimise the common case, where it's ready instantly */
  68. int ret = 0;
  69. /* 4 read form NOP register should be issued in prior to the read from CDSNControl
  70.    see Software Requirement 11.4 item 2. */
  71. DoC_Delay(docptr, 4);
  72. if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B))
  73. /* Call the out-of-line routine to wait */
  74. ret = _DoC_WaitReady(docptr);
  75. /* issue 2 read from NOP register after reading from CDSNControl register
  76.    see Software Requirement 11.4 item 2. */
  77. DoC_Delay(docptr, 2);
  78. return ret;
  79. }
  80. /* DoC_Command: Send a flash command to the flash chip through the CDSN IO register
  81.    with the internal pipeline. Each of 4 delay cycles (read from the NOP register) is
  82.    required after writing to CDSN Control register, see Software Requirement 11.4 item 3. */
  83. static inline void DoC_Command(unsigned long docptr, unsigned char command,
  84.        unsigned char xtraflags)
  85. {
  86. /* Assert the CLE (Command Latch Enable) line to the flash chip */
  87. WriteDOC(xtraflags | CDSN_CTRL_CLE | CDSN_CTRL_CE, docptr, CDSNControl);
  88. DoC_Delay(docptr, 4);
  89. /* Send the command */
  90. WriteDOC(command, docptr, Mil_CDSN_IO);
  91. WriteDOC(0x00, docptr, WritePipeTerm);
  92. /* Lower the CLE line */
  93. WriteDOC(xtraflags | CDSN_CTRL_CE, docptr, CDSNControl);
  94. DoC_Delay(docptr, 4);
  95. }
  96. /* DoC_Address: Set the current address for the flash chip through the CDSN IO register
  97.    with the internal pipeline. Each of 4 delay cycles (read from the NOP register) is
  98.    required after writing to CDSN Control register, see Software Requirement 11.4 item 3. */
  99. static inline void DoC_Address(unsigned long docptr, int numbytes, unsigned long ofs,
  100.        unsigned char xtraflags1, unsigned char xtraflags2)
  101. {
  102. /* Assert the ALE (Address Latch Enable) line to the flash chip */
  103. WriteDOC(xtraflags1 | CDSN_CTRL_ALE | CDSN_CTRL_CE, docptr, CDSNControl);
  104. DoC_Delay(docptr, 4);
  105. /* Send the address */
  106. switch (numbytes)
  107.     {
  108.     case 1:
  109.     /* Send single byte, bits 0-7. */
  110.     WriteDOC(ofs & 0xff, docptr, Mil_CDSN_IO);
  111.     WriteDOC(0x00, docptr, WritePipeTerm);
  112.     break;
  113.     case 2:
  114.     /* Send bits 9-16 followed by 17-23 */
  115.     WriteDOC((ofs >> 9)  & 0xff, docptr, Mil_CDSN_IO);
  116.     WriteDOC((ofs >> 17) & 0xff, docptr, Mil_CDSN_IO);
  117.     WriteDOC(0x00, docptr, WritePipeTerm);
  118. break;
  119.     case 3:
  120.     /* Send 0-7, 9-16, then 17-23 */
  121.     WriteDOC(ofs & 0xff, docptr, Mil_CDSN_IO);
  122.     WriteDOC((ofs >> 9)  & 0xff, docptr, Mil_CDSN_IO);
  123.     WriteDOC((ofs >> 17) & 0xff, docptr, Mil_CDSN_IO);
  124.     WriteDOC(0x00, docptr, WritePipeTerm);
  125. break;
  126.     default:
  127. return;
  128.     }
  129. /* Lower the ALE line */
  130. WriteDOC(xtraflags1 | xtraflags2 | CDSN_CTRL_CE, docptr, CDSNControl);
  131. DoC_Delay(docptr, 4);
  132. }
  133. /* DoC_SelectChip: Select a given flash chip within the current floor */
  134. static int DoC_SelectChip(unsigned long docptr, int chip)
  135. {
  136. /* Select the individual flash chip requested */
  137. WriteDOC(chip, docptr, CDSNDeviceSelect);
  138. DoC_Delay(docptr, 4);
  139. /* Wait for it to be ready */
  140. return DoC_WaitReady(docptr);
  141. }
  142. /* DoC_SelectFloor: Select a given floor (bank of flash chips) */
  143. static int DoC_SelectFloor(unsigned long docptr, int floor)
  144. {
  145. /* Select the floor (bank) of chips required */
  146. WriteDOC(floor, docptr, FloorSelect);
  147. /* Wait for the chip to be ready */
  148. return DoC_WaitReady(docptr);
  149. }
  150. /* DoC_IdentChip: Identify a given NAND chip given {floor,chip} */
  151. static int DoC_IdentChip(struct DiskOnChip *doc, int floor, int chip)
  152. {
  153. int mfr, id, i;
  154. volatile char dummy;
  155. /* Page in the required floor/chip
  156.    FIXME: is this supported by Millennium ?? */
  157. DoC_SelectFloor(doc->virtadr, floor);
  158. DoC_SelectChip(doc->virtadr, chip);
  159. /* Reset the chip, see Software Requirement 11.4 item 1. */
  160. DoC_Command(doc->virtadr, NAND_CMD_RESET, CDSN_CTRL_WP);
  161. DoC_WaitReady(doc->virtadr);
  162. /* Read the NAND chip ID: 1. Send ReadID command */ 
  163. DoC_Command(doc->virtadr, NAND_CMD_READID, CDSN_CTRL_WP);
  164. /* Read the NAND chip ID: 2. Send address byte zero */ 
  165. DoC_Address(doc->virtadr, 1, 0x00, CDSN_CTRL_WP, 0x00);
  166. /* Read the manufacturer and device id codes of the flash device through
  167.    CDSN IO register see Software Requirement 11.4 item 5.*/
  168. dummy = ReadDOC(doc->virtadr, ReadPipeInit);
  169. DoC_Delay(doc->virtadr, 2);
  170. mfr = ReadDOC(doc->virtadr, Mil_CDSN_IO);
  171. DoC_Delay(doc->virtadr, 2);
  172. id  = ReadDOC(doc->virtadr, Mil_CDSN_IO);
  173. dummy = ReadDOC(doc->virtadr, LastDataRead);
  174. /* No response - return failure */
  175. if (mfr == 0xff || mfr == 0)
  176. return 0;
  177. /* FIXME: to deal with multi-flash on multi-Millennium case more carefully */
  178. for (i = 0; nand_flash_ids[i].name != NULL; i++) {
  179. if (mfr == nand_flash_ids[i].manufacture_id &&
  180.     id == nand_flash_ids[i].model_id) {
  181. printk(KERN_INFO "Flash chip found: Manufacturer ID: %2.2X, "
  182.        "Chip ID: %2.2X (%s)n",
  183.        mfr, id, nand_flash_ids[i].name);
  184. doc->mfr = mfr;
  185. doc->id = id;
  186. doc->chipshift = nand_flash_ids[i].chipshift;
  187. break;
  188. }
  189. }
  190. if (nand_flash_ids[i].name == NULL)
  191. return 0;
  192. else
  193. return 1;
  194. }
  195. /* DoC_ScanChips: Find all NAND chips present in a DiskOnChip, and identify them */
  196. static void DoC_ScanChips(struct DiskOnChip *this)
  197. {
  198. int floor, chip;
  199. int numchips[MAX_FLOORS_MIL];
  200. int ret;
  201. this->numchips = 0;
  202. this->mfr = 0;
  203. this->id = 0;
  204. /* For each floor, find the number of valid chips it contains */
  205. for (floor = 0,ret = 1; floor < MAX_FLOORS_MIL; floor++) {
  206. numchips[floor] = 0;
  207. for (chip = 0; chip < MAX_CHIPS_MIL && ret != 0; chip++) {
  208. ret = DoC_IdentChip(this, floor, chip);
  209. if (ret) {
  210. numchips[floor]++;
  211. this->numchips++;
  212. }
  213. }
  214. }
  215. /* If there are none at all that we recognise, bail */
  216. if (!this->numchips) {
  217. printk("No flash chips recognised.n");
  218. return;
  219. }
  220. /* Allocate an array to hold the information for each chip */
  221. this->chips = kmalloc(sizeof(struct Nand) * this->numchips, GFP_KERNEL);
  222. if (!this->chips){
  223. printk("No memory for allocating chip info structuresn");
  224. return;
  225. }
  226. /* Fill out the chip array with {floor, chipno} for each 
  227.  * detected chip in the device. */
  228. for (floor = 0, ret = 0; floor < MAX_FLOORS_MIL; floor++) {
  229. for (chip = 0 ; chip < numchips[floor] ; chip++) {
  230. this->chips[ret].floor = floor;
  231. this->chips[ret].chip = chip;
  232. this->chips[ret].curadr = 0;
  233. this->chips[ret].curmode = 0x50;
  234. ret++;
  235. }
  236. }
  237. /* Calculate and print the total size of the device */
  238. this->totlen = this->numchips * (1 << this->chipshift);
  239. printk(KERN_INFO "%d flash chips found. Total DiskOnChip size: %ld MiBn",
  240.        this->numchips ,this->totlen >> 20);
  241. }
  242. static int DoCMil_is_alias(struct DiskOnChip *doc1, struct DiskOnChip *doc2)
  243. {
  244. int tmp1, tmp2, retval;
  245. if (doc1->physadr == doc2->physadr)
  246. return 1;
  247. /* Use the alias resolution register which was set aside for this
  248.  * purpose. If it's value is the same on both chips, they might
  249.  * be the same chip, and we write to one and check for a change in
  250.  * the other. It's unclear if this register is usuable in the
  251.  * DoC 2000 (it's in the Millenium docs), but it seems to work. */
  252. tmp1 = ReadDOC(doc1->virtadr, AliasResolution);
  253. tmp2 = ReadDOC(doc2->virtadr, AliasResolution);
  254. if (tmp1 != tmp2)
  255. return 0;
  256. WriteDOC((tmp1+1) % 0xff, doc1->virtadr, AliasResolution);
  257. tmp2 = ReadDOC(doc2->virtadr, AliasResolution);
  258. if (tmp2 == (tmp1+1) % 0xff)
  259. retval = 1;
  260. else
  261. retval = 0;
  262. /* Restore register contents.  May not be necessary, but do it just to
  263.  * be safe. */
  264. WriteDOC(tmp1, doc1->virtadr, AliasResolution);
  265. return retval;
  266. }
  267. static const char im_name[] = "DoCMil_init";
  268. /* This routine is made available to other mtd code via
  269.  * inter_module_register.  It must only be accessed through
  270.  * inter_module_get which will bump the use count of this module.  The
  271.  * addresses passed back in mtd are valid as long as the use count of
  272.  * this module is non-zero, i.e. between inter_module_get and
  273.  * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
  274.  */
  275. static void DoCMil_init(struct mtd_info *mtd)
  276. {
  277. struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
  278. struct DiskOnChip *old = NULL;
  279. /* We must avoid being called twice for the same device. */
  280. if (docmillist)
  281. old = (struct DiskOnChip *)docmillist->priv;
  282. while (old) {
  283. if (DoCMil_is_alias(this, old)) {
  284. printk(KERN_NOTICE "Ignoring DiskOnChip Millennium at "
  285.        "0x%lX - already configuredn", this->physadr);
  286. iounmap((void *)this->virtadr);
  287. kfree(mtd);
  288. return;
  289. }
  290. if (old->nextdoc)
  291. old = (struct DiskOnChip *)old->nextdoc->priv;
  292. else
  293. old = NULL;
  294. }
  295. mtd->name = "DiskOnChip Millennium";
  296. printk(KERN_NOTICE "DiskOnChip Millennium found at address 0x%lXn",
  297.        this->physadr);
  298. mtd->type = MTD_NANDFLASH;
  299. mtd->flags = MTD_CAP_NANDFLASH;
  300. mtd->size = 0;
  301. /* FIXME: erase size is not always 8kB */
  302. mtd->erasesize = 0x2000;
  303. mtd->oobblock = 512;
  304. mtd->oobsize = 16;
  305. mtd->module = THIS_MODULE;
  306. mtd->erase = doc_erase;
  307. mtd->point = NULL;
  308. mtd->unpoint = NULL;
  309. mtd->read = doc_read;
  310. mtd->write = doc_write;
  311. mtd->read_ecc = doc_read_ecc;
  312. mtd->write_ecc = doc_write_ecc;
  313. mtd->read_oob = doc_read_oob;
  314. mtd->write_oob = doc_write_oob;
  315. mtd->sync = NULL;
  316. this->totlen = 0;
  317. this->numchips = 0;
  318. this->curfloor = -1;
  319. this->curchip = -1;
  320. /* Ident all the chips present. */
  321. DoC_ScanChips(this);
  322. if (!this->totlen) {
  323. kfree(mtd);
  324. iounmap((void *)this->virtadr);
  325. } else {
  326. this->nextdoc = docmillist;
  327. docmillist = mtd;
  328. mtd->size  = this->totlen;
  329. add_mtd_device(mtd);
  330. return;
  331. }
  332. }
  333. static int doc_read (struct mtd_info *mtd, loff_t from, size_t len,
  334.      size_t *retlen, u_char *buf)
  335. {
  336. /* Just a special case of doc_read_ecc */
  337. return doc_read_ecc(mtd, from, len, retlen, buf, NULL);
  338. }
  339. static int doc_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
  340.  size_t *retlen, u_char *buf, u_char *eccbuf)
  341. {
  342. int i, ret;
  343. volatile char dummy;
  344. unsigned char syndrome[6];
  345. struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
  346. unsigned long docptr = this->virtadr;
  347. struct Nand *mychip = &this->chips[from >> (this->chipshift)];
  348. /* Don't allow read past end of device */
  349. if (from >= this->totlen)
  350. return -EINVAL;
  351. /* Don't allow a single read to cross a 512-byte block boundary */
  352. if (from + len > ((from | 0x1ff) + 1)) 
  353. len = ((from | 0x1ff) + 1) - from;
  354. /* Find the chip which is to be used and select it */
  355. if (this->curfloor != mychip->floor) {
  356. DoC_SelectFloor(docptr, mychip->floor);
  357. DoC_SelectChip(docptr, mychip->chip);
  358. } else if (this->curchip != mychip->chip) {
  359. DoC_SelectChip(docptr, mychip->chip);
  360. }
  361. this->curfloor = mychip->floor;
  362. this->curchip = mychip->chip;
  363. /* issue the Read0 or Read1 command depend on which half of the page
  364.    we are accessing. Polling the Flash Ready bit after issue 3 bytes
  365.    address in Sequence Read Mode, see Software Requirement 11.4 item 1.*/
  366. DoC_Command(docptr, (from >> 8) & 1, CDSN_CTRL_WP);
  367. DoC_Address(docptr, 3, from, CDSN_CTRL_WP, 0x00);
  368. DoC_WaitReady(docptr);
  369. if (eccbuf) {
  370. /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/
  371. WriteDOC (DOC_ECC_RESET, docptr, ECCConf);
  372. WriteDOC (DOC_ECC_EN, docptr, ECCConf);
  373. } else {
  374. /* disable the ECC engine */
  375. WriteDOC (DOC_ECC_RESET, docptr, ECCConf);
  376. WriteDOC (DOC_ECC_DIS, docptr, ECCConf);
  377. }
  378. /* Read the data via the internal pipeline through CDSN IO register,
  379.    see Pipelined Read Operations 11.3 */
  380. dummy = ReadDOC(docptr, ReadPipeInit);
  381. #ifndef USE_MEMCPY
  382. for (i = 0; i < len-1; i++) {
  383. /* N.B. you have to increase the source address in this way or the
  384.    ECC logic will not work properly */
  385. buf[i] = ReadDOC(docptr, Mil_CDSN_IO + (i & 0xff));
  386. }
  387. #else
  388. memcpy_fromio(buf, docptr + DoC_Mil_CDSN_IO, len - 1);
  389. #endif
  390. buf[len - 1] = ReadDOC(docptr, LastDataRead);
  391. /* Let the caller know we completed it */
  392. *retlen = len;
  393.         ret = 0;
  394. if (eccbuf) {
  395. /* Read the ECC data from Spare Data Area,
  396.    see Reed-Solomon EDC/ECC 11.1 */
  397. dummy = ReadDOC(docptr, ReadPipeInit);
  398. #ifndef USE_MEMCPY
  399. for (i = 0; i < 5; i++) {
  400. /* N.B. you have to increase the source address in this way or the
  401.    ECC logic will not work properly */
  402. eccbuf[i] = ReadDOC(docptr, Mil_CDSN_IO + i);
  403. }
  404. #else
  405. memcpy_fromio(eccbuf, docptr + DoC_Mil_CDSN_IO, 5);
  406. #endif
  407. eccbuf[5] = ReadDOC(docptr, LastDataRead);
  408. /* Flush the pipeline */
  409. dummy = ReadDOC(docptr, ECCConf);
  410. dummy = ReadDOC(docptr, ECCConf);
  411. /* Check the ECC Status */
  412. if (ReadDOC(docptr, ECCConf) & 0x80) {
  413.                         int nb_errors;
  414. /* There was an ECC error */
  415. #ifdef ECC_DEBUG
  416. printk("DiskOnChip ECC Error: Read at %lxn", (long)from);
  417. #endif
  418. /* Read the ECC syndrom through the DiskOnChip ECC logic.
  419.    These syndrome will be all ZERO when there is no error */
  420. for (i = 0; i < 6; i++) {
  421. syndrome[i] = ReadDOC(docptr, ECCSyndrome0 + i);
  422. }
  423.                         nb_errors = doc_decode_ecc(buf, syndrome);
  424. #ifdef ECC_DEBUG
  425. printk("ECC Errors corrected: %xn", nb_errors);
  426. #endif
  427.                         if (nb_errors < 0) {
  428. /* We return error, but have actually done the read. Not that
  429.    this can be told to user-space, via sys_read(), but at least
  430.    MTD-aware stuff can know about it by checking *retlen */
  431. ret = -EIO;
  432.                         }
  433. }
  434. #ifdef PSYCHO_DEBUG
  435. printk("ECC DATA at %lx: %2.2X %2.2X %2.2X %2.2X %2.2X %2.2Xn",
  436.        (long)from, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3],
  437.        eccbuf[4], eccbuf[5]);
  438. #endif
  439. /* disable the ECC engine */
  440. WriteDOC(DOC_ECC_DIS, docptr , ECCConf);
  441. }
  442. return ret;
  443. }
  444. static int doc_write (struct mtd_info *mtd, loff_t to, size_t len,
  445.       size_t *retlen, const u_char *buf)
  446. {
  447. char eccbuf[6];
  448. return doc_write_ecc(mtd, to, len, retlen, buf, eccbuf);
  449. }
  450. static int doc_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
  451.   size_t *retlen, const u_char *buf, u_char *eccbuf)
  452. {
  453. int i,ret = 0;
  454. volatile char dummy;
  455. struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
  456. unsigned long docptr = this->virtadr;
  457. struct Nand *mychip = &this->chips[to >> (this->chipshift)];
  458. /* Don't allow write past end of device */
  459. if (to >= this->totlen)
  460. return -EINVAL;
  461. #if 0
  462. /* Don't allow a single write to cross a 512-byte block boundary */
  463. if (to + len > ( (to | 0x1ff) + 1)) 
  464. len = ((to | 0x1ff) + 1) - to;
  465. #else
  466. /* Don't allow writes which aren't exactly one block */
  467. if (to & 0x1ff || len != 0x200)
  468. return -EINVAL;
  469. #endif
  470. /* Find the chip which is to be used and select it */
  471. if (this->curfloor != mychip->floor) {
  472. DoC_SelectFloor(docptr, mychip->floor);
  473. DoC_SelectChip(docptr, mychip->chip);
  474. } else if (this->curchip != mychip->chip) {
  475. DoC_SelectChip(docptr, mychip->chip);
  476. }
  477. this->curfloor = mychip->floor;
  478. this->curchip = mychip->chip;
  479. /* Reset the chip, see Software Requirement 11.4 item 1. */
  480. DoC_Command(docptr, NAND_CMD_RESET, 0x00);
  481. DoC_WaitReady(docptr);
  482. /* Set device to main plane of flash */
  483. DoC_Command(docptr, NAND_CMD_READ0, 0x00);
  484. /* issue the Serial Data In command to initial the Page Program process */
  485. DoC_Command(docptr, NAND_CMD_SEQIN, 0x00);
  486. DoC_Address(docptr, 3, to, 0x00, 0x00);
  487. DoC_WaitReady(docptr);
  488. if (eccbuf) {
  489. /* init the ECC engine, see Reed-Solomon EDC/ECC 11.1 .*/
  490. WriteDOC (DOC_ECC_RESET, docptr, ECCConf);
  491. WriteDOC (DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf);
  492. } else {
  493. /* disable the ECC engine */
  494. WriteDOC (DOC_ECC_RESET, docptr, ECCConf);
  495. WriteDOC (DOC_ECC_DIS, docptr, ECCConf);
  496. }
  497. /* Write the data via the internal pipeline through CDSN IO register,
  498.    see Pipelined Write Operations 11.2 */
  499. #ifndef USE_MEMCPY
  500. for (i = 0; i < len; i++) {
  501. /* N.B. you have to increase the source address in this way or the
  502.    ECC logic will not work properly */
  503. WriteDOC(buf[i], docptr, Mil_CDSN_IO + i);
  504. }
  505. #else
  506. memcpy_toio(docptr + DoC_Mil_CDSN_IO, buf, len);
  507. #endif
  508. WriteDOC(0x00, docptr, WritePipeTerm);
  509. if (eccbuf) {
  510. /* Write ECC data to flash, the ECC info is generated by the DiskOnChip ECC logic
  511.    see Reed-Solomon EDC/ECC 11.1 */
  512. WriteDOC(0, docptr, NOP);
  513. WriteDOC(0, docptr, NOP);
  514. WriteDOC(0, docptr, NOP);
  515. /* Read the ECC data through the DiskOnChip ECC logic */
  516. for (i = 0; i < 6; i++) {
  517. eccbuf[i] = ReadDOC(docptr, ECCSyndrome0 + i);
  518. }
  519. /* ignore the ECC engine */
  520. WriteDOC(DOC_ECC_DIS, docptr , ECCConf);
  521. #ifndef USE_MEMCPY
  522. /* Write the ECC data to flash */
  523. for (i = 0; i < 6; i++) {
  524. /* N.B. you have to increase the source address in this way or the
  525.    ECC logic will not work properly */
  526. WriteDOC(eccbuf[i], docptr, Mil_CDSN_IO + i);
  527. }
  528. #else
  529. memcpy_toio(docptr + DoC_Mil_CDSN_IO, eccbuf, 6);
  530. #endif
  531. /* write the block status BLOCK_USED (0x5555) at the end of ECC data
  532.    FIXME: this is only a hack for programming the IPL area for LinuxBIOS
  533.    and should be replace with proper codes in user space utilities */ 
  534. WriteDOC(0x55, docptr, Mil_CDSN_IO);
  535. WriteDOC(0x55, docptr, Mil_CDSN_IO + 1);
  536. WriteDOC(0x00, docptr, WritePipeTerm);
  537. #ifdef PSYCHO_DEBUG
  538. printk("OOB data at %lx is %2.2X %2.2X %2.2X %2.2X %2.2X %2.2Xn",
  539.        (long) to, eccbuf[0], eccbuf[1], eccbuf[2], eccbuf[3],
  540.        eccbuf[4], eccbuf[5]);
  541. #endif
  542. }
  543. /* Commit the Page Program command and wait for ready
  544.    see Software Requirement 11.4 item 1.*/
  545. DoC_Command(docptr, NAND_CMD_PAGEPROG, 0x00);
  546. DoC_WaitReady(docptr);
  547. /* Read the status of the flash device through CDSN IO register
  548.    see Software Requirement 11.4 item 5.*/
  549. DoC_Command(docptr, NAND_CMD_STATUS, CDSN_CTRL_WP);
  550. dummy = ReadDOC(docptr, ReadPipeInit);
  551. DoC_Delay(docptr, 2);
  552. if (ReadDOC(docptr, Mil_CDSN_IO) & 1) {
  553. printk("Error programming flashn");
  554. /* Error in programming
  555.    FIXME: implement Bad Block Replacement (in nftl.c ??) */
  556. *retlen = 0;
  557. ret = -EIO;
  558. }
  559. dummy = ReadDOC(docptr, LastDataRead);
  560. /* Let the caller know we completed it */
  561. *retlen = len;
  562. return ret;
  563. }
  564. static int doc_read_oob(struct mtd_info *mtd, loff_t ofs, size_t len,
  565. size_t *retlen, u_char *buf)
  566. {
  567. #ifndef USE_MEMCPY
  568. int i;
  569. #endif
  570. volatile char dummy;
  571. struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
  572. unsigned long docptr = this->virtadr;
  573. struct Nand *mychip = &this->chips[ofs >> this->chipshift];
  574. /* Find the chip which is to be used and select it */
  575. if (this->curfloor != mychip->floor) {
  576. DoC_SelectFloor(docptr, mychip->floor);
  577. DoC_SelectChip(docptr, mychip->chip);
  578. } else if (this->curchip != mychip->chip) {
  579. DoC_SelectChip(docptr, mychip->chip);
  580. }
  581. this->curfloor = mychip->floor;
  582. this->curchip = mychip->chip;
  583. /* disable the ECC engine */
  584. WriteDOC (DOC_ECC_RESET, docptr, ECCConf);
  585. WriteDOC (DOC_ECC_DIS, docptr, ECCConf);
  586. /* issue the Read2 command to set the pointer to the Spare Data Area.
  587.    Polling the Flash Ready bit after issue 3 bytes address in
  588.    Sequence Read Mode, see Software Requirement 11.4 item 1.*/
  589. DoC_Command(docptr, NAND_CMD_READOOB, CDSN_CTRL_WP);
  590. DoC_Address(docptr, 3, ofs, CDSN_CTRL_WP, 0x00);
  591. DoC_WaitReady(docptr);
  592. /* Read the data out via the internal pipeline through CDSN IO register,
  593.    see Pipelined Read Operations 11.3 */
  594. dummy = ReadDOC(docptr, ReadPipeInit);
  595. #ifndef USE_MEMCPY
  596. for (i = 0; i < len-1; i++) {
  597. /* N.B. you have to increase the source address in this way or the
  598.    ECC logic will not work properly */
  599. buf[i] = ReadDOC(docptr, Mil_CDSN_IO + i);
  600. }
  601. #else
  602. memcpy_fromio(buf, docptr + DoC_Mil_CDSN_IO, len - 1);
  603. #endif
  604. buf[len - 1] = ReadDOC(docptr, LastDataRead);
  605. *retlen = len;
  606. return 0;
  607. }
  608. static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, size_t len,
  609.  size_t *retlen, const u_char *buf)
  610. {
  611. #ifndef USE_MEMCPY
  612. int i;
  613. #endif
  614. volatile char dummy;
  615. int ret = 0;
  616. struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
  617. unsigned long docptr = this->virtadr;
  618. struct Nand *mychip = &this->chips[ofs >> this->chipshift];
  619. /* Find the chip which is to be used and select it */
  620. if (this->curfloor != mychip->floor) {
  621. DoC_SelectFloor(docptr, mychip->floor);
  622. DoC_SelectChip(docptr, mychip->chip);
  623. } else if (this->curchip != mychip->chip) {
  624. DoC_SelectChip(docptr, mychip->chip);
  625. }
  626. this->curfloor = mychip->floor;
  627. this->curchip = mychip->chip;
  628. /* disable the ECC engine */
  629. WriteDOC (DOC_ECC_RESET, docptr, ECCConf);
  630. WriteDOC (DOC_ECC_DIS, docptr, ECCConf);
  631. /* Reset the chip, see Software Requirement 11.4 item 1. */
  632. DoC_Command(docptr, NAND_CMD_RESET, CDSN_CTRL_WP);
  633. DoC_WaitReady(docptr);
  634. /* issue the Read2 command to set the pointer to the Spare Data Area. */
  635. DoC_Command(docptr, NAND_CMD_READOOB, CDSN_CTRL_WP);
  636. /* issue the Serial Data In command to initial the Page Program process */
  637. DoC_Command(docptr, NAND_CMD_SEQIN, 0x00);
  638. DoC_Address(docptr, 3, ofs, 0x00, 0x00);
  639. /* Write the data via the internal pipeline through CDSN IO register,
  640.    see Pipelined Write Operations 11.2 */
  641. #ifndef USE_MEMCPY
  642. for (i = 0; i < len; i++) {
  643. /* N.B. you have to increase the source address in this way or the
  644.    ECC logic will not work properly */
  645. WriteDOC(buf[i], docptr, Mil_CDSN_IO + i);
  646. }
  647. #else
  648. memcpy_toio(docptr + DoC_Mil_CDSN_IO, buf, len);
  649. #endif
  650. WriteDOC(0x00, docptr, WritePipeTerm);
  651. /* Commit the Page Program command and wait for ready
  652.    see Software Requirement 11.4 item 1.*/
  653. DoC_Command(docptr, NAND_CMD_PAGEPROG, 0x00);
  654. DoC_WaitReady(docptr);
  655. /* Read the status of the flash device through CDSN IO register
  656.    see Software Requirement 11.4 item 5.*/
  657. DoC_Command(docptr, NAND_CMD_STATUS, 0x00);
  658. dummy = ReadDOC(docptr, ReadPipeInit);
  659. DoC_Delay(docptr, 2);
  660. if (ReadDOC(docptr, Mil_CDSN_IO) & 1) {
  661. printk("Error programming oob datan");
  662. /* FIXME: implement Bad Block Replacement (in nftl.c ??) */
  663. *retlen = 0;
  664. ret = -EIO;
  665. }
  666. dummy = ReadDOC(docptr, LastDataRead);
  667. *retlen = len;
  668. return ret;
  669. }
  670. int doc_erase (struct mtd_info *mtd, struct erase_info *instr)
  671. {
  672. volatile char dummy;
  673. struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
  674. __u32 ofs = instr->addr;
  675. __u32 len = instr->len;
  676. unsigned long docptr = this->virtadr;
  677. struct Nand *mychip = &this->chips[ofs >> this->chipshift];
  678. if (len != mtd->erasesize) 
  679. printk(KERN_WARNING "Erase not right size (%x != %x)n",
  680.        len, mtd->erasesize);
  681. /* Find the chip which is to be used and select it */
  682. if (this->curfloor != mychip->floor) {
  683. DoC_SelectFloor(docptr, mychip->floor);
  684. DoC_SelectChip(docptr, mychip->chip);
  685. } else if (this->curchip != mychip->chip) {
  686. DoC_SelectChip(docptr, mychip->chip);
  687. }
  688. this->curfloor = mychip->floor;
  689. this->curchip = mychip->chip;
  690. instr->state = MTD_ERASE_PENDING;
  691. /* issue the Erase Setup command */
  692. DoC_Command(docptr, NAND_CMD_ERASE1, 0x00);
  693. DoC_Address(docptr, 2, ofs, 0x00, 0x00);
  694. /* Commit the Erase Start command and wait for ready
  695.    see Software Requirement 11.4 item 1.*/
  696. DoC_Command(docptr, NAND_CMD_ERASE2, 0x00);
  697. DoC_WaitReady(docptr);
  698. instr->state = MTD_ERASING;
  699. /* Read the status of the flash device through CDSN IO register
  700.    see Software Requirement 11.4 item 5.
  701.    FIXME: it seems that we are not wait long enough, some blocks are not
  702.    erased fully */
  703. DoC_Command(docptr, NAND_CMD_STATUS, CDSN_CTRL_WP);
  704. dummy = ReadDOC(docptr, ReadPipeInit);
  705. DoC_Delay(docptr, 2);
  706. if (ReadDOC(docptr, Mil_CDSN_IO) & 1) {
  707. printk("Error Erasing at 0x%xn", ofs);
  708. /* There was an error
  709.    FIXME: implement Bad Block Replacement (in nftl.c ??) */
  710. instr->state = MTD_ERASE_FAILED;
  711. } else
  712. instr->state = MTD_ERASE_DONE;
  713. dummy = ReadDOC(docptr, LastDataRead);
  714. if (instr->callback) 
  715. instr->callback(instr);
  716. return 0;
  717. }
  718. /****************************************************************************
  719.  *
  720.  * Module stuff
  721.  *
  722.  ****************************************************************************/
  723. int __init init_doc2001(void)
  724. {
  725. inter_module_register(im_name, THIS_MODULE, &DoCMil_init);
  726. return 0;
  727. }
  728. static void __exit cleanup_doc2001(void)
  729. {
  730. struct mtd_info *mtd;
  731. struct DiskOnChip *this;
  732. while ((mtd=docmillist)) {
  733. this = (struct DiskOnChip *)mtd->priv;
  734. docmillist = this->nextdoc;
  735. del_mtd_device(mtd);
  736. iounmap((void *)this->virtadr);
  737. kfree(this->chips);
  738. kfree(mtd);
  739. }
  740. inter_module_unregister(im_name);
  741. }
  742. module_exit(cleanup_doc2001);
  743. module_init(init_doc2001);
  744. MODULE_LICENSE("GPL");
  745. MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org> et al.");
  746. MODULE_DESCRIPTION("Alternative driver for DiskOnChip Millennium");