mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-16 09:48:16 +00:00
beba5f04f2
ELM hardware engine which is used for ECC error detection, is present on all latest OMAP SoC (like OMAP4xxx, OMAP5xxx, DRA7xxx, AM33xx, AM43xx). Thus ELM driver should be moved to common drivers/mtd/nand/ folder so that all SoC having on-chip ELM hardware engine can re-use it. This patch has following changes: - mv arch/arm/include/asm/arch-am33xx/elm.h arch/arm/include/asm/omap_elm.h - mv arch/arm/cpu/armv7/am33xx/elm.c drivers/mtd/nand/omap_elm.c - update Makefiles - update #include <asm/elm.h> - add CONFIG_NAND_OMAP_ELM to compile driver/mtd/nand/omap_elm.c and include in all board configs using AM33xx SoC platform. Signed-off-by: Pekon Gupta <pekon@ti.com>
77 lines
2.1 KiB
C
77 lines
2.1 KiB
C
/*
|
|
* (C) Copyright 2010-2011 Texas Instruments, <www.ti.com>
|
|
* Mansoor Ahamed <mansoor.ahamed@ti.com>
|
|
*
|
|
* Derived from work done by Rohit Choraria <rohitkc@ti.com> for omap3
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
#ifndef __ASM_ARCH_ELM_H
|
|
#define __ASM_ARCH_ELM_H
|
|
/*
|
|
* ELM Module Registers
|
|
*/
|
|
|
|
/* ELM registers bit fields */
|
|
#define ELM_SYSCONFIG_SOFTRESET_MASK (0x2)
|
|
#define ELM_SYSCONFIG_SOFTRESET (0x2)
|
|
#define ELM_SYSSTATUS_RESETDONE_MASK (0x1)
|
|
#define ELM_SYSSTATUS_RESETDONE (0x1)
|
|
#define ELM_LOCATION_CONFIG_ECC_BCH_LEVEL_MASK (0x3)
|
|
#define ELM_LOCATION_CONFIG_ECC_SIZE_MASK (0x7FF0000)
|
|
#define ELM_LOCATION_CONFIG_ECC_SIZE_POS (16)
|
|
#define ELM_SYNDROME_FRAGMENT_6_SYNDROME_VALID (0x00010000)
|
|
#define ELM_LOCATION_STATUS_ECC_CORRECTABLE_MASK (0x100)
|
|
#define ELM_LOCATION_STATUS_ECC_NB_ERRORS_MASK (0x1F)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
enum bch_level {
|
|
BCH_4_BIT = 0,
|
|
BCH_8_BIT,
|
|
BCH_16_BIT
|
|
};
|
|
|
|
|
|
/* BCH syndrome registers */
|
|
struct syndrome {
|
|
u32 syndrome_fragment_x[7]; /* 0x400, 0x404.... 0x418 */
|
|
u8 res1[36]; /* 0x41c */
|
|
};
|
|
|
|
/* BCH error status & location register */
|
|
struct location {
|
|
u32 location_status; /* 0x800 */
|
|
u8 res1[124]; /* 0x804 */
|
|
u32 error_location_x[16]; /* 0x880.... */
|
|
u8 res2[64]; /* 0x8c0 */
|
|
};
|
|
|
|
/* BCH ELM register map - do not try to allocate memmory for this structure.
|
|
* We have used plenty of reserved variables to fill the slots in the ELM
|
|
* register memory map.
|
|
* Directly initialize the struct pointer to ELM base address.
|
|
*/
|
|
struct elm {
|
|
u32 rev; /* 0x000 */
|
|
u8 res1[12]; /* 0x004 */
|
|
u32 sysconfig; /* 0x010 */
|
|
u32 sysstatus; /* 0x014 */
|
|
u32 irqstatus; /* 0x018 */
|
|
u32 irqenable; /* 0x01c */
|
|
u32 location_config; /* 0x020 */
|
|
u8 res2[92]; /* 0x024 */
|
|
u32 page_ctrl; /* 0x080 */
|
|
u8 res3[892]; /* 0x084 */
|
|
struct syndrome syndrome_fragments[8]; /* 0x400 */
|
|
u8 res4[512]; /* 0x600 */
|
|
struct location error_location[8]; /* 0x800 */
|
|
};
|
|
|
|
int elm_check_error(u8 *syndrome, u32 nibbles, u32 *error_count,
|
|
u32 *error_locations);
|
|
int elm_config(enum bch_level level);
|
|
void elm_reset(void);
|
|
void elm_init(void);
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* __ASM_ARCH_ELM_H */
|