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