1951a39d68df598db08dfced8b4707755864a0492Ying Wang/****************************************************************************
2951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************
3951a39d68df598db08dfced8b4707755864a0492Ying Wang ***
4951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   This header was automatically generated from a Linux kernel header
5951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   of the same name, to make information necessary for userspace to
6951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   call into the kernel available to libc.  It contains only constants,
7951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   structures, and macros generated from the original header, and thus,
8951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   contains no copyrightable information.
9951a39d68df598db08dfced8b4707755864a0492Ying Wang ***
10951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************
11951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************/
12951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef __MTD_CFI_H__
13951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __MTD_CFI_H__
14951a39d68df598db08dfced8b4707755864a0492Ying Wang
15951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/delay.h>
16951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/types.h>
17951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/interrupt.h>
18951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/mtd/flashchip.h>
19951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/mtd/map.h>
20951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/mtd/cfi_endian.h>
21951a39d68df598db08dfced8b4707755864a0492Ying Wang
22951a39d68df598db08dfced8b4707755864a0492Ying Wang#define cfi_interleave_is_1(cfi) (0)
23951a39d68df598db08dfced8b4707755864a0492Ying Wang
24951a39d68df598db08dfced8b4707755864a0492Ying Wang#define cfi_interleave_is_2(cfi) (0)
25951a39d68df598db08dfced8b4707755864a0492Ying Wang
26951a39d68df598db08dfced8b4707755864a0492Ying Wang#define cfi_interleave_is_4(cfi) (0)
27951a39d68df598db08dfced8b4707755864a0492Ying Wang
28951a39d68df598db08dfced8b4707755864a0492Ying Wang#define cfi_interleave_is_8(cfi) (0)
29951a39d68df598db08dfced8b4707755864a0492Ying Wang
30951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_DEVICETYPE_X8 (8 / 8)
31951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_DEVICETYPE_X16 (16 / 8)
32951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_DEVICETYPE_X32 (32 / 8)
33951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_DEVICETYPE_X64 (64 / 8)
34951a39d68df598db08dfced8b4707755864a0492Ying Wang
35951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_extquery {
36951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t pri[3];
37951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MajorVersion;
38951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MinorVersion;
39951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
40951a39d68df598db08dfced8b4707755864a0492Ying Wang
41951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_pri_intelext {
42951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t pri[3];
43951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MajorVersion;
44951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MinorVersion;
45951a39d68df598db08dfced8b4707755864a0492Ying Wang uint32_t FeatureSupport;
46951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t SuspendCmdSupport;
47951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t BlkStatusRegMask;
48951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t VccOptimal;
49951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t VppOptimal;
50951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t NumProtectionFields;
51951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t ProtRegAddr;
52951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t FactProtRegSize;
53951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t UserProtRegSize;
54951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t extra[0];
55951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
56951a39d68df598db08dfced8b4707755864a0492Ying Wang
57951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_intelext_otpinfo {
58951a39d68df598db08dfced8b4707755864a0492Ying Wang uint32_t ProtRegAddr;
59951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t FactGroups;
60951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t FactProtRegSize;
61951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t UserGroups;
62951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t UserProtRegSize;
63951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
64951a39d68df598db08dfced8b4707755864a0492Ying Wang
65951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_intelext_blockinfo {
66951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t NumIdentBlocks;
67951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t BlockSize;
68951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t MinBlockEraseCycles;
69951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t BitsPerCell;
70951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t BlockCap;
71951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
72951a39d68df598db08dfced8b4707755864a0492Ying Wang
73951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_intelext_regioninfo {
74951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t NumIdentPartitions;
75951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t NumOpAllowed;
76951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t NumOpAllowedSimProgMode;
77951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t NumOpAllowedSimEraMode;
78951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t NumBlockTypes;
79951a39d68df598db08dfced8b4707755864a0492Ying Wang struct cfi_intelext_blockinfo BlockTypes[1];
80951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
81951a39d68df598db08dfced8b4707755864a0492Ying Wang
82951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_intelext_programming_regioninfo {
83951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t ProgRegShift;
84951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t Reserved1;
85951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t ControlValid;
86951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t Reserved2;
87951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t ControlInvalid;
88951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t Reserved3;
89951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
90951a39d68df598db08dfced8b4707755864a0492Ying Wang
91951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_pri_amdstd {
92951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t pri[3];
93951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MajorVersion;
94951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MinorVersion;
95951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t SiliconRevision;
96951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t EraseSuspend;
97951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t BlkProt;
98951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t TmpBlkUnprotect;
99951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t BlkProtUnprot;
100951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t SimultaneousOps;
101951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t BurstMode;
102951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t PageMode;
103951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t VppMin;
104951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t VppMax;
105951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t TopBottom;
106951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
107951a39d68df598db08dfced8b4707755864a0492Ying Wang
108951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_pri_atmel {
109951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t pri[3];
110951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MajorVersion;
111951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t MinorVersion;
112951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t Features;
113951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t BottomBoot;
114951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t BurstMode;
115951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t PageMode;
116951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
117951a39d68df598db08dfced8b4707755864a0492Ying Wang
118951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_pri_query {
119951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t NumFields;
120951a39d68df598db08dfced8b4707755864a0492Ying Wang uint32_t ProtField[1];
121951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
122951a39d68df598db08dfced8b4707755864a0492Ying Wang
123951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_bri_query {
124951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t PageModeReadCap;
125951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t NumFields;
126951a39d68df598db08dfced8b4707755864a0492Ying Wang uint32_t ConfField[1];
127951a39d68df598db08dfced8b4707755864a0492Ying Wang} __attribute__((packed));
128951a39d68df598db08dfced8b4707755864a0492Ying Wang
129951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_NONE 0x0000
130951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_INTEL_EXT 0x0001
131951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_AMD_STD 0x0002
132951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_INTEL_STD 0x0003
133951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_AMD_EXT 0x0004
134951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_WINBOND 0x0006
135951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_ST_ADV 0x0020
136951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_MITSUBISHI_STD 0x0100
137951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_MITSUBISHI_EXT 0x0101
138951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_SST_PAGE 0x0102
139951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_INTEL_PERFORMANCE 0x0200
140951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_INTEL_DATA 0x0210
141951a39d68df598db08dfced8b4707755864a0492Ying Wang#define P_ID_RESERVED 0xffff
142951a39d68df598db08dfced8b4707755864a0492Ying Wang
143951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_MODE_CFI 1
144951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_MODE_JEDEC 0
145951a39d68df598db08dfced8b4707755864a0492Ying Wang
146951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_private {
147951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t cmdset;
148951a39d68df598db08dfced8b4707755864a0492Ying Wang void *cmdset_priv;
149951a39d68df598db08dfced8b4707755864a0492Ying Wang int interleave;
150951a39d68df598db08dfced8b4707755864a0492Ying Wang int device_type;
151951a39d68df598db08dfced8b4707755864a0492Ying Wang int cfi_mode;
152951a39d68df598db08dfced8b4707755864a0492Ying Wang int addr_unlock1;
153951a39d68df598db08dfced8b4707755864a0492Ying Wang int addr_unlock2;
154951a39d68df598db08dfced8b4707755864a0492Ying Wang struct mtd_info *(*cmdset_setup)(struct map_info *);
155951a39d68df598db08dfced8b4707755864a0492Ying Wang struct cfi_ident *cfiq;
156951a39d68df598db08dfced8b4707755864a0492Ying Wang int mfr, id;
157951a39d68df598db08dfced8b4707755864a0492Ying Wang int numchips;
158951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long chipshift;
159951a39d68df598db08dfced8b4707755864a0492Ying Wang const char *im_name;
160951a39d68df598db08dfced8b4707755864a0492Ying Wang struct flchip chips[0];
161951a39d68df598db08dfced8b4707755864a0492Ying Wang};
162951a39d68df598db08dfced8b4707755864a0492Ying Wang
163951a39d68df598db08dfced8b4707755864a0492Ying Wang#if BITS_PER_LONG >= 64
164951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
165951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CMD(x) cfi_build_cmd((x), map, cfi)
166951a39d68df598db08dfced8b4707755864a0492Ying Wang#if BITS_PER_LONG >= 64
167951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
168951a39d68df598db08dfced8b4707755864a0492Ying Wang#define MERGESTATUS(x) cfi_merge_status((x), map, cfi)
169951a39d68df598db08dfced8b4707755864a0492Ying Wang
170951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct cfi_fixup {
171951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t mfr;
172951a39d68df598db08dfced8b4707755864a0492Ying Wang uint16_t id;
173951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*fixup)(struct mtd_info *mtd, void* param);
174951a39d68df598db08dfced8b4707755864a0492Ying Wang void* param;
175951a39d68df598db08dfced8b4707755864a0492Ying Wang};
176951a39d68df598db08dfced8b4707755864a0492Ying Wang
177951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_MFR_ANY 0xffff
178951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_ID_ANY 0xffff
179951a39d68df598db08dfced8b4707755864a0492Ying Wang
180951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_MFR_AMD 0x0001
181951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_MFR_ATMEL 0x001F
182951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CFI_MFR_ST 0x0020
183951a39d68df598db08dfced8b4707755864a0492Ying Wang
184951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef int (*varsize_frob_t)(struct map_info *map, struct flchip *chip,
185951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long adr, int len, void *thunk);
186951a39d68df598db08dfced8b4707755864a0492Ying Wang
187951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
188