summaryrefslogtreecommitdiffstats
path: root/MdePkg/Include/IndustryStandard/Emmc.h
blob: 3a4394fedd05dd2fb33021dcd86f4994fb0c89f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
/** @file
  Header file for eMMC support.

  This header file contains some definitions defined in EMMC4.5/EMMC5.0 spec.

  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EMMC_H__
#define __EMMC_H__

//
// EMMC command index
//
#define  EMMC_GO_IDLE_STATE         0
#define  EMMC_SEND_OP_COND          1
#define  EMMC_ALL_SEND_CID          2
#define  EMMC_SET_RELATIVE_ADDR     3
#define  EMMC_SET_DSR               4
#define  EMMC_SLEEP_AWAKE           5
#define  EMMC_SWITCH                6
#define  EMMC_SELECT_DESELECT_CARD  7
#define  EMMC_SEND_EXT_CSD          8
#define  EMMC_SEND_CSD              9
#define  EMMC_SEND_CID              10
#define  EMMC_STOP_TRANSMISSION     12
#define  EMMC_SEND_STATUS           13
#define  EMMC_BUSTEST_R             14
#define  EMMC_GO_INACTIVE_STATE     15
#define  EMMC_SET_BLOCKLEN          16
#define  EMMC_READ_SINGLE_BLOCK     17
#define  EMMC_READ_MULTIPLE_BLOCK   18
#define  EMMC_BUSTEST_W             19
#define  EMMC_SEND_TUNING_BLOCK     21
#define  EMMC_SET_BLOCK_COUNT       23
#define  EMMC_WRITE_BLOCK           24
#define  EMMC_WRITE_MULTIPLE_BLOCK  25
#define  EMMC_PROGRAM_CID           26
#define  EMMC_PROGRAM_CSD           27
#define  EMMC_SET_WRITE_PROT        28
#define  EMMC_CLR_WRITE_PROT        29
#define  EMMC_SEND_WRITE_PROT       30
#define  EMMC_SEND_WRITE_PROT_TYPE  31
#define  EMMC_ERASE_GROUP_START     35
#define  EMMC_ERASE_GROUP_END       36
#define  EMMC_ERASE                 38
#define  EMMC_FAST_IO               39
#define  EMMC_GO_IRQ_STATE          40
#define  EMMC_LOCK_UNLOCK           42
#define  EMMC_SET_TIME              49
#define  EMMC_PROTOCOL_RD           53
#define  EMMC_PROTOCOL_WR           54
#define  EMMC_APP_CMD               55
#define  EMMC_GEN_CMD               56

typedef enum {
  EmmcPartitionUserData = 0,
  EmmcPartitionBoot1    = 1,
  EmmcPartitionBoot2    = 2,
  EmmcPartitionRPMB     = 3,
  EmmcPartitionGP1      = 4,
  EmmcPartitionGP2      = 5,
  EmmcPartitionGP3      = 6,
  EmmcPartitionGP4      = 7,
  EmmcPartitionUnknown
} EMMC_PARTITION_TYPE;

#pragma pack(1)
typedef struct {
  UINT8    NotUsed    : 1;                        // Not used [0:0]
  UINT8    Crc        : 7;                        // CRC [7:1]
  UINT8    ManufacturingDate;                     // Manufacturing date [15:8]
  UINT8    ProductSerialNumber[4];                // Product serial number [47:16]
  UINT8    ProductRevision;                       // Product revision [55:48]
  UINT8    ProductName[6];                        // Product name [103:56]
  UINT8    OemId;                                 // OEM/Application ID [111:104]
  UINT8    DeviceType : 2;                        // Device/BGA [113:112]
  UINT8    Reserved   : 6;                        // Reserved [119:114]
  UINT8    ManufacturerId;                        // Manufacturer ID [127:120]
} EMMC_CID;

typedef struct {
  UINT32    NotUsed          : 1;                 // Not used [0:0]
  UINT32    Crc              : 7;                 // CRC [7:1]
  UINT32    Ecc              : 2;                 // ECC code [9:8]
  UINT32    FileFormat       : 2;                 // File format [11:10]
  UINT32    TmpWriteProtect  : 1;                 // Temporary write protection [12:12]
  UINT32    PermWriteProtect : 1;                 // Permanent write protection [13:13]
  UINT32    Copy             : 1;                 // Copy flag (OTP) [14:14]
  UINT32    FileFormatGrp    : 1;                 // File format group [15:15]
  UINT32    ContentProtApp   : 1;                 // Content protection application [16:16]
  UINT32    Reserved         : 4;                 // Reserved [20:17]
  UINT32    WriteBlPartial   : 1;                 // Partial blocks for write allowed [21:21]
  UINT32    WriteBlLen       : 4;                 // Max. write data block length [25:22]
  UINT32    R2WFactor        : 3;                 // Write speed factor [28:26]
  UINT32    DefaultEcc       : 2;                 // Manufacturer default ECC [30:29]
  UINT32    WpGrpEnable      : 1;                 // Write protect group enable [31:31]

  UINT32    WpGrpSize        : 5;                 // Write protect group size [36:32]
  UINT32    EraseGrpMult     : 5;                 // Erase group size multiplier [41:37]
  UINT32    EraseGrpSize     : 5;                 // Erase group size [46:42]
  UINT32    CSizeMult        : 3;                 // Device size multiplier [49:47]
  UINT32    VddWCurrMax      : 3;                 // Max. write current @ VDD max [52:50]
  UINT32    VddWCurrMin      : 3;                 // Max. write current @ VDD min [55:53]
  UINT32    VddRCurrMax      : 3;                 // Max. read current @ VDD max [58:56]
  UINT32    VddRCurrMin      : 3;                 // Max. read current @ VDD min [61:59]
  UINT32    CSizeLow         : 2;                 // Device size low two bits [63:62]

  UINT32    CSizeHigh        : 10;                // Device size high eight bits [73:64]
  UINT32    Reserved1        : 2;                 // Reserved [75:74]
  UINT32    DsrImp           : 1;                 // DSR implemented [76:76]
  UINT32    ReadBlkMisalign  : 1;                 // Read block misalignment [77:77]
  UINT32    WriteBlkMisalign : 1;                 // Write block misalignment [78:78]
  UINT32    ReadBlPartial    : 1;                 // Partial blocks for read allowed [79:79]
  UINT32    ReadBlLen        : 4;                 // Max. read data block length [83:80]
  UINT32    Ccc              : 12;                // Device command classes [95:84]

  UINT32    TranSpeed        : 8;                 // Max. bus clock frequency [103:96]
  UINT32    Nsac             : 8;                 // Data read access-time 2 in CLK cycles (NSAC*100) [111:104]
  UINT32    Taac             : 8;                 // Data read access-time 1 [119:112]
  UINT32    Reserved2        : 2;                 // Reserved [121:120]
  UINT32    SpecVers         : 4;                 // System specification version [125:122]
  UINT32    CsdStructure     : 2;                 // CSD structure [127:126]
} EMMC_CSD;

typedef struct {
  //
  // Modes Segment
  //
  UINT8    Reserved[16];                          // Reserved [15:0]
  UINT8    SecureRemovalType;                     // Secure Removal Type R/W & R [16]
  UINT8    ProductStateAwarenessEnablement;       // Product state awareness enablement R/W/E & R [17]
  UINT8    MaxPreLoadingDataSize[4];              // Max pre loading data size R [21:18]
  UINT8    PreLoadingDataSize[4];                 // Pre loading data size R/W/EP [25:22]
  UINT8    FfuStatus;                             // FFU status R [26]
  UINT8    Reserved1[2];                          // Reserved [28:27]
  UINT8    ModeOperationCodes;                    // Mode operation codes W/EP [29]
  UINT8    ModeConfig;                            // Mode config R/W/EP [30]
  UINT8    Reserved2;                             // Reserved [31]
  UINT8    FlushCache;                            // Flushing of the cache W/EP [32]
  UINT8    CacheCtrl;                             // Control to turn the Cache ON/OFF R/W/EP [33]
  UINT8    PowerOffNotification;                  // Power Off Notification R/W/EP [34]
  UINT8    PackedFailureIndex;                    // Packed command failure index R [35]
  UINT8    PackedCommandStatus;                   // Packed command status R [36]
  UINT8    ContextConf[15];                       // Context configuration R/W/EP [51:37]
  UINT8    ExtPartitionsAttribute[2];             // Extended Partitions Attribute R/W [53:52]
  UINT8    ExceptionEventsStatus[2];              // Exception events status R [55:54]
  UINT8    ExceptionEventsCtrl[2];                // Exception events control R/W/EP [57:56]
  UINT8    DyncapNeeded;                          // Number of addressed group to be Released R [58]
  UINT8    Class6Ctrl;                            // Class 6 commands control R/W/EP [59]
  UINT8    IniTimeoutEmu;                         // 1st initialization after disabling sector size emulation R [60]
  UINT8    DataSectorSize;                        // Sector size R [61]
  UINT8    UseNativeSector;                       // Sector size emulation R/W [62]
  UINT8    NativeSectorSize;                      // Native sector size R [63]
  UINT8    VendorSpecificField[64];               // Vendor Specific Fields <vendor specific> [127:64]
  UINT8    Reserved3[2];                          // Reserved [129:128]
  UINT8    ProgramCidCsdDdrSupport;               // Program CID/CSD in DDR mode support R [130]
  UINT8    PeriodicWakeup;                        // Periodic Wake-up R/W/E [131]
  UINT8    TcaseSupport;                          // Package Case Temperature is controlled W/EP [132]
  UINT8    ProductionStateAwareness;              // Production state awareness R/W/E [133]
  UINT8    SecBadBlkMgmnt;                        // Bad Block Management mode R/W [134]
  UINT8    Reserved4;                             // Reserved [135]
  UINT8    EnhStartAddr[4];                       // Enhanced User Data Start Address R/W [139:136]
  UINT8    EnhSizeMult[3];                        // Enhanced User Data Area Size R/W [142:140]
  UINT8    GpSizeMult[12];                        // General Purpose Partition Size R/W [154:143]
  UINT8    PartitionSettingCompleted;             // Partitioning Setting R/W [155]
  UINT8    PartitionsAttribute;                   // Partitions attribute R/W [156]
  UINT8    MaxEnhSizeMult[3];                     // Max Enhanced Area Size R [159:157]
  UINT8    PartitioningSupport;                   // Partitioning Support R [160]
  UINT8    HpiMgmt;                               // HPI management R/W/EP [161]
  UINT8    RstFunction;                           // H/W reset function R/W [162]
  UINT8    BkopsEn;                               // Enable background operations handshake R/W [163]
  UINT8    BkopsStart;                            // Manually start background operations W/EP [164]
  UINT8    SanitizeStart;                         // Start Sanitize operation W/EP [165]
  UINT8    WrRelParam;                            // Write reliability parameter register R [166]
  UINT8    WrRelSet;                              // Write reliability setting register R/W [167]
  UINT8    RpmbSizeMult;                          // RPMB Size R [168]
  UINT8    FwConfig;                              // FW configuration R/W [169]
  UINT8    Reserved5;                             // Reserved [170]
  UINT8    UserWp;                                // User area write protection register R/W,R/W/CP&R/W/EP [171]
  UINT8    Reserved6;                             // Reserved [172]
  UINT8    BootWp;                                // Boot area write protection register R/W&R/W/CP[173]
  UINT8    BootWpStatus;                          // Boot write protection status registers R [174]
  UINT8    EraseGroupDef;                         // High-density erase group definition R/W/EP [175]
  UINT8    Reserved7;                             // Reserved [176]
  UINT8    BootBusConditions;                     // Boot bus Conditions R/W/E [177]
  UINT8    BootConfigProt;                        // Boot config protection R/W&R/W/CP[178]
  UINT8    PartitionConfig;                       // Partition configuration R/W/E&R/W/EP[179]
  UINT8    Reserved8;                             // Reserved [180]
  UINT8    ErasedMemCont;                         // Erased memory content R [181]
  UINT8    Reserved9;                             // Reserved [182]
  UINT8    BusWidth;                              // Bus width mode W/EP [183]
  UINT8    Reserved10;                            // Reserved [184]
  UINT8    HsTiming;                              // High-speed interface timing R/W/EP [185]
  UINT8    Reserved11;                            // Reserved [186]
  UINT8    PowerClass;                            // Power class R/W/EP [187]
  UINT8    Reserved12;                            // Reserved [188]
  UINT8    CmdSetRev;                             // Command set revision R [189]
  UINT8    Reserved13;                            // Reserved [190]
  UINT8    CmdSet;                                // Command set R/W/EP [191]
  //
  // Properties Segment
  //
  UINT8    ExtCsdRev;                             // Extended CSD revision [192]
  UINT8    Reserved14;                            // Reserved [193]
  UINT8    CsdStructure;                          // CSD STRUCTURE [194]
  UINT8    Reserved15;                            // Reserved [195]
  UINT8    DeviceType;                            // Device type [196]
  UINT8    DriverStrength;                        // I/O Driver Strength [197]
  UINT8    OutOfInterruptTime;                    // Out-of-interrupt busy timing[198]
  UINT8    PartitionSwitchTime;                   // Partition switching timing [199]
  UINT8    PwrCl52M195V;                          // Power class for 52MHz at 1.95V [200]
  UINT8    PwrCl26M195V;                          // Power class for 26MHz at 1.95V [201]
  UINT8    PwrCl52M360V;                          // Power class for 52MHz at 3.6V [202]
  UINT8    PwrCl26M360V;                          // Power class for 26MHz at 3.6V [203]
  UINT8    Reserved16;                            // Reserved [204]
  UINT8    MinPerfR4B26M;                         // Minimum Read Performance for 4bit at 26MHz [205]
  UINT8    MinPerfW4B26M;                         // Minimum Write Performance for 4bit at 26MHz [206]
  UINT8    MinPerfR8B26M4B52M;                    // Minimum Read Performance for 8bit at 26MHz, for 4bit at 52MHz [207]
  UINT8    MinPerfW8B26M4B52M;                    // Minimum Write Performance for 8bit at 26MHz, for 4bit at 52MHz [208]
  UINT8    MinPerfR8B52M;                         // Minimum Read Performance for 8bit at 52MHz [209]
  UINT8    MinPerfW8B52M;                         // Minimum Write Performance for 8bit at 52MHz [210]
  UINT8    Reserved17;                            // Reserved [211]
  UINT8    SecCount[4];                           // Sector Count [215:212]
  UINT8    SleepNotificationTime;                 // Sleep Notification Timeout [216]
  UINT8    SATimeout;                             // Sleep/awake timeout [217]
  UINT8    ProductionStateAwarenessTimeout;       // Production state awareness timeout [218]
  UINT8    SCVccq;                                // Sleep current (VCCQ) [219]
  UINT8    SCVcc;                                 // Sleep current (VCC) [220]
  UINT8    HcWpGrpSize;                           // High-capacity write protect group size [221]
  UINT8    RelWrSecC;                             // Reliable write sector count [222]
  UINT8    EraseTimeoutMult;                      // High-capacity erase timeout [223]
  UINT8    HcEraseGrpSize;                        // High-capacity erase unit size [224]
  UINT8    AccSize;                               // Access size [225]
  UINT8    BootSizeMult;                          // Boot partition size [226]
  UINT8    Reserved18;                            // Reserved [227]
  UINT8    BootInfo;                              // Boot information [228]
  UINT8    SecTrimMult;                           // Secure TRIM Multiplier [229]
  UINT8    SecEraseMult;                          // Secure Erase Multiplier [230]
  UINT8    SecFeatureSupport;                     // Secure Feature support [231]
  UINT8    TrimMult;                              // TRIM Multiplier [232]
  UINT8    Reserved19;                            // Reserved [233]
  UINT8    MinPerfDdrR8b52M;                      // Minimum Read Performance for 8bit at 52MHz in DDR mode [234]
  UINT8    MinPerfDdrW8b52M;                      // Minimum Write Performance for 8bit at 52MHz in DDR mode [235]
  UINT8    PwrCl200M130V;                         // Power class for 200MHz, at VCCQ=1.3V, VCC = 3.6V [236]
  UINT8    PwrCl200M195V;                         // Power class for 200MHz at VCCQ=1.95V, VCC = 3.6V [237]
  UINT8    PwrClDdr52M195V;                       // Power class for 52MHz, DDR at VCC= 1.95V [238]
  UINT8    PwrClDdr52M360V;                       // Power class for 52MHz, DDR at VCC= 3.6V [239]
  UINT8    Reserved20;                            // Reserved [240]
  UINT8    IniTimeoutAp;                          // 1st initialization time after partitioning [241]
  UINT8    CorrectlyPrgSectorsNum[4];             // Number of correctly programmed sectors [245:242]
  UINT8    BkopsStatus;                           // Background operations status [246]
  UINT8    PowerOffLongTime;                      // Power off notification(long) timeout [247]
  UINT8    GenericCmd6Time;                       // Generic CMD6 timeout [248]
  UINT8    CacheSize[4];                          // Cache size [252:249]
  UINT8    PwrClDdr200M360V;                      // Power class for 200MHz, DDR at VCC= 3.6V [253]
  UINT8    FirmwareVersion[8];                    // Firmware version [261:254]
  UINT8    DeviceVersion[2];                      // Device version [263:262]
  UINT8    OptimalTrimUnitSize;                   // Optimal trim unit size[264]
  UINT8    OptimalWriteSize;                      // Optimal write size [265]
  UINT8    OptimalReadSize;                       // Optimal read size [266]
  UINT8    PreEolInfo;                            // Pre EOL information [267]
  UINT8    DeviceLifeTimeEstTypA;                 // Device life time estimation type A [268]
  UINT8    DeviceLifeTimeEstTypB;                 // Device life time estimation type B [269]
  UINT8    VendorProprietaryHealthReport[32];     // Vendor proprietary health report [301:270]
  UINT8    NumOfFwSectorsProgrammed[4];           // Number of FW sectors correctly programmed [305:302]
  UINT8    Reserved21[181];                       // Reserved [486:306]
  UINT8    FfuArg[4];                             // FFU Argument [490:487]
  UINT8    OperationCodeTimeout;                  // Operation codes timeout [491]
  UINT8    FfuFeatures;                           // FFU features [492]
  UINT8    SupportedModes;                        // Supported modes [493]
  UINT8    ExtSupport;                            // Extended partitions attribute support [494]
  UINT8    LargeUnitSizeM1;                       // Large Unit size [495]
  UINT8    ContextCapabilities;                   // Context management capabilities [496]
  UINT8    TagResSize;                            // Tag Resources Size [497]
  UINT8    TagUnitSize;                           // Tag Unit Size [498]
  UINT8    DataTagSupport;                        // Data Tag Support [499]
  UINT8    MaxPackedWrites;                       // Max packed write commands [500]
  UINT8    MaxPackedReads;                        // Max packed read commands[501]
  UINT8    BkOpsSupport;                          // Background operations support [502]
  UINT8    HpiFeatures;                           // HPI features [503]
  UINT8    SupportedCmdSet;                       // Supported Command Sets [504]
  UINT8    ExtSecurityErr;                        // Extended Security Commands Error [505]
  UINT8    Reserved22[6];                         // Reserved [511:506]
} EMMC_EXT_CSD;

#pragma pack()

#endif