[PATCH 1/2] mtd: spinand: Introduce a way to avoid raw access
Takahiro Kuwano
tkuw584924 at gmail.com
Wed Nov 13 02:51:06 PST 2024
On 11/13/2024 6:11 PM, Miquel Raynal wrote:
> On 13/11/2024 at 11:06:21 +09, Takahiro Kuwano <tkuw584924 at gmail.com> wrote:
>
>> Hi,
>>
>> On 11/12/2024 3:54 AM, Miquel Raynal wrote:
>>> Hi,
>>>
>>> On 31/10/2024 at 11:21:54 +09, tkuw584924 at gmail.com wrote:
>>>
>>>> From: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
>>>>
>>>> SkyHigh spinand device has ECC enable bit in configuration register but
>>>> it must be always enabled. If ECC is disabled, read and write ops
>>>> results in undetermined state. For such devices, a way to avoid raw
>>>> access is needed.
>>>>
>>>> Introduce SPINAND_NO_RAW_ACCESS flag to advertise the device does not
>>>> support raw access. Read and write page in raw mode for the device
>>>> returns error.
>>>>
>>>> Checking and marking BBM need to be performed with ECC enabled to read
>>>> and write the BBM correctly.
>>>
>>> I see your point but I'm a bit puzzled by how it's being done.
>>>
>>> First, you disregard completely the isbad() and markbad()
>>> situations. Please have look into that because these functions are
>>> broken with your devices.
>>>
>> Yes... now I understand how they are broken.
>>
>>> Second, what about adding this detail to the ondie ECC engine? You could
>>> simply return an error from there, so basically a single (or maybe two)
>>> changes overall.
>>>
>> Thank you for the suggestion.
>> How about change like below in prepare_finish_io_req()?
>>
>> static int spinand_ondie_ecc_prepare_io_req(struct nand_device *nand,
>> struct nand_page_io_req *req)
>> {
>> struct spinand_device *spinand = nand_to_spinand(nand);
>> bool enable = (req->mode != MTD_OPS_RAW);
>>
>> + /*
>> + * For the devices that prohibit raw access (on-die ECC must be always
>> + * enabled), return error in case of raw data access. Accessing to OOB
>> + * needs to be allowed with on-die ECC enabled to support BBM checking
>> + * and marking.
>> + */
>> + if (!enable && spinand->flags & SPINAND_NO_RAW_ACCESS) {
>> + if (req->datalen)
>> + return -ENOTSUPP;
>
> EOPNOTSUPP
>
>> +
>> + enable = true;
>> + }
>
> No, this is lying, I don't like that.
>
> What about just returnint an error here if you cannot do what the upper
> layer has asked you to do. And in the upper layer, you can add two
> specific conditions to is_bad/mark_bad() allowing to fallback to a "with
> ECC" operation in the EOPNOTSUPP case (with a short comment).
>
OK, I will do it in next revision.
Thanks again.
BTW, spinand_write_enable_op() in spinand_markbad() looks redundant as it is
called in spinand_write_page(). Let me remove it before adding fallback.
> Thanks,
> Miquèl
More information about the linux-mtd
mailing list