mtd: nand: omap: add support for BCH16_ECC - ELM driver updates
ELM hardware engine is used to detect ECC errors for BCHx ecc-schemes (like BCH4/BCH8/BCH16). This patch extends configuration of ELM registers for adding support of BCH16_HW ecc-scheme. Signed-off-by: Pekon Gupta <pekon@ti.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
This commit is contained in:
parent
27c9fd6075
commit
2be589e4b2
|
@ -213,6 +213,28 @@ static void elm_load_syndrome(struct elm_info *info,
|
|||
val = cpu_to_be32(*(u32 *) &ecc[0]) >> 12;
|
||||
elm_write_reg(info, offset, val);
|
||||
break;
|
||||
case BCH16_ECC:
|
||||
val = cpu_to_be32(*(u32 *) &ecc[22]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[18]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[14]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[10]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[6]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[2]);
|
||||
elm_write_reg(info, offset, val);
|
||||
offset += 4;
|
||||
val = cpu_to_be32(*(u32 *) &ecc[0]) >> 16;
|
||||
elm_write_reg(info, offset, val);
|
||||
break;
|
||||
default:
|
||||
pr_err("invalid config bch_type\n");
|
||||
}
|
||||
|
@ -436,6 +458,13 @@ static int elm_context_save(struct elm_info *info)
|
|||
for (i = 0; i < ERROR_VECTOR_MAX; i++) {
|
||||
offset = i * SYNDROME_FRAGMENT_REG_SIZE;
|
||||
switch (bch_type) {
|
||||
case BCH16_ECC:
|
||||
regs->elm_syndrome_fragment_6[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_6 + offset);
|
||||
regs->elm_syndrome_fragment_5[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_5 + offset);
|
||||
regs->elm_syndrome_fragment_4[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_4 + offset);
|
||||
case BCH8_ECC:
|
||||
regs->elm_syndrome_fragment_3[i] = elm_read_reg(info,
|
||||
ELM_SYNDROME_FRAGMENT_3 + offset);
|
||||
|
@ -474,6 +503,13 @@ static int elm_context_restore(struct elm_info *info)
|
|||
for (i = 0; i < ERROR_VECTOR_MAX; i++) {
|
||||
offset = i * SYNDROME_FRAGMENT_REG_SIZE;
|
||||
switch (bch_type) {
|
||||
case BCH16_ECC:
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_6 + offset,
|
||||
regs->elm_syndrome_fragment_6[i]);
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_5 + offset,
|
||||
regs->elm_syndrome_fragment_5[i]);
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_4 + offset,
|
||||
regs->elm_syndrome_fragment_4[i]);
|
||||
case BCH8_ECC:
|
||||
elm_write_reg(info, ELM_SYNDROME_FRAGMENT_3 + offset,
|
||||
regs->elm_syndrome_fragment_3[i]);
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
enum bch_ecc {
|
||||
BCH4_ECC = 0,
|
||||
BCH8_ECC,
|
||||
BCH16_ECC,
|
||||
};
|
||||
|
||||
/* ELM support 8 error syndrome process */
|
||||
|
@ -38,7 +39,7 @@ struct elm_errorvec {
|
|||
bool error_reported;
|
||||
bool error_uncorrectable;
|
||||
int error_count;
|
||||
int error_loc[ERROR_VECTOR_MAX];
|
||||
int error_loc[16];
|
||||
};
|
||||
|
||||
void elm_decode_bch_error_page(struct device *dev, u8 *ecc_calc,
|
||||
|
|
Loading…
Reference in New Issue