]> git.proxmox.com Git - mirror_edk2.git/blob - QuarkSocPkg/QuarkSouthCluster/Sdio/Dxe/SDMediaDeviceDxe/SDMediaDevice.h
QuarkSocPkg: Add new package for Quark SoC X1000
[mirror_edk2.git] / QuarkSocPkg / QuarkSouthCluster / Sdio / Dxe / SDMediaDeviceDxe / SDMediaDevice.h
1 /** @file
2
3 The definition for SD media device driver model and blkio protocol routines.
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_MEDIA_DEVICE_H_
18 #define _SD_MEDIA_DEVICE_H_
19
20
21 #include <Uefi.h>
22
23 #include <Protocol/PciIo.h>
24 #include <Protocol/BlockIo.h>
25
26 #include <Library/DebugLib.h>
27 #include <Library/BaseMemoryLib.h>
28 #include <Library/UefiDriverEntryPoint.h>
29 #include <Library/UefiBootServicesTableLib.h>
30 #include <Library/UefiLib.h>
31 #include <Library/BaseLib.h>
32 #include <Library/MemoryAllocationLib.h>
33 #include <Library/PcdLib.h>
34 #include <IndustryStandard/Pci22.h>
35
36 #include "ComponentName.h"
37 #include "SDHostIo.h"
38
39
40 extern EFI_DRIVER_BINDING_PROTOCOL gSDMediaDeviceDriverBinding;
41 extern EFI_COMPONENT_NAME_PROTOCOL gSDMediaDeviceName;
42 extern EFI_COMPONENT_NAME2_PROTOCOL gSDMediaDeviceName2;
43
44 //
45 // Define the region of memory used for DMA memory
46 //
47 #define DMA_MEMORY_TOP 0x0000000001FFFFFFULL
48
49 #define CARD_DATA_SIGNATURE SIGNATURE_32 ('c', 'a', 'r', 'd')
50
51 //
52 // Command timeout will be max 100 ms
53 //
54 #define TIMEOUT_COMMAND 100
55 #define TIMEOUT_DATA 5000
56
57 typedef enum{
58 UnknownCard = 0,
59 MMCCard, // MMC card
60 MMCCardHighCap, // MMC Card High Capacity
61 CEATACard, // CE-ATA device
62 SDMemoryCard, // SD 1.1 card
63 SDMemoryCard2, // SD 2.0 or above standard card
64 SDMemoryCard2High // SD 2.0 or above high capacity card
65 }CARD_TYPE;
66
67
68 typedef struct {
69 //
70 //BlockIO
71 //
72 UINTN Signature;
73 EFI_BLOCK_IO_PROTOCOL BlockIo;
74
75 EFI_BLOCK_IO_MEDIA BlockIoMedia;
76
77 EFI_SD_HOST_IO_PROTOCOL *SDHostIo;
78 EFI_UNICODE_STRING_TABLE *ControllerNameTable;
79 CARD_TYPE CardType;
80
81 UINT8 CurrentBusWidth;
82 BOOLEAN DualVoltage;
83 BOOLEAN NeedFlush;
84 UINT8 Reserved[3];
85
86 UINT16 Address;
87 UINT32 BlockLen;
88 UINT32 MaxFrequency;
89 UINT64 BlockNumber;
90 //
91 //Common used
92 //
93 CARD_STATUS CardStatus;
94 OCR OCRRegister;
95 CID CIDRegister;
96 CSD CSDRegister;
97 EXT_CSD ExtCSDRegister;
98 UINT8 *RawBufferPointer;
99 UINT8 *AlignedBuffer;
100 //
101 //CE-ATA specific
102 //
103 TASK_FILE TaskFile;
104 IDENTIFY_DEVICE_DATA IndentifyDeviceData;
105 //
106 //SD specific
107 //
108 SCR SCRRegister;
109 SD_STATUS_REG SDSattus;
110 SWITCH_STATUS SwitchStatus;
111 }CARD_DATA;
112
113 #define CARD_DATA_FROM_THIS(a) \
114 CR(a, CARD_DATA, BlockIo, CARD_DATA_SIGNATURE)
115
116 /**
117 Test to see if this driver supports ControllerHandle. Any
118 ControllerHandle that has BlockIoProtocol installed will be supported.
119
120 @param This Protocol instance pointer.
121 @param Controller Handle of device to test.
122 @param RemainingDevicePath Not used.
123
124 @return EFI_SUCCESS This driver supports this device.
125 @return EFI_UNSUPPORTED This driver does not support this device.
126
127 **/
128 EFI_STATUS
129 EFIAPI
130 SDMediaDeviceSupported (
131 IN EFI_DRIVER_BINDING_PROTOCOL *This,
132 IN EFI_HANDLE Controller,
133 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
134 );
135
136 /**
137 Starting the SD Media Device Driver.
138
139 @param This Protocol instance pointer.
140 @param Controller Handle of device to test.
141 @param RemainingDevicePath Not used.
142
143 @retval EFI_SUCCESS This driver supports this device.
144 @retval EFI_UNSUPPORTED This driver does not support this device.
145 @retval EFI_DEVICE_ERROR This driver cannot be started due to device Error.
146 EFI_OUT_OF_RESOURCES- Failed due to resource shortage.
147
148 **/
149 EFI_STATUS
150 EFIAPI
151 SDMediaDeviceStart (
152 IN EFI_DRIVER_BINDING_PROTOCOL *This,
153 IN EFI_HANDLE Controller,
154 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
155 );
156
157 /**
158 Stop this driver on ControllerHandle. Support stoping any child handles
159 created by this driver.
160
161 @param This Protocol instance pointer.
162 @param Controller Handle of device to stop driver on.
163 @param NumberOfChildren Number of Children in the ChildHandleBuffer.
164 @param ChildHandleBuffer List of handles for the children we need to stop.
165
166 @return EFI_SUCCESS
167 @return others
168
169 **/
170 EFI_STATUS
171 EFIAPI
172 SDMediaDeviceStop (
173 IN EFI_DRIVER_BINDING_PROTOCOL *This,
174 IN EFI_HANDLE Controller,
175 IN UINTN NumberOfChildren,
176 IN EFI_HANDLE *ChildHandleBuffer
177 );
178
179 /**
180 MMC/SD card init function
181
182 @param CardData Pointer to CARD_DATA.
183
184 @return EFI_SUCCESS
185 @return others
186
187 **/
188 EFI_STATUS
189 MMCSDCardInit (
190 IN CARD_DATA *CardData
191 );
192
193 /**
194 Send command by using Host IO protocol
195
196 @param This A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.
197 @param CommandIndex The command index to set the command index field of command register.
198 @param Argument Command argument to set the argument field of command register.
199 @param DataType TRANSFER_TYPE, indicates no data, data in or data out.
200 @param Buffer Contains the data read from / write to the device.
201 @param BufferSize The size of the buffer.
202 @param ResponseType RESPONSE_TYPE.
203 @param TimeOut Time out value in 1 ms unit.
204 @param ResponseData Depending on the ResponseType, such as CSD or card status.
205
206 @retval EFI_SUCCESS
207 @retval EFI_INVALID_PARAMETER
208 @retval EFI_UNSUPPORTED
209 @retval EFI_DEVICE_ERROR
210
211 **/
212 EFI_STATUS
213 SendCommand (
214 IN CARD_DATA *CardData,
215 IN UINT16 CommandIndex,
216 IN UINT32 Argument,
217 IN TRANSFER_TYPE DataType,
218 IN UINT8 *Buffer, OPTIONAL
219 IN UINT32 BufferSize,
220 IN RESPONSE_TYPE ResponseType,
221 IN UINT32 TimeOut,
222 OUT UINT32 *ResponseData
223 );
224
225 /**
226 Send the card APP_CMD command with the following command indicated by CommandIndex
227
228 @param CardData Pointer to CARD_DATA.
229 @param CommandIndex The command index to set the command index field of command register.
230 @param Argument Command argument to set the argument field of command register.
231 @param DataType TRANSFER_TYPE, indicates no data, data in or data out.
232 @param Buffer Contains the data read from / write to the device.
233 @param BufferSize The size of the buffer.
234 @param ResponseType RESPONSE_TYPE.
235 @param TimeOut Time out value in 1 ms unit.
236 @param ResponseData Depending on the ResponseType, such as CSD or card status.
237
238 @retval EFI_SUCCESS
239 @retval EFI_INVALID_PARAMETER
240 @retval EFI_UNSUPPORTED
241 @retval EFI_DEVICE_ERROR
242
243 **/
244 EFI_STATUS
245 SendAppCommand (
246 IN CARD_DATA *CardData,
247 IN UINT16 CommandIndex,
248 IN UINT32 Argument,
249 IN TRANSFER_TYPE DataType,
250 IN UINT8 *Buffer, OPTIONAL
251 IN UINT32 BufferSize,
252 IN RESPONSE_TYPE ResponseType,
253 IN UINT32 TimeOut,
254 OUT UINT32 *ResponseData
255 );
256
257 /**
258 Send the card FAST_IO command
259
260 @param CardData Pointer to CARD_DATA.
261 @param RegisterAddress Register Address.
262 @param RegisterData Pointer to register Data.
263 @param Write TRUE for write, FALSE for read.
264
265 @retval EFI_SUCCESS
266 @retval EFI_UNSUPPORTED
267 @retval EFI_INVALID_PARAMETER
268 @retval EFI_DEVICE_ERROR
269
270 **/
271 EFI_STATUS
272 FastIO (
273 IN CARD_DATA *CardData,
274 IN UINT8 RegisterAddress,
275 IN OUT UINT8 *RegisterData,
276 IN BOOLEAN Write
277 );
278
279 /**
280 Judge whether it is CE-ATA device or not.
281
282 @param CardData Pointer to CARD_DATA.
283
284 @retval TRUE
285 @retval FALSE
286
287 **/
288 BOOLEAN
289 IsCEATADevice (
290 IN CARD_DATA *CardData
291 );
292
293 /**
294 Send software reset
295
296 @param CardData Pointer to CARD_DATA.
297
298 @retval EFI_SUCCESS Success
299 @retval EFI_DEVICE_ERROR Hardware Error
300 @retval EFI_INVALID_PARAMETER Parameter is error
301 @retval EFI_NO_MEDIA No media
302 @retval EFI_MEDIA_CHANGED Media Change
303 @retval EFI_BAD_BUFFER_SIZE Buffer size is bad
304
305 **/
306 EFI_STATUS
307 SoftwareReset (
308 IN CARD_DATA *CardData
309 );
310
311 /**
312 SendATACommand specificed in Taskfile
313
314 @param CardData Pointer to CARD_DATA.
315 @param TaskFile Pointer to TASK_FILE.
316 @param Write TRUE means write, FALSE means read.
317 @param Buffer If NULL, means no data transfer, neither read nor write.
318 @param SectorCount Buffer size in 512 bytes unit.
319
320 @retval EFI_SUCCESS Success
321 @retval EFI_DEVICE_ERROR Hardware Error
322 @retval EFI_INVALID_PARAMETER Parameter is error
323 @retval EFI_NO_MEDIA No media
324 @retval EFI_MEDIA_CHANGED Media Change
325 @retval EFI_BAD_BUFFER_SIZE Buffer size is bad
326
327 **/
328 EFI_STATUS
329 SendATACommand (
330 IN CARD_DATA *CardData,
331 IN TASK_FILE *TaskFile,
332 IN BOOLEAN Write,
333 IN UINT8 *Buffer,
334 IN UINT16 SectorCount
335 );
336
337 /**
338 IDENTIFY_DEVICE command
339
340 @param CardData Pointer to CARD_DATA.
341
342 @retval EFI_SUCCESS Success
343 @retval EFI_DEVICE_ERROR Hardware Error
344 @retval EFI_INVALID_PARAMETER Parameter is error
345 @retval EFI_NO_MEDIA No media
346 @retval EFI_MEDIA_CHANGED Media Change
347 @retval EFI_BAD_BUFFER_SIZE Buffer size is bad
348
349 **/
350 EFI_STATUS
351 IndentifyDevice (
352 IN CARD_DATA *CardData
353 );
354
355 /**
356 FLUSH_CACHE_EXT command
357
358 @param CardData Pointer to CARD_DATA.
359
360 @retval EFI_SUCCESS Success
361 @retval EFI_DEVICE_ERROR Hardware Error
362 @retval EFI_INVALID_PARAMETER Parameter is error
363 @retval EFI_NO_MEDIA No media
364 @retval EFI_MEDIA_CHANGED Media Change
365 @retval EFI_BAD_BUFFER_SIZE Buffer size is bad
366
367 **/
368 EFI_STATUS
369 FlushCache (
370 IN CARD_DATA *CardData
371 );
372
373 /**
374 STANDBY_IMMEDIATE command
375
376 @param CardData Pointer to CARD_DATA.
377
378 @retval EFI_SUCCESS Success
379 @retval EFI_DEVICE_ERROR Hardware Error
380 @retval EFI_INVALID_PARAMETER Parameter is error
381 @retval EFI_NO_MEDIA No media
382 @retval EFI_MEDIA_CHANGED Media Change
383 @retval EFI_BAD_BUFFER_SIZE Buffer size is bad
384
385 **/
386 EFI_STATUS
387 StandByImmediate (
388 IN CARD_DATA *CardData
389 );
390
391 /**
392 READ_DMA_EXT command
393
394 @param CardData Pointer to CARD_DATA.
395 @param LBA The starting logical block address to read from on the device.
396 @param Buffer A pointer to the destination buffer for the data. The caller
397 is responsible for either having implicit or explicit ownership
398 of the buffer.
399 @param SectorCount Size in 512 bytes unit.
400
401 @retval EFI_SUCCESS Success
402 @retval EFI_DEVICE_ERROR Hardware Error
403 @retval EFI_INVALID_PARAMETER Parameter is error
404 @retval EFI_NO_MEDIA No media
405 @retval EFI_MEDIA_CHANGED Media Change
406 @retval EFI_BAD_BUFFER_SIZE Buffer size is bad
407
408 **/
409 EFI_STATUS
410 ReadDMAExt (
411 IN CARD_DATA *CardData,
412 IN EFI_LBA LBA,
413 IN UINT8 *Buffer,
414 IN UINT16 SectorCount
415 );
416
417 /**
418 WRITE_DMA_EXT command
419
420 @param CardData Pointer to CARD_DATA.
421 @param LBA The starting logical block address to read from on the device.
422 @param Buffer A pointer to the destination buffer for the data. The caller
423 is responsible for either having implicit or explicit ownership
424 of the buffer.
425 @param SectorCount Size in 512 bytes unit.
426
427 @retval EFI_SUCCESS Success
428 @retval EFI_DEVICE_ERROR Hardware Error
429 @retval EFI_INVALID_PARAMETER Parameter is error
430 @retval EFI_NO_MEDIA No media
431 @retval EFI_MEDIA_CHANGED Media Change
432 @retval EFI_BAD_BUFFER_SIZE Buffer size is bad
433
434 **/
435 EFI_STATUS
436 WriteDMAExt (
437 IN CARD_DATA *CardData,
438 IN EFI_LBA LBA,
439 IN UINT8 *Buffer,
440 IN UINT16 SectorCount
441 );
442
443 /**
444 CEATA card BlockIo init function.
445
446 @param CardData Pointer to CARD_DATA.
447
448 @retval EFI_SUCCESS
449 @retval Others
450 **/
451 EFI_STATUS
452 CEATABlockIoInit (
453 IN CARD_DATA *CardData
454 );
455
456 /**
457 MMC/SD card BlockIo init function.
458
459 @param CardData Pointer to CARD_DATA.
460
461 @retval EFI_SUCCESS
462 @retval Others
463 **/
464 EFI_STATUS
465 MMCSDBlockIoInit (
466 IN CARD_DATA *CardData
467 );
468 #endif