2 * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
7 /* Define a simple and generic interface to access eMMC and SD-card devices. */
14 #include <arch_helpers.h>
15 #include <common/debug.h>
16 #include <drivers/delay_timer.h>
17 #include <drivers/mmc.h>
18 #include <lib/utils.h>
20 #define MMC_DEFAULT_MAX_RETRIES 5
21 #define SEND_OP_COND_MAX_RETRIES 100
23 #define MULT_BY_512K_SHIFT 19
25 static const struct mmc_ops
*ops
;
26 static unsigned int mmc_ocr_value
;
27 static struct mmc_csd_emmc mmc_csd
;
28 static unsigned char mmc_ext_csd
[512] __aligned(16);
29 static unsigned int mmc_flags
;
30 static struct mmc_device_info
*mmc_dev_info
;
31 static unsigned int rca
;
32 static unsigned int scr
[2]__aligned(16) = { 0 };
34 static const unsigned char tran_speed_base
[16] = {
35 0, 10, 12, 13, 15, 20, 26, 30, 35, 40, 45, 52, 55, 60, 70, 80
38 static const unsigned char sd_tran_speed_base
[16] = {
39 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80
42 static bool is_cmd23_enabled(void)
44 return ((mmc_flags
& MMC_FLAG_CMD23
) != 0U);
47 static int mmc_send_cmd(unsigned int idx
, unsigned int arg
,
48 unsigned int r_type
, unsigned int *r_data
)
53 zeromem(&cmd
, sizeof(struct mmc_cmd
));
57 cmd
.resp_type
= r_type
;
59 ret
= ops
->send_cmd(&cmd
);
61 if ((ret
== 0) && (r_data
!= NULL
)) {
64 for (i
= 0; i
< 4; i
++) {
65 *r_data
= cmd
.resp_data
[i
];
71 VERBOSE("Send command %u error: %d\n", idx
, ret
);
77 static int mmc_device_state(void)
79 int retries
= MMC_DEFAULT_MAX_RETRIES
;
80 unsigned int resp_data
[4];
86 ERROR("CMD13 failed after %d retries\n",
87 MMC_DEFAULT_MAX_RETRIES
);
91 ret
= mmc_send_cmd(MMC_CMD(13), rca
<< RCA_SHIFT_OFFSET
,
92 MMC_RESPONSE_R1
, &resp_data
[0]);
98 if ((resp_data
[0] & STATUS_SWITCH_ERROR
) != 0U) {
103 } while ((resp_data
[0] & STATUS_READY_FOR_DATA
) == 0U);
105 return MMC_GET_STATE(resp_data
[0]);
108 static int mmc_set_ext_csd(unsigned int ext_cmd
, unsigned int value
)
112 ret
= mmc_send_cmd(MMC_CMD(6),
113 EXTCSD_WRITE_BYTES
| EXTCSD_CMD(ext_cmd
) |
114 EXTCSD_VALUE(value
) | EXTCSD_CMD_SET_NORMAL
,
115 MMC_RESPONSE_R1B
, NULL
);
121 ret
= mmc_device_state();
125 } while (ret
== MMC_STATE_PRG
);
130 static int mmc_sd_switch(unsigned int bus_width
)
133 int retries
= MMC_DEFAULT_MAX_RETRIES
;
134 unsigned int bus_width_arg
= 0;
136 ret
= ops
->prepare(0, (uintptr_t)&scr
, sizeof(scr
));
141 /* CMD55: Application Specific Command */
142 ret
= mmc_send_cmd(MMC_CMD(55), rca
<< RCA_SHIFT_OFFSET
,
143 MMC_RESPONSE_R5
, NULL
);
148 /* ACMD51: SEND_SCR */
150 ret
= mmc_send_cmd(MMC_ACMD(51), 0, MMC_RESPONSE_R1
, NULL
);
151 if ((ret
!= 0) && (retries
== 0)) {
152 ERROR("ACMD51 failed after %d retries (ret=%d)\n",
153 MMC_DEFAULT_MAX_RETRIES
, ret
);
160 ret
= ops
->read(0, (uintptr_t)&scr
, sizeof(scr
));
165 if (((scr
[0] & SD_SCR_BUS_WIDTH_4
) != 0U) &&
166 (bus_width
== MMC_BUS_WIDTH_4
)) {
170 /* CMD55: Application Specific Command */
171 ret
= mmc_send_cmd(MMC_CMD(55), rca
<< RCA_SHIFT_OFFSET
,
172 MMC_RESPONSE_R5
, NULL
);
177 /* ACMD6: SET_BUS_WIDTH */
178 ret
= mmc_send_cmd(MMC_ACMD(6), bus_width_arg
, MMC_RESPONSE_R1
, NULL
);
184 ret
= mmc_device_state();
188 } while (ret
== MMC_STATE_PRG
);
193 static int mmc_set_ios(unsigned int clk
, unsigned int bus_width
)
196 unsigned int width
= bus_width
;
198 if (mmc_dev_info
->mmc_dev_type
!= MMC_IS_EMMC
) {
199 if (width
== MMC_BUS_WIDTH_8
) {
200 WARN("Wrong bus config for SD-card, force to 4\n");
201 width
= MMC_BUS_WIDTH_4
;
203 ret
= mmc_sd_switch(width
);
207 } else if (mmc_csd
.spec_vers
== 4U) {
208 ret
= mmc_set_ext_csd(CMD_EXTCSD_BUS_WIDTH
,
209 (unsigned int)width
);
214 VERBOSE("Wrong MMC type or spec version\n");
217 return ops
->set_ios(clk
, width
);
220 static int mmc_fill_device_info(void)
222 unsigned long long c_size
;
223 unsigned int speed_idx
;
224 unsigned int nb_blocks
;
225 unsigned int freq_unit
;
227 struct mmc_csd_sd_v2
*csd_sd_v2
;
229 switch (mmc_dev_info
->mmc_dev_type
) {
231 mmc_dev_info
->block_size
= MMC_BLOCK_SIZE
;
233 ret
= ops
->prepare(0, (uintptr_t)&mmc_ext_csd
,
234 sizeof(mmc_ext_csd
));
239 /* MMC CMD8: SEND_EXT_CSD */
240 ret
= mmc_send_cmd(MMC_CMD(8), 0, MMC_RESPONSE_R1
, NULL
);
245 ret
= ops
->read(0, (uintptr_t)&mmc_ext_csd
,
246 sizeof(mmc_ext_csd
));
252 ret
= mmc_device_state();
256 } while (ret
!= MMC_STATE_TRAN
);
258 nb_blocks
= (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
] << 0) |
259 (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
+ 1] << 8) |
260 (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
+ 2] << 16) |
261 (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
+ 3] << 24);
263 mmc_dev_info
->device_size
= (unsigned long long)nb_blocks
*
264 mmc_dev_info
->block_size
;
270 * Use the same mmc_csd struct, as required fields here
271 * (READ_BL_LEN, C_SIZE, CSIZE_MULT) are common with eMMC.
273 mmc_dev_info
->block_size
= BIT_32(mmc_csd
.read_bl_len
);
275 c_size
= ((unsigned long long)mmc_csd
.c_size_high
<< 2U) |
276 (unsigned long long)mmc_csd
.c_size_low
;
277 assert(c_size
!= 0xFFFU
);
279 mmc_dev_info
->device_size
= (c_size
+ 1U) *
280 BIT_64(mmc_csd
.c_size_mult
+ 2U) *
281 mmc_dev_info
->block_size
;
286 assert(mmc_csd
.csd_structure
== 1U);
288 mmc_dev_info
->block_size
= MMC_BLOCK_SIZE
;
290 /* Need to use mmc_csd_sd_v2 struct */
291 csd_sd_v2
= (struct mmc_csd_sd_v2
*)&mmc_csd
;
292 c_size
= ((unsigned long long)csd_sd_v2
->c_size_high
<< 16) |
293 (unsigned long long)csd_sd_v2
->c_size_low
;
295 mmc_dev_info
->device_size
= (c_size
+ 1U) << MULT_BY_512K_SHIFT
;
308 speed_idx
= (mmc_csd
.tran_speed
& CSD_TRAN_SPEED_MULT_MASK
) >>
309 CSD_TRAN_SPEED_MULT_SHIFT
;
311 assert(speed_idx
> 0U);
313 if (mmc_dev_info
->mmc_dev_type
== MMC_IS_EMMC
) {
314 mmc_dev_info
->max_bus_freq
= tran_speed_base
[speed_idx
];
316 mmc_dev_info
->max_bus_freq
= sd_tran_speed_base
[speed_idx
];
319 freq_unit
= mmc_csd
.tran_speed
& CSD_TRAN_SPEED_UNIT_MASK
;
320 while (freq_unit
!= 0U) {
321 mmc_dev_info
->max_bus_freq
*= 10U;
325 mmc_dev_info
->max_bus_freq
*= 10000U;
330 static int sd_send_op_cond(void)
333 unsigned int resp_data
[4];
335 for (n
= 0; n
< SEND_OP_COND_MAX_RETRIES
; n
++) {
338 /* CMD55: Application Specific Command */
339 ret
= mmc_send_cmd(MMC_CMD(55), 0, MMC_RESPONSE_R1
, NULL
);
344 /* ACMD41: SD_SEND_OP_COND */
345 ret
= mmc_send_cmd(MMC_ACMD(41), OCR_HCS
|
346 mmc_dev_info
->ocr_voltage
, MMC_RESPONSE_R3
,
352 if ((resp_data
[0] & OCR_POWERUP
) != 0U) {
353 mmc_ocr_value
= resp_data
[0];
355 if ((mmc_ocr_value
& OCR_HCS
) != 0U) {
356 mmc_dev_info
->mmc_dev_type
= MMC_IS_SD_HC
;
358 mmc_dev_info
->mmc_dev_type
= MMC_IS_SD
;
367 ERROR("ACMD41 failed after %d retries\n", SEND_OP_COND_MAX_RETRIES
);
372 static int mmc_reset_to_idle(void)
376 /* CMD0: reset to IDLE */
377 ret
= mmc_send_cmd(MMC_CMD(0), 0, 0, NULL
);
387 static int mmc_send_op_cond(void)
390 unsigned int resp_data
[4];
392 ret
= mmc_reset_to_idle();
397 for (n
= 0; n
< SEND_OP_COND_MAX_RETRIES
; n
++) {
398 ret
= mmc_send_cmd(MMC_CMD(1), OCR_SECTOR_MODE
|
399 OCR_VDD_MIN_2V7
| OCR_VDD_MIN_1V7
,
400 MMC_RESPONSE_R3
, &resp_data
[0]);
405 if ((resp_data
[0] & OCR_POWERUP
) != 0U) {
406 mmc_ocr_value
= resp_data
[0];
413 ERROR("CMD1 failed after %d retries\n", SEND_OP_COND_MAX_RETRIES
);
418 static int mmc_enumerate(unsigned int clk
, unsigned int bus_width
)
421 unsigned int resp_data
[4];
425 ret
= mmc_reset_to_idle();
430 if (mmc_dev_info
->mmc_dev_type
== MMC_IS_EMMC
) {
431 ret
= mmc_send_op_cond();
433 /* CMD8: Send Interface Condition Command */
434 ret
= mmc_send_cmd(MMC_CMD(8), VHS_2_7_3_6_V
| CMD8_CHECK_PATTERN
,
435 MMC_RESPONSE_R5
, &resp_data
[0]);
437 if ((ret
== 0) && ((resp_data
[0] & 0xffU
) == CMD8_CHECK_PATTERN
)) {
438 ret
= sd_send_op_cond();
445 /* CMD2: Card Identification */
446 ret
= mmc_send_cmd(MMC_CMD(2), 0, MMC_RESPONSE_R2
, NULL
);
451 /* CMD3: Set Relative Address */
452 if (mmc_dev_info
->mmc_dev_type
== MMC_IS_EMMC
) {
454 ret
= mmc_send_cmd(MMC_CMD(3), rca
<< RCA_SHIFT_OFFSET
,
455 MMC_RESPONSE_R1
, NULL
);
460 ret
= mmc_send_cmd(MMC_CMD(3), 0,
461 MMC_RESPONSE_R6
, &resp_data
[0]);
466 rca
= (resp_data
[0] & 0xFFFF0000U
) >> 16;
469 /* CMD9: CSD Register */
470 ret
= mmc_send_cmd(MMC_CMD(9), rca
<< RCA_SHIFT_OFFSET
,
471 MMC_RESPONSE_R2
, &resp_data
[0]);
476 memcpy(&mmc_csd
, &resp_data
, sizeof(resp_data
));
478 /* CMD7: Select Card */
479 ret
= mmc_send_cmd(MMC_CMD(7), rca
<< RCA_SHIFT_OFFSET
,
480 MMC_RESPONSE_R1
, NULL
);
486 ret
= mmc_device_state();
490 } while (ret
!= MMC_STATE_TRAN
);
492 ret
= mmc_set_ios(clk
, bus_width
);
497 return mmc_fill_device_info();
500 size_t mmc_read_blocks(int lba
, uintptr_t buf
, size_t size
)
503 unsigned int cmd_idx
, cmd_arg
;
505 assert((ops
!= NULL
) &&
506 (ops
->read
!= NULL
) &&
508 ((size
& MMC_BLOCK_MASK
) == 0U));
510 ret
= ops
->prepare(lba
, buf
, size
);
515 if (is_cmd23_enabled()) {
516 /* Set block count */
517 ret
= mmc_send_cmd(MMC_CMD(23), size
/ MMC_BLOCK_SIZE
,
518 MMC_RESPONSE_R1
, NULL
);
523 cmd_idx
= MMC_CMD(18);
525 if (size
> MMC_BLOCK_SIZE
) {
526 cmd_idx
= MMC_CMD(18);
528 cmd_idx
= MMC_CMD(17);
532 if (((mmc_ocr_value
& OCR_ACCESS_MODE_MASK
) == OCR_BYTE_MODE
) &&
533 (mmc_dev_info
->mmc_dev_type
!= MMC_IS_SD_HC
)) {
534 cmd_arg
= lba
* MMC_BLOCK_SIZE
;
539 ret
= mmc_send_cmd(cmd_idx
, cmd_arg
, MMC_RESPONSE_R1
, NULL
);
544 ret
= ops
->read(lba
, buf
, size
);
549 /* Wait buffer empty */
551 ret
= mmc_device_state();
555 } while ((ret
!= MMC_STATE_TRAN
) && (ret
!= MMC_STATE_DATA
));
557 if (!is_cmd23_enabled() && (size
> MMC_BLOCK_SIZE
)) {
558 ret
= mmc_send_cmd(MMC_CMD(12), 0, MMC_RESPONSE_R1B
, NULL
);
567 size_t mmc_write_blocks(int lba
, const uintptr_t buf
, size_t size
)
570 unsigned int cmd_idx
, cmd_arg
;
572 assert((ops
!= NULL
) &&
573 (ops
->write
!= NULL
) &&
575 ((buf
& MMC_BLOCK_MASK
) == 0U) &&
576 ((size
& MMC_BLOCK_MASK
) == 0U));
578 ret
= ops
->prepare(lba
, buf
, size
);
583 if (is_cmd23_enabled()) {
584 /* Set block count */
585 ret
= mmc_send_cmd(MMC_CMD(23), size
/ MMC_BLOCK_SIZE
,
586 MMC_RESPONSE_R1
, NULL
);
591 cmd_idx
= MMC_CMD(25);
593 if (size
> MMC_BLOCK_SIZE
) {
594 cmd_idx
= MMC_CMD(25);
596 cmd_idx
= MMC_CMD(24);
600 if ((mmc_ocr_value
& OCR_ACCESS_MODE_MASK
) == OCR_BYTE_MODE
) {
601 cmd_arg
= lba
* MMC_BLOCK_SIZE
;
606 ret
= mmc_send_cmd(cmd_idx
, cmd_arg
, MMC_RESPONSE_R1
, NULL
);
611 ret
= ops
->write(lba
, buf
, size
);
616 /* Wait buffer empty */
618 ret
= mmc_device_state();
622 } while ((ret
!= MMC_STATE_TRAN
) && (ret
!= MMC_STATE_RCV
));
624 if (!is_cmd23_enabled() && (size
> MMC_BLOCK_SIZE
)) {
625 ret
= mmc_send_cmd(MMC_CMD(12), 0, MMC_RESPONSE_R1B
, NULL
);
634 size_t mmc_erase_blocks(int lba
, size_t size
)
639 assert((size
!= 0U) && ((size
& MMC_BLOCK_MASK
) == 0U));
641 ret
= mmc_send_cmd(MMC_CMD(35), lba
, MMC_RESPONSE_R1
, NULL
);
646 ret
= mmc_send_cmd(MMC_CMD(36), lba
+ (size
/ MMC_BLOCK_SIZE
) - 1U,
647 MMC_RESPONSE_R1
, NULL
);
652 ret
= mmc_send_cmd(MMC_CMD(38), lba
, MMC_RESPONSE_R1B
, NULL
);
658 ret
= mmc_device_state();
662 } while (ret
!= MMC_STATE_TRAN
);
667 static inline void mmc_rpmb_enable(void)
669 mmc_set_ext_csd(CMD_EXTCSD_PARTITION_CONFIG
,
670 PART_CFG_BOOT_PARTITION1_ENABLE
|
671 PART_CFG_PARTITION1_ACCESS
);
674 static inline void mmc_rpmb_disable(void)
676 mmc_set_ext_csd(CMD_EXTCSD_PARTITION_CONFIG
,
677 PART_CFG_BOOT_PARTITION1_ENABLE
);
680 size_t mmc_rpmb_read_blocks(int lba
, uintptr_t buf
, size_t size
)
685 size_read
= mmc_read_blocks(lba
, buf
, size
);
691 size_t mmc_rpmb_write_blocks(int lba
, const uintptr_t buf
, size_t size
)
696 size_written
= mmc_write_blocks(lba
, buf
, size
);
702 size_t mmc_rpmb_erase_blocks(int lba
, size_t size
)
707 size_erased
= mmc_erase_blocks(lba
, size
);
713 int mmc_init(const struct mmc_ops
*ops_ptr
, unsigned int clk
,
714 unsigned int width
, unsigned int flags
,
715 struct mmc_device_info
*device_info
)
717 assert((ops_ptr
!= NULL
) &&
718 (ops_ptr
->init
!= NULL
) &&
719 (ops_ptr
->send_cmd
!= NULL
) &&
720 (ops_ptr
->set_ios
!= NULL
) &&
721 (ops_ptr
->prepare
!= NULL
) &&
722 (ops_ptr
->read
!= NULL
) &&
723 (ops_ptr
->write
!= NULL
) &&
724 (device_info
!= NULL
) &&
726 ((width
== MMC_BUS_WIDTH_1
) ||
727 (width
== MMC_BUS_WIDTH_4
) ||
728 (width
== MMC_BUS_WIDTH_8
) ||
729 (width
== MMC_BUS_WIDTH_DDR_4
) ||
730 (width
== MMC_BUS_WIDTH_DDR_8
)));
734 mmc_dev_info
= device_info
;
736 return mmc_enumerate(clk
, width
);