2 * Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
9 #include "emmc_config.h"
12 #include "emmc_registers.h"
14 #include "micro_delay.h"
17 static EMMC_ERROR_CODE
emmc_clock_ctrl(uint8_t mode
);
18 static EMMC_ERROR_CODE
emmc_card_init(void);
19 static EMMC_ERROR_CODE
emmc_high_speed(void);
20 static EMMC_ERROR_CODE
emmc_bus_width(uint32_t width
);
21 static uint32_t emmc_set_timeout_register_value(uint32_t freq
);
22 static void set_sd_clk(uint32_t clkDiv
);
23 static uint32_t emmc_calc_tran_speed(uint32_t *freq
);
24 static void emmc_get_partition_access(void);
25 static void emmc_set_bootpartition(void);
27 static void emmc_set_bootpartition(void)
31 reg
= mmio_read_32(RCAR_PRR
) & (RCAR_PRODUCT_MASK
| RCAR_CUT_MASK
);
32 if (reg
== RCAR_PRODUCT_M3_CUT10
) {
33 mmc_drv_obj
.boot_partition_en
=
34 (EMMC_PARTITION_ID
) ((mmc_drv_obj
.ext_csd_data
[179] &
35 EMMC_BOOT_PARTITION_EN_MASK
) >>
36 EMMC_BOOT_PARTITION_EN_SHIFT
);
37 } else if ((reg
== RCAR_PRODUCT_H3_CUT20
)
38 || (reg
== RCAR_PRODUCT_M3_CUT11
)) {
39 mmc_drv_obj
.boot_partition_en
= mmc_drv_obj
.partition_access
;
41 if ((mmio_read_32(MFISBTSTSR
) & MFISBTSTSR_BOOT_PARTITION
) !=
43 mmc_drv_obj
.boot_partition_en
= PARTITION_ID_BOOT_2
;
45 mmc_drv_obj
.boot_partition_en
= PARTITION_ID_BOOT_1
;
50 static EMMC_ERROR_CODE
emmc_card_init(void)
53 uint32_t freq
= MMC_400KHZ
; /* 390KHz */
54 EMMC_ERROR_CODE result
;
58 if ((mmc_drv_obj
.initialize
!= TRUE
)
59 || (mmc_drv_obj
.card_power_enable
!= TRUE
)
60 || ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0)
62 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
, EMMC_ERR_STATE
);
63 return EMMC_ERR_STATE
;
66 /* clock on (force change) */
67 mmc_drv_obj
.current_freq
= 0;
68 mmc_drv_obj
.max_freq
= MMC_20MHZ
;
69 result
= emmc_set_request_mmc_clock(&freq
);
70 if (result
!= EMMC_SUCCESS
) {
71 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
75 rcar_micro_delay(1000U); /* wait 1ms */
77 /* Get current access partition */
78 emmc_get_partition_access();
80 /* CMD0, arg=0x00000000 */
81 result
= emmc_send_idle_cmd(0x00000000);
82 if (result
!= EMMC_SUCCESS
) {
83 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
87 rcar_micro_delay(200U); /* wait 74clock 390kHz(189.74us) */
90 emmc_make_nontrans_cmd(CMD1_SEND_OP_COND
, EMMC_HOST_OCR_VALUE
);
91 for (retry
= 300; retry
> 0; retry
--) {
93 emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
94 if (result
!= EMMC_SUCCESS
) {
95 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
99 if ((mmc_drv_obj
.r3_ocr
& EMMC_OCR_STATUS_BIT
) != 0) {
100 break; /* card is ready. exit loop */
102 rcar_micro_delay(1000U); /* wait 1ms */
106 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
, EMMC_ERR_TIMEOUT
);
107 return EMMC_ERR_TIMEOUT
;
110 switch (mmc_drv_obj
.r3_ocr
& EMMC_OCR_ACCESS_MODE_MASK
) {
111 case EMMC_OCR_ACCESS_MODE_SECT
:
112 mmc_drv_obj
.access_mode
= TRUE
; /* sector mode */
116 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
, EMMC_ERR
);
121 emmc_make_nontrans_cmd(CMD2_ALL_SEND_CID_MMC
, 0x00000000);
122 mmc_drv_obj
.response
= (uint32_t *) (&mmc_drv_obj
.cid_data
[0]); /* use CID special buffer */
123 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
124 if (result
!= EMMC_SUCCESS
) {
125 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
130 emmc_make_nontrans_cmd(CMD3_SET_RELATIVE_ADDR
, EMMC_RCA
<< 16);
131 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
132 if (result
!= EMMC_SUCCESS
) {
133 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
138 emmc_make_nontrans_cmd(CMD9_SEND_CSD
, EMMC_RCA
<< 16);
139 mmc_drv_obj
.response
= (uint32_t *) (&mmc_drv_obj
.csd_data
[0]); /* use CSD special buffer */
140 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
141 if (result
!= EMMC_SUCCESS
) {
142 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
146 /* card version check */
147 if (EMMC_CSD_SPEC_VARS() < 4) {
148 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
,
149 EMMC_ERR_ILLEGAL_CARD
);
150 return EMMC_ERR_ILLEGAL_CARD
;
153 /* CMD7 (select card) */
154 emmc_make_nontrans_cmd(CMD7_SELECT_CARD
, EMMC_RCA
<< 16);
155 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
156 if (result
!= EMMC_SUCCESS
) {
157 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
161 mmc_drv_obj
.selected
= TRUE
;
163 /* card speed check */
164 resultCalc
= emmc_calc_tran_speed(&freq
); /* Card spec is calculated from TRAN_SPEED(CSD). */
165 if (resultCalc
== 0) {
166 emmc_write_error_info(EMMC_FUNCNO_CARD_INIT
,
167 EMMC_ERR_ILLEGAL_CARD
);
168 return EMMC_ERR_ILLEGAL_CARD
;
170 mmc_drv_obj
.max_freq
= freq
; /* max frequency (card spec) */
172 result
= emmc_set_request_mmc_clock(&freq
);
173 if (result
!= EMMC_SUCCESS
) {
174 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
178 /* set read/write timeout */
179 mmc_drv_obj
.data_timeout
= emmc_set_timeout_register_value(freq
);
181 ((GETR_32(SD_OPTION
) & ~(SD_OPTION_TIMEOUT_CNT_MASK
)) |
182 mmc_drv_obj
.data_timeout
));
184 /* SET_BLOCKLEN(512byte) */
186 emmc_make_nontrans_cmd(CMD16_SET_BLOCKLEN
, EMMC_BLOCK_LENGTH
);
187 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
188 if (result
!= EMMC_SUCCESS
) {
189 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
193 /* Transfer Data Length */
194 SETR_32(SD_SIZE
, EMMC_BLOCK_LENGTH
);
197 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000,
198 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
199 EMMC_MAX_EXT_CSD_LENGTH
, HAL_MEMCARD_READ
,
200 HAL_MEMCARD_NOT_DMA
);
201 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
202 if (result
!= EMMC_SUCCESS
) {
203 /* CMD12 is not send.
204 * If BUS initialization is failed, user must be execute Bus initialization again.
205 * Bus initialization is start CMD0(soft reset command).
207 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
211 /* Set boot partition */
212 emmc_set_bootpartition();
217 static EMMC_ERROR_CODE
emmc_high_speed(void)
219 uint32_t freq
; /**< High speed mode clock frequency */
220 EMMC_ERROR_CODE result
;
224 if (mmc_drv_obj
.selected
!= TRUE
) {
225 emmc_write_error_info(EMMC_FUNCNO_HIGH_SPEED
, EMMC_ERR_STATE
);
226 return EMMC_ERR_STATE
;
230 cardType
= (uint8_t) mmc_drv_obj
.ext_csd_data
[EMMC_EXT_CSD_CARD_TYPE
];
231 if ((cardType
& EMMC_EXT_CSD_CARD_TYPE_52MHZ
) != 0)
233 else if ((cardType
& EMMC_EXT_CSD_CARD_TYPE_26MHZ
) != 0)
238 /* Hi-Speed-mode selction */
239 if ((MMC_52MHZ
== freq
) || (MMC_26MHZ
== freq
)) {
241 emmc_make_nontrans_cmd(CMD6_SWITCH
, EMMC_SWITCH_HS_TIMING
);
243 emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
244 if (result
!= EMMC_SUCCESS
) {
245 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
249 mmc_drv_obj
.hs_timing
= TIMING_HIGH_SPEED
; /* High-Speed */
253 mmc_drv_obj
.max_freq
= freq
;
254 result
= emmc_set_request_mmc_clock(&freq
);
255 if (result
!= EMMC_SUCCESS
) {
256 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
260 /* set read/write timeout */
261 mmc_drv_obj
.data_timeout
= emmc_set_timeout_register_value(freq
);
263 ((GETR_32(SD_OPTION
) & ~(SD_OPTION_TIMEOUT_CNT_MASK
)) |
264 mmc_drv_obj
.data_timeout
));
267 emmc_make_nontrans_cmd(CMD13_SEND_STATUS
, EMMC_RCA
<< 16);
269 emmc_exec_cmd(EMMC_R1_ERROR_MASK_WITHOUT_CRC
, mmc_drv_obj
.response
);
270 if (result
!= EMMC_SUCCESS
) {
271 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
278 static EMMC_ERROR_CODE
emmc_clock_ctrl(uint8_t mode
)
283 if ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0) {
284 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
,
292 ((GETR_32(SD_CLK_CTRL
) | MMC_SD_CLK_START
) &
294 SETR_32(SD_CLK_CTRL
, value
); /* on */
295 mmc_drv_obj
.clock_enable
= TRUE
;
299 ((GETR_32(SD_CLK_CTRL
) & MMC_SD_CLK_STOP
) &
301 SETR_32(SD_CLK_CTRL
, value
); /* off */
302 mmc_drv_obj
.clock_enable
= FALSE
;
308 static EMMC_ERROR_CODE
emmc_bus_width(uint32_t width
)
310 EMMC_ERROR_CODE result
= EMMC_ERR
;
312 /* parameter check */
313 if ((width
!= 8) && (width
!= 4) && (width
!= 1)) {
314 emmc_write_error_info(EMMC_FUNCNO_BUS_WIDTH
, EMMC_ERR_PARAM
);
315 return EMMC_ERR_PARAM
;
319 if (mmc_drv_obj
.selected
!= TRUE
) {
320 emmc_write_error_info(EMMC_FUNCNO_BUS_WIDTH
, EMMC_ERR_STATE
);
321 return EMMC_ERR_STATE
;
324 mmc_drv_obj
.bus_width
= (HAL_MEMCARD_DATA_WIDTH
) (width
>> 2); /* 2 = 8bit, 1 = 4bit, 0 =1bit */
327 emmc_make_nontrans_cmd(CMD6_SWITCH
,
328 (EMMC_SWITCH_BUS_WIDTH_1
|
329 (mmc_drv_obj
.bus_width
<< 8)));
330 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
331 if (result
!= EMMC_SUCCESS
) {
333 mmc_drv_obj
.bus_width
= HAL_MEMCARD_DATA_WIDTH_1_BIT
;
337 switch (mmc_drv_obj
.bus_width
) {
338 case HAL_MEMCARD_DATA_WIDTH_1_BIT
:
340 ((GETR_32(SD_OPTION
) & ~(BIT15
| BIT13
)) | BIT15
));
342 case HAL_MEMCARD_DATA_WIDTH_4_BIT
:
343 SETR_32(SD_OPTION
, (GETR_32(SD_OPTION
) & ~(BIT15
| BIT13
)));
345 case HAL_MEMCARD_DATA_WIDTH_8_BIT
:
347 ((GETR_32(SD_OPTION
) & ~(BIT15
| BIT13
)) | BIT13
));
354 emmc_make_nontrans_cmd(CMD13_SEND_STATUS
, EMMC_RCA
<< 16);
355 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
356 if (result
!= EMMC_SUCCESS
) {
361 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000,
362 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
363 EMMC_MAX_EXT_CSD_LENGTH
, HAL_MEMCARD_READ
,
364 HAL_MEMCARD_NOT_DMA
);
365 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
366 if (result
!= EMMC_SUCCESS
) {
374 emmc_write_error_info(EMMC_FUNCNO_BUS_WIDTH
, result
);
375 ERROR("BL2: emmc bus_width error end\n");
379 EMMC_ERROR_CODE
emmc_select_partition(EMMC_PARTITION_ID id
)
381 EMMC_ERROR_CODE result
;
383 uint32_t partition_config
;
386 if (mmc_drv_obj
.mount
!= TRUE
) {
387 emmc_write_error_info(EMMC_FUNCNO_NONE
, EMMC_ERR_STATE
);
388 return EMMC_ERR_STATE
;
391 /* id = PARTITION_ACCESS(Bit[2:0]) */
392 if ((id
& ~PARTITION_ID_MASK
) != 0) {
393 emmc_write_error_info(EMMC_FUNCNO_NONE
, EMMC_ERR_PARAM
);
394 return EMMC_ERR_PARAM
;
397 /* EXT_CSD[179] value */
399 (uint32_t) mmc_drv_obj
.ext_csd_data
[EMMC_EXT_CSD_PARTITION_CONFIG
];
400 if ((partition_config
& PARTITION_ID_MASK
) == id
) {
401 result
= EMMC_SUCCESS
;
405 (uint32_t) ((partition_config
& ~PARTITION_ID_MASK
) | id
);
406 arg
= EMMC_SWITCH_PARTITION_CONFIG
| (partition_config
<< 8);
408 result
= emmc_set_ext_csd(arg
);
414 static void set_sd_clk(uint32_t clkDiv
)
418 dataL
= (GETR_32(SD_CLK_CTRL
) & (~SD_CLK_CTRL_CLKDIV_MASK
));
422 dataL
|= 0x000000FFU
;
425 dataL
|= 0x00000000U
;
428 dataL
|= 0x00000001U
;
431 dataL
|= 0x00000002U
;
434 dataL
|= 0x00000004U
;
437 dataL
|= 0x00000008U
;
440 dataL
|= 0x00000010U
;
443 dataL
|= 0x00000020U
;
446 dataL
|= 0x00000040U
;
449 dataL
|= 0x00000080U
;
453 SETR_32(SD_CLK_CTRL
, dataL
);
454 mmc_drv_obj
.current_freq
= (uint32_t) clkDiv
;
457 static void emmc_get_partition_access(void)
460 EMMC_ERROR_CODE result
;
462 reg
= mmio_read_32(RCAR_PRR
) & (RCAR_PRODUCT_MASK
| RCAR_CUT_MASK
);
463 if ((reg
== RCAR_PRODUCT_H3_CUT20
) || (reg
== RCAR_PRODUCT_M3_CUT11
)) {
464 SETR_32(SD_OPTION
, 0x000060EEU
); /* 8 bits width */
466 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000U
,
467 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
468 EMMC_MAX_EXT_CSD_LENGTH
,
469 HAL_MEMCARD_READ
, HAL_MEMCARD_NOT_DMA
);
470 mmc_drv_obj
.get_partition_access_flag
= TRUE
;
472 emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
473 mmc_drv_obj
.get_partition_access_flag
= FALSE
;
474 if (result
== EMMC_SUCCESS
) {
475 mmc_drv_obj
.partition_access
=
476 (EMMC_PARTITION_ID
) (mmc_drv_obj
.ext_csd_data
[179]
477 & PARTITION_ID_MASK
);
478 } else if (result
== EMMC_ERR_CMD_TIMEOUT
) {
479 mmc_drv_obj
.partition_access
= PARTITION_ID_BOOT_1
;
481 emmc_write_error_info(EMMC_FUNCNO_GET_PERTITION_ACCESS
,
485 SETR_32(SD_OPTION
, 0x0000C0EEU
); /* Initialize */
489 static uint32_t emmc_calc_tran_speed(uint32_t *freq
)
491 const uint32_t unit
[8] = { 10000, 100000, 1000000, 10000000,
492 0, 0, 0, 0 }; /**< frequency unit (1/10) */
493 const uint32_t mult
[16] = { 0, 10, 12, 13, 15, 20, 26, 30, 35, 40, 45,
494 52, 55, 60, 70, 80 };
498 uint32_t tran_speed
= EMMC_CSD_TRAN_SPEED();
501 * unit[tran_speed&0x7] = uint[0x2] = 1000000
502 * mult[(tran_speed&0x78)>>3] = mult[0x30>>3] = mult[6] = 26
503 * 1000000 * 26 = 26000000 (26MHz)
508 unit
[tran_speed
& EMMC_TRANSPEED_FREQ_UNIT_MASK
] *
509 mult
[(tran_speed
& EMMC_TRANSPEED_MULT_MASK
) >>
510 EMMC_TRANSPEED_MULT_SHIFT
];
514 } else if (MMC_FREQ_52MHZ
<= maxFreq
)
516 else if (MMC_FREQ_26MHZ
<= maxFreq
)
518 else if (MMC_FREQ_20MHZ
<= maxFreq
)
526 static uint32_t emmc_set_timeout_register_value(uint32_t freq
)
528 uint32_t timeoutCnt
; /* SD_OPTION - Timeout Counter */
533 break; /* SDCLK * 2^27 */
536 break; /* SDCLK * 2^27 */
539 break; /* SDCLK * 2^26 */
542 break; /* SDCLK * 2^25 */
545 break; /* SDCLK * 2^24 */
548 break; /* SDCLK * 2^23 */
551 break; /* SDCLK * 2^22 */
554 break; /* SDCLK * 2^21 */
557 break; /* SDCLK * 2^20 */
560 break; /* SDCLK * 2^20 */
563 break; /* SDCLK * 2^27 */
569 EMMC_ERROR_CODE
emmc_set_ext_csd(uint32_t arg
)
571 EMMC_ERROR_CODE result
;
574 emmc_make_nontrans_cmd(CMD6_SWITCH
, arg
);
575 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
576 if (result
!= EMMC_SUCCESS
) {
581 emmc_make_nontrans_cmd(CMD13_SEND_STATUS
, EMMC_RCA
<< 16);
582 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
583 if (result
!= EMMC_SUCCESS
) {
588 emmc_make_trans_cmd(CMD8_SEND_EXT_CSD
, 0x00000000,
589 (uint32_t *) (&mmc_drv_obj
.ext_csd_data
[0]),
590 EMMC_MAX_EXT_CSD_LENGTH
, HAL_MEMCARD_READ
,
591 HAL_MEMCARD_NOT_DMA
);
592 result
= emmc_exec_cmd(EMMC_R1_ERROR_MASK
, mmc_drv_obj
.response
);
593 if (result
!= EMMC_SUCCESS
) {
599 EMMC_ERROR_CODE
emmc_set_request_mmc_clock(uint32_t *freq
)
601 /* parameter check */
603 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
, EMMC_ERR_PARAM
);
604 return EMMC_ERR_PARAM
;
608 if ((mmc_drv_obj
.initialize
!= TRUE
)
609 || (mmc_drv_obj
.card_power_enable
!= TRUE
)) {
610 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
, EMMC_ERR_STATE
);
611 return EMMC_ERR_STATE
;
614 /* clock is already running in the desired frequency. */
615 if ((mmc_drv_obj
.clock_enable
== TRUE
)
616 && (mmc_drv_obj
.current_freq
== *freq
)) {
621 if ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0) {
622 emmc_write_error_info(EMMC_FUNCNO_SET_CLOCK
,
628 mmc_drv_obj
.clock_enable
= FALSE
;
630 return emmc_clock_ctrl(TRUE
); /* clock on */
633 EMMC_ERROR_CODE
rcar_emmc_mount(void)
635 EMMC_ERROR_CODE result
;
638 if ((mmc_drv_obj
.initialize
!= TRUE
)
639 || (mmc_drv_obj
.card_power_enable
!= TRUE
)
640 || ((GETR_32(SD_INFO2
) & SD_INFO2_CBSY
) != 0)
642 emmc_write_error_info(EMMC_FUNCNO_MOUNT
, EMMC_ERR_STATE
);
643 return EMMC_ERR_STATE
;
646 /* initialize card (IDLE state --> Transfer state) */
647 result
= emmc_card_init();
648 if (result
!= EMMC_SUCCESS
) {
649 emmc_write_error_info_func_no(EMMC_FUNCNO_CARD_INIT
);
650 if (emmc_clock_ctrl(FALSE
) != EMMC_SUCCESS
) {
656 /* Switching high speed mode */
657 result
= emmc_high_speed();
658 if (result
!= EMMC_SUCCESS
) {
659 emmc_write_error_info_func_no(EMMC_FUNCNO_HIGH_SPEED
);
660 if (emmc_clock_ctrl(FALSE
) != EMMC_SUCCESS
) {
666 /* Changing the data bus width */
667 result
= emmc_bus_width(8);
668 if (result
!= EMMC_SUCCESS
) {
669 emmc_write_error_info_func_no(EMMC_FUNCNO_BUS_WIDTH
);
670 if (emmc_clock_ctrl(FALSE
) != EMMC_SUCCESS
) {
677 mmc_drv_obj
.mount
= TRUE
;