xref: /rk3399_ARM-atf/include/drivers/brcm/emmc/emmc_csl_sdcmd.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 CSL_SD_CMD_H
8*bffde63dSSheetal Tigadoli #define CSL_SD_CMD_H
9*bffde63dSSheetal Tigadoli 
10*bffde63dSSheetal Tigadoli #define SD_CMD_OK      0
11*bffde63dSSheetal Tigadoli #define SD_CMD_ERROR  -1
12*bffde63dSSheetal Tigadoli 
13*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_NO_IO_FUNC           5
14*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_INVALID_PARAMETER    6
15*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_R1_ILLEGAL_COMMAND   7
16*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_R1_COM_CRC_ERROR     8
17*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_R1_FUNC_NUM_ERROR    9
18*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_R1_ADDRESS_ERROR    10
19*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_R1_PARAMETER_ERROR  11
20*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_DATA_ERROR_TOKEN    12
21*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_DATA_NOT_ACCEPTED   13
22*bffde63dSSheetal Tigadoli #define SD_CMD7_ARG_RCA_SHIFT          16
23*bffde63dSSheetal Tigadoli 
24*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_PENDING                 0x01
25*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_BUFFER_OVERFLOW         0x01
26*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DEVICE_BUSY             0x02
27*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_UNSUCCESSFUL            0x03
28*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_NOT_IMPLEMENTED         0x04
29*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_ACCESS_VIOLATION        0x05
30*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_INVALID_HANDLE          0x06
31*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_INVALID_PARAMETER       0x07
32*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_NO_SUCH_DEVICE          0x08
33*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_INVALID_DEVICE_REQUEST  0x09
34*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_NO_MEMORY               0x0A
35*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_BUS_DRIVER_NOT_READY    0x0B
36*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DATA_ERROR              0x0C
37*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_CRC_ERROR               0x0D
38*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_INSUFFICIENT_RESOURCES  0x0E
39*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DEVICE_NOT_CONNECTED    0x10
40*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DEVICE_REMOVED          0x11
41*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DEVICE_NOT_RESPONDING   0x12
42*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_CANCELED                0x13
43*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_RESPONSE_TIMEOUT        0x14
44*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DATA_TIMEOUT            0x15
45*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DEVICE_RESPONSE_ERROR   0x16
46*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_DEVICE_UNSUPPORTED      0x17
47*bffde63dSSheetal Tigadoli 
48*bffde63dSSheetal Tigadoli /* Response structure */
49*bffde63dSSheetal Tigadoli struct sd_r2_resp {
50*bffde63dSSheetal Tigadoli 	uint32_t rsp4;	/* 127:96 */
51*bffde63dSSheetal Tigadoli 	uint32_t rsp3;	/* 95:64 */
52*bffde63dSSheetal Tigadoli 	uint32_t rsp2;	/* 63:32 */
53*bffde63dSSheetal Tigadoli 	uint32_t rsp1;	/* 31:0 */
54*bffde63dSSheetal Tigadoli };
55*bffde63dSSheetal Tigadoli 
56*bffde63dSSheetal Tigadoli struct sd_r3_resp {
57*bffde63dSSheetal Tigadoli 	uint32_t ocr;
58*bffde63dSSheetal Tigadoli };
59*bffde63dSSheetal Tigadoli 
60*bffde63dSSheetal Tigadoli struct sd_r4_resp {
61*bffde63dSSheetal Tigadoli 	uint8_t cardReady;
62*bffde63dSSheetal Tigadoli 	uint8_t funcs;
63*bffde63dSSheetal Tigadoli 	uint8_t memPresent;
64*bffde63dSSheetal Tigadoli 	uint32_t ocr;
65*bffde63dSSheetal Tigadoli };
66*bffde63dSSheetal Tigadoli 
67*bffde63dSSheetal Tigadoli struct  sd_r5_resp {
68*bffde63dSSheetal Tigadoli 	uint8_t data;
69*bffde63dSSheetal Tigadoli };
70*bffde63dSSheetal Tigadoli 
71*bffde63dSSheetal Tigadoli struct sd_r6_resp {
72*bffde63dSSheetal Tigadoli 	uint16_t rca;
73*bffde63dSSheetal Tigadoli 	uint16_t cardStatus;
74*bffde63dSSheetal Tigadoli };
75*bffde63dSSheetal Tigadoli 
76*bffde63dSSheetal Tigadoli struct sd_r7_resp {
77*bffde63dSSheetal Tigadoli 	uint16_t rca;
78*bffde63dSSheetal Tigadoli };
79*bffde63dSSheetal Tigadoli 
80*bffde63dSSheetal Tigadoli struct sd_resp {
81*bffde63dSSheetal Tigadoli 	uint8_t r1;
82*bffde63dSSheetal Tigadoli 	uint32_t cardStatus;
83*bffde63dSSheetal Tigadoli 	uint32_t rawData[4];
84*bffde63dSSheetal Tigadoli 	union {
85*bffde63dSSheetal Tigadoli 		struct sd_r2_resp r2;
86*bffde63dSSheetal Tigadoli 		struct sd_r3_resp r3;
87*bffde63dSSheetal Tigadoli 		struct sd_r4_resp r4;
88*bffde63dSSheetal Tigadoli 		struct sd_r5_resp r5;
89*bffde63dSSheetal Tigadoli 		struct sd_r6_resp r6;
90*bffde63dSSheetal Tigadoli 		struct sd_r7_resp r7;
91*bffde63dSSheetal Tigadoli 	} data;
92*bffde63dSSheetal Tigadoli };
93*bffde63dSSheetal Tigadoli 
94*bffde63dSSheetal Tigadoli struct sd_card_info {
95*bffde63dSSheetal Tigadoli 	uint32_t type;	/* card type SD, MMC or SDIO */
96*bffde63dSSheetal Tigadoli 	uint64_t size;	/* card size */
97*bffde63dSSheetal Tigadoli 	uint32_t speed;	/* card speed */
98*bffde63dSSheetal Tigadoli 	uint32_t voltage;	/* voltage supported */
99*bffde63dSSheetal Tigadoli 	uint32_t mId;	/* manufacturer ID */
100*bffde63dSSheetal Tigadoli 	uint32_t oId;	/* OEM ID */
101*bffde63dSSheetal Tigadoli 	uint32_t classes;	/* card class */
102*bffde63dSSheetal Tigadoli 	uint32_t name1;	/* product name part 1 */
103*bffde63dSSheetal Tigadoli 	uint32_t name2;	/* product name part 2 */
104*bffde63dSSheetal Tigadoli 	uint32_t revision;	/* revison */
105*bffde63dSSheetal Tigadoli 	uint32_t sn;	/* serial number */
106*bffde63dSSheetal Tigadoli 	uint32_t numIoFuns;	/* total I/O function number */
107*bffde63dSSheetal Tigadoli 	uint32_t maxRdBlkLen;	/* max read block length */
108*bffde63dSSheetal Tigadoli 	uint32_t maxWtBlkLen;	/* max write block length */
109*bffde63dSSheetal Tigadoli 	uint32_t blkMode;	/* sdio card block mode support */
110*bffde63dSSheetal Tigadoli 	uint32_t f0Cis;	/* sdio card block mode support */
111*bffde63dSSheetal Tigadoli 	uint32_t f1Cis;	/* sdio card block mode support */
112*bffde63dSSheetal Tigadoli 
113*bffde63dSSheetal Tigadoli 	uint8_t partRead;	/* partial block read allowed */
114*bffde63dSSheetal Tigadoli 	uint8_t partWrite;	/* partial block write allowed */
115*bffde63dSSheetal Tigadoli 	uint8_t dsr;	/* card DSR */
116*bffde63dSSheetal Tigadoli 	uint8_t rdCurMin;	/* min current for read */
117*bffde63dSSheetal Tigadoli 	uint8_t rdCurMax;	/* max current for read */
118*bffde63dSSheetal Tigadoli 	uint8_t wtCurMin;	/* min current for write */
119*bffde63dSSheetal Tigadoli 	uint8_t wtCurMax;	/* max current for write */
120*bffde63dSSheetal Tigadoli 	uint8_t erase;	/* erase enable */
121*bffde63dSSheetal Tigadoli 	uint8_t eraseSecSize;	/* erase sector size */
122*bffde63dSSheetal Tigadoli 	uint8_t proGrpSize;	/* write protection group size */
123*bffde63dSSheetal Tigadoli 	uint8_t protect;	/* permanent write protection or not */
124*bffde63dSSheetal Tigadoli 	uint8_t tmpProt;	/* temp write protection or not */
125*bffde63dSSheetal Tigadoli 	uint8_t wtSpeed;	/* write speed relatively to read */
126*bffde63dSSheetal Tigadoli 	uint8_t version;	/* card version 0:1.0 - 1.01, 1:1.10, 2:2.0 */
127*bffde63dSSheetal Tigadoli 	uint8_t eraseState;	/* if the data will be 0 or 1 after erase */
128*bffde63dSSheetal Tigadoli 	uint8_t bus;	/* data with supported */
129*bffde63dSSheetal Tigadoli 	uint8_t security;	/* security support 0, 2:1.01 3:2.0 */
130*bffde63dSSheetal Tigadoli 	uint8_t format;	/* file format */
131*bffde63dSSheetal Tigadoli 	uint8_t fileGrp;	/* file group */
132*bffde63dSSheetal Tigadoli 	char pwd[20];	/* password */
133*bffde63dSSheetal Tigadoli };
134*bffde63dSSheetal Tigadoli 
135*bffde63dSSheetal Tigadoli struct sd_handle {
136*bffde63dSSheetal Tigadoli 	struct sd_dev *device;
137*bffde63dSSheetal Tigadoli 	struct sd_card_info *card;
138*bffde63dSSheetal Tigadoli };
139*bffde63dSSheetal Tigadoli 
140*bffde63dSSheetal Tigadoli int sd_cmd0(struct sd_handle *handle);
141*bffde63dSSheetal Tigadoli int sd_cmd1(struct sd_handle *handle, uint32_t initOcr, uint32_t *ocr);
142*bffde63dSSheetal Tigadoli int sd_cmd2(struct sd_handle *handle);
143*bffde63dSSheetal Tigadoli int sd_cmd3(struct sd_handle *handle);
144*bffde63dSSheetal Tigadoli int sd_cmd7(struct sd_handle *handle, uint32_t rca);
145*bffde63dSSheetal Tigadoli int sd_cmd9(struct sd_handle *handle, struct sd_card_data *card);
146*bffde63dSSheetal Tigadoli int sd_cmd13(struct sd_handle *handle, uint32_t *status);
147*bffde63dSSheetal Tigadoli int sd_cmd16(struct sd_handle *handle, uint32_t blockLen);
148*bffde63dSSheetal Tigadoli int sd_cmd17(struct sd_handle *handle,
149*bffde63dSSheetal Tigadoli 	     uint32_t addr, uint32_t len, uint8_t *buffer);
150*bffde63dSSheetal Tigadoli int sd_cmd18(struct sd_handle *handle,
151*bffde63dSSheetal Tigadoli 	     uint32_t addr, uint32_t len, uint8_t *buffer);
152*bffde63dSSheetal Tigadoli #ifdef INCLUDE_EMMC_DRIVER_WRITE_CODE
153*bffde63dSSheetal Tigadoli int sd_cmd24(struct sd_handle *handle,
154*bffde63dSSheetal Tigadoli 	     uint32_t addr, uint32_t len, uint8_t *buffer);
155*bffde63dSSheetal Tigadoli int sd_cmd25(struct sd_handle *handle,
156*bffde63dSSheetal Tigadoli 	     uint32_t addr, uint32_t len, uint8_t *buffer);
157*bffde63dSSheetal Tigadoli #endif
158*bffde63dSSheetal Tigadoli #ifdef INCLUDE_EMMC_DRIVER_ERASE_CODE
159*bffde63dSSheetal Tigadoli int sd_cmd35(struct sd_handle *handle, uint32_t start);
160*bffde63dSSheetal Tigadoli int sd_cmd36(struct sd_handle *handle, uint32_t end);
161*bffde63dSSheetal Tigadoli int sd_cmd38(struct sd_handle *handle);
162*bffde63dSSheetal Tigadoli #endif
163*bffde63dSSheetal Tigadoli int mmc_cmd6(struct sd_handle *handle, uint32_t argument);
164*bffde63dSSheetal Tigadoli int mmc_cmd8(struct sd_handle *handle, uint8_t *extCsdReg);
165*bffde63dSSheetal Tigadoli 
166*bffde63dSSheetal Tigadoli int send_cmd(struct sd_handle *handle, uint32_t cmdIndex,
167*bffde63dSSheetal Tigadoli 	     uint32_t argument, uint32_t options, struct sd_resp *resp);
168*bffde63dSSheetal Tigadoli #endif /* CSL_SD_CMD_H */
169