xref: /arm-trusted-firmware/drivers/renesas/common/ddr/dram_sub_func.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2019, 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 #include <lib/mmio.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include "dram_sub_func.h"
11*91f16700Schasinglulu #include "rcar_def.h"
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #if RCAR_SYSTEM_SUSPEND
14*91f16700Schasinglulu /* Local defines */
15*91f16700Schasinglulu #define DRAM_BACKUP_GPIO_USE		0
16*91f16700Schasinglulu #include "iic_dvfs.h"
17*91f16700Schasinglulu #if PMIC_ROHM_BD9571
18*91f16700Schasinglulu #define	PMIC_SLAVE_ADDR			0x30U
19*91f16700Schasinglulu #define	PMIC_BKUP_MODE_CNT		0x20U
20*91f16700Schasinglulu #define	PMIC_QLLM_CNT			0x27U
21*91f16700Schasinglulu #define	BIT_BKUP_CTRL_OUT		BIT(4)
22*91f16700Schasinglulu #define	BIT_QLLM_DDR0_EN		BIT(0)
23*91f16700Schasinglulu #define	BIT_QLLM_DDR1_EN		BIT(1)
24*91f16700Schasinglulu #endif
25*91f16700Schasinglulu 
26*91f16700Schasinglulu #define GPIO_BKUP_REQB_SHIFT_SALVATOR	9U	/* GP1_9 (BKUP_REQB) */
27*91f16700Schasinglulu #define GPIO_BKUP_TRG_SHIFT_SALVATOR	8U	/* GP1_8 (BKUP_TRG) */
28*91f16700Schasinglulu #define GPIO_BKUP_REQB_SHIFT_EBISU	14U	/* GP6_14(BKUP_REQB) */
29*91f16700Schasinglulu #define GPIO_BKUP_TRG_SHIFT_EBISU	13U	/* GP6_13(BKUP_TRG) */
30*91f16700Schasinglulu #define GPIO_BKUP_REQB_SHIFT_CONDOR	1U	/* GP3_1 (BKUP_REQB) */
31*91f16700Schasinglulu #define GPIO_BKUP_TRG_SHIFT_CONDOR	0U	/* GP3_0 (BKUP_TRG) */
32*91f16700Schasinglulu 
33*91f16700Schasinglulu #define DRAM_BKUP_TRG_LOOP_CNT		1000U
34*91f16700Schasinglulu #endif
35*91f16700Schasinglulu 
36*91f16700Schasinglulu void rcar_dram_get_boot_status(uint32_t *status)
37*91f16700Schasinglulu {
38*91f16700Schasinglulu #if RCAR_SYSTEM_SUSPEND
39*91f16700Schasinglulu 	uint32_t reg_data;
40*91f16700Schasinglulu 	uint32_t product;
41*91f16700Schasinglulu 	uint32_t shift;
42*91f16700Schasinglulu 	uint32_t gpio;
43*91f16700Schasinglulu 
44*91f16700Schasinglulu 	product = mmio_read_32(PRR) & PRR_PRODUCT_MASK;
45*91f16700Schasinglulu 	if (product == PRR_PRODUCT_V3H) {
46*91f16700Schasinglulu 		shift = GPIO_BKUP_TRG_SHIFT_CONDOR;
47*91f16700Schasinglulu 		gpio = GPIO_INDT3;
48*91f16700Schasinglulu 	} else if (product == PRR_PRODUCT_E3) {
49*91f16700Schasinglulu 		shift = GPIO_BKUP_TRG_SHIFT_EBISU;
50*91f16700Schasinglulu 		gpio = GPIO_INDT6;
51*91f16700Schasinglulu 	} else {
52*91f16700Schasinglulu 		shift = GPIO_BKUP_TRG_SHIFT_SALVATOR;
53*91f16700Schasinglulu 		gpio = GPIO_INDT1;
54*91f16700Schasinglulu 	}
55*91f16700Schasinglulu 
56*91f16700Schasinglulu 	reg_data = mmio_read_32(gpio);
57*91f16700Schasinglulu 	if (reg_data & BIT(shift))
58*91f16700Schasinglulu 		*status = DRAM_BOOT_STATUS_WARM;
59*91f16700Schasinglulu 	else
60*91f16700Schasinglulu 		*status = DRAM_BOOT_STATUS_COLD;
61*91f16700Schasinglulu #else	/* RCAR_SYSTEM_SUSPEND */
62*91f16700Schasinglulu 	*status = DRAM_BOOT_STATUS_COLD;
63*91f16700Schasinglulu #endif	/* RCAR_SYSTEM_SUSPEND */
64*91f16700Schasinglulu }
65*91f16700Schasinglulu 
66*91f16700Schasinglulu int32_t rcar_dram_update_boot_status(uint32_t status)
67*91f16700Schasinglulu {
68*91f16700Schasinglulu 	int32_t ret = 0;
69*91f16700Schasinglulu #if RCAR_SYSTEM_SUSPEND
70*91f16700Schasinglulu 	uint32_t reg_data;
71*91f16700Schasinglulu #if PMIC_ROHM_BD9571
72*91f16700Schasinglulu #if DRAM_BACKUP_GPIO_USE == 0
73*91f16700Schasinglulu 	uint8_t bkup_mode_cnt = 0U;
74*91f16700Schasinglulu #else
75*91f16700Schasinglulu 	uint32_t reqb, outd;
76*91f16700Schasinglulu #endif
77*91f16700Schasinglulu 	uint8_t qllm_cnt = 0U;
78*91f16700Schasinglulu 	int32_t i2c_dvfs_ret = -1;
79*91f16700Schasinglulu #endif
80*91f16700Schasinglulu 	uint32_t loop_count;
81*91f16700Schasinglulu 	uint32_t product;
82*91f16700Schasinglulu 	uint32_t trg;
83*91f16700Schasinglulu 	uint32_t gpio;
84*91f16700Schasinglulu 
85*91f16700Schasinglulu 	product = mmio_read_32(PRR) & PRR_PRODUCT_MASK;
86*91f16700Schasinglulu 	if (product == PRR_PRODUCT_V3H) {
87*91f16700Schasinglulu #if DRAM_BACKUP_GPIO_USE == 1
88*91f16700Schasinglulu 		reqb = GPIO_BKUP_REQB_SHIFT_CONDOR;
89*91f16700Schasinglulu 		outd = GPIO_OUTDT3;
90*91f16700Schasinglulu #endif
91*91f16700Schasinglulu 		trg = GPIO_BKUP_TRG_SHIFT_CONDOR;
92*91f16700Schasinglulu 		gpio = GPIO_INDT3;
93*91f16700Schasinglulu 	} else if (product == PRR_PRODUCT_E3) {
94*91f16700Schasinglulu #if DRAM_BACKUP_GPIO_USE == 1
95*91f16700Schasinglulu 		reqb = GPIO_BKUP_REQB_SHIFT_EBISU;
96*91f16700Schasinglulu 		outd = GPIO_OUTDT6;
97*91f16700Schasinglulu #endif
98*91f16700Schasinglulu 		trg = GPIO_BKUP_TRG_SHIFT_EBISU;
99*91f16700Schasinglulu 		gpio = GPIO_INDT6;
100*91f16700Schasinglulu 	} else {
101*91f16700Schasinglulu #if DRAM_BACKUP_GPIO_USE == 1
102*91f16700Schasinglulu 		reqb = GPIO_BKUP_REQB_SHIFT_SALVATOR;
103*91f16700Schasinglulu 		outd = GPIO_OUTDT1;
104*91f16700Schasinglulu #endif
105*91f16700Schasinglulu 		trg = GPIO_BKUP_TRG_SHIFT_SALVATOR;
106*91f16700Schasinglulu 		gpio = GPIO_INDT1;
107*91f16700Schasinglulu 	}
108*91f16700Schasinglulu 
109*91f16700Schasinglulu 	if (status == DRAM_BOOT_STATUS_WARM) {
110*91f16700Schasinglulu #if DRAM_BACKUP_GPIO_USE == 1
111*91f16700Schasinglulu 		mmio_setbits_32(outd, BIT(reqb));
112*91f16700Schasinglulu #else
113*91f16700Schasinglulu #if PMIC_ROHM_BD9571
114*91f16700Schasinglulu 		/* Set BKUP_CRTL_OUT=High (BKUP mode cnt register) */
115*91f16700Schasinglulu 		i2c_dvfs_ret = rcar_iic_dvfs_receive(PMIC_SLAVE_ADDR,
116*91f16700Schasinglulu 						     PMIC_BKUP_MODE_CNT,
117*91f16700Schasinglulu 						     &bkup_mode_cnt);
118*91f16700Schasinglulu 		if (i2c_dvfs_ret) {
119*91f16700Schasinglulu 			ERROR("BKUP mode cnt READ ERROR.\n");
120*91f16700Schasinglulu 			ret = DRAM_UPDATE_STATUS_ERR;
121*91f16700Schasinglulu 		} else {
122*91f16700Schasinglulu 			bkup_mode_cnt &= (uint8_t)~BIT_BKUP_CTRL_OUT;
123*91f16700Schasinglulu 			i2c_dvfs_ret = rcar_iic_dvfs_send(PMIC_SLAVE_ADDR,
124*91f16700Schasinglulu 							  PMIC_BKUP_MODE_CNT,
125*91f16700Schasinglulu 							  bkup_mode_cnt);
126*91f16700Schasinglulu 			if (i2c_dvfs_ret) {
127*91f16700Schasinglulu 				ERROR("BKUP mode cnt WRITE ERROR. value = %d\n",
128*91f16700Schasinglulu 				      bkup_mode_cnt);
129*91f16700Schasinglulu 				ret = DRAM_UPDATE_STATUS_ERR;
130*91f16700Schasinglulu 			}
131*91f16700Schasinglulu 		}
132*91f16700Schasinglulu #endif /* PMIC_ROHM_BD9571 */
133*91f16700Schasinglulu #endif /* DRAM_BACKUP_GPIO_USE == 1 */
134*91f16700Schasinglulu 		/* Wait BKUP_TRG=Low */
135*91f16700Schasinglulu 		loop_count = DRAM_BKUP_TRG_LOOP_CNT;
136*91f16700Schasinglulu 		while (loop_count > 0) {
137*91f16700Schasinglulu 			reg_data = mmio_read_32(gpio);
138*91f16700Schasinglulu 			if (!(reg_data & BIT(trg)))
139*91f16700Schasinglulu 				break;
140*91f16700Schasinglulu 			loop_count--;
141*91f16700Schasinglulu 		}
142*91f16700Schasinglulu 
143*91f16700Schasinglulu 		if (!loop_count) {
144*91f16700Schasinglulu 			ERROR("\nWarm booting...\n"
145*91f16700Schasinglulu 			      " The potential of BKUP_TRG did not switch to Low.\n"
146*91f16700Schasinglulu 			      " If you expect the operation of cold boot,\n"
147*91f16700Schasinglulu 			      " check the board configuration (ex, Dip-SW) and/or the H/W failure.\n");
148*91f16700Schasinglulu 			ret = DRAM_UPDATE_STATUS_ERR;
149*91f16700Schasinglulu 		}
150*91f16700Schasinglulu 	}
151*91f16700Schasinglulu #if PMIC_ROHM_BD9571
152*91f16700Schasinglulu 	if (!ret) {
153*91f16700Schasinglulu 		qllm_cnt = BIT_QLLM_DDR0_EN | BIT_QLLM_DDR1_EN;
154*91f16700Schasinglulu 		i2c_dvfs_ret = rcar_iic_dvfs_send(PMIC_SLAVE_ADDR,
155*91f16700Schasinglulu 						  PMIC_QLLM_CNT,
156*91f16700Schasinglulu 						  qllm_cnt);
157*91f16700Schasinglulu 		if (i2c_dvfs_ret) {
158*91f16700Schasinglulu 			ERROR("QLLM cnt WRITE ERROR. value = %d\n", qllm_cnt);
159*91f16700Schasinglulu 			ret = DRAM_UPDATE_STATUS_ERR;
160*91f16700Schasinglulu 		}
161*91f16700Schasinglulu 	}
162*91f16700Schasinglulu #endif
163*91f16700Schasinglulu #endif
164*91f16700Schasinglulu 	return ret;
165*91f16700Schasinglulu }
166