2 * Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
7 #include <common/debug.h>
10 #include "emmc_config.h"
13 #include "emmc_registers.h"
15 #include "micro_delay.h"
18 static EMMC_ERROR_CODE
emmc_clock_ctrl(uint8_t mode
);
19 static EMMC_ERROR_CODE
emmc_card_init(void);
20 static EMMC_ERROR_CODE
emmc_high_speed(void);
21 static EMMC_ERROR_CODE
emmc_bus_width(uint32_t width
);
22 static uint32_t emmc_set_timeout_register_value(uint32_t freq
);
23 static void set_sd_clk(uint32_t clkDiv
);
24 static uint32_t emmc_calc_tran_speed(uint32_t *freq
);
25 static void emmc_get_partition_access(void);
26 static void emmc_set_bootpartition(void);
28 static void emmc_set_bootpartition(void)
32 reg
= mmio_read_32(RCAR_PRR
) & (RCAR_PRODUCT_MASK
| RCAR_CUT_MASK
);
33 if (reg
== RCAR_PRODUCT_M3_CUT10
) {
34 mmc_drv_obj
.boot_partition_en
=
35 (EMMC_PARTITION_ID
) ((mmc_drv_obj
.ext_csd_data
[179] &
36 EMMC_BOOT_PARTITION_EN_MASK
) >>
37 EMMC_BOOT_PARTITION_EN_SHIFT
);
38 } else if ((reg
== RCAR_PRODUCT_H3_CUT20
)
39 || (reg
== RCAR_PRODUCT_M3_CUT11
)) {
40 mmc_drv_obj
.boot_partition_en
= mmc_drv_obj
.partition_access
;
42 if ((mmio_read_32(MFISBTSTSR
) & MFISBTSTSR_BOOT_PARTITION
) !=
44 mmc_drv_obj
.boot_partition_en
= PARTITION_ID_BOOT_2
;
46 mmc_drv_obj
.boot_partition_en
= PARTITION_ID_BOOT_1
;
51 static EMMC_ERROR_CODE
emmc_card_init(void)
54 uint32_t freq
= MMC_400KHZ
; /* 390KHz */
55 EMMC_ERROR_CODE result
;
59 if ((mmc_drv_obj
.initialize
!= TRUE
)
60 || (mmc_drv_obj
.card_power_enable
!= TRUE
)
61 || ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0)
63 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
, EMMC_ERR_STATE
);
64 return EMMC_ERR_STATE
;
67 /* clock on (force change) */
68 mmc_drv_obj
.current_freq
= 0;
69 mmc_drv_obj
.max_freq
= MMC_20MHZ
;
70 result
= emmc_set_request_mmc_clock(&freq
);
71 if (result
!= EMMC_SUCCESS
) {
72 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
76 rcar_micro_delay(1000U); /* wait 1ms */
78 /* Get current access partition */
79 emmc_get_partition_access();
81 /* CMD0, arg=0x00000000 */
82 result
= emmc_send_idle_cmd(0x00000000);
83 if (result
!= EMMC_SUCCESS
) {
84 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
88 rcar_micro_delay(200U); /* wait 74clock 390kHz(189.74us) */
91 emmc_make_nontrans_cmd(CMD1_SEND_OP_COND
, EMMC_HOST_OCR_VALUE
);
92 for (retry
= 300; retry
> 0; retry
--) {
94 emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
95 if (result
!= EMMC_SUCCESS
) {
96 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
100 if ((mmc_drv_obj
.r3_ocr
& EMMC_OCR_STATUS_BIT
) != 0) {
101 break; /* card is ready. exit loop */
103 rcar_micro_delay(1000U); /* wait 1ms */
107 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
, EMMC_ERR_TIMEOUT
);
108 return EMMC_ERR_TIMEOUT
;
111 switch (mmc_drv_obj
.r3_ocr
& EMMC_OCR_ACCESS_MODE_MASK
) {
112 case EMMC_OCR_ACCESS_MODE_SECT
:
113 mmc_drv_obj
.access_mode
= TRUE
; /* sector mode */
117 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
, EMMC_ERR
);
122 emmc_make_nontrans_cmd(CMD2_ALL_SEND_CID_MMC
, 0x00000000);
123 mmc_drv_obj
.response
= (uint32_t *) (&mmc_drv_obj
.cid_data
[0]); /* use CID special buffer */
124 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
125 if (result
!= EMMC_SUCCESS
) {
126 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
131 emmc_make_nontrans_cmd(CMD3_SET_RELATIVE_ADDR
, EMMC_RCA
<< 16);
132 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
133 if (result
!= EMMC_SUCCESS
) {
134 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
139 emmc_make_nontrans_cmd(CMD9_SEND_CSD
, EMMC_RCA
<< 16);
140 mmc_drv_obj
.response
= (uint32_t *) (&mmc_drv_obj
.csd_data
[0]); /* use CSD special buffer */
141 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
142 if (result
!= EMMC_SUCCESS
) {
143 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
147 /* card version check */
148 if (EMMC_CSD_SPEC_VARS() < 4) {
149 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
,
150 EMMC_ERR_ILLEGAL_CARD
);
151 return EMMC_ERR_ILLEGAL_CARD
;
154 /* CMD7 (select card) */
155 emmc_make_nontrans_cmd(CMD7_SELECT_CARD
, EMMC_RCA
<< 16);
156 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
157 if (result
!= EMMC_SUCCESS
) {
158 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
162 mmc_drv_obj
.selected
= TRUE
;
164 /* card speed check */
165 resultCalc
= emmc_calc_tran_speed(&freq
); /* Card spec is calculated from TRAN_SPEED(CSD). */
166 if (resultCalc
== 0) {
167 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
,
168 EMMC_ERR_ILLEGAL_CARD
);
169 return EMMC_ERR_ILLEGAL_CARD
;
171 mmc_drv_obj
.max_freq
= freq
; /* max frequency (card spec) */
173 result
= emmc_set_request_mmc_clock(&freq
);
174 if (result
!= EMMC_SUCCESS
) {
175 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
179 /* set read/write timeout */
180 mmc_drv_obj
.data_timeout
= emmc_set_timeout_register_value(freq
);
182 ((GETR_32(SD_OPTION
) & ~(SD_OPTION_TIMEOUT_CNT_MASK
)) |
183 mmc_drv_obj
.data_timeout
));
185 /* SET_BLOCKLEN(512byte) */
187 emmc_make_nontrans_cmd(CMD16_SET_BLOCKLEN
, EMMC_BLOCK_LENGTH
);
188 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
189 if (result
!= EMMC_SUCCESS
) {
190 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
194 /* Transfer Data Length */
195 SETR_32(SD_SIZE
, EMMC_BLOCK_LENGTH
);
198 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000,
199 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
200 EMMC_MAX_EXT_CSD_LENGTH
, HAL_MEMCARD_READ
,
201 HAL_MEMCARD_NOT_DMA
);
202 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
203 if (result
!= EMMC_SUCCESS
) {
204 /* CMD12 is not send.
205 * If BUS initialization is failed, user must be execute Bus initialization again.
206 * Bus initialization is start CMD0(soft reset command).
208 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
212 /* Set boot partition */
213 emmc_set_bootpartition();
218 static EMMC_ERROR_CODE
emmc_high_speed(void)
220 uint32_t freq
; /**< High speed mode clock frequency */
221 EMMC_ERROR_CODE result
;
225 if (mmc_drv_obj
.selected
!= TRUE
) {
226 emmc_write_error_info(EMMC_FUNCNO_HIGH_SPEED
, EMMC_ERR_STATE
);
227 return EMMC_ERR_STATE
;
231 cardType
= (uint8_t) mmc_drv_obj
.ext_csd_data
[EMMC_EXT_CSD_CARD_TYPE
];
232 if ((cardType
& EMMC_EXT_CSD_CARD_TYPE_52MHZ
) != 0)
234 else if ((cardType
& EMMC_EXT_CSD_CARD_TYPE_26MHZ
) != 0)
239 /* Hi-Speed-mode selction */
240 if ((MMC_52MHZ
== freq
) || (MMC_26MHZ
== freq
)) {
242 emmc_make_nontrans_cmd(CMD6_SWITCH
, EMMC_SWITCH_HS_TIMING
);
244 emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
245 if (result
!= EMMC_SUCCESS
) {
246 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
250 mmc_drv_obj
.hs_timing
= TIMING_HIGH_SPEED
; /* High-Speed */
254 mmc_drv_obj
.max_freq
= freq
;
255 result
= emmc_set_request_mmc_clock(&freq
);
256 if (result
!= EMMC_SUCCESS
) {
257 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
261 /* set read/write timeout */
262 mmc_drv_obj
.data_timeout
= emmc_set_timeout_register_value(freq
);
264 ((GETR_32(SD_OPTION
) & ~(SD_OPTION_TIMEOUT_CNT_MASK
)) |
265 mmc_drv_obj
.data_timeout
));
268 emmc_make_nontrans_cmd(CMD13_SEND_STATUS
, EMMC_RCA
<< 16);
270 emmc_exec_cmd(EMMC_R1_ERROR_MASK_WITHOUT_CRC
, mmc_drv_obj
.response
);
271 if (result
!= EMMC_SUCCESS
) {
272 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
279 static EMMC_ERROR_CODE
emmc_clock_ctrl(uint8_t mode
)
284 if ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0) {
285 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
,
293 ((GETR_32(SD_CLK_CTRL
) | MMC_SD_CLK_START
) &
295 SETR_32(SD_CLK_CTRL
, value
); /* on */
296 mmc_drv_obj
.clock_enable
= TRUE
;
300 ((GETR_32(SD_CLK_CTRL
) & MMC_SD_CLK_STOP
) &
302 SETR_32(SD_CLK_CTRL
, value
); /* off */
303 mmc_drv_obj
.clock_enable
= FALSE
;
309 static EMMC_ERROR_CODE
emmc_bus_width(uint32_t width
)
311 EMMC_ERROR_CODE result
= EMMC_ERR
;
313 /* parameter check */
314 if ((width
!= 8) && (width
!= 4) && (width
!= 1)) {
315 emmc_write_error_info(EMMC_FUNCNO_BUS_WIDTH
, EMMC_ERR_PARAM
);
316 return EMMC_ERR_PARAM
;
320 if (mmc_drv_obj
.selected
!= TRUE
) {
321 emmc_write_error_info(EMMC_FUNCNO_BUS_WIDTH
, EMMC_ERR_STATE
);
322 return EMMC_ERR_STATE
;
325 mmc_drv_obj
.bus_width
= (HAL_MEMCARD_DATA_WIDTH
) (width
>> 2); /* 2 = 8bit, 1 = 4bit, 0 =1bit */
328 emmc_make_nontrans_cmd(CMD6_SWITCH
,
329 (EMMC_SWITCH_BUS_WIDTH_1
|
330 (mmc_drv_obj
.bus_width
<< 8)));
331 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
332 if (result
!= EMMC_SUCCESS
) {
334 mmc_drv_obj
.bus_width
= HAL_MEMCARD_DATA_WIDTH_1_BIT
;
338 switch (mmc_drv_obj
.bus_width
) {
339 case HAL_MEMCARD_DATA_WIDTH_1_BIT
:
341 ((GETR_32(SD_OPTION
) & ~(BIT15
| BIT13
)) | BIT15
));
343 case HAL_MEMCARD_DATA_WIDTH_4_BIT
:
344 SETR_32(SD_OPTION
, (GETR_32(SD_OPTION
) & ~(BIT15
| BIT13
)));
346 case HAL_MEMCARD_DATA_WIDTH_8_BIT
:
348 ((GETR_32(SD_OPTION
) & ~(BIT15
| BIT13
)) | BIT13
));
355 emmc_make_nontrans_cmd(CMD13_SEND_STATUS
, EMMC_RCA
<< 16);
356 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
357 if (result
!= EMMC_SUCCESS
) {
362 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000,
363 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
364 EMMC_MAX_EXT_CSD_LENGTH
, HAL_MEMCARD_READ
,
365 HAL_MEMCARD_NOT_DMA
);
366 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
367 if (result
!= EMMC_SUCCESS
) {
375 emmc_write_error_info(EMMC_FUNCNO_BUS_WIDTH
, result
);
376 ERROR("BL2: emmc bus_width error end\n");
380 EMMC_ERROR_CODE
emmc_select_partition(EMMC_PARTITION_ID id
)
382 EMMC_ERROR_CODE result
;
384 uint32_t partition_config
;
387 if (mmc_drv_obj
.mount
!= TRUE
) {
388 emmc_write_error_info(EMMC_FUNCNO_NONE
, EMMC_ERR_STATE
);
389 return EMMC_ERR_STATE
;
392 /* id = PARTITION_ACCESS(Bit[2:0]) */
393 if ((id
& ~PARTITION_ID_MASK
) != 0) {
394 emmc_write_error_info(EMMC_FUNCNO_NONE
, EMMC_ERR_PARAM
);
395 return EMMC_ERR_PARAM
;
398 /* EXT_CSD[179] value */
400 (uint32_t) mmc_drv_obj
.ext_csd_data
[EMMC_EXT_CSD_PARTITION_CONFIG
];
401 if ((partition_config
& PARTITION_ID_MASK
) == id
) {
402 result
= EMMC_SUCCESS
;
406 (uint32_t) ((partition_config
& ~PARTITION_ID_MASK
) | id
);
407 arg
= EMMC_SWITCH_PARTITION_CONFIG
| (partition_config
<< 8);
409 result
= emmc_set_ext_csd(arg
);
415 static void set_sd_clk(uint32_t clkDiv
)
419 dataL
= (GETR_32(SD_CLK_CTRL
) & (~SD_CLK_CTRL_CLKDIV_MASK
));
423 dataL
|= 0x000000FFU
;
426 dataL
|= 0x00000000U
;
429 dataL
|= 0x00000001U
;
432 dataL
|= 0x00000002U
;
435 dataL
|= 0x00000004U
;
438 dataL
|= 0x00000008U
;
441 dataL
|= 0x00000010U
;
444 dataL
|= 0x00000020U
;
447 dataL
|= 0x00000040U
;
450 dataL
|= 0x00000080U
;
454 SETR_32(SD_CLK_CTRL
, dataL
);
455 mmc_drv_obj
.current_freq
= (uint32_t) clkDiv
;
458 static void emmc_get_partition_access(void)
461 EMMC_ERROR_CODE result
;
463 reg
= mmio_read_32(RCAR_PRR
) & (RCAR_PRODUCT_MASK
| RCAR_CUT_MASK
);
464 if ((reg
== RCAR_PRODUCT_H3_CUT20
) || (reg
== RCAR_PRODUCT_M3_CUT11
)) {
465 SETR_32(SD_OPTION
, 0x000060EEU
); /* 8 bits width */
467 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000U
,
468 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
469 EMMC_MAX_EXT_CSD_LENGTH
,
470 HAL_MEMCARD_READ
, HAL_MEMCARD_NOT_DMA
);
471 mmc_drv_obj
.get_partition_access_flag
= TRUE
;
473 emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
474 mmc_drv_obj
.get_partition_access_flag
= FALSE
;
475 if (result
== EMMC_SUCCESS
) {
476 mmc_drv_obj
.partition_access
=
477 (EMMC_PARTITION_ID
) (mmc_drv_obj
.ext_csd_data
[179]
478 & PARTITION_ID_MASK
);
479 } else if (result
== EMMC_ERR_CMD_TIMEOUT
) {
480 mmc_drv_obj
.partition_access
= PARTITION_ID_BOOT_1
;
482 emmc_write_error_info(EMMC_FUNCNO_GET_PERTITION_ACCESS
,
486 SETR_32(SD_OPTION
, 0x0000C0EEU
); /* Initialize */
490 static uint32_t emmc_calc_tran_speed(uint32_t *freq
)
492 const uint32_t unit
[8] = { 10000, 100000, 1000000, 10000000,
493 0, 0, 0, 0 }; /**< frequency unit (1/10) */
494 const uint32_t mult
[16] = { 0, 10, 12, 13, 15, 20, 26, 30, 35, 40, 45,
495 52, 55, 60, 70, 80 };
499 uint32_t tran_speed
= EMMC_CSD_TRAN_SPEED();
502 * unit[tran_speed&0x7] = uint[0x2] = 1000000
503 * mult[(tran_speed&0x78)>>3] = mult[0x30>>3] = mult[6] = 26
504 * 1000000 * 26 = 26000000 (26MHz)
509 unit
[tran_speed
& EMMC_TRANSPEED_FREQ_UNIT_MASK
] *
510 mult
[(tran_speed
& EMMC_TRANSPEED_MULT_MASK
) >>
511 EMMC_TRANSPEED_MULT_SHIFT
];
515 } else if (MMC_FREQ_52MHZ
<= maxFreq
)
517 else if (MMC_FREQ_26MHZ
<= maxFreq
)
519 else if (MMC_FREQ_20MHZ
<= maxFreq
)
527 static uint32_t emmc_set_timeout_register_value(uint32_t freq
)
529 uint32_t timeoutCnt
; /* SD_OPTION - Timeout Counter */
534 break; /* SDCLK * 2^27 */
537 break; /* SDCLK * 2^27 */
540 break; /* SDCLK * 2^26 */
543 break; /* SDCLK * 2^25 */
546 break; /* SDCLK * 2^24 */
549 break; /* SDCLK * 2^23 */
552 break; /* SDCLK * 2^22 */
555 break; /* SDCLK * 2^21 */
558 break; /* SDCLK * 2^20 */
561 break; /* SDCLK * 2^20 */
564 break; /* SDCLK * 2^27 */
570 EMMC_ERROR_CODE
emmc_set_ext_csd(uint32_t arg
)
572 EMMC_ERROR_CODE result
;
575 emmc_make_nontrans_cmd(CMD6_SWITCH
, arg
);
576 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
577 if (result
!= EMMC_SUCCESS
) {
582 emmc_make_nontrans_cmd(CMD13_SEND_STATUS
, EMMC_RCA
<< 16);
583 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
584 if (result
!= EMMC_SUCCESS
) {
589 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000,
590 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
591 EMMC_MAX_EXT_CSD_LENGTH
, HAL_MEMCARD_READ
,
592 HAL_MEMCARD_NOT_DMA
);
593 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
594 if (result
!= EMMC_SUCCESS
) {
600 EMMC_ERROR_CODE
emmc_set_request_mmc_clock(uint32_t *freq
)
602 /* parameter check */
604 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
, EMMC_ERR_PARAM
);
605 return EMMC_ERR_PARAM
;
609 if ((mmc_drv_obj
.initialize
!= TRUE
)
610 || (mmc_drv_obj
.card_power_enable
!= TRUE
)) {
611 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
, EMMC_ERR_STATE
);
612 return EMMC_ERR_STATE
;
615 /* clock is already running in the desired frequency. */
616 if ((mmc_drv_obj
.clock_enable
== TRUE
)
617 && (mmc_drv_obj
.current_freq
== *freq
)) {
622 if ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0) {
623 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
,
629 mmc_drv_obj
.clock_enable
= FALSE
;
631 return emmc_clock_ctrl(TRUE
); /* clock on */
634 EMMC_ERROR_CODE
rcar_emmc_mount(void)
636 EMMC_ERROR_CODE result
;
639 if ((mmc_drv_obj
.initialize
!= TRUE
)
640 || (mmc_drv_obj
.card_power_enable
!= TRUE
)
641 || ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0)
643 emmc_write_error_info(EMMC_FUNCNO_MOUNT
, EMMC_ERR_STATE
);
644 return EMMC_ERR_STATE
;
647 /* initialize card (IDLE state --> Transfer state) */
648 result
= emmc_card_init();
649 if (result
!= EMMC_SUCCESS
) {
650 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
651 if (emmc_clock_ctrl(FALSE
) != EMMC_SUCCESS
) {
657 /* Switching high speed mode */
658 result
= emmc_high_speed();
659 if (result
!= EMMC_SUCCESS
) {
660 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
661 if (emmc_clock_ctrl(FALSE
) != EMMC_SUCCESS
) {
667 /* Changing the data bus width */
668 result
= emmc_bus_width(8);
669 if (result
!= EMMC_SUCCESS
) {
670 emmc_write_error_info_func_no(EMMC_FUNCNO_BUS_WIDTH
);
671 if (emmc_clock_ctrl(FALSE
) != EMMC_SUCCESS
) {
678 mmc_drv_obj
.mount
= TRUE
;