xref: /arm-trusted-firmware/drivers/renesas/rcar/qos/H3/qos_init_h3_v11.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 <stdint.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/debug.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include <rcar_def.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #include "../qos_common.h"
14*91f16700Schasinglulu #include "../qos_reg.h"
15*91f16700Schasinglulu #include "qos_init_h3_v11.h"
16*91f16700Schasinglulu 
17*91f16700Schasinglulu #define	RCAR_QOS_VERSION		"rev.0.37"
18*91f16700Schasinglulu 
19*91f16700Schasinglulu #include "qos_init_h3_v11_mstat.h"
20*91f16700Schasinglulu 
21*91f16700Schasinglulu struct rcar_gen3_dbsc_qos_settings h3_v11_qos[] = {
22*91f16700Schasinglulu 	/* BUFCAM settings */
23*91f16700Schasinglulu 	/* DBSC_DBCAM0CNF0 not set */
24*91f16700Schasinglulu 	{ DBSC_DBCAM0CNF1, 0x00044218 },
25*91f16700Schasinglulu 	{ DBSC_DBCAM0CNF2, 0x000000F4 },
26*91f16700Schasinglulu 	/* DBSC_DBCAM0CNF3 not set */
27*91f16700Schasinglulu 	{ DBSC_DBSCHCNT0, 0x080F0037 },
28*91f16700Schasinglulu 	{ DBSC_DBSCHCNT1, 0x00001010 },
29*91f16700Schasinglulu 	{ DBSC_DBSCHSZ0, 0x00000001 },
30*91f16700Schasinglulu 	{ DBSC_DBSCHRW0, 0x22421111 },
31*91f16700Schasinglulu 
32*91f16700Schasinglulu 	/* DDR3 */
33*91f16700Schasinglulu 	{ DBSC_SCFCTST2, 0x012F1123 },
34*91f16700Schasinglulu 
35*91f16700Schasinglulu 	/* QoS Settings */
36*91f16700Schasinglulu 	{ DBSC_DBSCHQOS00, 0x0000F000 },
37*91f16700Schasinglulu 	{ DBSC_DBSCHQOS01, 0x0000E000 },
38*91f16700Schasinglulu 	{ DBSC_DBSCHQOS02, 0x00007000 },
39*91f16700Schasinglulu 	{ DBSC_DBSCHQOS03, 0x00000000 },
40*91f16700Schasinglulu 	{ DBSC_DBSCHQOS40, 0x00000E00 },
41*91f16700Schasinglulu 	{ DBSC_DBSCHQOS41, 0x00000DFF },
42*91f16700Schasinglulu 	{ DBSC_DBSCHQOS42, 0x00000400 },
43*91f16700Schasinglulu 	{ DBSC_DBSCHQOS43, 0x00000200 },
44*91f16700Schasinglulu 	{ DBSC_DBSCHQOS90, 0x00000C00 },
45*91f16700Schasinglulu 	{ DBSC_DBSCHQOS91, 0x00000BFF },
46*91f16700Schasinglulu 	{ DBSC_DBSCHQOS92, 0x00000400 },
47*91f16700Schasinglulu 	{ DBSC_DBSCHQOS93, 0x00000200 },
48*91f16700Schasinglulu 	{ DBSC_DBSCHQOS130, 0x00000980 },
49*91f16700Schasinglulu 	{ DBSC_DBSCHQOS131, 0x0000097F },
50*91f16700Schasinglulu 	{ DBSC_DBSCHQOS132, 0x00000300 },
51*91f16700Schasinglulu 	{ DBSC_DBSCHQOS133, 0x00000180 },
52*91f16700Schasinglulu 	{ DBSC_DBSCHQOS140, 0x00000800 },
53*91f16700Schasinglulu 	{ DBSC_DBSCHQOS141, 0x000007FF },
54*91f16700Schasinglulu 	{ DBSC_DBSCHQOS142, 0x00000300 },
55*91f16700Schasinglulu 	{ DBSC_DBSCHQOS143, 0x00000180 },
56*91f16700Schasinglulu 	{ DBSC_DBSCHQOS150, 0x000007D0 },
57*91f16700Schasinglulu 	{ DBSC_DBSCHQOS151, 0x000007CF },
58*91f16700Schasinglulu 	{ DBSC_DBSCHQOS152, 0x000005D0 },
59*91f16700Schasinglulu 	{ DBSC_DBSCHQOS153, 0x000003D0 },
60*91f16700Schasinglulu };
61*91f16700Schasinglulu 
62*91f16700Schasinglulu void qos_init_h3_v11(void)
63*91f16700Schasinglulu {
64*91f16700Schasinglulu 	rcar_qos_dbsc_setting(h3_v11_qos, ARRAY_SIZE(h3_v11_qos), false);
65*91f16700Schasinglulu 
66*91f16700Schasinglulu 	/* DRAM Split Address mapping */
67*91f16700Schasinglulu #if (RCAR_DRAM_SPLIT == RCAR_DRAM_SPLIT_4CH) || \
68*91f16700Schasinglulu     (RCAR_DRAM_SPLIT == RCAR_DRAM_SPLIT_AUTO)
69*91f16700Schasinglulu 	NOTICE("BL2: DRAM Split is 4ch\n");
70*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR0, ADSPLCR0_ADRMODE_DEFAULT
71*91f16700Schasinglulu 		    | ADSPLCR0_SPLITSEL(0xFFU)
72*91f16700Schasinglulu 		    | ADSPLCR0_AREA(0x1BU)
73*91f16700Schasinglulu 		    | ADSPLCR0_SWP);
74*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR1, 0x00000000U);
75*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR2, 0xA8A90000U);
76*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR3, 0x00000000U);
77*91f16700Schasinglulu #elif RCAR_DRAM_SPLIT == RCAR_DRAM_SPLIT_2CH
78*91f16700Schasinglulu 	NOTICE("BL2: DRAM Split is 2ch\n");
79*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR0, 0x00000000U);
80*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR1, ADSPLCR0_ADRMODE_DEFAULT
81*91f16700Schasinglulu 		    | ADSPLCR0_SPLITSEL(0xFFU)
82*91f16700Schasinglulu 		    | ADSPLCR0_AREA(0x1BU)
83*91f16700Schasinglulu 		    | ADSPLCR0_SWP);
84*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR2, 0x00000000U);
85*91f16700Schasinglulu 	io_write_32(AXI_ADSPLCR3, 0x00000000U);
86*91f16700Schasinglulu #else
87*91f16700Schasinglulu 	NOTICE("BL2: DRAM Split is OFF\n");
88*91f16700Schasinglulu #endif
89*91f16700Schasinglulu 
90*91f16700Schasinglulu #if !(RCAR_QOS_TYPE == RCAR_QOS_NONE)
91*91f16700Schasinglulu #if RCAR_QOS_TYPE  == RCAR_QOS_TYPE_DEFAULT
92*91f16700Schasinglulu 	NOTICE("BL2: QoS is default setting(%s)\n", RCAR_QOS_VERSION);
93*91f16700Schasinglulu #endif
94*91f16700Schasinglulu 
95*91f16700Schasinglulu 	/* AR Cache setting */
96*91f16700Schasinglulu 	io_write_32(0xE67D1000U, 0x00000100U);
97*91f16700Schasinglulu 	io_write_32(0xE67D1008U, 0x00000100U);
98*91f16700Schasinglulu 
99*91f16700Schasinglulu 	/* Resource Alloc setting */
100*91f16700Schasinglulu #if RCAR_DRAM_SPLIT == RCAR_DRAM_SPLIT_2CH
101*91f16700Schasinglulu 	io_write_32(QOSCTRL_RAS, 0x00000020U);
102*91f16700Schasinglulu #else
103*91f16700Schasinglulu 	io_write_32(QOSCTRL_RAS, 0x00000040U);
104*91f16700Schasinglulu #endif
105*91f16700Schasinglulu 	io_write_32(QOSCTRL_FIXTH, 0x000F0005U);
106*91f16700Schasinglulu 	io_write_32(QOSCTRL_REGGD, 0x00000000U);
107*91f16700Schasinglulu #if RCAR_DRAM_SPLIT == RCAR_DRAM_SPLIT_2CH
108*91f16700Schasinglulu 	io_write_64(QOSCTRL_DANN, 0x0101010102020201UL);
109*91f16700Schasinglulu 	io_write_32(QOSCTRL_DANT, 0x00181008U);
110*91f16700Schasinglulu #else
111*91f16700Schasinglulu 	io_write_64(QOSCTRL_DANN, 0x0101000004040401UL);
112*91f16700Schasinglulu 	io_write_32(QOSCTRL_DANT, 0x003C2010U);
113*91f16700Schasinglulu #endif
114*91f16700Schasinglulu 	io_write_32(QOSCTRL_EC, 0x00080001U);	/* need for H3 v1.* */
115*91f16700Schasinglulu 	io_write_64(QOSCTRL_EMS, 0x0000000000000000UL);
116*91f16700Schasinglulu 	io_write_32(QOSCTRL_INSFC, 0xC7840001U);
117*91f16700Schasinglulu 	io_write_32(QOSCTRL_BERR, 0x00000000U);
118*91f16700Schasinglulu 	io_write_32(QOSCTRL_RACNT0, 0x00000000U);
119*91f16700Schasinglulu 
120*91f16700Schasinglulu 	/* QOSBW setting */
121*91f16700Schasinglulu 	io_write_32(QOSCTRL_SL_INIT,
122*91f16700Schasinglulu 		    SL_INIT_REFFSSLOT | SL_INIT_SLOTSSLOT | SL_INIT_SSLOTCLK);
123*91f16700Schasinglulu 	io_write_32(QOSCTRL_REF_ARS, 0x00330000U);
124*91f16700Schasinglulu 
125*91f16700Schasinglulu 	/* QOSBW SRAM setting */
126*91f16700Schasinglulu 	uint32_t i;
127*91f16700Schasinglulu 
128*91f16700Schasinglulu 	for (i = 0U; i < ARRAY_SIZE(mstat_fix); i++) {
129*91f16700Schasinglulu 		io_write_64(QOSBW_FIX_QOS_BANK0 + i * 8, mstat_fix[i]);
130*91f16700Schasinglulu 		io_write_64(QOSBW_FIX_QOS_BANK1 + i * 8, mstat_fix[i]);
131*91f16700Schasinglulu 	}
132*91f16700Schasinglulu 	for (i = 0U; i < ARRAY_SIZE(mstat_be); i++) {
133*91f16700Schasinglulu 		io_write_64(QOSBW_BE_QOS_BANK0 + i * 8, mstat_be[i]);
134*91f16700Schasinglulu 		io_write_64(QOSBW_BE_QOS_BANK1 + i * 8, mstat_be[i]);
135*91f16700Schasinglulu 	}
136*91f16700Schasinglulu 
137*91f16700Schasinglulu 	/* 3DG bus Leaf setting */
138*91f16700Schasinglulu 	io_write_32(0xFD820808U, 0x00001234U);
139*91f16700Schasinglulu 	io_write_32(0xFD820800U, 0x0000003FU);
140*91f16700Schasinglulu 	io_write_32(0xFD821800U, 0x0000003FU);
141*91f16700Schasinglulu 	io_write_32(0xFD822800U, 0x0000003FU);
142*91f16700Schasinglulu 	io_write_32(0xFD823800U, 0x0000003FU);
143*91f16700Schasinglulu 	io_write_32(0xFD824800U, 0x0000003FU);
144*91f16700Schasinglulu 	io_write_32(0xFD825800U, 0x0000003FU);
145*91f16700Schasinglulu 	io_write_32(0xFD826800U, 0x0000003FU);
146*91f16700Schasinglulu 	io_write_32(0xFD827800U, 0x0000003FU);
147*91f16700Schasinglulu 
148*91f16700Schasinglulu 	/* VIO bus Leaf setting */
149*91f16700Schasinglulu 	io_write_32(0xFEB89800, 0x00000001U);
150*91f16700Schasinglulu 	io_write_32(0xFEB8A800, 0x00000001U);
151*91f16700Schasinglulu 	io_write_32(0xFEB8B800, 0x00000001U);
152*91f16700Schasinglulu 	io_write_32(0xFEB8C800, 0x00000001U);
153*91f16700Schasinglulu 
154*91f16700Schasinglulu 	/* HSC bus Leaf setting */
155*91f16700Schasinglulu 	io_write_32(0xE6430800, 0x00000001U);
156*91f16700Schasinglulu 	io_write_32(0xE6431800, 0x00000001U);
157*91f16700Schasinglulu 	io_write_32(0xE6432800, 0x00000001U);
158*91f16700Schasinglulu 	io_write_32(0xE6433800, 0x00000001U);
159*91f16700Schasinglulu 
160*91f16700Schasinglulu 	/* MP bus Leaf setting */
161*91f16700Schasinglulu 	io_write_32(0xEC620800, 0x00000001U);
162*91f16700Schasinglulu 	io_write_32(0xEC621800, 0x00000001U);
163*91f16700Schasinglulu 
164*91f16700Schasinglulu 	/* PERIE bus Leaf setting */
165*91f16700Schasinglulu 	io_write_32(0xE7760800, 0x00000001U);
166*91f16700Schasinglulu 	io_write_32(0xE7768800, 0x00000001U);
167*91f16700Schasinglulu 
168*91f16700Schasinglulu 	/* PERIW bus Leaf setting */
169*91f16700Schasinglulu 	io_write_32(0xE6760800, 0x00000001U);
170*91f16700Schasinglulu 	io_write_32(0xE6768800, 0x00000001U);
171*91f16700Schasinglulu 
172*91f16700Schasinglulu 	/* RT bus Leaf setting */
173*91f16700Schasinglulu 	io_write_32(0xFFC50800, 0x00000001U);
174*91f16700Schasinglulu 	io_write_32(0xFFC51800, 0x00000001U);
175*91f16700Schasinglulu 
176*91f16700Schasinglulu 	/* CCI bus Leaf setting */
177*91f16700Schasinglulu 	uint32_t modemr = io_read_32(RCAR_MODEMR);
178*91f16700Schasinglulu 
179*91f16700Schasinglulu 	modemr &= MODEMR_BOOT_CPU_MASK;
180*91f16700Schasinglulu 
181*91f16700Schasinglulu 	if ((modemr == MODEMR_BOOT_CPU_CA57) ||
182*91f16700Schasinglulu 	    (modemr == MODEMR_BOOT_CPU_CA53)) {
183*91f16700Schasinglulu 		io_write_32(0xF1300800, 0x00000001U);
184*91f16700Schasinglulu 		io_write_32(0xF1340800, 0x00000001U);
185*91f16700Schasinglulu 		io_write_32(0xF1380800, 0x00000001U);
186*91f16700Schasinglulu 		io_write_32(0xF13C0800, 0x00000001U);
187*91f16700Schasinglulu 	}
188*91f16700Schasinglulu 
189*91f16700Schasinglulu 	/* Resource Alloc start */
190*91f16700Schasinglulu 	io_write_32(QOSCTRL_RAEN, 0x00000001U);
191*91f16700Schasinglulu 
192*91f16700Schasinglulu 	/* QOSBW start */
193*91f16700Schasinglulu 	io_write_32(QOSCTRL_STATQC, 0x00000001U);
194*91f16700Schasinglulu #else
195*91f16700Schasinglulu 	NOTICE("BL2: QoS is None\n");
196*91f16700Schasinglulu 
197*91f16700Schasinglulu 	/* Resource Alloc setting */
198*91f16700Schasinglulu 	io_write_32(QOSCTRL_EC, 0x00080001U);	/* need for H3 v1.* */
199*91f16700Schasinglulu #endif /* !(RCAR_QOS_TYPE == RCAR_QOS_NONE) */
200*91f16700Schasinglulu }
201