1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/debug.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include "emmc_config.h" 10*91f16700Schasinglulu #include "emmc_def.h" 11*91f16700Schasinglulu #include "emmc_hal.h" 12*91f16700Schasinglulu #include "emmc_registers.h" 13*91f16700Schasinglulu #include "emmc_std.h" 14*91f16700Schasinglulu #include "micro_delay.h" 15*91f16700Schasinglulu 16*91f16700Schasinglulu static void emmc_little_to_big(uint8_t *p, uint32_t value) 17*91f16700Schasinglulu { 18*91f16700Schasinglulu if (p == NULL) 19*91f16700Schasinglulu return; 20*91f16700Schasinglulu 21*91f16700Schasinglulu p[0] = (uint8_t) (value >> 24); 22*91f16700Schasinglulu p[1] = (uint8_t) (value >> 16); 23*91f16700Schasinglulu p[2] = (uint8_t) (value >> 8); 24*91f16700Schasinglulu p[3] = (uint8_t) value; 25*91f16700Schasinglulu 26*91f16700Schasinglulu } 27*91f16700Schasinglulu 28*91f16700Schasinglulu static void emmc_softreset(void) 29*91f16700Schasinglulu { 30*91f16700Schasinglulu int32_t loop = 10000; 31*91f16700Schasinglulu int32_t retry = 1000; 32*91f16700Schasinglulu 33*91f16700Schasinglulu /* flag clear */ 34*91f16700Schasinglulu mmc_drv_obj.during_cmd_processing = FALSE; 35*91f16700Schasinglulu mmc_drv_obj.during_transfer = FALSE; 36*91f16700Schasinglulu mmc_drv_obj.during_dma_transfer = FALSE; 37*91f16700Schasinglulu mmc_drv_obj.state_machine_blocking = FALSE; 38*91f16700Schasinglulu mmc_drv_obj.force_terminate = FALSE; 39*91f16700Schasinglulu mmc_drv_obj.dma_error_flag = FALSE; 40*91f16700Schasinglulu 41*91f16700Schasinglulu /* during operation ? */ 42*91f16700Schasinglulu if ((GETR_32(SD_INFO2) & SD_INFO2_CBSY) == 0) 43*91f16700Schasinglulu goto reset; 44*91f16700Schasinglulu 45*91f16700Schasinglulu /* wait CMDSEQ = 0 */ 46*91f16700Schasinglulu while (loop > 0) { 47*91f16700Schasinglulu if ((GETR_32(SD_INFO2) & SD_INFO2_CBSY) == 0) 48*91f16700Schasinglulu break; /* ready */ 49*91f16700Schasinglulu 50*91f16700Schasinglulu loop--; 51*91f16700Schasinglulu if ((loop == 0) && (retry > 0)) { 52*91f16700Schasinglulu rcar_micro_delay(1000U); /* wait 1ms */ 53*91f16700Schasinglulu loop = 10000; 54*91f16700Schasinglulu retry--; 55*91f16700Schasinglulu } 56*91f16700Schasinglulu } 57*91f16700Schasinglulu 58*91f16700Schasinglulu reset: 59*91f16700Schasinglulu /* reset */ 60*91f16700Schasinglulu SETR_32(SOFT_RST, (GETR_32(SOFT_RST) & (~SOFT_RST_SDRST))); 61*91f16700Schasinglulu SETR_32(SOFT_RST, (GETR_32(SOFT_RST) | SOFT_RST_SDRST)); 62*91f16700Schasinglulu 63*91f16700Schasinglulu /* initialize */ 64*91f16700Schasinglulu SETR_32(SD_INFO1, 0x00000000U); 65*91f16700Schasinglulu SETR_32(SD_INFO2, SD_INFO2_CLEAR); 66*91f16700Schasinglulu SETR_32(SD_INFO1_MASK, 0x00000000U); /* all interrupt disable */ 67*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, SD_INFO2_CLEAR); /* all interrupt disable */ 68*91f16700Schasinglulu } 69*91f16700Schasinglulu 70*91f16700Schasinglulu static void emmc_read_response(uint32_t *response) 71*91f16700Schasinglulu { 72*91f16700Schasinglulu uint8_t *p; 73*91f16700Schasinglulu 74*91f16700Schasinglulu if (response == NULL) 75*91f16700Schasinglulu return; 76*91f16700Schasinglulu 77*91f16700Schasinglulu /* read response */ 78*91f16700Schasinglulu if (mmc_drv_obj.response_length != EMMC_MAX_RESPONSE_LENGTH) { 79*91f16700Schasinglulu *response = GETR_32(SD_RSP10); /* [39:8] */ 80*91f16700Schasinglulu return; 81*91f16700Schasinglulu } 82*91f16700Schasinglulu 83*91f16700Schasinglulu /* CSD or CID */ 84*91f16700Schasinglulu p = (uint8_t *) (response); 85*91f16700Schasinglulu emmc_little_to_big(p, ((GETR_32(SD_RSP76) << 8) 86*91f16700Schasinglulu | (GETR_32(SD_RSP54) >> 24))); /* [127:96] */ 87*91f16700Schasinglulu emmc_little_to_big(p + 4, ((GETR_32(SD_RSP54) << 8) 88*91f16700Schasinglulu | (GETR_32(SD_RSP32) >> 24))); /* [95:64] */ 89*91f16700Schasinglulu emmc_little_to_big(p + 8, ((GETR_32(SD_RSP32) << 8) 90*91f16700Schasinglulu | (GETR_32(SD_RSP10) >> 24))); /* [63:32] */ 91*91f16700Schasinglulu emmc_little_to_big(p + 12, (GETR_32(SD_RSP10) << 8)); 92*91f16700Schasinglulu } 93*91f16700Schasinglulu 94*91f16700Schasinglulu static EMMC_ERROR_CODE emmc_response_check(uint32_t *response, 95*91f16700Schasinglulu uint32_t error_mask) 96*91f16700Schasinglulu { 97*91f16700Schasinglulu 98*91f16700Schasinglulu HAL_MEMCARD_RESPONSE_TYPE response_type = 99*91f16700Schasinglulu ((HAL_MEMCARD_RESPONSE_TYPE)mmc_drv_obj.cmd_info.cmd & HAL_MEMCARD_RESPONSE_TYPE_MASK); 100*91f16700Schasinglulu 101*91f16700Schasinglulu if (response == NULL) 102*91f16700Schasinglulu return EMMC_ERR_PARAM; 103*91f16700Schasinglulu 104*91f16700Schasinglulu if (response_type == HAL_MEMCARD_RESPONSE_NONE) 105*91f16700Schasinglulu return EMMC_SUCCESS; 106*91f16700Schasinglulu 107*91f16700Schasinglulu 108*91f16700Schasinglulu if (response_type <= HAL_MEMCARD_RESPONSE_R1b) { 109*91f16700Schasinglulu /* R1 or R1b */ 110*91f16700Schasinglulu mmc_drv_obj.current_state = 111*91f16700Schasinglulu (EMMC_R1_STATE) ((*response & EMMC_R1_STATE_MASK) >> 112*91f16700Schasinglulu EMMC_R1_STATE_SHIFT); 113*91f16700Schasinglulu if ((*response & error_mask) != 0) { 114*91f16700Schasinglulu if ((0x80 & *response) != 0) { 115*91f16700Schasinglulu ERROR("BL2: emmc SWITCH_ERROR\n"); 116*91f16700Schasinglulu } 117*91f16700Schasinglulu return EMMC_ERR_CARD_STATUS_BIT; 118*91f16700Schasinglulu } 119*91f16700Schasinglulu return EMMC_SUCCESS; 120*91f16700Schasinglulu } 121*91f16700Schasinglulu 122*91f16700Schasinglulu if (response_type == HAL_MEMCARD_RESPONSE_R4) { 123*91f16700Schasinglulu if ((*response & EMMC_R4_STATUS) != 0) 124*91f16700Schasinglulu return EMMC_ERR_CARD_STATUS_BIT; 125*91f16700Schasinglulu } 126*91f16700Schasinglulu 127*91f16700Schasinglulu return EMMC_SUCCESS; 128*91f16700Schasinglulu } 129*91f16700Schasinglulu 130*91f16700Schasinglulu static void emmc_WaitCmd2Cmd_8Cycle(void) 131*91f16700Schasinglulu { 132*91f16700Schasinglulu uint32_t dataL, wait = 0; 133*91f16700Schasinglulu 134*91f16700Schasinglulu dataL = GETR_32(SD_CLK_CTRL); 135*91f16700Schasinglulu dataL &= 0x000000FF; 136*91f16700Schasinglulu 137*91f16700Schasinglulu switch (dataL) { 138*91f16700Schasinglulu case 0xFF: 139*91f16700Schasinglulu case 0x00: 140*91f16700Schasinglulu case 0x01: 141*91f16700Schasinglulu case 0x02: 142*91f16700Schasinglulu case 0x04: 143*91f16700Schasinglulu case 0x08: 144*91f16700Schasinglulu case 0x10: 145*91f16700Schasinglulu case 0x20: 146*91f16700Schasinglulu wait = 10U; 147*91f16700Schasinglulu break; 148*91f16700Schasinglulu case 0x40: 149*91f16700Schasinglulu wait = 20U; 150*91f16700Schasinglulu break; 151*91f16700Schasinglulu case 0x80: 152*91f16700Schasinglulu wait = 30U; 153*91f16700Schasinglulu break; 154*91f16700Schasinglulu } 155*91f16700Schasinglulu 156*91f16700Schasinglulu rcar_micro_delay(wait); 157*91f16700Schasinglulu } 158*91f16700Schasinglulu 159*91f16700Schasinglulu static void cmdErrSdInfo2Log(void) 160*91f16700Schasinglulu { 161*91f16700Schasinglulu ERROR("BL2: emmc ERR SD_INFO2 = 0x%x\n", mmc_drv_obj.error_info.info2); 162*91f16700Schasinglulu } 163*91f16700Schasinglulu 164*91f16700Schasinglulu static void emmc_data_transfer_dma(void) 165*91f16700Schasinglulu { 166*91f16700Schasinglulu mmc_drv_obj.during_dma_transfer = TRUE; 167*91f16700Schasinglulu mmc_drv_obj.dma_error_flag = FALSE; 168*91f16700Schasinglulu 169*91f16700Schasinglulu SETR_32(SD_INFO1_MASK, 0x00000000U); 170*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, (SD_INFO2_ALL_ERR | SD_INFO2_CLEAR)); 171*91f16700Schasinglulu 172*91f16700Schasinglulu /* DMAC setting */ 173*91f16700Schasinglulu if (mmc_drv_obj.cmd_info.dir == HAL_MEMCARD_WRITE) { 174*91f16700Schasinglulu /* transfer complete interrupt enable */ 175*91f16700Schasinglulu SETR_32(DM_CM_INFO1_MASK, 176*91f16700Schasinglulu (DM_CM_INFO_MASK_CLEAR | DM_CM_INFO_CH0_ENABLE)); 177*91f16700Schasinglulu SETR_32(DM_CM_INFO2_MASK, 178*91f16700Schasinglulu (DM_CM_INFO_MASK_CLEAR | DM_CM_INFO_CH0_ENABLE)); 179*91f16700Schasinglulu /* BUFF --> FIFO */ 180*91f16700Schasinglulu SETR_32(DM_CM_DTRAN_MODE, (DM_CM_DTRAN_MODE_CH0 | 181*91f16700Schasinglulu DM_CM_DTRAN_MODE_BIT_WIDTH)); 182*91f16700Schasinglulu } else { 183*91f16700Schasinglulu /* transfer complete interrupt enable */ 184*91f16700Schasinglulu SETR_32(DM_CM_INFO1_MASK, 185*91f16700Schasinglulu (DM_CM_INFO_MASK_CLEAR | DM_CM_INFO_CH1_ENABLE)); 186*91f16700Schasinglulu SETR_32(DM_CM_INFO2_MASK, 187*91f16700Schasinglulu (DM_CM_INFO_MASK_CLEAR | DM_CM_INFO_CH1_ENABLE)); 188*91f16700Schasinglulu /* FIFO --> BUFF */ 189*91f16700Schasinglulu SETR_32(DM_CM_DTRAN_MODE, (DM_CM_DTRAN_MODE_CH1 190*91f16700Schasinglulu | DM_CM_DTRAN_MODE_BIT_WIDTH)); 191*91f16700Schasinglulu } 192*91f16700Schasinglulu SETR_32(DM_DTRAN_ADDR, (((uintptr_t) mmc_drv_obj.buff_address_virtual & 193*91f16700Schasinglulu DM_DTRAN_ADDR_WRITE_MASK))); 194*91f16700Schasinglulu 195*91f16700Schasinglulu SETR_32(DM_CM_DTRAN_CTRL, DM_CM_DTRAN_CTRL_START); 196*91f16700Schasinglulu } 197*91f16700Schasinglulu 198*91f16700Schasinglulu EMMC_ERROR_CODE emmc_exec_cmd(uint32_t error_mask, uint32_t *response) 199*91f16700Schasinglulu { 200*91f16700Schasinglulu EMMC_ERROR_CODE rtn_code = EMMC_SUCCESS; 201*91f16700Schasinglulu HAL_MEMCARD_RESPONSE_TYPE response_type; 202*91f16700Schasinglulu HAL_MEMCARD_COMMAND_TYPE cmd_type; 203*91f16700Schasinglulu EMMC_INT_STATE state; 204*91f16700Schasinglulu uint32_t err_not_care_flag = FALSE; 205*91f16700Schasinglulu 206*91f16700Schasinglulu /* parameter check */ 207*91f16700Schasinglulu if (response == NULL) { 208*91f16700Schasinglulu emmc_write_error_info(EMMC_FUNCNO_EXEC_CMD, EMMC_ERR_PARAM); 209*91f16700Schasinglulu return EMMC_ERR_PARAM; 210*91f16700Schasinglulu } 211*91f16700Schasinglulu 212*91f16700Schasinglulu /* state check */ 213*91f16700Schasinglulu if (mmc_drv_obj.clock_enable != TRUE) { 214*91f16700Schasinglulu emmc_write_error_info(EMMC_FUNCNO_EXEC_CMD, EMMC_ERR_STATE); 215*91f16700Schasinglulu return EMMC_ERR_STATE; 216*91f16700Schasinglulu } 217*91f16700Schasinglulu 218*91f16700Schasinglulu if (mmc_drv_obj.state_machine_blocking == TRUE) { 219*91f16700Schasinglulu emmc_write_error_info(EMMC_FUNCNO_EXEC_CMD, EMMC_ERR); 220*91f16700Schasinglulu return EMMC_ERR; 221*91f16700Schasinglulu } 222*91f16700Schasinglulu 223*91f16700Schasinglulu state = ESTATE_BEGIN; 224*91f16700Schasinglulu response_type = 225*91f16700Schasinglulu ((HAL_MEMCARD_RESPONSE_TYPE)mmc_drv_obj.cmd_info.cmd & 226*91f16700Schasinglulu HAL_MEMCARD_RESPONSE_TYPE_MASK); 227*91f16700Schasinglulu cmd_type = 228*91f16700Schasinglulu ((HAL_MEMCARD_COMMAND_TYPE) mmc_drv_obj.cmd_info.cmd & 229*91f16700Schasinglulu HAL_MEMCARD_COMMAND_TYPE_MASK); 230*91f16700Schasinglulu 231*91f16700Schasinglulu /* state machine */ 232*91f16700Schasinglulu while ((mmc_drv_obj.force_terminate != TRUE) && (state != ESTATE_END)) { 233*91f16700Schasinglulu /* The interrupt factor flag is observed. */ 234*91f16700Schasinglulu emmc_interrupt(); 235*91f16700Schasinglulu 236*91f16700Schasinglulu /* wait interrupt */ 237*91f16700Schasinglulu if (mmc_drv_obj.state_machine_blocking == TRUE) 238*91f16700Schasinglulu continue; 239*91f16700Schasinglulu 240*91f16700Schasinglulu switch (state) { 241*91f16700Schasinglulu case ESTATE_BEGIN: 242*91f16700Schasinglulu /* Busy check */ 243*91f16700Schasinglulu if ((mmc_drv_obj.error_info.info2 & SD_INFO2_CBSY) != 0) { 244*91f16700Schasinglulu emmc_write_error_info(EMMC_FUNCNO_EXEC_CMD, 245*91f16700Schasinglulu EMMC_ERR_CARD_BUSY); 246*91f16700Schasinglulu return EMMC_ERR_CARD_BUSY; 247*91f16700Schasinglulu } 248*91f16700Schasinglulu 249*91f16700Schasinglulu /* clear register */ 250*91f16700Schasinglulu SETR_32(SD_INFO1, 0x00000000U); 251*91f16700Schasinglulu SETR_32(SD_INFO2, SD_INFO2_CLEAR); 252*91f16700Schasinglulu SETR_32(SD_INFO1_MASK, SD_INFO1_INFO0); 253*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, 254*91f16700Schasinglulu (SD_INFO2_ALL_ERR | SD_INFO2_CLEAR)); 255*91f16700Schasinglulu 256*91f16700Schasinglulu state = ESTATE_ISSUE_CMD; 257*91f16700Schasinglulu /* fallthrough */ 258*91f16700Schasinglulu case ESTATE_ISSUE_CMD: 259*91f16700Schasinglulu /* ARG */ 260*91f16700Schasinglulu SETR_32(SD_ARG, mmc_drv_obj.cmd_info.arg); 261*91f16700Schasinglulu /* issue cmd */ 262*91f16700Schasinglulu SETR_32(SD_CMD, mmc_drv_obj.cmd_info.hw); 263*91f16700Schasinglulu /* Set driver flag */ 264*91f16700Schasinglulu mmc_drv_obj.during_cmd_processing = TRUE; 265*91f16700Schasinglulu mmc_drv_obj.state_machine_blocking = TRUE; 266*91f16700Schasinglulu 267*91f16700Schasinglulu if (response_type == HAL_MEMCARD_RESPONSE_NONE) { 268*91f16700Schasinglulu state = ESTATE_NON_RESP_CMD; 269*91f16700Schasinglulu } else { 270*91f16700Schasinglulu state = ESTATE_RCV_RESP; 271*91f16700Schasinglulu } 272*91f16700Schasinglulu 273*91f16700Schasinglulu break; 274*91f16700Schasinglulu 275*91f16700Schasinglulu case ESTATE_NON_RESP_CMD: 276*91f16700Schasinglulu /* interrupt disable */ 277*91f16700Schasinglulu SETR_32(SD_INFO1_MASK, 0x00000000U); 278*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, SD_INFO2_CLEAR); 279*91f16700Schasinglulu 280*91f16700Schasinglulu /* check interrupt */ 281*91f16700Schasinglulu if ((mmc_drv_obj.int_event2 & SD_INFO2_ALL_ERR) != 0) { 282*91f16700Schasinglulu /* error interrupt */ 283*91f16700Schasinglulu cmdErrSdInfo2Log(); 284*91f16700Schasinglulu rtn_code = EMMC_ERR_INFO2; 285*91f16700Schasinglulu state = ESTATE_ERROR; 286*91f16700Schasinglulu } else if ((mmc_drv_obj.int_event1 & SD_INFO1_INFO0) == 287*91f16700Schasinglulu 0) { 288*91f16700Schasinglulu /* not receive expected interrupt */ 289*91f16700Schasinglulu rtn_code = EMMC_ERR_RESPONSE; 290*91f16700Schasinglulu state = ESTATE_ERROR; 291*91f16700Schasinglulu } else { 292*91f16700Schasinglulu emmc_WaitCmd2Cmd_8Cycle(); 293*91f16700Schasinglulu state = ESTATE_END; 294*91f16700Schasinglulu } 295*91f16700Schasinglulu break; 296*91f16700Schasinglulu 297*91f16700Schasinglulu case ESTATE_RCV_RESP: 298*91f16700Schasinglulu /* interrupt disable */ 299*91f16700Schasinglulu SETR_32(SD_INFO1_MASK, 0x00000000U); 300*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, SD_INFO2_CLEAR); 301*91f16700Schasinglulu 302*91f16700Schasinglulu /* check interrupt */ 303*91f16700Schasinglulu if ((mmc_drv_obj.int_event2 & SD_INFO2_ALL_ERR) != 0) { 304*91f16700Schasinglulu if ((mmc_drv_obj.get_partition_access_flag == 305*91f16700Schasinglulu TRUE) 306*91f16700Schasinglulu && ((mmc_drv_obj.int_event2 & SD_INFO2_ERR6) 307*91f16700Schasinglulu != 0U)) { 308*91f16700Schasinglulu err_not_care_flag = TRUE; 309*91f16700Schasinglulu rtn_code = EMMC_ERR_CMD_TIMEOUT; 310*91f16700Schasinglulu } else { 311*91f16700Schasinglulu /* error interrupt */ 312*91f16700Schasinglulu cmdErrSdInfo2Log(); 313*91f16700Schasinglulu rtn_code = EMMC_ERR_INFO2; 314*91f16700Schasinglulu } 315*91f16700Schasinglulu state = ESTATE_ERROR; 316*91f16700Schasinglulu break; 317*91f16700Schasinglulu } else if ((mmc_drv_obj.int_event1 & SD_INFO1_INFO0) == 318*91f16700Schasinglulu 0) { 319*91f16700Schasinglulu /* not receive expected interrupt */ 320*91f16700Schasinglulu rtn_code = EMMC_ERR_RESPONSE; 321*91f16700Schasinglulu state = ESTATE_ERROR; 322*91f16700Schasinglulu break; 323*91f16700Schasinglulu } 324*91f16700Schasinglulu 325*91f16700Schasinglulu /* read response */ 326*91f16700Schasinglulu emmc_read_response(response); 327*91f16700Schasinglulu 328*91f16700Schasinglulu /* check response */ 329*91f16700Schasinglulu rtn_code = emmc_response_check(response, error_mask); 330*91f16700Schasinglulu if (rtn_code != EMMC_SUCCESS) { 331*91f16700Schasinglulu state = ESTATE_ERROR; 332*91f16700Schasinglulu break; 333*91f16700Schasinglulu } 334*91f16700Schasinglulu 335*91f16700Schasinglulu if (response_type == HAL_MEMCARD_RESPONSE_R1b) { 336*91f16700Schasinglulu /* R1b */ 337*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, 338*91f16700Schasinglulu (SD_INFO2_ALL_ERR | SD_INFO2_CLEAR)); 339*91f16700Schasinglulu state = ESTATE_RCV_RESPONSE_BUSY; 340*91f16700Schasinglulu } else { 341*91f16700Schasinglulu state = ESTATE_CHECK_RESPONSE_COMPLETE; 342*91f16700Schasinglulu } 343*91f16700Schasinglulu break; 344*91f16700Schasinglulu 345*91f16700Schasinglulu case ESTATE_RCV_RESPONSE_BUSY: 346*91f16700Schasinglulu /* check interrupt */ 347*91f16700Schasinglulu if ((mmc_drv_obj.int_event2 & SD_INFO2_ALL_ERR) != 0) { 348*91f16700Schasinglulu /* error interrupt */ 349*91f16700Schasinglulu cmdErrSdInfo2Log(); 350*91f16700Schasinglulu rtn_code = EMMC_ERR_INFO2; 351*91f16700Schasinglulu state = ESTATE_ERROR; 352*91f16700Schasinglulu break; 353*91f16700Schasinglulu } 354*91f16700Schasinglulu /* DAT0 not Busy */ 355*91f16700Schasinglulu if ((SD_INFO2_DAT0 & mmc_drv_obj.error_info.info2) != 0) { 356*91f16700Schasinglulu state = ESTATE_CHECK_RESPONSE_COMPLETE; 357*91f16700Schasinglulu break; 358*91f16700Schasinglulu } 359*91f16700Schasinglulu break; 360*91f16700Schasinglulu 361*91f16700Schasinglulu case ESTATE_CHECK_RESPONSE_COMPLETE: 362*91f16700Schasinglulu if (cmd_type >= HAL_MEMCARD_COMMAND_TYPE_ADTC_WRITE) { 363*91f16700Schasinglulu state = ESTATE_DATA_TRANSFER; 364*91f16700Schasinglulu } else { 365*91f16700Schasinglulu emmc_WaitCmd2Cmd_8Cycle(); 366*91f16700Schasinglulu state = ESTATE_END; 367*91f16700Schasinglulu } 368*91f16700Schasinglulu break; 369*91f16700Schasinglulu 370*91f16700Schasinglulu case ESTATE_DATA_TRANSFER: 371*91f16700Schasinglulu /* ADTC command */ 372*91f16700Schasinglulu mmc_drv_obj.during_transfer = TRUE; 373*91f16700Schasinglulu mmc_drv_obj.state_machine_blocking = TRUE; 374*91f16700Schasinglulu 375*91f16700Schasinglulu if (mmc_drv_obj.transfer_mode == HAL_MEMCARD_DMA) { 376*91f16700Schasinglulu /* DMA */ 377*91f16700Schasinglulu emmc_data_transfer_dma(); 378*91f16700Schasinglulu } else { 379*91f16700Schasinglulu /* PIO */ 380*91f16700Schasinglulu /* interrupt enable (FIFO read/write enable) */ 381*91f16700Schasinglulu if (mmc_drv_obj.cmd_info.dir == 382*91f16700Schasinglulu HAL_MEMCARD_WRITE) { 383*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, 384*91f16700Schasinglulu (SD_INFO2_BWE | SD_INFO2_ALL_ERR 385*91f16700Schasinglulu | SD_INFO2_CLEAR)); 386*91f16700Schasinglulu } else { 387*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, 388*91f16700Schasinglulu (SD_INFO2_BRE | SD_INFO2_ALL_ERR 389*91f16700Schasinglulu | SD_INFO2_CLEAR)); 390*91f16700Schasinglulu } 391*91f16700Schasinglulu } 392*91f16700Schasinglulu state = ESTATE_DATA_TRANSFER_COMPLETE; 393*91f16700Schasinglulu break; 394*91f16700Schasinglulu 395*91f16700Schasinglulu case ESTATE_DATA_TRANSFER_COMPLETE: 396*91f16700Schasinglulu /* check interrupt */ 397*91f16700Schasinglulu if ((mmc_drv_obj.int_event2 & SD_INFO2_ALL_ERR) != 0) { 398*91f16700Schasinglulu /* error interrupt */ 399*91f16700Schasinglulu cmdErrSdInfo2Log(); 400*91f16700Schasinglulu rtn_code = EMMC_ERR_INFO2; 401*91f16700Schasinglulu state = ESTATE_TRANSFER_ERROR; 402*91f16700Schasinglulu break; 403*91f16700Schasinglulu } 404*91f16700Schasinglulu 405*91f16700Schasinglulu /* DMAC error ? */ 406*91f16700Schasinglulu if (mmc_drv_obj.dma_error_flag == TRUE) { 407*91f16700Schasinglulu /* Error occurred in DMAC driver. */ 408*91f16700Schasinglulu rtn_code = EMMC_ERR_FROM_DMAC_TRANSFER; 409*91f16700Schasinglulu state = ESTATE_TRANSFER_ERROR; 410*91f16700Schasinglulu } else if (mmc_drv_obj.during_dma_transfer == TRUE) { 411*91f16700Schasinglulu /* DMAC not finished. unknown error */ 412*91f16700Schasinglulu rtn_code = EMMC_ERR; 413*91f16700Schasinglulu state = ESTATE_TRANSFER_ERROR; 414*91f16700Schasinglulu } else { 415*91f16700Schasinglulu SETR_32(SD_INFO1_MASK, SD_INFO1_INFO2); 416*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, 417*91f16700Schasinglulu (SD_INFO2_ALL_ERR | SD_INFO2_CLEAR)); 418*91f16700Schasinglulu 419*91f16700Schasinglulu mmc_drv_obj.state_machine_blocking = TRUE; 420*91f16700Schasinglulu 421*91f16700Schasinglulu state = ESTATE_ACCESS_END; 422*91f16700Schasinglulu } 423*91f16700Schasinglulu break; 424*91f16700Schasinglulu 425*91f16700Schasinglulu case ESTATE_ACCESS_END: 426*91f16700Schasinglulu 427*91f16700Schasinglulu /* clear flag */ 428*91f16700Schasinglulu if (mmc_drv_obj.transfer_mode == HAL_MEMCARD_DMA) { 429*91f16700Schasinglulu /* W (CC_EXT_MODE, H'0000_1010) SD_BUF DMA transfer disabled */ 430*91f16700Schasinglulu SETR_32(CC_EXT_MODE, CC_EXT_MODE_CLEAR); 431*91f16700Schasinglulu SETR_32(SD_STOP, 0x00000000U); 432*91f16700Schasinglulu mmc_drv_obj.during_dma_transfer = FALSE; 433*91f16700Schasinglulu } 434*91f16700Schasinglulu 435*91f16700Schasinglulu SETR_32(SD_INFO1_MASK, 0x00000000U); 436*91f16700Schasinglulu SETR_32(SD_INFO2_MASK, SD_INFO2_CLEAR); 437*91f16700Schasinglulu SETR_32(SD_INFO1, 0x00000000U); 438*91f16700Schasinglulu SETR_32(SD_INFO2, SD_INFO2_CLEAR); 439*91f16700Schasinglulu 440*91f16700Schasinglulu if ((mmc_drv_obj.int_event1 & SD_INFO1_INFO2) != 0) { 441*91f16700Schasinglulu emmc_WaitCmd2Cmd_8Cycle(); 442*91f16700Schasinglulu state = ESTATE_END; 443*91f16700Schasinglulu } else { 444*91f16700Schasinglulu state = ESTATE_ERROR; 445*91f16700Schasinglulu } 446*91f16700Schasinglulu break; 447*91f16700Schasinglulu 448*91f16700Schasinglulu case ESTATE_TRANSFER_ERROR: 449*91f16700Schasinglulu /* The error occurred in the Data transfer. */ 450*91f16700Schasinglulu if (mmc_drv_obj.transfer_mode == HAL_MEMCARD_DMA) { 451*91f16700Schasinglulu /* W (CC_EXT_MODE, H'0000_1010) SD_BUF DMA transfer disabled */ 452*91f16700Schasinglulu SETR_32(CC_EXT_MODE, CC_EXT_MODE_CLEAR); 453*91f16700Schasinglulu SETR_32(SD_STOP, 0x00000000U); 454*91f16700Schasinglulu mmc_drv_obj.during_dma_transfer = FALSE; 455*91f16700Schasinglulu } 456*91f16700Schasinglulu 457*91f16700Schasinglulu /* fallthrough */ 458*91f16700Schasinglulu case ESTATE_ERROR: 459*91f16700Schasinglulu if (err_not_care_flag == TRUE) { 460*91f16700Schasinglulu mmc_drv_obj.during_cmd_processing = FALSE; 461*91f16700Schasinglulu } else { 462*91f16700Schasinglulu emmc_softreset(); 463*91f16700Schasinglulu emmc_write_error_info(EMMC_FUNCNO_EXEC_CMD, 464*91f16700Schasinglulu rtn_code); 465*91f16700Schasinglulu } 466*91f16700Schasinglulu return rtn_code; 467*91f16700Schasinglulu 468*91f16700Schasinglulu default: 469*91f16700Schasinglulu state = ESTATE_END; 470*91f16700Schasinglulu break; 471*91f16700Schasinglulu } /* switch (state) */ 472*91f16700Schasinglulu } /* while ( (mmc_drv_obj.force_terminate != TRUE) && (state != ESTATE_END) ) */ 473*91f16700Schasinglulu 474*91f16700Schasinglulu /* force terminate */ 475*91f16700Schasinglulu if (mmc_drv_obj.force_terminate == TRUE) { 476*91f16700Schasinglulu /* timeout timer is expired. Or, PIO data transfer error. */ 477*91f16700Schasinglulu /* Timeout occurred in the DMA transfer. */ 478*91f16700Schasinglulu if (mmc_drv_obj.during_dma_transfer == TRUE) { 479*91f16700Schasinglulu mmc_drv_obj.during_dma_transfer = FALSE; 480*91f16700Schasinglulu } 481*91f16700Schasinglulu ERROR("BL2: emmc exec_cmd:EMMC_ERR_FORCE_TERMINATE\n"); 482*91f16700Schasinglulu emmc_softreset(); 483*91f16700Schasinglulu 484*91f16700Schasinglulu return EMMC_ERR_FORCE_TERMINATE; /* error information has already been written. */ 485*91f16700Schasinglulu } 486*91f16700Schasinglulu 487*91f16700Schasinglulu /* success */ 488*91f16700Schasinglulu mmc_drv_obj.during_cmd_processing = FALSE; 489*91f16700Schasinglulu mmc_drv_obj.during_transfer = FALSE; 490*91f16700Schasinglulu 491*91f16700Schasinglulu return EMMC_SUCCESS; 492*91f16700Schasinglulu } 493