Skip to content

Commit 85632c1

Browse files
Abhishek Sahumiquelraynal
authored andcommitted
mtd: rawnand: qcom: code reorganization for raw read
Make separate function to perform raw read for one codeword and call this function multiple times for each codeword in case of raw page read. This separate function will help in subsequent patches related with erased codeword bitflip detection. It will decrease throughput for raw page read. Raw page read is used for debug purpose so it won't affect normal flash operations. Signed-off-by: Abhishek Sahu <absahu@codeaurora.org> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
1 parent 5bc36b2 commit 85632c1

File tree

1 file changed

+78
-68
lines changed

1 file changed

+78
-68
lines changed

drivers/mtd/nand/raw/qcom_nandc.c

Lines changed: 78 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,6 +1587,74 @@ static int check_flash_errors(struct qcom_nand_host *host, int cw_cnt)
15871587
return 0;
15881588
}
15891589

1590+
/* performs raw read for one codeword */
1591+
static int
1592+
qcom_nandc_read_cw_raw(struct mtd_info *mtd, struct nand_chip *chip,
1593+
u8 *data_buf, u8 *oob_buf, int page, int cw)
1594+
{
1595+
struct qcom_nand_host *host = to_qcom_nand_host(chip);
1596+
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
1597+
struct nand_ecc_ctrl *ecc = &chip->ecc;
1598+
int data_size1, data_size2, oob_size1, oob_size2;
1599+
int ret, reg_off = FLASH_BUF_ACC, read_loc = 0;
1600+
1601+
nand_read_page_op(chip, page, 0, NULL, 0);
1602+
host->use_ecc = false;
1603+
1604+
clear_bam_transaction(nandc);
1605+
set_address(host, host->cw_size * cw, page);
1606+
update_rw_regs(host, 1, true);
1607+
config_nand_page_read(nandc);
1608+
1609+
data_size1 = mtd->writesize - host->cw_size * (ecc->steps - 1);
1610+
oob_size1 = host->bbm_size;
1611+
1612+
if (cw == (ecc->steps - 1)) {
1613+
data_size2 = ecc->size - data_size1 -
1614+
((ecc->steps - 1) * 4);
1615+
oob_size2 = (ecc->steps * 4) + host->ecc_bytes_hw +
1616+
host->spare_bytes;
1617+
} else {
1618+
data_size2 = host->cw_data - data_size1;
1619+
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
1620+
}
1621+
1622+
if (nandc->props->is_bam) {
1623+
nandc_set_read_loc(nandc, 0, read_loc, data_size1, 0);
1624+
read_loc += data_size1;
1625+
1626+
nandc_set_read_loc(nandc, 1, read_loc, oob_size1, 0);
1627+
read_loc += oob_size1;
1628+
1629+
nandc_set_read_loc(nandc, 2, read_loc, data_size2, 0);
1630+
read_loc += data_size2;
1631+
1632+
nandc_set_read_loc(nandc, 3, read_loc, oob_size2, 1);
1633+
}
1634+
1635+
config_nand_cw_read(nandc, false);
1636+
1637+
read_data_dma(nandc, reg_off, data_buf, data_size1, 0);
1638+
reg_off += data_size1;
1639+
1640+
read_data_dma(nandc, reg_off, oob_buf, oob_size1, 0);
1641+
reg_off += oob_size1;
1642+
1643+
read_data_dma(nandc, reg_off, data_buf + data_size1, data_size2, 0);
1644+
reg_off += data_size2;
1645+
1646+
read_data_dma(nandc, reg_off, oob_buf + oob_size1, oob_size2, 0);
1647+
1648+
ret = submit_descs(nandc);
1649+
free_descs(nandc);
1650+
if (ret) {
1651+
dev_err(nandc->dev, "failure to read raw cw %d\n", cw);
1652+
return ret;
1653+
}
1654+
1655+
return check_flash_errors(host, 1);
1656+
}
1657+
15901658
/*
15911659
* reads back status registers set by the controller to notify page read
15921660
* errors. this is equivalent to what 'ecc->correct()' would do.
@@ -1851,79 +1919,21 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd,
18511919
int oob_required, int page)
18521920
{
18531921
struct qcom_nand_host *host = to_qcom_nand_host(chip);
1854-
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
1855-
u8 *data_buf, *oob_buf;
18561922
struct nand_ecc_ctrl *ecc = &chip->ecc;
1857-
int i, ret;
1858-
int read_loc;
1923+
int cw, ret;
1924+
u8 *data_buf = buf, *oob_buf = chip->oob_poi;
18591925

1860-
nand_read_page_op(chip, page, 0, NULL, 0);
1861-
data_buf = buf;
1862-
oob_buf = chip->oob_poi;
1863-
1864-
host->use_ecc = false;
1865-
1866-
clear_bam_transaction(nandc);
1867-
update_rw_regs(host, ecc->steps, true);
1868-
config_nand_page_read(nandc);
1869-
1870-
for (i = 0; i < ecc->steps; i++) {
1871-
int data_size1, data_size2, oob_size1, oob_size2;
1872-
int reg_off = FLASH_BUF_ACC;
1873-
1874-
data_size1 = mtd->writesize - host->cw_size * (ecc->steps - 1);
1875-
oob_size1 = host->bbm_size;
1876-
1877-
if (i == (ecc->steps - 1)) {
1878-
data_size2 = ecc->size - data_size1 -
1879-
((ecc->steps - 1) << 2);
1880-
oob_size2 = (ecc->steps << 2) + host->ecc_bytes_hw +
1881-
host->spare_bytes;
1882-
} else {
1883-
data_size2 = host->cw_data - data_size1;
1884-
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
1885-
}
1886-
1887-
if (nandc->props->is_bam) {
1888-
read_loc = 0;
1889-
nandc_set_read_loc(nandc, 0, read_loc, data_size1, 0);
1890-
read_loc += data_size1;
1891-
1892-
nandc_set_read_loc(nandc, 1, read_loc, oob_size1, 0);
1893-
read_loc += oob_size1;
1894-
1895-
nandc_set_read_loc(nandc, 2, read_loc, data_size2, 0);
1896-
read_loc += data_size2;
1897-
1898-
nandc_set_read_loc(nandc, 3, read_loc, oob_size2, 1);
1899-
}
1900-
1901-
config_nand_cw_read(nandc, false);
1902-
1903-
read_data_dma(nandc, reg_off, data_buf, data_size1, 0);
1904-
reg_off += data_size1;
1905-
data_buf += data_size1;
1906-
1907-
read_data_dma(nandc, reg_off, oob_buf, oob_size1, 0);
1908-
reg_off += oob_size1;
1909-
oob_buf += oob_size1;
1910-
1911-
read_data_dma(nandc, reg_off, data_buf, data_size2, 0);
1912-
reg_off += data_size2;
1913-
data_buf += data_size2;
1926+
for (cw = 0; cw < ecc->steps; cw++) {
1927+
ret = qcom_nandc_read_cw_raw(mtd, chip, data_buf, oob_buf,
1928+
page, cw);
1929+
if (ret)
1930+
return ret;
19141931

1915-
read_data_dma(nandc, reg_off, oob_buf, oob_size2, 0);
1916-
oob_buf += oob_size2;
1932+
data_buf += host->cw_data;
1933+
oob_buf += ecc->bytes;
19171934
}
19181935

1919-
ret = submit_descs(nandc);
1920-
free_descs(nandc);
1921-
if (ret) {
1922-
dev_err(nandc->dev, "failure to read raw page\n");
1923-
return ret;
1924-
}
1925-
1926-
return check_flash_errors(host, ecc->steps);
1936+
return 0;
19271937
}
19281938

19291939
/* implements ecc->read_oob() */

0 commit comments

Comments
 (0)