2 * Copyright (c) 2018, 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. */
9 #include <arch_helpers.h>
12 #include <delay_timer.h>
19 #define MMC_DEFAULT_MAX_RETRIES 5
20 #define SEND_OP_COND_MAX_RETRIES 100
22 #define MULT_BY_512K_SHIFT 19
24 static const struct mmc_ops
*ops
;
25 static unsigned int mmc_ocr_value
;
26 static struct mmc_csd_emmc mmc_csd
;
27 static unsigned char mmc_ext_csd
[512] __aligned(16);
28 static unsigned int mmc_flags
;
29 static struct mmc_device_info
*mmc_dev_info
;
30 static unsigned int rca
;
32 static const unsigned char tran_speed_base
[16] = {
33 0, 10, 12, 13, 15, 20, 26, 30, 35, 40, 45, 52, 55, 60, 70, 80
36 static const unsigned char sd_tran_speed_base
[16] = {
37 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80
40 static bool is_cmd23_enabled(void)
42 return ((mmc_flags
& MMC_FLAG_CMD23
) != 0U);
45 static int mmc_send_cmd(unsigned int idx
, unsigned int arg
,
46 unsigned int r_type
, unsigned int *r_data
)
51 zeromem(&cmd
, sizeof(struct mmc_cmd
));
55 cmd
.resp_type
= r_type
;
57 ret
= ops
->send_cmd(&cmd
);
59 if ((ret
== 0) && (r_data
!= NULL
)) {
62 for (i
= 0; i
< 4; i
++) {
63 *r_data
= cmd
.resp_data
[i
];
69 VERBOSE("Send command %u error: %d\n", idx
, ret
);
75 static int mmc_device_state(void)
77 int retries
= MMC_DEFAULT_MAX_RETRIES
;
78 unsigned int resp_data
[4];
84 ERROR("CMD13 failed after %d retries\n",
85 MMC_DEFAULT_MAX_RETRIES
);
89 ret
= mmc_send_cmd(MMC_CMD(13), rca
<< RCA_SHIFT_OFFSET
,
90 MMC_RESPONSE_R1
, &resp_data
[0]);
95 if ((resp_data
[0] & STATUS_SWITCH_ERROR
) != 0U) {
100 } while ((resp_data
[0] & STATUS_READY_FOR_DATA
) == 0U);
102 return MMC_GET_STATE(resp_data
[0]);
105 static int mmc_set_ext_csd(unsigned int ext_cmd
, unsigned int value
)
109 ret
= mmc_send_cmd(MMC_CMD(6),
110 EXTCSD_WRITE_BYTES
| EXTCSD_CMD(ext_cmd
) |
111 EXTCSD_VALUE(value
) | EXTCSD_CMD_SET_NORMAL
,
112 MMC_RESPONSE_R1B
, NULL
);
118 ret
= mmc_device_state();
122 } while (ret
== MMC_STATE_PRG
);
127 static int mmc_sd_switch(unsigned int bus_width
)
130 int retries
= MMC_DEFAULT_MAX_RETRIES
;
131 unsigned int scr
[2] = { 0 };
132 unsigned int bus_width_arg
= 0;
134 ret
= ops
->prepare(0, (uintptr_t)&scr
, sizeof(scr
));
139 /* CMD55: Application Specific Command */
140 ret
= mmc_send_cmd(MMC_CMD(55), rca
<< RCA_SHIFT_OFFSET
,
141 MMC_RESPONSE_R5
, NULL
);
146 /* ACMD51: SEND_SCR */
148 ret
= mmc_send_cmd(MMC_ACMD(51), 0, MMC_RESPONSE_R1
, NULL
);
149 if ((ret
!= 0) && (retries
== 0)) {
150 ERROR("ACMD51 failed after %d retries (ret=%d)\n",
151 MMC_DEFAULT_MAX_RETRIES
, ret
);
158 ret
= ops
->read(0, (uintptr_t)&scr
, sizeof(scr
));
163 if (((scr
[0] & SD_SCR_BUS_WIDTH_4
) != 0U) &&
164 (bus_width
== MMC_BUS_WIDTH_4
)) {
168 /* CMD55: Application Specific Command */
169 ret
= mmc_send_cmd(MMC_CMD(55), rca
<< RCA_SHIFT_OFFSET
,
170 MMC_RESPONSE_R5
, NULL
);
175 /* ACMD6: SET_BUS_WIDTH */
176 ret
= mmc_send_cmd(MMC_ACMD(6), bus_width_arg
, MMC_RESPONSE_R1
, NULL
);
182 ret
= mmc_device_state();
186 } while (ret
== MMC_STATE_PRG
);
191 static int mmc_set_ios(unsigned int clk
, unsigned int bus_width
)
194 unsigned int width
= bus_width
;
196 if (mmc_dev_info
->mmc_dev_type
!= MMC_IS_EMMC
) {
197 if (width
== MMC_BUS_WIDTH_8
) {
198 WARN("Wrong bus config for SD-card, force to 4\n");
199 width
= MMC_BUS_WIDTH_4
;
201 ret
= mmc_sd_switch(width
);
205 } else if (mmc_csd
.spec_vers
== 4U) {
206 ret
= mmc_set_ext_csd(CMD_EXTCSD_BUS_WIDTH
,
207 (unsigned int)width
);
212 VERBOSE("Wrong MMC type or spec version\n");
215 return ops
->set_ios(clk
, width
);
218 static int mmc_fill_device_info(void)
220 unsigned long long c_size
;
221 unsigned int speed_idx
;
222 unsigned int nb_blocks
;
223 unsigned int freq_unit
;
225 struct mmc_csd_sd_v2
*csd_sd_v2
;
227 switch (mmc_dev_info
->mmc_dev_type
) {
229 mmc_dev_info
->block_size
= MMC_BLOCK_SIZE
;
231 ret
= ops
->prepare(0, (uintptr_t)&mmc_ext_csd
,
232 sizeof(mmc_ext_csd
));
237 /* MMC CMD8: SEND_EXT_CSD */
238 ret
= mmc_send_cmd(MMC_CMD(8), 0, MMC_RESPONSE_R1
, NULL
);
243 ret
= ops
->read(0, (uintptr_t)&mmc_ext_csd
,
244 sizeof(mmc_ext_csd
));
250 ret
= mmc_device_state();
254 } while (ret
!= MMC_STATE_TRAN
);
256 nb_blocks
= (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
] << 0) |
257 (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
+ 1] << 8) |
258 (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
+ 2] << 16) |
259 (mmc_ext_csd
[CMD_EXTCSD_SEC_CNT
+ 3] << 24);
261 mmc_dev_info
->device_size
= (unsigned long long)nb_blocks
*
262 mmc_dev_info
->block_size
;
268 * Use the same mmc_csd struct, as required fields here
269 * (READ_BL_LEN, C_SIZE, CSIZE_MULT) are common with eMMC.
271 mmc_dev_info
->block_size
= BIT_32(mmc_csd
.read_bl_len
);
273 c_size
= ((unsigned long long)mmc_csd
.c_size_high
<< 2U) |
274 (unsigned long long)mmc_csd
.c_size_low
;
275 assert(c_size
!= 0xFFFU
);
277 mmc_dev_info
->device_size
= (c_size
+ 1U) *
278 BIT_64(mmc_csd
.c_size_mult
+ 2U) *
279 mmc_dev_info
->block_size
;
284 assert(mmc_csd
.csd_structure
== 1U);
286 mmc_dev_info
->block_size
= MMC_BLOCK_SIZE
;
288 /* Need to use mmc_csd_sd_v2 struct */
289 csd_sd_v2
= (struct mmc_csd_sd_v2
*)&mmc_csd
;
290 c_size
= ((unsigned long long)csd_sd_v2
->c_size_high
<< 16) |
291 (unsigned long long)csd_sd_v2
->c_size_low
;
293 mmc_dev_info
->device_size
= (c_size
+ 1U) << MULT_BY_512K_SHIFT
;
306 speed_idx
= (mmc_csd
.tran_speed
& CSD_TRAN_SPEED_MULT_MASK
) >>
307 CSD_TRAN_SPEED_MULT_SHIFT
;
309 assert(speed_idx
> 0U);
311 if (mmc_dev_info
->mmc_dev_type
== MMC_IS_EMMC
) {
312 mmc_dev_info
->max_bus_freq
= tran_speed_base
[speed_idx
];
314 mmc_dev_info
->max_bus_freq
= sd_tran_speed_base
[speed_idx
];
317 freq_unit
= mmc_csd
.tran_speed
& CSD_TRAN_SPEED_UNIT_MASK
;
318 while (freq_unit
!= 0U) {
319 mmc_dev_info
->max_bus_freq
*= 10U;
323 mmc_dev_info
->max_bus_freq
*= 10000U;
328 static int sd_send_op_cond(void)
331 unsigned int resp_data
[4];
333 for (n
= 0; n
< SEND_OP_COND_MAX_RETRIES
; n
++) {
336 /* CMD55: Application Specific Command */
337 ret
= mmc_send_cmd(MMC_CMD(55), 0, MMC_RESPONSE_R1
, NULL
);
342 /* ACMD41: SD_SEND_OP_COND */
343 ret
= mmc_send_cmd(MMC_ACMD(41), OCR_HCS
, MMC_RESPONSE_R3
,
349 if ((resp_data
[0] & OCR_POWERUP
) != 0U) {
350 mmc_ocr_value
= resp_data
[0];
352 if ((mmc_ocr_value
& OCR_HCS
) != 0U) {
353 mmc_dev_info
->mmc_dev_type
= MMC_IS_SD_HC
;
355 mmc_dev_info
->mmc_dev_type
= MMC_IS_SD
;
364 ERROR("ACMD41 failed after %d retries\n", SEND_OP_COND_MAX_RETRIES
);
369 static int mmc_reset_to_idle(void)
373 /* CMD0: reset to IDLE */
374 ret
= mmc_send_cmd(MMC_CMD(0), 0, 0, NULL
);
384 static int mmc_send_op_cond(void)
387 unsigned int resp_data
[4];
389 ret
= mmc_reset_to_idle();
394 for (n
= 0; n
< SEND_OP_COND_MAX_RETRIES
; n
++) {
395 ret
= mmc_send_cmd(MMC_CMD(1), OCR_SECTOR_MODE
|
396 OCR_VDD_MIN_2V7
| OCR_VDD_MIN_1V7
,
397 MMC_RESPONSE_R3
, &resp_data
[0]);
402 if ((resp_data
[0] & OCR_POWERUP
) != 0U) {
403 mmc_ocr_value
= resp_data
[0];
410 ERROR("CMD1 failed after %d retries\n", SEND_OP_COND_MAX_RETRIES
);
415 static int mmc_enumerate(unsigned int clk
, unsigned int bus_width
)
418 unsigned int resp_data
[4];
422 ret
= mmc_reset_to_idle();
427 if (mmc_dev_info
->mmc_dev_type
== MMC_IS_EMMC
) {
428 ret
= mmc_send_op_cond();
430 /* CMD8: Send Interface Condition Command */
431 ret
= mmc_send_cmd(MMC_CMD(8), VHS_2_7_3_6_V
| CMD8_CHECK_PATTERN
,
432 MMC_RESPONSE_R5
, &resp_data
[0]);
434 if ((ret
== 0) && ((resp_data
[0] & 0xffU
) == CMD8_CHECK_PATTERN
)) {
435 ret
= sd_send_op_cond();
442 /* CMD2: Card Identification */
443 ret
= mmc_send_cmd(MMC_CMD(2), 0, MMC_RESPONSE_R2
, NULL
);
448 /* CMD3: Set Relative Address */
449 if (mmc_dev_info
->mmc_dev_type
== MMC_IS_EMMC
) {
451 ret
= mmc_send_cmd(MMC_CMD(3), rca
<< RCA_SHIFT_OFFSET
,
452 MMC_RESPONSE_R1
, NULL
);
457 ret
= mmc_send_cmd(MMC_CMD(3), 0,
458 MMC_RESPONSE_R6
, &resp_data
[0]);
463 rca
= (resp_data
[0] & 0xFFFF0000U
) >> 16;
466 /* CMD9: CSD Register */
467 ret
= mmc_send_cmd(MMC_CMD(9), rca
<< RCA_SHIFT_OFFSET
,
468 MMC_RESPONSE_R2
, &resp_data
[0]);
473 memcpy(&mmc_csd
, &resp_data
, sizeof(resp_data
));
475 /* CMD7: Select Card */
476 ret
= mmc_send_cmd(MMC_CMD(7), rca
<< RCA_SHIFT_OFFSET
,
477 MMC_RESPONSE_R1
, NULL
);
483 ret
= mmc_device_state();
487 } while (ret
!= MMC_STATE_TRAN
);
489 ret
= mmc_set_ios(clk
, bus_width
);
494 return mmc_fill_device_info();
497 size_t mmc_read_blocks(int lba
, uintptr_t buf
, size_t size
)
500 unsigned int cmd_idx
, cmd_arg
;
502 assert((ops
!= NULL
) &&
503 (ops
->read
!= NULL
) &&
505 ((size
& MMC_BLOCK_MASK
) == 0U));
507 ret
= ops
->prepare(lba
, buf
, size
);
512 if (is_cmd23_enabled()) {
513 /* Set block count */
514 ret
= mmc_send_cmd(MMC_CMD(23), size
/ MMC_BLOCK_SIZE
,
515 MMC_RESPONSE_R1
, NULL
);
520 cmd_idx
= MMC_CMD(18);
522 if (size
> MMC_BLOCK_SIZE
) {
523 cmd_idx
= MMC_CMD(18);
525 cmd_idx
= MMC_CMD(17);
529 if (((mmc_ocr_value
& OCR_ACCESS_MODE_MASK
) == OCR_BYTE_MODE
) &&
530 (mmc_dev_info
->mmc_dev_type
!= MMC_IS_SD_HC
)) {
531 cmd_arg
= lba
* MMC_BLOCK_SIZE
;
536 ret
= mmc_send_cmd(cmd_idx
, cmd_arg
, MMC_RESPONSE_R1
, NULL
);
541 ret
= ops
->read(lba
, buf
, size
);
546 /* Wait buffer empty */
548 ret
= mmc_device_state();
552 } while ((ret
!= MMC_STATE_TRAN
) && (ret
!= MMC_STATE_DATA
));
554 if (!is_cmd23_enabled() && (size
> MMC_BLOCK_SIZE
)) {
555 ret
= mmc_send_cmd(MMC_CMD(12), 0, MMC_RESPONSE_R1B
, NULL
);
564 size_t mmc_write_blocks(int lba
, const uintptr_t buf
, size_t size
)
567 unsigned int cmd_idx
, cmd_arg
;
569 assert((ops
!= NULL
) &&
570 (ops
->write
!= NULL
) &&
572 ((buf
& MMC_BLOCK_MASK
) == 0U) &&
573 ((size
& MMC_BLOCK_MASK
) == 0U));
575 ret
= ops
->prepare(lba
, buf
, size
);
580 if (is_cmd23_enabled()) {
581 /* Set block count */
582 ret
= mmc_send_cmd(MMC_CMD(23), size
/ MMC_BLOCK_SIZE
,
583 MMC_RESPONSE_R1
, NULL
);
588 cmd_idx
= MMC_CMD(25);
590 if (size
> MMC_BLOCK_SIZE
) {
591 cmd_idx
= MMC_CMD(25);
593 cmd_idx
= MMC_CMD(24);
597 if ((mmc_ocr_value
& OCR_ACCESS_MODE_MASK
) == OCR_BYTE_MODE
) {
598 cmd_arg
= lba
* MMC_BLOCK_SIZE
;
603 ret
= mmc_send_cmd(cmd_idx
, cmd_arg
, MMC_RESPONSE_R1
, NULL
);
608 ret
= ops
->write(lba
, buf
, size
);
613 /* Wait buffer empty */
615 ret
= mmc_device_state();
619 } while ((ret
!= MMC_STATE_TRAN
) && (ret
!= MMC_STATE_RCV
));
621 if (!is_cmd23_enabled() && (size
> MMC_BLOCK_SIZE
)) {
622 ret
= mmc_send_cmd(MMC_CMD(12), 0, MMC_RESPONSE_R1B
, NULL
);
631 size_t mmc_erase_blocks(int lba
, size_t size
)
636 assert((size
!= 0U) && ((size
& MMC_BLOCK_MASK
) == 0U));
638 ret
= mmc_send_cmd(MMC_CMD(35), lba
, MMC_RESPONSE_R1
, NULL
);
643 ret
= mmc_send_cmd(MMC_CMD(36), lba
+ (size
/ MMC_BLOCK_SIZE
) - 1U,
644 MMC_RESPONSE_R1
, NULL
);
649 ret
= mmc_send_cmd(MMC_CMD(38), lba
, MMC_RESPONSE_R1B
, NULL
);
655 ret
= mmc_device_state();
659 } while (ret
!= MMC_STATE_TRAN
);
664 static inline void mmc_rpmb_enable(void)
666 mmc_set_ext_csd(CMD_EXTCSD_PARTITION_CONFIG
,
667 PART_CFG_BOOT_PARTITION1_ENABLE
|
668 PART_CFG_PARTITION1_ACCESS
);
671 static inline void mmc_rpmb_disable(void)
673 mmc_set_ext_csd(CMD_EXTCSD_PARTITION_CONFIG
,
674 PART_CFG_BOOT_PARTITION1_ENABLE
);
677 size_t mmc_rpmb_read_blocks(int lba
, uintptr_t buf
, size_t size
)
682 size_read
= mmc_read_blocks(lba
, buf
, size
);
688 size_t mmc_rpmb_write_blocks(int lba
, const uintptr_t buf
, size_t size
)
693 size_written
= mmc_write_blocks(lba
, buf
, size
);
699 size_t mmc_rpmb_erase_blocks(int lba
, size_t size
)
704 size_erased
= mmc_erase_blocks(lba
, size
);
710 int mmc_init(const struct mmc_ops
*ops_ptr
, unsigned int clk
,
711 unsigned int width
, unsigned int flags
,
712 struct mmc_device_info
*device_info
)
714 assert((ops_ptr
!= NULL
) &&
715 (ops_ptr
->init
!= NULL
) &&
716 (ops_ptr
->send_cmd
!= NULL
) &&
717 (ops_ptr
->set_ios
!= NULL
) &&
718 (ops_ptr
->prepare
!= NULL
) &&
719 (ops_ptr
->read
!= NULL
) &&
720 (ops_ptr
->write
!= NULL
) &&
721 (device_info
!= NULL
) &&
723 ((width
== MMC_BUS_WIDTH_1
) ||
724 (width
== MMC_BUS_WIDTH_4
) ||
725 (width
== MMC_BUS_WIDTH_8
) ||
726 (width
== MMC_BUS_WIDTH_DDR_4
) ||
727 (width
== MMC_BUS_WIDTH_DDR_8
)));
731 mmc_dev_info
= device_info
;
733 return mmc_enumerate(clk
, width
);