111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/**************************************************************************** 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert **************************************************************************** 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** This header was automatically generated from a Linux kernel header 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** of the same name, to make information necessary for userspace to 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** call into the kernel available to libc. It contains only constants, 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** structures, and macros generated from the original header, and thus, 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** contains no copyrightable information. 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert **************************************************************************** 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************/ 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __MTD_CFI_H__ 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __MTD_CFI_H__ 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/delay.h> 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/types.h> 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/interrupt.h> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/mtd/flashchip.h> 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/mtd/map.h> 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/mtd/cfi_endian.h> 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define cfi_interleave_is_1(cfi) (0) 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define cfi_interleave_is_2(cfi) (0) 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define cfi_interleave_is_4(cfi) (0) 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define cfi_interleave_is_8(cfi) (0) 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_DEVICETYPE_X8 (8 / 8) 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_DEVICETYPE_X16 (16 / 8) 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_DEVICETYPE_X32 (32 / 8) 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_DEVICETYPE_X64 (64 / 8) 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_extquery { 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t pri[3]; 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MajorVersion; 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MinorVersion; 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_pri_intelext { 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t pri[3]; 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MajorVersion; 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MinorVersion; 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint32_t FeatureSupport; 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t SuspendCmdSupport; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t BlkStatusRegMask; 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t VccOptimal; 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t VppOptimal; 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t NumProtectionFields; 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t ProtRegAddr; 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t FactProtRegSize; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t UserProtRegSize; 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t extra[0]; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_intelext_otpinfo { 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint32_t ProtRegAddr; 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t FactGroups; 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t FactProtRegSize; 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t UserGroups; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t UserProtRegSize; 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_intelext_blockinfo { 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t NumIdentBlocks; 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t BlockSize; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t MinBlockEraseCycles; 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t BitsPerCell; 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t BlockCap; 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_intelext_regioninfo { 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t NumIdentPartitions; 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t NumOpAllowed; 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t NumOpAllowedSimProgMode; 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t NumOpAllowedSimEraMode; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t NumBlockTypes; 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct cfi_intelext_blockinfo BlockTypes[1]; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_intelext_programming_regioninfo { 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t ProgRegShift; 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t Reserved1; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t ControlValid; 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t Reserved2; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t ControlInvalid; 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t Reserved3; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_pri_amdstd { 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t pri[3]; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MajorVersion; 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MinorVersion; 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t SiliconRevision; 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t EraseSuspend; 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t BlkProt; 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t TmpBlkUnprotect; 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t BlkProtUnprot; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t SimultaneousOps; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t BurstMode; 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t PageMode; 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t VppMin; 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t VppMax; 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t TopBottom; 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_pri_atmel { 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t pri[3]; 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MajorVersion; 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t MinorVersion; 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t Features; 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t BottomBoot; 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t BurstMode; 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t PageMode; 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_pri_query { 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t NumFields; 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint32_t ProtField[1]; 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_bri_query { 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t PageModeReadCap; 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint8_t NumFields; 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint32_t ConfField[1]; 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__((packed)); 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_NONE 0x0000 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_INTEL_EXT 0x0001 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_AMD_STD 0x0002 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_INTEL_STD 0x0003 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_AMD_EXT 0x0004 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_WINBOND 0x0006 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_ST_ADV 0x0020 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_MITSUBISHI_STD 0x0100 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_MITSUBISHI_EXT 0x0101 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_SST_PAGE 0x0102 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_INTEL_PERFORMANCE 0x0200 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_INTEL_DATA 0x0210 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define P_ID_RESERVED 0xffff 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_MODE_CFI 1 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_MODE_JEDEC 0 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_private { 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t cmdset; 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *cmdset_priv; 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int interleave; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int device_type; 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int cfi_mode; 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int addr_unlock1; 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int addr_unlock2; 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct mtd_info *(*cmdset_setup)(struct map_info *); 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct cfi_ident *cfiq; 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int mfr, id; 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int numchips; 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long chipshift; 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char *im_name; 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct flchip chips[0]; 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BITS_PER_LONG >= 64 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMD(x) cfi_build_cmd((x), map, cfi) 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BITS_PER_LONG >= 64 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MERGESTATUS(x) cfi_merge_status((x), map, cfi) 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cfi_fixup { 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t mfr; 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint16_t id; 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*fixup)(struct mtd_info *mtd, void* param); 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void* param; 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_MFR_ANY 0xffff 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_ID_ANY 0xffff 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_MFR_AMD 0x0001 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_MFR_ATMEL 0x001F 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CFI_MFR_ST 0x0020 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int (*varsize_frob_t)(struct map_info *map, struct flchip *chip, 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long adr, int len, void *thunk); 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 188