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, ¶m, 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, ¶m, 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, ¶m, 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, ¶m, 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, ¶m, 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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, NULL);
2953 }
2954 return SdioRwDirect(cntlr, ¶m, 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(¶m, dev, info);
3035 if (info->scatterFlag == true) {
3036 return SdioRwExtended(cntlr, ¶m, 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, ¶m, 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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, &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, ¶m, &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, ¶m, &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, ¶m, &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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, 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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, &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, ¶m, 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, ¶m, 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, ¶m, &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, ¶m, &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, ¶m, &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, ¶m, 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, ¶m, 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