2022-04-07 02:05:25 +00:00
|
|
|
From eb4a2d282c3c5752211d69be6dff2674119e5583 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
|
|
Date: Thu, 27 Jan 2022 10:18:03 +0100
|
|
|
|
Subject: [PATCH 09/15] mtd: spinand: Create direct mapping descriptors for ECC
|
|
|
|
operations
|
|
|
|
|
|
|
|
In order for pipelined ECC engines to be able to enable/disable the ECC
|
|
|
|
engine only when needed and avoid races when future parallel-operations
|
|
|
|
will be supported, we need to provide the information about the use of
|
|
|
|
the ECC engine in the direct mapping hooks. As direct mapping
|
|
|
|
configurations are meant to be static, it is best to create two new
|
|
|
|
mappings: one for regular 'raw' accesses and one for accesses involving
|
|
|
|
correction. It is up to the driver to use or not the new ECC enable
|
|
|
|
boolean contained in the spi-mem operation.
|
|
|
|
|
|
|
|
As dirmaps are not free (they consume a few pages of MMIO address space)
|
|
|
|
and because these extra entries are only meant to be used by pipelined
|
|
|
|
engines, let's limit their use to this specific type of engine and save
|
|
|
|
a bit of memory with all the other setups.
|
|
|
|
|
|
|
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
|
|
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
|
|
|
|
Link: https://lore.kernel.org/linux-mtd/20220127091808.1043392-9-miquel.raynal@bootlin.com
|
|
|
|
(cherry picked from commit f9d7c7265bcff7d9a17425a8cddf702e8fe159c2)
|
|
|
|
---
|
|
|
|
drivers/mtd/nand/spi/core.c | 35 +++++++++++++++++++++++++++++++++--
|
|
|
|
include/linux/mtd/spinand.h | 2 ++
|
|
|
|
2 files changed, 35 insertions(+), 2 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/mtd/nand/spi/core.c
|
|
|
|
+++ b/drivers/mtd/nand/spi/core.c
|
2022-04-30 14:17:46 +00:00
|
|
|
@@ -381,7 +381,10 @@ static int spinand_read_from_cache_op(st
|
2022-04-07 02:05:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- rdesc = spinand->dirmaps[req->pos.plane].rdesc;
|
|
|
|
+ if (req->mode == MTD_OPS_RAW)
|
|
|
|
+ rdesc = spinand->dirmaps[req->pos.plane].rdesc;
|
|
|
|
+ else
|
|
|
|
+ rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc;
|
|
|
|
|
|
|
|
while (nbytes) {
|
|
|
|
ret = spi_mem_dirmap_read(rdesc, column, nbytes, buf);
|
2022-04-30 14:17:46 +00:00
|
|
|
@@ -452,7 +455,10 @@ static int spinand_write_to_cache_op(str
|
2022-04-07 02:05:25 +00:00
|
|
|
req->ooblen);
|
|
|
|
}
|
|
|
|
|
|
|
|
- wdesc = spinand->dirmaps[req->pos.plane].wdesc;
|
|
|
|
+ if (req->mode == MTD_OPS_RAW)
|
|
|
|
+ wdesc = spinand->dirmaps[req->pos.plane].wdesc;
|
|
|
|
+ else
|
|
|
|
+ wdesc = spinand->dirmaps[req->pos.plane].wdesc_ecc;
|
|
|
|
|
|
|
|
while (nbytes) {
|
|
|
|
ret = spi_mem_dirmap_write(wdesc, column, nbytes, buf);
|
2022-04-30 14:17:46 +00:00
|
|
|
@@ -865,6 +871,31 @@ static int spinand_create_dirmap(struct
|
2022-04-07 02:05:25 +00:00
|
|
|
|
|
|
|
spinand->dirmaps[plane].rdesc = desc;
|
|
|
|
|
|
|
|
+ if (nand->ecc.engine->integration != NAND_ECC_ENGINE_INTEGRATION_PIPELINED) {
|
|
|
|
+ spinand->dirmaps[plane].wdesc_ecc = spinand->dirmaps[plane].wdesc;
|
|
|
|
+ spinand->dirmaps[plane].rdesc_ecc = spinand->dirmaps[plane].rdesc;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ info.op_tmpl = *spinand->op_templates.update_cache;
|
|
|
|
+ info.op_tmpl.data.ecc = true;
|
|
|
|
+ desc = devm_spi_mem_dirmap_create(&spinand->spimem->spi->dev,
|
|
|
|
+ spinand->spimem, &info);
|
|
|
|
+ if (IS_ERR(desc))
|
|
|
|
+ return PTR_ERR(desc);
|
|
|
|
+
|
|
|
|
+ spinand->dirmaps[plane].wdesc_ecc = desc;
|
|
|
|
+
|
|
|
|
+ info.op_tmpl = *spinand->op_templates.read_cache;
|
|
|
|
+ info.op_tmpl.data.ecc = true;
|
|
|
|
+ desc = devm_spi_mem_dirmap_create(&spinand->spimem->spi->dev,
|
|
|
|
+ spinand->spimem, &info);
|
|
|
|
+ if (IS_ERR(desc))
|
|
|
|
+ return PTR_ERR(desc);
|
|
|
|
+
|
|
|
|
+ spinand->dirmaps[plane].rdesc_ecc = desc;
|
|
|
|
+
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
--- a/include/linux/mtd/spinand.h
|
|
|
|
+++ b/include/linux/mtd/spinand.h
|
2022-09-07 02:54:34 +00:00
|
|
|
@@ -392,6 +392,8 @@ struct spinand_info {
|
2022-04-07 02:05:25 +00:00
|
|
|
struct spinand_dirmap {
|
|
|
|
struct spi_mem_dirmap_desc *wdesc;
|
|
|
|
struct spi_mem_dirmap_desc *rdesc;
|
|
|
|
+ struct spi_mem_dirmap_desc *wdesc_ecc;
|
|
|
|
+ struct spi_mem_dirmap_desc *rdesc_ecc;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|