1/****************************************************************************
2 ****************************************************************************
3 ***
4 ***   This header was automatically generated from a Linux kernel header
5 ***   of the same name, to make information necessary for userspace to
6 ***   call into the kernel available to libc.  It contains only constants,
7 ***   structures, and macros generated from the original header, and thus,
8 ***   contains no copyrightable information.
9 ***
10 ****************************************************************************
11 ****************************************************************************/
12#ifndef __MTD_CFI_H__
13#define __MTD_CFI_H__
14
15#include <linux/delay.h>
16#include <linux/types.h>
17#include <linux/interrupt.h>
18#include <linux/mtd/flashchip.h>
19#include <linux/mtd/map.h>
20#include <linux/mtd/cfi_endian.h>
21
22#define cfi_interleave_is_1(cfi) (0)
23
24#define cfi_interleave_is_2(cfi) (0)
25
26#define cfi_interleave_is_4(cfi) (0)
27
28#define cfi_interleave_is_8(cfi) (0)
29
30#define CFI_DEVICETYPE_X8 (8 / 8)
31#define CFI_DEVICETYPE_X16 (16 / 8)
32#define CFI_DEVICETYPE_X32 (32 / 8)
33#define CFI_DEVICETYPE_X64 (64 / 8)
34
35struct cfi_extquery {
36 uint8_t pri[3];
37 uint8_t MajorVersion;
38 uint8_t MinorVersion;
39} __attribute__((packed));
40
41struct cfi_pri_intelext {
42 uint8_t pri[3];
43 uint8_t MajorVersion;
44 uint8_t MinorVersion;
45 uint32_t FeatureSupport;
46 uint8_t SuspendCmdSupport;
47 uint16_t BlkStatusRegMask;
48 uint8_t VccOptimal;
49 uint8_t VppOptimal;
50 uint8_t NumProtectionFields;
51 uint16_t ProtRegAddr;
52 uint8_t FactProtRegSize;
53 uint8_t UserProtRegSize;
54 uint8_t extra[0];
55} __attribute__((packed));
56
57struct cfi_intelext_otpinfo {
58 uint32_t ProtRegAddr;
59 uint16_t FactGroups;
60 uint8_t FactProtRegSize;
61 uint16_t UserGroups;
62 uint8_t UserProtRegSize;
63} __attribute__((packed));
64
65struct cfi_intelext_blockinfo {
66 uint16_t NumIdentBlocks;
67 uint16_t BlockSize;
68 uint16_t MinBlockEraseCycles;
69 uint8_t BitsPerCell;
70 uint8_t BlockCap;
71} __attribute__((packed));
72
73struct cfi_intelext_regioninfo {
74 uint16_t NumIdentPartitions;
75 uint8_t NumOpAllowed;
76 uint8_t NumOpAllowedSimProgMode;
77 uint8_t NumOpAllowedSimEraMode;
78 uint8_t NumBlockTypes;
79 struct cfi_intelext_blockinfo BlockTypes[1];
80} __attribute__((packed));
81
82struct cfi_intelext_programming_regioninfo {
83 uint8_t ProgRegShift;
84 uint8_t Reserved1;
85 uint8_t ControlValid;
86 uint8_t Reserved2;
87 uint8_t ControlInvalid;
88 uint8_t Reserved3;
89} __attribute__((packed));
90
91struct cfi_pri_amdstd {
92 uint8_t pri[3];
93 uint8_t MajorVersion;
94 uint8_t MinorVersion;
95 uint8_t SiliconRevision;
96 uint8_t EraseSuspend;
97 uint8_t BlkProt;
98 uint8_t TmpBlkUnprotect;
99 uint8_t BlkProtUnprot;
100 uint8_t SimultaneousOps;
101 uint8_t BurstMode;
102 uint8_t PageMode;
103 uint8_t VppMin;
104 uint8_t VppMax;
105 uint8_t TopBottom;
106} __attribute__((packed));
107
108struct cfi_pri_atmel {
109 uint8_t pri[3];
110 uint8_t MajorVersion;
111 uint8_t MinorVersion;
112 uint8_t Features;
113 uint8_t BottomBoot;
114 uint8_t BurstMode;
115 uint8_t PageMode;
116} __attribute__((packed));
117
118struct cfi_pri_query {
119 uint8_t NumFields;
120 uint32_t ProtField[1];
121} __attribute__((packed));
122
123struct cfi_bri_query {
124 uint8_t PageModeReadCap;
125 uint8_t NumFields;
126 uint32_t ConfField[1];
127} __attribute__((packed));
128
129#define P_ID_NONE 0x0000
130#define P_ID_INTEL_EXT 0x0001
131#define P_ID_AMD_STD 0x0002
132#define P_ID_INTEL_STD 0x0003
133#define P_ID_AMD_EXT 0x0004
134#define P_ID_WINBOND 0x0006
135#define P_ID_ST_ADV 0x0020
136#define P_ID_MITSUBISHI_STD 0x0100
137#define P_ID_MITSUBISHI_EXT 0x0101
138#define P_ID_SST_PAGE 0x0102
139#define P_ID_INTEL_PERFORMANCE 0x0200
140#define P_ID_INTEL_DATA 0x0210
141#define P_ID_RESERVED 0xffff
142
143#define CFI_MODE_CFI 1
144#define CFI_MODE_JEDEC 0
145
146struct cfi_private {
147 uint16_t cmdset;
148 void *cmdset_priv;
149 int interleave;
150 int device_type;
151 int cfi_mode;
152 int addr_unlock1;
153 int addr_unlock2;
154 struct mtd_info *(*cmdset_setup)(struct map_info *);
155 struct cfi_ident *cfiq;
156 int mfr, id;
157 int numchips;
158 unsigned long chipshift;
159 const char *im_name;
160 struct flchip chips[0];
161};
162
163#if BITS_PER_LONG >= 64
164#endif
165#define CMD(x) cfi_build_cmd((x), map, cfi)
166#if BITS_PER_LONG >= 64
167#endif
168#define MERGESTATUS(x) cfi_merge_status((x), map, cfi)
169
170struct cfi_fixup {
171 uint16_t mfr;
172 uint16_t id;
173 void (*fixup)(struct mtd_info *mtd, void* param);
174 void* param;
175};
176
177#define CFI_MFR_ANY 0xffff
178#define CFI_ID_ANY 0xffff
179
180#define CFI_MFR_AMD 0x0001
181#define CFI_MFR_ATMEL 0x001F
182#define CFI_MFR_ST 0x0020
183
184typedef int (*varsize_frob_t)(struct map_info *map, struct flchip *chip,
185 unsigned long adr, int len, void *thunk);
186
187#endif
188