xref: /rk3399_ARM-atf/drivers/renesas/common/emmc/emmc_cmd.c (revision 601e2d4325a7def628990f4a25889f374c81ca06)
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 
emmc_little_to_big(uint8_t * p,uint32_t value)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 
emmc_softreset(void)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 
emmc_read_response(uint32_t * response)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 
emmc_response_check(uint32_t * response,uint32_t error_mask)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 
emmc_WaitCmd2Cmd_8Cycle(void)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 
cmdErrSdInfo2Log(void)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 
emmc_data_transfer_dma(void)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 
emmc_exec_cmd(uint32_t error_mask,uint32_t * response)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