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