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