23 #include <linux/wait.h>
25 #include <linux/slab.h>
26 #include <linux/pci.h>
28 #include <linux/module.h>
37 #define NAND_DEFAULT_TIMINGS -1
42 " -1 indicates use default timings");
44 #define DENALI_NAND_NAME "denali-nand"
48 #define DENALI_IRQ_ALL (INTR_STATUS__DMA_CMD_COMP | \
49 INTR_STATUS__ECC_TRANSACTION_DONE | \
50 INTR_STATUS__ECC_ERR | \
51 INTR_STATUS__PROGRAM_FAIL | \
52 INTR_STATUS__LOAD_COMP | \
53 INTR_STATUS__PROGRAM_COMP | \
54 INTR_STATUS__TIME_OUT | \
55 INTR_STATUS__ERASE_FAIL | \
56 INTR_STATUS__RST_COMP | \
57 INTR_STATUS__ERASE_COMP)
61 #define CHIP_SELECT_INVALID -1
63 #define SUPPORT_8BITECC 1
67 #define CEIL_DIV(X, Y) (((X)%(Y)) ? ((X)/(Y)+1) : ((X)/(Y)))
72 #define mtd_to_denali(m) container_of(m, struct denali_nand_info, mtd)
76 #define SPARE_ACCESS 0x41
77 #define MAIN_ACCESS 0x42
78 #define MAIN_SPARE_ACCESS 0x43
81 #define DENALI_WRITE 0x100
84 #define COMMAND_CYCLE 0
86 #define STATUS_CYCLE 2
90 #define BANK(x) ((x) << 24)
132 denali->
buf.head = denali->
buf.tail = 0;
153 write_byte_to_buf(denali, 0);
163 clear_interrupts(denali);
167 irq_status = wait_for_irq(denali, irq_mask);
178 dev_dbg(denali->
dev,
"%s, Line %d, Function: %s\n",
179 __FILE__, __LINE__, __func__);
185 for (i = 0 ; i < denali->
max_banks; i++) {
194 "NAND Reset operation timed out on bank %d\n", i);
211 uint16_t Trea[6] = {40, 30, 25, 20, 20, 16};
212 uint16_t Trp[6] = {50, 25, 17, 15, 12, 10};
213 uint16_t Treh[6] = {30, 15, 15, 10, 10, 7};
214 uint16_t Trc[6] = {100, 50, 35, 30, 25, 20};
215 uint16_t Trhoh[6] = {0, 15, 15, 15, 15, 15};
216 uint16_t Trloh[6] = {0, 0, 0, 0, 5, 5};
217 uint16_t Tcea[6] = {100, 45, 30, 25, 25, 25};
218 uint16_t Tadl[6] = {200, 100, 100, 100, 70, 70};
219 uint16_t Trhw[6] = {200, 100, 100, 100, 100, 100};
220 uint16_t Trhz[6] = {200, 100, 100, 100, 100, 100};
221 uint16_t Twhr[6] = {120, 80, 80, 60, 60, 60};
222 uint16_t Tcs[6] = {70, 35, 25, 25, 20, 15};
225 uint16_t data_invalid_rhoh, data_invalid_rloh, data_invalid;
229 uint16_t addr_2_data, re_2_we, re_2_re, we_2_re, cs_cnt;
231 dev_dbg(denali->
dev,
"%s, Line %d, Function: %s\n",
232 __FILE__, __LINE__, __func__);
237 if ((en_hi *
CLK_X) < (Treh[mode] + 2))
241 if ((en_lo + en_hi) * CLK_X < Trc[mode])
242 en_lo +=
CEIL_DIV((Trc[mode] - (en_lo + en_hi) * CLK_X), CLK_X);
247 while (dv_window < 8) {
248 data_invalid_rhoh = en_lo * CLK_X + Trhoh[
mode];
250 data_invalid_rloh = (en_lo + en_hi) * CLK_X + Trloh[mode];
254 data_invalid_rloh ? data_invalid_rhoh : data_invalid_rloh;
256 dv_window = data_invalid - Trea[
mode];
262 acc_clks =
CEIL_DIV(Trea[mode], CLK_X);
264 while (((acc_clks * CLK_X) - Trea[mode]) < 3)
267 if ((data_invalid - acc_clks * CLK_X) < 2)
271 addr_2_data =
CEIL_DIV(Tadl[mode], CLK_X);
272 re_2_we =
CEIL_DIV(Trhw[mode], CLK_X);
273 re_2_re =
CEIL_DIV(Trhz[mode], CLK_X);
274 we_2_re =
CEIL_DIV(Twhr[mode], CLK_X);
275 cs_cnt =
CEIL_DIV((Tcs[mode] - Trp[mode]), CLK_X);
277 cs_cnt =
CEIL_DIV(Tcs[mode], CLK_X);
282 while (((cs_cnt * CLK_X) + Trea[mode]) < Tcea[mode])
317 for (i = 5; i > 0; i--) {
323 nand_onfi_timing_set(denali, i);
336 if (device_id == 0xd3) {
363 #elif SUPPORT_8BITECC
391 #elif SUPPORT_8BITECC
397 "Spectra: Unknown Hynix NAND (Device ID: 0x%x)."
398 "Will use default parameter values instead.\n",
412 for (i = 0; i < denali->
max_banks; i++) {
415 index_addr_read_data(denali,
419 "Return 1st ID for bank[%d]: %x\n", i,
id[i]);
422 if (!(
id[i] & 0x0ff))
425 if ((
id[i] & 0x0ff) == (
id[0] & 0x0ff))
439 "Sorry, Intel CE4100 only supports "
440 "a single NAND device.\n");
490 "%s, Line %d, Function: %s\n",
491 __FILE__, __LINE__, __func__);
499 index_addr(denali, (
uint32_t)addr | 0, 0x90);
500 index_addr(denali, (
uint32_t)addr | 1, 0);
501 for (i = 0; i < 5; i++)
502 index_addr_read_data(denali, addr | 2, &id_bytes[i]);
503 maf_id = id_bytes[0];
504 device_id = id_bytes[1];
508 if (
FAIL == get_onfi_nand_para(denali))
510 }
else if (maf_id == 0xEC) {
511 get_samsung_nand_para(denali, device_id);
512 }
else if (maf_id == 0x98) {
513 get_toshiba_nand_para(denali);
514 }
else if (maf_id == 0xAD) {
515 get_hynix_nand_para(denali, device_id);
519 "Dump timing register values:"
520 "acc_clks: %d, re_2_we: %d, re_2_re: %d\n"
521 "we_2_re: %d, addr_2_data: %d, rdwr_en_lo_cnt: %d\n"
522 "rdwr_en_hi_cnt: %d, cs_setup_cnt: %d\n",
532 find_valid_banks(denali);
534 detect_partition_feature(denali);
540 nand_onfi_timing_set(denali, onfi_timing_mode);
548 dev_dbg(denali->
dev,
"%s, Line %d, Function: %s\n",
549 __FILE__, __LINE__, __func__);
560 static inline bool is_flash_bank_valid(
int flash_bank)
562 return (flash_bank >= 0 && flash_bank < 4);
571 denali_set_intr_modes(denali,
false);
579 denali_irq_enable(denali, int_mask);
584 denali_set_intr_modes(denali,
false);
621 status = read_interrupt_status(denali);
622 clear_interrupt(denali, status);
652 if (is_flash_bank_valid(denali->
flash_bank)) {
655 irq_status = denali_irq_detected(denali);
656 if (irq_status != 0) {
659 clear_interrupt(denali, irq_status);
672 #define BANK(x) ((x) << 24)
676 unsigned long comp_res = 0;
687 if (intr_status & irq_mask) {
698 }
while (comp_res != 0);
703 intr_status, irq_mask);
712 static void setup_ecc_for_xfer(
struct denali_nand_info *denali,
bool ecc_en,
715 int ecc_en_flag = 0, transfer_spare_flag = 0;
737 uint32_t addr = 0x0, cmd = 0x0, page_count = 1, irq_status = 0,
747 setup_ecc_for_xfer(denali, ecc_en, transfer_spare);
750 clear_interrupts(denali);
760 index_addr(denali, (
uint32_t)cmd, access_type);
767 index_addr(denali, (
uint32_t)cmd, access_type);
778 0x2000 | op | page_count);
784 irq_status = wait_for_irq(denali, irq_mask);
786 if (irq_status == 0) {
788 "cmd, page, addr on timeout "
789 "(0x%x, 0x%x, 0x%x)\n",
790 cmd, denali->
page, addr);
814 for (i = 0; i < len / 4; i++)
838 for (i = 0; i < len / 4; i++)
854 if (denali_send_pipeline_cmd(denali,
false,
false,
SPARE_ACCESS,
856 write_data_to_flash_mem(denali, buf, mtd->
oobsize);
859 irq_status = wait_for_irq(denali, irq_mask);
861 if (irq_status == 0) {
866 dev_err(denali->
dev,
"unable to send pipeline command\n");
873 static void read_oob_data(
struct mtd_info *mtd,
uint8_t *buf,
int page)
877 irq_status = 0, addr = 0x0, cmd = 0x0;
881 if (denali_send_pipeline_cmd(denali,
false,
true,
SPARE_ACCESS,
883 read_data_from_flash_mem(denali, buf, mtd->
oobsize);
888 irq_status = wait_for_irq(denali, irq_mask);
891 dev_err(denali->
dev,
"page on OOB timeout %d\n",
912 for (i = 0; i < len; i++)
917 #define ECC_SECTOR_SIZE 512
919 #define ECC_SECTOR(x) (((x) & ECC_ERROR_ADDRESS__SECTOR_NR) >> 12)
920 #define ECC_BYTE(x) (((x) & ECC_ERROR_ADDRESS__OFFSET))
921 #define ECC_CORRECTION_VALUE(x) ((x) & ERR_CORRECTION_INFO__BYTEMASK)
922 #define ECC_ERROR_CORRECTABLE(x) (!((x) & ERR_CORRECTION_INFO__ERROR_TYPE))
923 #define ECC_ERR_DEVICE(x) (((x) & ERR_CORRECTION_INFO__DEVICE_NR) >> 8)
924 #define ECC_LAST_ERR(x) ((x) & ERR_CORRECTION_INFO__LAST_ERR_INFO)
927 uint32_t irq_status,
unsigned int *max_bitflips)
929 bool check_erased_page =
false;
930 unsigned int bitflips = 0;
934 uint32_t err_address = 0, err_correction_info = 0;
935 uint32_t err_byte = 0, err_sector = 0, err_device = 0;
937 denali_set_intr_modes(denali,
false);
947 err_correction_value =
961 offset = (err_sector *
967 buf[offset] ^= err_correction_value;
968 denali->
mtd.ecc_stats.corrected++;
976 check_erased_page =
true;
983 while (!(read_interrupt_status(denali) &
986 clear_interrupts(denali);
987 denali_set_intr_modes(denali,
true);
989 *max_bitflips = bitflips;
990 return check_erased_page;
1009 const int page_count = 1;
1017 index_addr(denali, mode | denali->
page, 0x2000 | op | page_count);
1020 index_addr(denali, mode | ((
uint16_t)(addr >> 16) << 8), 0x2200);
1023 index_addr(denali, mode | ((
uint16_t)addr << 8), 0x2300);
1026 index_addr(denali, mode | 0x14000, 0x2400);
1032 const uint8_t *buf,
bool raw_xfer)
1037 size_t size = denali->
mtd.writesize + denali->
mtd.oobsize;
1048 setup_ecc_for_xfer(denali, !raw_xfer, raw_xfer);
1062 clear_interrupts(denali);
1063 denali_enable_dma(denali,
true);
1068 irq_status = wait_for_irq(denali, irq_mask);
1070 if (irq_status == 0) {
1072 "timeout on write_page (type = %d)\n",
1079 denali_enable_dma(denali,
false);
1092 const uint8_t *buf,
int oob_required)
1096 return write_page(mtd, chip, buf,
false);
1104 const uint8_t *buf,
int oob_required)
1108 return write_page(mtd, chip, buf,
true);
1114 return write_oob_data(mtd, chip->
oob_poi, page);
1120 read_oob_data(mtd, chip->
oob_poi, page);
1126 uint8_t *buf,
int oob_required,
int page)
1128 unsigned int max_bitflips;
1132 size_t size = denali->
mtd.writesize + denali->
mtd.oobsize;
1137 bool check_erased_page =
false;
1139 if (page != denali->
page) {
1141 " equal to denali->page %d, investigate!!",
1142 __func__, page, denali->
page);
1146 setup_ecc_for_xfer(denali,
true,
false);
1148 denali_enable_dma(denali,
true);
1151 clear_interrupts(denali);
1155 irq_status = wait_for_irq(denali, irq_mask);
1161 check_erased_page = handle_ecc(denali, buf, irq_status, &max_bitflips);
1162 denali_enable_dma(denali,
false);
1164 if (check_erased_page) {
1168 if (check_erased_page) {
1170 denali->
mtd.ecc_stats.failed++;
1172 denali->
mtd.ecc_stats.failed++;
1175 return max_bitflips;
1179 uint8_t *buf,
int oob_required,
int page)
1184 size_t size = denali->
mtd.writesize + denali->
mtd.oobsize;
1189 if (page != denali->
page) {
1191 " equal to denali->page %d, investigate!!",
1192 __func__, page, denali->
page);
1196 setup_ecc_for_xfer(denali,
false,
true);
1197 denali_enable_dma(denali,
true);
1201 clear_interrupts(denali);
1205 irq_status = wait_for_irq(denali, irq_mask);
1209 denali_enable_dma(denali,
false);
1222 if (denali->
buf.head < denali->
buf.tail)
1223 result = denali->
buf.buf[denali->
buf.head++];
1228 static void denali_select_chip(
struct mtd_info *mtd,
int chip)
1234 spin_unlock_irq(&denali->
irq_lock);
1240 int status = denali->
status;
1246 static void denali_erase(
struct mtd_info *mtd,
int page)
1250 uint32_t cmd = 0x0, irq_status = 0;
1253 clear_interrupts(denali);
1257 index_addr(denali, (
uint32_t)cmd, 0x1);
1267 static void denali_cmdfunc(
struct mtd_info *mtd,
unsigned int cmd,
int col,
1278 read_status(denali);
1288 index_addr(denali, (
uint32_t)addr | 0, 0x90);
1289 index_addr(denali, (
uint32_t)addr | 1, 0);
1290 for (i = 0; i < 5; i++) {
1291 index_addr_read_data(denali,
1294 write_byte_to_buf(denali,
id);
1309 " received 0x%x\n", cmd);
1320 "denali_ecc_calculate called unexpectedly\n");
1330 "denali_ecc_correct called unexpectedly\n");
1335 static void denali_ecc_hwctl(
struct mtd_info *mtd,
int mode)
1339 "denali_ecc_hwctl called unexpectedly\n");
1354 detect_max_banks(denali);
1355 denali_nand_reset(denali);
1365 denali_nand_timing_set(denali);
1366 denali_irq_init(denali);
1373 #define ECC_8BITS 14
1378 #define ECC_15BITS 26
1383 static uint8_t bbt_pattern[] = {
'B',
'b',
't',
'0' };
1384 static uint8_t mirror_pattern[] = {
'1',
't',
'b',
'B' };
1393 .pattern = bbt_pattern,
1403 .pattern = mirror_pattern,
1414 init_completion(&denali->
complete);
1433 unsigned long csr_len, mem_len;
1436 denali = kzalloc(
sizeof(*denali),
GFP_KERNEL);
1443 goto failed_alloc_memery;
1450 if (onfi_timing_mode < -1 || onfi_timing_mode > 1) {
1452 " ONFI timing mode 1 or below\n");
1454 goto failed_enable_dev;
1468 mem_base = csr_base + csr_len;
1477 goto failed_enable_dev;
1484 dev_err(&dev->
dev,
"Spectra: failed to map DMA buffer\n");
1485 goto failed_enable_dev;
1490 denali->
mtd.dev.parent = &dev->
dev;
1495 goto failed_dma_map;
1502 goto failed_req_regions;
1509 goto failed_remap_reg;
1512 denali_hw_init(denali);
1521 goto failed_remap_mem;
1525 denali_set_intr_modes(denali,
true);
1527 pci_set_drvdata(dev, denali);
1529 denali->
mtd.name =
"denali-nand";
1531 denali->
mtd.priv = &denali->
nand;
1534 denali->
nand.select_chip = denali_select_chip;
1535 denali->
nand.cmdfunc = denali_cmdfunc;
1536 denali->
nand.read_byte = denali_read_byte;
1537 denali->
nand.waitfunc = denali_waitfunc;
1544 goto failed_req_irq;
1554 goto failed_req_irq;
1563 denali->
nand.chipsize <<= (denali->
devnum - 1);
1564 denali->
nand.page_shift += (denali->
devnum - 1);
1565 denali->
nand.pagemask = (denali->
nand.chipsize >>
1566 denali->
nand.page_shift) - 1;
1567 denali->
nand.bbt_erase_shift += (denali->
devnum - 1);
1568 denali->
nand.phys_erase_shift = denali->
nand.bbt_erase_shift;
1569 denali->
nand.chip_shift += (denali->
devnum - 1);
1570 denali->
mtd.writesize <<= (denali->
devnum - 1);
1571 denali->
mtd.oobsize <<= (denali->
devnum - 1);
1572 denali->
mtd.erasesize <<= (denali->
devnum - 1);
1573 denali->
mtd.size = denali->
nand.numchips * denali->
nand.chipsize;
1581 denali->
nand.bbt_td = &bbt_main_descr;
1582 denali->
nand.bbt_md = &bbt_mirror_descr;
1593 if (denali->
nand.cellinfo & 0
xc &&
1598 denali->
nand.ecc.strength = 15;
1599 denali->
nand.ecc.layout = &nand_15bit_oob;
1606 " contain 8bit ECC correction codes");
1607 goto failed_req_irq;
1609 denali->
nand.ecc.strength = 8;
1610 denali->
nand.ecc.layout = &nand_8bit_oob;
1617 denali->
nand.ecc.layout->eccbytes *=
1619 denali->
nand.ecc.layout->oobfree[0].offset =
1621 denali->
nand.ecc.layout->oobfree[0].length =
1622 denali->
mtd.oobsize - denali->
nand.ecc.layout->eccbytes -
1631 denali->
nand.phys_erase_shift;
1637 denali->
nand.ecc.calculate = denali_ecc_calculate;
1638 denali->
nand.ecc.correct = denali_ecc_correct;
1639 denali->
nand.ecc.hwctl = denali_ecc_hwctl;
1643 denali->
nand.ecc.read_page = denali_read_page;
1644 denali->
nand.ecc.read_page_raw = denali_read_page_raw;
1645 denali->
nand.ecc.write_page = denali_write_page;
1646 denali->
nand.ecc.write_page_raw = denali_write_page_raw;
1647 denali->
nand.ecc.read_oob = denali_read_oob;
1648 denali->
nand.ecc.write_oob = denali_write_oob;
1649 denali->
nand.erase_cmd = denali_erase;
1653 goto failed_req_irq;
1658 dev_err(&dev->
dev,
"Spectra: Failed to register MTD: %d\n",
1660 goto failed_req_irq;
1665 denali_irq_cleanup(dev->
irq, denali);
1677 failed_alloc_memery:
1683 static void denali_pci_remove(
struct pci_dev *dev)
1689 denali_irq_cleanup(dev->
irq, denali);
1697 pci_set_drvdata(dev,
NULL);
1703 static struct pci_driver denali_pci_driver = {
1705 .id_table = denali_pci_ids,
1706 .probe = denali_pci_probe,
1707 .remove = denali_pci_remove,