mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-05 20:24:09 +08:00
7d5929c1f3
For v3.12 and prior, 1-bit Hamming code ECC via software was the
default choice. Commit c66d039197
in v3.13 changed the behaviour
to use 1-bit Hamming code via Hardware using a different ECC layout
i.e. (ROM code layout) than what is used by software ECC.
This ECC layout change causes NAND filesystems created in v3.12
and prior to be unusable in v3.13 and later. So revert back to
using software ECC by default if an ECC scheme is not explicitely
specified.
This defect can be observed on the following boards during legacy boot
-omap3beagle
-omap3touchbook
-overo
-am3517crane
-devkit8000
-ldp
-3430sdp
Signed-off-by: Roger Quadros <rogerq@ti.com>
Tested-by: Grazvydas Ignotas <notasas@gmail.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
84 lines
2.5 KiB
C
84 lines
2.5 KiB
C
/*
|
|
* Copyright (C) 2006 Micron Technology Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef _MTD_NAND_OMAP2_H
|
|
#define _MTD_NAND_OMAP2_H
|
|
|
|
#include <linux/mtd/partitions.h>
|
|
|
|
#define GPMC_BCH_NUM_REMAINDER 8
|
|
|
|
enum nand_io {
|
|
NAND_OMAP_PREFETCH_POLLED = 0, /* prefetch polled mode, default */
|
|
NAND_OMAP_POLLED, /* polled mode, without prefetch */
|
|
NAND_OMAP_PREFETCH_DMA, /* prefetch enabled sDMA mode */
|
|
NAND_OMAP_PREFETCH_IRQ /* prefetch enabled irq mode */
|
|
};
|
|
|
|
enum omap_ecc {
|
|
/*
|
|
* 1-bit ECC: calculation and correction by SW
|
|
* ECC stored at end of spare area
|
|
*/
|
|
OMAP_ECC_HAM1_CODE_SW = 0,
|
|
|
|
/*
|
|
* 1-bit ECC: calculation by GPMC, Error detection by Software
|
|
* ECC layout compatible with ROM code layout
|
|
*/
|
|
OMAP_ECC_HAM1_CODE_HW,
|
|
/* 4-bit ECC calculation by GPMC, Error detection by Software */
|
|
OMAP_ECC_BCH4_CODE_HW_DETECTION_SW,
|
|
/* 4-bit ECC calculation by GPMC, Error detection by ELM */
|
|
OMAP_ECC_BCH4_CODE_HW,
|
|
/* 8-bit ECC calculation by GPMC, Error detection by Software */
|
|
OMAP_ECC_BCH8_CODE_HW_DETECTION_SW,
|
|
/* 8-bit ECC calculation by GPMC, Error detection by ELM */
|
|
OMAP_ECC_BCH8_CODE_HW,
|
|
/* 16-bit ECC calculation by GPMC, Error detection by ELM */
|
|
OMAP_ECC_BCH16_CODE_HW,
|
|
};
|
|
|
|
struct gpmc_nand_regs {
|
|
void __iomem *gpmc_status;
|
|
void __iomem *gpmc_nand_command;
|
|
void __iomem *gpmc_nand_address;
|
|
void __iomem *gpmc_nand_data;
|
|
void __iomem *gpmc_prefetch_config1;
|
|
void __iomem *gpmc_prefetch_config2;
|
|
void __iomem *gpmc_prefetch_control;
|
|
void __iomem *gpmc_prefetch_status;
|
|
void __iomem *gpmc_ecc_config;
|
|
void __iomem *gpmc_ecc_control;
|
|
void __iomem *gpmc_ecc_size_config;
|
|
void __iomem *gpmc_ecc1_result;
|
|
void __iomem *gpmc_bch_result0[GPMC_BCH_NUM_REMAINDER];
|
|
void __iomem *gpmc_bch_result1[GPMC_BCH_NUM_REMAINDER];
|
|
void __iomem *gpmc_bch_result2[GPMC_BCH_NUM_REMAINDER];
|
|
void __iomem *gpmc_bch_result3[GPMC_BCH_NUM_REMAINDER];
|
|
void __iomem *gpmc_bch_result4[GPMC_BCH_NUM_REMAINDER];
|
|
void __iomem *gpmc_bch_result5[GPMC_BCH_NUM_REMAINDER];
|
|
void __iomem *gpmc_bch_result6[GPMC_BCH_NUM_REMAINDER];
|
|
};
|
|
|
|
struct omap_nand_platform_data {
|
|
int cs;
|
|
struct mtd_partition *parts;
|
|
int nr_parts;
|
|
bool dev_ready;
|
|
enum nand_io xfer_type;
|
|
int devsize;
|
|
enum omap_ecc ecc_opt;
|
|
struct gpmc_nand_regs reg;
|
|
|
|
/* for passing the partitions */
|
|
struct device_node *of_node;
|
|
struct device_node *elm_of_node;
|
|
};
|
|
#endif
|