11bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish/** @file
21bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish  Definition of the MMC Host Protocol
31bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
4b4fdedc2543c6d193c70ae5339a56824a9729e68Olivier Martin  Copyright (c) 2011-2014, ARM Limited. All rights reserved.
53402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron
63402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron  This program and the accompanying materials
73402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron  are licensed and made available under the terms and conditions of the BSD License
83402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron  which accompanies this distribution.  The full text of the license may be found at
93402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron  http://opensource.org/licenses/bsd-license.php
103402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron
113402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
123402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
131bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
141bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish**/
151bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
161bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#ifndef __MMC_HOST_H__
171bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define __MMC_HOST_H__
181bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
191bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish///
201bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish/// Global ID for the MMC Host Protocol
211bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish///
221bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define EFI_MMC_HOST_PROTOCOL_GUID \
231bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish  { 0x3e591c00, 0x9e4a, 0x11df, {0x92, 0x44, 0x00, 0x02, 0xA5, 0xD5, 0xC5, 0x1B } }
241bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
251bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_R1        0
261bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_R1b       0
271bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_R2        1
281bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_R3        0
291bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_R6        0
301bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_R7        0
311bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_OCR       0
321bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_CID       1
331bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_CSD       1
341bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_RESPONSE_TYPE_RCA       0
351bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
361bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfishtypedef UINT32  MMC_RESPONSE_TYPE;
371bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
381bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfishtypedef UINT32 MMC_CMD;
391bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
401bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD_WAIT_RESPONSE      (1 << 16)
411bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD_LONG_RESPONSE      (1 << 17)
422b826e7350d7d3dc48be3debbff4e1007282fa33oliviermartin#define MMC_CMD_NO_CRC_RESPONSE    (1 << 18)
431bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
442b826e7350d7d3dc48be3debbff4e1007282fa33oliviermartin#define MMC_INDX(Index)       ((Index) & 0xFFFF)
452b826e7350d7d3dc48be3debbff4e1007282fa33oliviermartin#define MMC_GET_INDX(MmcCmd)  ((MmcCmd) & 0xFFFF)
461bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
472b826e7350d7d3dc48be3debbff4e1007282fa33oliviermartin#define MMC_CMD0              (MMC_INDX(0) | MMC_CMD_NO_CRC_RESPONSE)
482b826e7350d7d3dc48be3debbff4e1007282fa33oliviermartin#define MMC_CMD1              (MMC_INDX(1) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE)
491bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD2              (MMC_INDX(2) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_LONG_RESPONSE)
501bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD3              (MMC_INDX(3) | MMC_CMD_WAIT_RESPONSE)
512b826e7350d7d3dc48be3debbff4e1007282fa33oliviermartin#define MMC_CMD5              (MMC_INDX(5) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE)
52a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define MMC_CMD6              (MMC_INDX(6) | MMC_CMD_WAIT_RESPONSE)
531bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD7              (MMC_INDX(7) | MMC_CMD_WAIT_RESPONSE)
541bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD8              (MMC_INDX(8) | MMC_CMD_WAIT_RESPONSE)
551bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD9              (MMC_INDX(9) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_LONG_RESPONSE)
561bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD11             (MMC_INDX(11) | MMC_CMD_WAIT_RESPONSE)
571bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD12             (MMC_INDX(12) | MMC_CMD_WAIT_RESPONSE)
581bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD13             (MMC_INDX(13) | MMC_CMD_WAIT_RESPONSE)
591bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD16             (MMC_INDX(16) | MMC_CMD_WAIT_RESPONSE)
601bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD17             (MMC_INDX(17) | MMC_CMD_WAIT_RESPONSE)
611bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD18             (MMC_INDX(18) | MMC_CMD_WAIT_RESPONSE)
621bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD20             (MMC_INDX(20) | MMC_CMD_WAIT_RESPONSE)
631bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD23             (MMC_INDX(23) | MMC_CMD_WAIT_RESPONSE)
641bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD24             (MMC_INDX(24) | MMC_CMD_WAIT_RESPONSE)
65a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define MMC_CMD25             (MMC_INDX(25) | MMC_CMD_WAIT_RESPONSE)
66830d3130527934b4888515b92582ce75c69b33ecShivamurthy Shastri#define MMC_CMD35             (MMC_INDX(35) | MMC_CMD_WAIT_RESPONSE)
67830d3130527934b4888515b92582ce75c69b33ecShivamurthy Shastri#define MMC_CMD36             (MMC_INDX(36) | MMC_CMD_WAIT_RESPONSE)
68830d3130527934b4888515b92582ce75c69b33ecShivamurthy Shastri#define MMC_CMD38             (MMC_INDX(38) | MMC_CMD_WAIT_RESPONSE)
691bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#define MMC_CMD55             (MMC_INDX(55) | MMC_CMD_WAIT_RESPONSE)
702b826e7350d7d3dc48be3debbff4e1007282fa33oliviermartin#define MMC_ACMD41            (MMC_INDX(41) | MMC_CMD_WAIT_RESPONSE | MMC_CMD_NO_CRC_RESPONSE)
71a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define MMC_ACMD51            (MMC_INDX(51) | MMC_CMD_WAIT_RESPONSE)
721bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
73b4fdedc2543c6d193c70ae5339a56824a9729e68Olivier Martin// Valid responses for CMD1 in eMMC
74b4fdedc2543c6d193c70ae5339a56824a9729e68Olivier Martin#define EMMC_CMD1_CAPACITY_LESS_THAN_2GB 0x00FF8080 // Capacity <= 2GB, byte addressing used
75b4fdedc2543c6d193c70ae5339a56824a9729e68Olivier Martin#define EMMC_CMD1_CAPACITY_GREATER_THAN_2GB 0x40FF8080 // Capacity > 2GB, 512-byte sector addressing used
76b4fdedc2543c6d193c70ae5339a56824a9729e68Olivier Martin
77a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define MMC_STATUS_APP_CMD    (1 << 5)
78a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang
791bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfishtypedef enum _MMC_STATE {
801bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcInvalidState = 0,
811bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcHwInitializationState,
821bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcIdleState,
831bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcReadyState,
841bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcIdentificationState,
851bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcStandByState,
861bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcTransferState,
871bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcSendingDataState,
881bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcReceiveDataState,
891bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcProgrammingState,
901bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish    MmcDisconnectState,
911bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish} MMC_STATE;
921bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
93a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCBACKWARD         (0)
94a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS26             (1 << 0)      // High-Speed @26MHz at rated device voltages
95a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS52             (1 << 1)      // High-Speed @52MHz at rated device voltages
96a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS52DDR1V8       (1 << 2)      // High-Speed Dual Data Rate @52MHz 1.8V or 3V I/O
97a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS52DDR1V2       (1 << 3)      // High-Speed Dual Data Rate @52MHz 1.2V I/O
98a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS200SDR1V8      (1 << 4)      // HS200 Single Data Rate @200MHz 1.8V I/O
99a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS200SDR1V2      (1 << 5)      // HS200 Single Data Rate @200MHz 1.2V I/O
100a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS400DDR1V8      (1 << 6)      // HS400 Dual Data Rate @400MHz 1.8V I/O
101a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define EMMCHS400DDR1V2      (1 << 7)      // HS400 Dual Data Rate @400MHz 1.2V I/O
102a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang
10316d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin///
10416d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin/// Forward declaration for EFI_MMC_HOST_PROTOCOL
10516d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin///
10616d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef struct _EFI_MMC_HOST_PROTOCOL  EFI_MMC_HOST_PROTOCOL;
10716d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
10816d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef BOOLEAN (EFIAPI *MMC_ISCARDPRESENT) (
10916d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL   *This
11016d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
11116d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
11216d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef BOOLEAN (EFIAPI *MMC_ISREADONLY) (
11316d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL   *This
11416d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
11516d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
11616d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef EFI_STATUS (EFIAPI *MMC_BUILDDEVICEPATH) (
11716d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL     *This,
11816d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  OUT EFI_DEVICE_PATH_PROTOCOL  **DevicePath
11916d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
12016d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
12116d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef EFI_STATUS (EFIAPI *MMC_NOTIFYSTATE) (
12216d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL     *This,
12316d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  MMC_STATE                 State
12416d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
12516d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
12616d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef EFI_STATUS (EFIAPI *MMC_SENDCOMMAND) (
12716d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL     *This,
12816d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  MMC_CMD                   Cmd,
12916d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  UINT32                    Argument
13016d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
13116d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
13216d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef EFI_STATUS (EFIAPI *MMC_RECEIVERESPONSE) (
13316d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL     *This,
13416d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  MMC_RESPONSE_TYPE         Type,
13516d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  UINT32                    *Buffer
13616d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
13716d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
13816d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef EFI_STATUS (EFIAPI *MMC_READBLOCKDATA) (
13916d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL     *This,
14016d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_LBA                   Lba,
14116d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  UINTN                     Length,
14216d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  OUT UINT32                    *Buffer
14316d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
14416d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
14516d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartintypedef EFI_STATUS (EFIAPI *MMC_WRITEBLOCKDATA) (
14616d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_MMC_HOST_PROTOCOL     *This,
14716d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  EFI_LBA                   Lba,
14816d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  UINTN                     Length,
14916d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  IN  UINT32                    *Buffer
15016d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  );
1511bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
152a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuangtypedef EFI_STATUS (EFIAPI *MMC_SETIOS) (
153a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  IN  EFI_MMC_HOST_PROTOCOL     *This,
154a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  IN  UINT32                    BusClockFreq,
155a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  IN  UINT32                    BusWidth,
156a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  IN  UINT32                    TimingMode
157a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  );
158a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang
159a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuangtypedef BOOLEAN (EFIAPI *MMC_ISMULTIBLOCK) (
160a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  IN  EFI_MMC_HOST_PROTOCOL     *This
161a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  );
1621bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
1636b062a863f5c81a3064fff86c608d1a5eae8bf72oliviermartinstruct _EFI_MMC_HOST_PROTOCOL {
1641bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
16516d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  UINT32                  Revision;
16616d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_ISCARDPRESENT       IsCardPresent;
16716d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_ISREADONLY          IsReadOnly;
16816d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_BUILDDEVICEPATH     BuildDevicePath;
1691bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
17016d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_NOTIFYSTATE         NotifyState;
1711bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
17216d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_SENDCOMMAND         SendCommand;
17316d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_RECEIVERESPONSE     ReceiveResponse;
1741bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
17516d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_READBLOCKDATA       ReadBlockData;
17616d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin  MMC_WRITEBLOCKDATA      WriteBlockData;
1771bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
178a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  MMC_SETIOS              SetIos;
179a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang  MMC_ISMULTIBLOCK        IsMultiBlock;
180a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang
1816b062a863f5c81a3064fff86c608d1a5eae8bf72oliviermartin};
1821bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
183a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define MMC_HOST_PROTOCOL_REVISION    0x00010002    // 1.2
184a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang
185a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define MMC_HOST_HAS_SETIOS(Host)     (Host->Revision >= MMC_HOST_PROTOCOL_REVISION && \
186a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang                                       Host->SetIos != NULL)
187a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang#define MMC_HOST_HAS_ISMULTIBLOCK(Host) (Host->Revision >= MMC_HOST_PROTOCOL_REVISION && \
188a28b9aef6769fd07c2b5e67a8c3c7a42bf486463Haojian Zhuang                                         Host->IsMultiBlock != NULL)
18916d88c2d20ccd9f8ea52967b578ece82174ea762oliviermartin
1901bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfishextern EFI_GUID gEfiMmcHostProtocolGuid;
1911bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
1921bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish#endif
1931bfda055dfbc52678655ab2ded721f9f7c0cd496andrewfish
194