1 1.38 skrll /* $NetBSD: marvell_machdep.c,v 1.38 2023/04/20 08:28:05 skrll Exp $ */ 2 1.1 kiyohara /* 3 1.1 kiyohara * Copyright (c) 2007, 2008, 2010 KIYOHARA Takashi 4 1.1 kiyohara * All rights reserved. 5 1.1 kiyohara * 6 1.1 kiyohara * Redistribution and use in source and binary forms, with or without 7 1.1 kiyohara * modification, are permitted provided that the following conditions 8 1.1 kiyohara * are met: 9 1.1 kiyohara * 1. Redistributions of source code must retain the above copyright 10 1.1 kiyohara * notice, this list of conditions and the following disclaimer. 11 1.1 kiyohara * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 kiyohara * notice, this list of conditions and the following disclaimer in the 13 1.1 kiyohara * documentation and/or other materials provided with the distribution. 14 1.1 kiyohara * 15 1.1 kiyohara * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 kiyohara * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 1.1 kiyohara * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 1.1 kiyohara * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 19 1.1 kiyohara * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 1.1 kiyohara * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 1.1 kiyohara * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 1.1 kiyohara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 23 1.1 kiyohara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24 1.1 kiyohara * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 kiyohara * POSSIBILITY OF SUCH DAMAGE. 26 1.1 kiyohara */ 27 1.1 kiyohara #include <sys/cdefs.h> 28 1.38 skrll __KERNEL_RCSID(0, "$NetBSD: marvell_machdep.c,v 1.38 2023/04/20 08:28:05 skrll Exp $"); 29 1.1 kiyohara 30 1.34 skrll #include "opt_arm_debug.h" 31 1.35 skrll #include "opt_console.h" 32 1.1 kiyohara #include "opt_evbarm_boardtype.h" 33 1.1 kiyohara #include "opt_ddb.h" 34 1.1 kiyohara #include "opt_pci.h" 35 1.1 kiyohara #include "opt_mvsoc.h" 36 1.1 kiyohara #include "com.h" 37 1.1 kiyohara #include "gtpci.h" 38 1.1 kiyohara #include "mvpex.h" 39 1.1 kiyohara 40 1.1 kiyohara #include <sys/param.h> 41 1.1 kiyohara #include <sys/kernel.h> 42 1.1 kiyohara #include <sys/reboot.h> 43 1.1 kiyohara #include <sys/systm.h> 44 1.1 kiyohara #include <sys/termios.h> 45 1.1 kiyohara 46 1.1 kiyohara #include <prop/proplib.h> 47 1.1 kiyohara 48 1.1 kiyohara #include <dev/cons.h> 49 1.1 kiyohara #include <dev/md.h> 50 1.1 kiyohara 51 1.1 kiyohara #include <dev/marvell/marvellreg.h> 52 1.1 kiyohara #include <dev/marvell/marvellvar.h> 53 1.1 kiyohara #include <dev/pci/pcireg.h> 54 1.1 kiyohara #include <dev/pci/pcivar.h> 55 1.1 kiyohara 56 1.1 kiyohara #include <machine/autoconf.h> 57 1.1 kiyohara #include <machine/bootconfig.h> 58 1.1 kiyohara #include <machine/pci_machdep.h> 59 1.1 kiyohara 60 1.1 kiyohara #include <uvm/uvm_extern.h> 61 1.1 kiyohara 62 1.1 kiyohara #include <arm/db_machdep.h> 63 1.1 kiyohara #include <arm/undefined.h> 64 1.1 kiyohara #include <arm/arm32/machdep.h> 65 1.1 kiyohara 66 1.1 kiyohara #include <arm/marvell/mvsocreg.h> 67 1.1 kiyohara #include <arm/marvell/mvsocvar.h> 68 1.1 kiyohara #include <arm/marvell/orionreg.h> 69 1.1 kiyohara #include <arm/marvell/kirkwoodreg.h> 70 1.22 kiyohara #include <arm/marvell/mv78xx0reg.h> 71 1.33 kiyohara #include <arm/marvell/dovereg.h> 72 1.22 kiyohara #include <arm/marvell/armadaxpreg.h> 73 1.31 hsuenaga #include <arm/marvell/armadaxpvar.h> 74 1.1 kiyohara #include <arm/marvell/mvsocgppvar.h> 75 1.1 kiyohara 76 1.1 kiyohara #include <evbarm/marvell/marvellreg.h> 77 1.1 kiyohara #include <evbarm/marvell/marvellvar.h> 78 1.1 kiyohara 79 1.1 kiyohara #include <ddb/db_extern.h> 80 1.1 kiyohara #include <ddb/db_sym.h> 81 1.1 kiyohara 82 1.1 kiyohara #include "ksyms.h" 83 1.1 kiyohara 84 1.1 kiyohara 85 1.1 kiyohara /* 86 1.18 matt * The range 0xc2000000 - 0xdfffffff is available for kernel VM space 87 1.16 kiyohara * Core-logic registers and I/O mappings occupy 0xfe000000 - 0xffffffff 88 1.1 kiyohara */ 89 1.30 kiyohara #if (KERNEL_BASE & 0xf0000000) == 0x80000000 90 1.30 kiyohara #define KERNEL_VM_BASE (KERNEL_BASE + 0x42000000) 91 1.30 kiyohara #else 92 1.30 kiyohara #define KERNEL_VM_BASE (KERNEL_BASE + 0x02000000) 93 1.30 kiyohara #endif 94 1.18 matt #define KERNEL_VM_SIZE 0x1e000000 95 1.1 kiyohara 96 1.1 kiyohara BootConfig bootconfig; /* Boot config storage */ 97 1.4 jakllsch static char bootargs[MAX_BOOT_STRING]; 98 1.1 kiyohara char *boot_args = NULL; 99 1.1 kiyohara 100 1.17 matt extern int KERNEL_BASE_phys[]; 101 1.1 kiyohara extern char _end[]; 102 1.1 kiyohara 103 1.1 kiyohara /* 104 1.1 kiyohara * Macros to translate between physical and virtual for a subset of the 105 1.1 kiyohara * kernel address space. *Not* for general use. 106 1.1 kiyohara */ 107 1.1 kiyohara #define KERNEL_BASE_PHYS physical_start 108 1.1 kiyohara 109 1.1 kiyohara 110 1.1 kiyohara #include "com.h" 111 1.1 kiyohara #if NCOM > 0 112 1.1 kiyohara #include <dev/ic/comreg.h> 113 1.1 kiyohara #include <dev/ic/comvar.h> 114 1.1 kiyohara #endif 115 1.1 kiyohara 116 1.1 kiyohara #ifndef CONSPEED 117 1.1 kiyohara #define CONSPEED B115200 /* It's a setting of the default of u-boot */ 118 1.1 kiyohara #endif 119 1.1 kiyohara #ifndef CONMODE 120 1.1 kiyohara #define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */ 121 1.1 kiyohara 122 1.1 kiyohara int comcnspeed = CONSPEED; 123 1.1 kiyohara int comcnmode = CONMODE; 124 1.1 kiyohara #endif 125 1.1 kiyohara 126 1.1 kiyohara #include "opt_kgdb.h" 127 1.1 kiyohara #ifdef KGDB 128 1.1 kiyohara #include <sys/kgdb.h> 129 1.1 kiyohara #endif 130 1.1 kiyohara 131 1.1 kiyohara static void marvell_device_register(device_t, void *); 132 1.1 kiyohara #if NGTPCI > 0 || NMVPEX > 0 133 1.1 kiyohara static void marvell_startend_by_tag(int, uint64_t *, uint64_t *); 134 1.1 kiyohara #endif 135 1.1 kiyohara 136 1.32 hsuenaga static void 137 1.32 hsuenaga marvell_fixup_mbus_pex(int memtag, int iotag) 138 1.32 hsuenaga { 139 1.32 hsuenaga uint32_t target, attr; 140 1.32 hsuenaga int window; 141 1.32 hsuenaga 142 1.32 hsuenaga /* Reset PCI-Express space to window register. */ 143 1.32 hsuenaga window = mvsoc_target(memtag, &target, &attr, NULL, NULL); 144 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WCR(window), 145 1.32 hsuenaga MVSOC_MLMB_WCR_WINEN | 146 1.32 hsuenaga MVSOC_MLMB_WCR_TARGET(target) | 147 1.32 hsuenaga MVSOC_MLMB_WCR_ATTR(attr) | 148 1.32 hsuenaga MVSOC_MLMB_WCR_SIZE(MARVELL_PEXMEM_SIZE)); 149 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WBR(window), 150 1.32 hsuenaga MARVELL_PEXMEM_PBASE & MVSOC_MLMB_WBR_BASE_MASK); 151 1.32 hsuenaga #ifdef PCI_NETBSD_CONFIGURE 152 1.32 hsuenaga if (window < nremap) { 153 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WRLR(window), 154 1.32 hsuenaga MARVELL_PEXMEM_PBASE & MVSOC_MLMB_WRLR_REMAP_MASK); 155 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WRHR(window), 0); 156 1.32 hsuenaga } 157 1.32 hsuenaga #endif 158 1.32 hsuenaga window = mvsoc_target(iotag, &target, &attr, NULL, NULL); 159 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WCR(window), 160 1.32 hsuenaga MVSOC_MLMB_WCR_WINEN | 161 1.32 hsuenaga MVSOC_MLMB_WCR_TARGET(target) | 162 1.32 hsuenaga MVSOC_MLMB_WCR_ATTR(attr) | 163 1.32 hsuenaga MVSOC_MLMB_WCR_SIZE(MARVELL_PEXIO_SIZE)); 164 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WBR(window), 165 1.32 hsuenaga MARVELL_PEXIO_PBASE & MVSOC_MLMB_WBR_BASE_MASK); 166 1.32 hsuenaga #ifdef PCI_NETBSD_CONFIGURE 167 1.32 hsuenaga if (window < nremap) { 168 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WRLR(window), 169 1.32 hsuenaga MARVELL_PEXIO_PBASE & MVSOC_MLMB_WRLR_REMAP_MASK); 170 1.32 hsuenaga write_mlmbreg(MVSOC_MLMB_WRHR(window), 0); 171 1.32 hsuenaga } 172 1.32 hsuenaga #endif 173 1.32 hsuenaga } 174 1.32 hsuenaga 175 1.33 kiyohara #if defined(ORION) || defined(KIRKWOOD) || defined(MV78XX0) || defined(DOVE) 176 1.3 jakllsch static void 177 1.25 kiyohara marvell_system_reset(void) 178 1.3 jakllsch { 179 1.3 jakllsch /* unmask soft reset */ 180 1.3 jakllsch write_mlmbreg(MVSOC_MLMB_RSTOUTNMASKR, 181 1.3 jakllsch MVSOC_MLMB_RSTOUTNMASKR_SOFTRSTOUTEN); 182 1.3 jakllsch /* assert soft reset */ 183 1.3 jakllsch write_mlmbreg(MVSOC_MLMB_SSRR, MVSOC_MLMB_SSRR_SYSTEMSOFTRST); 184 1.24 kiyohara 185 1.3 jakllsch /* if we're still running, jump to the reset address */ 186 1.17 matt cpu_reset_address = 0; 187 1.17 matt cpu_reset_address_paddr = 0xffff0000; 188 1.3 jakllsch cpu_reset(); 189 1.3 jakllsch /*NOTREACHED*/ 190 1.3 jakllsch } 191 1.32 hsuenaga 192 1.32 hsuenaga static void 193 1.32 hsuenaga marvell_fixup_mbus(int memtag, int iotag) 194 1.32 hsuenaga { 195 1.32 hsuenaga /* assume u-boot initializes mbus registers correctly */ 196 1.32 hsuenaga 197 1.32 hsuenaga /* set marvell common PEX params */ 198 1.32 hsuenaga marvell_fixup_mbus_pex(memtag, iotag); 199 1.32 hsuenaga 200 1.32 hsuenaga /* other configurations? */ 201 1.32 hsuenaga } 202 1.24 kiyohara #endif 203 1.24 kiyohara 204 1.32 hsuenaga 205 1.24 kiyohara #if defined(ARMADAXP) 206 1.24 kiyohara static void 207 1.25 kiyohara armadaxp_system_reset(void) 208 1.24 kiyohara { 209 1.25 kiyohara extern vaddr_t misc_base; 210 1.25 kiyohara 211 1.37 rin #define write_miscreg(r, v) \ 212 1.37 rin (*(volatile uint32_t *)(misc_base + (r)) = htole32(v)) 213 1.24 kiyohara 214 1.24 kiyohara /* Unmask soft reset */ 215 1.25 kiyohara write_miscreg(ARMADAXP_MISC_RSTOUTNMASKR, 216 1.25 kiyohara ARMADAXP_MISC_RSTOUTNMASKR_GLOBALSOFTRSTOUTEN); 217 1.24 kiyohara /* Assert soft reset */ 218 1.25 kiyohara write_miscreg(ARMADAXP_MISC_SSRR, ARMADAXP_MISC_SSRR_GLOBALSOFTRST); 219 1.24 kiyohara 220 1.24 kiyohara while (1); 221 1.24 kiyohara 222 1.24 kiyohara /*NOTREACHED*/ 223 1.24 kiyohara } 224 1.32 hsuenaga 225 1.32 hsuenaga static void 226 1.32 hsuenaga armadaxp_fixup_mbus(int memtag, int iotag) 227 1.32 hsuenaga { 228 1.32 hsuenaga /* force set SoC default parameters */ 229 1.32 hsuenaga armadaxp_init_mbus(); 230 1.32 hsuenaga 231 1.32 hsuenaga /* set marvell common PEX params */ 232 1.32 hsuenaga marvell_fixup_mbus_pex(memtag, iotag); 233 1.32 hsuenaga 234 1.32 hsuenaga /* other configurations? */ 235 1.32 hsuenaga } 236 1.24 kiyohara #endif 237 1.24 kiyohara 238 1.1 kiyohara 239 1.29 kiyohara static inline pd_entry_t * 240 1.1 kiyohara read_ttb(void) 241 1.1 kiyohara { 242 1.1 kiyohara 243 1.29 kiyohara return (pd_entry_t *)(armreg_ttbr_read() & ~((1<<14)-1)); 244 1.1 kiyohara } 245 1.1 kiyohara 246 1.1 kiyohara /* 247 1.1 kiyohara * Static device mappings. These peripheral registers are mapped at 248 1.1 kiyohara * fixed virtual addresses very early in initarm() so that we can use 249 1.1 kiyohara * them while booting the kernel, and stay at the same address 250 1.1 kiyohara * throughout whole kernel's life time. 251 1.1 kiyohara * 252 1.1 kiyohara * We use this table twice; once with bootstrap page table, and once 253 1.1 kiyohara * with kernel's page table which we build up in initarm(). 254 1.1 kiyohara * 255 1.1 kiyohara * Since we map these registers into the bootstrap page table using 256 1.1 kiyohara * pmap_devmap_bootstrap() which calls pmap_map_chunk(), we map 257 1.1 kiyohara * registers segment-aligned and segment-rounded in order to avoid 258 1.1 kiyohara * using the 2nd page tables. 259 1.1 kiyohara */ 260 1.1 kiyohara 261 1.22 kiyohara static struct pmap_devmap marvell_devmap[] = { 262 1.38 skrll DEVMAP_ENTRY( 263 1.1 kiyohara MARVELL_INTERREGS_VBASE, 264 1.38 skrll MARVELL_INTERREGS_PBASE, 265 1.38 skrll MVSOC_INTERREGS_SIZE 266 1.38 skrll ), 267 1.38 skrll DEVMAP_ENTRY_END 268 1.1 kiyohara }; 269 1.1 kiyohara 270 1.4 jakllsch extern uint32_t *u_boot_args[]; 271 1.1 kiyohara 272 1.1 kiyohara /* 273 1.36 skrll * vaddr_t initarm(...) 274 1.1 kiyohara * 275 1.1 kiyohara * Initial entry point on startup. This gets called before main() is 276 1.1 kiyohara * entered. 277 1.1 kiyohara * It should be responsible for setting up everything that must be 278 1.1 kiyohara * in place when main is called. 279 1.1 kiyohara * This includes 280 1.1 kiyohara * Taking a copy of the boot configuration structure. 281 1.1 kiyohara * Initialising the physical console so characters can be printed. 282 1.1 kiyohara * Setting up page tables for the kernel 283 1.1 kiyohara * Relocating the kernel to the bottom of physical memory 284 1.1 kiyohara */ 285 1.36 skrll vaddr_t 286 1.1 kiyohara initarm(void *arg) 287 1.1 kiyohara { 288 1.32 hsuenaga int cs, cs_end, memtag = 0, iotag = 0; 289 1.1 kiyohara 290 1.14 matt mvsoc_bootstrap(MARVELL_INTERREGS_VBASE); 291 1.14 matt 292 1.23 kiyohara /* 293 1.23 kiyohara * Heads up ... Setup the CPU / MMU / TLB functions 294 1.23 kiyohara */ 295 1.23 kiyohara if (set_cpufuncs()) 296 1.23 kiyohara panic("cpu not recognized!"); 297 1.23 kiyohara 298 1.1 kiyohara /* map some peripheral registers */ 299 1.1 kiyohara pmap_devmap_bootstrap((vaddr_t)read_ttb(), marvell_devmap); 300 1.1 kiyohara 301 1.22 kiyohara /* 302 1.22 kiyohara * U-Boot doesn't use the virtual memory. 303 1.22 kiyohara * 304 1.22 kiyohara * Physical Address Range Description 305 1.22 kiyohara * ----------------------- ---------------------------------- 306 1.22 kiyohara * 0x00000000 - 0x0fffffff SDRAM Bank 0 (max 256MB) 307 1.22 kiyohara * 0x10000000 - 0x1fffffff SDRAM Bank 1 (max 256MB) 308 1.22 kiyohara * 0x20000000 - 0x2fffffff SDRAM Bank 2 (max 256MB) 309 1.22 kiyohara * 0x30000000 - 0x3fffffff SDRAM Bank 3 (max 256MB) 310 1.22 kiyohara * 0xf1000000 - 0xf10fffff SoC Internal Registers 311 1.22 kiyohara */ 312 1.22 kiyohara 313 1.22 kiyohara cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT); 314 1.22 kiyohara 315 1.1 kiyohara /* Get ready for splfoo() */ 316 1.1 kiyohara switch (mvsoc_model()) { 317 1.1 kiyohara #ifdef ORION 318 1.1 kiyohara case MARVELL_ORION_1_88F1181: 319 1.1 kiyohara case MARVELL_ORION_1_88F5082: 320 1.1 kiyohara case MARVELL_ORION_1_88F5180N: 321 1.1 kiyohara case MARVELL_ORION_1_88F5181: 322 1.1 kiyohara case MARVELL_ORION_1_88F5182: 323 1.1 kiyohara case MARVELL_ORION_1_88F6082: 324 1.1 kiyohara case MARVELL_ORION_1_88F6183: 325 1.1 kiyohara case MARVELL_ORION_1_88W8660: 326 1.1 kiyohara case MARVELL_ORION_2_88F1281: 327 1.1 kiyohara case MARVELL_ORION_2_88F5281: 328 1.25 kiyohara cpu_reset_address = marvell_system_reset; 329 1.24 kiyohara 330 1.33 kiyohara orion_bootstrap(MARVELL_INTERREGS_VBASE); 331 1.1 kiyohara 332 1.1 kiyohara memtag = ORION_TAG_PEX0_MEM; 333 1.1 kiyohara iotag = ORION_TAG_PEX0_IO; 334 1.1 kiyohara nwindow = ORION_MLMB_NWINDOW; 335 1.1 kiyohara nremap = ORION_MLMB_NREMAP; 336 1.1 kiyohara 337 1.28 kiyohara cs = MARVELL_TAG_SDRAM_CS0; 338 1.28 kiyohara cs_end = MARVELL_TAG_SDRAM_CS3; 339 1.28 kiyohara 340 1.32 hsuenaga marvell_fixup_mbus(memtag, iotag); 341 1.1 kiyohara break; 342 1.1 kiyohara #endif /* ORION */ 343 1.1 kiyohara 344 1.1 kiyohara #ifdef KIRKWOOD 345 1.1 kiyohara case MARVELL_KIRKWOOD_88F6180: 346 1.1 kiyohara case MARVELL_KIRKWOOD_88F6192: 347 1.1 kiyohara case MARVELL_KIRKWOOD_88F6281: 348 1.9 kiyohara case MARVELL_KIRKWOOD_88F6282: 349 1.25 kiyohara cpu_reset_address = marvell_system_reset; 350 1.24 kiyohara 351 1.33 kiyohara kirkwood_bootstrap(MARVELL_INTERREGS_VBASE); 352 1.1 kiyohara 353 1.1 kiyohara memtag = KIRKWOOD_TAG_PEX_MEM; 354 1.1 kiyohara iotag = KIRKWOOD_TAG_PEX_IO; 355 1.1 kiyohara nwindow = KIRKWOOD_MLMB_NWINDOW; 356 1.1 kiyohara nremap = KIRKWOOD_MLMB_NREMAP; 357 1.1 kiyohara 358 1.28 kiyohara cs = MARVELL_TAG_SDRAM_CS0; 359 1.28 kiyohara cs_end = MARVELL_TAG_SDRAM_CS3; 360 1.28 kiyohara 361 1.32 hsuenaga marvell_fixup_mbus(memtag, iotag); 362 1.1 kiyohara break; 363 1.1 kiyohara #endif /* KIRKWOOD */ 364 1.1 kiyohara 365 1.1 kiyohara #ifdef MV78XX0 366 1.1 kiyohara case MARVELL_MV78XX0_MV78100: 367 1.1 kiyohara case MARVELL_MV78XX0_MV78200: 368 1.25 kiyohara cpu_reset_address = marvell_system_reset; 369 1.24 kiyohara 370 1.33 kiyohara mv78xx0_bootstrap(MARVELL_INTERREGS_VBASE); 371 1.1 kiyohara 372 1.22 kiyohara memtag = MV78XX0_TAG_PEX0_MEM; 373 1.22 kiyohara iotag = MV78XX0_TAG_PEX0_IO; 374 1.1 kiyohara nwindow = MV78XX0_MLMB_NWINDOW; 375 1.1 kiyohara nremap = MV78XX0_MLMB_NREMAP; 376 1.1 kiyohara 377 1.28 kiyohara cs = MARVELL_TAG_SDRAM_CS0; 378 1.28 kiyohara cs_end = MARVELL_TAG_SDRAM_CS3; 379 1.28 kiyohara 380 1.32 hsuenaga marvell_fixup_mbus(memtag, iotag); 381 1.1 kiyohara break; 382 1.1 kiyohara #endif /* MV78XX0 */ 383 1.1 kiyohara 384 1.33 kiyohara #ifdef DOVE 385 1.33 kiyohara case MARVELL_DOVE_88AP510: 386 1.33 kiyohara cpu_reset_address = marvell_system_reset; 387 1.33 kiyohara 388 1.33 kiyohara dove_bootstrap(MARVELL_INTERREGS_VBASE); 389 1.33 kiyohara 390 1.33 kiyohara memtag = DOVE_TAG_PEX0_MEM; 391 1.33 kiyohara iotag = DOVE_TAG_PEX0_IO; 392 1.33 kiyohara nwindow = DOVE_DB_NWINDOW; 393 1.33 kiyohara nremap = DOVE_DB_NREMAP; 394 1.33 kiyohara 395 1.33 kiyohara cs = MARVELL_TAG_AXI_CS0; 396 1.33 kiyohara cs_end = MARVELL_TAG_AXI_CS1; 397 1.33 kiyohara 398 1.33 kiyohara marvell_fixup_mbus(memtag, iotag); 399 1.33 kiyohara break; 400 1.33 kiyohara #endif /* DOVE */ 401 1.33 kiyohara 402 1.22 kiyohara #ifdef ARMADAXP 403 1.22 kiyohara case MARVELL_ARMADAXP_MV78130: 404 1.22 kiyohara case MARVELL_ARMADAXP_MV78160: 405 1.22 kiyohara case MARVELL_ARMADAXP_MV78230: 406 1.22 kiyohara case MARVELL_ARMADAXP_MV78260: 407 1.22 kiyohara case MARVELL_ARMADAXP_MV78460: 408 1.28 kiyohara case MARVELL_ARMADA370_MV6707: 409 1.28 kiyohara case MARVELL_ARMADA370_MV6710: 410 1.28 kiyohara case MARVELL_ARMADA370_MV6W11: 411 1.28 kiyohara cpu_reset_address = armadaxp_system_reset; 412 1.28 kiyohara 413 1.33 kiyohara armadaxp_bootstrap( 414 1.33 kiyohara MARVELL_INTERREGS_VBASE, 415 1.33 kiyohara MARVELL_INTERREGS_PBASE); 416 1.28 kiyohara 417 1.28 kiyohara memtag = ARMADAXP_TAG_PEX00_MEM; 418 1.28 kiyohara iotag = ARMADAXP_TAG_PEX00_IO; 419 1.28 kiyohara nwindow = ARMADAXP_MLMB_NWINDOW; 420 1.28 kiyohara nremap = ARMADAXP_MLMB_NREMAP; 421 1.28 kiyohara 422 1.28 kiyohara cs = MARVELL_TAG_DDR3_CS0; 423 1.28 kiyohara cs_end = MARVELL_TAG_DDR3_CS3; 424 1.28 kiyohara 425 1.32 hsuenaga armadaxp_fixup_mbus(memtag, iotag); 426 1.28 kiyohara break; 427 1.22 kiyohara #endif /* ARMADAXP */ 428 1.22 kiyohara 429 1.1 kiyohara default: 430 1.1 kiyohara /* We can't output console here yet... */ 431 1.1 kiyohara panic("unknown model...\n"); 432 1.1 kiyohara 433 1.1 kiyohara /* NOTREACHED */ 434 1.1 kiyohara } 435 1.1 kiyohara 436 1.23 kiyohara consinit(); 437 1.23 kiyohara 438 1.23 kiyohara /* Talk to the user */ 439 1.23 kiyohara #ifndef EVBARM_BOARDTYPE 440 1.23 kiyohara #define EVBARM_BOARDTYPE Marvell 441 1.23 kiyohara #endif 442 1.23 kiyohara #define BDSTR(s) _BDSTR(s) 443 1.23 kiyohara #define _BDSTR(s) #s 444 1.23 kiyohara printf("\nNetBSD/evbarm (" BDSTR(EVBARM_BOARDTYPE) ") booting ...\n"); 445 1.23 kiyohara 446 1.12 kiyohara /* copy command line U-Boot gave us, if args is valid. */ 447 1.12 kiyohara if (u_boot_args[3] != 0) /* XXXXX: need more check?? */ 448 1.12 kiyohara strncpy(bootargs, (char *)u_boot_args[3], sizeof(bootargs)); 449 1.4 jakllsch 450 1.1 kiyohara #ifdef VERBOSE_INIT_ARM 451 1.1 kiyohara printf("initarm: Configuring system ...\n"); 452 1.1 kiyohara #endif 453 1.1 kiyohara 454 1.1 kiyohara bootconfig.dramblocks = 0; 455 1.21 matt paddr_t segment_end; 456 1.21 matt segment_end = physmem = 0; 457 1.28 kiyohara for ( ; cs <= cs_end; cs++) { 458 1.33 kiyohara uint32_t base, size; 459 1.32 hsuenaga 460 1.33 kiyohara mvsoc_target(cs, NULL, NULL, &base, &size); 461 1.1 kiyohara if (size == 0) 462 1.1 kiyohara continue; 463 1.1 kiyohara 464 1.1 kiyohara bootconfig.dram[bootconfig.dramblocks].address = base; 465 1.1 kiyohara bootconfig.dram[bootconfig.dramblocks].pages = size / PAGE_SIZE; 466 1.1 kiyohara 467 1.21 matt if (base != segment_end) 468 1.1 kiyohara panic("memory hole not support"); 469 1.1 kiyohara 470 1.21 matt segment_end += size; 471 1.1 kiyohara physmem += size / PAGE_SIZE; 472 1.1 kiyohara 473 1.1 kiyohara bootconfig.dramblocks++; 474 1.1 kiyohara } 475 1.1 kiyohara 476 1.30 kiyohara #ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS 477 1.30 kiyohara const bool mapallmem_p = true; 478 1.30 kiyohara #else 479 1.30 kiyohara const bool mapallmem_p = false; 480 1.30 kiyohara #endif 481 1.30 kiyohara 482 1.21 matt arm32_bootmem_init(0, segment_end, (uintptr_t) KERNEL_BASE_phys); 483 1.19 matt arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0, 484 1.30 kiyohara marvell_devmap, mapallmem_p); 485 1.1 kiyohara 486 1.1 kiyohara /* we've a specific device_register routine */ 487 1.1 kiyohara evbarm_device_register = marvell_device_register; 488 1.1 kiyohara 489 1.20 msaitoh /* parse bootargs from U-Boot */ 490 1.20 msaitoh boot_args = bootargs; 491 1.20 msaitoh parse_mi_bootargs(boot_args); 492 1.20 msaitoh 493 1.17 matt return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0); 494 1.1 kiyohara } 495 1.1 kiyohara 496 1.1 kiyohara void 497 1.1 kiyohara consinit(void) 498 1.1 kiyohara { 499 1.1 kiyohara static int consinit_called = 0; 500 1.1 kiyohara 501 1.1 kiyohara if (consinit_called != 0) 502 1.1 kiyohara return; 503 1.1 kiyohara 504 1.1 kiyohara consinit_called = 1; 505 1.1 kiyohara 506 1.1 kiyohara #if NCOM > 0 507 1.1 kiyohara { 508 1.1 kiyohara extern int mvuart_cnattach(bus_space_tag_t, bus_addr_t, int, 509 1.1 kiyohara uint32_t, int); 510 1.1 kiyohara 511 1.25 kiyohara if (mvuart_cnattach(&mvsoc_bs_tag, 512 1.22 kiyohara MARVELL_INTERREGS_PBASE + MVSOC_COM0_BASE, 513 1.1 kiyohara comcnspeed, mvTclk, comcnmode)) 514 1.1 kiyohara panic("can't init serial console"); 515 1.1 kiyohara } 516 1.1 kiyohara #else 517 1.1 kiyohara panic("serial console not configured"); 518 1.1 kiyohara #endif 519 1.1 kiyohara } 520 1.1 kiyohara 521 1.1 kiyohara 522 1.1 kiyohara static void 523 1.1 kiyohara marvell_device_register(device_t dev, void *aux) 524 1.1 kiyohara { 525 1.1 kiyohara prop_dictionary_t dict = device_properties(dev); 526 1.1 kiyohara 527 1.1 kiyohara #if NCOM > 0 528 1.1 kiyohara if (device_is_a(dev, "com") && 529 1.1 kiyohara device_is_a(device_parent(dev), "mvsoc")) 530 1.1 kiyohara prop_dictionary_set_uint32(dict, "frequency", mvTclk); 531 1.1 kiyohara #endif 532 1.22 kiyohara 533 1.13 kiyohara if (device_is_a(dev, "gtidmac")) 534 1.1 kiyohara prop_dictionary_set_uint32(dict, 535 1.1 kiyohara "dmb_speed", mvTclk * sizeof(uint32_t)); /* XXXXXX */ 536 1.22 kiyohara 537 1.1 kiyohara #if NGTPCI > 0 && defined(ORION) 538 1.1 kiyohara if (device_is_a(dev, "gtpci")) { 539 1.1 kiyohara extern struct bus_space 540 1.1 kiyohara orion_pci_io_bs_tag, orion_pci_mem_bs_tag; 541 1.1 kiyohara extern struct arm32_pci_chipset arm32_gtpci_chipset; 542 1.1 kiyohara 543 1.1 kiyohara prop_data_t io_bs_tag, mem_bs_tag, pc; 544 1.1 kiyohara prop_array_t int2gpp; 545 1.1 kiyohara prop_number_t gpp; 546 1.1 kiyohara uint64_t start, end; 547 1.1 kiyohara int i, j; 548 1.1 kiyohara static struct { 549 1.1 kiyohara const char *boardtype; 550 1.1 kiyohara int pin[PCI_INTERRUPT_PIN_MAX]; 551 1.1 kiyohara } hints[] = { 552 1.1 kiyohara { "kuronas_x4", 553 1.1 kiyohara { 11, PCI_INTERRUPT_PIN_NONE } }, 554 1.1 kiyohara 555 1.1 kiyohara { NULL, 556 1.1 kiyohara { PCI_INTERRUPT_PIN_NONE } }, 557 1.1 kiyohara }; 558 1.1 kiyohara 559 1.1 kiyohara arm32_gtpci_chipset.pc_conf_v = device_private(dev); 560 1.1 kiyohara arm32_gtpci_chipset.pc_intr_v = device_private(dev); 561 1.1 kiyohara 562 1.1 kiyohara io_bs_tag = prop_data_create_data_nocopy( 563 1.1 kiyohara &orion_pci_io_bs_tag, sizeof(struct bus_space)); 564 1.1 kiyohara KASSERT(io_bs_tag != NULL); 565 1.1 kiyohara prop_dictionary_set(dict, "io-bus-tag", io_bs_tag); 566 1.1 kiyohara prop_object_release(io_bs_tag); 567 1.1 kiyohara mem_bs_tag = prop_data_create_data_nocopy( 568 1.1 kiyohara &orion_pci_mem_bs_tag, sizeof(struct bus_space)); 569 1.1 kiyohara KASSERT(mem_bs_tag != NULL); 570 1.1 kiyohara prop_dictionary_set(dict, "mem-bus-tag", mem_bs_tag); 571 1.1 kiyohara prop_object_release(mem_bs_tag); 572 1.1 kiyohara 573 1.1 kiyohara pc = prop_data_create_data_nocopy(&arm32_gtpci_chipset, 574 1.1 kiyohara sizeof(struct arm32_pci_chipset)); 575 1.1 kiyohara KASSERT(pc != NULL); 576 1.1 kiyohara prop_dictionary_set(dict, "pci-chipset", pc); 577 1.1 kiyohara prop_object_release(pc); 578 1.1 kiyohara 579 1.1 kiyohara marvell_startend_by_tag(ORION_TAG_PCI_IO, &start, &end); 580 1.1 kiyohara prop_dictionary_set_uint64(dict, "iostart", start); 581 1.1 kiyohara prop_dictionary_set_uint64(dict, "ioend", end); 582 1.1 kiyohara marvell_startend_by_tag(ORION_TAG_PCI_MEM, &start, &end); 583 1.1 kiyohara prop_dictionary_set_uint64(dict, "memstart", start); 584 1.1 kiyohara prop_dictionary_set_uint64(dict, "memend", end); 585 1.1 kiyohara prop_dictionary_set_uint32(dict, 586 1.1 kiyohara "cache-line-size", arm_dcache_align); 587 1.1 kiyohara 588 1.1 kiyohara /* Setup the hint for interrupt-pin. */ 589 1.1 kiyohara #define BDSTR(s) _BDSTR(s) 590 1.1 kiyohara #define _BDSTR(s) #s 591 1.1 kiyohara #define THIS_BOARD(str) (strcmp(str, BDSTR(EVBARM_BOARDTYPE)) == 0) 592 1.1 kiyohara for (i = 0; hints[i].boardtype != NULL; i++) 593 1.1 kiyohara if (THIS_BOARD(hints[i].boardtype)) 594 1.1 kiyohara break; 595 1.1 kiyohara if (hints[i].boardtype == NULL) 596 1.1 kiyohara return; 597 1.1 kiyohara 598 1.1 kiyohara int2gpp = 599 1.1 kiyohara prop_array_create_with_capacity(PCI_INTERRUPT_PIN_MAX + 1); 600 1.1 kiyohara 601 1.1 kiyohara /* first set dummy */ 602 1.1 kiyohara gpp = prop_number_create_integer(0); 603 1.1 kiyohara prop_array_add(int2gpp, gpp); 604 1.1 kiyohara prop_object_release(gpp); 605 1.1 kiyohara 606 1.1 kiyohara for (j = 0; hints[i].pin[j] != PCI_INTERRUPT_PIN_NONE; j++) { 607 1.1 kiyohara gpp = prop_number_create_integer(hints[i].pin[j]); 608 1.1 kiyohara prop_array_add(int2gpp, gpp); 609 1.1 kiyohara prop_object_release(gpp); 610 1.1 kiyohara } 611 1.1 kiyohara prop_dictionary_set(dict, "int2gpp", int2gpp); 612 1.1 kiyohara } 613 1.1 kiyohara #endif /* NGTPCI > 0 && defined(ORION) */ 614 1.22 kiyohara 615 1.1 kiyohara #if NMVPEX > 0 616 1.1 kiyohara if (device_is_a(dev, "mvpex")) { 617 1.1 kiyohara #ifdef ORION 618 1.1 kiyohara extern struct bus_space 619 1.1 kiyohara orion_pex0_io_bs_tag, orion_pex0_mem_bs_tag, 620 1.1 kiyohara orion_pex1_io_bs_tag, orion_pex1_mem_bs_tag; 621 1.1 kiyohara #endif 622 1.1 kiyohara #ifdef KIRKWOOD 623 1.1 kiyohara extern struct bus_space 624 1.9 kiyohara kirkwood_pex_io_bs_tag, kirkwood_pex_mem_bs_tag, 625 1.9 kiyohara kirkwood_pex1_io_bs_tag, kirkwood_pex1_mem_bs_tag; 626 1.1 kiyohara #endif 627 1.33 kiyohara #ifdef DOVE 628 1.33 kiyohara extern struct bus_space 629 1.33 kiyohara dove_pex0_io_bs_tag, dove_pex0_mem_bs_tag, 630 1.33 kiyohara dove_pex1_io_bs_tag, dove_pex1_mem_bs_tag; 631 1.33 kiyohara #endif 632 1.22 kiyohara #ifdef ARMADAXP 633 1.22 kiyohara extern struct bus_space 634 1.22 kiyohara armadaxp_pex00_io_bs_tag, armadaxp_pex00_mem_bs_tag, 635 1.22 kiyohara armadaxp_pex01_io_bs_tag, armadaxp_pex01_mem_bs_tag, 636 1.22 kiyohara armadaxp_pex02_io_bs_tag, armadaxp_pex02_mem_bs_tag, 637 1.22 kiyohara armadaxp_pex03_io_bs_tag, armadaxp_pex03_mem_bs_tag, 638 1.22 kiyohara armadaxp_pex2_io_bs_tag, armadaxp_pex2_mem_bs_tag, 639 1.22 kiyohara armadaxp_pex3_io_bs_tag, armadaxp_pex3_mem_bs_tag; 640 1.22 kiyohara int i; 641 1.22 kiyohara #endif 642 1.22 kiyohara extern struct arm32_pci_chipset 643 1.22 kiyohara arm32_mvpex0_chipset, arm32_mvpex1_chipset; 644 1.1 kiyohara 645 1.1 kiyohara struct marvell_attach_args *mva = aux; 646 1.1 kiyohara struct bus_space *mvpex_io_bs_tag, *mvpex_mem_bs_tag; 647 1.1 kiyohara struct arm32_pci_chipset *arm32_mvpex_chipset; 648 1.1 kiyohara prop_data_t io_bs_tag, mem_bs_tag, pc; 649 1.1 kiyohara uint64_t start, end; 650 1.1 kiyohara int iotag, memtag; 651 1.1 kiyohara 652 1.1 kiyohara switch (mvsoc_model()) { 653 1.1 kiyohara #ifdef ORION 654 1.1 kiyohara case MARVELL_ORION_1_88F5180N: 655 1.1 kiyohara case MARVELL_ORION_1_88F5181: 656 1.1 kiyohara case MARVELL_ORION_1_88F5182: 657 1.1 kiyohara case MARVELL_ORION_1_88W8660: 658 1.1 kiyohara case MARVELL_ORION_2_88F5281: 659 1.1 kiyohara if (mva->mva_offset == MVSOC_PEX_BASE) { 660 1.1 kiyohara mvpex_io_bs_tag = &orion_pex0_io_bs_tag; 661 1.1 kiyohara mvpex_mem_bs_tag = &orion_pex0_mem_bs_tag; 662 1.1 kiyohara arm32_mvpex_chipset = &arm32_mvpex0_chipset; 663 1.1 kiyohara iotag = ORION_TAG_PEX0_IO; 664 1.1 kiyohara memtag = ORION_TAG_PEX0_MEM; 665 1.1 kiyohara } else { 666 1.1 kiyohara mvpex_io_bs_tag = &orion_pex1_io_bs_tag; 667 1.1 kiyohara mvpex_mem_bs_tag = &orion_pex1_mem_bs_tag; 668 1.1 kiyohara arm32_mvpex_chipset = &arm32_mvpex1_chipset; 669 1.1 kiyohara iotag = ORION_TAG_PEX1_IO; 670 1.1 kiyohara memtag = ORION_TAG_PEX1_MEM; 671 1.1 kiyohara } 672 1.1 kiyohara break; 673 1.1 kiyohara #endif 674 1.1 kiyohara 675 1.1 kiyohara #ifdef KIRKWOOD 676 1.9 kiyohara case MARVELL_KIRKWOOD_88F6282: 677 1.9 kiyohara if (mva->mva_offset != MVSOC_PEX_BASE) { 678 1.9 kiyohara mvpex_io_bs_tag = &kirkwood_pex1_io_bs_tag; 679 1.9 kiyohara mvpex_mem_bs_tag = &kirkwood_pex1_mem_bs_tag; 680 1.9 kiyohara arm32_mvpex_chipset = &arm32_mvpex1_chipset; 681 1.9 kiyohara iotag = KIRKWOOD_TAG_PEX1_IO; 682 1.9 kiyohara memtag = KIRKWOOD_TAG_PEX1_MEM; 683 1.9 kiyohara break; 684 1.9 kiyohara } 685 1.9 kiyohara 686 1.9 kiyohara /* FALLTHROUGH */ 687 1.9 kiyohara 688 1.1 kiyohara case MARVELL_KIRKWOOD_88F6180: 689 1.1 kiyohara case MARVELL_KIRKWOOD_88F6192: 690 1.1 kiyohara case MARVELL_KIRKWOOD_88F6281: 691 1.1 kiyohara mvpex_io_bs_tag = &kirkwood_pex_io_bs_tag; 692 1.1 kiyohara mvpex_mem_bs_tag = &kirkwood_pex_mem_bs_tag; 693 1.1 kiyohara arm32_mvpex_chipset = &arm32_mvpex0_chipset; 694 1.1 kiyohara iotag = KIRKWOOD_TAG_PEX_IO; 695 1.1 kiyohara memtag = KIRKWOOD_TAG_PEX_MEM; 696 1.1 kiyohara break; 697 1.1 kiyohara #endif 698 1.1 kiyohara 699 1.33 kiyohara #ifdef DOVE 700 1.33 kiyohara case MARVELL_DOVE_88AP510: 701 1.33 kiyohara if (mva->mva_offset == MVSOC_PEX_BASE) { 702 1.33 kiyohara mvpex_io_bs_tag = &dove_pex0_io_bs_tag; 703 1.33 kiyohara mvpex_mem_bs_tag = &dove_pex0_mem_bs_tag; 704 1.33 kiyohara arm32_mvpex_chipset = &arm32_mvpex0_chipset; 705 1.33 kiyohara iotag = DOVE_TAG_PEX0_IO; 706 1.33 kiyohara memtag = DOVE_TAG_PEX0_MEM; 707 1.33 kiyohara } else { 708 1.33 kiyohara mvpex_io_bs_tag = &dove_pex1_io_bs_tag; 709 1.33 kiyohara mvpex_mem_bs_tag = &dove_pex1_mem_bs_tag; 710 1.33 kiyohara arm32_mvpex_chipset = &arm32_mvpex1_chipset; 711 1.33 kiyohara iotag = DOVE_TAG_PEX1_IO; 712 1.33 kiyohara memtag = DOVE_TAG_PEX1_MEM; 713 1.33 kiyohara } 714 1.33 kiyohara break; 715 1.33 kiyohara #endif 716 1.33 kiyohara 717 1.22 kiyohara #ifdef ARMADAXP 718 1.22 kiyohara case MARVELL_ARMADAXP_MV78130: 719 1.22 kiyohara case MARVELL_ARMADAXP_MV78160: 720 1.22 kiyohara case MARVELL_ARMADAXP_MV78230: 721 1.22 kiyohara case MARVELL_ARMADAXP_MV78260: 722 1.22 kiyohara case MARVELL_ARMADAXP_MV78460: 723 1.28 kiyohara 724 1.28 kiyohara case MARVELL_ARMADA370_MV6707: 725 1.28 kiyohara case MARVELL_ARMADA370_MV6710: 726 1.28 kiyohara case MARVELL_ARMADA370_MV6W11: 727 1.22 kiyohara { 728 1.22 kiyohara extern struct arm32_pci_chipset 729 1.22 kiyohara arm32_mvpex2_chipset, arm32_mvpex3_chipset, 730 1.22 kiyohara arm32_mvpex4_chipset, arm32_mvpex5_chipset; 731 1.22 kiyohara const struct { 732 1.22 kiyohara bus_size_t offset; 733 1.22 kiyohara struct bus_space *io_bs_tag; 734 1.22 kiyohara struct bus_space *mem_bs_tag; 735 1.22 kiyohara struct arm32_pci_chipset *chipset; 736 1.22 kiyohara int iotag; 737 1.22 kiyohara int memtag; 738 1.22 kiyohara } mvpex_tags[] = { 739 1.22 kiyohara { MVSOC_PEX_BASE, 740 1.22 kiyohara &armadaxp_pex00_io_bs_tag, 741 1.22 kiyohara &armadaxp_pex00_mem_bs_tag, 742 1.22 kiyohara &arm32_mvpex0_chipset, 743 1.22 kiyohara ARMADAXP_TAG_PEX00_IO, 744 1.22 kiyohara ARMADAXP_TAG_PEX00_MEM }, 745 1.22 kiyohara 746 1.22 kiyohara { ARMADAXP_PEX01_BASE, 747 1.22 kiyohara &armadaxp_pex01_io_bs_tag, 748 1.22 kiyohara &armadaxp_pex01_mem_bs_tag, 749 1.22 kiyohara &arm32_mvpex1_chipset, 750 1.22 kiyohara ARMADAXP_TAG_PEX01_IO, 751 1.22 kiyohara ARMADAXP_TAG_PEX01_MEM }, 752 1.22 kiyohara 753 1.22 kiyohara { ARMADAXP_PEX02_BASE, 754 1.22 kiyohara &armadaxp_pex02_io_bs_tag, 755 1.22 kiyohara &armadaxp_pex02_mem_bs_tag, 756 1.22 kiyohara &arm32_mvpex2_chipset, 757 1.22 kiyohara ARMADAXP_TAG_PEX02_IO, 758 1.22 kiyohara ARMADAXP_TAG_PEX02_MEM }, 759 1.22 kiyohara 760 1.22 kiyohara { ARMADAXP_PEX03_BASE, 761 1.22 kiyohara &armadaxp_pex03_io_bs_tag, 762 1.22 kiyohara &armadaxp_pex03_mem_bs_tag, 763 1.22 kiyohara &arm32_mvpex3_chipset, 764 1.22 kiyohara ARMADAXP_TAG_PEX03_IO, 765 1.22 kiyohara ARMADAXP_TAG_PEX03_MEM }, 766 1.22 kiyohara 767 1.22 kiyohara { ARMADAXP_PEX2_BASE, 768 1.22 kiyohara &armadaxp_pex2_io_bs_tag, 769 1.22 kiyohara &armadaxp_pex2_mem_bs_tag, 770 1.22 kiyohara &arm32_mvpex4_chipset, 771 1.22 kiyohara ARMADAXP_TAG_PEX2_IO, 772 1.22 kiyohara ARMADAXP_TAG_PEX2_MEM }, 773 1.22 kiyohara 774 1.22 kiyohara { ARMADAXP_PEX3_BASE, 775 1.22 kiyohara &armadaxp_pex3_io_bs_tag, 776 1.22 kiyohara &armadaxp_pex3_mem_bs_tag, 777 1.22 kiyohara &arm32_mvpex5_chipset, 778 1.22 kiyohara ARMADAXP_TAG_PEX3_IO, 779 1.22 kiyohara ARMADAXP_TAG_PEX3_MEM }, 780 1.22 kiyohara 781 1.22 kiyohara { 0, 0, 0, 0, 0 }, 782 1.22 kiyohara }; 783 1.22 kiyohara 784 1.22 kiyohara for (i = 0; mvpex_tags[i].offset != 0; i++) { 785 1.22 kiyohara if (mva->mva_offset != mvpex_tags[i].offset) 786 1.22 kiyohara continue; 787 1.22 kiyohara break; 788 1.22 kiyohara } 789 1.22 kiyohara if (mvpex_tags[i].offset == 0) 790 1.22 kiyohara return; 791 1.22 kiyohara mvpex_io_bs_tag = mvpex_tags[i].io_bs_tag; 792 1.22 kiyohara mvpex_mem_bs_tag = mvpex_tags[i].mem_bs_tag; 793 1.22 kiyohara arm32_mvpex_chipset = mvpex_tags[i].chipset; 794 1.22 kiyohara iotag = mvpex_tags[i].iotag; 795 1.22 kiyohara memtag = mvpex_tags[i].memtag; 796 1.22 kiyohara break; 797 1.22 kiyohara } 798 1.22 kiyohara #endif 799 1.22 kiyohara 800 1.1 kiyohara default: 801 1.1 kiyohara return; 802 1.1 kiyohara } 803 1.1 kiyohara 804 1.1 kiyohara arm32_mvpex_chipset->pc_conf_v = device_private(dev); 805 1.1 kiyohara arm32_mvpex_chipset->pc_intr_v = device_private(dev); 806 1.1 kiyohara 807 1.1 kiyohara io_bs_tag = prop_data_create_data_nocopy( 808 1.1 kiyohara mvpex_io_bs_tag, sizeof(struct bus_space)); 809 1.1 kiyohara KASSERT(io_bs_tag != NULL); 810 1.1 kiyohara prop_dictionary_set(dict, "io-bus-tag", io_bs_tag); 811 1.1 kiyohara prop_object_release(io_bs_tag); 812 1.1 kiyohara mem_bs_tag = prop_data_create_data_nocopy( 813 1.1 kiyohara mvpex_mem_bs_tag, sizeof(struct bus_space)); 814 1.1 kiyohara KASSERT(mem_bs_tag != NULL); 815 1.1 kiyohara prop_dictionary_set(dict, "mem-bus-tag", mem_bs_tag); 816 1.1 kiyohara prop_object_release(mem_bs_tag); 817 1.1 kiyohara 818 1.1 kiyohara pc = prop_data_create_data_nocopy(arm32_mvpex_chipset, 819 1.1 kiyohara sizeof(struct arm32_pci_chipset)); 820 1.1 kiyohara KASSERT(pc != NULL); 821 1.1 kiyohara prop_dictionary_set(dict, "pci-chipset", pc); 822 1.1 kiyohara prop_object_release(pc); 823 1.1 kiyohara 824 1.1 kiyohara marvell_startend_by_tag(iotag, &start, &end); 825 1.1 kiyohara prop_dictionary_set_uint64(dict, "iostart", start); 826 1.1 kiyohara prop_dictionary_set_uint64(dict, "ioend", end); 827 1.1 kiyohara marvell_startend_by_tag(memtag, &start, &end); 828 1.1 kiyohara prop_dictionary_set_uint64(dict, "memstart", start); 829 1.1 kiyohara prop_dictionary_set_uint64(dict, "memend", end); 830 1.1 kiyohara prop_dictionary_set_uint32(dict, 831 1.1 kiyohara "cache-line-size", arm_dcache_align); 832 1.1 kiyohara } 833 1.1 kiyohara #endif 834 1.1 kiyohara } 835 1.1 kiyohara 836 1.1 kiyohara #if NGTPCI > 0 || NMVPEX > 0 837 1.1 kiyohara static void 838 1.1 kiyohara marvell_startend_by_tag(int tag, uint64_t *start, uint64_t *end) 839 1.1 kiyohara { 840 1.1 kiyohara uint32_t base, size; 841 1.1 kiyohara int win; 842 1.1 kiyohara 843 1.1 kiyohara win = mvsoc_target(tag, NULL, NULL, &base, &size); 844 1.1 kiyohara if (size != 0) { 845 1.1 kiyohara if (win < nremap) 846 1.1 kiyohara *start = read_mlmbreg(MVSOC_MLMB_WRLR(win)) | 847 1.1 kiyohara ((read_mlmbreg(MVSOC_MLMB_WRHR(win)) << 16) << 16); 848 1.1 kiyohara else 849 1.1 kiyohara *start = base; 850 1.1 kiyohara *end = *start + size - 1; 851 1.1 kiyohara } 852 1.1 kiyohara } 853 1.1 kiyohara #endif 854