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