2
Header for the MMC Host Protocol implementation for the ARM PrimeCell PL180.
4
Copyright (c) 2011-2012, ARM Limited. All rights reserved.
6
This program and the accompanying materials
7
are licensed and made available under the terms and conditions of the BSD License
8
which accompanies this distribution. The full text of the license may be found at
9
http://opensource.org/licenses/bsd-license.php
11
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21
#include <Protocol/MmcHost.h>
23
#include <Library/UefiLib.h>
24
#include <Library/DebugLib.h>
25
#include <Library/UefiBootServicesTableLib.h>
26
#include <Library/IoLib.h>
27
#include <Library/TimerLib.h>
28
#include <Library/PcdLib.h>
30
#define PL180_MCI_DXE_VERSION 0x10
32
#define MCI_SYSCTL FixedPcdGet32 (PcdPL180MciBaseAddress)
34
#define MCI_POWER_CONTROL_REG (MCI_SYSCTL + 0x000)
35
#define MCI_CLOCK_CONTROL_REG (MCI_SYSCTL + 0x004)
36
#define MCI_ARGUMENT_REG (MCI_SYSCTL + 0x008)
37
#define MCI_COMMAND_REG (MCI_SYSCTL + 0x00C)
38
#define MCI_RESPCMD_REG (MCI_SYSCTL + 0x010)
39
#define MCI_RESPONSE3_REG (MCI_SYSCTL + 0x014)
40
#define MCI_RESPONSE2_REG (MCI_SYSCTL + 0x018)
41
#define MCI_RESPONSE1_REG (MCI_SYSCTL + 0x01C)
42
#define MCI_RESPONSE0_REG (MCI_SYSCTL + 0x020)
43
#define MCI_DATA_TIMER_REG (MCI_SYSCTL + 0x024)
44
#define MCI_DATA_LENGTH_REG (MCI_SYSCTL + 0x028)
45
#define MCI_DATA_CTL_REG (MCI_SYSCTL + 0x02C)
46
#define MCI_DATA_COUNTER (MCI_SYSCTL + 0x030)
47
#define MCI_STATUS_REG (MCI_SYSCTL + 0x034)
48
#define MCI_CLEAR_STATUS_REG (MCI_SYSCTL + 0x038)
49
#define MCI_INT0_MASK_REG (MCI_SYSCTL + 0x03C)
50
#define MCI_INT1_MASK_REG (MCI_SYSCTL + 0x040)
51
#define MCI_SELECT_REG (MCI_SYSCTL + 0x044)
52
#define MCI_FIFOCOUNT_REG (MCI_SYSCTL + 0x048)
53
#define MCI_FIFO_REG (MCI_SYSCTL + 0x080)
55
#define MCI_POWER_OFF 0
56
#define MCI_POWER_UP BIT1
57
#define MCI_POWER_ON (BIT1 | BIT0)
58
#define MCI_POWER_OPENDRAIN BIT6
59
#define MCI_POWER_ROD BIT7
61
#define MCI_CLOCK_ENABLE BIT8
62
#define MCI_CLOCK_POWERSAVE BIT9
63
#define MCI_CLOCK_BYPASS BIT10
64
#define MCI_CLOCK_WIDEBUS BIT11
66
#define MCI_STATUS_CMD_CMDCRCFAIL BIT0
67
#define MCI_STATUS_CMD_DATACRCFAIL BIT1
68
#define MCI_STATUS_CMD_CMDTIMEOUT BIT2
69
#define MCI_STATUS_CMD_DATATIMEOUT BIT3
70
#define MCI_STATUS_CMD_TX_UNDERRUN BIT4
71
#define MCI_STATUS_CMD_RXOVERRUN BIT5
72
#define MCI_STATUS_CMD_RESPEND BIT6
73
#define MCI_STATUS_CMD_SENT BIT7
74
#define MCI_STATUS_CMD_DATAEND BIT8
75
#define MCI_STATUS_CMD_START_BIT_ERROR BIT9
76
#define MCI_STATUS_CMD_DATABLOCKEND BIT10
77
#define MCI_STATUS_CMD_ACTIVE BIT11
78
#define MCI_STATUS_CMD_TXACTIVE BIT12
79
#define MCI_STATUS_CMD_RXACTIVE BIT13
80
#define MCI_STATUS_CMD_TXFIFOHALFEMPTY BIT14
81
#define MCI_STATUS_CMD_RXFIFOHALFFULL BIT15
82
#define MCI_STATUS_CMD_TXFIFOFULL BIT16
83
#define MCI_STATUS_CMD_RXFIFOFULL BIT17
84
#define MCI_STATUS_CMD_TXFIFOEMPTY BIT18
85
#define MCI_STATUS_CMD_RXFIFOEMPTY BIT19
86
#define MCI_STATUS_CMD_TXDATAAVAILBL BIT20
87
#define MCI_STATUS_CMD_RXDATAAVAILBL BIT21
89
#define MCI_STATUS_TXDONE (MCI_STATUS_CMD_DATAEND | MCI_STATUS_CMD_DATABLOCKEND)
90
#define MCI_STATUS_RXDONE (MCI_STATUS_CMD_DATAEND | MCI_STATUS_CMD_DATABLOCKEND)
91
#define MCI_STATUS_READ_ERROR ( MCI_STATUS_CMD_DATACRCFAIL \
92
| MCI_STATUS_CMD_DATATIMEOUT \
93
| MCI_STATUS_CMD_RXOVERRUN \
94
| MCI_STATUS_CMD_START_BIT_ERROR )
95
#define MCI_STATUS_WRITE_ERROR ( MCI_STATUS_CMD_DATACRCFAIL \
96
| MCI_STATUS_CMD_DATATIMEOUT \
97
| MCI_STATUS_CMD_TX_UNDERRUN )
98
#define MCI_STATUS_CMD_ERROR ( MCI_STATUS_CMD_CMDCRCFAIL \
99
| MCI_STATUS_CMD_CMDTIMEOUT \
100
| MCI_STATUS_CMD_START_BIT_ERROR )
102
#define MCI_CLR_CMD_STATUS ( MCI_STATUS_CMD_RESPEND \
103
| MCI_STATUS_CMD_SENT \
104
| MCI_STATUS_CMD_ERROR )
106
#define MCI_CLR_READ_STATUS ( MCI_STATUS_RXDONE \
107
| MCI_STATUS_READ_ERROR )
109
#define MCI_CLR_WRITE_STATUS ( MCI_STATUS_TXDONE \
110
| MCI_STATUS_WRITE_ERROR )
112
#define MCI_CLR_ALL_STATUS (BIT11 - 1)
114
#define MCI_DATACTL_DISABLE_MASK 0xFE
115
#define MCI_DATACTL_ENABLE BIT0
116
#define MCI_DATACTL_CONT_TO_CARD 0
117
#define MCI_DATACTL_CARD_TO_CONT BIT1
118
#define MCI_DATACTL_BLOCK_TRANS 0
119
#define MCI_DATACTL_STREAM_TRANS BIT2
120
#define MCI_DATACTL_DMA_DISABLED 0
121
#define MCI_DATACTL_DMA_ENABLE BIT3
123
#define INDX_MASK 0x3F
125
#define MCI_CPSM_WAIT_RESPONSE BIT6
126
#define MCI_CPSM_LONG_RESPONSE BIT7
127
#define MCI_CPSM_LONG_INTERRUPT BIT8
128
#define MCI_CPSM_LONG_PENDING BIT9
129
#define MCI_CPSM_ENABLE BIT10
131
#define MCI_TRACE(txt) DEBUG ((EFI_D_BLKIO, "ARM_MCI: " txt "\n"))
136
IN EFI_COMPONENT_NAME_PROTOCOL *This,
138
OUT CHAR16 **DriverName
143
MciGetControllerName (
144
IN EFI_COMPONENT_NAME_PROTOCOL *This,
145
IN EFI_HANDLE ControllerHandle,
146
IN EFI_HANDLE ChildHandle OPTIONAL,
148
OUT CHAR16 **ControllerName