1 /* 2 * (C) 2003 Red Hat, Inc. 3 * (C) 2004 Dan Brown <dan_brown@ieee.org> 4 * (C) 2004 Kalev Lember <kalev@smartlink.ee> 5 * 6 * Author: David Woodhouse <dwmw2@infradead.org> 7 * Additional Diskonchip 2000 and Millennium support by Dan Brown <dan_brown@ieee.org> 8 * Diskonchip Millennium Plus support by Kalev Lember <kalev@smartlink.ee> 9 * 10 * Error correction code lifted from the old docecc code 11 * Author: Fabrice Bellard (fabrice.bellard@netgem.com) 12 * Copyright (C) 2000 Netgem S.A. 13 * converted to the generic Reed-Solomon library by Thomas Gleixner <tglx@linutronix.de> 14 * 15 * Interface to generic NAND code for M-Systems DiskOnChip devices 16 */ 17 18 #include <linux/kernel.h> 19 #include <linux/init.h> 20 #include <linux/sched.h> 21 #include <linux/delay.h> 22 #include <linux/rslib.h> 23 #include <linux/moduleparam.h> 24 #include <linux/slab.h> 25 #include <linux/io.h> 26 27 #include <linux/mtd/mtd.h> 28 #include <linux/mtd/rawnand.h> 29 #include <linux/mtd/doc2000.h> 30 #include <linux/mtd/partitions.h> 31 #include <linux/mtd/inftl.h> 32 #include <linux/module.h> 33 34 /* Where to look for the devices? */ 35 #ifndef CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS 36 #define CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS 0 37 #endif 38 39 static unsigned long doc_locations[] __initdata = { 40 #if defined (__alpha__) || defined(__i386__) || defined(__x86_64__) 41 #ifdef CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH 42 0xfffc8000, 0xfffca000, 0xfffcc000, 0xfffce000, 43 0xfffd0000, 0xfffd2000, 0xfffd4000, 0xfffd6000, 44 0xfffd8000, 0xfffda000, 0xfffdc000, 0xfffde000, 45 0xfffe0000, 0xfffe2000, 0xfffe4000, 0xfffe6000, 46 0xfffe8000, 0xfffea000, 0xfffec000, 0xfffee000, 47 #else 48 0xc8000, 0xca000, 0xcc000, 0xce000, 49 0xd0000, 0xd2000, 0xd4000, 0xd6000, 50 0xd8000, 0xda000, 0xdc000, 0xde000, 51 0xe0000, 0xe2000, 0xe4000, 0xe6000, 52 0xe8000, 0xea000, 0xec000, 0xee000, 53 #endif 54 #endif 55 0xffffffff }; 56 57 static struct mtd_info *doclist = NULL; 58 59 struct doc_priv { 60 void __iomem *virtadr; 61 unsigned long physadr; 62 u_char ChipID; 63 u_char CDSNControl; 64 int chips_per_floor; /* The number of chips detected on each floor */ 65 int curfloor; 66 int curchip; 67 int mh0_page; 68 int mh1_page; 69 struct rs_control *rs_decoder; 70 struct mtd_info *nextdoc; 71 72 /* Handle the last stage of initialization (BBT scan, partitioning) */ 73 int (*late_init)(struct mtd_info *mtd); 74 }; 75 76 /* This is the ecc value computed by the HW ecc generator upon writing an empty 77 page, one with all 0xff for data. */ 78 static u_char empty_write_ecc[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 }; 79 80 #define INFTL_BBT_RESERVED_BLOCKS 4 81 82 #define DoC_is_MillenniumPlus(doc) ((doc)->ChipID == DOC_ChipID_DocMilPlus16 || (doc)->ChipID == DOC_ChipID_DocMilPlus32) 83 #define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil) 84 #define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k) 85 86 static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd, 87 unsigned int bitmask); 88 static void doc200x_select_chip(struct mtd_info *mtd, int chip); 89 90 static int debug = 0; 91 module_param(debug, int, 0); 92 93 static int try_dword = 1; 94 module_param(try_dword, int, 0); 95 96 static int no_ecc_failures = 0; 97 module_param(no_ecc_failures, int, 0); 98 99 static int no_autopart = 0; 100 module_param(no_autopart, int, 0); 101 102 static int show_firmware_partition = 0; 103 module_param(show_firmware_partition, int, 0); 104 105 #ifdef CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE 106 static int inftl_bbt_write = 1; 107 #else 108 static int inftl_bbt_write = 0; 109 #endif 110 module_param(inftl_bbt_write, int, 0); 111 112 static unsigned long doc_config_location = CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS; 113 module_param(doc_config_location, ulong, 0); 114 MODULE_PARM_DESC(doc_config_location, "Physical memory address at which to probe for DiskOnChip"); 115 116 /* Sector size for HW ECC */ 117 #define SECTOR_SIZE 512 118 /* The sector bytes are packed into NB_DATA 10 bit words */ 119 #define NB_DATA (((SECTOR_SIZE + 1) * 8 + 6) / 10) 120 /* Number of roots */ 121 #define NROOTS 4 122 /* First consective root */ 123 #define FCR 510 124 /* Number of symbols */ 125 #define NN 1023 126 127 /* 128 * The HW decoder in the DoC ASIC's provides us a error syndrome, 129 * which we must convert to a standard syndrome usable by the generic 130 * Reed-Solomon library code. 131 * 132 * Fabrice Bellard figured this out in the old docecc code. I added 133 * some comments, improved a minor bit and converted it to make use 134 * of the generic Reed-Solomon library. tglx 135 */ 136 static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc) 137 { 138 int i, j, nerr, errpos[8]; 139 uint8_t parity; 140 uint16_t ds[4], s[5], tmp, errval[8], syn[4]; 141 struct rs_codec *cd = rs->codec; 142 143 memset(syn, 0, sizeof(syn)); 144 /* Convert the ecc bytes into words */ 145 ds[0] = ((ecc[4] & 0xff) >> 0) | ((ecc[5] & 0x03) << 8); 146 ds[1] = ((ecc[5] & 0xfc) >> 2) | ((ecc[2] & 0x0f) << 6); 147 ds[2] = ((ecc[2] & 0xf0) >> 4) | ((ecc[3] & 0x3f) << 4); 148 ds[3] = ((ecc[3] & 0xc0) >> 6) | ((ecc[0] & 0xff) << 2); 149 parity = ecc[1]; 150 151 /* Initialize the syndrome buffer */ 152 for (i = 0; i < NROOTS; i++) 153 s[i] = ds[0]; 154 /* 155 * Evaluate 156 * s[i] = ds[3]x^3 + ds[2]x^2 + ds[1]x^1 + ds[0] 157 * where x = alpha^(FCR + i) 158 */ 159 for (j = 1; j < NROOTS; j++) { 160 if (ds[j] == 0) 161 continue; 162 tmp = cd->index_of[ds[j]]; 163 for (i = 0; i < NROOTS; i++) 164 s[i] ^= cd->alpha_to[rs_modnn(cd, tmp + (FCR + i) * j)]; 165 } 166 167 /* Calc syn[i] = s[i] / alpha^(v + i) */ 168 for (i = 0; i < NROOTS; i++) { 169 if (s[i]) 170 syn[i] = rs_modnn(cd, cd->index_of[s[i]] + (NN - FCR - i)); 171 } 172 /* Call the decoder library */ 173 nerr = decode_rs16(rs, NULL, NULL, 1019, syn, 0, errpos, 0, errval); 174 175 /* Incorrectable errors ? */ 176 if (nerr < 0) 177 return nerr; 178 179 /* 180 * Correct the errors. The bitpositions are a bit of magic, 181 * but they are given by the design of the de/encoder circuit 182 * in the DoC ASIC's. 183 */ 184 for (i = 0; i < nerr; i++) { 185 int index, bitpos, pos = 1015 - errpos[i]; 186 uint8_t val; 187 if (pos >= NB_DATA && pos < 1019) 188 continue; 189 if (pos < NB_DATA) { 190 /* extract bit position (MSB first) */ 191 pos = 10 * (NB_DATA - 1 - pos) - 6; 192 /* now correct the following 10 bits. At most two bytes 193 can be modified since pos is even */ 194 index = (pos >> 3) ^ 1; 195 bitpos = pos & 7; 196 if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) { 197 val = (uint8_t) (errval[i] >> (2 + bitpos)); 198 parity ^= val; 199 if (index < SECTOR_SIZE) 200 data[index] ^= val; 201 } 202 index = ((pos >> 3) + 1) ^ 1; 203 bitpos = (bitpos + 10) & 7; 204 if (bitpos == 0) 205 bitpos = 8; 206 if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) { 207 val = (uint8_t) (errval[i] << (8 - bitpos)); 208 parity ^= val; 209 if (index < SECTOR_SIZE) 210 data[index] ^= val; 211 } 212 } 213 } 214 /* If the parity is wrong, no rescue possible */ 215 return parity ? -EBADMSG : nerr; 216 } 217 218 static void DoC_Delay(struct doc_priv *doc, unsigned short cycles) 219 { 220 volatile char dummy; 221 int i; 222 223 for (i = 0; i < cycles; i++) { 224 if (DoC_is_Millennium(doc)) 225 dummy = ReadDOC(doc->virtadr, NOP); 226 else if (DoC_is_MillenniumPlus(doc)) 227 dummy = ReadDOC(doc->virtadr, Mplus_NOP); 228 else 229 dummy = ReadDOC(doc->virtadr, DOCStatus); 230 } 231 232 } 233 234 #define CDSN_CTRL_FR_B_MASK (CDSN_CTRL_FR_B0 | CDSN_CTRL_FR_B1) 235 236 /* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */ 237 static int _DoC_WaitReady(struct doc_priv *doc) 238 { 239 void __iomem *docptr = doc->virtadr; 240 unsigned long timeo = jiffies + (HZ * 10); 241 242 if (debug) 243 printk("_DoC_WaitReady...\n"); 244 /* Out-of-line routine to wait for chip response */ 245 if (DoC_is_MillenniumPlus(doc)) { 246 while ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) { 247 if (time_after(jiffies, timeo)) { 248 printk("_DoC_WaitReady timed out.\n"); 249 return -EIO; 250 } 251 udelay(1); 252 cond_resched(); 253 } 254 } else { 255 while (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) { 256 if (time_after(jiffies, timeo)) { 257 printk("_DoC_WaitReady timed out.\n"); 258 return -EIO; 259 } 260 udelay(1); 261 cond_resched(); 262 } 263 } 264 265 return 0; 266 } 267 268 static inline int DoC_WaitReady(struct doc_priv *doc) 269 { 270 void __iomem *docptr = doc->virtadr; 271 int ret = 0; 272 273 if (DoC_is_MillenniumPlus(doc)) { 274 DoC_Delay(doc, 4); 275 276 if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) 277 /* Call the out-of-line routine to wait */ 278 ret = _DoC_WaitReady(doc); 279 } else { 280 DoC_Delay(doc, 4); 281 282 if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) 283 /* Call the out-of-line routine to wait */ 284 ret = _DoC_WaitReady(doc); 285 DoC_Delay(doc, 2); 286 } 287 288 if (debug) 289 printk("DoC_WaitReady OK\n"); 290 return ret; 291 } 292 293 static void doc2000_write_byte(struct mtd_info *mtd, u_char datum) 294 { 295 struct nand_chip *this = mtd_to_nand(mtd); 296 struct doc_priv *doc = nand_get_controller_data(this); 297 void __iomem *docptr = doc->virtadr; 298 299 if (debug) 300 printk("write_byte %02x\n", datum); 301 WriteDOC(datum, docptr, CDSNSlowIO); 302 WriteDOC(datum, docptr, 2k_CDSN_IO); 303 } 304 305 static u_char doc2000_read_byte(struct mtd_info *mtd) 306 { 307 struct nand_chip *this = mtd_to_nand(mtd); 308 struct doc_priv *doc = nand_get_controller_data(this); 309 void __iomem *docptr = doc->virtadr; 310 u_char ret; 311 312 ReadDOC(docptr, CDSNSlowIO); 313 DoC_Delay(doc, 2); 314 ret = ReadDOC(docptr, 2k_CDSN_IO); 315 if (debug) 316 printk("read_byte returns %02x\n", ret); 317 return ret; 318 } 319 320 static void doc2000_writebuf(struct mtd_info *mtd, const u_char *buf, int len) 321 { 322 struct nand_chip *this = mtd_to_nand(mtd); 323 struct doc_priv *doc = nand_get_controller_data(this); 324 void __iomem *docptr = doc->virtadr; 325 int i; 326 if (debug) 327 printk("writebuf of %d bytes: ", len); 328 for (i = 0; i < len; i++) { 329 WriteDOC_(buf[i], docptr, DoC_2k_CDSN_IO + i); 330 if (debug && i < 16) 331 printk("%02x ", buf[i]); 332 } 333 if (debug) 334 printk("\n"); 335 } 336 337 static void doc2000_readbuf(struct mtd_info *mtd, u_char *buf, int len) 338 { 339 struct nand_chip *this = mtd_to_nand(mtd); 340 struct doc_priv *doc = nand_get_controller_data(this); 341 void __iomem *docptr = doc->virtadr; 342 int i; 343 344 if (debug) 345 printk("readbuf of %d bytes: ", len); 346 347 for (i = 0; i < len; i++) { 348 buf[i] = ReadDOC(docptr, 2k_CDSN_IO + i); 349 } 350 } 351 352 static void doc2000_readbuf_dword(struct mtd_info *mtd, u_char *buf, int len) 353 { 354 struct nand_chip *this = mtd_to_nand(mtd); 355 struct doc_priv *doc = nand_get_controller_data(this); 356 void __iomem *docptr = doc->virtadr; 357 int i; 358 359 if (debug) 360 printk("readbuf_dword of %d bytes: ", len); 361 362 if (unlikely((((unsigned long)buf) | len) & 3)) { 363 for (i = 0; i < len; i++) { 364 *(uint8_t *) (&buf[i]) = ReadDOC(docptr, 2k_CDSN_IO + i); 365 } 366 } else { 367 for (i = 0; i < len; i += 4) { 368 *(uint32_t *) (&buf[i]) = readl(docptr + DoC_2k_CDSN_IO + i); 369 } 370 } 371 } 372 373 static uint16_t __init doc200x_ident_chip(struct mtd_info *mtd, int nr) 374 { 375 struct nand_chip *this = mtd_to_nand(mtd); 376 struct doc_priv *doc = nand_get_controller_data(this); 377 uint16_t ret; 378 379 doc200x_select_chip(mtd, nr); 380 doc200x_hwcontrol(mtd, NAND_CMD_READID, 381 NAND_CTRL_CLE | NAND_CTRL_CHANGE); 382 doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE); 383 doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); 384 385 /* We can't use dev_ready here, but at least we wait for the 386 * command to complete 387 */ 388 udelay(50); 389 390 ret = this->read_byte(mtd) << 8; 391 ret |= this->read_byte(mtd); 392 393 if (doc->ChipID == DOC_ChipID_Doc2k && try_dword && !nr) { 394 /* First chip probe. See if we get same results by 32-bit access */ 395 union { 396 uint32_t dword; 397 uint8_t byte[4]; 398 } ident; 399 void __iomem *docptr = doc->virtadr; 400 401 doc200x_hwcontrol(mtd, NAND_CMD_READID, 402 NAND_CTRL_CLE | NAND_CTRL_CHANGE); 403 doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE); 404 doc200x_hwcontrol(mtd, NAND_CMD_NONE, 405 NAND_NCE | NAND_CTRL_CHANGE); 406 407 udelay(50); 408 409 ident.dword = readl(docptr + DoC_2k_CDSN_IO); 410 if (((ident.byte[0] << 8) | ident.byte[1]) == ret) { 411 pr_info("DiskOnChip 2000 responds to DWORD access\n"); 412 this->read_buf = &doc2000_readbuf_dword; 413 } 414 } 415 416 return ret; 417 } 418 419 static void __init doc2000_count_chips(struct mtd_info *mtd) 420 { 421 struct nand_chip *this = mtd_to_nand(mtd); 422 struct doc_priv *doc = nand_get_controller_data(this); 423 uint16_t mfrid; 424 int i; 425 426 /* Max 4 chips per floor on DiskOnChip 2000 */ 427 doc->chips_per_floor = 4; 428 429 /* Find out what the first chip is */ 430 mfrid = doc200x_ident_chip(mtd, 0); 431 432 /* Find how many chips in each floor. */ 433 for (i = 1; i < 4; i++) { 434 if (doc200x_ident_chip(mtd, i) != mfrid) 435 break; 436 } 437 doc->chips_per_floor = i; 438 pr_debug("Detected %d chips per floor.\n", i); 439 } 440 441 static int doc200x_wait(struct mtd_info *mtd, struct nand_chip *this) 442 { 443 struct doc_priv *doc = nand_get_controller_data(this); 444 445 int status; 446 447 DoC_WaitReady(doc); 448 nand_status_op(this, NULL); 449 DoC_WaitReady(doc); 450 status = (int)this->read_byte(mtd); 451 452 return status; 453 } 454 455 static void doc2001_write_byte(struct mtd_info *mtd, u_char datum) 456 { 457 struct nand_chip *this = mtd_to_nand(mtd); 458 struct doc_priv *doc = nand_get_controller_data(this); 459 void __iomem *docptr = doc->virtadr; 460 461 WriteDOC(datum, docptr, CDSNSlowIO); 462 WriteDOC(datum, docptr, Mil_CDSN_IO); 463 WriteDOC(datum, docptr, WritePipeTerm); 464 } 465 466 static u_char doc2001_read_byte(struct mtd_info *mtd) 467 { 468 struct nand_chip *this = mtd_to_nand(mtd); 469 struct doc_priv *doc = nand_get_controller_data(this); 470 void __iomem *docptr = doc->virtadr; 471 472 //ReadDOC(docptr, CDSNSlowIO); 473 /* 11.4.5 -- delay twice to allow extended length cycle */ 474 DoC_Delay(doc, 2); 475 ReadDOC(docptr, ReadPipeInit); 476 //return ReadDOC(docptr, Mil_CDSN_IO); 477 return ReadDOC(docptr, LastDataRead); 478 } 479 480 static void doc2001_writebuf(struct mtd_info *mtd, const u_char *buf, int len) 481 { 482 struct nand_chip *this = mtd_to_nand(mtd); 483 struct doc_priv *doc = nand_get_controller_data(this); 484 void __iomem *docptr = doc->virtadr; 485 int i; 486 487 for (i = 0; i < len; i++) 488 WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i); 489 /* Terminate write pipeline */ 490 WriteDOC(0x00, docptr, WritePipeTerm); 491 } 492 493 static void doc2001_readbuf(struct mtd_info *mtd, u_char *buf, int len) 494 { 495 struct nand_chip *this = mtd_to_nand(mtd); 496 struct doc_priv *doc = nand_get_controller_data(this); 497 void __iomem *docptr = doc->virtadr; 498 int i; 499 500 /* Start read pipeline */ 501 ReadDOC(docptr, ReadPipeInit); 502 503 for (i = 0; i < len - 1; i++) 504 buf[i] = ReadDOC(docptr, Mil_CDSN_IO + (i & 0xff)); 505 506 /* Terminate read pipeline */ 507 buf[i] = ReadDOC(docptr, LastDataRead); 508 } 509 510 static u_char doc2001plus_read_byte(struct mtd_info *mtd) 511 { 512 struct nand_chip *this = mtd_to_nand(mtd); 513 struct doc_priv *doc = nand_get_controller_data(this); 514 void __iomem *docptr = doc->virtadr; 515 u_char ret; 516 517 ReadDOC(docptr, Mplus_ReadPipeInit); 518 ReadDOC(docptr, Mplus_ReadPipeInit); 519 ret = ReadDOC(docptr, Mplus_LastDataRead); 520 if (debug) 521 printk("read_byte returns %02x\n", ret); 522 return ret; 523 } 524 525 static void doc2001plus_writebuf(struct mtd_info *mtd, const u_char *buf, int len) 526 { 527 struct nand_chip *this = mtd_to_nand(mtd); 528 struct doc_priv *doc = nand_get_controller_data(this); 529 void __iomem *docptr = doc->virtadr; 530 int i; 531 532 if (debug) 533 printk("writebuf of %d bytes: ", len); 534 for (i = 0; i < len; i++) { 535 WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i); 536 if (debug && i < 16) 537 printk("%02x ", buf[i]); 538 } 539 if (debug) 540 printk("\n"); 541 } 542 543 static void doc2001plus_readbuf(struct mtd_info *mtd, u_char *buf, int len) 544 { 545 struct nand_chip *this = mtd_to_nand(mtd); 546 struct doc_priv *doc = nand_get_controller_data(this); 547 void __iomem *docptr = doc->virtadr; 548 int i; 549 550 if (debug) 551 printk("readbuf of %d bytes: ", len); 552 553 /* Start read pipeline */ 554 ReadDOC(docptr, Mplus_ReadPipeInit); 555 ReadDOC(docptr, Mplus_ReadPipeInit); 556 557 for (i = 0; i < len - 2; i++) { 558 buf[i] = ReadDOC(docptr, Mil_CDSN_IO); 559 if (debug && i < 16) 560 printk("%02x ", buf[i]); 561 } 562 563 /* Terminate read pipeline */ 564 buf[len - 2] = ReadDOC(docptr, Mplus_LastDataRead); 565 if (debug && i < 16) 566 printk("%02x ", buf[len - 2]); 567 buf[len - 1] = ReadDOC(docptr, Mplus_LastDataRead); 568 if (debug && i < 16) 569 printk("%02x ", buf[len - 1]); 570 if (debug) 571 printk("\n"); 572 } 573 574 static void doc2001plus_select_chip(struct mtd_info *mtd, int chip) 575 { 576 struct nand_chip *this = mtd_to_nand(mtd); 577 struct doc_priv *doc = nand_get_controller_data(this); 578 void __iomem *docptr = doc->virtadr; 579 int floor = 0; 580 581 if (debug) 582 printk("select chip (%d)\n", chip); 583 584 if (chip == -1) { 585 /* Disable flash internally */ 586 WriteDOC(0, docptr, Mplus_FlashSelect); 587 return; 588 } 589 590 floor = chip / doc->chips_per_floor; 591 chip -= (floor * doc->chips_per_floor); 592 593 /* Assert ChipEnable and deassert WriteProtect */ 594 WriteDOC((DOC_FLASH_CE), docptr, Mplus_FlashSelect); 595 nand_reset_op(this); 596 597 doc->curchip = chip; 598 doc->curfloor = floor; 599 } 600 601 static void doc200x_select_chip(struct mtd_info *mtd, int chip) 602 { 603 struct nand_chip *this = mtd_to_nand(mtd); 604 struct doc_priv *doc = nand_get_controller_data(this); 605 void __iomem *docptr = doc->virtadr; 606 int floor = 0; 607 608 if (debug) 609 printk("select chip (%d)\n", chip); 610 611 if (chip == -1) 612 return; 613 614 floor = chip / doc->chips_per_floor; 615 chip -= (floor * doc->chips_per_floor); 616 617 /* 11.4.4 -- deassert CE before changing chip */ 618 doc200x_hwcontrol(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE); 619 620 WriteDOC(floor, docptr, FloorSelect); 621 WriteDOC(chip, docptr, CDSNDeviceSelect); 622 623 doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); 624 625 doc->curchip = chip; 626 doc->curfloor = floor; 627 } 628 629 #define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE) 630 631 static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd, 632 unsigned int ctrl) 633 { 634 struct nand_chip *this = mtd_to_nand(mtd); 635 struct doc_priv *doc = nand_get_controller_data(this); 636 void __iomem *docptr = doc->virtadr; 637 638 if (ctrl & NAND_CTRL_CHANGE) { 639 doc->CDSNControl &= ~CDSN_CTRL_MSK; 640 doc->CDSNControl |= ctrl & CDSN_CTRL_MSK; 641 if (debug) 642 printk("hwcontrol(%d): %02x\n", cmd, doc->CDSNControl); 643 WriteDOC(doc->CDSNControl, docptr, CDSNControl); 644 /* 11.4.3 -- 4 NOPs after CSDNControl write */ 645 DoC_Delay(doc, 4); 646 } 647 if (cmd != NAND_CMD_NONE) { 648 if (DoC_is_2000(doc)) 649 doc2000_write_byte(mtd, cmd); 650 else 651 doc2001_write_byte(mtd, cmd); 652 } 653 } 654 655 static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int column, int page_addr) 656 { 657 struct nand_chip *this = mtd_to_nand(mtd); 658 struct doc_priv *doc = nand_get_controller_data(this); 659 void __iomem *docptr = doc->virtadr; 660 661 /* 662 * Must terminate write pipeline before sending any commands 663 * to the device. 664 */ 665 if (command == NAND_CMD_PAGEPROG) { 666 WriteDOC(0x00, docptr, Mplus_WritePipeTerm); 667 WriteDOC(0x00, docptr, Mplus_WritePipeTerm); 668 } 669 670 /* 671 * Write out the command to the device. 672 */ 673 if (command == NAND_CMD_SEQIN) { 674 int readcmd; 675 676 if (column >= mtd->writesize) { 677 /* OOB area */ 678 column -= mtd->writesize; 679 readcmd = NAND_CMD_READOOB; 680 } else if (column < 256) { 681 /* First 256 bytes --> READ0 */ 682 readcmd = NAND_CMD_READ0; 683 } else { 684 column -= 256; 685 readcmd = NAND_CMD_READ1; 686 } 687 WriteDOC(readcmd, docptr, Mplus_FlashCmd); 688 } 689 WriteDOC(command, docptr, Mplus_FlashCmd); 690 WriteDOC(0, docptr, Mplus_WritePipeTerm); 691 WriteDOC(0, docptr, Mplus_WritePipeTerm); 692 693 if (column != -1 || page_addr != -1) { 694 /* Serially input address */ 695 if (column != -1) { 696 /* Adjust columns for 16 bit buswidth */ 697 if (this->options & NAND_BUSWIDTH_16 && 698 !nand_opcode_8bits(command)) 699 column >>= 1; 700 WriteDOC(column, docptr, Mplus_FlashAddress); 701 } 702 if (page_addr != -1) { 703 WriteDOC((unsigned char)(page_addr & 0xff), docptr, Mplus_FlashAddress); 704 WriteDOC((unsigned char)((page_addr >> 8) & 0xff), docptr, Mplus_FlashAddress); 705 if (this->options & NAND_ROW_ADDR_3) { 706 WriteDOC((unsigned char)((page_addr >> 16) & 0x0f), docptr, Mplus_FlashAddress); 707 printk("high density\n"); 708 } 709 } 710 WriteDOC(0, docptr, Mplus_WritePipeTerm); 711 WriteDOC(0, docptr, Mplus_WritePipeTerm); 712 /* deassert ALE */ 713 if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 || 714 command == NAND_CMD_READOOB || command == NAND_CMD_READID) 715 WriteDOC(0, docptr, Mplus_FlashControl); 716 } 717 718 /* 719 * program and erase have their own busy handlers 720 * status and sequential in needs no delay 721 */ 722 switch (command) { 723 724 case NAND_CMD_PAGEPROG: 725 case NAND_CMD_ERASE1: 726 case NAND_CMD_ERASE2: 727 case NAND_CMD_SEQIN: 728 case NAND_CMD_STATUS: 729 return; 730 731 case NAND_CMD_RESET: 732 if (this->dev_ready) 733 break; 734 udelay(this->chip_delay); 735 WriteDOC(NAND_CMD_STATUS, docptr, Mplus_FlashCmd); 736 WriteDOC(0, docptr, Mplus_WritePipeTerm); 737 WriteDOC(0, docptr, Mplus_WritePipeTerm); 738 while (!(this->read_byte(mtd) & 0x40)) ; 739 return; 740 741 /* This applies to read commands */ 742 default: 743 /* 744 * If we don't have access to the busy pin, we apply the given 745 * command delay 746 */ 747 if (!this->dev_ready) { 748 udelay(this->chip_delay); 749 return; 750 } 751 } 752 753 /* Apply this short delay always to ensure that we do wait tWB in 754 * any case on any machine. */ 755 ndelay(100); 756 /* wait until command is processed */ 757 while (!this->dev_ready(mtd)) ; 758 } 759 760 static int doc200x_dev_ready(struct mtd_info *mtd) 761 { 762 struct nand_chip *this = mtd_to_nand(mtd); 763 struct doc_priv *doc = nand_get_controller_data(this); 764 void __iomem *docptr = doc->virtadr; 765 766 if (DoC_is_MillenniumPlus(doc)) { 767 /* 11.4.2 -- must NOP four times before checking FR/B# */ 768 DoC_Delay(doc, 4); 769 if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) { 770 if (debug) 771 printk("not ready\n"); 772 return 0; 773 } 774 if (debug) 775 printk("was ready\n"); 776 return 1; 777 } else { 778 /* 11.4.2 -- must NOP four times before checking FR/B# */ 779 DoC_Delay(doc, 4); 780 if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) { 781 if (debug) 782 printk("not ready\n"); 783 return 0; 784 } 785 /* 11.4.2 -- Must NOP twice if it's ready */ 786 DoC_Delay(doc, 2); 787 if (debug) 788 printk("was ready\n"); 789 return 1; 790 } 791 } 792 793 static int doc200x_block_bad(struct mtd_info *mtd, loff_t ofs) 794 { 795 /* This is our last resort if we couldn't find or create a BBT. Just 796 pretend all blocks are good. */ 797 return 0; 798 } 799 800 static void doc200x_enable_hwecc(struct mtd_info *mtd, int mode) 801 { 802 struct nand_chip *this = mtd_to_nand(mtd); 803 struct doc_priv *doc = nand_get_controller_data(this); 804 void __iomem *docptr = doc->virtadr; 805 806 /* Prime the ECC engine */ 807 switch (mode) { 808 case NAND_ECC_READ: 809 WriteDOC(DOC_ECC_RESET, docptr, ECCConf); 810 WriteDOC(DOC_ECC_EN, docptr, ECCConf); 811 break; 812 case NAND_ECC_WRITE: 813 WriteDOC(DOC_ECC_RESET, docptr, ECCConf); 814 WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf); 815 break; 816 } 817 } 818 819 static void doc2001plus_enable_hwecc(struct mtd_info *mtd, int mode) 820 { 821 struct nand_chip *this = mtd_to_nand(mtd); 822 struct doc_priv *doc = nand_get_controller_data(this); 823 void __iomem *docptr = doc->virtadr; 824 825 /* Prime the ECC engine */ 826 switch (mode) { 827 case NAND_ECC_READ: 828 WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf); 829 WriteDOC(DOC_ECC_EN, docptr, Mplus_ECCConf); 830 break; 831 case NAND_ECC_WRITE: 832 WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf); 833 WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, Mplus_ECCConf); 834 break; 835 } 836 } 837 838 /* This code is only called on write */ 839 static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, unsigned char *ecc_code) 840 { 841 struct nand_chip *this = mtd_to_nand(mtd); 842 struct doc_priv *doc = nand_get_controller_data(this); 843 void __iomem *docptr = doc->virtadr; 844 int i; 845 int emptymatch = 1; 846 847 /* flush the pipeline */ 848 if (DoC_is_2000(doc)) { 849 WriteDOC(doc->CDSNControl & ~CDSN_CTRL_FLASH_IO, docptr, CDSNControl); 850 WriteDOC(0, docptr, 2k_CDSN_IO); 851 WriteDOC(0, docptr, 2k_CDSN_IO); 852 WriteDOC(0, docptr, 2k_CDSN_IO); 853 WriteDOC(doc->CDSNControl, docptr, CDSNControl); 854 } else if (DoC_is_MillenniumPlus(doc)) { 855 WriteDOC(0, docptr, Mplus_NOP); 856 WriteDOC(0, docptr, Mplus_NOP); 857 WriteDOC(0, docptr, Mplus_NOP); 858 } else { 859 WriteDOC(0, docptr, NOP); 860 WriteDOC(0, docptr, NOP); 861 WriteDOC(0, docptr, NOP); 862 } 863 864 for (i = 0; i < 6; i++) { 865 if (DoC_is_MillenniumPlus(doc)) 866 ecc_code[i] = ReadDOC_(docptr, DoC_Mplus_ECCSyndrome0 + i); 867 else 868 ecc_code[i] = ReadDOC_(docptr, DoC_ECCSyndrome0 + i); 869 if (ecc_code[i] != empty_write_ecc[i]) 870 emptymatch = 0; 871 } 872 if (DoC_is_MillenniumPlus(doc)) 873 WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf); 874 else 875 WriteDOC(DOC_ECC_DIS, docptr, ECCConf); 876 #if 0 877 /* If emptymatch=1, we might have an all-0xff data buffer. Check. */ 878 if (emptymatch) { 879 /* Note: this somewhat expensive test should not be triggered 880 often. It could be optimized away by examining the data in 881 the writebuf routine, and remembering the result. */ 882 for (i = 0; i < 512; i++) { 883 if (dat[i] == 0xff) 884 continue; 885 emptymatch = 0; 886 break; 887 } 888 } 889 /* If emptymatch still =1, we do have an all-0xff data buffer. 890 Return all-0xff ecc value instead of the computed one, so 891 it'll look just like a freshly-erased page. */ 892 if (emptymatch) 893 memset(ecc_code, 0xff, 6); 894 #endif 895 return 0; 896 } 897 898 static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat, 899 u_char *read_ecc, u_char *isnull) 900 { 901 int i, ret = 0; 902 struct nand_chip *this = mtd_to_nand(mtd); 903 struct doc_priv *doc = nand_get_controller_data(this); 904 void __iomem *docptr = doc->virtadr; 905 uint8_t calc_ecc[6]; 906 volatile u_char dummy; 907 908 /* flush the pipeline */ 909 if (DoC_is_2000(doc)) { 910 dummy = ReadDOC(docptr, 2k_ECCStatus); 911 dummy = ReadDOC(docptr, 2k_ECCStatus); 912 dummy = ReadDOC(docptr, 2k_ECCStatus); 913 } else if (DoC_is_MillenniumPlus(doc)) { 914 dummy = ReadDOC(docptr, Mplus_ECCConf); 915 dummy = ReadDOC(docptr, Mplus_ECCConf); 916 dummy = ReadDOC(docptr, Mplus_ECCConf); 917 } else { 918 dummy = ReadDOC(docptr, ECCConf); 919 dummy = ReadDOC(docptr, ECCConf); 920 dummy = ReadDOC(docptr, ECCConf); 921 } 922 923 /* Error occurred ? */ 924 if (dummy & 0x80) { 925 for (i = 0; i < 6; i++) { 926 if (DoC_is_MillenniumPlus(doc)) 927 calc_ecc[i] = ReadDOC_(docptr, DoC_Mplus_ECCSyndrome0 + i); 928 else 929 calc_ecc[i] = ReadDOC_(docptr, DoC_ECCSyndrome0 + i); 930 } 931 932 ret = doc_ecc_decode(doc->rs_decoder, dat, calc_ecc); 933 if (ret > 0) 934 pr_err("doc200x_correct_data corrected %d errors\n", 935 ret); 936 } 937 if (DoC_is_MillenniumPlus(doc)) 938 WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf); 939 else 940 WriteDOC(DOC_ECC_DIS, docptr, ECCConf); 941 if (no_ecc_failures && mtd_is_eccerr(ret)) { 942 pr_err("suppressing ECC failure\n"); 943 ret = 0; 944 } 945 return ret; 946 } 947 948 //u_char mydatabuf[528]; 949 950 static int doc200x_ooblayout_ecc(struct mtd_info *mtd, int section, 951 struct mtd_oob_region *oobregion) 952 { 953 if (section) 954 return -ERANGE; 955 956 oobregion->offset = 0; 957 oobregion->length = 6; 958 959 return 0; 960 } 961 962 static int doc200x_ooblayout_free(struct mtd_info *mtd, int section, 963 struct mtd_oob_region *oobregion) 964 { 965 if (section > 1) 966 return -ERANGE; 967 968 /* 969 * The strange out-of-order free bytes definition is a (possibly 970 * unneeded) attempt to retain compatibility. It used to read: 971 * .oobfree = { {8, 8} } 972 * Since that leaves two bytes unusable, it was changed. But the 973 * following scheme might affect existing jffs2 installs by moving the 974 * cleanmarker: 975 * .oobfree = { {6, 10} } 976 * jffs2 seems to handle the above gracefully, but the current scheme 977 * seems safer. The only problem with it is that any code retrieving 978 * free bytes position must be able to handle out-of-order segments. 979 */ 980 if (!section) { 981 oobregion->offset = 8; 982 oobregion->length = 8; 983 } else { 984 oobregion->offset = 6; 985 oobregion->length = 2; 986 } 987 988 return 0; 989 } 990 991 static const struct mtd_ooblayout_ops doc200x_ooblayout_ops = { 992 .ecc = doc200x_ooblayout_ecc, 993 .free = doc200x_ooblayout_free, 994 }; 995 996 /* Find the (I)NFTL Media Header, and optionally also the mirror media header. 997 On successful return, buf will contain a copy of the media header for 998 further processing. id is the string to scan for, and will presumably be 999 either "ANAND" or "BNAND". If findmirror=1, also look for the mirror media 1000 header. The page #s of the found media headers are placed in mh0_page and 1001 mh1_page in the DOC private structure. */ 1002 static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const char *id, int findmirror) 1003 { 1004 struct nand_chip *this = mtd_to_nand(mtd); 1005 struct doc_priv *doc = nand_get_controller_data(this); 1006 unsigned offs; 1007 int ret; 1008 size_t retlen; 1009 1010 for (offs = 0; offs < mtd->size; offs += mtd->erasesize) { 1011 ret = mtd_read(mtd, offs, mtd->writesize, &retlen, buf); 1012 if (retlen != mtd->writesize) 1013 continue; 1014 if (ret) { 1015 pr_warn("ECC error scanning DOC at 0x%x\n", offs); 1016 } 1017 if (memcmp(buf, id, 6)) 1018 continue; 1019 pr_info("Found DiskOnChip %s Media Header at 0x%x\n", id, offs); 1020 if (doc->mh0_page == -1) { 1021 doc->mh0_page = offs >> this->page_shift; 1022 if (!findmirror) 1023 return 1; 1024 continue; 1025 } 1026 doc->mh1_page = offs >> this->page_shift; 1027 return 2; 1028 } 1029 if (doc->mh0_page == -1) { 1030 pr_warn("DiskOnChip %s Media Header not found.\n", id); 1031 return 0; 1032 } 1033 /* Only one mediaheader was found. We want buf to contain a 1034 mediaheader on return, so we'll have to re-read the one we found. */ 1035 offs = doc->mh0_page << this->page_shift; 1036 ret = mtd_read(mtd, offs, mtd->writesize, &retlen, buf); 1037 if (retlen != mtd->writesize) { 1038 /* Insanity. Give up. */ 1039 pr_err("Read DiskOnChip Media Header once, but can't reread it???\n"); 1040 return 0; 1041 } 1042 return 1; 1043 } 1044 1045 static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts) 1046 { 1047 struct nand_chip *this = mtd_to_nand(mtd); 1048 struct doc_priv *doc = nand_get_controller_data(this); 1049 int ret = 0; 1050 u_char *buf; 1051 struct NFTLMediaHeader *mh; 1052 const unsigned psize = 1 << this->page_shift; 1053 int numparts = 0; 1054 unsigned blocks, maxblocks; 1055 int offs, numheaders; 1056 1057 buf = kmalloc(mtd->writesize, GFP_KERNEL); 1058 if (!buf) { 1059 return 0; 1060 } 1061 if (!(numheaders = find_media_headers(mtd, buf, "ANAND", 1))) 1062 goto out; 1063 mh = (struct NFTLMediaHeader *)buf; 1064 1065 le16_to_cpus(&mh->NumEraseUnits); 1066 le16_to_cpus(&mh->FirstPhysicalEUN); 1067 le32_to_cpus(&mh->FormattedSize); 1068 1069 pr_info(" DataOrgID = %s\n" 1070 " NumEraseUnits = %d\n" 1071 " FirstPhysicalEUN = %d\n" 1072 " FormattedSize = %d\n" 1073 " UnitSizeFactor = %d\n", 1074 mh->DataOrgID, mh->NumEraseUnits, 1075 mh->FirstPhysicalEUN, mh->FormattedSize, 1076 mh->UnitSizeFactor); 1077 1078 blocks = mtd->size >> this->phys_erase_shift; 1079 maxblocks = min(32768U, mtd->erasesize - psize); 1080 1081 if (mh->UnitSizeFactor == 0x00) { 1082 /* Auto-determine UnitSizeFactor. The constraints are: 1083 - There can be at most 32768 virtual blocks. 1084 - There can be at most (virtual block size - page size) 1085 virtual blocks (because MediaHeader+BBT must fit in 1). 1086 */ 1087 mh->UnitSizeFactor = 0xff; 1088 while (blocks > maxblocks) { 1089 blocks >>= 1; 1090 maxblocks = min(32768U, (maxblocks << 1) + psize); 1091 mh->UnitSizeFactor--; 1092 } 1093 pr_warn("UnitSizeFactor=0x00 detected. Correct value is assumed to be 0x%02x.\n", mh->UnitSizeFactor); 1094 } 1095 1096 /* NOTE: The lines below modify internal variables of the NAND and MTD 1097 layers; variables with have already been configured by nand_scan. 1098 Unfortunately, we didn't know before this point what these values 1099 should be. Thus, this code is somewhat dependent on the exact 1100 implementation of the NAND layer. */ 1101 if (mh->UnitSizeFactor != 0xff) { 1102 this->bbt_erase_shift += (0xff - mh->UnitSizeFactor); 1103 mtd->erasesize <<= (0xff - mh->UnitSizeFactor); 1104 pr_info("Setting virtual erase size to %d\n", mtd->erasesize); 1105 blocks = mtd->size >> this->bbt_erase_shift; 1106 maxblocks = min(32768U, mtd->erasesize - psize); 1107 } 1108 1109 if (blocks > maxblocks) { 1110 pr_err("UnitSizeFactor of 0x%02x is inconsistent with device size. Aborting.\n", mh->UnitSizeFactor); 1111 goto out; 1112 } 1113 1114 /* Skip past the media headers. */ 1115 offs = max(doc->mh0_page, doc->mh1_page); 1116 offs <<= this->page_shift; 1117 offs += mtd->erasesize; 1118 1119 if (show_firmware_partition == 1) { 1120 parts[0].name = " DiskOnChip Firmware / Media Header partition"; 1121 parts[0].offset = 0; 1122 parts[0].size = offs; 1123 numparts = 1; 1124 } 1125 1126 parts[numparts].name = " DiskOnChip BDTL partition"; 1127 parts[numparts].offset = offs; 1128 parts[numparts].size = (mh->NumEraseUnits - numheaders) << this->bbt_erase_shift; 1129 1130 offs += parts[numparts].size; 1131 numparts++; 1132 1133 if (offs < mtd->size) { 1134 parts[numparts].name = " DiskOnChip Remainder partition"; 1135 parts[numparts].offset = offs; 1136 parts[numparts].size = mtd->size - offs; 1137 numparts++; 1138 } 1139 1140 ret = numparts; 1141 out: 1142 kfree(buf); 1143 return ret; 1144 } 1145 1146 /* This is a stripped-down copy of the code in inftlmount.c */ 1147 static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts) 1148 { 1149 struct nand_chip *this = mtd_to_nand(mtd); 1150 struct doc_priv *doc = nand_get_controller_data(this); 1151 int ret = 0; 1152 u_char *buf; 1153 struct INFTLMediaHeader *mh; 1154 struct INFTLPartition *ip; 1155 int numparts = 0; 1156 int blocks; 1157 int vshift, lastvunit = 0; 1158 int i; 1159 int end = mtd->size; 1160 1161 if (inftl_bbt_write) 1162 end -= (INFTL_BBT_RESERVED_BLOCKS << this->phys_erase_shift); 1163 1164 buf = kmalloc(mtd->writesize, GFP_KERNEL); 1165 if (!buf) { 1166 return 0; 1167 } 1168 1169 if (!find_media_headers(mtd, buf, "BNAND", 0)) 1170 goto out; 1171 doc->mh1_page = doc->mh0_page + (4096 >> this->page_shift); 1172 mh = (struct INFTLMediaHeader *)buf; 1173 1174 le32_to_cpus(&mh->NoOfBootImageBlocks); 1175 le32_to_cpus(&mh->NoOfBinaryPartitions); 1176 le32_to_cpus(&mh->NoOfBDTLPartitions); 1177 le32_to_cpus(&mh->BlockMultiplierBits); 1178 le32_to_cpus(&mh->FormatFlags); 1179 le32_to_cpus(&mh->PercentUsed); 1180 1181 pr_info(" bootRecordID = %s\n" 1182 " NoOfBootImageBlocks = %d\n" 1183 " NoOfBinaryPartitions = %d\n" 1184 " NoOfBDTLPartitions = %d\n" 1185 " BlockMultiplerBits = %d\n" 1186 " FormatFlgs = %d\n" 1187 " OsakVersion = %d.%d.%d.%d\n" 1188 " PercentUsed = %d\n", 1189 mh->bootRecordID, mh->NoOfBootImageBlocks, 1190 mh->NoOfBinaryPartitions, 1191 mh->NoOfBDTLPartitions, 1192 mh->BlockMultiplierBits, mh->FormatFlags, 1193 ((unsigned char *) &mh->OsakVersion)[0] & 0xf, 1194 ((unsigned char *) &mh->OsakVersion)[1] & 0xf, 1195 ((unsigned char *) &mh->OsakVersion)[2] & 0xf, 1196 ((unsigned char *) &mh->OsakVersion)[3] & 0xf, 1197 mh->PercentUsed); 1198 1199 vshift = this->phys_erase_shift + mh->BlockMultiplierBits; 1200 1201 blocks = mtd->size >> vshift; 1202 if (blocks > 32768) { 1203 pr_err("BlockMultiplierBits=%d is inconsistent with device size. Aborting.\n", mh->BlockMultiplierBits); 1204 goto out; 1205 } 1206 1207 blocks = doc->chips_per_floor << (this->chip_shift - this->phys_erase_shift); 1208 if (inftl_bbt_write && (blocks > mtd->erasesize)) { 1209 pr_err("Writeable BBTs spanning more than one erase block are not yet supported. FIX ME!\n"); 1210 goto out; 1211 } 1212 1213 /* Scan the partitions */ 1214 for (i = 0; (i < 4); i++) { 1215 ip = &(mh->Partitions[i]); 1216 le32_to_cpus(&ip->virtualUnits); 1217 le32_to_cpus(&ip->firstUnit); 1218 le32_to_cpus(&ip->lastUnit); 1219 le32_to_cpus(&ip->flags); 1220 le32_to_cpus(&ip->spareUnits); 1221 le32_to_cpus(&ip->Reserved0); 1222 1223 pr_info(" PARTITION[%d] ->\n" 1224 " virtualUnits = %d\n" 1225 " firstUnit = %d\n" 1226 " lastUnit = %d\n" 1227 " flags = 0x%x\n" 1228 " spareUnits = %d\n", 1229 i, ip->virtualUnits, ip->firstUnit, 1230 ip->lastUnit, ip->flags, 1231 ip->spareUnits); 1232 1233 if ((show_firmware_partition == 1) && 1234 (i == 0) && (ip->firstUnit > 0)) { 1235 parts[0].name = " DiskOnChip IPL / Media Header partition"; 1236 parts[0].offset = 0; 1237 parts[0].size = mtd->erasesize * ip->firstUnit; 1238 numparts = 1; 1239 } 1240 1241 if (ip->flags & INFTL_BINARY) 1242 parts[numparts].name = " DiskOnChip BDK partition"; 1243 else 1244 parts[numparts].name = " DiskOnChip BDTL partition"; 1245 parts[numparts].offset = ip->firstUnit << vshift; 1246 parts[numparts].size = (1 + ip->lastUnit - ip->firstUnit) << vshift; 1247 numparts++; 1248 if (ip->lastUnit > lastvunit) 1249 lastvunit = ip->lastUnit; 1250 if (ip->flags & INFTL_LAST) 1251 break; 1252 } 1253 lastvunit++; 1254 if ((lastvunit << vshift) < end) { 1255 parts[numparts].name = " DiskOnChip Remainder partition"; 1256 parts[numparts].offset = lastvunit << vshift; 1257 parts[numparts].size = end - parts[numparts].offset; 1258 numparts++; 1259 } 1260 ret = numparts; 1261 out: 1262 kfree(buf); 1263 return ret; 1264 } 1265 1266 static int __init nftl_scan_bbt(struct mtd_info *mtd) 1267 { 1268 int ret, numparts; 1269 struct nand_chip *this = mtd_to_nand(mtd); 1270 struct doc_priv *doc = nand_get_controller_data(this); 1271 struct mtd_partition parts[2]; 1272 1273 memset((char *)parts, 0, sizeof(parts)); 1274 /* On NFTL, we have to find the media headers before we can read the 1275 BBTs, since they're stored in the media header eraseblocks. */ 1276 numparts = nftl_partscan(mtd, parts); 1277 if (!numparts) 1278 return -EIO; 1279 this->bbt_td->options = NAND_BBT_ABSPAGE | NAND_BBT_8BIT | 1280 NAND_BBT_SAVECONTENT | NAND_BBT_WRITE | 1281 NAND_BBT_VERSION; 1282 this->bbt_td->veroffs = 7; 1283 this->bbt_td->pages[0] = doc->mh0_page + 1; 1284 if (doc->mh1_page != -1) { 1285 this->bbt_md->options = NAND_BBT_ABSPAGE | NAND_BBT_8BIT | 1286 NAND_BBT_SAVECONTENT | NAND_BBT_WRITE | 1287 NAND_BBT_VERSION; 1288 this->bbt_md->veroffs = 7; 1289 this->bbt_md->pages[0] = doc->mh1_page + 1; 1290 } else { 1291 this->bbt_md = NULL; 1292 } 1293 1294 ret = this->scan_bbt(mtd); 1295 if (ret) 1296 return ret; 1297 1298 return mtd_device_register(mtd, parts, no_autopart ? 0 : numparts); 1299 } 1300 1301 static int __init inftl_scan_bbt(struct mtd_info *mtd) 1302 { 1303 int ret, numparts; 1304 struct nand_chip *this = mtd_to_nand(mtd); 1305 struct doc_priv *doc = nand_get_controller_data(this); 1306 struct mtd_partition parts[5]; 1307 1308 if (this->numchips > doc->chips_per_floor) { 1309 pr_err("Multi-floor INFTL devices not yet supported.\n"); 1310 return -EIO; 1311 } 1312 1313 if (DoC_is_MillenniumPlus(doc)) { 1314 this->bbt_td->options = NAND_BBT_2BIT | NAND_BBT_ABSPAGE; 1315 if (inftl_bbt_write) 1316 this->bbt_td->options |= NAND_BBT_WRITE; 1317 this->bbt_td->pages[0] = 2; 1318 this->bbt_md = NULL; 1319 } else { 1320 this->bbt_td->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION; 1321 if (inftl_bbt_write) 1322 this->bbt_td->options |= NAND_BBT_WRITE; 1323 this->bbt_td->offs = 8; 1324 this->bbt_td->len = 8; 1325 this->bbt_td->veroffs = 7; 1326 this->bbt_td->maxblocks = INFTL_BBT_RESERVED_BLOCKS; 1327 this->bbt_td->reserved_block_code = 0x01; 1328 this->bbt_td->pattern = "MSYS_BBT"; 1329 1330 this->bbt_md->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION; 1331 if (inftl_bbt_write) 1332 this->bbt_md->options |= NAND_BBT_WRITE; 1333 this->bbt_md->offs = 8; 1334 this->bbt_md->len = 8; 1335 this->bbt_md->veroffs = 7; 1336 this->bbt_md->maxblocks = INFTL_BBT_RESERVED_BLOCKS; 1337 this->bbt_md->reserved_block_code = 0x01; 1338 this->bbt_md->pattern = "TBB_SYSM"; 1339 } 1340 1341 ret = this->scan_bbt(mtd); 1342 if (ret) 1343 return ret; 1344 1345 memset((char *)parts, 0, sizeof(parts)); 1346 numparts = inftl_partscan(mtd, parts); 1347 /* At least for now, require the INFTL Media Header. We could probably 1348 do without it for non-INFTL use, since all it gives us is 1349 autopartitioning, but I want to give it more thought. */ 1350 if (!numparts) 1351 return -EIO; 1352 return mtd_device_register(mtd, parts, no_autopart ? 0 : numparts); 1353 } 1354 1355 static inline int __init doc2000_init(struct mtd_info *mtd) 1356 { 1357 struct nand_chip *this = mtd_to_nand(mtd); 1358 struct doc_priv *doc = nand_get_controller_data(this); 1359 1360 this->read_byte = doc2000_read_byte; 1361 this->write_buf = doc2000_writebuf; 1362 this->read_buf = doc2000_readbuf; 1363 doc->late_init = nftl_scan_bbt; 1364 1365 doc->CDSNControl = CDSN_CTRL_FLASH_IO | CDSN_CTRL_ECC_IO; 1366 doc2000_count_chips(mtd); 1367 mtd->name = "DiskOnChip 2000 (NFTL Model)"; 1368 return (4 * doc->chips_per_floor); 1369 } 1370 1371 static inline int __init doc2001_init(struct mtd_info *mtd) 1372 { 1373 struct nand_chip *this = mtd_to_nand(mtd); 1374 struct doc_priv *doc = nand_get_controller_data(this); 1375 1376 this->read_byte = doc2001_read_byte; 1377 this->write_buf = doc2001_writebuf; 1378 this->read_buf = doc2001_readbuf; 1379 1380 ReadDOC(doc->virtadr, ChipID); 1381 ReadDOC(doc->virtadr, ChipID); 1382 ReadDOC(doc->virtadr, ChipID); 1383 if (ReadDOC(doc->virtadr, ChipID) != DOC_ChipID_DocMil) { 1384 /* It's not a Millennium; it's one of the newer 1385 DiskOnChip 2000 units with a similar ASIC. 1386 Treat it like a Millennium, except that it 1387 can have multiple chips. */ 1388 doc2000_count_chips(mtd); 1389 mtd->name = "DiskOnChip 2000 (INFTL Model)"; 1390 doc->late_init = inftl_scan_bbt; 1391 return (4 * doc->chips_per_floor); 1392 } else { 1393 /* Bog-standard Millennium */ 1394 doc->chips_per_floor = 1; 1395 mtd->name = "DiskOnChip Millennium"; 1396 doc->late_init = nftl_scan_bbt; 1397 return 1; 1398 } 1399 } 1400 1401 static inline int __init doc2001plus_init(struct mtd_info *mtd) 1402 { 1403 struct nand_chip *this = mtd_to_nand(mtd); 1404 struct doc_priv *doc = nand_get_controller_data(this); 1405 1406 this->read_byte = doc2001plus_read_byte; 1407 this->write_buf = doc2001plus_writebuf; 1408 this->read_buf = doc2001plus_readbuf; 1409 doc->late_init = inftl_scan_bbt; 1410 this->cmd_ctrl = NULL; 1411 this->select_chip = doc2001plus_select_chip; 1412 this->cmdfunc = doc2001plus_command; 1413 this->ecc.hwctl = doc2001plus_enable_hwecc; 1414 1415 doc->chips_per_floor = 1; 1416 mtd->name = "DiskOnChip Millennium Plus"; 1417 1418 return 1; 1419 } 1420 1421 static int __init doc_probe(unsigned long physadr) 1422 { 1423 struct nand_chip *nand = NULL; 1424 struct doc_priv *doc = NULL; 1425 unsigned char ChipID; 1426 struct mtd_info *mtd; 1427 void __iomem *virtadr; 1428 unsigned char save_control; 1429 unsigned char tmp, tmpb, tmpc; 1430 int reg, len, numchips; 1431 int ret = 0; 1432 1433 if (!request_mem_region(physadr, DOC_IOREMAP_LEN, "DiskOnChip")) 1434 return -EBUSY; 1435 virtadr = ioremap(physadr, DOC_IOREMAP_LEN); 1436 if (!virtadr) { 1437 pr_err("Diskonchip ioremap failed: 0x%x bytes at 0x%lx\n", 1438 DOC_IOREMAP_LEN, physadr); 1439 ret = -EIO; 1440 goto error_ioremap; 1441 } 1442 1443 /* It's not possible to cleanly detect the DiskOnChip - the 1444 * bootup procedure will put the device into reset mode, and 1445 * it's not possible to talk to it without actually writing 1446 * to the DOCControl register. So we store the current contents 1447 * of the DOCControl register's location, in case we later decide 1448 * that it's not a DiskOnChip, and want to put it back how we 1449 * found it. 1450 */ 1451 save_control = ReadDOC(virtadr, DOCControl); 1452 1453 /* Reset the DiskOnChip ASIC */ 1454 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl); 1455 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl); 1456 1457 /* Enable the DiskOnChip ASIC */ 1458 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl); 1459 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl); 1460 1461 ChipID = ReadDOC(virtadr, ChipID); 1462 1463 switch (ChipID) { 1464 case DOC_ChipID_Doc2k: 1465 reg = DoC_2k_ECCStatus; 1466 break; 1467 case DOC_ChipID_DocMil: 1468 reg = DoC_ECCConf; 1469 break; 1470 case DOC_ChipID_DocMilPlus16: 1471 case DOC_ChipID_DocMilPlus32: 1472 case 0: 1473 /* Possible Millennium Plus, need to do more checks */ 1474 /* Possibly release from power down mode */ 1475 for (tmp = 0; (tmp < 4); tmp++) 1476 ReadDOC(virtadr, Mplus_Power); 1477 1478 /* Reset the Millennium Plus ASIC */ 1479 tmp = DOC_MODE_RESET | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT; 1480 WriteDOC(tmp, virtadr, Mplus_DOCControl); 1481 WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm); 1482 1483 usleep_range(1000, 2000); 1484 /* Enable the Millennium Plus ASIC */ 1485 tmp = DOC_MODE_NORMAL | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT; 1486 WriteDOC(tmp, virtadr, Mplus_DOCControl); 1487 WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm); 1488 usleep_range(1000, 2000); 1489 1490 ChipID = ReadDOC(virtadr, ChipID); 1491 1492 switch (ChipID) { 1493 case DOC_ChipID_DocMilPlus16: 1494 reg = DoC_Mplus_Toggle; 1495 break; 1496 case DOC_ChipID_DocMilPlus32: 1497 pr_err("DiskOnChip Millennium Plus 32MB is not supported, ignoring.\n"); 1498 default: 1499 ret = -ENODEV; 1500 goto notfound; 1501 } 1502 break; 1503 1504 default: 1505 ret = -ENODEV; 1506 goto notfound; 1507 } 1508 /* Check the TOGGLE bit in the ECC register */ 1509 tmp = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT; 1510 tmpb = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT; 1511 tmpc = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT; 1512 if ((tmp == tmpb) || (tmp != tmpc)) { 1513 pr_warn("Possible DiskOnChip at 0x%lx failed TOGGLE test, dropping.\n", physadr); 1514 ret = -ENODEV; 1515 goto notfound; 1516 } 1517 1518 for (mtd = doclist; mtd; mtd = doc->nextdoc) { 1519 unsigned char oldval; 1520 unsigned char newval; 1521 nand = mtd_to_nand(mtd); 1522 doc = nand_get_controller_data(nand); 1523 /* Use the alias resolution register to determine if this is 1524 in fact the same DOC aliased to a new address. If writes 1525 to one chip's alias resolution register change the value on 1526 the other chip, they're the same chip. */ 1527 if (ChipID == DOC_ChipID_DocMilPlus16) { 1528 oldval = ReadDOC(doc->virtadr, Mplus_AliasResolution); 1529 newval = ReadDOC(virtadr, Mplus_AliasResolution); 1530 } else { 1531 oldval = ReadDOC(doc->virtadr, AliasResolution); 1532 newval = ReadDOC(virtadr, AliasResolution); 1533 } 1534 if (oldval != newval) 1535 continue; 1536 if (ChipID == DOC_ChipID_DocMilPlus16) { 1537 WriteDOC(~newval, virtadr, Mplus_AliasResolution); 1538 oldval = ReadDOC(doc->virtadr, Mplus_AliasResolution); 1539 WriteDOC(newval, virtadr, Mplus_AliasResolution); // restore it 1540 } else { 1541 WriteDOC(~newval, virtadr, AliasResolution); 1542 oldval = ReadDOC(doc->virtadr, AliasResolution); 1543 WriteDOC(newval, virtadr, AliasResolution); // restore it 1544 } 1545 newval = ~newval; 1546 if (oldval == newval) { 1547 pr_debug("Found alias of DOC at 0x%lx to 0x%lx\n", 1548 doc->physadr, physadr); 1549 goto notfound; 1550 } 1551 } 1552 1553 pr_notice("DiskOnChip found at 0x%lx\n", physadr); 1554 1555 len = sizeof(struct nand_chip) + sizeof(struct doc_priv) + 1556 (2 * sizeof(struct nand_bbt_descr)); 1557 nand = kzalloc(len, GFP_KERNEL); 1558 if (!nand) { 1559 ret = -ENOMEM; 1560 goto fail; 1561 } 1562 1563 1564 /* 1565 * Allocate a RS codec instance 1566 * 1567 * Symbolsize is 10 (bits) 1568 * Primitve polynomial is x^10+x^3+1 1569 * First consecutive root is 510 1570 * Primitve element to generate roots = 1 1571 * Generator polinomial degree = 4 1572 */ 1573 doc = (struct doc_priv *) (nand + 1); 1574 doc->rs_decoder = init_rs(10, 0x409, FCR, 1, NROOTS); 1575 if (!doc->rs_decoder) { 1576 pr_err("DiskOnChip: Could not create a RS codec\n"); 1577 ret = -ENOMEM; 1578 goto fail; 1579 } 1580 1581 mtd = nand_to_mtd(nand); 1582 nand->bbt_td = (struct nand_bbt_descr *) (doc + 1); 1583 nand->bbt_md = nand->bbt_td + 1; 1584 1585 mtd->owner = THIS_MODULE; 1586 mtd_set_ooblayout(mtd, &doc200x_ooblayout_ops); 1587 1588 nand_set_controller_data(nand, doc); 1589 nand->select_chip = doc200x_select_chip; 1590 nand->cmd_ctrl = doc200x_hwcontrol; 1591 nand->dev_ready = doc200x_dev_ready; 1592 nand->waitfunc = doc200x_wait; 1593 nand->block_bad = doc200x_block_bad; 1594 nand->ecc.hwctl = doc200x_enable_hwecc; 1595 nand->ecc.calculate = doc200x_calculate_ecc; 1596 nand->ecc.correct = doc200x_correct_data; 1597 1598 nand->ecc.mode = NAND_ECC_HW_SYNDROME; 1599 nand->ecc.size = 512; 1600 nand->ecc.bytes = 6; 1601 nand->ecc.strength = 2; 1602 nand->ecc.options = NAND_ECC_GENERIC_ERASED_CHECK; 1603 nand->bbt_options = NAND_BBT_USE_FLASH; 1604 /* Skip the automatic BBT scan so we can run it manually */ 1605 nand->options |= NAND_SKIP_BBTSCAN; 1606 1607 doc->physadr = physadr; 1608 doc->virtadr = virtadr; 1609 doc->ChipID = ChipID; 1610 doc->curfloor = -1; 1611 doc->curchip = -1; 1612 doc->mh0_page = -1; 1613 doc->mh1_page = -1; 1614 doc->nextdoc = doclist; 1615 1616 if (ChipID == DOC_ChipID_Doc2k) 1617 numchips = doc2000_init(mtd); 1618 else if (ChipID == DOC_ChipID_DocMilPlus16) 1619 numchips = doc2001plus_init(mtd); 1620 else 1621 numchips = doc2001_init(mtd); 1622 1623 if ((ret = nand_scan(mtd, numchips)) || (ret = doc->late_init(mtd))) { 1624 /* DBB note: i believe nand_release is necessary here, as 1625 buffers may have been allocated in nand_base. Check with 1626 Thomas. FIX ME! */ 1627 /* nand_release will call mtd_device_unregister, but we 1628 haven't yet added it. This is handled without incident by 1629 mtd_device_unregister, as far as I can tell. */ 1630 nand_release(mtd); 1631 goto fail; 1632 } 1633 1634 /* Success! */ 1635 doclist = mtd; 1636 return 0; 1637 1638 notfound: 1639 /* Put back the contents of the DOCControl register, in case it's not 1640 actually a DiskOnChip. */ 1641 WriteDOC(save_control, virtadr, DOCControl); 1642 fail: 1643 if (doc) 1644 free_rs(doc->rs_decoder); 1645 kfree(nand); 1646 iounmap(virtadr); 1647 1648 error_ioremap: 1649 release_mem_region(physadr, DOC_IOREMAP_LEN); 1650 1651 return ret; 1652 } 1653 1654 static void release_nanddoc(void) 1655 { 1656 struct mtd_info *mtd, *nextmtd; 1657 struct nand_chip *nand; 1658 struct doc_priv *doc; 1659 1660 for (mtd = doclist; mtd; mtd = nextmtd) { 1661 nand = mtd_to_nand(mtd); 1662 doc = nand_get_controller_data(nand); 1663 1664 nextmtd = doc->nextdoc; 1665 nand_release(mtd); 1666 iounmap(doc->virtadr); 1667 release_mem_region(doc->physadr, DOC_IOREMAP_LEN); 1668 free_rs(doc->rs_decoder); 1669 kfree(nand); 1670 } 1671 } 1672 1673 static int __init init_nanddoc(void) 1674 { 1675 int i, ret = 0; 1676 1677 if (doc_config_location) { 1678 pr_info("Using configured DiskOnChip probe address 0x%lx\n", 1679 doc_config_location); 1680 ret = doc_probe(doc_config_location); 1681 if (ret < 0) 1682 return ret; 1683 } else { 1684 for (i = 0; (doc_locations[i] != 0xffffffff); i++) { 1685 doc_probe(doc_locations[i]); 1686 } 1687 } 1688 /* No banner message any more. Print a message if no DiskOnChip 1689 found, so the user knows we at least tried. */ 1690 if (!doclist) { 1691 pr_info("No valid DiskOnChip devices found\n"); 1692 ret = -ENODEV; 1693 } 1694 return ret; 1695 } 1696 1697 static void __exit cleanup_nanddoc(void) 1698 { 1699 /* Cleanup the nand/DoC resources */ 1700 release_nanddoc(); 1701 } 1702 1703 module_init(init_nanddoc); 1704 module_exit(cleanup_nanddoc); 1705 1706 MODULE_LICENSE("GPL"); 1707 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>"); 1708 MODULE_DESCRIPTION("M-Systems DiskOnChip 2000, Millennium and Millennium Plus device driver"); 1709