armadaxp_machdep.c revision 1.1 1 1.1 rkujawa /*******************************************************************************
2 1.1 rkujawa Copyright (C) Marvell International Ltd. and its affiliates
3 1.1 rkujawa
4 1.1 rkujawa Developed by Semihalf
5 1.1 rkujawa
6 1.1 rkujawa ********************************************************************************
7 1.1 rkujawa Marvell BSD License
8 1.1 rkujawa
9 1.1 rkujawa If you received this File from Marvell, you may opt to use, redistribute and/or
10 1.1 rkujawa modify this File under the following licensing terms.
11 1.1 rkujawa Redistribution and use in source and binary forms, with or without modification,
12 1.1 rkujawa are permitted provided that the following conditions are met:
13 1.1 rkujawa
14 1.1 rkujawa * Redistributions of source code must retain the above copyright notice,
15 1.1 rkujawa this list of conditions and the following disclaimer.
16 1.1 rkujawa
17 1.1 rkujawa * Redistributions in binary form must reproduce the above copyright
18 1.1 rkujawa notice, this list of conditions and the following disclaimer in the
19 1.1 rkujawa documentation and/or other materials provided with the distribution.
20 1.1 rkujawa
21 1.1 rkujawa * Neither the name of Marvell nor the names of its contributors may be
22 1.1 rkujawa used to endorse or promote products derived from this software without
23 1.1 rkujawa specific prior written permission.
24 1.1 rkujawa
25 1.1 rkujawa THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
26 1.1 rkujawa ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27 1.1 rkujawa WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 1.1 rkujawa DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
29 1.1 rkujawa ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 1.1 rkujawa (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 1.1 rkujawa LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
32 1.1 rkujawa ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 1.1 rkujawa (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 1.1 rkujawa SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 1.1 rkujawa
36 1.1 rkujawa *******************************************************************************/
37 1.1 rkujawa
38 1.1 rkujawa #include <sys/cdefs.h>
39 1.1 rkujawa __KERNEL_RCSID(0, "$NetBSD: armadaxp_machdep.c,v 1.1 2013/05/29 19:55:56 rkujawa Exp $");
40 1.1 rkujawa
41 1.1 rkujawa #include "opt_machdep.h"
42 1.1 rkujawa #include "opt_mvsoc.h"
43 1.1 rkujawa #include "opt_evbarm_boardtype.h"
44 1.1 rkujawa #include "opt_com.h"
45 1.1 rkujawa #include "opt_ddb.h"
46 1.1 rkujawa #include "opt_kgdb.h"
47 1.1 rkujawa #include "opt_pci.h"
48 1.1 rkujawa #include "opt_ipkdb.h"
49 1.1 rkujawa
50 1.1 rkujawa #include <sys/bus.h>
51 1.1 rkujawa #include <sys/param.h>
52 1.1 rkujawa #include <sys/device.h>
53 1.1 rkujawa #include <sys/systm.h>
54 1.1 rkujawa #include <sys/kernel.h>
55 1.1 rkujawa #include <sys/exec.h>
56 1.1 rkujawa #include <sys/proc.h>
57 1.1 rkujawa #include <sys/msgbuf.h>
58 1.1 rkujawa #include <sys/reboot.h>
59 1.1 rkujawa #include <sys/termios.h>
60 1.1 rkujawa #include <sys/ksyms.h>
61 1.1 rkujawa
62 1.1 rkujawa #include <uvm/uvm_extern.h>
63 1.1 rkujawa
64 1.1 rkujawa #include <sys/conf.h>
65 1.1 rkujawa #include <dev/cons.h>
66 1.1 rkujawa #include <dev/md.h>
67 1.1 rkujawa
68 1.1 rkujawa #include <dev/pci/pcireg.h>
69 1.1 rkujawa #include <dev/pci/pcivar.h>
70 1.1 rkujawa #include <machine/pci_machdep.h>
71 1.1 rkujawa
72 1.1 rkujawa #include <machine/db_machdep.h>
73 1.1 rkujawa #include <ddb/db_sym.h>
74 1.1 rkujawa #include <ddb/db_extern.h>
75 1.1 rkujawa #ifdef KGDB
76 1.1 rkujawa #include <sys/kgdb.h>
77 1.1 rkujawa #endif
78 1.1 rkujawa
79 1.1 rkujawa #include <machine/bootconfig.h>
80 1.1 rkujawa #include <machine/autoconf.h>
81 1.1 rkujawa #include <machine/cpu.h>
82 1.1 rkujawa #include <machine/frame.h>
83 1.1 rkujawa #include <arm/armreg.h>
84 1.1 rkujawa #include <arm/undefined.h>
85 1.1 rkujawa
86 1.1 rkujawa #include <arm/arm32/machdep.h>
87 1.1 rkujawa
88 1.1 rkujawa #include <arm/marvell/mvsocreg.h>
89 1.1 rkujawa #include <arm/marvell/mvsocvar.h>
90 1.1 rkujawa #include <evbarm/armadaxp/armadaxpreg.h>
91 1.1 rkujawa
92 1.1 rkujawa #include <evbarm/marvell/marvellreg.h>
93 1.1 rkujawa #include <evbarm/marvell/marvellvar.h>
94 1.1 rkujawa
95 1.1 rkujawa #include "mvpex.h"
96 1.1 rkujawa #include "com.h"
97 1.1 rkujawa #if NCOM > 0
98 1.1 rkujawa #include <dev/ic/comreg.h>
99 1.1 rkujawa #include <dev/ic/comvar.h>
100 1.1 rkujawa #endif
101 1.1 rkujawa
102 1.1 rkujawa /*
103 1.1 rkujawa * Address to call from cpu_reset() to reset the machine.
104 1.1 rkujawa * This is machine architecture dependent as it varies depending
105 1.1 rkujawa * on where the ROM appears when you turn the MMU off.
106 1.1 rkujawa */
107 1.1 rkujawa
108 1.1 rkujawa
109 1.1 rkujawa /* Define various stack sizes in pages */
110 1.1 rkujawa #define IRQ_STACK_SIZE 1
111 1.1 rkujawa #define ABT_STACK_SIZE 1
112 1.1 rkujawa #ifdef IPKDB
113 1.1 rkujawa #define UND_STACK_SIZE 2
114 1.1 rkujawa #else
115 1.1 rkujawa #define UND_STACK_SIZE 1
116 1.1 rkujawa #endif
117 1.1 rkujawa
118 1.1 rkujawa BootConfig bootconfig; /* Boot config storage */
119 1.1 rkujawa char *boot_args = NULL;
120 1.1 rkujawa char *boot_file = NULL;
121 1.1 rkujawa
122 1.1 rkujawa extern int KERNEL_BASE_phys[];
123 1.1 rkujawa
124 1.1 rkujawa /*extern char KERNEL_BASE_phys[];*/
125 1.1 rkujawa extern char etext[], __data_start[], _edata[], __bss_start[], __bss_end__[];
126 1.1 rkujawa extern char _end[];
127 1.1 rkujawa
128 1.1 rkujawa /*
129 1.1 rkujawa * Put some bogus settings of the MEMSTART and MEMSIZE
130 1.1 rkujawa * if they are not defined in kernel configuration file.
131 1.1 rkujawa */
132 1.1 rkujawa #ifndef MEMSTART
133 1.1 rkujawa #define MEMSTART 0x00000000UL
134 1.1 rkujawa #endif
135 1.1 rkujawa #ifndef MEMSIZE
136 1.1 rkujawa #define MEMSIZE 0x40000000UL
137 1.1 rkujawa #endif
138 1.1 rkujawa
139 1.1 rkujawa #ifndef STARTUP_PAGETABLE_ADDR
140 1.1 rkujawa #define STARTUP_PAGETABLE_ADDR 0x00000000UL
141 1.1 rkujawa #endif
142 1.1 rkujawa
143 1.1 rkujawa /* Physical offset of the kernel from MEMSTART */
144 1.1 rkujawa #define KERNEL_OFFSET (paddr_t)&KERNEL_BASE_phys
145 1.1 rkujawa /* Kernel base virtual address */
146 1.1 rkujawa #define KERNEL_TEXT_BASE (KERNEL_BASE + KERNEL_OFFSET)
147 1.1 rkujawa
148 1.1 rkujawa #define KERNEL_VM_BASE (KERNEL_BASE + 0x01000000)
149 1.1 rkujawa #define KERNEL_VM_SIZE 0x10000000
150 1.1 rkujawa
151 1.1 rkujawa /* Prototypes */
152 1.1 rkujawa extern int armadaxp_l2_init(void);
153 1.1 rkujawa extern void armadaxp_io_coherency_init(void);
154 1.1 rkujawa
155 1.1 rkujawa void consinit(void);
156 1.1 rkujawa #ifdef KGDB
157 1.1 rkujawa static void kgdb_port_init(void);
158 1.1 rkujawa #endif
159 1.1 rkujawa
160 1.1 rkujawa static void axp_device_register(device_t dev, void *aux);
161 1.1 rkujawa
162 1.1 rkujawa static void
163 1.1 rkujawa axp_system_reset(void)
164 1.1 rkujawa {
165 1.1 rkujawa cpu_reset_address = 0;
166 1.1 rkujawa
167 1.1 rkujawa /* Unmask soft reset */
168 1.1 rkujawa write_miscreg(MVSOC_MLMB_RSTOUTNMASKR,
169 1.1 rkujawa MVSOC_MLMB_RSTOUTNMASKR_SOFTRSTOUTEN);
170 1.1 rkujawa /* Assert soft reset */
171 1.1 rkujawa write_miscreg(MVSOC_MLMB_SSRR, MVSOC_MLMB_SSRR_SYSTEMSOFTRST);
172 1.1 rkujawa
173 1.1 rkujawa while (1);
174 1.1 rkujawa }
175 1.1 rkujawa
176 1.1 rkujawa /*
177 1.1 rkujawa * Static device mappings. These peripheral registers are mapped at
178 1.1 rkujawa * fixed virtual addresses very early in initarm() so that we can use
179 1.1 rkujawa * them while booting the kernel, and stay at the same address
180 1.1 rkujawa * throughout whole kernel's life time.
181 1.1 rkujawa *
182 1.1 rkujawa * We use this table twice; once with bootstrap page table, and once
183 1.1 rkujawa * with kernel's page table which we build up in initarm().
184 1.1 rkujawa *
185 1.1 rkujawa * Since we map these registers into the bootstrap page table using
186 1.1 rkujawa * pmap_devmap_bootstrap() which calls pmap_map_chunk(), we map
187 1.1 rkujawa * registers segment-aligned and segment-rounded in order to avoid
188 1.1 rkujawa * using the 2nd page tables.
189 1.1 rkujawa */
190 1.1 rkujawa
191 1.1 rkujawa #define _A(a) ((a) & ~L1_S_OFFSET)
192 1.1 rkujawa #define _S(s) (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
193 1.1 rkujawa
194 1.1 rkujawa static const struct pmap_devmap devmap[] = {
195 1.1 rkujawa {
196 1.1 rkujawa /* Internal registers */
197 1.1 rkujawa .pd_va = _A(MARVELL_INTERREGS_VBASE),
198 1.1 rkujawa .pd_pa = _A(MARVELL_INTERREGS_PBASE),
199 1.1 rkujawa .pd_size = _S(MARVELL_INTERREGS_SIZE),
200 1.1 rkujawa .pd_prot = VM_PROT_READ|VM_PROT_WRITE,
201 1.1 rkujawa .pd_cache = PTE_NOCACHE
202 1.1 rkujawa },
203 1.1 rkujawa {0, 0, 0, 0, 0}
204 1.1 rkujawa };
205 1.1 rkujawa
206 1.1 rkujawa #undef _A
207 1.1 rkujawa #undef _S
208 1.1 rkujawa
209 1.1 rkujawa static inline
210 1.1 rkujawa pd_entry_t *
211 1.1 rkujawa read_ttb(void)
212 1.1 rkujawa {
213 1.1 rkujawa long ttb;
214 1.1 rkujawa
215 1.1 rkujawa __asm volatile("mrc p15, 0, %0, c2, c0, 0" : "=r" (ttb));
216 1.1 rkujawa
217 1.1 rkujawa return (pd_entry_t *)(ttb & ~((1<<14)-1));
218 1.1 rkujawa }
219 1.1 rkujawa
220 1.1 rkujawa static int
221 1.1 rkujawa axp_pcie_free_win(void)
222 1.1 rkujawa {
223 1.1 rkujawa int i;
224 1.1 rkujawa /* Find first disabled window */
225 1.1 rkujawa for (i = 0; i < ARMADAXP_MLMB_NWINDOW; i++) {
226 1.1 rkujawa if ((read_mlmbreg(MVSOC_MLMB_WCR(i)) &
227 1.1 rkujawa MVSOC_MLMB_WCR_WINEN) == 0) {
228 1.1 rkujawa return i;
229 1.1 rkujawa }
230 1.1 rkujawa }
231 1.1 rkujawa /* If there is no free window, return erroneous value */
232 1.1 rkujawa return (-1);
233 1.1 rkujawa }
234 1.1 rkujawa
235 1.1 rkujawa static void
236 1.1 rkujawa reset_axp_pcie_win(void)
237 1.1 rkujawa {
238 1.1 rkujawa uint32_t target, attr;
239 1.1 rkujawa int memtag = 0, iotag = 0, window, i;
240 1.1 rkujawa uint32_t membase;
241 1.1 rkujawa uint32_t iobase;
242 1.1 rkujawa uint32_t tags[] = { ARMADAXP_TAG_PEX00_MEM, ARMADAXP_TAG_PEX00_IO,
243 1.1 rkujawa ARMADAXP_TAG_PEX01_MEM, ARMADAXP_TAG_PEX01_IO,
244 1.1 rkujawa ARMADAXP_TAG_PEX02_MEM, ARMADAXP_TAG_PEX02_IO,
245 1.1 rkujawa ARMADAXP_TAG_PEX03_MEM, ARMADAXP_TAG_PEX03_IO,
246 1.1 rkujawa ARMADAXP_TAG_PEX2_MEM, ARMADAXP_TAG_PEX2_IO,
247 1.1 rkujawa ARMADAXP_TAG_PEX3_MEM, ARMADAXP_TAG_PEX3_IO};
248 1.1 rkujawa
249 1.1 rkujawa nwindow = ARMADAXP_MLMB_NWINDOW;
250 1.1 rkujawa nremap = ARMADAXP_MLMB_NREMAP;
251 1.1 rkujawa membase = MARVELL_PEXMEM_PBASE;
252 1.1 rkujawa iobase = MARVELL_PEXIO_PBASE;
253 1.1 rkujawa for (i = 0; i < __arraycount(tags) / 2; i++) {
254 1.1 rkujawa memtag = tags[2 * i];
255 1.1 rkujawa iotag = tags[(2 * i) + 1];
256 1.1 rkujawa
257 1.1 rkujawa /* Reset PCI-Express space to window register. */
258 1.1 rkujawa window = mvsoc_target(memtag, &target, &attr, NULL, NULL);
259 1.1 rkujawa
260 1.1 rkujawa /* Find free window if we've got spurious one */
261 1.1 rkujawa if (window >= nwindow) {
262 1.1 rkujawa window = axp_pcie_free_win();
263 1.1 rkujawa /* Just break if there is no free windows left */
264 1.1 rkujawa if (window < 0) {
265 1.1 rkujawa aprint_error(": no free windows for PEX MEM\n");
266 1.1 rkujawa break;
267 1.1 rkujawa }
268 1.1 rkujawa }
269 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WCR(window),
270 1.1 rkujawa MVSOC_MLMB_WCR_WINEN |
271 1.1 rkujawa MVSOC_MLMB_WCR_TARGET(target) |
272 1.1 rkujawa MVSOC_MLMB_WCR_ATTR(attr) |
273 1.1 rkujawa MVSOC_MLMB_WCR_SIZE(MARVELL_PEXMEM_SIZE));
274 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WBR(window),
275 1.1 rkujawa membase & MVSOC_MLMB_WBR_BASE_MASK);
276 1.1 rkujawa #ifdef PCI_NETBSD_CONFIGURE
277 1.1 rkujawa if (window < nremap) {
278 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WRLR(window),
279 1.1 rkujawa membase & MVSOC_MLMB_WRLR_REMAP_MASK);
280 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WRHR(window), 0);
281 1.1 rkujawa }
282 1.1 rkujawa #endif
283 1.1 rkujawa window = mvsoc_target(iotag, &target, &attr, NULL, NULL);
284 1.1 rkujawa
285 1.1 rkujawa /* Find free window if we've got spurious one */
286 1.1 rkujawa if (window >= nwindow) {
287 1.1 rkujawa window = axp_pcie_free_win();
288 1.1 rkujawa /* Just break if there is no free windows left */
289 1.1 rkujawa if (window < 0) {
290 1.1 rkujawa aprint_error(": no free windows for PEX I/O\n");
291 1.1 rkujawa break;
292 1.1 rkujawa }
293 1.1 rkujawa }
294 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WCR(window),
295 1.1 rkujawa MVSOC_MLMB_WCR_WINEN |
296 1.1 rkujawa MVSOC_MLMB_WCR_TARGET(target) |
297 1.1 rkujawa MVSOC_MLMB_WCR_ATTR(attr) |
298 1.1 rkujawa MVSOC_MLMB_WCR_SIZE(MARVELL_PEXIO_SIZE));
299 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WBR(window),
300 1.1 rkujawa iobase & MVSOC_MLMB_WBR_BASE_MASK);
301 1.1 rkujawa #ifdef PCI_NETBSD_CONFIGURE
302 1.1 rkujawa if (window < nremap) {
303 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WRLR(window),
304 1.1 rkujawa iobase & MVSOC_MLMB_WRLR_REMAP_MASK);
305 1.1 rkujawa write_mlmbreg(MVSOC_MLMB_WRHR(window), 0);
306 1.1 rkujawa }
307 1.1 rkujawa #endif
308 1.1 rkujawa membase += MARVELL_PEXMEM_SIZE;
309 1.1 rkujawa iobase += MARVELL_PEXIO_SIZE;
310 1.1 rkujawa }
311 1.1 rkujawa }
312 1.1 rkujawa
313 1.1 rkujawa /*
314 1.1 rkujawa * u_int initarm(...)
315 1.1 rkujawa *
316 1.1 rkujawa * Initial entry point on startup. This gets called before main() is
317 1.1 rkujawa * entered.
318 1.1 rkujawa * It should be responsible for setting up everything that must be
319 1.1 rkujawa * in place when main is called.
320 1.1 rkujawa * This includes
321 1.1 rkujawa * Taking a copy of the boot configuration structure.
322 1.1 rkujawa * Initialising the physical console so characters can be printed.
323 1.1 rkujawa * Setting up page tables for the kernel
324 1.1 rkujawa * Relocating the kernel to the bottom of physical memory
325 1.1 rkujawa */
326 1.1 rkujawa u_int
327 1.1 rkujawa initarm(void *arg)
328 1.1 rkujawa {
329 1.1 rkujawa cpu_reset_address = axp_system_reset;
330 1.1 rkujawa
331 1.1 rkujawa mvsoc_bootstrap(MARVELL_INTERREGS_VBASE);
332 1.1 rkujawa
333 1.1 rkujawa /* Set CPU functions */
334 1.1 rkujawa if (set_cpufuncs())
335 1.1 rkujawa panic("cpu not recognized!");
336 1.1 rkujawa
337 1.1 rkujawa /*
338 1.1 rkujawa * Map devices into the initial page table
339 1.1 rkujawa * in order to use early console during initialization process.
340 1.1 rkujawa * consinit is going to use this mapping.
341 1.1 rkujawa */
342 1.1 rkujawa pmap_devmap_bootstrap((vaddr_t)read_ttb(), devmap);
343 1.1 rkujawa
344 1.1 rkujawa /* Initialize system console */
345 1.1 rkujawa consinit();
346 1.1 rkujawa
347 1.1 rkujawa /* Reset PCI-Express space to window register. */
348 1.1 rkujawa reset_axp_pcie_win();
349 1.1 rkujawa
350 1.1 rkujawa /* Get CPU, system and timebase frequencies */
351 1.1 rkujawa armadaxp_getclks();
352 1.1 rkujawa
353 1.1 rkujawa /* Preconfigure interrupts */
354 1.1 rkujawa armadaxp_intr_bootstrap();
355 1.1 rkujawa
356 1.1 rkujawa #ifdef L2CACHE_ENABLE
357 1.1 rkujawa /* Initialize L2 Cache */
358 1.1 rkujawa (void)armadaxp_l2_init();
359 1.1 rkujawa #endif
360 1.1 rkujawa
361 1.1 rkujawa #ifdef AURORA_IO_CACHE_COHERENCY
362 1.1 rkujawa /* Initialize cache coherency */
363 1.1 rkujawa armadaxp_io_coherency_init();
364 1.1 rkujawa #endif
365 1.1 rkujawa
366 1.1 rkujawa #ifdef KGDB
367 1.1 rkujawa kgdb_port_init();
368 1.1 rkujawa #endif
369 1.1 rkujawa
370 1.1 rkujawa #ifdef VERBOSE_INIT_ARM
371 1.1 rkujawa /* Talk to the user */
372 1.1 rkujawa #define BDSTR(s) _BDSTR(s)
373 1.1 rkujawa #define _BDSTR(s) #s
374 1.1 rkujawa printf("\nNetBSD/evbarm (" BDSTR(EVBARM_BOARDTYPE) ") booting ...\n");
375 1.1 rkujawa #endif
376 1.1 rkujawa
377 1.1 rkujawa
378 1.1 rkujawa #ifdef VERBOSE_INIT_ARM
379 1.1 rkujawa printf("initarm: Configuring system ...\n");
380 1.1 rkujawa #endif
381 1.1 rkujawa /* Fake bootconfig structure for the benefit of pmap.c. */
382 1.1 rkujawa bootconfig.dramblocks = 1;
383 1.1 rkujawa bootconfig.dram[0].address = MEMSTART;
384 1.1 rkujawa bootconfig.dram[0].pages = MEMSIZE / PAGE_SIZE;
385 1.1 rkujawa
386 1.1 rkujawa physical_start = bootconfig.dram[0].address;
387 1.1 rkujawa physical_end = physical_start + (bootconfig.dram[0].pages * PAGE_SIZE);
388 1.1 rkujawa
389 1.1 rkujawa arm32_bootmem_init(0, physical_end, (uintptr_t) KERNEL_BASE_phys);
390 1.1 rkujawa arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_LOW, 0,
391 1.1 rkujawa devmap, false);
392 1.1 rkujawa
393 1.1 rkujawa /* we've a specific device_register routine */
394 1.1 rkujawa evbarm_device_register = axp_device_register;
395 1.1 rkujawa
396 1.1 rkujawa return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
397 1.1 rkujawa }
398 1.1 rkujawa
399 1.1 rkujawa #ifndef CONSADDR
400 1.1 rkujawa #error Specify the address of the UART with the CONSADDR option.
401 1.1 rkujawa #endif
402 1.1 rkujawa #ifndef CONSPEED
403 1.1 rkujawa #define CONSPEED B115200
404 1.1 rkujawa #endif
405 1.1 rkujawa #ifndef CONMODE
406 1.1 rkujawa #define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
407 1.1 rkujawa #endif
408 1.1 rkujawa #ifndef CONSFREQ
409 1.1 rkujawa #define CONSFREQ 250000000
410 1.1 rkujawa #endif
411 1.1 rkujawa static const int comcnspeed = CONSPEED;
412 1.1 rkujawa static const int comcnfreq = CONSFREQ;
413 1.1 rkujawa static const tcflag_t comcnmode = CONMODE;
414 1.1 rkujawa static const bus_addr_t comcnaddr = (bus_addr_t)CONSADDR;
415 1.1 rkujawa
416 1.1 rkujawa void
417 1.1 rkujawa consinit(void)
418 1.1 rkujawa {
419 1.1 rkujawa static bool consinit_called = false;
420 1.1 rkujawa
421 1.1 rkujawa if (consinit_called)
422 1.1 rkujawa return;
423 1.1 rkujawa consinit_called = true;
424 1.1 rkujawa
425 1.1 rkujawa #if NCOM > 0
426 1.1 rkujawa extern int mvuart_cnattach(bus_space_tag_t, bus_addr_t, int,
427 1.1 rkujawa uint32_t, int);
428 1.1 rkujawa
429 1.1 rkujawa if (mvuart_cnattach(&mvsoc_bs_tag, comcnaddr, comcnspeed,
430 1.1 rkujawa comcnfreq, comcnmode))
431 1.1 rkujawa panic("Serial console can not be initialized.");
432 1.1 rkujawa #endif
433 1.1 rkujawa }
434 1.1 rkujawa
435 1.1 rkujawa #ifdef KGDB
436 1.1 rkujawa #ifndef KGDB_DEVADDR
437 1.1 rkujawa #error Specify the address of the kgdb UART with the KGDB_DEVADDR option.
438 1.1 rkujawa #endif
439 1.1 rkujawa #ifndef KGDB_DEVRATE
440 1.1 rkujawa #define KGDB_DEVRATE B115200
441 1.1 rkujawa #endif
442 1.1 rkujawa #define MVUART_SIZE 0x20
443 1.1 rkujawa
444 1.1 rkujawa #ifndef KGDB_DEVMODE
445 1.1 rkujawa #define KGDB_DEVMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
446 1.1 rkujawa #endif
447 1.1 rkujawa static const vaddr_t comkgdbaddr = KGDB_DEVADDR;
448 1.1 rkujawa static const int comkgdbspeed = KGDB_DEVRATE;
449 1.1 rkujawa static const int comkgdbmode = KGDB_DEVMODE;
450 1.1 rkujawa
451 1.1 rkujawa void
452 1.1 rkujawa static kgdb_port_init(void)
453 1.1 rkujawa {
454 1.1 rkujawa static int kgdbsinit_called = 0;
455 1.1 rkujawa
456 1.1 rkujawa if (kgdbsinit_called != 0)
457 1.1 rkujawa return;
458 1.1 rkujawa kgdbsinit_called = 1;
459 1.1 rkujawa
460 1.1 rkujawa if (com_kgdb_attach(&mvsoc_bs_tag, comkgdbaddr, comkgdbspeed,
461 1.1 rkujawa MVUART_SIZE, COM_TYPE_16550_NOERS, comkgdbmode))
462 1.1 rkujawa panic("KGDB uart can not be initialized.");
463 1.1 rkujawa }
464 1.1 rkujawa #endif
465 1.1 rkujawa
466 1.1 rkujawa #if NMVPEX > 0
467 1.1 rkujawa static void
468 1.1 rkujawa marvell_startend_by_tag(int tag, uint64_t *start, uint64_t *end)
469 1.1 rkujawa {
470 1.1 rkujawa
471 1.1 rkujawa uint32_t base, size;
472 1.1 rkujawa int win;
473 1.1 rkujawa
474 1.1 rkujawa win = mvsoc_target(tag, NULL, NULL, &base, &size);
475 1.1 rkujawa if (size != 0) {
476 1.1 rkujawa if (win < nremap)
477 1.1 rkujawa *start = read_mlmbreg(MVSOC_MLMB_WRLR(win)) |
478 1.1 rkujawa ((read_mlmbreg(MVSOC_MLMB_WRHR(win)) << 16) << 16);
479 1.1 rkujawa else
480 1.1 rkujawa *start = base;
481 1.1 rkujawa *end = *start + size - 1;
482 1.1 rkujawa } else
483 1.1 rkujawa *start = *end = 0;
484 1.1 rkujawa }
485 1.1 rkujawa #endif
486 1.1 rkujawa
487 1.1 rkujawa static void
488 1.1 rkujawa axp_device_register(device_t dev, void *aux)
489 1.1 rkujawa {
490 1.1 rkujawa prop_dictionary_t dict = device_properties(dev);
491 1.1 rkujawa
492 1.1 rkujawa #if NCOM > 0
493 1.1 rkujawa if (device_is_a(dev, "com") &&
494 1.1 rkujawa device_is_a(device_parent(dev), "mvsoc"))
495 1.1 rkujawa prop_dictionary_set_uint32(dict, "frequency", mvTclk);
496 1.1 rkujawa #endif
497 1.1 rkujawa
498 1.1 rkujawa #if NMVPEX > 0
499 1.1 rkujawa extern struct bus_space
500 1.1 rkujawa armadaxp_pex00_io_bs_tag, armadaxp_pex00_mem_bs_tag,
501 1.1 rkujawa armadaxp_pex01_io_bs_tag, armadaxp_pex01_mem_bs_tag,
502 1.1 rkujawa armadaxp_pex02_io_bs_tag, armadaxp_pex02_mem_bs_tag,
503 1.1 rkujawa armadaxp_pex03_io_bs_tag, armadaxp_pex03_mem_bs_tag,
504 1.1 rkujawa armadaxp_pex2_io_bs_tag, armadaxp_pex2_mem_bs_tag,
505 1.1 rkujawa armadaxp_pex3_io_bs_tag, armadaxp_pex3_mem_bs_tag;
506 1.1 rkujawa extern struct arm32_pci_chipset arm32_mvpex0_chipset,
507 1.1 rkujawa arm32_mvpex1_chipset, arm32_mvpex2_chipset,
508 1.1 rkujawa arm32_mvpex3_chipset, arm32_mvpex4_chipset,
509 1.1 rkujawa arm32_mvpex5_chipset;
510 1.1 rkujawa
511 1.1 rkujawa struct marvell_attach_args *mva = aux;
512 1.1 rkujawa
513 1.1 rkujawa if (device_is_a(dev, "mvpex")) {
514 1.1 rkujawa struct bus_space *mvpex_io_bs_tag, *mvpex_mem_bs_tag;
515 1.1 rkujawa struct arm32_pci_chipset *arm32_mvpex_chipset;
516 1.1 rkujawa prop_data_t io_bs_tag, mem_bs_tag, pc;
517 1.1 rkujawa uint64_t start, end;
518 1.1 rkujawa int iotag, memtag;
519 1.1 rkujawa
520 1.1 rkujawa if (mva->mva_offset == MVSOC_PEX_BASE) {
521 1.1 rkujawa mvpex_io_bs_tag = &armadaxp_pex00_io_bs_tag;
522 1.1 rkujawa mvpex_mem_bs_tag = &armadaxp_pex00_mem_bs_tag;
523 1.1 rkujawa arm32_mvpex_chipset = &arm32_mvpex0_chipset;
524 1.1 rkujawa iotag = ARMADAXP_TAG_PEX00_IO;
525 1.1 rkujawa memtag = ARMADAXP_TAG_PEX00_MEM;
526 1.1 rkujawa } else if (mva->mva_offset == MVSOC_PEX_BASE + 0x4000) {
527 1.1 rkujawa mvpex_io_bs_tag = &armadaxp_pex01_io_bs_tag;
528 1.1 rkujawa mvpex_mem_bs_tag = &armadaxp_pex01_mem_bs_tag;
529 1.1 rkujawa arm32_mvpex_chipset = &arm32_mvpex1_chipset;
530 1.1 rkujawa iotag = ARMADAXP_TAG_PEX01_IO;
531 1.1 rkujawa memtag = ARMADAXP_TAG_PEX01_MEM;
532 1.1 rkujawa } else if (mva->mva_offset == MVSOC_PEX_BASE + 0x8000) {
533 1.1 rkujawa mvpex_io_bs_tag = &armadaxp_pex02_io_bs_tag;
534 1.1 rkujawa mvpex_mem_bs_tag = &armadaxp_pex02_mem_bs_tag;
535 1.1 rkujawa arm32_mvpex_chipset = &arm32_mvpex2_chipset;
536 1.1 rkujawa iotag = ARMADAXP_TAG_PEX02_IO;
537 1.1 rkujawa memtag = ARMADAXP_TAG_PEX02_MEM;
538 1.1 rkujawa } else if (mva->mva_offset == MVSOC_PEX_BASE + 0xc000) {
539 1.1 rkujawa mvpex_io_bs_tag = &armadaxp_pex03_io_bs_tag;
540 1.1 rkujawa mvpex_mem_bs_tag = &armadaxp_pex03_mem_bs_tag;
541 1.1 rkujawa arm32_mvpex_chipset = &arm32_mvpex3_chipset;
542 1.1 rkujawa iotag = ARMADAXP_TAG_PEX03_IO;
543 1.1 rkujawa memtag = ARMADAXP_TAG_PEX03_MEM;
544 1.1 rkujawa } else if (mva->mva_offset == MVSOC_PEX_BASE + 0x2000) {
545 1.1 rkujawa mvpex_io_bs_tag = &armadaxp_pex2_io_bs_tag;
546 1.1 rkujawa mvpex_mem_bs_tag = &armadaxp_pex2_mem_bs_tag;
547 1.1 rkujawa arm32_mvpex_chipset = &arm32_mvpex4_chipset;
548 1.1 rkujawa iotag = ARMADAXP_TAG_PEX2_IO;
549 1.1 rkujawa memtag = ARMADAXP_TAG_PEX2_MEM;
550 1.1 rkujawa } else {
551 1.1 rkujawa mvpex_io_bs_tag = &armadaxp_pex3_io_bs_tag;
552 1.1 rkujawa mvpex_mem_bs_tag = &armadaxp_pex3_mem_bs_tag;
553 1.1 rkujawa arm32_mvpex_chipset = &arm32_mvpex5_chipset;
554 1.1 rkujawa iotag = ARMADAXP_TAG_PEX3_IO;
555 1.1 rkujawa memtag = ARMADAXP_TAG_PEX3_MEM;
556 1.1 rkujawa }
557 1.1 rkujawa
558 1.1 rkujawa arm32_mvpex_chipset->pc_conf_v = device_private(dev);
559 1.1 rkujawa arm32_mvpex_chipset->pc_intr_v = device_private(dev);
560 1.1 rkujawa
561 1.1 rkujawa io_bs_tag = prop_data_create_data_nocopy(
562 1.1 rkujawa mvpex_io_bs_tag, sizeof(struct bus_space));
563 1.1 rkujawa KASSERT(io_bs_tag != NULL);
564 1.1 rkujawa prop_dictionary_set(dict, "io-bus-tag", io_bs_tag);
565 1.1 rkujawa prop_object_release(io_bs_tag);
566 1.1 rkujawa mem_bs_tag = prop_data_create_data_nocopy(
567 1.1 rkujawa mvpex_mem_bs_tag, sizeof(struct bus_space));
568 1.1 rkujawa KASSERT(mem_bs_tag != NULL);
569 1.1 rkujawa prop_dictionary_set(dict, "mem-bus-tag", mem_bs_tag);
570 1.1 rkujawa prop_object_release(mem_bs_tag);
571 1.1 rkujawa
572 1.1 rkujawa pc = prop_data_create_data_nocopy(arm32_mvpex_chipset,
573 1.1 rkujawa sizeof(struct arm32_pci_chipset));
574 1.1 rkujawa KASSERT(pc != NULL);
575 1.1 rkujawa prop_dictionary_set(dict, "pci-chipset", pc);
576 1.1 rkujawa prop_object_release(pc);
577 1.1 rkujawa
578 1.1 rkujawa marvell_startend_by_tag(iotag, &start, &end);
579 1.1 rkujawa prop_dictionary_set_uint64(dict, "iostart", start);
580 1.1 rkujawa prop_dictionary_set_uint64(dict, "ioend", end);
581 1.1 rkujawa marvell_startend_by_tag(memtag, &start, &end);
582 1.1 rkujawa prop_dictionary_set_uint64(dict, "memstart", start);
583 1.1 rkujawa prop_dictionary_set_uint64(dict, "memend", end);
584 1.1 rkujawa prop_dictionary_set_uint32(dict,
585 1.1 rkujawa "cache-line-size", arm_dcache_align);
586 1.1 rkujawa }
587 1.1 rkujawa #endif
588 1.1 rkujawa }
589