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