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