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