blob: 52a3ca2cef262c9010a6c3e100264e8e960f64cb [file] [log] [blame]
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001/*
2 * Copyright (c) 2017-2018, Renesas Electronics Corporation. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008
9#include <common/debug.h>
10
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020011#include "../qos_common.h"
12#include "../qos_reg.h"
13#include "qos_init_m3n_v10.h"
14
Marek Vasut48cc6932018-12-12 16:35:00 +010015#define RCAR_QOS_VERSION "rev.0.08"
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020016
17#define QOSCTRL_EARLYR (QOS_BASE1 + 0x0060U)
18#define QOSCTRL_FSS (QOS_BASE1 + 0x0048U)
19
20#define REF_ARS_ARBSTOPCYCLE_M3N (((SL_INIT_SSLOTCLK_M3N) - 5U) << 16U)
21
22#define QOSWT_TIME_BANK0 (20000000U) /* unit:ns */
23
24#define QOSWT_WTEN_ENABLE (0x1U)
25
26#define OSWT_WTREF_SLOT0_EN_REQ1_SLOT (3U)
27#define OSWT_WTREF_SLOT0_EN_REQ2_SLOT (9U)
28#define QOSWT_WTREF_SLOT0_EN ((0x1U << OSWT_WTREF_SLOT0_EN_REQ1_SLOT) | (0x1U << OSWT_WTREF_SLOT0_EN_REQ2_SLOT))
29#define QOSWT_WTREF_SLOT1_EN QOSWT_WTREF_SLOT0_EN
30
31#define QOSWT_WTSET0_REQ_SSLOT0 (5U)
32#define WT_BASE_SUB_SLOT_NUM0 (12U)
33#define QOSWT_WTSET0_PERIOD0_M3N ((QOSWT_TIME_BANK0/QOSWT_WTSET0_CYCLE_M3N)-1U)
34#define QOSWT_WTSET0_SSLOT0 (QOSWT_WTSET0_REQ_SSLOT0 -1U)
35#define QOSWT_WTSET0_SLOTSLOT0 (WT_BASE_SUB_SLOT_NUM0 -1U)
36
37#define QOSWT_WTSET1_PERIOD1_M3N QOSWT_WTSET0_PERIOD0_M3N
38#define QOSWT_WTSET1_SSLOT1 QOSWT_WTSET0_SSLOT0
39#define QOSWT_WTSET1_SLOTSLOT1 QOSWT_WTSET0_SLOTSLOT0
40
41#if RCAR_QOS_TYPE == RCAR_QOS_TYPE_DEFAULT
42
43#if RCAR_REF_INT == RCAR_REF_DEFAULT
44#include "qos_init_m3n_v10_mstat195.h"
45#else
46#include "qos_init_m3n_v10_mstat390.h"
47#endif
48
49#if RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE
50
51#if RCAR_REF_INT == RCAR_REF_DEFAULT
52#include "qos_init_m3n_v10_qoswt195.h"
53#else
54#include "qos_init_m3n_v10_qoswt390.h"
55#endif
56
57#endif /* RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE */
58#endif
59
60static void dbsc_setting(void)
61{
62 uint32_t md = 0;
63
64 /* Register write enable */
65 io_write_32(DBSC_DBSYSCNT0, 0x00001234U);
66
67 /* BUFCAM settings */
68 io_write_32(DBSC_DBCAM0CNF1, 0x00043218); /* dbcam0cnf1 */
69 io_write_32(DBSC_DBCAM0CNF2, 0x000000F4); /* dbcam0cnf2 */
70 io_write_32(DBSC_DBSCHCNT0, 0x000F0037); /* dbschcnt0 */
71 io_write_32(DBSC_DBSCHSZ0, 0x00000001); /* dbschsz0 */
72 io_write_32(DBSC_DBSCHRW0, 0x22421111); /* dbschrw0 */
73
74 md = (*((volatile uint32_t *)RST_MODEMR) & 0x000A0000) >> 17;
75
76 switch (md) {
77 case 0x0:
78 /* DDR3200 */
79 io_write_32(DBSC_SCFCTST2, 0x012F1123);
80 break;
81 case 0x1: /* MD19=0,MD17=1 : LPDDR4-3000, 4GByte(1GByte x4) */
82 /* DDR2800 */
83 io_write_32(DBSC_SCFCTST2, 0x012F1123);
84 break;
85 case 0x4: /* MD19=1,MD17=0 : LPDDR4-2400, 4GByte(1GByte x4) */
86 /* DDR2400 */
87 io_write_32(DBSC_SCFCTST2, 0x012F1123);
88 break;
89 default: /* MD19=1,MD17=1 : LPDDR4-1600, 4GByte(1GByte x4) */
90 /* DDR1600 */
91 io_write_32(DBSC_SCFCTST2, 0x012F1123);
92 break;
93 }
94
95 /* QoS Settings */
96 io_write_32(DBSC_DBSCHQOS00, 0x00000F00);
97 io_write_32(DBSC_DBSCHQOS01, 0x00000B00);
98 io_write_32(DBSC_DBSCHQOS02, 0x00000000);
99 io_write_32(DBSC_DBSCHQOS03, 0x00000000);
100 io_write_32(DBSC_DBSCHQOS40, 0x00000300);
101 io_write_32(DBSC_DBSCHQOS41, 0x000002F0);
102 io_write_32(DBSC_DBSCHQOS42, 0x00000200);
103 io_write_32(DBSC_DBSCHQOS43, 0x00000100);
104 io_write_32(DBSC_DBSCHQOS90, 0x00000100);
105 io_write_32(DBSC_DBSCHQOS91, 0x000000F0);
106 io_write_32(DBSC_DBSCHQOS92, 0x000000A0);
107 io_write_32(DBSC_DBSCHQOS93, 0x00000040);
108 io_write_32(DBSC_DBSCHQOS130, 0x00000100);
109 io_write_32(DBSC_DBSCHQOS131, 0x000000F0);
110 io_write_32(DBSC_DBSCHQOS132, 0x000000A0);
111 io_write_32(DBSC_DBSCHQOS133, 0x00000040);
112 io_write_32(DBSC_DBSCHQOS140, 0x000000C0);
113 io_write_32(DBSC_DBSCHQOS141, 0x000000B0);
114 io_write_32(DBSC_DBSCHQOS142, 0x00000080);
115 io_write_32(DBSC_DBSCHQOS143, 0x00000040);
116 io_write_32(DBSC_DBSCHQOS150, 0x00000040);
117 io_write_32(DBSC_DBSCHQOS151, 0x00000030);
118 io_write_32(DBSC_DBSCHQOS152, 0x00000020);
119 io_write_32(DBSC_DBSCHQOS153, 0x00000010);
120
121 /* Register write protect */
122 io_write_32(DBSC_DBSYSCNT0, 0x00000000U);
123}
124
125void qos_init_m3n_v10(void)
126{
127 dbsc_setting();
128
129 /* DRAM Split Address mapping */
130#if RCAR_DRAM_SPLIT == RCAR_DRAM_SPLIT_4CH
131#if RCAR_LSI == RCAR_M3N
132#error "Don't set DRAM Split 4ch(M3N)"
133#else
134 ERROR("DRAM Split 4ch not supported.(M3N)");
135 panic();
136#endif
137#elif (RCAR_DRAM_SPLIT == RCAR_DRAM_SPLIT_2CH)
138#if RCAR_LSI == RCAR_M3N
139#error "Don't set DRAM Split 2ch(M3N)"
140#else
141 ERROR("DRAM Split 2ch not supported.(M3N)");
142 panic();
143#endif
144#else
145 NOTICE("BL2: DRAM Split is OFF\n");
146#endif
147
148#if !(RCAR_QOS_TYPE == RCAR_QOS_NONE)
149#if RCAR_QOS_TYPE == RCAR_QOS_TYPE_DEFAULT
150 NOTICE("BL2: QoS is default setting(%s)\n", RCAR_QOS_VERSION);
151#endif
152
153#if RCAR_REF_INT == RCAR_REF_DEFAULT
154 NOTICE("BL2: DRAM refresh interval 1.95 usec\n");
155#else
156 NOTICE("BL2: DRAM refresh interval 3.9 usec\n");
157#endif
158
159#if RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE
160 NOTICE("BL2: Periodic Write DQ Training\n");
161#endif /* RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE */
162
163 io_write_32(QOSCTRL_RAS, 0x00000028U);
164 io_write_64(QOSCTRL_DANN, 0x0402000002020201UL);
165 io_write_32(QOSCTRL_DANT, 0x00100804U);
166 io_write_32(QOSCTRL_FSS, 0x0000000AU);
167 io_write_32(QOSCTRL_INSFC, 0x06330001U);
168 io_write_32(QOSCTRL_EARLYR, 0x00000001U);
169 io_write_32(QOSCTRL_RACNT0, 0x00010003U);
170
171 io_write_32(QOSCTRL_SL_INIT,
172 SL_INIT_REFFSSLOT | SL_INIT_SLOTSSLOT |
173 SL_INIT_SSLOTCLK_M3N);
174 io_write_32(QOSCTRL_REF_ARS, REF_ARS_ARBSTOPCYCLE_M3N);
175
176 {
177 uint32_t i;
178
179 for (i = 0U; i < ARRAY_SIZE(mstat_fix); i++) {
180 io_write_64(QOSBW_FIX_QOS_BANK0 + i * 8, mstat_fix[i]);
181 io_write_64(QOSBW_FIX_QOS_BANK1 + i * 8, mstat_fix[i]);
182 }
183 for (i = 0U; i < ARRAY_SIZE(mstat_be); i++) {
184 io_write_64(QOSBW_BE_QOS_BANK0 + i * 8, mstat_be[i]);
185 io_write_64(QOSBW_BE_QOS_BANK1 + i * 8, mstat_be[i]);
186 }
187#if RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE
188 for (i = 0U; i < ARRAY_SIZE(qoswt_fix); i++) {
189 io_write_64(QOSWT_FIX_WTQOS_BANK0 + i * 8,
190 qoswt_fix[i]);
191 io_write_64(QOSWT_FIX_WTQOS_BANK1 + i * 8,
192 qoswt_fix[i]);
193 }
194 for (i = 0U; i < ARRAY_SIZE(qoswt_be); i++) {
195 io_write_64(QOSWT_BE_WTQOS_BANK0 + i * 8, qoswt_be[i]);
196 io_write_64(QOSWT_BE_WTQOS_BANK1 + i * 8, qoswt_be[i]);
197 }
198#endif /* RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE */
199 }
200
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200201 /* RT bus Leaf setting */
202 io_write_32(RT_ACT0, 0x00000000U);
203 io_write_32(RT_ACT1, 0x00000000U);
204
205 /* CCI bus Leaf setting */
206 io_write_32(CPU_ACT0, 0x00000003U);
207 io_write_32(CPU_ACT1, 0x00000003U);
208
209 io_write_32(QOSCTRL_RAEN, 0x00000001U);
210
211#if RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE
212 /* re-write training setting */
213 io_write_32(QOSWT_WTREF,
214 ((QOSWT_WTREF_SLOT1_EN << 16) | QOSWT_WTREF_SLOT0_EN));
215 io_write_32(QOSWT_WTSET0,
216 ((QOSWT_WTSET0_PERIOD0_M3N << 16) |
217 (QOSWT_WTSET0_SSLOT0 << 8) | QOSWT_WTSET0_SLOTSLOT0));
218 io_write_32(QOSWT_WTSET1,
219 ((QOSWT_WTSET1_PERIOD1_M3N << 16) |
220 (QOSWT_WTSET1_SSLOT1 << 8) | QOSWT_WTSET1_SLOTSLOT1));
221
222 io_write_32(QOSWT_WTEN, QOSWT_WTEN_ENABLE);
223#endif /* RCAR_REWT_TRAINING != RCAR_REWT_TRAINING_DISABLE */
224
225 io_write_32(QOSCTRL_STATQC, 0x00000001U);
226#else
227 NOTICE("BL2: QoS is None\n");
228
229 io_write_32(QOSCTRL_RAEN, 0x00000001U);
230#endif /* !(RCAR_QOS_TYPE == RCAR_QOS_NONE) */
231}