xref: /arm-trusted-firmware/drivers/renesas/common/emmc/emmc_cmd.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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