Home | History | Annotate | Line # | Download | only in armadaxp
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