1
2
3
4
5
6
7
8#include <linux/init.h>
9#include <linux/of_fdt.h>
10#include <linux/libfdt.h>
11#include <linux/smp.h>
12#include <asm/arcregs.h>
13#include <asm/io.h>
14#include <asm/mach_desc.h>
15
16int arc_hsdk_axi_dmac_coherent __section(".data") = 0;
17
18#define ARC_CCM_UNUSED_ADDR 0x60000000
19
20
21#define ARC_PERIPHERAL_BASE 0xf0000000
22#define CREG_BASE (ARC_PERIPHERAL_BASE + 0x1000)
23
24#define SDIO_BASE (ARC_PERIPHERAL_BASE + 0xA000)
25#define SDIO_UHS_REG_EXT (SDIO_BASE + 0x108)
26#define SDIO_UHS_REG_EXT_DIV_2 (2 << 30)
27
28#define HSDK_GPIO_INTC (ARC_PERIPHERAL_BASE + 0x3000)
29
30static void __init hsdk_enable_gpio_intc_wire(void)
31{
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75#define GPIO_INTEN (HSDK_GPIO_INTC + 0x30)
76#define GPIO_INTMASK (HSDK_GPIO_INTC + 0x34)
77#define GPIO_INTTYPE_LEVEL (HSDK_GPIO_INTC + 0x38)
78#define GPIO_INT_POLARITY (HSDK_GPIO_INTC + 0x3c)
79#define GPIO_INT_CONNECTED_MASK 0x0d
80
81 iowrite32(0xffffffff, (void __iomem *) GPIO_INTMASK);
82 iowrite32(~GPIO_INT_CONNECTED_MASK, (void __iomem *) GPIO_INTMASK);
83 iowrite32(0x00000000, (void __iomem *) GPIO_INTTYPE_LEVEL);
84 iowrite32(0xffffffff, (void __iomem *) GPIO_INT_POLARITY);
85 iowrite32(GPIO_INT_CONNECTED_MASK, (void __iomem *) GPIO_INTEN);
86}
87
88static int __init hsdk_tweak_node_coherency(const char *path, bool coherent)
89{
90 void *fdt = initial_boot_params;
91 const void *prop;
92 int node, ret;
93 bool dt_coh_set;
94
95 node = fdt_path_offset(fdt, path);
96 if (node < 0)
97 goto tweak_fail;
98
99 prop = fdt_getprop(fdt, node, "dma-coherent", &ret);
100 if (!prop && ret != -FDT_ERR_NOTFOUND)
101 goto tweak_fail;
102
103 dt_coh_set = ret != -FDT_ERR_NOTFOUND;
104 ret = 0;
105
106
107 if (dt_coh_set && !coherent)
108 ret = fdt_delprop(fdt, node, "dma-coherent");
109
110
111 if (!dt_coh_set && coherent)
112 ret = fdt_setprop(fdt, node, "dma-coherent", NULL, 0);
113
114 if (ret < 0)
115 goto tweak_fail;
116
117 return 0;
118
119tweak_fail:
120 pr_err("failed to tweak %s to %scoherent\n", path, coherent ? "" : "non");
121 return -EFAULT;
122}
123
124enum hsdk_axi_masters {
125 M_HS_CORE = 0,
126 M_HS_RTT,
127 M_AXI_TUN,
128 M_HDMI_VIDEO,
129 M_HDMI_AUDIO,
130 M_USB_HOST,
131 M_ETHERNET,
132 M_SDIO,
133 M_GPU,
134 M_DMAC_0,
135 M_DMAC_1,
136 M_DVFS
137};
138
139#define UPDATE_VAL 1
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178#define CREG_AXI_M_SLV0(m) ((void __iomem *)(CREG_BASE + 0x20 * (m)))
179#define CREG_AXI_M_SLV1(m) ((void __iomem *)(CREG_BASE + 0x20 * (m) + 0x04))
180#define CREG_AXI_M_OFT0(m) ((void __iomem *)(CREG_BASE + 0x20 * (m) + 0x08))
181#define CREG_AXI_M_OFT1(m) ((void __iomem *)(CREG_BASE + 0x20 * (m) + 0x0C))
182#define CREG_AXI_M_UPDT(m) ((void __iomem *)(CREG_BASE + 0x20 * (m) + 0x14))
183
184#define CREG_AXI_M_HS_CORE_BOOT ((void __iomem *)(CREG_BASE + 0x010))
185
186#define CREG_PAE ((void __iomem *)(CREG_BASE + 0x180))
187#define CREG_PAE_UPDT ((void __iomem *)(CREG_BASE + 0x194))
188
189static void __init hsdk_init_memory_bridge_axi_dmac(void)
190{
191 bool coherent = !!arc_hsdk_axi_dmac_coherent;
192 u32 axi_m_slv1, axi_m_oft1;
193
194
195
196
197
198 if (hsdk_tweak_node_coherency("/soc/dmac@80000", coherent))
199 return;
200
201 if (coherent) {
202 axi_m_slv1 = 0x77999999;
203 axi_m_oft1 = 0x76DCBA98;
204 } else {
205 axi_m_slv1 = 0x77777777;
206 axi_m_oft1 = 0x76543210;
207 }
208
209 writel(0x77777777, CREG_AXI_M_SLV0(M_DMAC_0));
210 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_DMAC_0));
211 writel(axi_m_slv1, CREG_AXI_M_SLV1(M_DMAC_0));
212 writel(axi_m_oft1, CREG_AXI_M_OFT1(M_DMAC_0));
213 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_DMAC_0));
214
215 writel(0x77777777, CREG_AXI_M_SLV0(M_DMAC_1));
216 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_DMAC_1));
217 writel(axi_m_slv1, CREG_AXI_M_SLV1(M_DMAC_1));
218 writel(axi_m_oft1, CREG_AXI_M_OFT1(M_DMAC_1));
219 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_DMAC_1));
220}
221
222static void __init hsdk_init_memory_bridge(void)
223{
224 u32 reg;
225
226
227
228
229
230
231 reg = readl(CREG_AXI_M_HS_CORE_BOOT) & (~0x3);
232 writel(reg, CREG_AXI_M_HS_CORE_BOOT);
233 writel(0x11111111, CREG_AXI_M_SLV0(M_HS_CORE));
234 writel(0x63111111, CREG_AXI_M_SLV1(M_HS_CORE));
235 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_HS_CORE));
236 writel(0x0E543210, CREG_AXI_M_OFT1(M_HS_CORE));
237 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_HS_CORE));
238
239 writel(0x77777777, CREG_AXI_M_SLV0(M_HS_RTT));
240 writel(0x77777777, CREG_AXI_M_SLV1(M_HS_RTT));
241 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_HS_RTT));
242 writel(0x76543210, CREG_AXI_M_OFT1(M_HS_RTT));
243 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_HS_RTT));
244
245 writel(0x88888888, CREG_AXI_M_SLV0(M_AXI_TUN));
246 writel(0x88888888, CREG_AXI_M_SLV1(M_AXI_TUN));
247 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_AXI_TUN));
248 writel(0x76543210, CREG_AXI_M_OFT1(M_AXI_TUN));
249 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_AXI_TUN));
250
251 writel(0x77777777, CREG_AXI_M_SLV0(M_HDMI_VIDEO));
252 writel(0x77777777, CREG_AXI_M_SLV1(M_HDMI_VIDEO));
253 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_HDMI_VIDEO));
254 writel(0x76543210, CREG_AXI_M_OFT1(M_HDMI_VIDEO));
255 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_HDMI_VIDEO));
256
257 writel(0x77777777, CREG_AXI_M_SLV0(M_HDMI_AUDIO));
258 writel(0x77777777, CREG_AXI_M_SLV1(M_HDMI_AUDIO));
259 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_HDMI_AUDIO));
260 writel(0x76543210, CREG_AXI_M_OFT1(M_HDMI_AUDIO));
261 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_HDMI_AUDIO));
262
263 writel(0x77777777, CREG_AXI_M_SLV0(M_USB_HOST));
264 writel(0x77999999, CREG_AXI_M_SLV1(M_USB_HOST));
265 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_USB_HOST));
266 writel(0x76DCBA98, CREG_AXI_M_OFT1(M_USB_HOST));
267 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_USB_HOST));
268
269 writel(0x77777777, CREG_AXI_M_SLV0(M_ETHERNET));
270 writel(0x77999999, CREG_AXI_M_SLV1(M_ETHERNET));
271 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_ETHERNET));
272 writel(0x76DCBA98, CREG_AXI_M_OFT1(M_ETHERNET));
273 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_ETHERNET));
274
275 writel(0x77777777, CREG_AXI_M_SLV0(M_SDIO));
276 writel(0x77999999, CREG_AXI_M_SLV1(M_SDIO));
277 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_SDIO));
278 writel(0x76DCBA98, CREG_AXI_M_OFT1(M_SDIO));
279 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_SDIO));
280
281 writel(0x77777777, CREG_AXI_M_SLV0(M_GPU));
282 writel(0x77777777, CREG_AXI_M_SLV1(M_GPU));
283 writel(0xFEDCBA98, CREG_AXI_M_OFT0(M_GPU));
284 writel(0x76543210, CREG_AXI_M_OFT1(M_GPU));
285 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_GPU));
286
287 writel(0x00000000, CREG_AXI_M_SLV0(M_DVFS));
288 writel(0x60000000, CREG_AXI_M_SLV1(M_DVFS));
289 writel(0x00000000, CREG_AXI_M_OFT0(M_DVFS));
290 writel(0x00000000, CREG_AXI_M_OFT1(M_DVFS));
291 writel(UPDATE_VAL, CREG_AXI_M_UPDT(M_DVFS));
292
293 hsdk_init_memory_bridge_axi_dmac();
294
295
296
297
298
299
300
301 writel(0x00000000, CREG_PAE);
302 writel(UPDATE_VAL, CREG_PAE_UPDT);
303}
304
305static void __init hsdk_init_early(void)
306{
307 hsdk_init_memory_bridge();
308
309
310
311
312
313 iowrite32(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *) SDIO_UHS_REG_EXT);
314
315 hsdk_enable_gpio_intc_wire();
316}
317
318static const char *hsdk_compat[] __initconst = {
319 "snps,hsdk",
320 NULL,
321};
322
323MACHINE_START(SIMULATION, "hsdk")
324 .dt_compat = hsdk_compat,
325 .init_early = hsdk_init_early,
326MACHINE_END
327