• Masahiro Yamada's avatar
    mtd: nand: denali: support hardware-assisted erased page detection · 57a4d8b5
    Masahiro Yamada authored
    Recent versions of this IP support automatic erased page detection.
    If an erased page is detected on reads, the controller does not set
    INTR__ECC_UNCOR_ERR, but INTR__ERASED_PAGE.
    
    The detection of erased pages is based on the number of zeros in a
    page; if the number of zeros is less than the value in the field
    ERASED_THRESHOLD, the page is assumed as erased.
    
    Please note ERASED_THRESHOLD specifies the number of zeros in a _page_
    instead of an ECC chunk.  Moreover, the controller does not provide a
    way to know the actual number of bitflips.
    
    Actually, an erased page (all 0xff) is not an ECC correctable pattern
    on the Denali ECC engine.  In other words, there may be overlap between
    the following two:
    
    [1] a bit pattern reachable from a valid payload + ECC pattern within
        ecc.strength bitflips
    [2] a bit pattern reachable from an erased state (all 0xff) within
        ecc.strength bitflips
    
    So, this feature may intercept ECC correctable patterns, then replace
    [1] with [2].
    
    After all, this feature can work safely only when ECC_THRESHOLD == 1,
    i.e. detect erased pages without any bitflips.  This should be the
    case most of the time.  If there is a bitflip or more, the driver will
    fallback to the software method by using nand_check_erased_ecc_chunk().
    
    Strangely enough, the driver still has to fill the buffer with 0xff
    in case of INTR__ERASED_PAGE because the ECC correction engine has
    already manipulated the data in the buffer before it judges erased
    pages.
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
    57a4d8b5
denali.c 39.5 KB