1 /** @file
2 
3 Interface definition for EFI_SD_HOST_IO_PROTOCOL.
4 
5 Copyright (c) 2013-2015 Intel Corporation.
6 
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution.  The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11 
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #ifndef _SD_HOST_IO_H
18 #define _SD_HOST_IO_H
19 
20 #include "SDCard.h"
21 #include "CEATA.h"
22 
23 
24 #define EFI_SD_HOST_IO_PROTOCOL_GUID  \
25   { \
26     0xb63f8ec7, 0xa9c9, 0x4472, {0xa4, 0xc0, 0x4d, 0x8b, 0xf3, 0x65, 0xcc, 0x51} \
27   }
28 
29 ///
30 /// Forward reference for pure ANSI compatability
31 ///
32 typedef struct _EFI_SD_HOST_IO_PROTOCOL EFI_SD_HOST_IO_PROTOCOL;
33 
34 
35 
36 typedef enum {
37   ResponseNo = 0,
38   ResponseR1,
39   ResponseR1b,
40   ResponseR2,
41   ResponseR3,
42   ResponseR4,
43   ResponseR5,
44   ResponseR5b,
45   ResponseR6,
46   ResponseR7
47 }RESPONSE_TYPE;
48 
49 typedef enum {
50   NoData = 0,
51   InData,
52   OutData
53 }TRANSFER_TYPE;
54 
55 typedef enum {
56   Reset_Auto = 0,
57   Reset_DAT,
58   Reset_CMD,
59   Reset_DAT_CMD,
60   Reset_All
61 }RESET_TYPE;
62 
63 #define PCI_SUBCLASS_SD_HOST_CONTROLLER           0x05
64 #define PCI_IF_STANDARD_HOST_NO_DMA               0x00
65 #define PCI_IF_STANDARD_HOST_SUPPORT_DMA          0x01
66 
67 #define   SDHCI_SPEC_100                          0
68 #define   SDHCI_SPEC_200                          1
69 #define   SDHCI_SPEC_300                          2
70 
71 //
72 //MMIO Registers definition for MMC/SDIO controller
73 //
74 #define  MMIO_DMAADR                              0x00
75 #define  MMIO_BLKSZ                               0x04
76 #define  MMIO_BLKCNT                              0x06
77 #define  MMIO_CMDARG                              0x08
78 #define  MMIO_XFRMODE                             0x0C
79 #define  MMIO_SDCMD                               0x0E
80 #define  MMIO_RESP                                0x10
81 #define  MMIO_BUFDATA                             0x20
82 #define  MMIO_PSTATE                              0x24
83 #define  MMIO_HOSTCTL                             0x28
84 #define  MMIO_PWRCTL                              0x29
85 #define  MMIO_BLKGAPCTL                           0x2A
86 #define  MMIO_WAKECTL                             0x2B
87 #define  MMIO_CLKCTL                              0x2C
88 #define   V_MMIO_CLKCTL_MAX_8BIT_FREQ_SEL           0x80
89 #define   V_MMIO_CLKCTL_MAX_10BIT_FREQ_SEL          0x3FF
90 #define   B_MMIO_CLKCTL_UPR_SDCLK_FREQ_SEL_MASK     0xC0
91 
92 #define  MMIO_TOCTL                               0x2E
93 #define  MMIO_SWRST                               0x2F
94 #define  MMIO_NINTSTS                             0x30
95 #define  MMIO_ERINTSTS                            0x32
96 #define  MMIO_NINTEN                              0x34
97 #define  MMIO_ERINTEN                             0x36
98 #define  MMIO_NINTSIGEN                           0x38
99 #define  MMIO_ERINTSIGEN                          0x3A
100 #define  MMIO_AC12ERRSTS                          0x3C
101 #define  MMIO_HOSTCTL2                            0x3E
102 #define  MMIO_CAP                                 0x40
103 #define  MMIO_MCCAP                               0x48
104 #define  MMIO_SLTINTSTS                           0xFC
105 #define  MMIO_CTRLRVER                            0xFE
106 #define  MMIO_SRST                                0x1FC
107 
108 //
109 // Protocol definitions
110 //
111 
112 /**
113   The main function used to send the command to the card inserted into the SD host slot.
114   It will assemble the arguments to set the command register and wait for the command
115   and transfer completed until timeout. Then it will read the response register to fill
116   the ResponseData.
117 
118   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
119   @param  CommandIndex          The command index to set the command index field of command register.
120   @param  Argument              Command argument to set the argument field of command register.
121   @param  DataType              TRANSFER_TYPE, indicates no data, data in or data out.
122   @param  Buffer                Contains the data read from / write to the device.
123   @param  BufferSize            The size of the buffer.
124   @param  ResponseType          RESPONSE_TYPE.
125   @param  TimeOut               Time out value in 1 ms unit.
126   @param  ResponseData          Depending on the ResponseType, such as CSD or card status.
127 
128   @retval EFI_SUCCESS
129   @retval EFI_INVALID_PARAMETER
130   @retval EFI_OUT_OF_RESOURCES
131   @retval EFI_TIMEOUT
132   @retval EFI_DEVICE_ERROR
133 
134 **/
135 
136 typedef
137 EFI_STATUS
138 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_SEND_COMMAND) (
139   IN   EFI_SD_HOST_IO_PROTOCOL    *This,
140   IN   UINT16                     CommandIndex,
141   IN   UINT32                     Argument,
142   IN   TRANSFER_TYPE              DataType,
143   IN   UINT8                      *Buffer, OPTIONAL
144   IN   UINT32                     BufferSize,
145   IN   RESPONSE_TYPE              ResponseType,
146   IN   UINT32                     TimeOut,
147   OUT  UINT32                     *ResponseData OPTIONAL
148   );
149 
150 /**
151   Set max clock frequency of the host, the actual frequency may not be the same as MaxFrequency.
152   It depends on the max frequency the host can support, divider, and host speed mode.
153 
154   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
155   @param  MaxFrequency          Max frequency in HZ.
156 
157   @retval EFI_SUCCESS
158   @retval EFI_TIMEOUT
159 
160 **/
161 
162 typedef
163 EFI_STATUS
164 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_SET_CLOCK_FREQUENCY) (
165   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
166   IN  UINT32                     MaxFrequency
167   );
168 
169 
170 /**
171   Set bus width of the host controller
172 
173   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
174   @param  BusWidth              Bus width in 1, 4, 8 bits.
175 
176   @retval EFI_SUCCESS
177   @retval EFI_INVALID_PARAMETER
178 
179 **/
180 
181 typedef
182 EFI_STATUS
183 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_SET_BUS_WIDTH) (
184   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
185   IN  UINT32                     BusWidth
186   );
187 
188 /**
189   Set voltage which could supported by the host controller.
190   Support 0(Power off the host), 1.8V, 3.0V, 3.3V
191 
192   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
193   @param  Voltage               Units in 0.1 V.
194 
195   @retval EFI_SUCCESS
196   @retval EFI_INVALID_PARAMETER
197 
198 **/
199 
200 typedef
201 EFI_STATUS
202 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_SET_HOST_VOLTAGE) (
203   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
204   IN  UINT32                     Voltage
205   );
206 
207 /**
208   Reset the host controller.
209 
210   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
211   @param  ResetAll              TRUE to reset all.
212 
213   @retval EFI_SUCCESS
214   @retval EFI_TIMEOUT
215 
216 **/
217 
218 typedef
219 EFI_STATUS
220 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_RESET_SD_HOST) (
221   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
222   IN  RESET_TYPE                 ResetType
223   );
224 
225 /**
226   Enable auto stop on the host controller.
227 
228   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
229   @param  Enable                TRUE to enable, FALSE to disable.
230 
231   @retval EFI_SUCCESS
232   @retval EFI_TIMEOUT
233 
234 **/
235 
236 typedef
237 EFI_STATUS
238 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_ENABLE_AUTO_STOP_CMD) (
239   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
240   IN  BOOLEAN                    Enable
241   );
242 
243 /**
244   Find whether these is a card inserted into the slot. If so init the host.
245   If not, return EFI_NOT_FOUND.
246 
247   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
248 
249   @retval EFI_SUCCESS
250   @retval EFI_NOT_FOUND
251 
252 **/
253 
254 typedef
255 EFI_STATUS
256 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_DETECT_CARD_AND_INIT_HOST) (
257   IN  EFI_SD_HOST_IO_PROTOCOL    *This
258   );
259 
260 /**
261   Set the Block length on the host controller.
262 
263   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
264   @param  BlockLength           card supportes block length.
265 
266   @retval EFI_SUCCESS
267   @retval EFI_TIMEOUT
268 
269 **/
270 
271 typedef
272 EFI_STATUS
273 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_SET_BLOCK_LENGTH) (
274   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
275   IN  UINT32                     BlockLength
276   );
277 
278 /**
279   Enable/Disable High Speed transfer mode
280 
281   @param  This                  A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
282   @param  Enable                TRUE to Enable, FALSE to Disable
283 
284   @return EFI_SUCCESS
285 **/
286 typedef
287 EFI_STATUS
288 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_HIGH_SPEED_MODE) (
289   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
290   IN  BOOLEAN                    Enable
291   );
292 
293 typedef
294 EFI_STATUS
295 (EFIAPI *EFI_SD_HOST_IO_PROTOCOL_DUAL_DATARATE_MODE) (
296   IN  EFI_SD_HOST_IO_PROTOCOL    *This,
297   IN  BOOLEAN                    Enable
298   );
299 
300 
301 
302 #define EFI_SD_HOST_IO_PROTOCOL_REVISION_01          0x02
303 
304 
305 typedef struct {
306   UINT32  HighSpeedSupport:    1;  //High speed supported
307   UINT32  V18Support:          1;  //1.8V supported
308   UINT32  V30Support:          1;  //3.0V supported
309   UINT32  V33Support:          1;  //3.3V supported
310   UINT32  Reserved0:           4;
311   UINT32  HostVersion:         8;
312   UINT32  BusWidth4:           1;  // 4 bit width
313   UINT32  BusWidth8:           1;  // 8 bit width
314   UINT32  Reserved1:           14;
315   UINT32  BoundarySize;
316 }HOST_CAPABILITY;
317 
318 
319 //
320 // Interface structure for the SD HOST I/O Protocol
321 //
322 struct _EFI_SD_HOST_IO_PROTOCOL {
323   UINT32                                             Revision;
324   HOST_CAPABILITY                                    HostCapability;
325   EFI_SD_HOST_IO_PROTOCOL_SEND_COMMAND               SendCommand;
326   EFI_SD_HOST_IO_PROTOCOL_SET_CLOCK_FREQUENCY        SetClockFrequency;
327   EFI_SD_HOST_IO_PROTOCOL_SET_BUS_WIDTH              SetBusWidth;
328   EFI_SD_HOST_IO_PROTOCOL_SET_HOST_VOLTAGE           SetHostVoltage;
329   EFI_SD_HOST_IO_PROTOCOL_RESET_SD_HOST              ResetSDHost;
330   EFI_SD_HOST_IO_PROTOCOL_ENABLE_AUTO_STOP_CMD       EnableAutoStopCmd;
331   EFI_SD_HOST_IO_PROTOCOL_DETECT_CARD_AND_INIT_HOST  DetectCardAndInitHost;
332   EFI_SD_HOST_IO_PROTOCOL_SET_BLOCK_LENGTH           SetBlockLength;
333   EFI_SD_HOST_IO_PROTOCOL_HIGH_SPEED_MODE            SetHighSpeedMode;
334   EFI_SD_HOST_IO_PROTOCOL_DUAL_DATARATE_MODE         SetDDRMode;
335 };
336 
337 extern EFI_GUID gEfiSDHostIoProtocolGuid;
338 
339 #endif
340