1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-27 13:31:16 +02:00

tools: mxsboot: Calculate ECC strength dynamically

Calculating the ECC strength dynamically to be aligned with the mxs NAND
driver and the Linux Kernel.

Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks>
Reviewed-by: Marek Vasut <marex@denx.de>
This commit is contained in:
Jörg Krause
2015-04-15 09:27:23 +02:00
committed by Scott Wood
parent 1fbdb70610
commit 6121560d77

View File

@@ -14,6 +14,10 @@
#include "compiler.h" #include "compiler.h"
/* Taken from <linux/kernel.h> */
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_down(x, y) ((x) & ~__round_mask(x, y))
/* /*
* Default BCB layout. * Default BCB layout.
* *
@@ -126,6 +130,11 @@ struct mx28_sd_config_block {
struct mx28_sd_drive_info drv_info[1]; struct mx28_sd_drive_info drv_info[1];
}; };
static inline uint32_t mx28_nand_ecc_chunk_cnt(uint32_t page_data_size)
{
return page_data_size / MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
}
static inline uint32_t mx28_nand_ecc_size_in_bits(uint32_t ecc_strength) static inline uint32_t mx28_nand_ecc_size_in_bits(uint32_t ecc_strength)
{ {
return ecc_strength * MXS_NAND_BITS_PER_ECC_LEVEL; return ecc_strength * MXS_NAND_BITS_PER_ECC_LEVEL;
@@ -134,21 +143,21 @@ static inline uint32_t mx28_nand_ecc_size_in_bits(uint32_t ecc_strength)
static inline uint32_t mx28_nand_get_ecc_strength(uint32_t page_data_size, static inline uint32_t mx28_nand_get_ecc_strength(uint32_t page_data_size,
uint32_t page_oob_size) uint32_t page_oob_size)
{ {
if (page_data_size == 2048) int ecc_strength;
return 8;
if (page_data_size == 4096) { /*
if (page_oob_size == 128) * Determine the ECC layout with the formula:
return 8; * ECC bits per chunk = (total page spare data bits) /
* (bits per ECC level) / (chunks per page)
* where:
* total page spare data bits =
* (page oob size - meta data size) * (bits per byte)
*/
ecc_strength = ((page_oob_size - MXS_NAND_METADATA_SIZE) * 8)
/ (MXS_NAND_BITS_PER_ECC_LEVEL *
mx28_nand_ecc_chunk_cnt(page_data_size));
if (page_oob_size == 218) return round_down(ecc_strength, 2);
return 16;
if (page_oob_size == 224)
return 16;
}
return 0;
} }
static inline uint32_t mx28_nand_get_mark_offset(uint32_t page_data_size, static inline uint32_t mx28_nand_get_mark_offset(uint32_t page_data_size,