xref: /rk3399_ARM-atf/include/drivers/brcm/emmc/emmc_chal_sd.h (revision 926cd70a0cc3a0cbf209a87765a8dc0b869798e3)
1*bffde63dSSheetal Tigadoli /*
2*bffde63dSSheetal Tigadoli  * Copyright (c) 2016 - 2020, Broadcom
3*bffde63dSSheetal Tigadoli  *
4*bffde63dSSheetal Tigadoli  * SPDX-License-Identifier: BSD-3-Clause
5*bffde63dSSheetal Tigadoli  */
6*bffde63dSSheetal Tigadoli 
7*bffde63dSSheetal Tigadoli #ifndef	CHAL_SD_H
8*bffde63dSSheetal Tigadoli #define	CHAL_SD_H
9*bffde63dSSheetal Tigadoli 
10*bffde63dSSheetal Tigadoli #include <stddef.h>
11*bffde63dSSheetal Tigadoli 
12*bffde63dSSheetal Tigadoli #define BASE_CLK_FREQ   (200 * 1000 * 1000)
13*bffde63dSSheetal Tigadoli #define INIT_CLK_FREQ   (400 * 1000)
14*bffde63dSSheetal Tigadoli 
15*bffde63dSSheetal Tigadoli #define SD_ERROR_RECOVERABLE                   0
16*bffde63dSSheetal Tigadoli #define SD_ERROR_NON_RECOVERABLE               1
17*bffde63dSSheetal Tigadoli 
18*bffde63dSSheetal Tigadoli #define SD_OK                                  0
19*bffde63dSSheetal Tigadoli #define SD_FAIL                                (-1)
20*bffde63dSSheetal Tigadoli #define SD_INVALID_HANDLE                      (-2)
21*bffde63dSSheetal Tigadoli #define SD_CEATA_INIT_ERROR                    (-3)
22*bffde63dSSheetal Tigadoli #define SD_RESET_ERROR                         (-4)
23*bffde63dSSheetal Tigadoli #define SD_CARD_INIT_ERROR                     (-5)
24*bffde63dSSheetal Tigadoli #define SD_INV_DATA_WIDTH                      (-6)
25*bffde63dSSheetal Tigadoli #define SD_SET_BUS_WIDTH_ERROR                 (-7)
26*bffde63dSSheetal Tigadoli #define SD_DMA_NOT_SUPPORT                     (-8)
27*bffde63dSSheetal Tigadoli #define SD_SDIO_READ_ERROR                     (-9)
28*bffde63dSSheetal Tigadoli #define SD_SDIO_WRITE_ERROR                    (-10)
29*bffde63dSSheetal Tigadoli #define SD_WRITE_ERROR                         (-11)
30*bffde63dSSheetal Tigadoli #define SD_READ_ERROR                          (-12)
31*bffde63dSSheetal Tigadoli #define SD_READ_SIZE_ERROR                     (-13)
32*bffde63dSSheetal Tigadoli #define SD_RW_ADDRESS_ERROR                    (-14)
33*bffde63dSSheetal Tigadoli #define SD_XFER_ADDRESS_ERROR                  (-15)
34*bffde63dSSheetal Tigadoli #define SD_DATA_XFER_ADDR_ERROR                (-16)
35*bffde63dSSheetal Tigadoli #define SD_DATA_XFER_ERROR                     (-17)
36*bffde63dSSheetal Tigadoli #define SD_WRITE_SIZE_ERROR                    (-18)
37*bffde63dSSheetal Tigadoli #define SD_CMD_STATUS_UPDATE_ERR               (-19)
38*bffde63dSSheetal Tigadoli #define SD_CMD12_ERROR                         (-20)
39*bffde63dSSheetal Tigadoli #define SD_CMD_DATA_ERROR                      (-21)
40*bffde63dSSheetal Tigadoli #define SD_CMD_TIMEOUT                         (-22)
41*bffde63dSSheetal Tigadoli #define SD_CMD_NO_RESPONSE                     (-22)
42*bffde63dSSheetal Tigadoli #define SD_CMD_ABORT_ERROR                     (-23)
43*bffde63dSSheetal Tigadoli #define SD_CMD_INVALID                         (-24)
44*bffde63dSSheetal Tigadoli #define SD_CMD_RESUME_ERROR                    (-25)
45*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_INVALID_RESPONSE            (-26)
46*bffde63dSSheetal Tigadoli #define SD_WAIT_TIMEOUT                        (-27)
47*bffde63dSSheetal Tigadoli #define SD_READ_TIMEOUT                        (-28)
48*bffde63dSSheetal Tigadoli #define SD_CEATA_REST_ERROR                    (-29)
49*bffde63dSSheetal Tigadoli #define SD_INIT_CAED_FAILED                    (-30)
50*bffde63dSSheetal Tigadoli #define SD_ERROR_CLOCK_OFFLIMIT                (-31)
51*bffde63dSSheetal Tigadoli #define SD_INV_SLOT                            (-32)
52*bffde63dSSheetal Tigadoli 
53*bffde63dSSheetal Tigadoli #define SD_NOR_INTERRUPTS                      0x000000FF
54*bffde63dSSheetal Tigadoli #define SD_ERR_INTERRUPTS                      0x03FF0000
55*bffde63dSSheetal Tigadoli #define SD_CMD_ERROR_INT                       0x010F0000
56*bffde63dSSheetal Tigadoli #define SD_DAT_ERROR_INT                       0x02F00000
57*bffde63dSSheetal Tigadoli #define SD_DAT_TIMEOUT                         0x00100000
58*bffde63dSSheetal Tigadoli 
59*bffde63dSSheetal Tigadoli /* Operation modes */
60*bffde63dSSheetal Tigadoli #define SD_PIO_MODE		               0
61*bffde63dSSheetal Tigadoli #define SD_INT_MODE		               1
62*bffde63dSSheetal Tigadoli 
63*bffde63dSSheetal Tigadoli /* Support both ADMA and SDMA (for version 2.0 and above) */
64*bffde63dSSheetal Tigadoli #define SD_DMA_OFF                             0
65*bffde63dSSheetal Tigadoli #define SD_DMA_SDMA                            1
66*bffde63dSSheetal Tigadoli #define SD_DMA_ADMA                            2
67*bffde63dSSheetal Tigadoli 
68*bffde63dSSheetal Tigadoli #define SD_NORMAL_SPEED                        0
69*bffde63dSSheetal Tigadoli #define SD_HIGH_SPEED                          1
70*bffde63dSSheetal Tigadoli 
71*bffde63dSSheetal Tigadoli #define SD_XFER_CARD_TO_HOST                   3
72*bffde63dSSheetal Tigadoli #define SD_XFER_HOST_TO_CARD                   4
73*bffde63dSSheetal Tigadoli 
74*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_AUTO                    0
75*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_SD                      1
76*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_SDIO                    2
77*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_MMC                     3
78*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_CEATA                   4
79*bffde63dSSheetal Tigadoli 
80*bffde63dSSheetal Tigadoli #define SD_ABORT_SYNC_MODE                     0
81*bffde63dSSheetal Tigadoli #define SD_ABORT_ASYNC_MODE                    1
82*bffde63dSSheetal Tigadoli 
83*bffde63dSSheetal Tigadoli #define SD_CMD_ERROR_FLAGS                     (0x18F << 16)
84*bffde63dSSheetal Tigadoli #define SD_DATA_ERROR_FLAGS                    (0x70  << 16)
85*bffde63dSSheetal Tigadoli #define SD_AUTO_CMD12_ERROR_FLAGS              (0x9F)
86*bffde63dSSheetal Tigadoli 
87*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_ERROR                   0x10000000
88*bffde63dSSheetal Tigadoli #define SD_CMD_MISSING                         0x80000000
89*bffde63dSSheetal Tigadoli #define SD_ERROR_INT                           0x8000
90*bffde63dSSheetal Tigadoli 
91*bffde63dSSheetal Tigadoli #define SD_TRAN_HIGH_SPEED                     0x32
92*bffde63dSSheetal Tigadoli #define SD_CARD_HIGH_CAPACITY                  0x40000000
93*bffde63dSSheetal Tigadoli #define SD_CARD_POWER_UP_STATUS                0x80000000
94*bffde63dSSheetal Tigadoli 
95*bffde63dSSheetal Tigadoli #define	SD_HOST_CORE_TIMEOUT                   0x0E
96*bffde63dSSheetal Tigadoli 
97*bffde63dSSheetal Tigadoli /* SD CARD and Host Controllers bus width */
98*bffde63dSSheetal Tigadoli #define	SD_BUS_DATA_WIDTH_1BIT                 0x00
99*bffde63dSSheetal Tigadoli #define	SD_BUS_DATA_WIDTH_4BIT                 0x02
100*bffde63dSSheetal Tigadoli #define	SD_BUS_DATA_WIDTH_8BIT                 0x20
101*bffde63dSSheetal Tigadoli 
102*bffde63dSSheetal Tigadoli /* dma boundary settings */
103*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_4K                     0
104*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_8K                     (1 << 12)
105*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_16K                    (2 << 12)
106*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_32K                    (3 << 12)
107*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_64K                    (4 << 12)
108*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_128K                   (5 << 12)
109*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_256K                   (6 << 12)
110*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_512K                   (7 << 12)
111*bffde63dSSheetal Tigadoli 
112*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_NORMAL                     0x00000000
113*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_SUSPEND                    0x00400000
114*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_RESUME                     0x00800000
115*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_ABORT                      0x00c00000
116*bffde63dSSheetal Tigadoli 
117*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_NONE                  0x0
118*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R2                    0x1
119*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R3_4                  0x2
120*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R1_5_6                0x2
121*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R1b_5b                0x3
122*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_S                     16
123*bffde63dSSheetal Tigadoli 
124*bffde63dSSheetal Tigadoli struct sd_ctrl_info {
125*bffde63dSSheetal Tigadoli 	uint32_t blkReg;	/* current block register cache value */
126*bffde63dSSheetal Tigadoli 	uint32_t cmdReg;	/* current command register cache value */
127*bffde63dSSheetal Tigadoli 	uint32_t argReg;	/* current argument register cache value */
128*bffde63dSSheetal Tigadoli 	uint32_t cmdIndex;	/* current command index */
129*bffde63dSSheetal Tigadoli 	uint32_t cmdStatus;	/* current command status, cmd/data compelete */
130*bffde63dSSheetal Tigadoli 	uint16_t rca;	/* relative card address */
131*bffde63dSSheetal Tigadoli 	uint32_t ocr;	/* operation codition */
132*bffde63dSSheetal Tigadoli 	uint32_t eventList;	/* events list */
133*bffde63dSSheetal Tigadoli 	uint32_t blkGapEnable;
134*bffde63dSSheetal Tigadoli 
135*bffde63dSSheetal Tigadoli 	uint32_t capability;	/* controller's capbilities */
136*bffde63dSSheetal Tigadoli 	uint32_t maxCurrent;	/* maximum current supported */
137*bffde63dSSheetal Tigadoli 	uint32_t present;	/* if card is inserted or removed */
138*bffde63dSSheetal Tigadoli 	uint32_t version;	/* SD spec version 1.0 or 2.0 */
139*bffde63dSSheetal Tigadoli 	uint32_t vendor;	/* vendor number */
140*bffde63dSSheetal Tigadoli 
141*bffde63dSSheetal Tigadoli 	uintptr_t sdRegBaseAddr;	/* sdio control registers */
142*bffde63dSSheetal Tigadoli 	uintptr_t hostRegBaseAddr;	/* SD Host control registers */
143*bffde63dSSheetal Tigadoli };
144*bffde63dSSheetal Tigadoli 
145*bffde63dSSheetal Tigadoli struct sd_cfg {
146*bffde63dSSheetal Tigadoli 	uint32_t mode;	/* interrupt or polling */
147*bffde63dSSheetal Tigadoli 	uint32_t dma;	/* dma enabled or disabled */
148*bffde63dSSheetal Tigadoli 	uint32_t retryLimit;	/* command retry limit */
149*bffde63dSSheetal Tigadoli 	uint32_t speedMode;	/* speed mode, 0 standard, 1 high speed */
150*bffde63dSSheetal Tigadoli 	uint32_t voltage;	/* voltage level */
151*bffde63dSSheetal Tigadoli 	uint32_t blockSize;	/* access block size (512 for HC card) */
152*bffde63dSSheetal Tigadoli 	uint32_t dmaBoundary;	/* dma address boundary */
153*bffde63dSSheetal Tigadoli 	uint32_t detSignal;	/* card det signal src, for test purpose only */
154*bffde63dSSheetal Tigadoli 	uint32_t rdWaiting;
155*bffde63dSSheetal Tigadoli 	uint32_t wakeupOut;
156*bffde63dSSheetal Tigadoli 	uint32_t wakeupIn;
157*bffde63dSSheetal Tigadoli 	uint32_t wakeupInt;
158*bffde63dSSheetal Tigadoli 	uint32_t wfe_retry;
159*bffde63dSSheetal Tigadoli 	uint32_t gapInt;
160*bffde63dSSheetal Tigadoli 	uint32_t readWait;
161*bffde63dSSheetal Tigadoli 	uint32_t led;
162*bffde63dSSheetal Tigadoli };
163*bffde63dSSheetal Tigadoli 
164*bffde63dSSheetal Tigadoli struct sd_dev {
165*bffde63dSSheetal Tigadoli 	struct sd_cfg cfg;		/* SD configuration */
166*bffde63dSSheetal Tigadoli 	struct sd_ctrl_info ctrl;	/* SD info */
167*bffde63dSSheetal Tigadoli };
168*bffde63dSSheetal Tigadoli 
169*bffde63dSSheetal Tigadoli int32_t chal_sd_start(CHAL_HANDLE *sdHandle, uint32_t mode,
170*bffde63dSSheetal Tigadoli 		      uint32_t sdBase, uint32_t hostBase);
171*bffde63dSSheetal Tigadoli int32_t chal_sd_config(CHAL_HANDLE *sdHandle, uint32_t speed,
172*bffde63dSSheetal Tigadoli 		       uint32_t retry, uint32_t boundary,
173*bffde63dSSheetal Tigadoli 		       uint32_t blkSize, uint32_t dma);
174*bffde63dSSheetal Tigadoli int32_t chal_sd_stop(void);
175*bffde63dSSheetal Tigadoli int32_t chal_sd_set_dma(CHAL_HANDLE *sdHandle, uint32_t mode);
176*bffde63dSSheetal Tigadoli uintptr_t chal_sd_get_dma_addr(CHAL_HANDLE *handle);
177*bffde63dSSheetal Tigadoli int32_t chal_sd_config_bus_width(CHAL_HANDLE *sdHandle, int32_t width);
178*bffde63dSSheetal Tigadoli int32_t chal_sd_send_cmd(CHAL_HANDLE *sdHandle, uint32_t cmdIndex,
179*bffde63dSSheetal Tigadoli 			 uint32_t arg, uint32_t options);
180*bffde63dSSheetal Tigadoli int32_t chal_sd_set_dma_addr(CHAL_HANDLE *sdHandle, uintptr_t address);
181*bffde63dSSheetal Tigadoli int32_t chal_sd_set_clock(CHAL_HANDLE *sdHandle,
182*bffde63dSSheetal Tigadoli 			  uint32_t div_ctrl_setting, uint32_t on);
183*bffde63dSSheetal Tigadoli uint32_t chal_sd_freq_2_div_ctrl_setting(uint32_t desired_freq);
184*bffde63dSSheetal Tigadoli int32_t chal_sd_setup_xfer(CHAL_HANDLE *sdHandle, uint8_t *data,
185*bffde63dSSheetal Tigadoli 			   uint32_t length, int32_t dir);
186*bffde63dSSheetal Tigadoli int32_t chal_sd_write_buffer(CHAL_HANDLE *sdHandle, uint32_t length,
187*bffde63dSSheetal Tigadoli 			     uint8_t *data);
188*bffde63dSSheetal Tigadoli int32_t chal_sd_read_buffer(CHAL_HANDLE *sdHandle, uint32_t length,
189*bffde63dSSheetal Tigadoli 			    uint8_t *data);
190*bffde63dSSheetal Tigadoli int32_t chal_sd_reset_line(CHAL_HANDLE *sdHandle, uint32_t line);
191*bffde63dSSheetal Tigadoli int32_t chal_sd_get_response(CHAL_HANDLE *sdHandle, uint32_t *resp);
192*bffde63dSSheetal Tigadoli int32_t chal_sd_clear_pending_irq(CHAL_HANDLE *sdHandle);
193*bffde63dSSheetal Tigadoli int32_t chal_sd_get_irq_status(CHAL_HANDLE *sdHandle);
194*bffde63dSSheetal Tigadoli int32_t chal_sd_clear_irq(CHAL_HANDLE *sdHandle, uint32_t mask);
195*bffde63dSSheetal Tigadoli uint32_t chal_sd_get_present_status(CHAL_HANDLE *sdHandle);
196*bffde63dSSheetal Tigadoli int32_t chal_sd_get_atuo12_error(CHAL_HANDLE *sdHandle);
197*bffde63dSSheetal Tigadoli void chal_sd_set_speed(CHAL_HANDLE *sdHandle, uint32_t speed);
198*bffde63dSSheetal Tigadoli int32_t chal_sd_check_cap(CHAL_HANDLE *sdHandle, uint32_t cap);
199*bffde63dSSheetal Tigadoli void chal_sd_set_irq_signal(CHAL_HANDLE *sdHandle, uint32_t mask,
200*bffde63dSSheetal Tigadoli 			    uint32_t state);
201*bffde63dSSheetal Tigadoli void chal_sd_dump_fifo(CHAL_HANDLE *sdHandle);
202*bffde63dSSheetal Tigadoli #endif /* CHAL_SD_H */
203