1 /*
2  * Copyright (c) 2020-2023 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #include "mmc_emmc.h"
10 #include "mmc_sd.h"
11 #include "mmc_sdio.h"
12 #include "securec.h"
13 
14 #define HDF_LOG_TAG mmc_protocol_c
15 
16 #define INIT_CMD_RETRY_TIMES 100
17 #define MMC_CMD_DEFAULT_RETRY_TIMES 3
18 #define SEND_STATUS_CMD_RETRY_TIMES 100
19 #define STOP_TRANSMISSION_CMD_RETRY_TIMES 5
20 #define BITS_NUMBER_OF_4_BYTES 32
21 #define SEND_OP_COND_DELAY     10
22 #define SD_SEND_OP_COND_DELAY  20
23 
24 /* TRAN_SPEED: Frequency unit 0 = 100KHz, 1 = 1MHz, 2 = 10MHz, 3 = 100MHz, 4...7 = reserved */
25 uint32_t g_tranSpeedUnit[] = { 10000, 100000, 1000000, 10000000, 0, 0, 0, 0 };
26 
27 /* TAAC: Time unit 0 = 1ns, 1 = 10ns, 2 = 100ns, 3 = 1us, 4 = 10us, 5 = 100us, 6 = 1ms, 7 = 10ms */
28 uint32_t g_taccUnit[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000 };
29 
30 /*
31  * TRAN_SPEED/TAAC: Multiplier factor 0 = reserved, 1 = 1.0, 2 = 1.2, 3 = 1.3, 4 = 1.5, 5 = 2.0, 6 = 2.5,
32  * 7 = 3.0, 8 = 3.5, 9 = 4.0, A = 4.5, B = 5.0, C = 5.5, D = 6.0, E = 7.0, F = 8.0
33  */
34 uint32_t g_commFactor[] = { 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 };
35 
36 /* Little-endian and Big-endian interconversion. */
MmcEndianConversion(uint32_t x)37 static uint32_t MmcEndianConversion(uint32_t x)
38 {
39     uint32_t val = x;
40 
41     return (uint32_t)(
42             (((uint32_t)(val) & (uint32_t)0x000000ffUL) << 24) |
43             (((uint32_t)(val) & (uint32_t)0x0000ff00UL) << 8) |
44             (((uint32_t)(val) & (uint32_t)0x00ff0000UL) >> 8) |
45             (((uint32_t)(val) & (uint32_t)0xff000000UL) >> 24));
46 }
47 
48 /* Decoding algorithm */
MmcParseBits(const uint32_t * data,uint32_t bitsLen,uint32_t start,uint32_t size)49 static uint32_t MmcParseBits(const uint32_t *data, uint32_t bitsLen, uint32_t start, uint32_t size)
50 {
51     uint32_t index;
52     uint32_t shift;
53     uint32_t ret;
54 
55     if (start >= bitsLen || size == 0) {
56         HDF_LOGE("MmcParseBits: input invalid!");
57         return 0;
58     }
59     if (size > BITS_NUMBER_OF_4_BYTES) {
60         HDF_LOGE("MmcParseBits: not support!");
61         return 0;
62     }
63 
64     index = (bitsLen / BITS_NUMBER_OF_4_BYTES) - (start / BITS_NUMBER_OF_4_BYTES) - 1;
65     shift = start & (BITS_NUMBER_OF_4_BYTES - 1);
66     ret = data[index] >> shift;
67     if (size + shift > BITS_NUMBER_OF_4_BYTES) {
68         ret |= data[index - 1] << (BITS_NUMBER_OF_4_BYTES - shift);
69     }
70 
71     if (size < BITS_NUMBER_OF_4_BYTES) {
72         return (ret & ((1u << size) - 1));
73     }
74     return (ret & 0xFFFFFFFF);
75 }
76 
MmcSendCmd(struct MmcCntlr * cntlr,struct MmcCmd * cmd,struct MmcData * data,uint32_t retryTimes)77 static int32_t MmcSendCmd(struct MmcCntlr *cntlr, struct MmcCmd *cmd, struct MmcData *data, uint32_t retryTimes)
78 {
79     uint32_t i;
80     int32_t ret;
81 
82     if (cntlr == NULL || cmd == NULL || retryTimes == 0) {
83         HDF_LOGE("MmcSendCmd: cntlr or cmd or retryTimes is null!");
84         return HDF_ERR_INVALID_PARAM;
85     }
86     if (cntlr->ops == NULL || cntlr->ops->request == NULL) {
87         HDF_LOGE("MmcSendCmd: ops or request is null!");
88         return HDF_ERR_NOT_SUPPORT;
89     }
90 
91     cmd->data = data;
92     for (i = 0; i < retryTimes; i++) {
93         ret = MmcCntlrDoRequest(cntlr, cmd);
94         if (ret != HDF_SUCCESS) {
95             continue;
96         }
97         if (cmd->returnError != HDF_SUCCESS) {
98             continue;
99         }
100         if (data != NULL && data->returnError != HDF_SUCCESS) {
101             continue;
102         }
103         break;
104     }
105     if (data == NULL) {
106         return cmd->returnError;
107     }
108     if (cmd->returnError != HDF_SUCCESS) {
109         return cmd->returnError;
110     }
111     if (data->returnError != HDF_SUCCESS) {
112         return data->returnError;
113     }
114     return HDF_SUCCESS;
115 }
116 
MmcGoIdleState(struct MmcCntlr * cntlr)117 static void MmcGoIdleState(struct MmcCntlr *cntlr)
118 {
119     struct MmcCmd cmd = {0};
120 
121     /* Command GO_IDLE_STATE (CMD0) is the software reset command and sets all cards into Idle State. */
122     cmd.cmdCode = GO_IDLE_STATE;
123     /* [31:0] stuff bits. */
124     cmd.argument = 0;
125     /* Broadcast Commands (bc), no response. */
126     cmd.respType = MMC_RESP_SPI_R1 | MMC_RESP_NONE | MMC_CMD_TYPE_BC;
127     (void)MmcSendCmd(cntlr, &cmd, NULL, 1);
128     MmcMDelay(1);
129 }
130 
MmcSendOpCond(struct MmcCntlr * cntlr,uint32_t arg,uint32_t * ocr)131 static int32_t MmcSendOpCond(struct MmcCntlr *cntlr, uint32_t arg, uint32_t *ocr)
132 {
133     struct MmcCmd cmd = {0};
134     int32_t err;
135     uint32_t i;
136 
137     /*
138      * The SEND_OP_COND (CMD1) command is designed to provide MultiMediaCard hosts with a mechanism
139      * to identify and reject cards which do not match the VDD range desired by the host.
140      */
141     cmd.cmdCode = SEND_OP_COND;
142     /* [31:0] OCR. */
143     cmd.argument = arg;
144     cmd.respType = MMC_RESP_SPI_R1 | MMC_RESP_R3 | MMC_CMD_TYPE_BCR;
145     /*
146      * The host must poll the card (by repeatedly sending CMD1 or ACMD41) until the 'in-idle-state' bit in
147      * the card response indicates (by being set to 0) that the card completed its initialization processes
148      * and is ready for the next command.
149      */
150     for (i = 0; i < INIT_CMD_RETRY_TIMES; i++) {
151         err = MmcSendCmd(cntlr, &cmd, NULL, 1);
152         if (err != HDF_SUCCESS) {
153             break;
154         }
155         if (arg == 0 || (cmd.resp[0] & MMC_CARD_BUSY_STATUS) > 0) {
156             break;
157         }
158 
159         err = HDF_ERR_TIMEOUT;
160         MmcMDelay(SEND_OP_COND_DELAY);
161     }
162 
163     if (ocr != NULL) {
164         *ocr = cmd.resp[0];
165     }
166     return err;
167 }
168 
MmcAllSendCid(struct MmcCntlr * cntlr)169 static int32_t MmcAllSendCid(struct MmcCntlr *cntlr)
170 {
171     struct MmcCmd cmd = {0};
172     uint32_t *cid = NULL;
173     int32_t err;
174 
175     if (cntlr == NULL || cntlr->curDev == NULL) {
176         HDF_LOGE("MmcAllSendCid: cntlr or curDev is null!");
177         return HDF_ERR_INVALID_OBJECT;
178     }
179 
180     cmd.cmdCode = ALL_SEND_CID;
181     /* [31:0] stuff bits. */
182     cmd.argument = 0;
183     /* Broadcast Commands with Response(bcr). */
184     cmd.respType = MMC_RESP_R2 | MMC_CMD_TYPE_BCR;
185     err = MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
186     if (err != HDF_SUCCESS) {
187         HDF_LOGE("MmcAllSendCid: mmc send cmd fail!");
188         return err;
189     }
190     cid = cntlr->curDev->reg.rawCid;
191     if (memcpy_s(cid, sizeof(cntlr->curDev->reg.rawCid), cmd.resp, sizeof(cmd.resp)) != EOK) {
192         HDF_LOGE("MmcAllSendCid: memcpy_s fail!");
193         return HDF_FAILURE;
194     }
195     return err;
196 }
197 
MmcSetRelativeAddr(struct MmcCntlr * cntlr)198 static int32_t MmcSetRelativeAddr(struct MmcCntlr *cntlr)
199 {
200     struct MmcCmd cmd = {0};
201 
202     if (cntlr == NULL || cntlr->curDev == NULL) {
203         HDF_LOGE("MmcSetRelativeAddr: cntlr or curDev is null!");
204         return HDF_ERR_INVALID_OBJECT;
205     }
206 
207     cmd.cmdCode = SET_RELATIVE_ADDR;
208     /* [31:16] RCA, [15:0] stuff bits. */
209     cmd.argument = (cntlr->curDev->reg.rca << 16);
210     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
211     return  MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
212 }
213 
MmcSelectCard(struct MmcCntlr * cntlr)214 static int32_t MmcSelectCard(struct MmcCntlr *cntlr)
215 {
216     struct MmcCmd cmd = {0};
217 
218     if (cntlr == NULL || cntlr->curDev == NULL) {
219         HDF_LOGE("MmcSelectCard: cntlr or curDev is null!");
220         return HDF_ERR_INVALID_OBJECT;
221     }
222 
223     cmd.cmdCode = SELECT_CARD;
224     /* [31:16] RCA, [15:0] stuff bits. */
225     cmd.argument = (cntlr->curDev->reg.rca << 16);
226     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
227     return  MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
228 }
229 
MmcSendExtCsd(struct MmcCntlr * cntlr,uint8_t * extCsd,uint32_t len)230 static int32_t MmcSendExtCsd(struct MmcCntlr *cntlr, uint8_t *extCsd, uint32_t len)
231 {
232     struct MmcCmd cmd = {0};
233     struct MmcData data = {0};
234 
235     cmd.cmdCode = SEND_EXT_CSD;
236     cmd.argument = 0;
237     cmd.respType = MMC_RESP_SPI_R1 | MMC_RESP_R1 | MMC_CMD_TYPE_ADTC;
238 
239     /* The card sends the EXT_CSD register as a block of data, 512 bytes long. */
240     data.blockSize = len;
241     data.blockNum = 1;
242     data.dataFlags = DATA_READ;
243     data.dataBuffer = extCsd;
244 
245     return MmcSendCmd(cntlr, &cmd, &data, 1);
246 }
247 
MmcSendCsd(struct MmcCntlr * cntlr)248 static int32_t MmcSendCsd(struct MmcCntlr *cntlr)
249 {
250     struct MmcCmd cmd = {0};
251     uint32_t *csd = NULL;
252     int32_t err;
253 
254     if (cntlr == NULL || cntlr->curDev == NULL) {
255         HDF_LOGE("MmcSendCsd: cntlr or curDev is null!");
256         return HDF_ERR_INVALID_OBJECT;
257     }
258 
259     cmd.cmdCode = SEND_CSD;
260     cmd.argument = (cntlr->curDev->reg.rca << 16);
261     cmd.respType = MMC_RESP_R2 | MMC_CMD_TYPE_AC;
262     err = MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
263     if (err != HDF_SUCCESS) {
264         HDF_LOGE("MmcSendCsd: mmc send cmd fail!");
265         return err;
266     }
267     csd = cntlr->curDev->reg.rawCsd;
268     if (memcpy_s(csd, sizeof(cntlr->curDev->reg.rawCsd), cmd.resp, sizeof(cmd.resp)) != EOK) {
269         HDF_LOGE("MmcSendCsd: memcpy_s fail!");
270         return HDF_FAILURE;
271     }
272     return err;
273 }
274 
MmcSendStatus(struct MmcCntlr * cntlr,uint32_t * status)275 int32_t MmcSendStatus(struct MmcCntlr *cntlr, uint32_t *status)
276 {
277     struct MmcCmd cmd = {0};
278     int32_t error;
279 
280     if (cntlr == NULL || cntlr->curDev == NULL) {
281         HDF_LOGE("MmcSendStatus: cntlr or curDev is null!");
282         return HDF_ERR_INVALID_OBJECT;
283     }
284 
285     cmd.cmdCode = SEND_STATUS;
286     /* [31:16] RCA, [15:0] stuff bits. */
287     cmd.argument = (cntlr->curDev->reg.rca << 16);
288     cmd.respType = MMC_RESP_SPI_R2 | MMC_RESP_R1 | MMC_CMD_TYPE_AC;
289     error = MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
290     if (error != HDF_SUCCESS) {
291         return error;
292     }
293     if (status != NULL) {
294         *status = cmd.resp[0];
295     }
296     return error;
297 }
298 
MmcSwitch(struct MmcCntlr * cntlr,uint8_t set,uint8_t index,uint8_t value)299 static int32_t MmcSwitch(struct MmcCntlr *cntlr, uint8_t set, uint8_t index, uint8_t value)
300 {
301     int32_t error;
302     struct MmcCmd cmd = {0};
303     uint32_t status;
304 
305     cmd.cmdCode = SWITCH;
306     /*
307      * [31:26] Set to 0; [25:24] Access; [23:16] Index;
308      * [15:8] Value; [7:3] Set to 0; [2:0] Cmd Set.
309      */
310     cmd.argument = (EMMC_EXT_CSD_WRITE_BYTE << 24)
311             | (index << 16)
312             | (value << 8)
313             | set;
314     cmd.respType = MMC_RESP_SPI_R1B | MMC_RESP_R1B | MMC_CMD_TYPE_AC;
315     error = MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
316     if (error != HDF_SUCCESS) {
317         HDF_LOGE("MmcSwitch: send cmd fail!");
318         return error;
319     }
320 
321     /*
322      * The SWITCH command response is of type R1b, therefore, the host should read the card status, using
323      * SEND_STATUS command, after the busy signal is de-asserted, to check the result of the SWITCH operation.
324      */
325     do {
326         error = MmcSendStatus(cntlr, &status);
327         if (error != HDF_SUCCESS) {
328             HDF_LOGE("MmcSwitch: send status cmd fail!");
329             return error;
330         }
331     } while ((!(status & READY_FOR_DATA)) || MmcCntlrDevBusy(cntlr) == true);
332 
333     /*
334      * When the host tries to access a partition which has not been created before, the devices sets the
335      * SWITCH_ERROR bit in the status register and will not change the PARTITION_ACCESS bits.
336      */
337     if ((status & SWITCH_ERROR) > 0) {
338         return HDF_MMC_ERR_SWITCH_FAIL;
339     }
340     return error;
341 }
342 
MmcAppCmd(struct MmcCntlr * cntlr,uint32_t acmd)343 static int32_t MmcAppCmd(struct MmcCntlr *cntlr, uint32_t acmd)
344 {
345     int32_t err;
346     struct MmcCmd cmd = {0};
347 
348     if (cntlr == NULL || cntlr->curDev == NULL) {
349         HDF_LOGE("MmcAppCmd: cntlr or curDev is null!");
350         return HDF_ERR_INVALID_OBJECT;
351     }
352 
353     /*
354      * After the bus is activated the host will request the cards to send their valid operation conditions
355      * (ACMD41 preceding with APP_CMD - CMD55 with RCA = 0x0000).
356      */
357     cmd.cmdCode = APP_CMD;
358     if (acmd != SD_ACMD_OP_COND) {
359         /* [31:16] RCA, [15:0] stuff bits */
360         cmd.argument = (cntlr->curDev->reg.rca << 16);
361         cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
362     } else {
363         cmd.argument = 0;
364         cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_BCR;
365     }
366     err = MmcSendCmd(cntlr, &cmd, NULL, 1);
367     if (err != HDF_SUCCESS) {
368         HDF_LOGE("MmcAppCmd: mmc send cmd fail!");
369         return err;
370     }
371     if (!(cmd.resp[0] & IS_APP_CMD)) {
372         return HDF_FAILURE;
373     }
374     return err;
375 }
376 
MmcWaitCardReady(struct MmcCntlr * cntlr)377 static int32_t MmcWaitCardReady(struct MmcCntlr *cntlr)
378 {
379     int error;
380     uint32_t status;
381     int32_t retryTimes = SEND_STATUS_CMD_RETRY_TIMES;
382 
383     do {
384         error = MmcSendStatus(cntlr, &status);
385         if (error != HDF_SUCCESS) {
386             HDF_LOGE("MmcWaitCardReady: mmc send status fail!");
387             return error;
388         }
389 
390         if (retryTimes >= 0) {
391             retryTimes--;
392             OsalMSleep(10);
393         } else {
394             return HDF_ERR_TIMEOUT;
395         }
396     } while (!(status & READY_FOR_DATA) || (MMC_CARD_CURRENT_STATE(status) == STATE_PRG));
397     return error;
398 }
399 
MmcStopTransmission(struct MmcCntlr * cntlr,bool writeFlag,uint32_t * stopStatus)400 int32_t MmcStopTransmission(struct MmcCntlr *cntlr, bool writeFlag, uint32_t *stopStatus)
401 {
402     int32_t err;
403     struct MmcCmd cmd = {0};
404 
405     if (stopStatus == NULL) {
406         HDF_LOGE("MmcStopTransmission: stopStatus is null!");
407         return HDF_ERR_INVALID_OBJECT;
408     }
409 
410     cmd.cmdCode = STOP_TRANSMISSION;
411     /* R1 for read cases and R1b for write cases. */
412     if (writeFlag == true) {
413         cmd.respType = MMC_RESP_R1B | MMC_CMD_TYPE_AC;
414     } else {
415         cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
416     }
417     err = MmcSendCmd(cntlr, &cmd, NULL, STOP_TRANSMISSION_CMD_RETRY_TIMES);
418     if (err != HDF_SUCCESS) {
419         return err;
420     }
421 
422     *stopStatus = cmd.resp[0];
423     /* No need to check card status in case of read. */
424     if (writeFlag == false) {
425         return err;
426     }
427     return MmcWaitCardReady(cntlr);
428 }
429 
MmcSendTuning(struct MmcCntlr * cntlr,uint32_t cmdCode,bool sendStop)430 int32_t MmcSendTuning(struct MmcCntlr *cntlr, uint32_t cmdCode, bool sendStop)
431 {
432     struct MmcCmd cmd = {0};
433     struct MmcData data = {0};
434     /* Tuning Block Pattern UHS-I. */
435     uint8_t tuningBlk4bit[] = {
436         0xFF, 0x0F, 0xFF, 0x00, 0xFF, 0xCC, 0xC3, 0xCC, 0xC3, 0x3C, 0xCC, 0xFF,
437         0xFE, 0xFF, 0xFE, 0xEF, 0xFF, 0xDF, 0xFF, 0xDD, 0xFF, 0xFB, 0xFF, 0xFB,
438         0xBF, 0xFF, 0x7F, 0xFF, 0x77, 0xF7, 0xBD, 0xEF, 0xFF, 0xF0, 0xFF, 0xF0,
439         0x0F, 0xFC, 0xCC, 0x3C, 0xCC, 0x33, 0xCC, 0xCF, 0xFF, 0xEF, 0xFF, 0xEE,
440         0xFF, 0xFD, 0xFF, 0xFD, 0xDF, 0xFF, 0xBF, 0xFF, 0xBB, 0xFF, 0xF7, 0xFF,
441         0xF7, 0x7f, 0x7B, 0xDE,
442     };
443     /* Tuning block pattern for 8 bit mode for HS200. */
444     uint8_t tuningBlk8bit[] = {
445         0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xCC, 0xCC,
446         0xCC, 0x33, 0xCC, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0xCC, 0xFF, 0xFF,
447         0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF,
448         0xFF, 0xFF, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xBB, 0xFF, 0xFF, 0xFF, 0xBB,
449         0xBB, 0xFF, 0xFF, 0xFF, 0x77, 0xFF, 0xFF, 0xFF, 0x77, 0x77, 0xFF, 0x77,
450         0xBB, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
451         0x00, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0x33, 0xCC, 0xCC, 0xCC, 0x33, 0x33,
452         0xCC, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE,
453         0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF,
454         0xBB, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xFF, 0xFF, 0xFF, 0x77, 0xFF, 0xFF,
455         0xFF, 0x77, 0x77, 0xFF, 0x77, 0xBB, 0xDD, 0xEE,
456     };
457 
458     if (cntlr == NULL || cntlr->curDev == NULL) {
459         HDF_LOGE("MmcSendTuning: cntlr or curDev is null!");
460         return HDF_ERR_INVALID_OBJECT;
461     }
462 
463     cmd.cmdCode = cmdCode;
464     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_ADTC;
465 
466     if (cntlr->curDev->workPara.width == BUS_WIDTH4) {
467         data.blockSize = sizeof(tuningBlk4bit);
468         data.dataBuffer = tuningBlk4bit;
469     } else if (cntlr->curDev->workPara.width == BUS_WIDTH8) {
470         data.blockSize = sizeof(tuningBlk8bit);
471         data.dataBuffer = tuningBlk8bit;
472     } else {
473         HDF_LOGE("MmcSendTuning: work width is 1, can not tune!");
474         return HDF_FAILURE;
475     }
476     data.blockNum = 1;
477     data.dataFlags = DATA_READ;
478     if (sendStop == true) {
479         data.sendStopCmd = true;
480         data.stopCmd.cmdCode = STOP_TRANSMISSION;
481         data.stopCmd.respType = MMC_RESP_R1B | MMC_CMD_TYPE_AC;
482     }
483 
484     return MmcSendCmd(cntlr, &cmd, &data, 1);
485 }
486 
MmcSendEraseStartCmd(struct MmcCntlr * cntlr,uint32_t arg)487 static int32_t MmcSendEraseStartCmd(struct MmcCntlr *cntlr, uint32_t arg)
488 {
489     struct MmcCmd cmd = {0};
490     struct MmcDevice *dev = cntlr->curDev;
491 
492     if (dev == NULL) {
493         HDF_LOGE("MmcSendEraseStartCmd: dev is null!");
494         return HDF_ERR_INVALID_OBJECT;
495     }
496 
497     /* SD: CMD32; EMMC: CMD35 */
498     if (dev->type == MMC_DEV_SD) {
499         cmd.cmdCode = SD_CMD_ERASE_WR_BLK_START;
500     } else {
501         cmd.cmdCode = ERASE_GROUP_START;
502     }
503     /* [31:0]data address. */
504     cmd.argument = arg;
505     /*
506      * Data address for media =<2GB is a 32bit byte address and data address for media > 2GB is
507      * a 32bit sector (512B) address.
508      */
509     if (dev->state.bits.blockAddr == 0) {
510         cmd.argument <<= MMC_MAX_BLOCKSIZE_SHIFT;
511     }
512     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
513     return MmcSendCmd(cntlr, &cmd, NULL, 1);
514 }
515 
MmcSendEraseEndCmd(struct MmcCntlr * cntlr,uint32_t arg)516 static int32_t MmcSendEraseEndCmd(struct MmcCntlr *cntlr, uint32_t arg)
517 {
518     struct MmcCmd cmd = {0};
519     struct MmcDevice *dev = cntlr->curDev;
520 
521     if (dev == NULL) {
522         HDF_LOGE("MmcSendEraseEndCmd: dev is null!");
523         return HDF_ERR_INVALID_OBJECT;
524     }
525 
526     /* SD: CMD33; EMMC: CMD36 */
527     if (dev->type == MMC_DEV_SD) {
528         cmd.cmdCode = SD_CMD_ERASE_WR_BLK_END;
529     } else {
530         cmd.cmdCode = ERASE_GROUP_END;
531     }
532     /* [31:0]data address. */
533     cmd.argument = arg;
534     /*
535      * Data address for media =<2GB is a 32bit byte address and data address for media > 2GB is
536      * a 32bit sector (512B) address.
537      */
538     if (dev->state.bits.blockAddr == 0) {
539         cmd.argument <<= MMC_MAX_BLOCKSIZE_SHIFT;
540     }
541     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
542     return MmcSendCmd(cntlr, &cmd, NULL, 1);
543 }
544 
MmcSendEraseCmd(struct MmcCntlr * cntlr,uint32_t arg)545 static int32_t MmcSendEraseCmd(struct MmcCntlr *cntlr, uint32_t arg)
546 {
547     struct MmcCmd cmd = {0};
548     struct MmcDevice *dev = cntlr->curDev;
549 
550     if (dev == NULL) {
551         HDF_LOGE("MmcSendEraseCmd: dev is null!");
552         return HDF_ERR_INVALID_OBJECT;
553     }
554 
555     /* ERASE cmd38 */
556     cmd.cmdCode = MMC_ERASE;
557     cmd.argument = arg;
558     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
559     return MmcSendCmd(cntlr, &cmd, NULL, 1);
560 }
561 
MmcAlignEraseSize(struct MmcCntlr * cntlr,uint32_t * start,uint32_t * end,uint32_t size)562 static int32_t MmcAlignEraseSize(struct MmcCntlr *cntlr, uint32_t *start, uint32_t *end, uint32_t size)
563 {
564     uint32_t curSize = size;
565     uint32_t tmp;
566 
567     if (cntlr->curDev->eraseSize == 0) {
568         return HDF_ERR_NOT_SUPPORT;
569     }
570 
571     /* align start. */
572     tmp = (*start) % cntlr->curDev->eraseSize;
573     if (tmp > 0) {
574         tmp = cntlr->curDev->eraseSize - tmp;
575         (*start) += tmp;
576         if (curSize > tmp) {
577             curSize -= tmp;
578         } else {
579             return HDF_ERR_NOT_SUPPORT;
580         }
581     }
582 
583     /* align size. */
584     tmp = curSize % cntlr->curDev->eraseSize;
585     if (tmp > 0) {
586         curSize -= tmp;
587     }
588     if (curSize == 0) {
589         return HDF_ERR_NOT_SUPPORT;
590     }
591 
592     (*end) = (*start) + curSize;
593     return HDF_SUCCESS;
594 }
595 
MmcSendErase(struct MmcCntlr * cntlr,uint32_t startSec,uint32_t nSec)596 int32_t MmcSendErase(struct MmcCntlr *cntlr, uint32_t startSec, uint32_t nSec)
597 {
598     int32_t ret;
599     uint32_t start = startSec;
600     uint32_t end = start + nSec;
601 
602     if (cntlr == NULL || cntlr->curDev == NULL) {
603         HDF_LOGE("MmcSendErase: cntlr or curDev is null!");
604         return HDF_ERR_INVALID_OBJECT;
605     }
606 
607     if (cntlr->curDev->eraseSize == 0 ||
608         (cntlr->curDev->reg.csd.ccc & MMC_CSD_CCC_ERASE) == 0) {
609         return HDF_ERR_NOT_SUPPORT;
610     }
611 
612     ret = MmcAlignEraseSize(cntlr, &start, &end, nSec);
613     if (ret != HDF_SUCCESS) {
614         /* after align, no need to erase. */
615         return HDF_SUCCESS;
616     }
617 
618     /*
619      * emmc:
620      * Starting the erase process is a three steps sequence.
621      * First the host defines the start address of the range using the ERASE_GROUP_START (CMD35) command,
622      * next it defines the last address of the range using the ERASE_GROUP_END (CMD36) command and
623      * finally it starts the erase process by issuing the ERASE (CMD38) command with argument bits set to zero.
624      * sd:
625      * The host should adhere to the following command sequence: ERASE_WR_BLK_START(cmd32), ERASE_WR_BLK_END(cmd33)
626      * and ERASE(CMD38).
627      */
628     ret = MmcSendEraseStartCmd(cntlr, start);
629     if (ret != HDF_SUCCESS) {
630         HDF_LOGE("MmcSendErase: send erase start cmd fail, err = %d!", ret);
631         return ret;
632     }
633 
634     ret = MmcSendEraseEndCmd(cntlr, end);
635     if (ret != HDF_SUCCESS) {
636         HDF_LOGE("MmcSendErase: send erase end cmd fail, err = %d!", ret);
637         return ret;
638     }
639 
640     ret = MmcSendEraseCmd(cntlr, 0);
641     if (ret != HDF_SUCCESS) {
642         HDF_LOGE("MmcSendErase: send erase cmd fail, err = %d!", ret);
643         return ret;
644     }
645 
646     return MmcWaitCardReady(cntlr);
647 }
648 
MmcSetupReadWriteBlocksCmd(struct MmcDevice * mmc,struct MmcCmd * cmd,struct MmcRwData * info)649 void MmcSetupReadWriteBlocksCmd(struct MmcDevice *mmc, struct MmcCmd *cmd, struct MmcRwData *info)
650 {
651     cmd->data->blockSize = BYTES_PER_BLOCK;
652     cmd->data->blockNum = info->sectors;
653     cmd->data->dataBuffer = info->buf;
654 
655     cmd->respType = MMC_RESP_R1 | MMC_CMD_TYPE_ADTC;
656     /* [31:0]data address. */
657     cmd->argument = info->startSector;
658     if (mmc->state.bits.blockAddr == 0) {
659         /* SDSC Card uses byte unit address and SDHC and SDXC Cards use block unit address(512 Bytes unit). */
660         cmd->argument <<= MMC_MAX_BLOCKSIZE_SHIFT;
661     }
662     if (info->writeFlag == true) {
663         cmd->data->dataFlags = DATA_WRITE;
664         cmd->cmdCode = WRITE_BLOCK;
665         if (info->sectors > 1) {
666             cmd->cmdCode = WRITE_MULTIPLE_BLOCK;
667         }
668     } else {
669         cmd->data->dataFlags = DATA_READ;
670         cmd->cmdCode = READ_SINGLE_BLOCK;
671         if (info->sectors > 1) {
672             cmd->cmdCode = READ_MULTIPLE_BLOCK;
673         }
674     }
675     if ((info->sectors > 1) && (mmc->cntlr->caps.bits.cmdStop > 0)) {
676         cmd->data->stopCmd.cmdCode = STOP_TRANSMISSION;
677         cmd->data->sendStopCmd = true;
678     }
679 }
680 
MmcSendReadWriteBlocks(struct MmcCntlr * cntlr,struct MmcRwData * info)681 int32_t MmcSendReadWriteBlocks(struct MmcCntlr *cntlr, struct MmcRwData *info)
682 {
683     struct MmcCmd cmd = {0};
684     struct MmcData data = {0};
685 
686     if (cntlr == NULL || cntlr->curDev == NULL) {
687         HDF_LOGE("MmcSendReadWriteBlocks: cntlr or curDev is null!");
688         return HDF_ERR_INVALID_OBJECT;
689     }
690 
691     cmd.data = &data;
692     MmcSetupReadWriteBlocksCmd(cntlr->curDev, &cmd, info);
693     return MmcSendCmd(cntlr, &cmd, &data, 1);
694 }
695 
EmmcDecodeCsd(struct MmcCntlr * cntlr)696 static int32_t EmmcDecodeCsd(struct MmcCntlr *cntlr)
697 {
698     struct MmcCsd *csd = NULL;
699     uint32_t unit;
700     uint32_t factor;
701     uint32_t *rawCsd = NULL;
702 
703     if (cntlr == NULL || cntlr->curDev == NULL) {
704         HDF_LOGE("EmmcDecodeCsd: cntlr or curDev is null!");
705         return HDF_ERR_INVALID_PARAM;
706     }
707 
708     rawCsd = cntlr->curDev->reg.rawCsd;
709     csd = &(cntlr->curDev->reg.csd);
710 
711     /* CSD_STRUCTURE: [127:126]. */
712     csd->structure = MmcParseBits(rawCsd, CSD_BITS, 126, 2);
713     if (csd->structure == 0) {
714         HDF_LOGE("EmmcDecodeCsd: structure is invalid!");
715         return HDF_ERR_INVALID_PARAM;
716     }
717 
718     /* SPEC_VERS: [125:122]. */
719     csd->specVers = MmcParseBits(rawCsd, CSD_BITS, 122, 4);
720     /* TAAC: [119:112]; TAAC bit position-->Time unit: [2:0], Multiplier factor: [6:3]. */
721     factor = MmcParseBits(rawCsd, CSD_BITS, 115, 4);
722     unit = MmcParseBits(rawCsd, CSD_BITS, 112, 3);
723     csd->taccNs = (g_taccUnit[unit] * g_commFactor[factor] + 9) / 10;
724     /* NSAC: [111:104] */
725     csd->taccClks = MmcParseBits(rawCsd, CSD_BITS, 104, 8) * 100;
726 
727     /* TRAN_SPEED: [103:96]; TRAN_SPEED bit-->Frequency unit: [2:0], Multiplier factor: [6:3]. */
728     factor = MmcParseBits(rawCsd, CSD_BITS, 99, 4);
729     unit = MmcParseBits(rawCsd, CSD_BITS, 96, 3);
730     csd->maxDtr = g_tranSpeedUnit[unit] * g_commFactor[factor];
731     csd->ccc = MmcParseBits(rawCsd, CSD_BITS, 84, 12);
732 
733     /* C_SIZE: [73:62] */
734     factor = MmcParseBits(rawCsd, CSD_BITS, 62, 12);
735     /* C_SIZE_MULT: [49:47] */
736     unit = MmcParseBits(rawCsd, CSD_BITS, 47, 3);
737     csd->capacity = (1 + factor) << (unit + 2);
738     /* READ_BL_LEN: [83:80]. */
739     csd->readBlkLen = MmcParseBits(rawCsd, CSD_BITS, 80, 4);
740     /* READ_BL_PARTIAL: [79:79] */
741     csd->rdPartial = MmcParseBits(rawCsd, CSD_BITS, 79, 1);
742     /* WRITE_BLK_MISALIGN: [78:78] */
743     csd->wrMisalign = MmcParseBits(rawCsd, CSD_BITS, 78, 1);
744     /* READ_BLK_MISALIGN: [77:77] */
745     csd->rdMisalign = MmcParseBits(rawCsd, CSD_BITS, 77, 1);
746     /* Write speed factor(R2W_FACTOR) :[28:26] */
747     csd->r2wFactor = MmcParseBits(rawCsd, CSD_BITS, 26, 3);
748     /* WRITE_BL_LEN: [25:22] */
749     csd->writeBlkLen = MmcParseBits(rawCsd, CSD_BITS, 22, 4);
750     /* WRITE_BL_PARTIAL: [21:21] */
751     csd->wrPartial = MmcParseBits(rawCsd, CSD_BITS, 21, 1);
752 
753     /*
754      * Note that the support for 512B read access is mandatory for all cards.
755      * And that the cards has to be in 512B block length mode by default after power-on, or software reset.
756      */
757     if (csd->writeBlkLen >= MMC_MAX_BLOCKSIZE_SHIFT) {
758         /* ERASE_GRP_SIZE: [46:42] */
759         unit = MmcParseBits(rawCsd, CSD_BITS, 42, 5);
760         /* ERASE_GRP_MULT: [41:37] */
761         factor = MmcParseBits(rawCsd, CSD_BITS, 37, 5);
762         /* size of erasable unit = (ERASE_GRP_SIZE + 1) * (ERASE_GRP_MULT + 1) */
763         csd->eraseSize = (unit + 1) * (factor + 1);
764         csd->eraseSize <<= (csd->writeBlkLen - MMC_MAX_BLOCKSIZE_SHIFT);
765     }
766     return HDF_SUCCESS;
767 }
768 
EmmcDecodeCid(struct MmcCntlr * cntlr)769 static int32_t EmmcDecodeCid(struct MmcCntlr *cntlr)
770 {
771     uint32_t i;
772     struct MmcCid *cid = NULL;
773     uint32_t *rawCid = NULL;
774     uint8_t specVers;
775     uint8_t cbx;
776 
777     if (cntlr == NULL || cntlr->curDev == NULL) {
778         HDF_LOGE("EmmcDecodeCid: cntlr or curDev is null!");
779         return HDF_ERR_INVALID_PARAM;
780     }
781 
782     rawCid = cntlr->curDev->reg.rawCid;
783     cid = &(cntlr->curDev->reg.cid);
784     specVers = cntlr->curDev->reg.csd.specVers;
785     if (specVers > MMC_CSD_SPEC_VER_4) {
786         HDF_LOGE("EmmcDecodeCid: specVers is invalid!");
787         return HDF_ERR_NOT_SUPPORT;
788     }
789 
790     /*
791      * The manufacturing date is composed of two hexadecimal digits, four bits each,
792      * representing a two digits date code m/y;
793      */
794     cid->month = MmcParseBits(rawCid, CID_BITS, 12, 4);
795     /* The "y" field, least significant nibble, is the year code. 0 is 1997. */
796     cid->year = MmcParseBits(rawCid, CID_BITS, 8, 4) + 1997;
797 
798     if (specVers == MMC_CSD_SPEC_VER_0 || specVers == MMC_CSD_SPEC_VER_1) {
799         cid->mid = MmcParseBits(rawCid, CID_BITS, 104, 24);
800         for (i = 0; i < 7; i++) {
801             cid->pnm[i] = (char)MmcParseBits(rawCid, CID_BITS, CID_PNM_START_BIT - (i * BITS_PER_BYTE), BITS_PER_BYTE);
802         }
803         cid->pnm[7] = '\0';
804         cid->hwPrv = MmcParseBits(rawCid, CID_BITS, 44, 4);
805         cid->fwPrv = MmcParseBits(rawCid, CID_BITS, 40, 4);
806         cid->psn = MmcParseBits(rawCid, CID_BITS, 16, 24);
807     } else {
808         /* Manufacturer ID(MID): [127:120] */
809         cid->mid = MmcParseBits(rawCid, CID_BITS, 120, 8);
810         /* OEM/Application ID(OID): [119:104] */
811         cid->oid = MmcParseBits(rawCid, CID_BITS, 104, 16);
812         /* Product name(PNM): [103:56] */
813         for (i = 0; i < 6; i++) {
814             cid->pnm[i] = (char)MmcParseBits(rawCid, CID_BITS, CID_PNM_START_BIT - (i * BITS_PER_BYTE), BITS_PER_BYTE);
815         }
816         cid->pnm[6] = '\0';
817         /* Product serial number(PSN): [47:16] */
818         cid->psn = MmcParseBits(rawCid, CID_BITS, 16, 32);
819         /*
820          * Card or BGA(CBX): [113:112]
821          * 00: Card (removable); 01: BGA (Discrete embedded); 10: POP; 11: Reserved.
822          */
823         cbx = MmcParseBits(rawCid, CID_BITS, 112, 2);
824         if (cbx == 0) {
825             cntlr->curDev->state.bits.removable = 1;
826             HDF_LOGD("EmmcDecodeCid: Emmc is removable!");
827         }
828     }
829     return HDF_SUCCESS;
830 }
831 
EmmcDecodeExtCsdSector(struct EmmcDevice * emmcDev,struct EmmcExtCsd * extCsd)832 static void EmmcDecodeExtCsdSector(struct EmmcDevice *emmcDev, struct EmmcExtCsd *extCsd)
833 {
834     uint32_t i;
835     uint32_t shift = 0;
836 
837     extCsd->sectors = 0;
838     for (i = 0; i < EMMC_EXT_CSD_SEC_CNT_BYTES; i++) {
839         extCsd->sectors |= (uint32_t)(extCsd->rawSectors[i] << shift);
840         shift += BITS_PER_BYTE;
841     }
842     /* Device density > 2GiB are sector addressed. */
843     if (extCsd->sectors > (2u * 1024 * 1024 * 1024) / 512) {
844         emmcDev->mmc.state.bits.blockAddr = 1;
845     }
846 }
847 
EmmcDecodeExtCsdCardType(struct EmmcExtCsd * extCsd)848 static void EmmcDecodeExtCsdCardType(struct EmmcExtCsd *extCsd)
849 {
850     uint8_t cardType = extCsd->rawCardType & EMMC_EXT_CSD_CARD_TYPE_MASK;
851 
852     switch (cardType) {
853         case EMMC_EXT_CSD_CARD_TYPE_SDR_ALL:
854         case EMMC_EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V:
855         case EMMC_EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V:
856         case EMMC_EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52:
857             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_200;
858             extCsd->cardType = EMMC_EXT_CSD_CARD_TYPE_SDR_200;
859             break;
860         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_2V_ALL:
861         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_2V_ALL_DDR_1_8V:
862         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_2V_ALL_DDR_1_2V:
863         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_2V_ALL_DDR_52:
864             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_200;
865             extCsd->cardType = EMMC_EXT_CSD_CARD_TYPE_SDR_1_2V;
866             break;
867         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_8V_ALL:
868         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_8V_ALL_DDR_1_8V:
869         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_8V_ALL_DDR_1_2V:
870         case EMMC_EXT_CSD_CARD_TYPE_SDR_1_8V_ALL_DDR_52:
871             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_200;
872             extCsd->cardType = EMMC_EXT_CSD_CARD_TYPE_SDR_1_8V;
873             break;
874         case (EMMC_EXT_CSD_CARD_TYPE_DDR_52 | EMMC_EXT_CSD_CARD_TYPE_52 | EMMC_EXT_CSD_CARD_TYPE_26):
875             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_52;
876             extCsd->cardType = EMMC_EXT_CSD_CARD_TYPE_DDR_52;
877             break;
878         case (EMMC_EXT_CSD_CARD_TYPE_DDR_1_2V | EMMC_EXT_CSD_CARD_TYPE_52 | EMMC_EXT_CSD_CARD_TYPE_26):
879             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_52;
880             extCsd->cardType = EMMC_EXT_CSD_CARD_TYPE_DDR_1_2V;
881             break;
882         case (EMMC_EXT_CSD_CARD_TYPE_DDR_1_8V | EMMC_EXT_CSD_CARD_TYPE_52 | EMMC_EXT_CSD_CARD_TYPE_26):
883             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_52;
884             extCsd->cardType = EMMC_EXT_CSD_CARD_TYPE_DDR_1_8V;
885             break;
886         case (EMMC_EXT_CSD_CARD_TYPE_52 | EMMC_EXT_CSD_CARD_TYPE_26):
887             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_52;
888             break;
889         case EMMC_EXT_CSD_CARD_TYPE_26:
890             extCsd->hsMaxDtr = EMMC_EXT_CSD_HIGH_SPEED_26;
891             break;
892         default:
893             HDF_LOGD("EmmcDecodeExtCsdCardType: not support high-speed!");
894             break;
895     }
896 }
897 
EmmcDecodeExtCsdRev13Field(struct EmmcExtCsd * extCsd,const uint8_t * rawExtCsd)898 static void EmmcDecodeExtCsdRev13Field(struct EmmcExtCsd *extCsd, const uint8_t *rawExtCsd)
899 {
900     uint8_t shift = rawExtCsd[EMMC_EXT_CSD_S_A_TIMEOUT];
901 
902     extCsd->eraseGroupDef = rawExtCsd[EMMC_EXT_CSD_ERASE_GROUP_DEF];
903     extCsd->partConfig = rawExtCsd[EMMC_EXT_CSD_PARTITION_CONFIG];
904     extCsd->partSwitchTime = 10 * rawExtCsd[EMMC_EXT_CSD_PARTITION_SWITCH_TIME];
905 
906     if (shift > 0 && shift <= MAX_S_A_TIMEOUT_VALUE) {
907         extCsd->saTimeout = 1 << shift;
908     }
909     extCsd->relWrSecorCount = rawExtCsd[EMMC_EXT_CSD_REL_WR_SEC_C];
910     extCsd->hcEraseTimeout = 300 * rawExtCsd[EMMC_EXT_CSD_ERASE_TIMEOUT_MULT];
911     extCsd->hcEraseSize = (extCsd->rawHcEraseGrpSize) << 10;
912     extCsd->bootSize = rawExtCsd[EMMC_EXT_CSD_BOOT_MULTI] << 17;
913 }
914 
EmmcDecodeExtCsdEnhanceArea(struct EmmcDevice * emmcDev,struct EmmcExtCsd * extCsd,uint8_t * rawExtCsd)915 static void EmmcDecodeExtCsdEnhanceArea(struct EmmcDevice *emmcDev,
916     struct EmmcExtCsd *extCsd, uint8_t *rawExtCsd)
917 {
918     uint32_t i;
919     uint32_t shift = 0;
920 
921     extCsd->enhAreaEnable = true;
922     extCsd->enhAreaOffset = 0;
923     for (i = 0; i < EMMC_EXT_CSD_ENH_START_ADDR_BYTES; i++) {
924         extCsd->enhAreaOffset |= ((uint64_t)rawExtCsd[EMMC_EXT_CSD_ENH_START_ADDR + i] << shift);
925         shift += BITS_PER_BYTE;
926     }
927     /*
928      * Start address of the Enhanced User Data Area segment in the User Data Area
929      * (expressedin bytes or in sectors in case of high capacity devices).
930      */
931     if (emmcDev->mmc.state.bits.blockAddr == 1) {
932         extCsd->enhAreaOffset <<= MMC_MAX_BLOCKSIZE_SHIFT;
933     }
934 
935     shift = 0;
936     extCsd->enhAreaSize = 0;
937     for (i = 0; i < EMMC_EXT_CSD_ENH_SIZE_MULT_BYTES; i++) {
938         extCsd->enhAreaSize |= (uint32_t)(rawExtCsd[EMMC_EXT_CSD_ENH_SIZE_MULT + i] << shift);
939         shift += BITS_PER_BYTE;
940     }
941     /* Max Enhanced Area = MAX_ENH_SIZE_MULT * HC_WP_GRP_SIZE * HC_ERASE_GPR_SIZE * 512kBytes */
942     extCsd->enhAreaSize *= (uint32_t)(extCsd->rawHcEraseGrpSize * rawExtCsd[EMMC_EXT_CSD_HC_WP_GRP_SIZE]);
943     extCsd->enhAreaSize <<= MMC_MAX_BLOCKSIZE_SHIFT;
944 }
945 
EmmcDecodeExtCsdPowerClassValue(struct EmmcExtCsd * extCsd,const uint8_t * rawExtCsd)946 static void EmmcDecodeExtCsdPowerClassValue(struct EmmcExtCsd *extCsd, const uint8_t *rawExtCsd)
947 {
948     extCsd->pwrClF52V195 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_52_195];
949     extCsd->pwrClF26V195 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_26_195];
950     extCsd->pwrClF52V360 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_52_360];
951     extCsd->pwrClF26V360 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_26_360];
952     extCsd->pwrClF200V195 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_200_195];
953     extCsd->pwrClF200V360 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_200_360];
954     extCsd->pwrClDdrF52V195 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_DDR_52_195];
955     extCsd->pwrClDdrF52V360 = rawExtCsd[EMMC_EXT_CSD_PWR_CL_DDR_52_360];
956 }
957 
EmmcDecodeExtCsdRev14Field(struct EmmcDevice * emmcDev,struct EmmcExtCsd * extCsd,uint8_t * rawExtCsd)958 static void EmmcDecodeExtCsdRev14Field(struct EmmcDevice *emmcDev,
959     struct EmmcExtCsd *extCsd, uint8_t *rawExtCsd)
960 {
961     if ((rawExtCsd[EMMC_EXT_CSD_PARTITIONING_SUPPORT] & PARTITIONING_SUPPORT_ENH_ATTRIBUTE_EN) > 0 &&
962         (rawExtCsd[EMMC_EXT_CSD_PARTITIONS_ATTRIBUTE] & PARTITIONS_ATTRIBUTE_ENH_USR) > 0) {
963         EmmcDecodeExtCsdEnhanceArea(emmcDev, extCsd, rawExtCsd);
964     }
965     extCsd->secTrimMult = extCsd->rawSecTrimMult;
966     extCsd->secEraseMult = extCsd->rawSecEraseMult;
967     /* TRIM Timeout = 300ms x TRIM_MULT. */
968     extCsd->trimTimeout = 300 * extCsd->rawTrimMult;
969     EmmcDecodeExtCsdPowerClassValue(extCsd, rawExtCsd);
970 }
971 
EmmcDecodeExtCsdRev15Field(struct EmmcExtCsd * extCsd,const uint8_t * rawExtCsd)972 static void EmmcDecodeExtCsdRev15Field(struct EmmcExtCsd *extCsd, const uint8_t *rawExtCsd)
973 {
974     /* whether the eMMC card supports HPI. */
975     if ((rawExtCsd[EMMC_EXT_CSD_HPI_FEATURES] & EMMC_EXT_CSD_HPI_SUPPORT) > 0) {
976         extCsd->hpi = true;
977         if ((rawExtCsd[EMMC_EXT_CSD_HPI_FEATURES] & EMMC_EXT_CSD_HPI_IMPLEMENTATION) > 0) {
978             extCsd->hpiCmd = STOP_TRANSMISSION;
979         } else {
980             extCsd->hpiCmd = SEND_STATUS;
981         }
982         /*
983          * This field indicates the maximum timeout to close a command interrupted by HPI –time between the end
984          * bit of CMD12/13 to the DAT0 release by the device.
985          * Time is expressed in units of 10-milliseconds.
986          */
987         extCsd->outOfInterruptTime = rawExtCsd[EMMC_EXT_CSD_OUT_OF_INTERRUPT_TIME] * 10;
988     }
989     extCsd->wrRelParam = rawExtCsd[EMMC_EXT_CSD_WR_REL_PARAM];
990 }
991 
EmmcDecodeExtCsd(struct MmcCntlr * cntlr,uint8_t * rawExtCsd,uint32_t len)992 static int32_t EmmcDecodeExtCsd(struct MmcCntlr *cntlr, uint8_t *rawExtCsd, uint32_t len)
993 {
994     struct EmmcDevice *emmcDev = (struct EmmcDevice *)cntlr->curDev;
995     struct EmmcExtCsd *extCsd = &(emmcDev->emmcReg.extCsd);
996     uint32_t i;
997 
998     extCsd->rawCsdStructure = rawExtCsd[EMMC_EXT_CSD_STRUCTURE];
999     if (emmcDev->mmc.reg.csd.structure == MMC_CSD_STRUCTURE_VER_OTHER) {
1000         if (extCsd->rawCsdStructure > EMMC_EXT_CSD_STRUCTURE_VER_1_2) {
1001             HDF_LOGE("EmmcDecodeExtCsd: rawCsdStructure is invalid!");
1002             return HDF_ERR_INVALID_PARAM;
1003         }
1004     }
1005     extCsd->rev = rawExtCsd[EMMC_EXT_CSD_REV];
1006     for (i = 0; i < EMMC_EXT_CSD_SEC_CNT_BYTES; i++) {
1007         extCsd->rawSectors[i] = rawExtCsd[EMMC_EXT_CSD_SEC_CNT + i];
1008     }
1009     if (extCsd->rev >= EMMC_EXT_CSD_REV_1_2) {
1010         EmmcDecodeExtCsdSector(emmcDev, extCsd);
1011     }
1012 
1013     extCsd->strobeSupport = rawExtCsd[EMMC_EXT_CSD_STROBE_SUPPORT];
1014     extCsd->rawCardType = rawExtCsd[EMMC_EXT_CSD_CARD_TYPE];
1015     EmmcDecodeExtCsdCardType(extCsd);
1016 
1017     extCsd->rawSaTimeout = rawExtCsd[EMMC_EXT_CSD_S_A_TIMEOUT];
1018     extCsd->rawEraseTimeoutMult = rawExtCsd[EMMC_EXT_CSD_ERASE_TIMEOUT_MULT];
1019     extCsd->rawHcEraseGrpSize = rawExtCsd[EMMC_EXT_CSD_HC_ERASE_GRP_SIZE];
1020     if (extCsd->rev >= EMMC_EXT_CSD_REV_1_3) {
1021         EmmcDecodeExtCsdRev13Field(extCsd, rawExtCsd);
1022     }
1023 
1024     extCsd->rawSecTrimMult = rawExtCsd[EMMC_EXT_CSD_SEC_TRIM_MULT];
1025     extCsd->rawSecEraseMult = rawExtCsd[EMMC_EXT_CSD_SEC_ERASE_MULT];
1026     extCsd->rawSecFeatureSupport = rawExtCsd[EMMC_EXT_CSD_SEC_FEATURE_SUPPORT];
1027     extCsd->rawTrimMult = rawExtCsd[EMMC_EXT_CSD_TRIM_MULT];
1028     if (extCsd->rev >= EMMC_EXT_CSD_REV_1_4) {
1029         EmmcDecodeExtCsdRev14Field(emmcDev, extCsd, rawExtCsd);
1030     }
1031 
1032     if (extCsd->rev >= EMMC_EXT_CSD_REV_1_5) {
1033         EmmcDecodeExtCsdRev15Field(extCsd, rawExtCsd);
1034     }
1035     return HDF_SUCCESS;
1036 }
1037 
EmmcSetBlockCapacity(struct MmcCntlr * cntlr)1038 static void EmmcSetBlockCapacity(struct MmcCntlr *cntlr)
1039 {
1040     struct EmmcDevice *emmcDev = (struct EmmcDevice *)cntlr->curDev;
1041     uint32_t gibVal;
1042     uint32_t mibVal;
1043 
1044     /*
1045      * ERASE_GROUP_DEF  Bit0: ENABLE:
1046      * 0x0 : Use old erase group size and write protect group size definition (default)
1047      * 0x1 : Use high-capacity erase unit size, high capacity erase timeout, and high-capacity write protect
1048      * group size definition.
1049      */
1050     if (emmcDev->emmcReg.extCsd.eraseGroupDef == 1) {
1051         emmcDev->mmc.eraseSize = emmcDev->emmcReg.extCsd.hcEraseSize;
1052     } else {
1053         emmcDev->mmc.eraseSize = emmcDev->mmc.reg.csd.eraseSize;
1054     }
1055 
1056     if (emmcDev->mmc.state.bits.blockAddr > 0) {
1057         emmcDev->mmc.capacity = emmcDev->emmcReg.extCsd.sectors;
1058     } else {
1059         emmcDev->mmc.capacity = (size_t)emmcDev->mmc.reg.csd.capacity <<
1060             (emmcDev->mmc.reg.csd.readBlkLen - MMC_MAX_BLOCKSIZE_SHIFT);
1061     }
1062 
1063     gibVal = emmcDev->mmc.capacity >> 21;
1064     mibVal = (emmcDev->mmc.capacity & ~(gibVal << 21)) >> 11;
1065     HDF_LOGD("EmmcSetBlockCapacity: Emmc dev capacity %u.%u Gib!", gibVal, mibVal);
1066 }
1067 
EmmcCheckExtCsd(struct MmcCntlr * cntlr,enum MmcBusWidth width)1068 static int32_t EmmcCheckExtCsd(struct MmcCntlr *cntlr, enum MmcBusWidth width)
1069 {
1070     uint8_t extCsd[EXT_CSD_BYTES_LEN] = {0};
1071 
1072     if (width == BUS_WIDTH1) {
1073         return 0;
1074     }
1075 
1076     return MmcSendExtCsd(cntlr, extCsd, EXT_CSD_BYTES_LEN);
1077 }
1078 
EmmcSwitchVoltage(struct MmcCntlr * cntlr,struct EmmcDevice * emmcDev)1079 static int32_t EmmcSwitchVoltage(struct MmcCntlr *cntlr, struct EmmcDevice *emmcDev)
1080 {
1081     uint32_t cardType = emmcDev->emmcReg.extCsd.cardType;
1082 
1083     /* Host Voltage Switch. */
1084     if (cntlr->caps2.bits.hs200Sdr1v2 == 1 && (cardType & EMMC_EXT_CSD_CARD_TYPE_SDR_1_2V) > 0) {
1085         (void)MmcCntlrSwitchVoltage(cntlr, VOLT_1V2);
1086     }
1087     if (cntlr->caps2.bits.hs200Sdr1v8 && (cardType & EMMC_EXT_CSD_CARD_TYPE_SDR_1_8V) > 0) {
1088         (void)MmcCntlrSwitchVoltage(cntlr, VOLT_1V8);
1089     }
1090     return HDF_SUCCESS;
1091 }
1092 
EmmcSelectHighSpeedBusWidth(struct MmcCntlr * cntlr)1093 static int32_t EmmcSelectHighSpeedBusWidth(struct MmcCntlr *cntlr)
1094 {
1095     int err = HDF_FAILURE;
1096     enum MmcBusWidth width = BUS_WIDTH1;
1097 
1098     if (cntlr->caps.bits.cap8Bit > 0) {
1099         err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_BUS_WIDTH, EMMC_EXT_CSD_BUS_WIDTH_8);
1100         if (err != HDF_SUCCESS) {
1101             HDF_LOGE("EmmcSelectHighSpeedBusWidth: switch 8 bit bus width fail!");
1102         } else {
1103             MmcCntlrSetBusWidth(cntlr, BUS_WIDTH8);
1104             width = BUS_WIDTH8;
1105         }
1106     }
1107     if (err != HDF_SUCCESS) {
1108         err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_BUS_WIDTH, EMMC_EXT_CSD_BUS_WIDTH_4);
1109         if (err != HDF_SUCCESS) {
1110             HDF_LOGE("EmmcSelectHighSpeedBusWidth: switch 4 bit bus width fail!");
1111         } else {
1112             MmcCntlrSetBusWidth(cntlr, BUS_WIDTH4);
1113             width = BUS_WIDTH4;
1114         }
1115     }
1116     if (err != HDF_SUCCESS) {
1117         return err;
1118     }
1119 
1120     return EmmcCheckExtCsd(cntlr, width);
1121 }
1122 
EmmcCheckSwitchStatus(struct MmcCntlr * cntlr)1123 static int32_t EmmcCheckSwitchStatus(struct MmcCntlr *cntlr)
1124 {
1125     int err;
1126     uint32_t status;
1127 
1128     err = MmcSendStatus(cntlr, &status);
1129     if (err != HDF_SUCCESS) {
1130         HDF_LOGE("EmmcCheckSwitchStatus: send status cmd fail!");
1131         return err;
1132     }
1133     if ((status & SWITCH_ERROR) > 0) {
1134         return HDF_MMC_ERR_SWITCH_FAIL;
1135     }
1136     return HDF_SUCCESS;
1137 }
1138 
EmmcSwitchHighSpeed(struct MmcCntlr * cntlr)1139 static int32_t EmmcSwitchHighSpeed(struct MmcCntlr *cntlr)
1140 {
1141     int err;
1142 
1143     /*
1144      * Switch dev to HS mode.
1145      * HS_TIMING must be set to "0x1" before setting BUS_WIDTH for dual data rate operation (values 5 or 6).
1146      */
1147     err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_HS_TIMING, EMMC_EXT_CSD_BUS_TIMING_HS);
1148     if (err != HDF_SUCCESS) {
1149         HDF_LOGE("EmmcSwitchHighSpeed: switch hs fail!");
1150         return err;
1151     }
1152     /* change host freq to 52M according to JEDEC Standard No.84-B51, Page49. */
1153     MmcCntlrSetClock(cntlr, EMMC_EXT_CSD_HIGH_SPEED_52);
1154     /* Set host controller to HS timing. */
1155     MmcCntlrSetBusTiming(cntlr, BUS_TIMING_MMC_HS);
1156     return HDF_SUCCESS;
1157 }
1158 
EmmcSelectHs400(struct MmcCntlr * cntlr)1159 static int32_t EmmcSelectHs400(struct MmcCntlr *cntlr)
1160 {
1161     int err;
1162 
1163     err = EmmcSwitchHighSpeed(cntlr);
1164     if (err != HDF_SUCCESS) {
1165         HDF_LOGE("EmmcSelectHs400: switch hs fail!");
1166         return err;
1167     }
1168 
1169     /* Switch dev to DDR. */
1170     err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_BUS_WIDTH, EMMC_EXT_CSD_DDR_BUS_WIDTH_8);
1171     if (err != HDF_SUCCESS) {
1172         HDF_LOGE("EmmcSelectHs400: switch to ddr fail!");
1173         return err;
1174     }
1175     /* Switch dev to HS400. */
1176     err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_HS_TIMING, EMMC_EXT_CSD_BUS_TIMING_HS400);
1177     if (err != HDF_SUCCESS) {
1178         HDF_LOGE("EmmcSelectHs400: switch to hs400 fail!");
1179         return err;
1180     }
1181     MmcCntlrSetClock(cntlr, EMMC_EXT_CSD_HIGH_SPEED_200);
1182     /* Set host controller to HS400 timing and frequency. */
1183     MmcCntlrSetBusTiming(cntlr, BUS_TIMING_MMC_HS400);
1184     return EmmcCheckSwitchStatus(cntlr);
1185 }
1186 
EmmcSelectHs400es(struct MmcCntlr * cntlr,struct EmmcDevice * emmcDev)1187 static int32_t EmmcSelectHs400es(struct MmcCntlr *cntlr, struct EmmcDevice *emmcDev)
1188 {
1189     int err;
1190 
1191     err = EmmcSwitchVoltage(cntlr, emmcDev);
1192     if (err != HDF_SUCCESS) {
1193         HDF_LOGE("EmmcSelectHs400es: emmc switch voltage fail!");
1194         return err;
1195     }
1196 
1197     err = EmmcSelectHighSpeedBusWidth(cntlr);
1198     if (err != HDF_SUCCESS) {
1199         HDF_LOGE("EmmcSelectHs400es: select hs width fail!");
1200         return err;
1201     }
1202 
1203     err = EmmcSwitchHighSpeed(cntlr);
1204     if (err != HDF_SUCCESS) {
1205         HDF_LOGE("EmmcSelectHs400es: switch hs fail!");
1206         return err;
1207     }
1208 
1209     /* Switch dev to DDR with strobe bit. */
1210     err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_BUS_WIDTH,
1211         EMMC_EXT_CSD_DDR_BUS_WIDTH_8 | EMMC_EXT_CSD_BUS_WIDTH_STROBE);
1212     if (err != HDF_SUCCESS) {
1213         HDF_LOGE("EmmcSelectHs400es: switch to ddr fail!");
1214         return err;
1215     }
1216     /* Switch dev to HS400. */
1217     err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_HS_TIMING, EMMC_EXT_CSD_BUS_TIMING_HS400);
1218     if (err != HDF_SUCCESS) {
1219         HDF_LOGE("EmmcSelectHs400es: switch to hs400 fail!");
1220         return err;
1221     }
1222     MmcCntlrSetClock(cntlr, EMMC_EXT_CSD_HIGH_SPEED_200);
1223     /* Set host controller to HS400 timing and frequency. */
1224     MmcCntlrSetBusTiming(cntlr, BUS_TIMING_MMC_HS400);
1225     MmcCntlrSetEnhanceStrobe(cntlr, true);
1226     return EmmcCheckSwitchStatus(cntlr);
1227 }
1228 
EmmcSelectHs200(struct MmcCntlr * cntlr,struct EmmcDevice * emmcDev)1229 static int32_t EmmcSelectHs200(struct MmcCntlr *cntlr, struct EmmcDevice *emmcDev)
1230 {
1231     int err;
1232 
1233     err = EmmcSwitchVoltage(cntlr, emmcDev);
1234     if (err != HDF_SUCCESS) {
1235         HDF_LOGE("EmmcSelectHs200: emmc switch voltage fail!");
1236         return err;
1237     }
1238 
1239     err = EmmcSelectHighSpeedBusWidth(cntlr);
1240     if (err != HDF_SUCCESS) {
1241         HDF_LOGE("EmmcSelectHs200: select hs width fail!");
1242         return err;
1243     }
1244 
1245     /* Switch dev to HS200. */
1246     err = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_HS_TIMING, EMMC_EXT_CSD_BUS_TIMING_HS200);
1247     if (err != HDF_SUCCESS) {
1248         HDF_LOGE("EmmcSelectHs200: switch to hs200 fail!");
1249         return err;
1250     }
1251     MmcCntlrSetBusTiming(cntlr, BUS_TIMING_MMC_HS200);
1252     return EmmcCheckSwitchStatus(cntlr);
1253 }
1254 
EmmcGetPowerClassValue(struct MmcCntlr * cntlr,struct EmmcExtCsd * extCsd)1255 static uint32_t EmmcGetPowerClassValue(struct MmcCntlr *cntlr, struct EmmcExtCsd *extCsd)
1256 {
1257     uint32_t val = 0;
1258     uint32_t vdd;
1259     uint32_t busWidthBit;
1260     uint32_t clock;
1261 
1262     busWidthBit = (cntlr->curDev->workPara.width == BUS_WIDTH8) ?
1263         EMMC_EXT_CSD_BUS_WIDTH_8 : EMMC_EXT_CSD_BUS_WIDTH_4;
1264     vdd = 1 << (cntlr->vddBit);
1265     clock = cntlr->curDev->workPara.clock;
1266 
1267     if (vdd == MMC_OCR_1V65_1V95) {
1268         if (clock <= EMMC_EXT_CSD_HIGH_SPEED_26) {
1269             val = extCsd->pwrClF26V195;
1270         } else if (clock <= EMMC_EXT_CSD_HIGH_SPEED_52) {
1271             val = extCsd->pwrClF52V195;
1272         } else if (clock <= EMMC_EXT_CSD_HIGH_SPEED_200) {
1273             val = extCsd->pwrClF200V195;
1274         }
1275     } else if (vdd >= MMC_OCR_2V7_2V8 && vdd <= MMC_OCR_3V5_3V6) {
1276         if (clock <= EMMC_EXT_CSD_HIGH_SPEED_26) {
1277             val = extCsd->pwrClF26V360;
1278         } else if (clock <= EMMC_EXT_CSD_HIGH_SPEED_52) {
1279             val = extCsd->pwrClF52V360;
1280         } else if (clock <= EMMC_EXT_CSD_HIGH_SPEED_200) {
1281             val = extCsd->pwrClF200V360;
1282         }
1283     } else {
1284         return 0;
1285     }
1286 
1287     if (busWidthBit == EMMC_EXT_CSD_BUS_WIDTH_8) {
1288         val = (val & EMMC_EXT_CSD_PWR_CL_8BIT_MASK) >> EMMC_EXT_CSD_PWR_CL_8BIT_SHIFT;
1289     } else {
1290         val = (val & EMMC_EXT_CSD_PWR_CL_4BIT_MASK) >> EMMC_EXT_CSD_PWR_CL_4BIT_SHIFT;
1291     }
1292     return val;
1293 }
1294 
EmmcSelectPowerClass(struct MmcCntlr * cntlr,struct EmmcExtCsd * extCsd)1295 static int32_t EmmcSelectPowerClass(struct MmcCntlr *cntlr, struct EmmcExtCsd *extCsd)
1296 {
1297     int32_t error = 0;
1298     uint32_t val;
1299 
1300     if (cntlr->curDev->reg.csd.specVers < MMC_CSD_SPEC_VER_4) {
1301         return HDF_SUCCESS;
1302     }
1303 
1304     val = EmmcGetPowerClassValue(cntlr, extCsd);
1305     if (val > 0) {
1306         error = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_POWER_CLASS, val);
1307     }
1308     return error;
1309 }
1310 
EmmcSelectActivateHighSpeed(struct MmcCntlr * cntlr,struct EmmcDevice * emmcDev,struct EmmcExtCsd * extCsd)1311 static int32_t EmmcSelectActivateHighSpeed(struct MmcCntlr *cntlr,
1312     struct EmmcDevice *emmcDev, struct EmmcExtCsd *extCsd)
1313 {
1314     int32_t error;
1315 
1316     if (extCsd->hsMaxDtr > 0) {
1317         error = HDF_SUCCESS;
1318         if (MmcCntlrSupportHighSpeed200(cntlr) == true &&
1319             extCsd->hsMaxDtr > EMMC_EXT_CSD_HIGH_SPEED_52) {
1320             error = EmmcSelectHs200(cntlr, emmcDev);
1321             if (error == HDF_SUCCESS) {
1322                 emmcDev->mmc.state.bits.hs200 = 1;
1323             }
1324         } else if (cntlr->caps.bits.highSpeed == 1) {
1325             error = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_HS_TIMING,
1326                 EMMC_EXT_CSD_BUS_TIMING_HS);
1327             if (error == HDF_SUCCESS) {
1328                 emmcDev->mmc.state.bits.highSpeed = 1;
1329                 MmcCntlrSetBusTiming(cntlr, BUS_TIMING_MMC_HS);
1330             }
1331         }
1332         if (error != HDF_SUCCESS && error != HDF_MMC_ERR_SWITCH_FAIL) {
1333             return error;
1334         }
1335     }
1336 
1337     return HDF_SUCCESS;
1338 }
1339 
EmmcSelectBusSpeedMode(struct MmcCntlr * cntlr,struct EmmcDevice * emmcDev,struct EmmcExtCsd * extCsd)1340 static int32_t EmmcSelectBusSpeedMode(struct MmcCntlr *cntlr, struct EmmcDevice *emmcDev, struct EmmcExtCsd *extCsd)
1341 {
1342     int32_t error;
1343 
1344     /* HS400ES mode requires 8-bit bus width. */
1345     if (extCsd->strobeSupport > 0 && MmcCntlrSupportHighSpeed400EnhancedStrobe(cntlr) == true) {
1346         error = EmmcSelectHs400es(cntlr, emmcDev);
1347         if (error != HDF_SUCCESS) {
1348             return error;
1349         }
1350         emmcDev->mmc.state.bits.hs400es = 1;
1351     } else {
1352         /* Activate high speed if supported. */
1353         error = EmmcSelectActivateHighSpeed(cntlr, emmcDev, extCsd);
1354         if (error != HDF_SUCCESS) {
1355             return error;
1356         }
1357         /* host set clock. */
1358         if (emmcDev->mmc.state.bits.hs200 == 1 || emmcDev->mmc.state.bits.highSpeed == 1) {
1359             if (extCsd->hsMaxDtr > 0) {
1360                 MmcCntlrSetClock(cntlr, extCsd->hsMaxDtr);
1361             }
1362         } else if (emmcDev->mmc.reg.csd.maxDtr > 0) {
1363             MmcCntlrSetClock(cntlr, emmcDev->mmc.reg.csd.maxDtr);
1364         }
1365     }
1366 
1367     if (emmcDev->mmc.state.bits.hs400es == 1) {
1368         error = EmmcSelectPowerClass(cntlr, extCsd);
1369         if (error != HDF_SUCCESS) {
1370             HDF_LOGD("EmmcSelectBusSpeedMode: hs400es select power class fail!");
1371         }
1372     } else if (emmcDev->mmc.state.bits.hs200 == 1) {
1373         if ((cntlr->caps2.bits.hs200Sdr1v8 | cntlr->caps2.bits.hs200Sdr1v2) > 0) {
1374             error = MmcCntlrTune(cntlr, SEND_TUNING_BLOCK_HS200);
1375             if (error != HDF_SUCCESS) {
1376                 return error;
1377             }
1378         }
1379 
1380         if ((extCsd->rawCardType & EMMC_EXT_CSD_CARD_TYPE_HS400) > 0 &&
1381             MmcCntlrSupportHighSpeed400(cntlr) == true) {
1382             error = EmmcSelectHs400(cntlr);
1383             if (error != HDF_SUCCESS) {
1384                 return error;
1385             }
1386             emmcDev->mmc.state.bits.hs400 = 1;
1387             emmcDev->mmc.state.bits.hs200 = 0;
1388         }
1389 
1390         error = EmmcSelectPowerClass(cntlr, extCsd);
1391         if (error != HDF_SUCCESS) {
1392             HDF_LOGD("EmmcSelectBusSpeedMode: hs200 select power class fail!");
1393         }
1394     }
1395 
1396     return HDF_SUCCESS;
1397 }
1398 
EmmcGetDdrMode(struct MmcCntlr * cntlr,struct EmmcDevice * emmcDev,struct EmmcExtCsd * extCsd)1399 static uint32_t EmmcGetDdrMode(struct MmcCntlr *cntlr, struct EmmcDevice *emmcDev, struct EmmcExtCsd *extCsd)
1400 {
1401     uint32_t ddrMode = MMC_BUS_MODE_NULL;
1402 
1403     /* Indicate DDR mode (if supported). */
1404     if (emmcDev->mmc.state.bits.highSpeed == 1) {
1405         if ((extCsd->cardType & EMMC_EXT_CSD_CARD_TYPE_DDR_1_8V) > 0 &&
1406             (cntlr->caps.bits.ddr1v8 > 0) &&
1407             (cntlr->caps.bits.uhsDdr50 > 0)) {
1408             ddrMode = MMC_1_8V_DDR_MODE;
1409         } else if ((extCsd->cardType & EMMC_EXT_CSD_CARD_TYPE_DDR_1_2V) > 0 && cntlr->caps.bits.ddr1v2 > 0) {
1410             ddrMode = MMC_1_2V_DDR_MODE;
1411         }
1412     }
1413     return ddrMode;
1414 }
1415 
EmmcSwitchDdrMode(struct MmcCntlr * cntlr,uint32_t ddrMode,enum MmcBusWidth width,uint32_t widthBit)1416 static int32_t EmmcSwitchDdrMode(struct MmcCntlr *cntlr, uint32_t ddrMode,
1417     enum MmcBusWidth width, uint32_t widthBit)
1418 {
1419     int32_t error;
1420 
1421     error = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_BUS_WIDTH, widthBit);
1422     if (error != HDF_SUCCESS) {
1423         HDF_LOGE("EmmcSwitchDdrMode: switch BUS_WIDTH fail!");
1424         return error;
1425     }
1426 
1427     if (ddrMode == MMC_1_2V_DDR_MODE) {
1428         error = MmcCntlrSwitchVoltage(cntlr, VOLT_1V2);
1429         if (error != HDF_SUCCESS) {
1430             HDF_LOGE("EmmcSwitchDdrMode: switch 1.2V fail!");
1431             return error;
1432         }
1433     }
1434     cntlr->curDev->state.bits.ddrMode = 1;
1435     MmcCntlrSetBusTiming(cntlr, BUS_TIMING_UHS_DDR50);
1436     MmcCntlrSetBusWidth(cntlr, width);
1437     return HDF_SUCCESS;
1438 }
1439 
EmmcSelectSwitchDdrMode(struct MmcCntlr * cntlr,struct EmmcDevice * emmcDev,struct EmmcExtCsd * extCsd)1440 static int32_t EmmcSelectSwitchDdrMode(struct MmcCntlr *cntlr, struct EmmcDevice *emmcDev,
1441     struct EmmcExtCsd *extCsd)
1442 {
1443     int32_t error;
1444     uint32_t index;
1445     uint32_t ddrMode;
1446     enum MmcBusWidth width;
1447     const enum MmcBusWidth busWidths[] = { BUS_WIDTH8, BUS_WIDTH4, BUS_WIDTH1 };
1448     uint32_t busWidthBit[][2] = {
1449         { EMMC_EXT_CSD_BUS_WIDTH_8, EMMC_EXT_CSD_DDR_BUS_WIDTH_8 },
1450         { EMMC_EXT_CSD_BUS_WIDTH_4, EMMC_EXT_CSD_DDR_BUS_WIDTH_4 },
1451         { EMMC_EXT_CSD_BUS_WIDTH_1, EMMC_EXT_CSD_BUS_WIDTH_1 },
1452     };
1453 
1454     ddrMode = EmmcGetDdrMode(cntlr, emmcDev, extCsd);
1455     if (emmcDev->mmc.state.bits.hs400es == 0 &&
1456         emmcDev->mmc.state.bits.hs400 == 0 &&
1457         emmcDev->mmc.state.bits.hs200 == 0 &&
1458         cntlr->curDev->reg.csd.specVers >= MMC_CSD_SPEC_VER_4 &&
1459         (cntlr->caps.bits.cap4Bit | cntlr->caps.bits.cap8Bit) > 0) {
1460         index = 1;
1461         if (cntlr->caps.bits.cap8Bit > 0) {
1462             index = 0;
1463         }
1464         for (; index < sizeof(busWidthBit) / sizeof(busWidthBit[0]); index++) {
1465             width = busWidths[index];
1466             /* no DDR for 1-bit width. */
1467             if (width == BUS_WIDTH1) {
1468                 ddrMode = MMC_BUS_MODE_NULL;
1469             }
1470             error = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_BUS_WIDTH, busWidthBit[index][0]);
1471             if (error != HDF_SUCCESS) {
1472                 continue;
1473             }
1474             MmcCntlrSetBusWidth(cntlr, width);
1475             error = EmmcCheckExtCsd(cntlr, width);
1476             if (error == HDF_SUCCESS) {
1477                 break;
1478             }
1479         }
1480         /* switch DDR mode. */
1481         if (error == HDF_SUCCESS && ddrMode > MMC_BUS_MODE_NULL) {
1482             error = EmmcSwitchDdrMode(cntlr, ddrMode, width, busWidthBit[index][1]);
1483         }
1484         if (error != HDF_SUCCESS) {
1485             HDF_LOGE("EmmcSelectSwitchDdrMode: switch ddr mode fail!");
1486             return error;
1487         }
1488     }
1489     return HDF_SUCCESS;
1490 }
1491 
EmmcActivateHpiMechanism(struct MmcCntlr * cntlr,struct EmmcExtCsd * extCsd)1492 static int32_t EmmcActivateHpiMechanism(struct MmcCntlr *cntlr, struct EmmcExtCsd *extCsd)
1493 {
1494     int32_t error;
1495 
1496     if (extCsd->hpi == true) {
1497         error = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_HPI_MGMT, 1);
1498         if (error == HDF_SUCCESS) {
1499             extCsd->hpiEnable = true;
1500         } else if (error != HDF_MMC_ERR_SWITCH_FAIL) {
1501             HDF_LOGE("EmmcActivateHpiMechanism: switch HPI_MGMT fail!");
1502             return error;
1503         }
1504     }
1505     return HDF_SUCCESS;
1506 }
1507 
EmmcSwitchOperationMode(struct MmcCntlr * cntlr)1508 static int32_t EmmcSwitchOperationMode(struct MmcCntlr *cntlr)
1509 {
1510     struct EmmcDevice *emmcDev = (struct EmmcDevice *)cntlr->curDev;
1511     struct EmmcExtCsd *extCsd = &(emmcDev->emmcReg.extCsd);
1512     int32_t error;
1513 
1514     if (extCsd->enhAreaEnable == true) {
1515         error = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_ERASE_GROUP_DEF, 1);
1516         if (error == HDF_SUCCESS) {
1517             extCsd->eraseGroupDef = 1;
1518         } else if (error != HDF_MMC_ERR_SWITCH_FAIL) {
1519             HDF_LOGE("EmmcSwitchOperationMode: switch ERASE_GROUP_DEF fail!");
1520             return error;
1521         }
1522     }
1523 
1524     if ((extCsd->partConfig & EMMC_EXT_CSD_PART_CONFIG_ACCESS_MASK) > 0) {
1525         /* No access to boot partition (default). */
1526         extCsd->partConfig &= ~EMMC_EXT_CSD_PART_CONFIG_ACCESS_MASK;
1527         error = MmcSwitch(cntlr, EMMC_EXT_CSD_CMD_SET_NORMAL, EMMC_EXT_CSD_PARTITION_CONFIG, extCsd->partConfig);
1528         if (error != HDF_SUCCESS && error != HDF_MMC_ERR_SWITCH_FAIL) {
1529             HDF_LOGE("EmmcSwitchOperationMode: switch PARTITION_CONFIG fail!");
1530             return error;
1531         }
1532     }
1533 
1534     error = EmmcSelectBusSpeedMode(cntlr, emmcDev, extCsd);
1535     if (error != HDF_SUCCESS) {
1536         HDF_LOGE("EmmcSwitchOperationMode: select bus speed mode fail!");
1537         return error;
1538     }
1539 
1540     error = EmmcSelectSwitchDdrMode(cntlr, emmcDev, extCsd);
1541     if (error != HDF_SUCCESS) {
1542         HDF_LOGE("EmmcSwitchOperationMode: select switch ddr mode fail!");
1543         return error;
1544     }
1545     return EmmcActivateHpiMechanism(cntlr, extCsd);
1546 }
1547 
EmmcReadExtCsd(struct MmcCntlr * cntlr)1548 static int32_t EmmcReadExtCsd(struct MmcCntlr *cntlr)
1549 {
1550     uint8_t extCsd[EXT_CSD_BYTES_LEN] = {0};
1551     int32_t error;
1552 
1553     if (cntlr->curDev->reg.csd.specVers < MMC_CSD_SPEC_VER_4) {
1554         return HDF_SUCCESS;
1555     }
1556 
1557     error = MmcSendExtCsd(cntlr, extCsd, EXT_CSD_BYTES_LEN);
1558     if (error != HDF_SUCCESS) {
1559         HDF_LOGE("EmmcReadExtCsd: send cmd8 fail, error = %d.", error);
1560         return error;
1561     }
1562     error = EmmcDecodeExtCsd(cntlr, extCsd, EXT_CSD_BYTES_LEN);
1563     if (error != HDF_SUCCESS) {
1564         HDF_LOGE("EmmcReadExtCsd: decode ext csd fail, error = %d.", error);
1565         return error;
1566     }
1567 
1568     return error;
1569 }
1570 
EmmcSelect(struct MmcCntlr * cntlr,union MmcOcr ocr)1571 static int32_t EmmcSelect(struct MmcCntlr *cntlr, union MmcOcr ocr)
1572 {
1573     union MmcOcr curOcr;
1574     int32_t error;
1575 
1576     MmcGoIdleState(cntlr);
1577     ocr.bits.hcs = 1;
1578     /* set dev work voltage. */
1579     error = MmcSendOpCond(cntlr, ocr.ocrData, &curOcr.ocrData);
1580     if (error != HDF_SUCCESS) {
1581         HDF_LOGE("EmmcSelect: Emmc cmd1(set voltage) fail, error = %d.", error);
1582         return error;
1583     }
1584 
1585     error = MmcAllSendCid(cntlr);
1586     if (error != HDF_SUCCESS) {
1587         HDF_LOGE("EmmcSelect: Emmc cmd2(get cid) fail, error = %d.", error);
1588         return error;
1589     }
1590 
1591     /* card is identified. */
1592     cntlr->curDev->reg.rca = 1;
1593     error = MmcSetRelativeAddr(cntlr);
1594     if (error != HDF_SUCCESS) {
1595         HDF_LOGE("EmmcSelect: Emmc cmd3(set rca) fail, error = %d.", error);
1596         return error;
1597     }
1598 
1599     error = MmcSendCsd(cntlr);
1600     if (error != HDF_SUCCESS) {
1601         HDF_LOGE("EmmcSelect: Emmc send cmd9(get csd) fail, error = %d.", error);
1602         return error;
1603     }
1604     error = EmmcDecodeCsd(cntlr);
1605     if (error != HDF_SUCCESS) {
1606         HDF_LOGE("EmmcSelect: Emmc decode csd fail, error = %d.", error);
1607         return error;
1608     }
1609     error = EmmcDecodeCid(cntlr);
1610     if (error != HDF_SUCCESS) {
1611         HDF_LOGE("EmmcSelect: Emmc decode cid fail, error = %d.", error);
1612         return error;
1613     }
1614     error = MmcSelectCard(cntlr);
1615     if (error != HDF_SUCCESS) {
1616         HDF_LOGE("EmmcSelect: Emmc send cmd7 fail, error = %d.", error);
1617         return error;
1618     }
1619     error = EmmcReadExtCsd(cntlr);
1620     if (error != HDF_SUCCESS) {
1621         HDF_LOGE("EmmcSelect: Emmc read ext csd fail, error = %d.", error);
1622         return error;
1623     }
1624 
1625     return EmmcSwitchOperationMode(cntlr);
1626 }
1627 
EmmcDeviceAdd(struct MmcCntlr * cntlr)1628 static int32_t EmmcDeviceAdd(struct MmcCntlr *cntlr)
1629 {
1630     EmmcSetBlockCapacity(cntlr);
1631     /* add dev. */
1632     if (MmcDeviceAdd(cntlr->curDev) != HDF_SUCCESS) {
1633         HDF_LOGE("EmmcDeviceAdd: Add device fail!");
1634         return HDF_FAILURE;
1635     }
1636     cntlr->curDev->state.bits.present = 1;
1637     return HDF_SUCCESS;
1638 }
1639 
EmmcInit(struct MmcCntlr * cntlr)1640 static int32_t EmmcInit(struct MmcCntlr *cntlr)
1641 {
1642     int32_t error;
1643     union MmcOcr ocr = {0};
1644 
1645     /* cmd1, detect emmc dev and get the voltage range. */
1646     error = MmcSendOpCond(cntlr, 0, &(ocr.ocrData));
1647     if (error != HDF_SUCCESS) {
1648         HDF_LOGE("EmmcInit: cmd1(detect emmc) fail, error = %d.", error);
1649         return error;
1650     }
1651 
1652     MmcCntlrSelectWorkVoltage(cntlr, &ocr);
1653     if (cntlr->curDev->reg.ocr.ocrData == 0) {
1654         HDF_LOGE("EmmcInit: Emmc select work voltage fail!");
1655         return HDF_ERR_INVALID_PARAM;
1656     }
1657     /* work voltage is low voltage, host should switch. */
1658     if (cntlr->curDev->reg.ocr.bits.vdd1v65To1v95 > 0) {
1659         HDF_LOGD("EmmcInit: Emmc switch to 1.8V!");
1660         MmcCntlrSwitchVoltage(cntlr, VOLT_1V8);
1661     }
1662 
1663     error = EmmcSelect(cntlr, cntlr->curDev->reg.ocr);
1664     if (error != HDF_SUCCESS) {
1665         HDF_LOGD("EmmcInit: emmc select fail!");
1666         return error;
1667     }
1668 
1669     return EmmcDeviceAdd(cntlr);
1670 }
1671 
EmmcDetect(struct MmcCntlr * cntlr)1672 static int32_t EmmcDetect(struct MmcCntlr *cntlr)
1673 {
1674     int32_t ret;
1675 
1676     HDF_LOGD("EmmcDetect: Detect emmc dev start...");
1677     MmcGoIdleState(cntlr);
1678     ret = EmmcInit(cntlr);
1679     if (ret == HDF_SUCCESS) {
1680         HDF_LOGD("EmmcDetect: Detect emmc dev success! %s dev at address 0x%x!",
1681             cntlr->curDev->state.bits.uhs ? "Ultra high speed" :
1682             (cntlr->curDev->state.bits.highSpeed ? "High speed" : ""),
1683             cntlr->curDev->reg.rca);
1684     }
1685     return ret;
1686 }
1687 
SdSendAppCmd(struct MmcCntlr * cntlr,struct MmcCmd * cmd,struct MmcData * data,uint32_t retryTimes)1688 static int32_t SdSendAppCmd(struct MmcCntlr *cntlr, struct MmcCmd *cmd,
1689     struct MmcData *data, uint32_t retryTimes)
1690 {
1691     uint32_t i;
1692     int32_t err;
1693 
1694     if (cntlr == NULL || cmd == NULL || retryTimes == 0) {
1695         HDF_LOGE("SdSendAppCmd: cntlr or cmd or retryTimes is null!");
1696         return HDF_ERR_INVALID_PARAM;
1697     }
1698 
1699     for (i = 0; i <= retryTimes; i++) {
1700         err = MmcAppCmd(cntlr, cmd->cmdCode);
1701         if (err != HDF_SUCCESS) {
1702             continue;
1703         }
1704         err = MmcSendCmd(cntlr, cmd, data, 1);
1705         if (err == HDF_SUCCESS) {
1706             break;
1707         }
1708     }
1709     return err;
1710 }
1711 
SdAcmdOpCond(struct MmcCntlr * cntlr,uint32_t arg,uint32_t * ocr)1712 static int32_t SdAcmdOpCond(struct MmcCntlr *cntlr, uint32_t arg, uint32_t *ocr)
1713 {
1714     struct MmcCmd cmd = {0};
1715     int32_t err;
1716     uint32_t i;
1717 
1718     cmd.cmdCode = SD_ACMD_OP_COND;
1719     /* [31]reserved bit, [30]HCS, [29]reserved for eSD, [28]XPC, [27:25]reserved bits, [24]S18R, [23:0]VDD voltage. */
1720     cmd.argument = arg;
1721     /* Broadcast Commands with Response(bcr). */
1722     cmd.respType = MMC_RESP_R3 | MMC_CMD_TYPE_BCR;
1723     /*
1724      * The host must poll the card (by repeatedly sending CMD1 or ACMD41) until the 'in-idle-state' bit in
1725      * the card response indicates (by being set to 0) that the card completed its initialization processes
1726      * and is ready for the next command.
1727      */
1728     for (i = 0; i < INIT_CMD_RETRY_TIMES; i++) {
1729         err = SdSendAppCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
1730         if (err != HDF_SUCCESS) {
1731             break;
1732         }
1733         /* if probing, just single pass */
1734         if (arg == 0) {
1735             break;
1736         }
1737         /*
1738          * wait until init complete.
1739          * 0--On Initialization; 1--Initialization Complete.
1740          */
1741         if ((cmd.resp[0] & MMC_CARD_BUSY_STATUS) > 0) {
1742             break;
1743         }
1744         err = HDF_ERR_TIMEOUT;
1745         MmcMDelay(SD_SEND_OP_COND_DELAY);
1746     }
1747     if (ocr != NULL) {
1748         *ocr = cmd.resp[0];
1749     }
1750 
1751     return err;
1752 }
1753 
SdAcmdSdStatus(struct MmcCntlr * cntlr,uint32_t * ssr,uint32_t len)1754 static int32_t SdAcmdSdStatus(struct MmcCntlr *cntlr, uint32_t *ssr, uint32_t len)
1755 {
1756     struct MmcCmd cmd = {0};
1757     struct MmcData data = {0};
1758     int32_t error;
1759     uint32_t i;
1760 
1761     if (cntlr == NULL || ssr == NULL || len == 0) {
1762         HDF_LOGE("SdAcmdSdStatus: cntlr or ssr is null or len is invalid!");
1763         return HDF_ERR_INVALID_PARAM;
1764     }
1765 
1766     cmd.cmdCode = SD_ACMD_SD_STATUS;
1767     /* [31:0] stuff bits. */
1768     cmd.argument = 0;
1769     /* Addressed (point-to-point) Data Transfer Commands (adtc), data transfer on DAT. */
1770     cmd.respType = MMC_RESP_SPI_R2 | MMC_RESP_R1 | MMC_CMD_TYPE_ADTC;
1771     data.blockSize = SSR_BYTES_LEN;
1772     data.blockNum = 1;
1773     data.dataFlags = DATA_READ;
1774     data.dataBuffer = (uint8_t *)ssr;
1775     error = SdSendAppCmd(cntlr, &cmd, &data, 1);
1776     if (error != HDF_SUCCESS) {
1777         return error;
1778     }
1779     for (i = 0; i < len; i++) {
1780         ssr[i] = MmcEndianConversion(ssr[i]);
1781     }
1782     return error;
1783 }
1784 
SdAppSendScr(struct MmcCntlr * cntlr,uint32_t * scr,uint32_t len)1785 static int32_t SdAppSendScr(struct MmcCntlr *cntlr, uint32_t *scr, uint32_t len)
1786 {
1787     struct MmcCmd cmd = {0};
1788     struct MmcData data = {0};
1789     int32_t error;
1790     uint32_t i;
1791 
1792     if (cntlr == NULL || scr == NULL || len == 0) {
1793         HDF_LOGE("SdAppSendScr: cntlr or ssr is null or len is invalid!");
1794         return HDF_ERR_INVALID_PARAM;
1795     }
1796 
1797     cmd.cmdCode = SD_ACMD_SEND_SCR;
1798     /* [31:0] stuff bits. */
1799     cmd.argument = 0;
1800     /* Addressed (point-to-point) Data Transfer Commands (adtc), data transfer on DAT. */
1801     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_ADTC;
1802     data.blockSize = SCR_BYTES_LEN;
1803     data.blockNum = 1;
1804     data.dataFlags = DATA_READ;
1805     data.dataBuffer = (uint8_t *)scr;
1806     error = SdSendAppCmd(cntlr, &cmd, &data, 1);
1807     if (error != HDF_SUCCESS) {
1808         return error;
1809     }
1810     for (i = 0; i < len; i++) {
1811         scr[i] = MmcEndianConversion(scr[i]);
1812     }
1813     return error;
1814 }
1815 
SdAcmdSetBusWidth(struct MmcCntlr * cntlr,uint32_t width)1816 static int32_t SdAcmdSetBusWidth(struct MmcCntlr *cntlr, uint32_t width)
1817 {
1818     struct MmcCmd cmd = {0};
1819 
1820     cmd.cmdCode = SD_ACMD_SET_BUS_WIDTH;
1821     /* [31:2] stuff bits; [1:0]bus width: '00' = 1bit and '10' = 4bits. */
1822     cmd.argument = width;
1823     /* Addressed (point-to-point) Commands(ac), no data transfer on DAT. */
1824     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
1825 
1826     return SdSendAppCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
1827 }
1828 
SdCmdSendIfCond(struct MmcCntlr * cntlr,uint32_t ocr)1829 static int32_t SdCmdSendIfCond(struct MmcCntlr *cntlr, uint32_t ocr)
1830 {
1831     struct MmcCmd cmd = {0};
1832     int32_t err;
1833     uint32_t vhs;
1834 
1835     cmd.cmdCode = SD_CMD_SEND_IF_COND;
1836     /*
1837      * [31:12]reserved bits, [11:8]supply voltage(VHS), [7:0]check pattern.
1838      * VHS = 0001, 2.7-3.6V.
1839      */
1840     vhs = ((ocr & 0xFF8000U) > 0) ? 1 : 0;
1841     cmd.argument = (vhs << 8) | 0xAA;
1842     cmd.respType = MMC_RESP_SPI_R7 | MMC_RESP_R7 | MMC_CMD_TYPE_BCR;
1843 
1844     err = MmcSendCmd(cntlr, &cmd, NULL, 1);
1845     if (err != HDF_SUCCESS) {
1846         return err;
1847     }
1848     /*
1849      * Check pattern is used for the host to check validity of communication between the host and the card.
1850      * In the Response, the card echoes back the check pattern set in argument.
1851      * If check pattern is not matched, CMD8 communication is not valid.
1852      */
1853     if ((cmd.resp[0] & 0xFF) != 0xAA) {
1854         return HDF_ERR_IO;
1855     }
1856     return HDF_SUCCESS;
1857 }
1858 
SdCmdSendRelativeAddr(struct MmcCntlr * cntlr,uint32_t * rca)1859 static int32_t SdCmdSendRelativeAddr(struct MmcCntlr *cntlr, uint32_t *rca)
1860 {
1861     int32_t error;
1862     struct MmcCmd cmd = {0};
1863 
1864     cmd.cmdCode = SD_CMD_SEND_RELATIVE_ADDR;
1865     /* [31:0] stuff bits. */
1866     cmd.argument = 0;
1867     cmd.respType = MMC_RESP_R6 | MMC_CMD_TYPE_BCR;
1868     error = MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
1869     if (error != HDF_SUCCESS) {
1870         return error;
1871     }
1872     if (rca != NULL) {
1873         /* New published RCA [31:16] of the card. */
1874         *rca = cmd.resp[0] >> 16;
1875     }
1876     return error;
1877 }
1878 
SdCmdSwitchVoltage(struct MmcCntlr * cntlr)1879 static int32_t SdCmdSwitchVoltage(struct MmcCntlr *cntlr)
1880 {
1881     int32_t error;
1882     struct MmcCmd cmd = {0};
1883 
1884     /* Voltage switch command to change signaling level 3.3V to 1.8V. */
1885     cmd.cmdCode = SD_CMD_SWITCH_VOLTAGE;
1886     /* [31:0] stuff bits. */
1887     cmd.argument = 0;
1888     cmd.respType = MMC_RESP_R1 | MMC_CMD_TYPE_AC;
1889     error = MmcSendCmd(cntlr, &cmd, NULL, 1);
1890     if (error != HDF_SUCCESS) {
1891         return error;
1892     }
1893     if (cmd.resp[0] & GENERAL_ERROR) {
1894         return HDF_ERR_IO;
1895     }
1896     return HDF_SUCCESS;
1897 }
1898 
SdCmdSwitchFunc(struct MmcCntlr * cntlr,struct SdSwitchFuncParam * param,uint8_t * status,uint32_t len)1899 static int32_t SdCmdSwitchFunc(struct MmcCntlr *cntlr, struct SdSwitchFuncParam *param,
1900     uint8_t *status, uint32_t len)
1901 {
1902     struct MmcCmd cmd = {0};
1903     struct MmcData data = {0};
1904 
1905     cmd.cmdCode = SD_CMD_SWITCH_FUNC;
1906     /*
1907      * [31]Mode. The switch command can be used in two modes:
1908      * Mode 0 (Check function) is used to query if the card supports a specific function or functions.
1909      * Mode 1 (set function) is used to switch the functionality of the card.
1910      */
1911     cmd.argument = (param->mode << 31) | 0x00FFFFFF;
1912     /*
1913      * [30:24] reserved(All '0'); [23:20] reserved for function group 6(All '0' or 0xF);
1914      * [19:16] reserved for function group 5(All '0' or 0xF); [15:12] function group 4 for Power Limit;
1915      * [11:8] function group 3 for Drive Strength; [7:4] function group 2 for command system;
1916      * [3:0] function group 1 for access mode.
1917      */
1918     cmd.argument &= ~(0xFU << (param->group * 4));
1919     cmd.argument |= (param->value & 0xF) << (param->group * 4);
1920     cmd.respType = MMC_RESP_SPI_R1 | MMC_RESP_R1 | MMC_CMD_TYPE_ADTC;
1921     /*
1922      * As a response to the switch function command, the SD Memory Card will send R1 response on the CMD line,
1923      * and 512 bits of status on the DAT lines.
1924      */
1925     data.blockSize = len;
1926     data.blockNum = 1;
1927     data.dataFlags = DATA_READ;
1928     data.dataBuffer = status;
1929 
1930     return MmcSendCmd(cntlr, &cmd, &data, 1);
1931 }
1932 
SdDecodeScr(struct MmcCntlr * cntlr)1933 static int32_t SdDecodeScr(struct MmcCntlr *cntlr)
1934 {
1935     struct SdScr *scr = NULL;
1936     uint32_t *rawScr = NULL;
1937     struct SdDevice *sdDev = NULL;
1938     uint32_t scrStruct;
1939 
1940     if (cntlr == NULL || cntlr->curDev == NULL) {
1941         HDF_LOGE("SdDecodeScr: cntlr or curDev is null!");
1942         return HDF_ERR_INVALID_PARAM;
1943     }
1944 
1945     sdDev = (struct SdDevice *)cntlr->curDev;
1946     rawScr = sdDev->reg.rawScr;
1947     scr = &(sdDev->reg.scr);
1948 
1949     /*
1950      * SCR_STRUCTURE: [63:60];
1951      * SCR_STRUCTURE equal 0, SCR version 1.0; SCR_STRUCTURE equal 1-15, reserved.
1952      */
1953     scrStruct = (uint8_t)MmcParseBits(rawScr, SCR_BITS, 60, 4);
1954     if (scrStruct != 0) {
1955         HDF_LOGE("SdDecodeScr: scrStruct is invalid!");
1956         return HDF_ERR_INVALID_PARAM;
1957     }
1958     /*
1959      * SD_SPEC: [59:56].
1960      * Describes the SD Memory Card Physical Layer Specification version supported by this card.
1961      * SD_SPEC = 0 , Version 1.0-1.01; SD_SPEC = 1, Version 1.1; SD_SPEC = 2, Version >= 2.0.
1962      */
1963     scr->sdSpec = (uint8_t)MmcParseBits(rawScr, SCR_BITS, 56, 4);
1964     if (scr->sdSpec == SD_SCR_SPEC_2) {
1965         /* SD_SPEC3: [47:47] */
1966         scr->sdSpec3 = (uint8_t)MmcParseBits(rawScr, SCR_BITS, 47, 1);
1967     }
1968     /*
1969      * SD_BUS_WIDTHS: [51:48].
1970      * SD_BUS_WIDTHS equal 0, 1 bit (DAT0); SD_BUS_WIDTHS equal 2, 4 bit (DAT0-3).
1971      */
1972     scr->sdBusWidths = (uint8_t)MmcParseBits(rawScr, SCR_BITS, 48, 4);
1973     /* CMD_SUPPORT: [35:32] */
1974     scr->cmdSupport = (uint8_t)MmcParseBits(rawScr, SCR_BITS, 32, 2);
1975     return HDF_SUCCESS;
1976 }
1977 
SdDecodeSSr(struct MmcCntlr * cntlr,uint32_t * rawSsr,uint32_t len)1978 static int32_t SdDecodeSSr(struct MmcCntlr *cntlr, uint32_t *rawSsr, uint32_t len)
1979 {
1980     struct SdSsr *ssr = NULL;
1981     struct SdScr *scr = NULL;
1982     struct SdDevice *sdDev = NULL;
1983     uint32_t eraseSize;
1984     uint32_t eraseTimeout;
1985 
1986     if (cntlr == NULL || cntlr->curDev == NULL || rawSsr == NULL || len == 0) {
1987         HDF_LOGE("SdDecodeSSr: cntlr or curDev or rawSsr is null or len is invalid!");
1988         return HDF_ERR_INVALID_PARAM;
1989     }
1990 
1991     sdDev = (struct SdDevice *)cntlr->curDev;
1992     ssr = &(sdDev->reg.ssr);
1993     scr = &(sdDev->reg.scr);
1994     /* SPEED_CLASS: [447:440] */
1995     ssr->speedClass = MmcParseBits(rawSsr, SSR_BITS, 440, 8);
1996     /* AU_SIZE: [431: 428]. */
1997     ssr->auSize = MmcParseBits(rawSsr, SSR_BITS, 428, 4);
1998     if (ssr->auSize > 0) {
1999         if ((ssr->auSize <= MMC_MAX_BLOCKSIZE_SHIFT) || scr->sdSpec3 > 0) {
2000             ssr->auValue = 1 << (ssr->auSize + 4);
2001             /*
2002              * ERASE_SIZE: [423:408]. If this field is set to 0, the erase timeout calculation is not supported.
2003              * ERASE_SIZE = 1, value = 1AU; ERASE_SIZE = 2, value = 2AU...
2004              */
2005             eraseSize = MmcParseBits(rawSsr, SSR_BITS, 408, 16);
2006             /* ERASE_TIMEOUT: [407:402] */
2007             eraseTimeout = MmcParseBits(rawSsr, SSR_BITS, 402, 6);
2008             if (eraseSize > 0) {
2009                 ssr->eraseTimeout = (eraseTimeout * 1000) / eraseSize;
2010                 /* ERASE_OFFSET: [401:400] */
2011                 ssr->eraseOffset = 1000 * MmcParseBits(rawSsr, SSR_BITS, 400, 2);
2012             }
2013         } else {
2014             HDF_LOGD("SdDecodeSSr: Invalid AU.");
2015         }
2016     }
2017     /* UHS_SPEED_GRADE: [399:396] */
2018     ssr->uhsSpeedGrade = MmcParseBits(rawSsr, SSR_BITS, 396, 4);
2019     return HDF_SUCCESS;
2020 }
2021 
SdDecodeCid(struct MmcCntlr * cntlr)2022 static void SdDecodeCid(struct MmcCntlr *cntlr)
2023 {
2024     struct MmcCid *cid = NULL;
2025     uint32_t *rawCid = NULL;
2026     uint32_t i;
2027 
2028     if (cntlr == NULL || cntlr->curDev == NULL) {
2029         HDF_LOGE("SdDecodeCid: cntlr or curDev is null!");
2030         return;
2031     }
2032 
2033     rawCid = cntlr->curDev->reg.rawCid;
2034     cid = &(cntlr->curDev->reg.cid);
2035     /* Manufacturer ID(MID): [127:120] */
2036     cid->mid = MmcParseBits(rawCid, CID_BITS, 120, 8);
2037     /* OEM/Application ID(OID): [119:104] */
2038     cid->oid = MmcParseBits(rawCid, CID_BITS, 104, 16);
2039     /* Product name(PNM): [103:64] */
2040     for (i = 0; i < 5; i++) {
2041         cid->pnm[i] = (char)MmcParseBits(rawCid, CID_BITS, CID_PNM_START_BIT - (i * BITS_PER_BYTE), BITS_PER_BYTE);
2042     }
2043     cid->pnm[5] = '\0';
2044     /*
2045      * Product revision(PRV): [63:56].
2046      * The product revision is composed of two Binary Coded Decimal (BCD) digits, four bits each,
2047      * representingan "n.m" revision number.
2048      */
2049     cid->hwPrv = MmcParseBits(rawCid, CID_BITS, 60, 4);
2050     cid->fwPrv = MmcParseBits(rawCid, CID_BITS, 56, 4);
2051     /* Product serial number(PSN): [55:24] */
2052     cid->psn = MmcParseBits(rawCid, CID_BITS, 24, 32);
2053     /*
2054      * Manufacturing date(MDT): [19:8].
2055      * The manufacturing date composed of two hexadecimal digits, one is 8 bit representing the year(y)
2056      * and the other is four bits representing the month(m).
2057      * The "m" field [11:8] is the month code. 1 = January.
2058      * The "y" field [19:12] is the year code. 0 = 2000.
2059      */
2060     cid->year = MmcParseBits(rawCid, CID_BITS, 12, 8) + 2000;
2061     cid->month = MmcParseBits(rawCid, CID_BITS, 8, 4);
2062 }
2063 
SdSetBlockCapacity(struct MmcCntlr * cntlr)2064 static void SdSetBlockCapacity(struct MmcCntlr *cntlr)
2065 {
2066     struct SdDevice *sdDev = (struct SdDevice *)cntlr->curDev;
2067     uint32_t gibVal;
2068     uint32_t mibVal;
2069 
2070     sdDev->mmc.eraseSize = sdDev->mmc.reg.csd.eraseSize;
2071     sdDev->mmc.capacity = sdDev->mmc.reg.csd.capacity <<
2072         (sdDev->mmc.reg.csd.readBlkLen - MMC_MAX_BLOCKSIZE_SHIFT);
2073 
2074     gibVal = sdDev->mmc.capacity >> 21;
2075     mibVal = (sdDev->mmc.capacity & ~(gibVal << 21)) >> 11;
2076     HDF_LOGD("SdSetBlockCapacity: SD dev capacity %d.%d Gib", gibVal, mibVal);
2077 }
2078 
SdDecodeCsdRev1Field(struct MmcCntlr * cntlr,struct MmcCsd * csd,uint32_t * rawCsd)2079 static void SdDecodeCsdRev1Field(struct MmcCntlr *cntlr, struct MmcCsd *csd, uint32_t *rawCsd)
2080 {
2081     uint32_t unit;
2082     uint32_t factor;
2083 
2084     /* TAAC: [119:112]; TAAC bit position-->Time unit: [2:0], Multiplier factor: [6:3]. */
2085     factor = MmcParseBits(rawCsd, CSD_BITS, 115, 4);
2086     unit = MmcParseBits(rawCsd, CSD_BITS, 112, 3);
2087     csd->taccNs = (g_taccUnit[unit] * g_commFactor[factor] + 9) / 10;
2088     /* NSAC: [111:104], the unit for NSAC is 100 clock cycles */
2089     csd->taccClks = MmcParseBits(rawCsd, CSD_BITS, 104, 8) * 100;
2090 
2091     /* TRAN_SPEED: [103:96]; TRAN_SPEED bit-->Frequency unit: [2:0], Multiplier factor: [6:3]. */
2092     factor = MmcParseBits(rawCsd, CSD_BITS, 99, 4);
2093     unit = MmcParseBits(rawCsd, CSD_BITS, 96, 3);
2094     csd->maxDtr = g_tranSpeedUnit[unit] * g_commFactor[factor];
2095     /* card command classes: [95:84] */
2096     csd->ccc = MmcParseBits(rawCsd, CSD_BITS, 84, 12);
2097     /* C_SIZE: [73:62] */
2098     unit = MmcParseBits(rawCsd, CSD_BITS, 62, 12);
2099     /* C_SIZE_MULT: [49:47] */
2100     factor = MmcParseBits(rawCsd, CSD_BITS, 47, 3);
2101     csd->capacity = (1 + unit) << (factor + 2);
2102     /* READ_BL_LEN: [83:80]. */
2103     csd->readBlkLen = MmcParseBits(rawCsd, CSD_BITS, 80, 4);
2104     /* READ_BL_PARTIAL: [79:79] */
2105     csd->rdPartial = MmcParseBits(rawCsd, CSD_BITS, 79, 1);
2106     /* WRITE_BLK_MISALIGN: [78:78] */
2107     csd->wrMisalign = MmcParseBits(rawCsd, CSD_BITS, 78, 1);
2108     /* READ_BLK_MISALIGN: [77:77] */
2109     csd->rdMisalign = MmcParseBits(rawCsd, CSD_BITS, 77, 1);
2110     /* Write speed factor(R2W_FACTOR) :[28:26] */
2111     csd->r2wFactor = MmcParseBits(rawCsd, CSD_BITS, 26, 3);
2112     /* WRITE_BL_LEN: [25:22] */
2113     csd->writeBlkLen = MmcParseBits(rawCsd, CSD_BITS, 22, 4);
2114     /* WRITE_BL_PARTIAL: [21:21] */
2115     csd->wrPartial = MmcParseBits(rawCsd, CSD_BITS, 21, 1);
2116     /*
2117      * erase single block enable(ERASE_BLK_EN): [46:46]
2118      * If ERASE_BLK_EN is '0' erase area is unit of SECTOR_SIZE.
2119      * if ERASE_BLK_EN is '1' erase area is unit of SECTOR_SIZE or unit of WRITE_BL_LEN.
2120      */
2121     if (MmcParseBits(rawCsd, CSD_BITS, 46, 1) == 1) {
2122         csd->eraseSize = 1;
2123     } else if (csd->writeBlkLen >= MMC_MAX_BLOCKSIZE_SHIFT) {
2124         /*
2125          * erase sector size(SECTOR_SIZE): [45:39].
2126          * The actual size is computed by increasing this number by one.
2127          * A value of zero means 1 write block, 127 means 128 write blocks.
2128          */
2129         csd->eraseSize = MmcParseBits(rawCsd, CSD_BITS, 39, 7) + 1;
2130         csd->eraseSize <<= (csd->writeBlkLen - MMC_MAX_BLOCKSIZE_SHIFT);
2131     }
2132 }
2133 
SdDecodeCsdRev2Field(struct MmcCntlr * cntlr,struct MmcCsd * csd,uint32_t * rawCsd)2134 static void SdDecodeCsdRev2Field(struct MmcCntlr *cntlr, struct MmcCsd *csd, uint32_t *rawCsd)
2135 {
2136     uint32_t unit;
2137     uint32_t factor;
2138 
2139     cntlr->curDev->state.bits.blockAddr = 1;
2140     /* TRAN_SPEED: [103:96]; TRAN_SPEED bit-->Frequency unit: [2:0], Multiplier factor: [6:3]. */
2141     factor = MmcParseBits(rawCsd, CSD_BITS, 99, 4);
2142     unit = MmcParseBits(rawCsd, CSD_BITS, 96, 3);
2143     csd->maxDtr = g_tranSpeedUnit[unit] * g_commFactor[factor];
2144     /* card command classes: [95:84] */
2145     csd->ccc = MmcParseBits(rawCsd, CSD_BITS, 84, 12);
2146     /* device size(C_SIZE): [69:48] */
2147     csd->cSize = MmcParseBits(rawCsd, CSD_BITS, 48, 22);
2148     /* The Minimum value of C_SIZE for SDXC in CSD Version 2.0 is 00FFFFh(65535). */
2149     if (csd->cSize >= 0xFFFF) {
2150         cntlr->curDev->state.bits.sdxc = 1;
2151     }
2152     /* memory capacity = (C_SIZE + 1) * 512KByte */
2153     csd->capacity = (1 + csd->cSize) << 10;
2154 
2155     csd->taccNs = 0;
2156     csd->taccClks = 0;
2157     csd->rdPartial = 0;
2158     csd->readBlkLen = MMC_MAX_BLOCKSIZE_SHIFT;
2159     csd->rdMisalign = 0;
2160     csd->wrMisalign = 0;
2161     csd->writeBlkLen = MMC_MAX_BLOCKSIZE_SHIFT;
2162     csd->wrPartial = 0;
2163     csd->r2wFactor = 2;
2164     csd->eraseSize = 1;
2165 }
2166 
SdDecodeCsd(struct MmcCntlr * cntlr)2167 static int32_t SdDecodeCsd(struct MmcCntlr *cntlr)
2168 {
2169     struct MmcCsd *csd = NULL;
2170     uint32_t *rawCsd = NULL;
2171 
2172     if (cntlr == NULL || cntlr->curDev == NULL) {
2173         HDF_LOGE("SdDecodeCsd: cntlr or curDev is null!");
2174         return HDF_ERR_INVALID_PARAM;
2175     }
2176 
2177     rawCsd = cntlr->curDev->reg.rawCsd;
2178     csd = &(cntlr->curDev->reg.csd);
2179 
2180     /* CSD_STRUCTURE: [127:126]. */
2181     csd->structure = MmcParseBits(rawCsd, CSD_BITS, 126, 2);
2182     if (csd->structure == 0) {
2183         /* CSD Version 1.0 */
2184         SdDecodeCsdRev1Field(cntlr, csd, rawCsd);
2185     } else if (csd->structure == 1) {
2186         /* CSD Version 2.0 */
2187         SdDecodeCsdRev2Field(cntlr, csd, rawCsd);
2188     } else {
2189         HDF_LOGE("SdDecodeCsd: not support, structure = %d.", csd->structure);
2190         return HDF_ERR_NOT_SUPPORT;
2191     }
2192 
2193     return HDF_SUCCESS;
2194 }
2195 
SdGetMaxClock(struct MmcCntlr * cntlr)2196 static uint32_t SdGetMaxClock(struct MmcCntlr *cntlr)
2197 {
2198     uint32_t clock = 0xFFFFFFFF;
2199     struct MmcDevice *mmcDev = cntlr->curDev;
2200     struct SdDevice *sdDev = (struct SdDevice *)mmcDev;
2201 
2202     if (mmcDev->state.bits.highSpeed == 1) {
2203         if (sdDev->reg.swCaps.hsMaxDtr > 0) {
2204             clock = sdDev->reg.swCaps.hsMaxDtr;
2205         }
2206     } else if (mmcDev->reg.csd.maxDtr > 0) {
2207         clock = mmcDev->reg.csd.maxDtr;
2208     }
2209 
2210     if (clock > cntlr->freqMax) {
2211         clock = cntlr->freqMax;
2212     }
2213 
2214     return clock;
2215 }
2216 
SdSelect(struct MmcCntlr * cntlr,uint32_t * rocr)2217 static int32_t SdSelect(struct MmcCntlr *cntlr, uint32_t *rocr)
2218 {
2219     int err;
2220     bool try = false;
2221     union MmcOcr ocr = cntlr->curDev->reg.ocr;
2222 
2223     do {
2224         /* dev state: ready -> idle. */
2225         MmcGoIdleState(cntlr);
2226         /* dev state: idle -> idle. */
2227         err = SdCmdSendIfCond(cntlr, cntlr->curDev->reg.ocr.ocrData);
2228         if (err == HDF_SUCCESS) {
2229             ocr.bits.hcs = 1;
2230         }
2231         if (cntlr->caps.bits.xpc330 == 1 || cntlr->caps.bits.xpc300 == 1 || cntlr->caps.bits.xpc180 == 1) {
2232             ocr.bits.sdXpc = 1;
2233         }
2234         if (MmcCntlrSupportUhs(cntlr) == true && try == false) {
2235             ocr.bits.s18r = 1;
2236         }
2237         /* dev state: idle -> ready. */
2238         err = SdAcmdOpCond(cntlr, ocr.ocrData, rocr);
2239         if (err != HDF_SUCCESS) {
2240             HDF_LOGE("SdSelect: acmd41 fail, err = %d.", err);
2241             return err;
2242         }
2243 
2244         /* host not support sd procotol 3.0 */
2245         if (cntlr->caps.bits.sdSupportProtocol3 == 0) {
2246             break;
2247         }
2248         try = false;
2249         /*
2250          * Send cmd 11 to switch the volt. If host or device do not support,
2251          * we need set 3.3v again.
2252          */
2253         if (rocr != NULL && (*rocr & 0x41000000) == 0x41000000) {
2254             /* switch host and card to 1.8V
2255              * dev state: ready -> ready.
2256              */
2257             err = SdCmdSwitchVoltage(cntlr);
2258             if (err == HDF_SUCCESS) {
2259                 err = MmcCntlrSwitchVoltage(cntlr, VOLT_1V8);
2260             }
2261             if (err != HDF_SUCCESS) {
2262                 ocr.bits.s18r = 0;
2263                 try = true;
2264             }
2265         }
2266     }while (try == true);
2267 
2268     /* get cid, dev state: ready -> ident. */
2269     err = MmcAllSendCid(cntlr);
2270     if (err != HDF_SUCCESS) {
2271         HDF_LOGE("SdSelect: cmd2 fail, err = %d.", err);
2272         return err;
2273     }
2274     SdDecodeCid(cntlr);
2275     return err;
2276 }
2277 
SdReadCsd(struct MmcCntlr * cntlr)2278 static int32_t SdReadCsd(struct MmcCntlr *cntlr)
2279 {
2280     int32_t error;
2281 
2282     error = MmcSendCsd(cntlr);
2283     if (error != HDF_SUCCESS) {
2284         HDF_LOGE("SdReadCsd: cmd9 fail, error = %d.", error);
2285         return error;
2286     }
2287     return SdDecodeCsd(cntlr);
2288 }
2289 
SdReadScr(struct MmcCntlr * cntlr)2290 static int32_t SdReadScr(struct MmcCntlr *cntlr)
2291 {
2292     int32_t error;
2293     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2294 
2295     error = SdAppSendScr(cntlr, dev->reg.rawScr, SCR_LEN);
2296     if (error != HDF_SUCCESS) {
2297         HDF_LOGE("SdReadScr: acmd51 fail, error = %d.", error);
2298         return error;
2299     }
2300     return SdDecodeScr(cntlr);
2301 }
2302 
SdReadSsr(struct MmcCntlr * cntlr)2303 static int32_t SdReadSsr(struct MmcCntlr *cntlr)
2304 {
2305     int32_t err;
2306     uint32_t rawSsr[SSR_LEN] = {0};
2307 
2308     /* don't support ACMD. */
2309     if ((cntlr->curDev->reg.csd.ccc & MMC_CSD_CCC_APP_SPEC) == 0) {
2310         return HDF_SUCCESS;
2311     }
2312 
2313     err = SdAcmdSdStatus(cntlr, rawSsr, SSR_LEN);
2314     if (err != HDF_SUCCESS) {
2315         HDF_LOGE("SdReadSsr: acmd13 fail, err = %d.", err);
2316         return err;
2317     }
2318     return SdDecodeSSr(cntlr, rawSsr, SSR_LEN);
2319 }
2320 
SdReadSwitchCapbility(struct MmcCntlr * cntlr)2321 static int32_t SdReadSwitchCapbility(struct MmcCntlr *cntlr)
2322 {
2323     int32_t err;
2324     uint8_t status[SD_SWITCH_FUNCTION_STATUS_BYTES_LEN] = {0};
2325     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2326     struct SdSwitchFuncParam param = {0};
2327 
2328     if (dev->reg.scr.sdSpec < SD_SCR_SPEC_1) {
2329         return HDF_SUCCESS;
2330     }
2331     if ((cntlr->curDev->reg.csd.ccc & MMC_CSD_CCC_SWITCH) == 0) {
2332         return HDF_SUCCESS;
2333     }
2334 
2335     param.mode = SD_SWITCH_FUNC_MODE_CHECK;
2336     param.group = SD_SWITCH_FUNC_GROUP_1;
2337     param.value = 1;
2338     /* The data(status) is in reverse order relative to the protocol. */
2339     err = SdCmdSwitchFunc(cntlr, &param, status, SD_SWITCH_FUNCTION_STATUS_BYTES_LEN);
2340     if (err != HDF_SUCCESS) {
2341         HDF_LOGE("SdReadSwitchCapbility: swutch func group 1 fail, err = %d.", err);
2342         return err;
2343     }
2344     /* [415:400]Function Group 1 information, [407:400]-->status[13]. */
2345     if ((status[13] & SD_BUS_SPEED_MODE_HS) > 0) {
2346         dev->reg.swCaps.hsMaxDtr = SD_HIGH_SPEED_MAX_DTR;
2347     }
2348 
2349     if (dev->reg.scr.sdSpec3 == 1) {
2350         dev->reg.swCaps.sdSpec3BusMode.data = status[13];
2351         param.group = SD_SWITCH_FUNC_GROUP_3;
2352         err = SdCmdSwitchFunc(cntlr, &param, status, SD_SWITCH_FUNCTION_STATUS_BYTES_LEN);
2353         if (err != HDF_SUCCESS) {
2354             HDF_LOGE("SdReadSwitchCapbility: swutch func group 3 fail!");
2355             return err;
2356         }
2357         /* [447:432]Function Group 3 information, [447:440]-->status[9]. */
2358         dev->reg.swCaps.sdSpec3DrvType = (enum SdDrvType)status[9];
2359         param.group = SD_SWITCH_FUNC_GROUP_4;
2360         err = SdCmdSwitchFunc(cntlr, &param, status, SD_SWITCH_FUNCTION_STATUS_BYTES_LEN);
2361         if (err != HDF_SUCCESS) {
2362             HDF_LOGE("SdReadSwitchCapbility: swutch func group 4 fail!");
2363             return err;
2364         }
2365         /* [463:448]Function Group 4 information, [463:456]-->status[7]. */
2366         dev->reg.swCaps.sdSpec3CurrLimit = (enum SdMaxCurrentLimitBit)status[7];
2367     }
2368     return HDF_SUCCESS;
2369 }
2370 
SdFillBusSpeedMode(struct MmcCntlr * cntlr)2371 static void SdFillBusSpeedMode(struct MmcCntlr *cntlr)
2372 {
2373     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2374 
2375     if (MmcCntlrSupportUhs(cntlr) == false || dev->reg.scr.sdSpec3 == 0) {
2376         dev->busSpeedMode = SD_BUS_SPEED_MODE_DS;
2377         return;
2378     }
2379 
2380     /* select max speed mode supported by host and device. */
2381     if ((cntlr->caps.bits.uhsSdr104 == 1) && (dev->reg.swCaps.sdSpec3BusMode.bits.uhsSdr104 == 1)) {
2382         dev->busSpeedMode = SD_BUS_SPEED_MODE_UHS_SDR104;
2383     } else if ((cntlr->caps.bits.uhsDdr50 == 1) && (dev->reg.swCaps.sdSpec3BusMode.bits.uhsDdr50 == 1)) {
2384         dev->busSpeedMode = SD_BUS_SPEED_MODE_UHS_DDR50;
2385     } else if ((cntlr->caps.bits.uhsSdr104 == 1 || cntlr->caps.bits.uhsSdr50 == 1) &&
2386         (dev->reg.swCaps.sdSpec3BusMode.bits.uhsSdr50 == 1)) {
2387         dev->busSpeedMode = SD_BUS_SPEED_MODE_UHS_SDR50;
2388     } else if ((cntlr->caps.bits.uhsSdr104 == 1 || cntlr->caps.bits.uhsSdr50 == 1 ||
2389         cntlr->caps.bits.uhsSdr25 == 1) && (dev->reg.swCaps.sdSpec3BusMode.bits.uhsSdr25 == 1)) {
2390         dev->busSpeedMode = SD_BUS_SPEED_MODE_UHS_SDR25;
2391     } else if ((cntlr->caps.bits.uhsSdr104 == 1 || cntlr->caps.bits.uhsSdr50 == 1 ||
2392         cntlr->caps.bits.uhsSdr25 == 1 || cntlr->caps.bits.uhsSdr12 == 1) &&
2393         (dev->reg.swCaps.sdSpec3BusMode.bits.uhsSdr12 == 1)) {
2394         dev->busSpeedMode = SD_BUS_SPEED_MODE_UHS_SDR12;
2395     }
2396 }
2397 
SdReadRegisters(struct MmcCntlr * cntlr)2398 static int32_t SdReadRegisters(struct MmcCntlr *cntlr)
2399 {
2400     int32_t error;
2401 
2402     /* get SCR */
2403     error = SdReadScr(cntlr);
2404     if (error != HDF_SUCCESS) {
2405         return error;
2406     }
2407 
2408     /* get SSR */
2409     error = SdReadSsr(cntlr);
2410     if (error != HDF_SUCCESS) {
2411         return error;
2412     }
2413 
2414     /* get sw cap */
2415     error = SdReadSwitchCapbility(cntlr);
2416     if (error != HDF_SUCCESS) {
2417         return error;
2418     }
2419 
2420     if (MmcCntlrDevReadOnly(cntlr) == true) {
2421         cntlr->curDev->state.bits.readonly = 1;
2422     }
2423     SdFillBusSpeedMode(cntlr);
2424     return HDF_SUCCESS;
2425 }
2426 
SdExecuteTuning(struct MmcCntlr * cntlr)2427 static int32_t SdExecuteTuning(struct MmcCntlr *cntlr)
2428 {
2429     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2430 
2431     if (dev->busSpeedMode == SD_BUS_SPEED_MODE_UHS_DDR50) {
2432         return MmcCntlrTune(cntlr, SD_CMD_SWITCH_FUNC);
2433     }
2434     if ((dev->busSpeedMode == SD_BUS_SPEED_MODE_UHS_SDR104) ||
2435         (dev->busSpeedMode == SD_BUS_SPEED_MODE_UHS_SDR50)) {
2436         return MmcCntlrTune(cntlr, SD_CMD_SEND_TUNING_BLOCK);
2437     }
2438     return HDF_SUCCESS;
2439 }
2440 
SdGetDevMaxCurrentLimitValue(enum SdMaxCurrentLimitBit devCap)2441 static uint32_t SdGetDevMaxCurrentLimitValue(enum SdMaxCurrentLimitBit devCap)
2442 {
2443     uint32_t currentLimit = 0;
2444 
2445     if (devCap == SD_MAX_CURRENT_LIMIT_800) {
2446         currentLimit = SD_MAX_CURRENT_LIMIT_800_VALUE;
2447     } else if (devCap == SD_MAX_CURRENT_LIMIT_600) {
2448         currentLimit = SD_MAX_CURRENT_LIMIT_600_VALUE;
2449     } else if (devCap == SD_MAX_CURRENT_LIMIT_400) {
2450         currentLimit = SD_MAX_CURRENT_LIMIT_400_VALUE;
2451     } else if (devCap == SD_MAX_CURRENT_LIMIT_200) {
2452         currentLimit = SD_MAX_CURRENT_LIMIT_200_VALUE;
2453     }
2454     return currentLimit;
2455 }
2456 
SdGetMaxCurrentLimitValue(union MmcCaps * hostCap,enum SdMaxCurrentLimitBit devCap)2457 static uint32_t SdGetMaxCurrentLimitValue(union MmcCaps *hostCap, enum SdMaxCurrentLimitBit devCap)
2458 {
2459     uint32_t currentLimit;
2460 
2461     /* get max support by dev. */
2462     currentLimit = SdGetDevMaxCurrentLimitValue(devCap);
2463     if (hostCap->bits.maxCurrentLimit800 == 1) {
2464         currentLimit = ((currentLimit < SD_MAX_CURRENT_LIMIT_800_VALUE) ?
2465             currentLimit : SD_MAX_CURRENT_LIMIT_800_VALUE);
2466     } else if (hostCap->bits.maxCurrentLimit600 == 1) {
2467         currentLimit = ((currentLimit < SD_MAX_CURRENT_LIMIT_600_VALUE) ?
2468             currentLimit : SD_MAX_CURRENT_LIMIT_600_VALUE);
2469     } else if (hostCap->bits.maxCurrentLimit400 == 1) {
2470         currentLimit = ((currentLimit < SD_MAX_CURRENT_LIMIT_400_VALUE) ?
2471             currentLimit : SD_MAX_CURRENT_LIMIT_400_VALUE);
2472     } else if (hostCap->bits.maxCurrentLimit200 == 1) {
2473         currentLimit = ((currentLimit < SD_MAX_CURRENT_LIMIT_200_VALUE) ?
2474             currentLimit : SD_MAX_CURRENT_LIMIT_200_VALUE);
2475     }
2476     return currentLimit;
2477 }
2478 
SdSetMaxCurrentLimit(struct MmcCntlr * cntlr)2479 static int32_t SdSetMaxCurrentLimit(struct MmcCntlr *cntlr)
2480 {
2481     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2482     uint8_t status[SD_SWITCH_FUNCTION_STATUS_BYTES_LEN] = {0};
2483     struct SdSwitchFuncParam param = {0};
2484     uint32_t currentLimit;
2485     int32_t err;
2486 
2487     if ((dev->busSpeedMode == SD_BUS_SPEED_MODE_UHS_SDR104) ||
2488         (dev->busSpeedMode == SD_BUS_SPEED_MODE_UHS_DDR50) ||
2489         (dev->busSpeedMode == SD_BUS_SPEED_MODE_UHS_SDR50)) {
2490         currentLimit = SdGetMaxCurrentLimitValue(&(cntlr->caps), dev->reg.swCaps.sdSpec3CurrLimit);
2491     } else {
2492         currentLimit = SD_MAX_CURRENT_LIMIT_200_VALUE;
2493     }
2494 
2495     param.mode = SD_SWITCH_FUNC_MODE_SET;
2496     param.group = SD_SWITCH_FUNC_GROUP_4;
2497     param.value = currentLimit;
2498     /* Current Limit is selected by CMD6 Function Group 4. */
2499     err = SdCmdSwitchFunc(cntlr, &param, status, SD_SWITCH_FUNCTION_STATUS_BYTES_LEN);
2500     if (err != HDF_SUCCESS) {
2501         HDF_LOGE("SdSetMaxCurrentLimit: swutch func group 3 fail!");
2502         return err;
2503     }
2504     if (((status[15] >> 4) & 0x0F) != currentLimit) {
2505         HDF_LOGD("SdSetMaxCurrentLimit: status not match!");
2506     }
2507 
2508     return HDF_SUCCESS;
2509 }
2510 
SdSetBusSpeedMode(struct MmcCntlr * cntlr)2511 static int32_t SdSetBusSpeedMode(struct MmcCntlr *cntlr)
2512 {
2513     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2514     uint8_t status[SD_SWITCH_FUNCTION_STATUS_BYTES_LEN] = {0};
2515     struct SdSwitchFuncParam param = {0};
2516     int32_t err;
2517     enum MmcBusTiming timing;
2518 
2519     switch (dev->busSpeedMode) {
2520         case SD_BUS_SPEED_MODE_UHS_SDR104:
2521             timing = BUS_TIMING_UHS_SDR104;
2522             dev->reg.swCaps.uhsMaxDtr = SD_UHS_SDR104_MAX_DTR;
2523             break;
2524         case SD_BUS_SPEED_MODE_UHS_DDR50:
2525             timing = BUS_TIMING_UHS_DDR50;
2526             dev->reg.swCaps.uhsMaxDtr = SD_UHS_DDR50_MAX_DTR;
2527             break;
2528         case SD_BUS_SPEED_MODE_UHS_SDR50:
2529             timing = BUS_TIMING_UHS_SDR50;
2530             dev->reg.swCaps.uhsMaxDtr = SD_UHS_SDR50_MAX_DTR;
2531             break;
2532         case SD_BUS_SPEED_MODE_UHS_SDR25:
2533             timing = BUS_TIMING_UHS_SDR25;
2534             dev->reg.swCaps.uhsMaxDtr = SD_UHS_SDR25_MAX_DTR;
2535             break;
2536         case SD_BUS_SPEED_MODE_UHS_SDR12:
2537             timing = BUS_TIMING_UHS_SDR12;
2538             dev->reg.swCaps.uhsMaxDtr = SD_UHS_SDR12_MAX_DTR;
2539             break;
2540         default:
2541             return HDF_SUCCESS;
2542     }
2543     /* Bus Speed Mode is selected by CMD6 Function Group 1. */
2544     param.mode = SD_SWITCH_FUNC_MODE_SET;
2545     param.group = SD_SWITCH_FUNC_GROUP_1;
2546     param.value = dev->busSpeedMode;
2547     err = SdCmdSwitchFunc(cntlr, &param, status, SD_SWITCH_FUNCTION_STATUS_BYTES_LEN);
2548     if (err != HDF_SUCCESS) {
2549         HDF_LOGE("SdSetBusSpeedMode: swutch func group 1 fail!");
2550         return err;
2551     }
2552     /* 16: The lower four bits of the 16th byte indicate the speed mode */
2553     if ((status[16] & 0xF) != dev->busSpeedMode) {
2554         HDF_LOGD("SdSetBusSpeedMode: status not match!");
2555     } else {
2556         MmcCntlrSetBusTiming(cntlr, timing);
2557         MmcCntlrSetClock(cntlr, dev->reg.swCaps.uhsMaxDtr);
2558     }
2559 
2560     return HDF_SUCCESS;
2561 }
2562 
SdSwitch4BitBusWidth(struct MmcCntlr * cntlr,struct SdDevice * dev)2563 static int32_t SdSwitch4BitBusWidth(struct MmcCntlr *cntlr, struct SdDevice *dev)
2564 {
2565     int32_t err = HDF_SUCCESS;
2566 
2567     if ((dev->reg.scr.sdBusWidths & SD_SCR_BUS_WIDTHS_4) > 0 &&
2568         (cntlr->caps.bits.cap4Bit > 0)) {
2569         err = SdAcmdSetBusWidth(cntlr, BUS_WIDTH4);
2570         if (err != HDF_SUCCESS) {
2571             HDF_LOGE("SdSwitch4BitBusWidth: set 4-bits bus width fail!");
2572             return err;
2573         }
2574         MmcCntlrSetBusWidth(cntlr, BUS_WIDTH4);
2575     }
2576     return err;
2577 }
2578 
SdUltraHighSpeedDevInit(struct MmcCntlr * cntlr)2579 static int32_t SdUltraHighSpeedDevInit(struct MmcCntlr *cntlr)
2580 {
2581     int32_t err;
2582     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2583 
2584     if (dev->reg.scr.sdSpec3 == 0) {
2585         return HDF_SUCCESS;
2586     }
2587     if ((cntlr->curDev->reg.csd.ccc & MMC_CSD_CCC_SWITCH) == 0) {
2588         return HDF_SUCCESS;
2589     }
2590 
2591     err = SdSwitch4BitBusWidth(cntlr, dev);
2592     if (err != HDF_SUCCESS) {
2593         return err;
2594     }
2595     err = SdSetMaxCurrentLimit(cntlr);
2596     if (err != HDF_SUCCESS) {
2597         return err;
2598     }
2599     err = SdSetBusSpeedMode(cntlr);
2600     if (err != HDF_SUCCESS) {
2601         return err;
2602     }
2603     return SdExecuteTuning(cntlr);
2604 }
2605 
SdSwitchHighSpeed(struct MmcCntlr * cntlr)2606 static int32_t SdSwitchHighSpeed(struct MmcCntlr *cntlr)
2607 {
2608     int32_t err;
2609     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
2610     uint8_t status[SD_SWITCH_FUNCTION_STATUS_BYTES_LEN] = {0};
2611     struct SdSwitchFuncParam param = {0};
2612 
2613     if (dev->reg.swCaps.hsMaxDtr == 0) {
2614         return HDF_ERR_NOT_SUPPORT;
2615     }
2616     if (dev->reg.scr.sdSpec < SD_SCR_SPEC_1) {
2617         return HDF_ERR_NOT_SUPPORT;
2618     }
2619     if (cntlr->caps.bits.highSpeed == 0) {
2620         return HDF_ERR_NOT_SUPPORT;
2621     }
2622     if ((cntlr->curDev->reg.csd.ccc & MMC_CSD_CCC_SWITCH) == 0) {
2623         return HDF_ERR_NOT_SUPPORT;
2624     }
2625     /* Bus Speed Mode is selected by CMD6 Function Group 1. */
2626     param.mode = SD_SWITCH_FUNC_MODE_SET;
2627     param.group = SD_SWITCH_FUNC_GROUP_1;
2628     param.value = SD_BUS_SPEED_MODE_HS;
2629     err = SdCmdSwitchFunc(cntlr, &param, status, SD_SWITCH_FUNCTION_STATUS_BYTES_LEN);
2630     if (err != HDF_SUCCESS) {
2631         HDF_LOGE("SdSwitchHighSpeed: switch func group 1 fail!");
2632         return err;
2633     }
2634     /* 16: The lower four bits of the 16th byte indicate the speed mode */
2635     if ((status[16] & 0xF) != SD_BUS_SPEED_MODE_HS) {
2636         return HDF_ERR_NOT_SUPPORT;
2637     }
2638     return HDF_SUCCESS;
2639 }
2640 
SdHighSpeedDevInit(struct MmcCntlr * cntlr)2641 static int32_t SdHighSpeedDevInit(struct MmcCntlr *cntlr)
2642 {
2643     int err;
2644     struct SdDevice *sdDev = (struct SdDevice *)cntlr->curDev;
2645 
2646     err = SdSwitchHighSpeed(cntlr);
2647     if (err == HDF_SUCCESS) {
2648         cntlr->curDev->state.bits.highSpeed = 1;
2649         MmcCntlrSetBusTiming(cntlr, BUS_TIMING_SD_HS);
2650     } else if (err != HDF_ERR_NOT_SUPPORT) {
2651         HDF_LOGE("SdHighSpeedDevInit: switch high speed fail!");
2652         return err;
2653     }
2654     MmcCntlrSetClock(cntlr, SdGetMaxClock(cntlr));
2655     return SdSwitch4BitBusWidth(cntlr, sdDev);
2656 }
2657 
SdDeviceAdd(struct MmcCntlr * cntlr)2658 static int32_t SdDeviceAdd(struct MmcCntlr *cntlr)
2659 {
2660     /* The SD dev must be removable. */
2661     cntlr->curDev->state.bits.removable = 1;
2662     SdSetBlockCapacity(cntlr);
2663     /* add dev. */
2664     if (MmcDeviceAdd(cntlr->curDev) != HDF_SUCCESS) {
2665         HDF_LOGE("SdDeviceAdd: add device fail!");
2666         return HDF_FAILURE;
2667     }
2668     cntlr->curDev->state.bits.present = 1;
2669     return HDF_SUCCESS;
2670 }
2671 
SdInit(struct MmcCntlr * cntlr)2672 static int32_t SdInit(struct MmcCntlr *cntlr)
2673 {
2674     int32_t error;
2675     union MmcOcr ocr = {0};
2676 
2677     /* acmd41, detect sd dev and get the voltage range. dev state: idle -> ready. */
2678     error = SdAcmdOpCond(cntlr, 0, &(ocr.ocrData));
2679     if (error != HDF_SUCCESS) {
2680         HDF_LOGE("SdInit: acmd41(detect sd) fail, err = %d!", error);
2681         return error;
2682     }
2683 
2684     MmcCntlrSelectWorkVoltage(cntlr, &ocr);
2685     if (cntlr->curDev->reg.ocr.ocrData == 0) {
2686         HDF_LOGE("SdInit: SD work voltage is invalid!");
2687         return HDF_ERR_INVALID_PARAM;
2688     }
2689     error = SdSelect(cntlr, &(ocr.ocrData));
2690     if (error != HDF_SUCCESS) {
2691         return error;
2692     }
2693     /* get RCA. dev state: ident -> stby. */
2694     error = SdCmdSendRelativeAddr(cntlr, &(cntlr->curDev->reg.rca));
2695     if (error != HDF_SUCCESS) {
2696         HDF_LOGE("SdInit: cmd3(get RCA) fail!, error = %d.", error);
2697         return error;
2698     }
2699     /* get CSD, CMD9 should send in stby. dev state: stby -> stby. */
2700     error = SdReadCsd(cntlr);
2701     if (error != HDF_SUCCESS) {
2702         HDF_LOGE("SdInit: sd read csd fail!, error = %d.", error);
2703         return error;
2704     }
2705     /* select card. dev state: stby -> tran. */
2706     error = MmcSelectCard(cntlr);
2707     if (error != HDF_SUCCESS) {
2708         HDF_LOGE("SdInit: cmd7(select card) fail!, error = %d.", error);
2709         return error;
2710     }
2711     /* dev state: tran -> tran. */
2712     error = SdReadRegisters(cntlr);
2713     if (error != HDF_SUCCESS) {
2714         return error;
2715     }
2716 
2717     if (ocr.bits.s18r == 1) {
2718         /* uhs dev set */
2719         error = SdUltraHighSpeedDevInit(cntlr);
2720         if (error != HDF_SUCCESS) {
2721             return error;
2722         }
2723         cntlr->curDev->state.bits.uhs = 1;
2724     } else {
2725         /* highspeed dev set */
2726         error = SdHighSpeedDevInit(cntlr);
2727         if (error != HDF_SUCCESS) {
2728             return error;
2729         }
2730     }
2731 
2732     return SdDeviceAdd(cntlr);
2733 }
2734 
SdDetect(struct MmcCntlr * cntlr)2735 static int32_t SdDetect(struct MmcCntlr *cntlr)
2736 {
2737     int32_t ret;
2738 
2739     HDF_LOGD("SdDetect: Detect sd dev start...");
2740     /* dev state: idle. */
2741     MmcGoIdleState(cntlr);
2742     /* dev state: idle -> idle. */
2743     (void)SdCmdSendIfCond(cntlr, cntlr->ocrDef.ocrData);
2744     /* Initialize SD. */
2745     ret = SdInit(cntlr);
2746     if (ret == HDF_SUCCESS) {
2747         HDF_LOGD("SdDetect: Detect sd dev success! %s dev at address 0x%x!",
2748             cntlr->curDev->state.bits.uhs ? "Ultra high speed" :
2749             (cntlr->curDev->state.bits.highSpeed ? "High speed" : ""),
2750             cntlr->curDev->reg.rca);
2751     }
2752     return ret;
2753 }
2754 
SdioSendOpCond(struct MmcCntlr * cntlr,uint32_t arg,uint32_t * ocr)2755 static int32_t SdioSendOpCond(struct MmcCntlr *cntlr, uint32_t arg, uint32_t *ocr)
2756 {
2757     struct MmcCmd cmd = {0};
2758     int32_t err;
2759     uint32_t i;
2760 
2761     /*
2762      * An SDIO aware host will send CMD5 prior to the CMD55/ACMD41 pair, and thus would receive a valid OCR in
2763      * the R4 response to CMD5 and continue to initialize the card.
2764      */
2765     cmd.cmdCode = SDIO_SEND_OP_COND;
2766     /* [23:0] OCR; [24] S18R(Switching to 1.8V Request); [31:25] Stuff Bits. */
2767     cmd.argument = arg;
2768     cmd.respType = MMC_RESP_R4 | MMC_CMD_TYPE_BCR;
2769     for (i = 0; i < INIT_CMD_RETRY_TIMES; i++) {
2770         err = MmcSendCmd(cntlr, &cmd, NULL, MMC_CMD_DEFAULT_RETRY_TIMES);
2771         if (err != HDF_SUCCESS) {
2772             break;
2773         }
2774         if (arg == 0) {
2775             break;
2776         }
2777         if ((cmd.resp[0] & MMC_CARD_BUSY_STATUS) > 0) {
2778             break;
2779         }
2780 
2781         err = HDF_ERR_TIMEOUT;
2782         MmcMDelay(SEND_OP_COND_DELAY);
2783     }
2784     if (ocr != NULL) {
2785         /*
2786          * Response R4 in Sd mode: [23:0] OCR; [24] S18A; [26:25] Stuff Bits;
2787          * [27] Memory Present; [30: 28] Number of I/O functions.
2788          */
2789         *ocr = cmd.resp[0];
2790     }
2791 
2792     return err;
2793 }
2794 
SdioRespR5Check(struct MmcCmd * cmd)2795 static int32_t SdioRespR5Check(struct MmcCmd *cmd)
2796 {
2797     if (cmd->resp[0] & SDIO_R5_ERROR) {
2798         HDF_LOGE("SdioRespR5Check: error!");
2799         return HDF_ERR_IO;
2800     }
2801     if (cmd->resp[0] & SDIO_R5_OUT_OF_RANGE) {
2802         HDF_LOGE("SdioRespR5Check: out of range error!");
2803         return HDF_ERR_INVALID_PARAM;
2804     }
2805     if (cmd->resp[0] & SDIO_R5_FUNCTION_NUMBER) {
2806         HDF_LOGE("SdioRespR5Check: func num error!");
2807         return HDF_ERR_INVALID_PARAM;
2808     }
2809     return HDF_SUCCESS;
2810 }
2811 
SdioRwDirect(struct MmcCntlr * cntlr,struct SdioCmdParam * param,uint8_t * out)2812 int32_t SdioRwDirect(struct MmcCntlr *cntlr, struct SdioCmdParam *param, uint8_t *out)
2813 {
2814     struct MmcCmd cmd = {0};
2815     int32_t err;
2816 
2817     if (cntlr == NULL || param == NULL) {
2818         HDF_LOGE("SdioRwDirect: cntlr or param is null!");
2819         return HDF_ERR_INVALID_PARAM;
2820     }
2821 
2822     /*
2823      * The IO_RW_DIRECT is the simplest means to access a single register within the total 128K of register space
2824      * in any I/O function, including the common I/O area (CIA). This command reads or writes 1 byte using only 1
2825      * command/response pair. A common use is to initialize registers or monitor status values for I/O functions.
2826      */
2827     cmd.cmdCode = SDIO_RW_DIRECT;
2828     /* [31] R/W flag. */
2829     cmd.argument = ((param->writeflag == true) ? 0x80000000 : 0x00000000);
2830     /* [30:28] Function Number. */
2831     cmd.argument |= (param->funcNum << 28);
2832     /* [25:9] Register Address. */
2833     cmd.argument |= (param->regAddr << 9);
2834     /* [7:0] Write Data or Stuff Bits. */
2835     cmd.argument |= param->writeData;
2836     cmd.respType = MMC_RESP_SPI_R5 | MMC_RESP_R5 | MMC_CMD_TYPE_AC;
2837     err = MmcSendCmd(cntlr, &cmd, NULL, 1);
2838     if (err != HDF_SUCCESS) {
2839         return err;
2840     }
2841 
2842     /* resp error check. */
2843     err = SdioRespR5Check(&cmd);
2844     if (err != HDF_SUCCESS) {
2845         return err;
2846     }
2847     if (out != NULL) {
2848         *out = cmd.resp[0] & 0xFF;
2849     }
2850     return HDF_SUCCESS;
2851 }
2852 
SdioRwExtended(struct MmcCntlr * cntlr,struct SdioCmdParam * param,uint8_t * buf,uint32_t blockNum,uint32_t blockSize)2853 int32_t SdioRwExtended(struct MmcCntlr *cntlr, struct SdioCmdParam *param,
2854     uint8_t *buf, uint32_t blockNum, uint32_t blockSize)
2855 {
2856     struct MmcCmd cmd = {0};
2857     struct MmcData data = {0};
2858     int32_t err;
2859 
2860     if (cntlr == NULL || param == NULL) {
2861         HDF_LOGE("SdioRwExtended: cntlr or param is null!");
2862         return HDF_ERR_INVALID_PARAM;
2863     }
2864     /* Register Address: Start Address of I/O register to read or write. Range is [1FFFFh:0]. */
2865     if (param->regAddr != ((param->regAddr) & 0x1FFFF)) {
2866         return HDF_ERR_INVALID_PARAM;
2867     }
2868 
2869     cmd.cmdCode = SDIO_RW_EXTENDED;
2870     /* [31] R/W flag. */
2871     cmd.argument = ((param->writeflag == true) ? 0x80000000 : 0x00000000);
2872     /* [30:28] Function Number. */
2873     cmd.argument |= (param->funcNum << 28);
2874     /* [26] Op Code.  */
2875     cmd.argument |= ((param->incrAddrFlag == true) ? 0x04000000 : 0x00000000);
2876     /* [25:9] Register Address. */
2877     cmd.argument |= (param->regAddr << 9);
2878     /*
2879      * [8:0] Byte/Block Count.
2880      * If the command is operating on bytes(Block Mode = 0), this field contains the number of bytes
2881      * to read or write. A value of 0 shall cause 512 bytes to be read or written.
2882      * If the command is in block mode(Block Mode = 1), the Block Count field specifies the number
2883      * of Data Blocks to be transferred following this command.
2884      */
2885     if (blockNum == 1 && blockSize <= 512) {
2886         cmd.argument |= ((blockSize == 512) ? 0 : blockSize); /* byte mode */
2887     } else {
2888         /* [27] Block Mode. */
2889         cmd.argument |= (0x08000000 | blockNum);
2890     }
2891     cmd.respType = MMC_RESP_SPI_R5 | MMC_RESP_R5 | MMC_CMD_TYPE_ADTC;
2892 
2893     data.blockSize = blockSize;
2894     data.blockNum = blockNum;
2895     data.dataFlags = ((param->writeflag == true) ? DATA_WRITE : DATA_READ);
2896     if (param->scatterFlag == false) {
2897         data.dataBuffer = buf;
2898     } else {
2899         data.scatter = (void *)buf;
2900         data.scatterLen = param->scatterLen;
2901     }
2902 
2903     err = MmcSendCmd(cntlr, &cmd, &data, 1);
2904     if (err != HDF_SUCCESS) {
2905         return err;
2906     }
2907 
2908     /* resp error check. */
2909     return SdioRespR5Check(&cmd);
2910 }
2911 
SdioIoReset(struct MmcCntlr * cntlr)2912 static void SdioIoReset(struct MmcCntlr *cntlr)
2913 {
2914     struct SdioCmdParam param = {0};
2915     uint8_t out = 0;
2916     int32_t error;
2917 
2918     /*
2919      * In order to reset an I/O only card or the I/O portion of a combo card,
2920      * use CMD52 to write a 1 to the RES bit in the CCCR(bit3 of register 6),
2921      * because it can't issue CMD52 after CMD0.
2922      */
2923     param.regAddr = IO_ABORT;
2924     /* read register 6 of CCCR. */
2925     error = SdioRwDirect(cntlr, &param, &out);
2926     if (error < 0) {
2927         out = SDIO_CCCR_RES;
2928     } else {
2929         out |= SDIO_CCCR_RES;
2930     }
2931     /* write the RES bit to 1. */
2932     param.writeflag = true;
2933     param.writeData = out;
2934     (void)SdioRwDirect(cntlr, &param, NULL);
2935 }
2936 
SdioReadWriteByte(struct MmcCntlr * cntlr,bool writeFlag,uint32_t funcNum,uint32_t addr,uint8_t * data)2937 int32_t SdioReadWriteByte(struct MmcCntlr *cntlr, bool writeFlag,
2938     uint32_t funcNum, uint32_t addr, uint8_t *data)
2939 {
2940     struct SdioCmdParam param = {0};
2941 
2942     if (cntlr == NULL || data == NULL) {
2943         HDF_LOGE("SdioReadWriteByte: cntlr or data is null!");
2944         return HDF_ERR_INVALID_PARAM;
2945     }
2946 
2947     param.regAddr = addr;
2948     param.funcNum = funcNum;
2949     if (writeFlag == true) {
2950         param.writeflag = true;
2951         param.writeData = *data;
2952         return SdioRwDirect(cntlr, &param, NULL);
2953     }
2954     return SdioRwDirect(cntlr, &param, data);
2955 }
2956 
SdioReadWriteRemainBytes(struct MmcCntlr * cntlr,struct SdioCmdParam * param,uint8_t * data,uint32_t size,uint32_t addr)2957 static int32_t SdioReadWriteRemainBytes(struct MmcCntlr *cntlr, struct SdioCmdParam *param,
2958     uint8_t *data, uint32_t size, uint32_t addr)
2959 {
2960     uint32_t maxBlkSize;
2961     uint32_t curSize;
2962     struct SdioDevice *dev = (struct SdioDevice *)cntlr->curDev;
2963     uint32_t remLen = size;
2964     uint32_t curAddr = addr;
2965     uint8_t *buffer = data;
2966     int32_t err;
2967 
2968     maxBlkSize = MMC_MIN(cntlr->maxBlkSize, dev->curFunction->maxBlkSize);
2969     maxBlkSize = MMC_MIN(maxBlkSize, BYTES_PER_BLOCK);
2970     if (maxBlkSize == 0) {
2971         HDF_LOGE("SdioReadWriteRemainBytes: max block size is invalid!");
2972         return HDF_ERR_INVALID_PARAM;
2973     }
2974 
2975     while (remLen > 0) {
2976         curSize = MMC_MIN(remLen, maxBlkSize);
2977         param->regAddr = curAddr;
2978         err = SdioRwExtended(cntlr, param, buffer, 1, curSize);
2979         if (err != HDF_SUCCESS) {
2980             HDF_LOGD("SdioReadWriteRemainBytes: bytes mode, err = %d, addr = %d, curSize = %d!", err, addr, curSize);
2981             return err;
2982         }
2983         buffer += curSize;
2984         if (param->incrAddrFlag == true) {
2985             curAddr += curSize;
2986         }
2987         remLen -= curSize;
2988     }
2989     return HDF_SUCCESS;
2990 }
2991 
SdioFillRwExtendedCmdParam(struct SdioCmdParam * param,struct SdioDevice * dev,struct SdioRwBlockInfo * info)2992 static void SdioFillRwExtendedCmdParam(struct SdioCmdParam *param,
2993     struct SdioDevice *dev, struct SdioRwBlockInfo *info)
2994 {
2995     param->funcNum = dev->curFunction->funcNum;
2996     param->incrAddrFlag = info->incrAddrFlag;
2997     param->writeflag = info->writeFlag;
2998     if (info->scatterFlag == true) {
2999         param->scatterFlag = true;
3000         param->scatterLen = info->scatterLen;
3001         param->regAddr = info->addr;
3002     }
3003 }
3004 
SdioReadWriteBlock(struct MmcCntlr * cntlr,struct SdioRwBlockInfo * info)3005 int32_t SdioReadWriteBlock(struct MmcCntlr *cntlr, struct SdioRwBlockInfo *info)
3006 {
3007     uint32_t maxBlkNum;
3008     uint32_t curblkNum;
3009     uint32_t curSize;
3010     int32_t err;
3011     struct SdioCmdParam param = {0};
3012     struct SdioDevice *dev = NULL;
3013 
3014     if (cntlr == NULL || info == NULL) {
3015         return HDF_ERR_INVALID_PARAM;
3016     }
3017     dev = (struct SdioDevice *)cntlr->curDev;
3018     if (dev == NULL || dev->curFunction == NULL) {
3019         return HDF_ERR_INVALID_OBJECT;
3020     }
3021 
3022     uint32_t maxBlkSize = MMC_MIN(cntlr->maxBlkSize, dev->curFunction->maxBlkSize);
3023     maxBlkSize = MMC_MIN(maxBlkSize, BYTES_PER_BLOCK);
3024     if (maxBlkSize == 0) {
3025         return HDF_ERR_INVALID_PARAM;
3026     }
3027     if (dev->curFunction->curBlkSize == 0 || cntlr->maxBlkNum == 0) {
3028         return HDF_ERR_INVALID_PARAM;
3029     }
3030 
3031     uint32_t remLen = info->size;
3032     uint32_t curAddr = info->addr;
3033     uint8_t *buffer = info->buf;
3034     SdioFillRwExtendedCmdParam(&param, dev, info);
3035     if (info->scatterFlag == true) {
3036         return SdioRwExtended(cntlr, &param, buffer, MMC_MAX(1, remLen / maxBlkSize), MMC_MIN(remLen, maxBlkSize));
3037     }
3038     /* send block. */
3039     if (dev->sdioReg.cccr.multiBlock > 0 && (remLen > maxBlkSize)) {
3040         maxBlkNum = MMC_MIN((cntlr->maxReqSize / dev->curFunction->curBlkSize), cntlr->maxBlkNum);
3041         maxBlkNum = MMC_MIN(maxBlkNum, SDIO_BLOCK_TRANSFER_MAX_BLKNUM);
3042         while (remLen > dev->curFunction->curBlkSize) {
3043             curblkNum = remLen / dev->curFunction->curBlkSize;
3044             curblkNum = MMC_MIN(curblkNum, maxBlkNum);
3045             curSize = curblkNum * dev->curFunction->curBlkSize;
3046             param.regAddr = curAddr;
3047             err = SdioRwExtended(cntlr, &param, buffer, curblkNum, dev->curFunction->curBlkSize);
3048             if (err != HDF_SUCCESS) {
3049                 return err;
3050             }
3051             buffer += curSize;
3052             if (info->incrAddrFlag == true) {
3053                 curAddr += curSize;
3054             }
3055             remLen -= curSize;
3056         }
3057     }
3058 
3059     /* send remaind bytes. */
3060     return SdioReadWriteRemainBytes(cntlr, &param, buffer, remLen, curAddr);
3061 }
3062 
SdioCdDisable(struct MmcCntlr * cntlr)3063 static int32_t SdioCdDisable(struct MmcCntlr *cntlr)
3064 {
3065     struct SdioCmdParam param = {0};
3066     int32_t error;
3067     uint8_t ctrl;
3068 
3069     param.regAddr = BUS_INTERFACE_CONTROL;
3070     /* read register 7 of CCCR. */
3071     error = SdioRwDirect(cntlr, &param, &ctrl);
3072     if (error != HDF_SUCCESS) {
3073         HDF_LOGE("SdioCdDisable: read BIC fail!");
3074         return error;
3075     }
3076     /*
3077      * write the CD Disable bit to 1.
3078      * This bit shall be set to 1 before issuing CMD53.
3079      */
3080     ctrl |= SDIO_CCCR_CD_DISABLE;
3081     param.writeflag = true;
3082     param.writeData = ctrl;
3083     return SdioRwDirect(cntlr, &param, NULL);
3084 }
3085 
SdioReadCccrSdioRev(struct MmcCntlr * cntlr,struct SdioCccr * cccr,uint8_t * cccrRev)3086 static int32_t SdioReadCccrSdioRev(struct MmcCntlr *cntlr, struct SdioCccr *cccr, uint8_t *cccrRev)
3087 {
3088     struct SdioCmdParam param = {0};
3089     int32_t err;
3090     uint8_t data;
3091 
3092     /* read register 0 of CCCR. */
3093     param.regAddr = CCCR_SDIO_REVISION;
3094     err = SdioRwDirect(cntlr, &param, &data);
3095     if (err != HDF_SUCCESS) {
3096         HDF_LOGE("SdioReadCccrSdioRev: read sdio rev fail!");
3097         return err;
3098     }
3099     /* bit3-bit0: CCCR_REVISION */
3100     *cccrRev = data & 0x0f;
3101     if ((*cccrRev) > SDIO_CCCR_VERSION_3_00) {
3102         HDF_LOGE("SdioReadCccrSdioRev: cccr rev error!");
3103         return HDF_FAILURE;
3104     }
3105     /* bit7-bit4: SDIO_REVISION */
3106     cccr->sdioRev = (data & 0xf0) >> 4;
3107     return HDF_SUCCESS;
3108 }
3109 
SdioReadCccrCapbility(struct MmcCntlr * cntlr,struct SdioCccr * cccr)3110 static int32_t SdioReadCccrCapbility(struct MmcCntlr *cntlr, struct SdioCccr *cccr)
3111 {
3112     struct SdioCmdParam param = {0};
3113     int32_t error;
3114     uint8_t cap;
3115 
3116     /* read register 8 of CCCR. */
3117     param.regAddr = CARD_CAPBILITY;
3118     error = SdioRwDirect(cntlr, &param, &cap);
3119     if (error != HDF_SUCCESS) {
3120         HDF_LOGE("SdioReadCccrCapbility: read card cap fail!");
3121         return error;
3122     }
3123 
3124     if ((cap & SDIO_CCCR_CAP_4BLS) > 0) {
3125         cccr->lowSpeed4Bit = 1;
3126     }
3127     if ((cap & SDIO_CCCR_CAP_LSC) > 0) {
3128         cccr->lowSpeed = 1;
3129     }
3130     if ((cap & SDIO_CCCR_CAP_SMB) > 0) {
3131         cccr->multiBlock = 1;
3132     }
3133     return HDF_SUCCESS;
3134 }
3135 
SdioReadCccrPowerControl(struct MmcCntlr * cntlr,struct SdioCccr * cccr)3136 static int32_t SdioReadCccrPowerControl(struct MmcCntlr *cntlr, struct SdioCccr *cccr)
3137 {
3138     struct SdioCmdParam param = {0};
3139     int32_t error;
3140     uint8_t ctrl;
3141 
3142     /* read register 18 of CCCR. */
3143     param.regAddr = POWER_CONTROL;
3144     error = SdioRwDirect(cntlr, &param, &ctrl);
3145     if (error != HDF_SUCCESS) {
3146         HDF_LOGE("SdioReadCccrPowerControl: read power control fail!");
3147         return error;
3148     }
3149 
3150     if ((ctrl & SDIO_CCCR_POWER_SMPC) > 0) {
3151         cccr->highPower = 1;
3152     }
3153     return HDF_SUCCESS;
3154 }
3155 
SdioReadCccrBusSpeed(struct MmcCntlr * cntlr,struct SdioCccr * cccr)3156 static int32_t SdioReadCccrBusSpeed(struct MmcCntlr *cntlr, struct SdioCccr *cccr)
3157 {
3158     struct SdioCmdParam param = {0};
3159     int32_t error;
3160     uint8_t speed;
3161 
3162     /* read register 19 of CCCR. */
3163     param.regAddr = BUS_SPEED_SELECT;
3164     error = SdioRwDirect(cntlr, &param, &speed);
3165     if (error != HDF_SUCCESS) {
3166         HDF_LOGE("SdioReadCccrBusSpeed: read bus speed select fail!");
3167         return error;
3168     }
3169 
3170     if ((speed & SDIO_CCCR_BUS_SPEED_SHS) > 0) {
3171         cccr->highSpeed = 1;
3172     }
3173     return HDF_SUCCESS;
3174 }
3175 
SdioReadCccrIoEnable(struct MmcCntlr * cntlr,uint8_t * val)3176 int32_t SdioReadCccrIoEnable(struct MmcCntlr *cntlr, uint8_t *val)
3177 {
3178     struct SdioCmdParam param = {0};
3179 
3180     if (cntlr == NULL || val == NULL) {
3181         HDF_LOGE("SdioReadCccrIoEnable: cntlr or val is null!");
3182         return HDF_ERR_INVALID_PARAM;
3183     }
3184 
3185     /* read register 2(IOEx) of CCCR. */
3186     param.regAddr = IO_ENABLE;
3187     return SdioRwDirect(cntlr, &param, val);
3188 }
3189 
SdioCccrIoEnable(struct MmcCntlr * cntlr)3190 int32_t SdioCccrIoEnable(struct MmcCntlr *cntlr)
3191 {
3192     struct SdioCmdParam param = {0};
3193     struct SdioDevice *dev = NULL;
3194     int32_t err;
3195     uint8_t data;
3196 
3197     if (cntlr == NULL) {
3198         HDF_LOGE("SdioCccrIoEnable: cntlr or val is null!");
3199         return HDF_ERR_INVALID_OBJECT;
3200     }
3201     dev = (struct SdioDevice *)cntlr->curDev;
3202     if (dev == NULL || dev->curFunction == NULL) {
3203         HDF_LOGE("SdioCccrIoEnable: dev or curFunction is null!");
3204         return HDF_ERR_INVALID_OBJECT;
3205     }
3206 
3207     /* read register 2(IOEx) of CCCR. */
3208     param.regAddr = IO_ENABLE;
3209     err = SdioRwDirect(cntlr, &param, &data);
3210     if (err != HDF_SUCCESS) {
3211         HDF_LOGE("SdioCccrIoEnable: read io enable fail! err = %d.", err);
3212         return err;
3213     }
3214     /*
3215      * IOEx:Enable Function x.
3216      * If this bit is reset to 0, the function is disable. If this bit is set to 1, the function is enabled to start
3217      * its initialization. The complation of initialization is indicated in IORx. On power up or after a reset, the
3218      * card shall reset this bit to 0. The host can also use IOEx as a per function reset for error recovery. The host
3219      * sequence for a per function reset is to reset IOEx to 0, wait until IORx becomes 0 and then set IOEx to 1 again.
3220      */
3221     data |= (1 << dev->curFunction->funcNum);
3222     param.writeflag = true;
3223     param.writeData = data;
3224     /* write register 2(IOEx) of CCCR. */
3225     return SdioRwDirect(cntlr, &param, NULL);
3226 }
3227 
SdioCccrIoDisable(struct MmcCntlr * cntlr)3228 int32_t SdioCccrIoDisable(struct MmcCntlr *cntlr)
3229 {
3230     struct SdioCmdParam param = {0};
3231     struct SdioDevice *dev = NULL;
3232     int32_t err;
3233     uint8_t data;
3234 
3235     if (cntlr == NULL) {
3236         HDF_LOGE("SdioCccrIoDisable: cntlr is null!");
3237         return HDF_ERR_INVALID_OBJECT;
3238     }
3239     dev = (struct SdioDevice *)cntlr->curDev;
3240     if (dev == NULL || dev->curFunction == NULL) {
3241         HDF_LOGE("SdioCccrIoDisable: dev or curFunction is null!");
3242         return HDF_ERR_INVALID_OBJECT;
3243     }
3244 
3245     /* read register 2(IOEx) of CCCR. */
3246     param.regAddr = IO_ENABLE;
3247     err = SdioRwDirect(cntlr, &param, &data);
3248     if (err != HDF_SUCCESS) {
3249         HDF_LOGE("SdioCccrIoDisable: read io enable fail! err = %d.", err);
3250         return err;
3251     }
3252 
3253     data &= (~(1 << dev->curFunction->funcNum));
3254     param.writeflag = true;
3255     param.writeData = data;
3256     /* write register 2(IOEx) of CCCR. */
3257     return SdioRwDirect(cntlr, &param, NULL);
3258 }
3259 
SdioReadCccrIoReady(struct MmcCntlr * cntlr,uint8_t * val)3260 int32_t SdioReadCccrIoReady(struct MmcCntlr *cntlr, uint8_t *val)
3261 {
3262     struct SdioCmdParam param = {0};
3263 
3264     if (cntlr == NULL || val == NULL) {
3265         HDF_LOGE("SdioReadCccrIoReady: cntlr or val is null!");
3266         return HDF_ERR_INVALID_PARAM;
3267     }
3268 
3269     /* read register 3(IORx) of CCCR. */
3270     param.regAddr = IO_READY;
3271     /*
3272      * IORx: I/O Function x Ready.
3273      * If this bit is set to 0, the function is not ready to operate. This may be caused by the function being
3274      * disabled or not ready due to internal causes such as a built-in-self-test in progress. If this bit is set to 1,
3275      * the function is ready to operate. On power up or after a reset, this bit shall be set to 0.
3276      */
3277     return SdioRwDirect(cntlr, &param, val);
3278 }
3279 
SdioReadCccrIntPending(struct MmcCntlr * cntlr,uint8_t * val)3280 int32_t SdioReadCccrIntPending(struct MmcCntlr *cntlr, uint8_t *val)
3281 {
3282     struct SdioCmdParam param = {0};
3283 
3284     if (cntlr == NULL || val == NULL) {
3285         HDF_LOGE("SdioReadCccrIntPending: cntlr or val is null!");
3286         return HDF_ERR_INVALID_PARAM;
3287     }
3288 
3289     /* read register 5(INTx) of CCCR. */
3290     param.regAddr = INT_PENDING;
3291     /*
3292      * INTx: Interrupt Pending for Function x.
3293      * If this bit is cleared to 0, this indicates that no Interrupts are pending from this function.
3294      * If this bit is set to 1, then this function has Interrupt pending.
3295      * Note that if the IENx or IENM bits are not set, the host cannot receive this pending Interrupt.
3296      */
3297     return SdioRwDirect(cntlr, &param, val);
3298 }
3299 
SdioCccrIntEnable(struct MmcCntlr * cntlr)3300 int32_t SdioCccrIntEnable(struct MmcCntlr *cntlr)
3301 {
3302     int32_t err;
3303     uint8_t val;
3304     struct SdioCmdParam param = {0};
3305     struct SdioDevice *dev = NULL;
3306 
3307     if (cntlr == NULL) {
3308         HDF_LOGE("SdioCccrIntEnable: cntlr is null!");
3309         return HDF_ERR_INVALID_OBJECT;
3310     }
3311     dev = (struct SdioDevice *)cntlr->curDev;
3312     if (dev == NULL || dev->curFunction == NULL) {
3313         HDF_LOGE("SdioCccrIntEnable: dev or curFunction is null!");
3314         return HDF_ERR_INVALID_OBJECT;
3315     }
3316 
3317     /* read register 4 of CCCR. */
3318     param.regAddr = INT_ENABLE;
3319     err = SdioRwDirect(cntlr, &param, &val);
3320     if (err != HDF_SUCCESS) {
3321         HDF_LOGE("SdioCccrIntEnable: read int enable fail! err = %d.", err);
3322         return err;
3323     }
3324     /*
3325      * [0]IENM: Interrupt Enable Host.
3326      * If this bit is cleared to 0, no interrupts from this card shall be sent to the host.
3327      * If this bit is set to 1, then any function's interrupt shall be sent to the host.
3328      */
3329     val |= 1;
3330     /*
3331      * [1-7]IENx:Interrupt Enable for Function x.
3332      * If this bit is cleared to 0, any interrupt form this function shall not be sent to the host.
3333      * If this bit is set to 1, function's interrupt shall be sent to the host if the IENM is also set to 1.
3334      */
3335     val |= (1 << dev->curFunction->funcNum);
3336     param.writeflag = true;
3337     param.writeData = val;
3338     /* write register 4 of CCCR. */
3339     return SdioRwDirect(cntlr, &param, NULL);
3340 }
3341 
SdioCccrIntDisable(struct MmcCntlr * cntlr)3342 int32_t SdioCccrIntDisable(struct MmcCntlr *cntlr)
3343 {
3344     struct SdioDevice *dev = (struct SdioDevice *)cntlr->curDev;
3345     struct SdioCmdParam param = {0};
3346     int32_t err;
3347     uint8_t val;
3348 
3349     if (dev == NULL || dev->curFunction == NULL) {
3350         HDF_LOGE("SdioCccrIntDisable: dev or curFunction is null!");
3351         return HDF_ERR_INVALID_OBJECT;
3352     }
3353 
3354     /* read register 4 of CCCR. */
3355     param.regAddr = INT_ENABLE;
3356     err = SdioRwDirect(cntlr, &param, &val);
3357     if (err != HDF_SUCCESS) {
3358         HDF_LOGE("SdioCccrIntDisable: read int enable fail! err = %d.", err);
3359         return err;
3360     }
3361     /* clear the function's interrupt. */
3362     val &= (~(1U << dev->curFunction->funcNum));
3363     if ((val & 0xFE) == 0) {
3364         val = 0;
3365     }
3366     param.writeflag = true;
3367     param.writeData = val;
3368     /* write register 4 of CCCR. */
3369     return SdioRwDirect(cntlr, &param, NULL);
3370 }
3371 
SdioReadCccr(struct MmcCntlr * cntlr)3372 static int32_t SdioReadCccr(struct MmcCntlr *cntlr)
3373 {
3374     int32_t ret;
3375     uint8_t cccrRev;
3376     struct SdioDevice *sdioDev = NULL;
3377     struct SdioCccr *cccr = NULL;
3378 
3379     if (cntlr == NULL || cntlr->curDev == NULL) {
3380         HDF_LOGE("SdioReadCccr: cntlr or curDev is null!");
3381         return HDF_ERR_INVALID_PARAM;
3382     }
3383 
3384     sdioDev = (struct SdioDevice *)cntlr->curDev;
3385     cccr = &(sdioDev->sdioReg.cccr);
3386     ret = SdioReadCccrSdioRev(cntlr, cccr, &cccrRev);
3387     if (ret != HDF_SUCCESS) {
3388         return ret;
3389     }
3390     ret = SdioReadCccrCapbility(cntlr, cccr);
3391     if (ret != HDF_SUCCESS) {
3392         return ret;
3393     }
3394 
3395     if (cccrRev >= SDIO_CCCR_VERSION_1_10) {
3396         ret = SdioReadCccrPowerControl(cntlr, cccr);
3397         if (ret != HDF_SUCCESS) {
3398             return ret;
3399         }
3400     }
3401     /* SDIO version 1.20 cards indicate their support for High-Speed mode with the SHS bit in the CCCR. */
3402     if (cccrRev >= SDIO_CCCR_VERSION_1_20) {
3403         ret = SdioReadCccrBusSpeed(cntlr, cccr);
3404     }
3405     return ret;
3406 }
3407 
SdioBusSpeedSelect(struct MmcCntlr * cntlr,bool enableHighSpeed)3408 static int32_t SdioBusSpeedSelect(struct MmcCntlr *cntlr, bool enableHighSpeed)
3409 {
3410     struct SdioCmdParam param = {0};
3411     int32_t error;
3412     uint8_t speed;
3413 
3414     /* read register 19 of CCCR. */
3415     param.regAddr = BUS_SPEED_SELECT;
3416     error = SdioRwDirect(cntlr, &param, &speed);
3417     if (error != HDF_SUCCESS) {
3418         HDF_LOGE("SdioBusSpeedSelect: read bus speed select fail! err = %d.", error);
3419         return error;
3420     }
3421     /* fill BSS0. */
3422     if (enableHighSpeed == true) {
3423         speed |= SDIO_CCCR_BUS_SPEED_EHS;
3424     } else {
3425         speed &= (~SDIO_CCCR_BUS_SPEED_EHS);
3426     }
3427     /* write BSS0. */
3428     param.writeflag = true;
3429     param.writeData = speed;
3430     return SdioRwDirect(cntlr, &param, NULL);
3431 }
3432 
SdioSwitchHighSpeed(struct MmcCntlr * cntlr)3433 static int32_t SdioSwitchHighSpeed(struct MmcCntlr *cntlr)
3434 {
3435     struct SdioDevice *sdioDev = NULL;
3436 
3437     if (cntlr == NULL || cntlr->curDev == NULL) {
3438         HDF_LOGE("SdioSwitchHighSpeed: cntlr or curDev is null!");
3439         return HDF_ERR_INVALID_PARAM;
3440     }
3441 
3442     sdioDev = (struct SdioDevice *)cntlr->curDev;
3443     if (cntlr->caps.bits.highSpeed == 0 || sdioDev->sdioReg.cccr.highSpeed == 0) {
3444         return HDF_ERR_NOT_SUPPORT;
3445     }
3446     return SdioBusSpeedSelect(cntlr, true);
3447 }
3448 
SdioEnableHighSpeed(struct MmcCntlr * cntlr)3449 static int32_t SdioEnableHighSpeed(struct MmcCntlr *cntlr)
3450 {
3451     int32_t err;
3452 
3453     err = SdioSwitchHighSpeed(cntlr);
3454     if (cntlr->curDev->type == MMC_DEV_SDIO || err != HDF_SUCCESS) {
3455         return err;
3456     }
3457 
3458     /* COMBO card, need switch SD memory. */
3459     err = SdSwitchHighSpeed(cntlr);
3460     if (err == HDF_SUCCESS) {
3461         return err;
3462     }
3463     /* sd switch fail, need switch sdio to default speed. */
3464     if (SdioBusSpeedSelect(cntlr, false) != HDF_SUCCESS) {
3465         HDF_LOGD("SdioEnableHighSpeed: switch sdio to default speed fail.");
3466     }
3467     return err;
3468 }
3469 
SdioSetBusWidth(struct MmcCntlr * cntlr,uint8_t width)3470 static int32_t SdioSetBusWidth(struct MmcCntlr *cntlr, uint8_t width)
3471 {
3472     struct SdioCmdParam param = {0};
3473     int32_t error;
3474     uint8_t data;
3475 
3476     /* read register 7 of CCCR. */
3477     param.regAddr = BUS_INTERFACE_CONTROL;
3478     error = SdioRwDirect(cntlr, &param, &data);
3479     if (error != HDF_SUCCESS) {
3480         HDF_LOGE("SdioSetBusWidth: read BIC fail, error = %d!", error);
3481         return error;
3482     }
3483 
3484     data |= width;
3485     /* write bit1-bit0: Bus Width. */
3486     param.writeflag = true;
3487     param.writeData = data;
3488     return SdioRwDirect(cntlr, &param, NULL);
3489 }
3490 
SdioSwitch4BitBusWidth(struct MmcCntlr * cntlr)3491 static int32_t SdioSwitch4BitBusWidth(struct MmcCntlr *cntlr)
3492 {
3493     struct SdioDevice *sdioDev = NULL;
3494 
3495     if (cntlr == NULL || cntlr->curDev == NULL) {
3496         HDF_LOGE("SdioSwitch4BitBusWidth: cntlr or curDev is null!");
3497         return HDF_ERR_INVALID_PARAM;
3498     }
3499 
3500     sdioDev = (struct SdioDevice *)cntlr->curDev;
3501     if (cntlr->caps.bits.cap4Bit == 0) {
3502         return HDF_ERR_NOT_SUPPORT;
3503     }
3504     /*
3505      * Note that Low-Speed SDIO cards support 4-bit transfer as an optipn. When communicating with a
3506      * Low-Speed SDIO card, the host shall fist determine if the card supports 4-bit transfer prior to
3507      * attempting to select that mode.
3508      */
3509     if (sdioDev->sdioReg.cccr.lowSpeed > 0 && sdioDev->sdioReg.cccr.lowSpeed4Bit == 0) {
3510         return HDF_ERR_NOT_SUPPORT;
3511     }
3512     return SdioSetBusWidth(cntlr, SDIO_CCCR_WIDTH_4BIT);
3513 }
3514 
SdioEnable4BitBusWidth(struct MmcCntlr * cntlr)3515 static int32_t SdioEnable4BitBusWidth(struct MmcCntlr *cntlr)
3516 {
3517     int32_t error;
3518     struct SdDevice *dev = (struct SdDevice *)cntlr->curDev;
3519 
3520     /*
3521      * For an SD memory card, the bus width for SD mode is set using ACMD6.
3522      * For an SDIO card a write to the CCCR usingCMD52 is used to select bus width.
3523      * In the case of a combo card, both selection methods exist.
3524      */
3525     error = SdioSwitch4BitBusWidth(cntlr);
3526     if (cntlr->curDev->type == MMC_DEV_SDIO || error != HDF_SUCCESS) {
3527         return error;
3528     }
3529 
3530     /* COMBO card, need switch SD memory. */
3531     if ((dev->reg.scr.sdBusWidths & SD_SCR_BUS_WIDTHS_4) > 0 &&
3532         (cntlr->caps.bits.cap4Bit > 0)) {
3533         error = SdAcmdSetBusWidth(cntlr, BUS_WIDTH4);
3534     }
3535 
3536     return error;
3537 }
3538 
SdioReadCisTplField(struct MmcCntlr * cntlr,uint32_t addr,uint8_t * data)3539 static int32_t SdioReadCisTplField(struct MmcCntlr *cntlr, uint32_t addr, uint8_t *data)
3540 {
3541     struct SdioCmdParam param = {0};
3542 
3543     param.regAddr = addr;
3544     return SdioRwDirect(cntlr, &param, data);
3545 }
3546 
SdioDecodeCisTplManfId(struct MmcCntlr * cntlr,struct SdioFunction * function,struct SdioCisTuple * tuple)3547 static void SdioDecodeCisTplManfId(struct MmcCntlr *cntlr, struct SdioFunction *function,
3548     struct SdioCisTuple *tuple)
3549 {
3550     uint16_t vendorId;
3551     uint16_t deviceId;
3552     struct SdioDevice *dev = NULL;
3553 
3554     if (tuple->tplLink < SDIO_CIS_TPL_MANFID_MIN_SIZE) {
3555         return;
3556     }
3557 
3558     /*
3559      * CISTPL_MANFID Field: bit00[TPL_CODE(20)], bit01[TPL_LINK(at least 4)], bit02-03[SDIO Card manufacturer code],
3560      * bit04-05[manufacturer information(Part Number and /or Revision)].
3561      * bit02-03-->tplBody[0:1], bit04-05-->tplBody[2:3].
3562      */
3563     vendorId = (tuple->tplBody[1] << BITS_PER_BYTE) | tuple->tplBody[0];
3564     deviceId = (tuple->tplBody[3] << BITS_PER_BYTE) | tuple->tplBody[2];
3565 
3566     /* function CISTPL_MANFID. */
3567     if (function != NULL) {
3568         function->deviceId = deviceId;
3569         function->vendorId = vendorId;
3570         return;
3571     }
3572 
3573     /* common CISTPL_MANFID. */
3574     dev = (struct SdioDevice *)cntlr->curDev;
3575     dev->sdioReg.cis.deviceId = deviceId;
3576     dev->sdioReg.cis.vendorId = vendorId;
3577 }
3578 
SdioDecodeCisTplFunceCommon(struct MmcCntlr * cntlr,struct SdioCisTuple * tuple)3579 static void SdioDecodeCisTplFunceCommon(struct MmcCntlr *cntlr, struct SdioCisTuple *tuple)
3580 {
3581     struct SdioDevice *dev = (struct SdioDevice *)cntlr->curDev;
3582     const uint8_t value[16] = { 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 };
3583     const uint32_t unit[8] = { 10000, 100000, 1000000, 10000000, 0, 0, 0, 0 };
3584 
3585     if (tuple->tplLink < SDIO_CIS_TPL_FUNCE_COMMON_MIN_SIZE) {
3586         return;
3587     }
3588 
3589     /*
3590      * CISTPL_FUNCE(common): bit00[TPL_CODE(22h)], bit01[TPL_LINK], bit02[TPLFE_TYPE(00h)],
3591      * bit03-04[TPLFE_FN0_BLK_SIZE], bit05[TPLFE_MAX_TRAN_SPEED].
3592      * bit2-->tplBody[0], bit03-04-->tplBody[1:2], bit05-->tplBody[3].
3593      */
3594     dev->sdioReg.cis.blkSize = (tuple->tplBody[2] << BITS_PER_BYTE) | tuple->tplBody[1];
3595 
3596     /*
3597      * This byte indicates the maximum transfer rate per one data line during data transfer. This value applies to
3598      * all functions in the SDIO card. This value shall be 25Mb/Sec(32h) for all Full-Speed SDIO card. The minimum
3599      * value for Low-Speed SDIO cards shall be 400 Kb/Sec(48h). The format is identical to the TRAN_SPEED value stored
3600      * in the CSD of SD memory cards. The maximum data transfer rate is coded according to the following method:
3601      * Bits 2:0 contain the transfer rate unit coded as follows:
3602      * 0=100kbit/s, 1=1Mbit/s, 2=10Mbit/s, 3=100Mbit/s, ... 7=reserved.
3603      * Bits 6:3 contain the time value coded as follows:
3604      * 0=reserved, 1=1.0, 2=1.2, 3=1.3, 4=1.5, 5=2.0, 6=2.5, 7=3.0, 8= 3.5, 9=4.0, A=4.5, B=5.0, C=5.5, D=6.0, E=7.0,
3605      * F= 8.0.
3606      * Bit 7 is reserved and shall be 0.
3607      */
3608     dev->sdioReg.cis.maxDtr = unit[tuple->tplBody[3] & 7] * value[(tuple->tplBody[3] >> 3) & 15];
3609 }
3610 
SdioDecodeCisTplFunceFunction(struct SdioFunction * function,struct SdioCisTuple * tuple)3611 static void SdioDecodeCisTplFunceFunction(struct SdioFunction *function, struct SdioCisTuple *tuple)
3612 {
3613     uint32_t minSize;
3614 
3615     /* Rev 1.0, TPL_LINK 28bytes; >Rev 1.0, TPL_LINK 42bytes.  */
3616     minSize = (function->dev->sdioReg.cccr.sdioRev == SDIO_CCCR_SDIO_REV_1_00) ?
3617         SDIO_CIS_TPL_FUNCE_FUNCTION_PC_MIN_SIZE : SDIO_CIS_TPL_FUNCE_FUNCTION_PC_MAX_SIZE;
3618     if (tuple->tplLink < minSize) {
3619         return;
3620     }
3621 
3622     /*
3623      * CISTPL_FUNCE(function): bit00[TPL_CODE(22h)], bit01[TPL_LINK], bit02[TPLFE_TYPE(01h)],
3624      * bit0E-0F[TPLFE_MAX_BLK_SIZE], bit1E-1F[TPLFE_ENABLE_TIMEOUT_VAL].
3625      * bit2-->tplBody[0], bit0E-0F-->tplBody[12:13], bit1E-1F-->tplBody[28:29].
3626      */
3627     function->maxBlkSize = (tuple->tplBody[13] << BITS_PER_BYTE) | tuple->tplBody[12];
3628 
3629     /*
3630      * TPLFE_ENABLE_TIMEOUT_VAL is added in SDIO Rev 1.1. This 16-bit value indicates the function's required time-out
3631      * value for coming ready after being enabled. This per-function value indicated the time a host should wait from
3632      * asserting IOEx until expecting the card to indicate ready by asserting IORx. Different SDIO functions take
3633      * different amounts of time to become raedy after being enabled due to different internal initialization
3634      * requirements. The required time-out limit is in 10mS steps. If the card required no time-out, this field shall
3635      * be set to 0000h.
3636      */
3637     if (function->dev->sdioReg.cccr.sdioRev > SDIO_CCCR_SDIO_REV_1_00) {
3638         function->timeOut = (tuple->tplBody[28] | (tuple->tplBody[29] << BITS_PER_BYTE)) * 10;
3639     } else {
3640         function->timeOut = SDIO_CIS_TPLFE_ENABLE_TIMEOUT_VAL_DEF;
3641     }
3642 }
3643 
SdioDecodeCisTplFunce(struct MmcCntlr * cntlr,struct SdioFunction * function,struct SdioCisTuple * tuple)3644 static void SdioDecodeCisTplFunce(struct MmcCntlr *cntlr, struct SdioFunction *function,
3645     struct SdioCisTuple *tuple)
3646 {
3647     /*
3648      * The Function Extension Tuple provides standard information about the card(common) and each individual function.
3649      * There shall be one CISTPL_FUNCE in each function's CIS. There are two versions of the CISTPL_FUNCE tuple, one
3650      * for the common CIS(function 0) and a version used by the individual function's CIS(1-7).
3651      */
3652     if (tuple->tplBody[0] == SDIO_CIS_TPL_FUNCE_COMMON) {
3653         if (function != NULL) {
3654             return;
3655         }
3656         SdioDecodeCisTplFunceCommon(cntlr, tuple);
3657         return;
3658     }
3659 
3660     if (tuple->tplBody[0] == SDIO_CIS_TPL_FUNCE_FUNCTION_PC) {
3661         if (function == NULL) {
3662             return;
3663         }
3664         SdioDecodeCisTplFunceFunction(function, tuple);
3665     }
3666 }
3667 
SdioDecodeCisTplField(struct MmcCntlr * cntlr,struct SdioFunction * function,struct SdioCisTuple * tuple)3668 static void SdioDecodeCisTplField(struct MmcCntlr *cntlr, struct SdioFunction *function,
3669     struct SdioCisTuple *tuple)
3670 {
3671     /* decode MANFID. */
3672     if (tuple->tplCode == SDIO_CIS_TPL_MANFID) {
3673         SdioDecodeCisTplManfId(cntlr, function, tuple);
3674         return;
3675     }
3676     /* decode FUNCE. */
3677     if (tuple->tplCode == SDIO_CIS_TPL_FUNCE) {
3678         SdioDecodeCisTplFunce(cntlr, function, tuple);
3679     }
3680 }
3681 
SdioFillTplInfo(struct MmcCntlr * cntlr,struct SdioCisTuple * tuple,uint32_t * addr,uint8_t tplCode,uint8_t tplLink)3682 static int32_t SdioFillTplInfo(struct MmcCntlr *cntlr, struct SdioCisTuple *tuple,
3683     uint32_t *addr, uint8_t tplCode, uint8_t tplLink)
3684 {
3685     int32_t ret;
3686     uint32_t i;
3687 
3688     tuple->tplCode = tplCode;
3689     tuple->tplLink = tplLink;
3690     /* read tuple body. */
3691     for (i = 0; i < tplLink; i++) {
3692         (*addr)++;
3693         ret = SdioReadCisTplField(cntlr, *addr, &(tuple->tplBody[i]));
3694         if (ret != HDF_SUCCESS) {
3695             HDF_LOGE("SdioFillTplInfo: read tuple body fail, err = %d.", ret);
3696             return ret;
3697         }
3698     }
3699     return HDF_SUCCESS;
3700 }
3701 
SdioDecodeCis(struct MmcCntlr * cntlr,struct SdioFunction * function,uint32_t cisStartAddr)3702 static int32_t SdioDecodeCis(struct MmcCntlr *cntlr, struct SdioFunction *function, uint32_t cisStartAddr)
3703 {
3704     int32_t ret = HDF_SUCCESS;
3705     uint8_t tplCode;
3706     uint8_t tplLink;
3707     struct SdioCisTuple *tuple = NULL;
3708     uint32_t addr = cisStartAddr;
3709 
3710     while (ret == HDF_SUCCESS) {
3711         /* read TPL_CODE. */
3712         ret = SdioReadCisTplField(cntlr, addr, &tplCode);
3713         if (ret != HDF_SUCCESS) {
3714             HDF_LOGE("SdioDecodeCis: read TPL_CODE fail, err = %d.", ret);
3715             return ret;
3716         }
3717         if (tplCode == SDIO_CIS_TPL_END || tplCode == SDIO_CIS_TPL_NULL) {
3718             return HDF_SUCCESS;
3719         }
3720         /* read TPL_LINK. */
3721         addr++;
3722         ret = SdioReadCisTplField(cntlr, addr, &tplLink);
3723         if (ret != HDF_SUCCESS) {
3724             HDF_LOGE("SdioDecodeCis: read TPL_LINK fail, err = %d.", ret);
3725             return ret;
3726         }
3727         if (tplLink == SDIO_CIS_TPL_END) {
3728             return HDF_SUCCESS;
3729         }
3730         /* If the link field is 0, the the tuple body is empty. */
3731         if (tplLink == SDIO_CIS_TPL_NULL) {
3732             continue;
3733         }
3734 
3735         tuple = (struct SdioCisTuple *)OsalMemCalloc(sizeof(*tuple) + tplLink);
3736         if (tuple == NULL) {
3737             HDF_LOGE("SdioDecodeCis: mem alloc fail!");
3738             return HDF_ERR_MALLOC_FAIL;
3739         }
3740 
3741         ret = SdioFillTplInfo(cntlr, tuple, &addr, tplCode, tplLink);
3742         if (ret != HDF_SUCCESS) {
3743             OsalMemFree(tuple);
3744             return ret;
3745         }
3746         /* decode. */
3747         SdioDecodeCisTplField(cntlr, function, tuple);
3748         OsalMemFree(tuple);
3749         tuple = NULL;
3750         addr++;
3751     }
3752     return ret;
3753 }
3754 
SdioReadCis(struct MmcCntlr * cntlr,struct SdioFunction * function)3755 static int32_t SdioReadCis(struct MmcCntlr *cntlr, struct SdioFunction *function)
3756 {
3757     uint32_t funcNum;
3758     uint32_t i;
3759     uint32_t cisStartAddr;
3760     uint8_t data;
3761     int32_t ret;
3762     struct SdioCmdParam param = {0};
3763 
3764     if (function == NULL) {
3765         funcNum = 0;
3766     } else {
3767         funcNum = function->funcNum;
3768     }
3769 
3770     /* read CIS pointer. */
3771     cisStartAddr = 0;
3772     for (i = 0; i < SDIO_CCCR_CIS_START_ADDR_BYTES; i++) {
3773         /* read register 0xn09-0xn0B of FBR. */
3774         param.regAddr = SDIO_FBR_BASE_ADDR(funcNum) + SDIO_FBR_POINTER_CIS + i;
3775         ret = SdioRwDirect(cntlr, &param, &data);
3776         if (ret != HDF_SUCCESS) {
3777             HDF_LOGE("SdioReadCis: read CIS pointer fail, err = %d.", ret);
3778             return ret;
3779         }
3780         cisStartAddr |= (uint32_t)(data << (i * BITS_PER_BYTE));
3781     }
3782     return SdioDecodeCis(cntlr, function, cisStartAddr);
3783 }
3784 
SdioReadFbr(struct MmcCntlr * cntlr,struct SdioFunction * func)3785 static int32_t SdioReadFbr(struct MmcCntlr *cntlr, struct SdioFunction *func)
3786 {
3787     struct SdioCmdParam param = {0};
3788     int32_t error;
3789     uint8_t data;
3790 
3791     /* read register 0xn00 of FBR. */
3792     param.regAddr = SDIO_FBR_BASE_ADDR(func->funcNum) + SDIO_FBR_STD_FUNCTION_INTERFACE_CODE;
3793     error = SdioRwDirect(cntlr, &param, &data);
3794     if (error != HDF_SUCCESS) {
3795         HDF_LOGE("SdioReadFbr: read SFIC fail, err = %d.", error);
3796         return error;
3797     }
3798 
3799     /* bit3-bit0: Standard SDIO Function Interface Code. */
3800     data &= 0x0f;
3801     if (data == SDIO_FBR_STD_SDIO_IF) {
3802         /* read register 0xn01 of FBR. */
3803         param.regAddr = SDIO_FBR_BASE_ADDR(func->funcNum) + SDIO_FBR_EXT_STD_FUNCTION_INTERFACE_CODE;
3804         error = SdioRwDirect(cntlr, &param, &data);
3805         if (error != HDF_SUCCESS) {
3806             HDF_LOGE("SdioReadFbr: read ESFIC fail, err = %d.", error);
3807             return error;
3808         }
3809     }
3810 
3811     func->funcClass = data;
3812     return HDF_SUCCESS;
3813 }
3814 
SdioSetFbrIoBlockSize(struct MmcCntlr * cntlr,uint32_t blkSize)3815 int32_t SdioSetFbrIoBlockSize(struct MmcCntlr *cntlr, uint32_t blkSize)
3816 {
3817     struct SdioCmdParam param = {0};
3818     struct SdioDevice *dev = NULL;
3819     int32_t ret;
3820 
3821     if (cntlr == NULL) {
3822         HDF_LOGE("SdioSetFbrIoBlockSize: cntlr is null!");
3823         return HDF_ERR_INVALID_OBJECT;
3824     }
3825     dev = (struct SdioDevice *)cntlr->curDev;
3826     if (dev == NULL || dev->curFunction == NULL) {
3827         HDF_LOGE("SdioSetFbrIoBlockSize: dev or curFunction is null!");
3828         return HDF_ERR_INVALID_OBJECT;
3829     }
3830 
3831     /* write register 0xn10 of FBR. */
3832     param.regAddr = SDIO_FBR_BASE_ADDR(dev->curFunction->funcNum) + SDIO_FBR_IO_BLOCK_SIZE;
3833     param.writeflag = true;
3834     /*
3835      * Function 1-7 I/O Block Size.
3836      * This 16-bit register sets the block size for I/O block operations for each function(1-7).
3837      * The maximum block size is 2048 and the minimum is 1. At power-up or reset, this register
3838      * shall be initially loaded with a value of 0. The host is responsible for setting the appropriate
3839      * value for the block size supported by each function. This pointer is stored in little-endian format.
3840      */
3841     param.writeData = (blkSize & 0xff);
3842     ret = SdioRwDirect(cntlr, &param, NULL);
3843     if (ret != HDF_SUCCESS) {
3844         HDF_LOGE("SdioSetFbrIoBlockSize: write I/O Block Size fail, err = %d.", ret);
3845         return ret;
3846     }
3847 
3848     /* write register 0xn11 of FBR. */
3849     param.regAddr++;
3850     param.writeData = ((blkSize >> BITS_PER_BYTE) & 0xff);
3851     return SdioRwDirect(cntlr, &param, NULL);
3852 }
3853 
SdioGetMaxClock(struct MmcCntlr * cntlr)3854 static uint32_t SdioGetMaxClock(struct MmcCntlr *cntlr)
3855 {
3856     uint32_t clock;
3857     struct MmcDevice *mmcDev = cntlr->curDev;
3858     struct SdioDevice *sdioDev = (struct SdioDevice *)mmcDev;
3859 
3860     if (mmcDev->state.bits.highSpeed == 1) {
3861         /* The card operates in High-Speed timing mode with a clock rate up to 50MHz. */
3862         clock = 50000000;
3863     } else {
3864         clock = sdioDev->sdioReg.cis.maxDtr;
3865     }
3866 
3867     if (mmcDev->type == MMC_DEV_COMBO) {
3868         clock = (clock < SdGetMaxClock(cntlr)) ? clock : SdGetMaxClock(cntlr);
3869     }
3870 
3871     if (clock > cntlr->freqMax) {
3872         clock = cntlr->freqMax;
3873     }
3874     return clock;
3875 }
3876 
SdioAllocFunction(struct SdioDevice * sdioDev,uint32_t funcNum)3877 static struct SdioFunction *SdioAllocFunction(struct SdioDevice *sdioDev, uint32_t funcNum)
3878 {
3879     struct SdioFunction *function = NULL;
3880 
3881     function = (struct SdioFunction *)OsalMemCalloc(sizeof(struct SdioFunction));
3882     if (function == NULL) {
3883         HDF_LOGE("SdioAllocFunction: alloc fail!");
3884         return NULL;
3885     }
3886     function->dev = sdioDev;
3887     function->funcNum = funcNum;
3888     return function;
3889 }
3890 
SdioDeleteFunction(struct SdioFunction * function)3891 static void SdioDeleteFunction(struct SdioFunction *function)
3892 {
3893     if (function == NULL) {
3894         HDF_LOGE("SdioDeleteFunction: function is null!");
3895         return;
3896     }
3897     OsalMemFree(function);
3898 }
3899 
SdioAddFunctions(struct MmcCntlr * cntlr,uint32_t funcs)3900 static int32_t SdioAddFunctions(struct MmcCntlr *cntlr, uint32_t funcs)
3901 {
3902     struct SdioDevice *sdioDev = (struct SdioDevice *)cntlr->curDev;
3903     struct SdioFunction *function = NULL;
3904     uint32_t i;
3905     int32_t ret;
3906 
3907     sdioDev->functions = 0;
3908     for (i = 0; i < funcs; i++) {
3909         function = SdioAllocFunction(sdioDev, i + 1);
3910         if (function == NULL) {
3911             return HDF_ERR_MALLOC_FAIL;
3912         }
3913         ret = SdioReadFbr(cntlr, function);
3914         if (ret != HDF_SUCCESS) {
3915             SdioDeleteFunction(function);
3916             return ret;
3917         }
3918         ret = SdioReadCis(cntlr, function);
3919         if (ret != HDF_SUCCESS) {
3920             SdioDeleteFunction(function);
3921             return ret;
3922         }
3923 
3924         if (function->vendorId == 0) {
3925             function->vendorId = sdioDev->sdioReg.cis.vendorId;
3926             function->deviceId = sdioDev->sdioReg.cis.deviceId;
3927         }
3928         /* A value of zero is not valid and shall not be used. */
3929         if (function->maxBlkSize == 0) {
3930             function->maxBlkSize = sdioDev->sdioReg.cis.blkSize;
3931         }
3932 
3933         sdioDev->sdioFunc[i] = function;
3934         (sdioDev->functions)++;
3935     }
3936     return HDF_SUCCESS;
3937 }
3938 
SdioDelete(struct SdioDevice * sdioDev)3939 static void SdioDelete(struct SdioDevice *sdioDev)
3940 {
3941     uint32_t i;
3942 
3943     for (i = 0; i < sdioDev->functions; i++) {
3944         SdioDeleteFunction(sdioDev->sdioFunc[i]);
3945         sdioDev->sdioFunc[i] = NULL;
3946     }
3947 }
3948 
SdioDeviceAdd(struct MmcCntlr * cntlr)3949 static int32_t SdioDeviceAdd(struct MmcCntlr *cntlr)
3950 {
3951     /* add dev. */
3952     if (MmcDeviceAdd(cntlr->curDev) != HDF_SUCCESS) {
3953         HDF_LOGE("SdioDeviceAdd: Add device fail!");
3954         return HDF_FAILURE;
3955     }
3956     cntlr->curDev->state.bits.present = 1;
3957     return HDF_SUCCESS;
3958 }
3959 
SdioSelect(struct MmcCntlr * cntlr,uint32_t * rocr)3960 static int32_t SdioSelect(struct MmcCntlr *cntlr, uint32_t *rocr)
3961 {
3962     int32_t error;
3963 
3964     /* cmd5, set the support voltage. */
3965     error = SdioSendOpCond(cntlr, cntlr->curDev->reg.ocr.ocrData, rocr);
3966     if (error != HDF_SUCCESS) {
3967         HDF_LOGE("SdioSelect: cmd5(set voltage) fail, err = %d.", error);
3968         return error;
3969     }
3970 
3971     /* Judge Combo Card. */
3972     if (((*rocr) & SDIO_R4_MEMORY_PRESENT) > 0) {
3973         if (SdSelect(cntlr, rocr) == 0) {
3974             cntlr->curDev->type = MMC_DEV_COMBO;
3975             HDF_LOGD("SdioSelect: combo dev!!");
3976         }
3977     }
3978     /* get RCA. */
3979     error = SdCmdSendRelativeAddr(cntlr, &(cntlr->curDev->reg.rca));
3980     if (error != HDF_SUCCESS) {
3981         HDF_LOGE("SdioSelect: cmd3(get RCA) fail, err = %d.", error);
3982         return error;
3983     }
3984     if (cntlr->curDev->type == MMC_DEV_COMBO) {
3985         /* get CSD, CMD9 should send in stby. */
3986         error = SdReadCsd(cntlr);
3987         if (error != HDF_SUCCESS) {
3988             HDF_LOGE("SdioSelect: combo dev, read csd fail, err = %d.", error);
3989             return error;
3990         }
3991     }
3992     /* select card. */
3993     error = MmcSelectCard(cntlr);
3994     if (error != HDF_SUCCESS) {
3995         HDF_LOGE("SdioSelect: cmd7(select card) fail, err = %d.", error);
3996         return error;
3997     }
3998 
3999     error = SdioReadCccr(cntlr);
4000     if (error != HDF_SUCCESS) {
4001         HDF_LOGE("SdioSelect: read cccr fail, err = %d.", error);
4002         return error;
4003     }
4004     /* read common CIS. */
4005     error = SdioReadCis(cntlr, NULL);
4006     if (error != HDF_SUCCESS) {
4007         HDF_LOGE("SdioSelect: read cis fail, err = %d.", error);
4008         return error;
4009     }
4010     if (cntlr->curDev->type == MMC_DEV_COMBO) {
4011         error = SdReadRegisters(cntlr);
4012         if (error != HDF_SUCCESS) {
4013             HDF_LOGE("SdioSelect: combo dev, read registers fail, err = %d.", error);
4014             MmcGoIdleState(cntlr);
4015             cntlr->curDev->type = MMC_DEV_SDIO;
4016         }
4017     }
4018     return HDF_SUCCESS;
4019 }
4020 
SdioInit(struct MmcCntlr * cntlr)4021 static int32_t SdioInit(struct MmcCntlr *cntlr)
4022 {
4023     int32_t error;
4024     union MmcOcr ocr = {0};
4025 
4026     /* cmd5, detect sdio dev and get the voltage range. */
4027     error = SdioSendOpCond(cntlr, 0, &(ocr.ocrData));
4028     if (error != HDF_SUCCESS) {
4029         HDF_LOGE("SdioInit: cmd5(detect sdio) fail, err = %d", error);
4030         return error;
4031     }
4032 
4033     MmcCntlrSelectWorkVoltage(cntlr, &ocr);
4034     if (cntlr->curDev->reg.ocr.ocrData == 0) {
4035         HDF_LOGE("SdioInit: ocr is invalid!");
4036         return HDF_ERR_INVALID_PARAM;
4037     }
4038 
4039     error = SdioSelect(cntlr, &(ocr.ocrData));
4040     if (error != HDF_SUCCESS) {
4041         return error;
4042     }
4043 
4044     error = SdioCdDisable(cntlr);
4045     if (error != HDF_SUCCESS) {
4046         HDF_LOGE("SdioInit: Cd disable fail, err = %d.", error);
4047         return error;
4048     }
4049     error = SdioEnableHighSpeed(cntlr);
4050     if (error == HDF_SUCCESS) {
4051         cntlr->curDev->state.bits.highSpeed = 1;
4052         MmcCntlrSetBusTiming(cntlr, BUS_TIMING_SD_HS);
4053     } else if (error != HDF_ERR_NOT_SUPPORT) {
4054         HDF_LOGE("SdioInit: Enable HS fail, err = %d.", error);
4055         return error;
4056     }
4057     MmcCntlrSetClock(cntlr, SdioGetMaxClock(cntlr));
4058 
4059     error = SdioEnable4BitBusWidth(cntlr);
4060     if (error == HDF_SUCCESS) {
4061         MmcCntlrSetBusWidth(cntlr, BUS_WIDTH4);
4062     } else if (error != HDF_ERR_NOT_SUPPORT) {
4063         HDF_LOGE("SdioInit: Enable 4-bits bus width fail, err = %d.", error);
4064         return error;
4065     }
4066     /* R4, [30: 28] Number of I/O functions. */
4067     error = SdioAddFunctions(cntlr, ((ocr.ocrData >> 28) & SDIO_MAX_FUNCTION_NUMBER));
4068     if (error != HDF_SUCCESS) {
4069         HDF_LOGE("SdioInit: Add functions fail, err = %d.", error);
4070         return error;
4071     }
4072 
4073     return SdioDeviceAdd(cntlr);
4074 }
4075 
SdioReinit(struct MmcCntlr * cntlr)4076 int32_t SdioReinit(struct MmcCntlr *cntlr)
4077 {
4078     union MmcOcr ocr = {0};
4079     int error;
4080 
4081     MmcGoIdleState(cntlr);
4082     MmcCntlrSetClock(cntlr, cntlr->freqMin);
4083 
4084     /* cmd5, detect sdio dev and get the voltage range. */
4085     error = SdioSendOpCond(cntlr, 0, &(ocr.ocrData));
4086     if (error != HDF_SUCCESS) {
4087         return error;
4088     }
4089     /* cmd5, set the support voltage. */
4090     error = SdioSendOpCond(cntlr, cntlr->curDev->reg.ocr.ocrData, &(ocr.ocrData));
4091     if (error != HDF_SUCCESS) {
4092         return error;
4093     }
4094     /* get RCA. */
4095     error = SdCmdSendRelativeAddr(cntlr, &(cntlr->curDev->reg.rca));
4096     if (error != HDF_SUCCESS) {
4097         return error;
4098     }
4099     /* select card. */
4100     error = MmcSelectCard(cntlr);
4101     if (error != HDF_SUCCESS) {
4102         return error;
4103     }
4104     error = SdioEnableHighSpeed(cntlr);
4105     if (error != HDF_SUCCESS) {
4106         return error;
4107     }
4108     MmcCntlrSetClock(cntlr, SdioGetMaxClock(cntlr));
4109 
4110     error = SdioEnable4BitBusWidth(cntlr);
4111     if (error == HDF_SUCCESS) {
4112         MmcCntlrSetBusWidth(cntlr, BUS_WIDTH4);
4113     }
4114     return error;
4115 }
4116 
SdioDetect(struct MmcCntlr * cntlr)4117 static int32_t SdioDetect(struct MmcCntlr *cntlr)
4118 {
4119     int32_t err;
4120 
4121     HDF_LOGD("SdioDetect: Detect sdio dev start...");
4122     /*
4123      * After reset or power-up, all I/O functions on the card are disabled and the I/O portion of the card shall
4124      * not execute any operation except CMD5 or CMD0. If there is SD memory on the card, that memory shall
4125      * respond normally to all mandatory memory commands.
4126      */
4127     SdioIoReset(cntlr);
4128     MmcGoIdleState(cntlr);
4129     /* Initialize SDIO. */
4130     err = SdioInit(cntlr);
4131     if (err == HDF_SUCCESS) {
4132         HDF_LOGD("SdioDetect: Detect sdio dev success! %s dev at address 0x%x!",
4133             cntlr->curDev->state.bits.highSpeed ? "High speed" : "", cntlr->curDev->reg.rca);
4134         return HDF_SUCCESS;
4135     }
4136     SdioDelete((struct SdioDevice *)cntlr->curDev);
4137     return err;
4138 }
4139 
MmcDeleteDev(struct MmcCntlr * cntlr)4140 void MmcDeleteDev(struct MmcCntlr *cntlr)
4141 {
4142     if (cntlr == NULL || cntlr->curDev == NULL) {
4143         return;
4144     }
4145 
4146     if (cntlr->curDev->state.bits.present == 0) {
4147         return;
4148     }
4149     cntlr->curDev->state.bits.present = 0;
4150 
4151     if (cntlr->curDev->type == MMC_DEV_SDIO || cntlr->curDev->type == MMC_DEV_COMBO) {
4152         SdioDelete((struct SdioDevice *)cntlr->curDev);
4153     }
4154 
4155     MmcDeviceRemove(cntlr->curDev);
4156     MmcCntlrFreeDev(cntlr);
4157 }
4158 
MmcDoDetect(struct MmcCntlr * cntlr)4159 int32_t MmcDoDetect(struct MmcCntlr *cntlr)
4160 {
4161     int32_t error;
4162     enum MmcDevType devType;
4163 
4164     if (cntlr == NULL) {
4165         HDF_LOGE("MmcDoDetect: cntlr is null!");
4166         return HDF_ERR_INVALID_PARAM;
4167     }
4168     devType = (enum MmcDevType)cntlr->devType;
4169     if (devType >= MMC_DEV_COMBO) {
4170         return HDF_ERR_INVALID_PARAM;
4171     }
4172 
4173     if (MmcCntlrAllocDev(cntlr, devType) != HDF_SUCCESS) {
4174         return HDF_ERR_INVALID_PARAM;
4175     }
4176 
4177     MmcCntlrPowerUp(cntlr);
4178     if (devType == MMC_DEV_SDIO) {
4179         error = SdioDetect(cntlr);
4180     } else if (devType == MMC_DEV_SD) {
4181         error = SdDetect(cntlr);
4182     } else {
4183         error = EmmcDetect(cntlr);
4184     }
4185 
4186     if (error == HDF_SUCCESS) {
4187         HDF_LOGD("MmcDoDetect: host%d detect succ!", cntlr->index);
4188         return error;
4189     }
4190 
4191     HDF_LOGD("MmcDoDetect: host%d detect fail!", cntlr->index);
4192     MmcCntlrFreeDev(cntlr);
4193     MmcCntlrPowerOff(cntlr);
4194     return error;
4195 }
4196