xref: /rk3399_ARM-atf/drivers/renesas/common/emmc/emmc_cmd.c (revision b28c29d0084e1380333881d718ebeb0ef65b10a5)
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