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