-typedef BOOLEAN (*MMC_ISREADONLY)();\r
-\r
-typedef EFI_STATUS (*MMC_BUILDDEVICEPATH)(EFI_DEVICE_PATH_PROTOCOL **DevicePath);\r
-\r
-typedef EFI_STATUS (*MMC_NOTIFYSTATE)(MMC_STATE State);\r
-\r
-typedef EFI_STATUS (*MMC_SENDCOMMAND)(MMC_CMD Cmd, UINT32 Argument);\r
-\r
-typedef EFI_STATUS (*MMC_RECEIVERESPONSE)(MMC_RESPONSE_TYPE Type, UINT32* Buffer);\r
-\r
-typedef EFI_STATUS (*MMC_READBLOCKDATA)(EFI_LBA Lba, UINTN Length, UINT32* Buffer);\r
-\r
-typedef EFI_STATUS (*MMC_WRITEBLOCKDATA)(EFI_LBA Lba, UINTN Length, UINT32* Buffer);\r
-\r
-typedef struct _EFI_MMC_HOST_PROTOCOL {\r
- MMC_ISCARDPRESENT IsCardPresent;\r
- MMC_ISREADONLY IsReadOnly;\r
- MMC_BUILDDEVICEPATH BuildDevicePath;\r
-\r
- MMC_NOTIFYSTATE NotifyState;\r
-\r
- MMC_SENDCOMMAND SendCommand;\r
- MMC_RECEIVERESPONSE ReceiveResponse;\r
-\r
- MMC_READBLOCKDATA ReadBlockData;\r
- MMC_WRITEBLOCKDATA WriteBlockData;\r
-} EFI_MMC_HOST_PROTOCOL;\r
-\r
-extern EFI_GUID gEfiMmcHostProtocolGuid;\r
+///\r
+/// Forward declaration for EFI_MMC_HOST_PROTOCOL\r
+///\r
+typedef struct _EFI_MMC_HOST_PROTOCOL EFI_MMC_HOST_PROTOCOL;\r
+\r
+typedef BOOLEAN (EFIAPI *MMC_ISCARDPRESENT)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This\r
+ );\r
+\r
+typedef BOOLEAN (EFIAPI *MMC_ISREADONLY)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This\r
+ );\r
+\r
+typedef EFI_STATUS (EFIAPI *MMC_BUILDDEVICEPATH)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This,\r
+ OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath\r
+ );\r
+\r
+typedef EFI_STATUS (EFIAPI *MMC_NOTIFYSTATE)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This,\r
+ IN MMC_STATE State\r
+ );\r
+\r
+typedef EFI_STATUS (EFIAPI *MMC_SENDCOMMAND)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This,\r
+ IN MMC_CMD Cmd,\r
+ IN UINT32 Argument\r
+ );\r
+\r
+typedef EFI_STATUS (EFIAPI *MMC_RECEIVERESPONSE)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This,\r
+ IN MMC_RESPONSE_TYPE Type,\r
+ IN UINT32 *Buffer\r
+ );\r
+\r
+typedef EFI_STATUS (EFIAPI *MMC_READBLOCKDATA)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This,\r
+ IN EFI_LBA Lba,\r
+ IN UINTN Length,\r
+ OUT UINT32 *Buffer\r
+ );\r
+\r
+typedef EFI_STATUS (EFIAPI *MMC_WRITEBLOCKDATA)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This,\r
+ IN EFI_LBA Lba,\r
+ IN UINTN Length,\r
+ IN UINT32 *Buffer\r
+ );\r
+\r
+typedef EFI_STATUS (EFIAPI *MMC_SETIOS)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This,\r
+ IN UINT32 BusClockFreq,\r
+ IN UINT32 BusWidth,\r
+ IN UINT32 TimingMode\r
+ );\r
+\r
+typedef BOOLEAN (EFIAPI *MMC_ISMULTIBLOCK)(\r
+ IN EFI_MMC_HOST_PROTOCOL *This\r
+ );\r
+\r
+struct _EFI_MMC_HOST_PROTOCOL {\r
+ UINT32 Revision;\r
+ MMC_ISCARDPRESENT IsCardPresent;\r
+ MMC_ISREADONLY IsReadOnly;\r
+ MMC_BUILDDEVICEPATH BuildDevicePath;\r
+\r
+ MMC_NOTIFYSTATE NotifyState;\r
+\r
+ MMC_SENDCOMMAND SendCommand;\r
+ MMC_RECEIVERESPONSE ReceiveResponse;\r
+\r
+ MMC_READBLOCKDATA ReadBlockData;\r
+ MMC_WRITEBLOCKDATA WriteBlockData;\r
+\r
+ MMC_SETIOS SetIos;\r
+ MMC_ISMULTIBLOCK IsMultiBlock;\r
+};\r
+\r
+#define MMC_HOST_PROTOCOL_REVISION 0x00010002 // 1.2\r
+\r
+#define MMC_HOST_HAS_SETIOS(Host) (Host->Revision >= MMC_HOST_PROTOCOL_REVISION &&\\r
+ Host->SetIos != NULL)\r
+#define MMC_HOST_HAS_ISMULTIBLOCK(Host) (Host->Revision >= MMC_HOST_PROTOCOL_REVISION &&\\r
+ Host->IsMultiBlock != NULL)\r
+\r
+extern EFI_GUID gEmbeddedMmcHostProtocolGuid;\r