Module Name: src
Committed By: skrll
Date: Sat May 18 08:49:24 UTC 2019
Modified Files:
src/sys/arch/arm/broadcom: bcm53xx_reg.h
src/sys/arch/arm/omap: omap2_reg.h
src/sys/arch/evbarm/bcm53xx: bcm53xx_machdep.c platform.h
src/sys/arch/evbarm/beagle: beagle_machdep.c
src/sys/arch/evbarm/conf: ARMADILLO-IOT-G3 BEAGLEBONE IGEPV2 N900
OMAP5EVM PANDABOARD VTC100 mk.beagle mk.gumstix mk.imx7 mk.kobo
mk.nitrogen6 std.bcm53xx std.beagle std.gumstix std.imx7 std.kobo
std.nitrogen6 std.overo
src/sys/arch/evbarm/gumstix: gumstix_machdep.c gumstix_start.S
gumstixreg.h
src/sys/arch/evbarm/imx7: imx7_machdep.c
src/sys/arch/evbarm/kobo: kobo_machdep.c
src/sys/arch/evbarm/netwalker: netwalker_start.S
Removed Files:
src/sys/arch/arm/cortex: a9_mpsubr.S
src/sys/arch/evbarm/bcm53xx: bcm53xx_start.S
src/sys/arch/evbarm/beagle: beagle_start.S genassym.cf
src/sys/arch/evbarm/imx7: genassym.cf imx7_start.S
src/sys/arch/evbarm/kobo: kobo_start.S
Log Message:
Convert remaining armv7 kernels to generic start and remove a bunch of
code including a9_mpsubr.S.
Thanks to Lwazi Dube for testing PANDABOARD and BEAGLEBONE.
To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/broadcom/bcm53xx_reg.h
cvs rdiff -u -r1.58 -r0 src/sys/arch/arm/cortex/a9_mpsubr.S
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/arm/omap/omap2_reg.h
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c
cvs rdiff -u -r1.13 -r0 src/sys/arch/evbarm/bcm53xx/bcm53xx_start.S
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbarm/bcm53xx/platform.h
cvs rdiff -u -r1.76 -r1.77 src/sys/arch/evbarm/beagle/beagle_machdep.c
cvs rdiff -u -r1.20 -r0 src/sys/arch/evbarm/beagle/beagle_start.S
cvs rdiff -u -r1.1 -r0 src/sys/arch/evbarm/beagle/genassym.cf
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/evbarm/conf/ARMADILLO-IOT-G3 \
src/sys/arch/evbarm/conf/std.beagle
cvs rdiff -u -r1.47 -r1.48 src/sys/arch/evbarm/conf/BEAGLEBONE
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/evbarm/conf/IGEPV2
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/evbarm/conf/N900
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/evbarm/conf/OMAP5EVM
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/evbarm/conf/PANDABOARD
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/evbarm/conf/VTC100
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbarm/conf/mk.beagle
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/evbarm/conf/mk.gumstix
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/conf/mk.imx7 \
src/sys/arch/evbarm/conf/mk.kobo
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbarm/conf/mk.nitrogen6
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbarm/conf/std.bcm53xx
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/evbarm/conf/std.gumstix \
src/sys/arch/evbarm/conf/std.overo
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbarm/conf/std.imx7 \
src/sys/arch/evbarm/conf/std.kobo
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/evbarm/conf/std.nitrogen6
cvs rdiff -u -r1.61 -r1.62 src/sys/arch/evbarm/gumstix/gumstix_machdep.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/evbarm/gumstix/gumstix_start.S
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/evbarm/gumstix/gumstixreg.h
cvs rdiff -u -r1.1 -r0 src/sys/arch/evbarm/imx7/genassym.cf
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/evbarm/imx7/imx7_machdep.c
cvs rdiff -u -r1.2 -r0 src/sys/arch/evbarm/imx7/imx7_start.S
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/evbarm/kobo/kobo_machdep.c
cvs rdiff -u -r1.1 -r0 src/sys/arch/evbarm/kobo/kobo_start.S
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/evbarm/netwalker/netwalker_start.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/broadcom/bcm53xx_reg.h
diff -u src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.17 src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.18
--- src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.17 Sun Sep 16 09:25:46 2018
+++ src/sys/arch/arm/broadcom/bcm53xx_reg.h Sat May 18 08:49:23 2019
@@ -69,11 +69,15 @@
#define BCM53XX_PCIE2_OWIN_SIZE 0x04000000
#define BCM53XX_PCIE2_OWIN_MAX 0x08000000
+#define BCM53XX_ROM_REGION_PBASE 0xfff00000
+#define BCM53XX_ROM_REGION_SIZE 0x00100000
+
#define BCM53XX_IO_SIZE (BCM53XX_IOREG_SIZE \
+ BCM53XX_ARMCORE_SIZE \
+ BCM53XX_PCIE0_OWIN_SIZE \
+ BCM53XX_PCIE1_OWIN_SIZE \
- + BCM53XX_PCIE2_OWIN_SIZE)
+ + BCM53XX_PCIE2_OWIN_SIZE \
+ + BCM53XX_ROM_REGION_SIZE)
#define BCM53XX_REF_CLK (25*1000*1000)
Index: src/sys/arch/arm/omap/omap2_reg.h
diff -u src/sys/arch/arm/omap/omap2_reg.h:1.34 src/sys/arch/arm/omap/omap2_reg.h:1.35
--- src/sys/arch/arm/omap/omap2_reg.h:1.34 Tue Oct 4 16:03:39 2016
+++ src/sys/arch/arm/omap/omap2_reg.h Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: omap2_reg.h,v 1.34 2016/10/04 16:03:39 kiyohara Exp $ */
+/* $NetBSD: omap2_reg.h,v 1.35 2019/05/18 08:49:23 skrll Exp $ */
/*
* Copyright (c) 2007 Microsoft
@@ -93,6 +93,9 @@
#define OMAP4430_EMIF2_BASE 0x4D000000 /* MemCtrl 1 */
#define OMAP4430_EMIF2_SIZE 0x00100000 /* 4KB padded to 1M */
+#define OMAP4430_DMM_BASE 0x4e000000
+#define OMAP4430_DMM_SIZE 0x02000000 /* 32MB */
+
/* OMAP5 processors */
#define OMAP5430_L4_CORE_BASE 0x4A000000
@@ -876,6 +879,7 @@
* PL310 L2CC (44xx)
*/
#define OMAP4_SCU_BASE 0x48240000
+#define OMAP4_SCU_SIZE 0x00000100
#define OMAP4_L2CC_BASE 0x48242000
#define OMAP4_L2CC_SIZE 0x00001000 /* 4KB */
@@ -885,6 +889,7 @@
/* These also apply to OMAP5 */
#define OMAP4_WUGEN_BASE 0x48281000
+#define OMAP4_WUGEN_SIZE 0x00001000
#define OMAP4_WKG_CONTROL_0 0x00000000
#define OMAP4_WKG_CONTROL_1 0x00000400
#define OMAP4_AUX_CORE_BOOT0 0x00000800
Index: src/sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c
diff -u src/sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c:1.19 src/sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c:1.20
--- src/sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c:1.19 Sat Nov 3 15:02:32 2018
+++ src/sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm53xx_machdep.c,v 1.19 2018/11/03 15:02:32 skrll Exp $ */
+/* $NetBSD: bcm53xx_machdep.c,v 1.20 2019/05/18 08:49:23 skrll Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
#define IDM_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm53xx_machdep.c,v 1.19 2018/11/03 15:02:32 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm53xx_machdep.c,v 1.20 2019/05/18 08:49:23 skrll Exp $");
#include "opt_arm_debug.h"
#include "opt_console.h"
@@ -100,6 +100,9 @@ static void bcm53xx_system_reset(void);
#define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
#endif
+void bcm53xx_mpstart(void);
+void bcm53xx_platform_early_putchar(char);
+
#if (NCOM > 0)
static const bus_addr_t comcnaddr = (bus_addr_t)CONADDR;
@@ -159,6 +162,13 @@ static const struct pmap_devmap devmap[]
VM_PROT_READ|VM_PROT_WRITE,
PTE_NOCACHE,
},
+ {
+ KERNEL_IO_ROM_REGION_VBASE,
+ BCM53XX_ROM_REGION_PBASE, /* 0xfff00000 */
+ BCM53XX_ROM_REGION_SIZE, /* 1MB */
+ VM_PROT_READ|VM_PROT_WRITE,
+ PTE_NOCACHE,
+ },
#if NPCI > 0
{
KERNEL_IO_PCIE0_OWIN_VBASE,
@@ -192,6 +202,71 @@ static const struct boot_physmem bp_firs
.bp_flags = 0,
};
+#define BCM53xx_ROM_CPU_ENTRY 0xffff0400
+
+void
+bcm53xx_mpstart(void)
+{
+#ifdef MULTIPROCESSOR
+ /*
+ * Invalidate all SCU cache tags. That is, for all cores (0-3)
+ */
+ bus_space_write_4(bcm53xx_armcore_bst, bcm53xx_armcore_bsh,
+ ARMCORE_SCU_BASE + SCU_INV_ALL_REG, 0xffff);
+
+ uint32_t diagctl = bus_space_read_4(bcm53xx_armcore_bst,
+ bcm53xx_armcore_bsh, ARMCORE_SCU_BASE + SCU_DIAG_CONTROL);
+ diagctl |= SCU_DIAG_DISABLE_MIGBIT;
+ bus_space_write_4(bcm53xx_armcore_bst, bcm53xx_armcore_bsh,
+ ARMCORE_SCU_BASE + SCU_DIAG_CONTROL, diagctl);
+
+ uint32_t scu_ctl = bus_space_read_4(bcm53xx_armcore_bst,
+ bcm53xx_armcore_bsh, ARMCORE_SCU_BASE + SCU_CTL);
+ scu_ctl |= SCU_CTL_SCU_ENA;
+ bus_space_write_4(bcm53xx_armcore_bst, bcm53xx_armcore_bsh,
+ ARMCORE_SCU_BASE + SCU_CTL, scu_ctl);
+
+ armv7_dcache_wbinv_all();
+
+ const paddr_t mpstart = KERN_VTOPHYS((vaddr_t)cpu_mpstart);
+ bus_space_tag_t bcm53xx_rom_bst = &bcmgen_bs_tag;
+ bus_space_handle_t bcm53xx_rom_entry_bsh;
+
+ int error = bus_space_map(bcm53xx_rom_bst, BCM53xx_ROM_CPU_ENTRY,
+ 4, 0, &bcm53xx_rom_entry_bsh);
+
+ /*
+ * Before we turn on the MMU, let's the other process out of the
+ * SKU ROM but setting the magic LUT address to our own mp_start
+ * routine.
+ */
+ bus_space_write_4(bcm53xx_rom_bst, bcm53xx_rom_entry_bsh, mpstart);
+
+ arm_dsb();
+ __asm __volatile("sev" ::: "memory");
+
+ for (int loop = 0; loop < 16; loop++) {
+ VPRINTF("%u hatched %#x\n", loop, arm_cpu_hatched);
+ if (arm_cpu_hatched == __BITS(arm_cpu_max - 1, 1))
+ break;
+ int timo = 1500000;
+ while (arm_cpu_hatched != __BITS(arm_cpu_max - 1, 1))
+ if (--timo == 0)
+ break;
+ }
+ for (size_t i = 1; i < arm_cpu_max; i++) {
+ if ((arm_cpu_hatched & __BIT(i)) == 0) {
+ printf("%s: warning: cpu%zu failed to hatch\n",
+ __func__, i);
+ }
+ }
+
+ VPRINTF(" (%u cpu%s, hatched %#x)",
+ arm_cpu_max, arm_cpu_max ? "s" : "",
+ arm_cpu_hatched);
+#endif /* MULTIPROCESSOR */
+}
+
/*
* u_int initarm(...)
*
@@ -313,8 +388,15 @@ initarm(void *arg)
* If we have more than 256MB of RAM, set aside the first 256MB for
* non-default VM allocations.
*/
- return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE,
+ u_int sp = initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE,
(bigmem_p ? &bp_first256 : NULL), (bigmem_p ? 1 : 0));
+
+ /*
+ * initarm_common flushes cache if required before AP start
+ */
+ bcm53xx_mpstart();
+
+ return sp;
}
void
Index: src/sys/arch/evbarm/bcm53xx/platform.h
diff -u src/sys/arch/evbarm/bcm53xx/platform.h:1.2 src/sys/arch/evbarm/bcm53xx/platform.h:1.3
--- src/sys/arch/evbarm/bcm53xx/platform.h:1.2 Fri Sep 7 11:53:50 2012
+++ src/sys/arch/evbarm/bcm53xx/platform.h Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: platform.h,v 1.2 2012/09/07 11:53:50 matt Exp $ */
+/* $NetBSD: platform.h,v 1.3 2019/05/18 08:49:23 skrll Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -59,6 +59,7 @@
#define KERNEL_IO_PCIE2_OWIN_VBASE (KERNEL_IO_PCIE1_OWIN_VBASE + BCM53XX_PCIE1_OWIN_SIZE)
#define KERNEL_IO_IOREG_VBASE (KERNEL_IO_PCIE2_OWIN_VBASE + BCM53XX_PCIE2_OWIN_SIZE)
#define KERNEL_IO_ARMCORE_VBASE (KERNEL_IO_IOREG_VBASE + BCM53XX_IOREG_SIZE)
-#define KERNEL_IO_END_VBASE (KERNEL_IO_ARMCORE_VBASE + BCM53XX_ARMCORE_SIZE)
+#define KERNEL_IO_ROM_REGION_VBASE (KERNEL_IO_ARMCORE_VBASE + BCM53XX_ARMCORE_SIZE)
+#define KERNEL_IO_END_VBASE (KERNEL_IO_ROM_REGION_VBASE + BCM53XX_ROM_REGION_SIZE)
#endif /* _EVBARM_BCM53XX_PLATFORM_H */
Index: src/sys/arch/evbarm/beagle/beagle_machdep.c
diff -u src/sys/arch/evbarm/beagle/beagle_machdep.c:1.76 src/sys/arch/evbarm/beagle/beagle_machdep.c:1.77
--- src/sys/arch/evbarm/beagle/beagle_machdep.c:1.76 Thu Oct 18 09:01:53 2018
+++ src/sys/arch/evbarm/beagle/beagle_machdep.c Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: beagle_machdep.c,v 1.76 2018/10/18 09:01:53 skrll Exp $ */
+/* $NetBSD: beagle_machdep.c,v 1.77 2019/05/18 08:49:23 skrll Exp $ */
/*
* Machine dependent functions for kernel setup for TI OSK5912 board.
@@ -125,7 +125,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.76 2018/10/18 09:01:53 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.77 2019/05/18 08:49:23 skrll Exp $");
#include "opt_arm_debug.h"
#include "opt_console.h"
@@ -218,6 +218,12 @@ __KERNEL_RCSID(0, "$NetBSD: beagle_machd
#include <dev/usb/ukbdvar.h>
+#ifdef VERBOSE_INIT_ARM
+#define VPRINTF(...) printf(__VA_ARGS__)
+#else
+#define VPRINTF(...) __nothing
+#endif
+
BootConfig bootconfig; /* Boot config storage */
static char bootargs[MAX_BOOT_STRING];
char *boot_args = NULL;
@@ -243,22 +249,6 @@ int use_fb_console = true;
uint32_t omap5_cnt_frq;
#endif
-#ifdef MULTIPROCESSOR
-
-void beagle_cpu_hatch(struct cpu_info *);
-
-void
-beagle_cpu_hatch(struct cpu_info *ci)
-{
-#if defined(CPU_CORTEXA9)
- a9tmr_init_cpu_clock(ci);
-#elif defined(CPU_CORTEXA7) || defined(CPU_CORTEXA15)
- gtmr_init_cpu_clock(ci);
-#endif
-}
-
-#endif
-
/*
* Macros to translate between physical and virtual for a subset of the
* kernel address space. *Not* for general use.
@@ -266,6 +256,7 @@ beagle_cpu_hatch(struct cpu_info *ci)
#define KERNEL_BASE_PHYS ((paddr_t)KERNEL_BASE_phys)
#define OMAP_L4_CORE_VOFFSET (OMAP_L4_CORE_VBASE - OMAP_L4_CORE_BASE)
+
/* Prototypes */
void consinit(void);
@@ -290,6 +281,10 @@ static psize_t emif_memprobe(void);
static psize_t omap3_memprobe(void);
#endif
+#ifdef MULTIPROCESSOR
+void beagle_cpu_hatch(struct cpu_info *);
+#endif
+
bs_protos(bs_notimpl);
#if NCOM > 0
@@ -297,6 +292,24 @@ bs_protos(bs_notimpl);
#include <dev/ic/comvar.h>
#endif
+static void
+earlyconsputc(dev_t dev, int c)
+{
+ uartputc(c);
+}
+
+static int
+earlyconsgetc(dev_t dev)
+{
+ return 0;
+}
+
+static struct consdev earlycons = {
+ .cn_putc = earlyconsputc,
+ .cn_getc = earlyconsgetc,
+ .cn_pollc = nullcnpollc,
+};
+
/*
* Static device mappings. These peripheral registers are mapped at
* fixed virtual addresses very early in initarm() so that we can use
@@ -421,6 +434,82 @@ static const struct pmap_devmap devmap[]
#undef _A
#undef _S
+#ifdef MULTIPROCESSOR
+
+void
+beagle_cpu_hatch(struct cpu_info *ci)
+{
+#if defined(CPU_CORTEXA9)
+ a9tmr_init_cpu_clock(ci);
+#elif defined(CPU_CORTEXA7) || defined(CPU_CORTEXA15)
+ gtmr_init_cpu_clock(ci);
+#endif
+}
+#endif
+
+static void
+beagle_mpstart(void)
+{
+#if defined(MULTIPROCESSOR)
+ const bus_space_tag_t bst = &omap_bs_tag;
+
+#if defined(CPU_CORTEXA9)
+ const bus_space_handle_t scu_bsh = OMAP4_SCU_BASE
+ + OMAP_L4_PERIPHERAL_VBASE - OMAP_L4_PERIPHERAL_BASE;
+
+ /*
+ * Invalidate all SCU cache tags. That is, for all cores (0-3)
+ */
+ bus_space_write_4(bst, scu_bsh, SCU_INV_ALL_REG, 0xffff);
+
+ uint32_t diagctl = bus_space_read_4(bst, scu_bsh, SCU_DIAG_CONTROL);
+ diagctl |= SCU_DIAG_DISABLE_MIGBIT;
+ bus_space_write_4(bst, scu_bsh, SCU_DIAG_CONTROL, diagctl);
+
+ uint32_t scu_ctl = bus_space_read_4(bst, scu_bsh, SCU_CTL);
+ scu_ctl |= SCU_CTL_SCU_ENA;
+ bus_space_write_4(bst, scu_bsh, SCU_CTL, scu_ctl);
+
+ armv7_dcache_wbinv_all();
+#endif
+ const bus_space_handle_t wugen_bsh = OMAP4_WUGEN_BASE + OMAP_L4_CORE_VOFFSET;
+ const paddr_t mpstart = KERN_VTOPHYS((vaddr_t)cpu_mpstart);
+
+ bus_space_write_4(bst, wugen_bsh, OMAP4_AUX_CORE_BOOT1, mpstart);
+
+ for (size_t i = 1; i < arm_cpu_max; i++) {
+ uint32_t boot = bus_space_read_4(bst, wugen_bsh, OMAP4_AUX_CORE_BOOT0);
+ boot |= __SHIFTIN(0xf, i * 4);
+ bus_space_write_4(bst, wugen_bsh, OMAP4_AUX_CORE_BOOT0, boot);
+ }
+
+
+ arm_dsb();
+ __asm __volatile("sev" ::: "memory");
+
+ for (int loop = 0; loop < 16; loop++) {
+ VPRINTF("%u hatched %#x\n", loop, arm_cpu_hatched);
+ if (arm_cpu_hatched == __BITS(arm_cpu_max - 1, 1))
+ break;
+ int timo = 1500000;
+ while (arm_cpu_hatched != __BITS(arm_cpu_max - 1, 1))
+ if (--timo == 0)
+ break;
+ }
+ for (size_t i = 1; i < arm_cpu_max; i++) {
+ if ((arm_cpu_hatched & __BIT(i)) == 0) {
+ printf("%s: warning: cpu%zu failed to hatch\n",
+ __func__, i);
+ }
+ }
+
+ VPRINTF(" (%u cpu%s, hatched %#x)",
+ arm_cpu_max, arm_cpu_max ? "s" : "",
+ arm_cpu_hatched);
+#endif
+}
+
+
#ifdef DDB
static void
beagle_db_trap(int where)
@@ -438,27 +527,7 @@ beagle_db_trap(int where)
#endif
#ifdef VERBOSE_INIT_ARM
-void beagle_putchar(char c);
-void
-beagle_putchar(char c)
-{
-#if NCOM > 0
- volatile uint32_t *com0addr = (volatile uint32_t *)CONSADDR_VA;
- int timo = 150000;
-
- while ((com0addr[com_lsr] & LSR_TXRDY) == 0) {
- if (--timo == 0)
- break;
- }
-
- com0addr[com_data] = c;
-
- while ((com0addr[com_lsr] & LSR_TXRDY) == 0) {
- if (--timo == 0)
- break;
- }
-#endif
-}
+#define beagle_putchar(c) beagle_platform_early_putchar(c)
void beagle_platform_early_putchar(char);
@@ -510,12 +579,15 @@ initarm(void *arg)
beagle_putchar('d');
#endif
- /*
- * When we enter here, we are using a temporary first level
- * translation table with section entries in it to cover the OBIO
- * peripherals and SDRAM. The temporary first level translation table
- * is at the end of SDRAM.
- */
+ /* Heads up ... Setup the CPU / MMU / TLB functions. */
+ if (set_cpufuncs())
+ panic("cpu not recognized!");
+
+ cn_tab = &earlycons;
+
+ extern char ARM_BOOTSTRAP_LxPT[];
+ pmap_devmap_bootstrap((vaddr_t)ARM_BOOTSTRAP_LxPT, devmap);
+
#if defined(OMAP_3XXX) || defined(TI_DM37XX)
omap3_cpu_clk(); // find our CPU speed.
#endif
@@ -528,15 +600,9 @@ initarm(void *arg)
am335x_sys_clk(TI_AM335X_CTLMOD_BASE + OMAP_L4_CORE_VOFFSET);
am335x_cpu_clk(); // find our CPU speed.
#endif
- /* Heads up ... Setup the CPU / MMU / TLB functions. */
- if (set_cpufuncs())
- panic("cpu not recognized!");
init_clocks();
- /* The console is going to try to map things. Give pmap a devmap. */
- pmap_devmap_register(devmap);
-
if (get_bootconf_option(bootargs, "console",
BOOTOPT_TYPE_STRING, &ptr) && strncmp(ptr, "fb", 2) == 0) {
use_fb_console = true;
@@ -582,19 +648,15 @@ initarm(void *arg)
cpu_reset_address = beagle_reset;
-#ifdef VERBOSE_INIT_ARM
/* Talk to the user */
- printf("\nNetBSD/evbarm (beagle) booting ...\n");
-#endif
+ VPRINTF("\nNetBSD/evbarm (beagle) booting ...\n");
#ifdef BOOT_ARGS
char mi_bootargs[] = BOOT_ARGS;
parse_mi_bootargs(mi_bootargs);
#endif
-#ifdef VERBOSE_INIT_ARM
- printf("initarm: Configuring system ...\n");
-#endif
+ VPRINTF("initarm: Configuring system ...\n");
#if !defined(CPU_CORTEXA8)
printf("initarm: cbar=%#x\n", armreg_cbar_read());
@@ -663,8 +725,16 @@ initarm(void *arg)
db_trap_callback = beagle_db_trap;
- return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+ u_int sp = initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+
+ /*
+ * initarm_common flushes cache if required before AP start
+ */
+ VPRINTF("mpstart\n");
+ beagle_mpstart();
+
+ return sp;
}
static void
@@ -940,10 +1010,10 @@ emif_memprobe(void)
KASSERT(ebank == 0); // No chip selects on Sitara
#endif
memsize <<= (ebank + ibank + rsize + pagesize + width);
-#ifdef VERBOSE_INIT_ARM
- printf("sdram_config = %#x, memsize = %uMB\n", sdram_config,
+
+ VPRINTF("sdram_config = %#x, memsize = %uMB\n", sdram_config,
(u_int)(memsize >> 20));
-#endif
+
return memsize;
}
#endif
Index: src/sys/arch/evbarm/conf/ARMADILLO-IOT-G3
diff -u src/sys/arch/evbarm/conf/ARMADILLO-IOT-G3:1.17 src/sys/arch/evbarm/conf/ARMADILLO-IOT-G3:1.18
--- src/sys/arch/evbarm/conf/ARMADILLO-IOT-G3:1.17 Fri Apr 26 22:46:03 2019
+++ src/sys/arch/evbarm/conf/ARMADILLO-IOT-G3 Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: ARMADILLO-IOT-G3,v 1.17 2019/04/26 22:46:03 sevan Exp $
+# $NetBSD: ARMADILLO-IOT-G3,v 1.18 2019/05/18 08:49:23 skrll Exp $
#
# ARMADILLO-IOT-G3 -- Atmark Techno, Armadillo-IoT G3
#
@@ -158,6 +158,7 @@ options PPP_FILTER # Active filter supp
# Console options. also need IMXUARTCONSOLE
options CONSDEVNAME="\"imxuart\"",CONADDR=0x30a70000,CONSPEED=115200
+options EARLYCONS=imx7
# These options enable verbose messages for several subsystems.
# Warning, these may compile large string tables into the kernel!
Index: src/sys/arch/evbarm/conf/std.beagle
diff -u src/sys/arch/evbarm/conf/std.beagle:1.17 src/sys/arch/evbarm/conf/std.beagle:1.18
--- src/sys/arch/evbarm/conf/std.beagle:1.17 Mon Oct 15 16:54:54 2018
+++ src/sys/arch/evbarm/conf/std.beagle Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: std.beagle,v 1.17 2018/10/15 16:54:54 skrll Exp $
+# $NetBSD: std.beagle,v 1.18 2019/05/18 08:49:23 skrll Exp $
#
# standard NetBSD/evbarm for BEAGLEBOARD options
@@ -14,12 +14,14 @@ options ARM_HAS_VBAR
options ARM_INTR_IMPL="<arch/arm/omap/omap2_intr.h>"
options CORTEX_PMC
options FPU_VFP
+options MD_CPU_HATCH=beagle_cpu_hatch
options MODULAR
options MODULAR_DEFAULT_AUTOLOAD
options TPIDRPRW_IS_CURCPU
options __HAVE_CPU_COUNTER
options __HAVE_CPU_UAREA_ALLOC_IDLELWP
options __HAVE_FAST_SOFTINTS # should be in types.h
+options __HAVE_GENERIC_START
options __HAVE_MM_MD_DIRECT_MAPPED_PHYS
makeoptions BOARDMKFRAG="${THISARM}/conf/mk.beagle"
Index: src/sys/arch/evbarm/conf/BEAGLEBONE
diff -u src/sys/arch/evbarm/conf/BEAGLEBONE:1.47 src/sys/arch/evbarm/conf/BEAGLEBONE:1.48
--- src/sys/arch/evbarm/conf/BEAGLEBONE:1.47 Wed Feb 6 11:58:30 2019
+++ src/sys/arch/evbarm/conf/BEAGLEBONE Sat May 18 08:49:23 2019
@@ -1,5 +1,5 @@
#
-# $NetBSD: BEAGLEBONE,v 1.47 2019/02/06 11:58:30 rin Exp $
+# $NetBSD: BEAGLEBONE,v 1.48 2019/05/18 08:49:23 skrll Exp $
#
# BEAGLEBONE -- TI AM335x board Kernel
#
@@ -24,6 +24,9 @@ options DEBUG
makeoptions DEBUG="-g" # compile full symbol table
makeoptions COPY_SYMTAB=1
+#options VERBOSE_INIT_ARM
+#options EARLYCONS=beagle # CONSADDR set below
+
## USB Debugging options
options USB_DEBUG
options EHCI_DEBUG
Index: src/sys/arch/evbarm/conf/IGEPV2
diff -u src/sys/arch/evbarm/conf/IGEPV2:1.34 src/sys/arch/evbarm/conf/IGEPV2:1.35
--- src/sys/arch/evbarm/conf/IGEPV2:1.34 Tue Oct 23 19:58:52 2018
+++ src/sys/arch/evbarm/conf/IGEPV2 Sat May 18 08:49:23 2019
@@ -1,5 +1,5 @@
#
-# $NetBSD: IGEPV2,v 1.34 2018/10/23 19:58:52 jdolecek Exp $
+# $NetBSD: IGEPV2,v 1.35 2019/05/18 08:49:23 skrll Exp $
#
# IGEPv2 -- TI OMAP 3530 Eval Board Kernel
#
@@ -112,7 +112,6 @@ options KTRACE # system call tracing,
options DIAGNOSTIC # internal consistency checks
#options DEBUG
#options PMAP_DEBUG # Enable pmap_debug_level code
-options VERBOSE_INIT_ARM # verbose bootstraping messages
options DDB # in-kernel debugger
options DDB_ONPANIC=1
options DDB_HISTORY_SIZE=100 # Enable history editing in DDB
@@ -120,6 +119,10 @@ options DDB_HISTORY_SIZE=100 # Enable h
makeoptions DEBUG="-g" # compile full symbol table
makeoptions COPY_SYMTAB=1
+options VERBOSE_INIT_ARM # verbose bootstraping messages
+options EARLYCONS=beagle
+options CONSADDR=0x49020000, CONSPEED=115200
+
## USB Debugging options
#options USB_DEBUG
#options OHCI_DEBUG
@@ -209,7 +212,6 @@ iic* at omapiic?
#com0 at obio0 addr 0x4806a000 intr 72 mult 4 # UART1
#com1 at obio0 addr 0x4806c000 intr 73 mult 4 # UART2
com0 at obio2 addr 0x49020000 intr 74 mult 4 # UART3 (console)
-options CONSADDR=0x49020000, CONSPEED=115200
# Operating System Timer
omapmputmr0 at obio2 addr 0x49032000 intr 38 # GP Timer 2
Index: src/sys/arch/evbarm/conf/N900
diff -u src/sys/arch/evbarm/conf/N900:1.30 src/sys/arch/evbarm/conf/N900:1.31
--- src/sys/arch/evbarm/conf/N900:1.30 Tue Oct 23 19:58:52 2018
+++ src/sys/arch/evbarm/conf/N900 Sat May 18 08:49:23 2019
@@ -1,5 +1,5 @@
#
-# $NetBSD: N900,v 1.30 2018/10/23 19:58:52 jdolecek Exp $
+# $NetBSD: N900,v 1.31 2019/05/18 08:49:23 skrll Exp $
#
# N900 -- Nokia N900 Kernel
#
@@ -112,7 +112,6 @@ options DIAGNOSTIC # internal consisten
#options DEBUG
#options LOCKDEBUG # expensive locking checks/support
#options PMAP_DEBUG # Enable pmap_debug_level code
-#options VERBOSE_INIT_ARM # verbose bootstraping messages
options DDB # in-kernel debugger
options DDB_ONPANIC=1
options DDB_HISTORY_SIZE=100 # Enable history editing in DDB
@@ -120,6 +119,11 @@ options DDB_HISTORY_SIZE=100 # Enable h
makeoptions DEBUG="-g" # compile full symbol table
makeoptions COPY_SYMTAB=1
+#options VERBOSE_INIT_ARM # verbose bootstraping messages
+#options EARLYCONS=beagle
+#options CONSADDR=0x49020000, CONSPEED=38400
+#options CONSADDR=0x49020000, CONSPEED=115200
+
## USB Debugging options
#options USB_DEBUG
#options EHCI_DEBUG
@@ -233,8 +237,6 @@ tps65950pm3 at iic0 addr 0x4b
# On-board 16550 UARTs
#com0 at obio2 addr 0x49020000 intr 74 mult 4 # UART3 (console)
-#options CONSADDR=0x49020000, CONSPEED=38400
-#options CONSADDR=0x49020000, CONSPEED=115200
# Operating System Timer
omapmputmr0 at obio2 addr 0x49032000 intr 38 # GP Timer 2
Index: src/sys/arch/evbarm/conf/OMAP5EVM
diff -u src/sys/arch/evbarm/conf/OMAP5EVM:1.15 src/sys/arch/evbarm/conf/OMAP5EVM:1.16
--- src/sys/arch/evbarm/conf/OMAP5EVM:1.15 Tue Oct 23 19:58:52 2018
+++ src/sys/arch/evbarm/conf/OMAP5EVM Sat May 18 08:49:23 2019
@@ -1,5 +1,5 @@
#
-# $NetBSD: OMAP5EVM,v 1.15 2018/10/23 19:58:52 jdolecek Exp $
+# $NetBSD: OMAP5EVM,v 1.16 2019/05/18 08:49:23 skrll Exp $
#
# PANDABOARD -- TI OMAP 4430 Eval Board Kernel
#
@@ -116,7 +116,6 @@ options KTRACE # system call tracing,
options DIAGNOSTIC # internal consistency checks
#options DEBUG
#options PMAP_DEBUG # Enable pmap_debug_level code
-#options VERBOSE_INIT_ARM # verbose bootstraping messages
options DDB # in-kernel debugger
options DDB_ONPANIC=1
options DDB_HISTORY_SIZE=100 # Enable history editing in DDB
@@ -124,6 +123,10 @@ options DDB_HISTORY_SIZE=100 # Enable h
makeoptions DEBUG="-g" # compile full symbol table
makeoptions COPY_SYMTAB=1
+#options VERBOSE_INIT_ARM # verbose bootstraping messages
+#options EARLYCONS=beagle
+options CONSADDR=0x48020000, CONSPEED=115200
+
## USB Debugging options
options USB_DEBUG
options EHCI_DEBUG
@@ -198,7 +201,6 @@ gpio* at omapgpio?
# On-board 16550 UARTs
com0 at obio2 addr 0x48020000 intr 106 mult 4 # UART3 (console) 74+32
-options CONSADDR=0x48020000, CONSPEED=115200
# Operating System Timer
#omapmputmr0 at obio2 addr 0x48032000 intr 70 # GP Timer 2 L4PER
Index: src/sys/arch/evbarm/conf/PANDABOARD
diff -u src/sys/arch/evbarm/conf/PANDABOARD:1.28 src/sys/arch/evbarm/conf/PANDABOARD:1.29
--- src/sys/arch/evbarm/conf/PANDABOARD:1.28 Tue Oct 23 19:58:52 2018
+++ src/sys/arch/evbarm/conf/PANDABOARD Sat May 18 08:49:23 2019
@@ -1,5 +1,5 @@
#
-# $NetBSD: PANDABOARD,v 1.28 2018/10/23 19:58:52 jdolecek Exp $
+# $NetBSD: PANDABOARD,v 1.29 2019/05/18 08:49:23 skrll Exp $
#
# PANDABOARD -- TI OMAP 4430 Eval Board Kernel
#
@@ -114,7 +114,6 @@ options KTRACE # system call tracing,
options DIAGNOSTIC # internal consistency checks
#options DEBUG
#options PMAP_DEBUG # Enable pmap_debug_level code
-#options VERBOSE_INIT_ARM # verbose bootstraping messages
options DDB # in-kernel debugger
options DDB_ONPANIC=1
options DDB_HISTORY_SIZE=100 # Enable history editing in DDB
@@ -122,6 +121,11 @@ options DDB_HISTORY_SIZE=100 # Enable h
makeoptions DEBUG="-g" # compile full symbol table
makeoptions COPY_SYMTAB=1
+#options VERBOSE_INIT_ARM # verbose bootstraping messages
+#options EARLYCONS=beagle
+#options CONSADDR=0x48020000, CONSPEED=38400
+options CONSADDR=0x48020000, CONSPEED=115200
+
## USB Debugging options
options USB_DEBUG
options EHCI_DEBUG
@@ -189,8 +193,6 @@ gpio* at omapgpio?
# On-board 16550 UARTs
com0 at obio2 addr 0x48020000 intr 106 mult 4 # UART3 (console)
-#options CONSADDR=0x48020000, CONSPEED=38400
-options CONSADDR=0x48020000, CONSPEED=115200
# Operating System Timer
#omapmputmr0 at obio2 addr 0x48032000 intr 70 # GP Timer 2 L4PER
Index: src/sys/arch/evbarm/conf/VTC100
diff -u src/sys/arch/evbarm/conf/VTC100:1.20 src/sys/arch/evbarm/conf/VTC100:1.21
--- src/sys/arch/evbarm/conf/VTC100:1.20 Tue Oct 23 19:58:52 2018
+++ src/sys/arch/evbarm/conf/VTC100 Sat May 18 08:49:23 2019
@@ -1,5 +1,5 @@
#
-# $NetBSD: VTC100,v 1.20 2018/10/23 19:58:52 jdolecek Exp $
+# $NetBSD: VTC100,v 1.21 2019/05/18 08:49:23 skrll Exp $
#
# VTC100 -- NEXCOM VTC100 Kernel
#
@@ -117,7 +117,6 @@ options KTRACE # system call tracing,
options DIAGNOSTIC # internal consistency checks
options DEBUG
#options PMAP_DEBUG # Enable pmap_debug_level code
-#options VERBOSE_INIT_ARM # verbose bootstraping messages
options DDB # in-kernel debugger
options DDB_ONPANIC=1
options DDB_HISTORY_SIZE=100 # Enable history editing in DDB
@@ -125,6 +124,10 @@ options DDB_HISTORY_SIZE=100 # Enable h
makeoptions DEBUG="-g" # compile full symbol table
makeoptions COPY_SYMTAB=1
+#options VERBOSE_INIT_ARM # verbose bootstraping messages
+#options EARLYCONS=beagle
+options CONSADDR=0x48022000, CONSPEED=115200
+
## USB Debugging options
#options USB_DEBUG
#options MOTG_DEBUG
@@ -200,7 +203,7 @@ iic* at tiiic?
# On-board 16550 UARTs
com0 at obio1 addr 0x48022000 size 0x1000 intr 73 mult 4 # UART1
-options CONSADDR=0x48022000, CONSPEED=115200
+
# GPS
com1 at obio1 addr 0x481a6000 size 0x1000 intr 44 mult 4 # UART3
Index: src/sys/arch/evbarm/conf/mk.beagle
diff -u src/sys/arch/evbarm/conf/mk.beagle:1.11 src/sys/arch/evbarm/conf/mk.beagle:1.12
--- src/sys/arch/evbarm/conf/mk.beagle:1.11 Sat Mar 29 14:11:24 2014
+++ src/sys/arch/evbarm/conf/mk.beagle Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: mk.beagle,v 1.11 2014/03/29 14:11:24 matt Exp $
+# $NetBSD: mk.beagle,v 1.12 2019/05/18 08:49:23 skrll Exp $
.if ${KERNEL_BUILD:T:MPANDA*} != ""
CPPFLAGS+= -mcpu=cortex-a9
.elif ${KERNEL_BUILD:T:MOMAP5*} != ""
@@ -8,14 +8,12 @@ CPPFLAGS+= -mcpu=cortex-a8
.endif
CPPFLAGS+= -mfpu=neon
-SYSTEM_FIRST_OBJ= beagle_start.o
-SYSTEM_FIRST_SFILE= ${THISARM}/beagle/beagle_start.S
-
-GENASSYM_EXTRAS+= ${THISARM}/beagle/genassym.cf
+SYSTEM_FIRST_OBJ= armv6_start.o
+SYSTEM_FIRST_SFILE= ${ARM}/arm/armv6_start.S
_OSRELEASE!= ${HOST_SH} $S/conf/osrelease.sh
-MKUBOOTIMAGEARGS= -A arm -T kernel
+MKUBOOTIMAGEARGS= -A arm -T kernel -O linux
MKUBOOTIMAGEARGS+= -a $(LOADADDRESS) -e $(LOADADDRESS)
MKUBOOTIMAGEARGS+= -n "NetBSD/$(BOARDTYPE) ${_OSRELEASE}"
MKUBOOTIMAGEARGS_NONE= ${MKUBOOTIMAGEARGS} -C none
Index: src/sys/arch/evbarm/conf/mk.gumstix
diff -u src/sys/arch/evbarm/conf/mk.gumstix:1.6 src/sys/arch/evbarm/conf/mk.gumstix:1.7
--- src/sys/arch/evbarm/conf/mk.gumstix:1.6 Tue Oct 4 16:18:38 2016
+++ src/sys/arch/evbarm/conf/mk.gumstix Sat May 18 08:49:23 2019
@@ -1,22 +1,24 @@
-# $NetBSD: mk.gumstix,v 1.6 2016/10/04 16:18:38 kiyohara Exp $
+# $NetBSD: mk.gumstix,v 1.7 2019/05/18 08:49:23 skrll Exp $
+.if ${BOARDTYPE} == "gumstix"
SYSTEM_FIRST_OBJ= gumstix_start.o
SYSTEM_FIRST_SFILE= ${THISARM}/gumstix/gumstix_start.S
-_OSRELEASE!= ${HOST_SH} $S/conf/osrelease.sh
-
-.if ${BOARDTYPE} == "gumstix"
KERNEL_BASE_PHYS=0xa0200000
-.elif ${BOARDTYPE} == "overo"
-KERNEL_BASE_PHYS=$(LOADADDRESS)
-.elif ${BOARDTYPE} == "duovero"
-KERNEL_BASE_PHYS=$(LOADADDRESS)
-.elif ${BOARDTYPE} == "pepper"
+MKUBOOTEXTRAARGS=
+.else
+SYSTEM_FIRST_OBJ= armv6_start.o
+SYSTEM_FIRST_SFILE= ${ARM}/arm/armv6_start.S
+
KERNEL_BASE_PHYS=$(LOADADDRESS)
+MKUBOOTEXTRAARGS= -O linux
.endif
+
+_OSRELEASE!= ${HOST_SH} $S/conf/osrelease.sh
+
KERNEL_BASE_VIRT=$(LOADADDRESS)
-MKUBOOTIMAGEARGS= -A arm -T kernel
+MKUBOOTIMAGEARGS= -A arm -T kernel ${MKUBOOTEXTRAARGS}
MKUBOOTIMAGEARGS+= -a $(KERNEL_BASE_PHYS)
MKUBOOTIMAGEARGS+= -n "NetBSD/$(BOARDTYPE) ${_OSRELEASE}"
MKUBOOTIMAGEARGS_NONE= ${MKUBOOTIMAGEARGS} -C none
Index: src/sys/arch/evbarm/conf/mk.imx7
diff -u src/sys/arch/evbarm/conf/mk.imx7:1.1 src/sys/arch/evbarm/conf/mk.imx7:1.2
--- src/sys/arch/evbarm/conf/mk.imx7:1.1 Tue May 17 06:44:46 2016
+++ src/sys/arch/evbarm/conf/mk.imx7 Sat May 18 08:49:23 2019
@@ -1,16 +1,14 @@
-# $NetBSD: mk.imx7,v 1.1 2016/05/17 06:44:46 ryo Exp $
+# $NetBSD: mk.imx7,v 1.2 2019/05/18 08:49:23 skrll Exp $
-SYSTEM_FIRST_OBJ= imx7_start.o
-SYSTEM_FIRST_SFILE= ${THISARM}/imx7/imx7_start.S
-
-GENASSYM_EXTRAS+= ${THISARM}/imx7/genassym.cf
+SYSTEM_FIRST_OBJ= armv6_start.o
+SYSTEM_FIRST_SFILE= ${ARM}/arm/armv6_start.S
_OSRELEASE!= ${HOST_SH} $S/conf/osrelease.sh
KERNEL_BASE_PHYS?=$(LOADADDRESS)
KERNEL_BASE_VIRT?=$(LOADADDRESS)
-MKUBOOTIMAGEARGS= -A arm -T kernel
+MKUBOOTIMAGEARGS= -A arm -T kernel -O linux
MKUBOOTIMAGEARGS+= -a $(KERNEL_BASE_PHYS) -e $(KERNEL_BASE_PHYS)
MKUBOOTIMAGEARGS+= -n "NetBSD/$(BOARDTYPE) ${_OSRELEASE}"
MKUBOOTIMAGEARGS_NONE= ${MKUBOOTIMAGEARGS} -C none
Index: src/sys/arch/evbarm/conf/mk.kobo
diff -u src/sys/arch/evbarm/conf/mk.kobo:1.1 src/sys/arch/evbarm/conf/mk.kobo:1.2
--- src/sys/arch/evbarm/conf/mk.kobo:1.1 Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/conf/mk.kobo Sat May 18 08:49:23 2019
@@ -1,11 +1,11 @@
-# $NetBSD: mk.kobo,v 1.1 2014/07/25 11:22:50 hkenken Exp $
+# $NetBSD: mk.kobo,v 1.2 2019/05/18 08:49:23 skrll Exp $
CPPFLAGS+= -mcpu=cortex-a8 -mfpu=neon
-SYSTEM_FIRST_OBJ= kobo_start.o
-SYSTEM_FIRST_SFILE= ${THISARM}/kobo/kobo_start.S
+SYSTEM_FIRST_OBJ= armv6_start.o
+SYSTEM_FIRST_SFILE= ${ARM}/arm/armv6_start.S
-MKUBOOTIMAGEARGS= -A arm -T kernel
+MKUBOOTIMAGEARGS= -A arm -T kernel -O linux
MKUBOOTIMAGEARGS+= -a $(LOADADDRESS) -e $(LOADADDRESS)
MKUBOOTIMAGEARGS+= -n "NetBSD/$(BOARDTYPE) ${_OSRELEASE}"
MKUBOOTIMAGEARGS_NONE= ${MKUBOOTIMAGEARGS} -C none
Index: src/sys/arch/evbarm/conf/mk.nitrogen6
diff -u src/sys/arch/evbarm/conf/mk.nitrogen6:1.3 src/sys/arch/evbarm/conf/mk.nitrogen6:1.4
--- src/sys/arch/evbarm/conf/mk.nitrogen6:1.3 Thu Oct 18 09:01:54 2018
+++ src/sys/arch/evbarm/conf/mk.nitrogen6 Sat May 18 08:49:23 2019
@@ -1,31 +1,25 @@
-# $NetBSD: mk.nitrogen6,v 1.3 2018/10/18 09:01:54 skrll Exp $
+# $NetBSD: mk.nitrogen6,v 1.4 2019/05/18 08:49:23 skrll Exp $
SYSTEM_FIRST_OBJ= armv6_start.o
SYSTEM_FIRST_SFILE= ${ARM}/arm/armv6_start.S
_OSRELEASE!= ${HOST_SH} $S/conf/osrelease.sh
-KERNEL_BASE_PHYS?=$(LOADADDRESS)
-KERNEL_BASE_VIRT?=$(LOADADDRESS)
+#KERNEL_BASE_PHYS?=$(LOADADDRESS)
+#KERNEL_BASE_VIRT?=$(LOADADDRESS)
-MKUBOOTIMAGEARGS= -A arm -T kernel -O linux
-MKUBOOTIMAGEARGS+= -a $(KERNEL_BASE_PHYS) -e $(KERNEL_BASE_PHYS)
+MKUBOOTIMAGEARGS= -A arm -T kernel_noload -O linux -C none
+MKUBOOTIMAGEARGS+= -e 0
MKUBOOTIMAGEARGS+= -n "NetBSD/$(BOARDTYPE) ${_OSRELEASE}"
-MKUBOOTIMAGEARGS_NONE= ${MKUBOOTIMAGEARGS} -C none
-MKUBOOTIMAGEARGS_GZ= ${MKUBOOTIMAGEARGS} -C gz
SYSTEM_LD_TAIL_EXTRA+=; \
echo ${OBJCOPY} -S -O binary $@ [email protected]; \
${OBJCOPY} -S -O binary $@ [email protected]; \
- echo ${TOOL_GZIP} -9c [email protected] > [email protected]; \
- ${TOOL_GZIP} -9c [email protected] > [email protected]; \
- echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} [email protected] [email protected]; \
- ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} [email protected] [email protected]; \
- echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} [email protected] [email protected]; \
- ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} [email protected] [email protected]; \
+ echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS} [email protected] [email protected]; \
+ ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS} [email protected] [email protected]; \
echo
EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.bin@}
EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.ub@}
EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.bin.gz@}
-EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.gz.ub@}
+
Index: src/sys/arch/evbarm/conf/std.bcm53xx
diff -u src/sys/arch/evbarm/conf/std.bcm53xx:1.19 src/sys/arch/evbarm/conf/std.bcm53xx:1.20
--- src/sys/arch/evbarm/conf/std.bcm53xx:1.19 Mon Jan 21 07:29:36 2019
+++ src/sys/arch/evbarm/conf/std.bcm53xx Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: std.bcm53xx,v 1.19 2019/01/21 07:29:36 skrll Exp $
+# $NetBSD: std.bcm53xx,v 1.20 2019/05/18 08:49:23 skrll Exp $
#
# standard NetBSD/evbarm for BCM5301X options
@@ -21,6 +21,7 @@ options _ARM32_NEED_BUS_DMA_BOUNCE
options __HAVE_CPU_COUNTER
options __HAVE_CPU_UAREA_ALLOC_IDLELWP
options __HAVE_FAST_SOFTINTS # should be in types.h
+options __HAVE_GENERIC_START
options __HAVE_MM_MD_CACHE_ALIASING
options __HAVE_MM_MD_DIRECT_MAPPED_PHYS
options __HAVE_PCI_CONF_HOOK
Index: src/sys/arch/evbarm/conf/std.gumstix
diff -u src/sys/arch/evbarm/conf/std.gumstix:1.10 src/sys/arch/evbarm/conf/std.gumstix:1.11
--- src/sys/arch/evbarm/conf/std.gumstix:1.10 Sun Oct 7 07:48:44 2018
+++ src/sys/arch/evbarm/conf/std.gumstix Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: std.gumstix,v 1.10 2018/10/07 07:48:44 skrll Exp $
+# $NetBSD: std.gumstix,v 1.11 2019/05/18 08:49:23 skrll Exp $
#
# standard NetBSD/evbarm for GUMSTIX options
@@ -7,13 +7,14 @@ include "arch/evbarm/conf/std.evbarm"
include "arch/evbarm/conf/files.gumstix"
+options ARM_INTR_IMPL="<arch/arm/xscale/pxa2x0_intr.h>"
+options EVBARM_BOARDTYPE=gumstix
options KERNEL_BASE_EXT=0xc0000000
-makeoptions LOADADDRESS="0xc0200000"
+options MD_CPU_HATCH=gumstix_cpu_hatch
+
makeoptions BOARDTYPE="gumstix"
-options EVBARM_BOARDTYPE=gumstix
makeoptions BOARDMKFRAG="${THISARM}/conf/mk.gumstix"
-
-options ARM_INTR_IMPL="<arch/arm/xscale/pxa2x0_intr.h>"
+makeoptions LOADADDRESS="0xc0200000"
# OS Timer
saost* at pxaip? addr 0x40a00000 size 0x20
Index: src/sys/arch/evbarm/conf/std.overo
diff -u src/sys/arch/evbarm/conf/std.overo:1.10 src/sys/arch/evbarm/conf/std.overo:1.11
--- src/sys/arch/evbarm/conf/std.overo:1.10 Mon Oct 15 16:54:54 2018
+++ src/sys/arch/evbarm/conf/std.overo Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: std.overo,v 1.10 2018/10/15 16:54:54 skrll Exp $
+# $NetBSD: std.overo,v 1.11 2019/05/18 08:49:23 skrll Exp $
#
# standard NetBSD/evbarm for OVERO options
@@ -7,12 +7,13 @@ include "arch/evbarm/conf/std.evbarm"
include "arch/evbarm/conf/files.overo"
+options ARM_GENERIC_TODR
+options ARM_INTR_IMPL="<arch/arm/omap/omap2_intr.h>"
options CORTEX_PMC
-options __HAVE_FAST_SOFTINTS # should be in types.h
+options MD_CPU_HATCH=gumstix_cpu_hatch
options TPIDRPRW_IS_CURCPU
+options __HAVE_FAST_SOFTINTS # should be in types.h
+options __HAVE_GENERIC_START
makeoptions LOADADDRESS="0x80200000"
makeoptions BOARDMKFRAG="${THISARM}/conf/mk.gumstix"
-
-options ARM_INTR_IMPL="<arch/arm/omap/omap2_intr.h>"
-options ARM_GENERIC_TODR
Index: src/sys/arch/evbarm/conf/std.imx7
diff -u src/sys/arch/evbarm/conf/std.imx7:1.4 src/sys/arch/evbarm/conf/std.imx7:1.5
--- src/sys/arch/evbarm/conf/std.imx7:1.4 Mon Oct 15 16:54:54 2018
+++ src/sys/arch/evbarm/conf/std.imx7 Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: std.imx7,v 1.4 2018/10/15 16:54:54 skrll Exp $
+# $NetBSD: std.imx7,v 1.5 2019/05/18 08:49:23 skrll Exp $
#
# standard NetBSD/evbarm options for i.MX7 board
@@ -8,27 +8,25 @@ include "arch/evbarm/conf/std.evbarm"
# Pull in imx7 config definitions.
include "arch/evbarm/conf/files.imx7"
-options IMX7BOARD
-
+options ARM_GENERIC_TODR
options ARM_HAS_VBAR
+options ARM_INTR_IMPL="<arch/arm/imx/imx7_intr.h>"
+options CORTEX_PMC
+options CORTEX_PMC_CCNT_HZ=792000000
+options FPU_VFP
+options IMX7BOARD
+options MD_CPU_HATCH=imx7_cpu_hatch
+options TPIDRPRW_IS_CURCPU
options __HAVE_CPU_COUNTER
options __HAVE_FAST_SOFTINTS # should be in types.h
options __HAVE_CPU_UAREA_ALLOC_IDLELWP
+options __HAVE_GENERIC_START
options __HAVE_MM_MD_DIRECT_MAPPED_PHYS
-options TPIDRPRW_IS_CURCPU
makeoptions CPUFLAGS="-mcpu=cortex-a7 -mfpu=neon"
-# To support easy transit to ../arch/arm/arm32
-options FPU_VFP
-options CORTEX_PMC
-options CORTEX_PMC_CCNT_HZ=792000000
-
-makeoptions KERNEL_BASE_PHYS="0x82000000"
-makeoptions KERNEL_BASE_VIRT="0x82000000"
-
makeoptions BOARDMKFRAG="${THISARM}/conf/mk.imx7"
makeoptions CPPFLAGS+="-I$S/../../../include"
+makeoptions KERNEL_BASE_PHYS="0x82000000"
+makeoptions KERNEL_BASE_VIRT="0x82000000"
-options ARM_INTR_IMPL="<arch/arm/imx/imx7_intr.h>"
-options ARM_GENERIC_TODR
Index: src/sys/arch/evbarm/conf/std.kobo
diff -u src/sys/arch/evbarm/conf/std.kobo:1.4 src/sys/arch/evbarm/conf/std.kobo:1.5
--- src/sys/arch/evbarm/conf/std.kobo:1.4 Mon Oct 15 16:54:54 2018
+++ src/sys/arch/evbarm/conf/std.kobo Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: std.kobo,v 1.4 2018/10/15 16:54:54 skrll Exp $
+# $NetBSD: std.kobo,v 1.5 2019/05/18 08:49:23 skrll Exp $
#
# standard NetBSD/evbarm options for Kobo
@@ -8,22 +8,22 @@ include "arch/evbarm/conf/std.evbarm"
# Pull in i.mx51 config definitions.
include "arch/evbarm/conf/files.kobo"
-options MODULAR
-options MODULAR_DEFAULT_AUTOLOAD
-options __HAVE_FAST_SOFTINTS # should be in types.h
-options __HAVE_CPU_COUNTER
-options __HAVE_MM_MD_DIRECT_MAPPED_PHYS
-options __HAVE_CPU_UAREA_ALLOC_IDLELWP
+options ARM_GENERIC_TODR
options ARM_HAS_VBAR
-options TPIDRPRW_IS_CURCPU
+options ARM_INTR_IMPL="<arch/arm/imx/imx51_intr.h>"
options CORTEX_PMC
options CORTEX_PMC_CCNT_HZ=800000000
options EVBARM_BOARDTYPE="kobo"
options FPU_VFP
+options MODULAR
+options MODULAR_DEFAULT_AUTOLOAD
+options TPIDRPRW_IS_CURCPU
+options __HAVE_CPU_COUNTER
+options __HAVE_CPU_UAREA_ALLOC_IDLELWP
+options __HAVE_FAST_SOFTINTS # should be in types.h
+options __HAVE_GENERIC_START
+options __HAVE_MM_MD_DIRECT_MAPPED_PHYS
makeoptions LOADADDRESS_VIRT="0x80100000"
makeoptions LOADADDRESS="0x70100000"
makeoptions BOARDMKFRAG="${THISARM}/conf/mk.kobo"
-
-options ARM_INTR_IMPL="<arch/arm/imx/imx51_intr.h>"
-options ARM_GENERIC_TODR
Index: src/sys/arch/evbarm/conf/std.nitrogen6
diff -u src/sys/arch/evbarm/conf/std.nitrogen6:1.9 src/sys/arch/evbarm/conf/std.nitrogen6:1.10
--- src/sys/arch/evbarm/conf/std.nitrogen6:1.9 Thu Oct 18 09:01:54 2018
+++ src/sys/arch/evbarm/conf/std.nitrogen6 Sat May 18 08:49:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: std.nitrogen6,v 1.9 2018/10/18 09:01:54 skrll Exp $
+# $NetBSD: std.nitrogen6,v 1.10 2019/05/18 08:49:23 skrll Exp $
#
# standard NetBSD/evbarm options for Nitrogen6X
@@ -27,5 +27,8 @@ options __HAVE_GENERIC_START
makeoptions BOARDMKFRAG="${THISARM}/conf/mk.nitrogen6"
makeoptions CPPFLAGS+="-I$S/../../../include"
makeoptions CPUFLAGS="-mcpu=cortex-a9"
-makeoptions KERNEL_BASE_PHYS="0x18000000"
-makeoptions KERNEL_BASE_VIRT="0x80000000"
+
+# The physical address is chosen by u-boot and determined by armv6_start.S.
+# The 64 byte offset is due to u-boot header.
+makeoptions KERNEL_BASE_PHYS="0x00000040"
+makeoptions KERNEL_BASE_VIRT="0x80000040"
Index: src/sys/arch/evbarm/gumstix/gumstix_machdep.c
diff -u src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.61 src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.62
--- src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.61 Fri Sep 21 12:04:08 2018
+++ src/sys/arch/evbarm/gumstix/gumstix_machdep.c Sat May 18 08:49:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: gumstix_machdep.c,v 1.61 2018/09/21 12:04:08 skrll Exp $ */
+/* $NetBSD: gumstix_machdep.c,v 1.62 2019/05/18 08:49:24 skrll Exp $ */
/*
* Copyright (C) 2005, 2006, 2007 WIDE Project and SOUM Corporation.
* All rights reserved.
@@ -179,10 +179,7 @@
#include <arm/locore.h>
#include <arm/arm32/machdep.h>
-#if NARML2CC > 0
-#include <arm/cortex/pl310_var.h>
-#endif
-#include <arm/cortex/scu_reg.h>
+
#include <arm/omap/omap2_obiovar.h>
#include <arm/omap/am335x_prcm.h>
#include <arm/omap/omap2_gpio.h>
@@ -195,18 +192,37 @@
#include <arm/omap/omap_var.h>
#include <arm/omap/omap_com.h>
#include <arm/omap/tifbvar.h>
+
#include <arm/xscale/pxa2x0reg.h>
#include <arm/xscale/pxa2x0var.h>
#include <arm/xscale/pxa2x0_gpio.h>
#include <evbarm/gumstix/gumstixreg.h>
#include <evbarm/gumstix/gumstixvar.h>
+#if defined(CPU_CORTEXA9)
+#include <arm/cortex/pl310_var.h>
+#include <arm/cortex/pl310_reg.h>
+#include <arm/cortex/scu_reg.h>
+
+#include <arm/cortex/a9tmr_var.h>
+#endif
+
+#if defined(CPU_CORTEXA7) || defined(CPU_CORTEXA15)
+#include <arm/cortex/gtmr_var.h>
+#endif
+
#include <dev/cons.h>
#ifdef KGDB
#include <sys/kgdb.h>
#endif
+#ifdef VERBOSE_INIT_ARM
+#define VPRINTF(...) printf(__VA_ARGS__)
+#else
+#define VPRINTF(...) __nothing
+#endif
+
/*
* The range 0xc1000000 - 0xfd000000 is available for kernel VM space
* Core-logic registers and I/O mappings occupy
@@ -391,6 +407,13 @@ static const struct pmap_devmap gumstix_
VM_PROT_READ | VM_PROT_WRITE,
PTE_NOCACHE
},
+ {
+ OVERO_SRDC_VBASE,
+ _A(OMAP3530_SDRC_BASE),
+ _S(OMAP3530_SDRC_SIZE),
+ VM_PROT_READ | VM_PROT_WRITE,
+ PTE_NOCACHE
+ },
#elif defined(DUOVERO)
{
DUOVERO_L4_CM_VBASE,
@@ -420,6 +443,13 @@ static const struct pmap_devmap gumstix_
VM_PROT_READ | VM_PROT_WRITE,
PTE_NOCACHE
},
+ {
+ DUOVERO_DMM_VBASE,
+ _A(OMAP4430_DMM_BASE),
+ _S(OMAP4430_DMM_SIZE),
+ VM_PROT_READ | VM_PROT_WRITE,
+ PTE_NOCACHE
+ },
#elif defined(PEPPER)
{
/* CM, Control Module, GPIO0, Console */
@@ -444,6 +474,95 @@ static const struct pmap_devmap gumstix_
#undef _A
#undef _S
+#ifdef MULTIPROCESSOR
+void gumstix_cpu_hatch(struct cpu_info *);
+
+void
+gumstix_cpu_hatch(struct cpu_info *ci)
+{
+#if defined(CPU_CORTEXA9)
+ a9tmr_init_cpu_clock(ci);
+#elif defined(CPU_CORTEXA7) || defined(CPU_CORTEXA15)
+ gtmr_init_cpu_clock(ci);
+#endif
+}
+#endif
+
+
+static void
+gumstix_mpstart(void)
+{
+#if defined(MULTIPROCESSOR)
+ const bus_space_tag_t iot = &omap_bs_tag;
+ int error;
+
+#if defined(CPU_CORTEXA9)
+ bus_space_handle_t scu_ioh;
+ error = bus_space_map(iot, OMAP4_SCU_BASE, OMAP4_SCU_SIZE, 0, &scu_ioh);
+ if (error)
+ panic("Could't map OMAP4_SCU_BASE");
+
+ /*
+ * Invalidate all SCU cache tags. That is, for all cores (0-3)
+ */
+ bus_space_write_4(iot, scu_ioh, SCU_INV_ALL_REG, 0xffff);
+
+ uint32_t diagctl = bus_space_read_4(iot, scu_ioh, SCU_DIAG_CONTROL);
+ diagctl |= SCU_DIAG_DISABLE_MIGBIT;
+ bus_space_write_4(iot, scu_ioh, SCU_DIAG_CONTROL, diagctl);
+
+ uint32_t scu_ctl = bus_space_read_4(iot, scu_ioh, SCU_CTL);
+ scu_ctl |= SCU_CTL_SCU_ENA;
+ bus_space_write_4(iot, scu_ioh, SCU_CTL, scu_ctl);
+
+ armv7_dcache_wbinv_all();
+#endif
+ bus_space_handle_t wugen_ioh;
+ error = bus_space_map(iot, OMAP4_WUGEN_BASE, OMAP4_WUGEN_SIZE, 0,
+ &wugen_ioh);
+ if (error)
+ panic("Couldn't map OMAP4_WUGEN_BASE");
+ const paddr_t mpstart = KERN_VTOPHYS((vaddr_t)cpu_mpstart);
+
+ bus_space_write_4(iot, wugen_ioh, OMAP4_AUX_CORE_BOOT1, mpstart);
+
+ for (size_t i = 1; i < arm_cpu_max; i++) {
+ uint32_t boot = bus_space_read_4(iot, wugen_ioh, OMAP4_AUX_CORE_BOOT0);
+ boot |= __SHIFTIN(0xf, i * 4);
+ bus_space_write_4(iot, wugen_ioh, OMAP4_AUX_CORE_BOOT0, boot);
+ }
+
+ arm_dsb();
+ __asm __volatile("sev" ::: "memory");
+
+ for (int loop = 0; loop < 16; loop++) {
+ VPRINTF("%u hatched %#x\n", loop, arm_cpu_hatched);
+ if (arm_cpu_hatched == __BITS(arm_cpu_max - 1, 1))
+ break;
+ int timo = 1500000;
+ while (arm_cpu_hatched != __BITS(arm_cpu_max - 1, 1))
+ if (--timo == 0)
+ break;
+ }
+ for (size_t i = 1; i < arm_cpu_max; i++) {
+ if ((arm_cpu_hatched & __BIT(i)) == 0) {
+ printf("%s: warning: cpu%zu failed to hatch\n",
+ __func__, i);
+ }
+ }
+
+ VPRINTF(" (%u cpu%s, hatched %#x)",
+ arm_cpu_max, arm_cpu_max ? "s" : "",
+ arm_cpu_hatched);
+#endif
+}
+
+#if defined(CPU_CORTEX)
+/* filled in before cleaning bss. keep in .data */
+u_int uboot_args[4] __attribute__((__section__(".data")));
+#else
+extern uint32_t *uboot_args;
+#endif
/*
* u_int initarm(...)
@@ -462,10 +581,15 @@ u_int
initarm(void *arg)
{
extern char KERNEL_BASE_phys[];
- extern uint32_t *u_boot_args[];
- extern uint32_t ram_size;
+ uint32_t ram_size = 0x400000;
enum { r0 = 0, r1 = 1, r2 = 2, r3 = 3 }; /* args from u-boot */
+#if defined(OVERO) || defined(DUOVERO) /* || defined(PEPPER) */
+ const bus_space_tag_t iot = &omap_bs_tag;
+#endif
+
+#if defined(CPU_XSCALE)
+
/*
* We mapped PA == VA in gumstix_start.S.
* Also mapped SDRAM to KERNEL_BASE first 64Mbyte only with cachable.
@@ -477,21 +601,7 @@ initarm(void *arg)
* 0x40000000 - 0x480fffff Processor Registers
* 0xa0000000 - 0xa3ffffff SDRAM Bank 0 (64MB or 128MB)
* 0xc0000000 - 0xc3ffffff KERNEL_BASE
- *
- * Overo:
- * Physical Address Range Description
- * ----------------------- ----------------------------------
- * 0x80000000 - 0x9fffffff SDRAM Bank 0
- * 0x80000000 - 0x83ffffff KERNEL_BASE
- *
- * DuoVero, Pepper:
- * Physical Address Range Description
- * ----------------------- ----------------------------------
- * 0x80000000 - 0xbfffffff SDRAM Bank 0
- * 0x80000000 - 0x83ffffff KERNEL_BASE
*/
-
-#if defined(CPU_XSCALE)
extern vaddr_t xscale_cache_clean_addr;
xscale_cache_clean_addr = 0xff000000U;
@@ -524,6 +634,62 @@ initarm(void *arg)
pxa2x0_clkman_bootstrap(GUMSTIX_CLKMAN_VBASE);
#endif
+
+#if defined(OVERO)
+
+#define OMAP3530_SRDC_MCFG_p(p) (0x80 + ((p) * 0x30))
+#define OMAP3530_SRDC_MCFG_RAMSIZE __BITS(17,8)
+
+ bus_space_handle_t sdrcioh;
+ if (bus_space_map(iot, OMAP3530_SDRC_BASE, OMAP3530_SDRC_SIZE,
+ 0, &sdrcioh) != 0)
+ panic("OMAP_SDRC_BASE map failed\n");
+
+ ram_size = 0;
+ for (u_int p = 0; p < 2; p++) {
+ uint32_t mcfg = bus_space_read_4(iot, sdrcioh,
+ OMAP3530_SRDC_MCFG_p(p));
+ ram_size += __SHIFTOUT(mcfg, OMAP3530_SRDC_MCFG_RAMSIZE) *
+ (2 * 1024 * 1024);
+ }
+
+#elif defined(DUOVERO)
+
+#define OMAP4_DMM_LISA_MAP_i(i) (0x40 + ((i) * 0x4))
+#define OMAP4_DMM_LISA_SYS_ADDR __BITS(31,24)
+#define OMAP4_DMM_LISA_SYS_SIZE __BITS(22,20)
+#define OMAP4_DMM_LISA_SDRC_ADDRSPC __BITS(17,16)
+
+ bus_space_handle_t dmmioh;
+ if (bus_space_map(iot, OMAP4430_DMM_BASE, OMAP4430_DMM_SIZE, 0,
+ &dmmioh) != 0)
+ panic("OMAP4_DMM_BASE map failed\n");
+
+ ram_size = 0;
+ for (u_int i = 0; i < 4; i++) {
+ const uint32_t lisa = bus_space_read_4(iot, dmmioh,
+ OMAP4_DMM_LISA_MAP_i(i));
+
+ const uint32_t sys_addr =
+ __SHIFTOUT(lisa, OMAP4_DMM_LISA_SYS_ADDR);
+ /* skip non-physical */
+ if ((sys_addr & 0x80) != 0)
+ continue;
+
+ const uint32_t sdrc_addrspc =
+ __SHIFTOUT(lisa, OMAP4_DMM_LISA_SDRC_ADDRSPC);
+ /* Skip reserced areas */
+ if (sdrc_addrspc == 2)
+ continue;
+
+ const uint32_t sys_size =
+ __SHIFTOUT(lisa, OMAP4_DMM_LISA_SYS_SIZE);
+ ram_size += (16 * 1024 * 1024) << sys_size;
+ }
+
+
+#endif
+
cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
/* configure MUX, GPIO and CLK. */
@@ -545,17 +711,16 @@ initarm(void *arg)
#elif defined(OVERO) || defined(DUOVERO) || defined(PEPPER)
#define SDRAM_START 0x80000000UL
#endif
- if ((uint32_t)u_boot_args[r0] < SDRAM_START ||
- (uint32_t)u_boot_args[r0] >= SDRAM_START + ram_size)
+ if (uboot_args[r0] < SDRAM_START ||
+ uboot_args[r0] >= SDRAM_START + ram_size)
/* Maybe r0 is 'argc'. We are booted by command 'go'. */
- process_kernel_args((int)u_boot_args[r0],
- (char **)u_boot_args[r1]);
+ process_kernel_args(uboot_args[r0], (char **)uboot_args[r1]);
else
/*
* Maybe r3 is 'boot args string' of 'bootm'. This string is
* linely.
*/
- process_kernel_args_liner((char *)u_boot_args[r3]);
+ process_kernel_args_liner((char *)uboot_args[r3]);
#ifdef GUMSTIX_NETBSD_ARGS_CONSOLE
consinit();
#endif
@@ -570,12 +735,9 @@ initarm(void *arg)
read_system_serial();
#endif
-#ifdef VERBOSE_INIT_ARM
- printf("initarm: Configuring system ...\n");
-#endif
+ VPRINTF("initarm: Configuring system ...\n");
#if defined(OMAP_4430)
- const bus_space_tag_t iot = &omap_bs_tag;
bus_space_handle_t ioh;
#if NARML2CC > 0
@@ -616,7 +778,14 @@ initarm(void *arg)
evbarm_device_register = gumstix_device_register;
- return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+ u_int sp = initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+
+ /*
+ * initarm_common flushes cache if required before AP start
+ */
+ gumstix_mpstart();
+
+ return sp;
}
#if defined(GUMSTIX)
Index: src/sys/arch/evbarm/gumstix/gumstix_start.S
diff -u src/sys/arch/evbarm/gumstix/gumstix_start.S:1.15 src/sys/arch/evbarm/gumstix/gumstix_start.S:1.16
--- src/sys/arch/evbarm/gumstix/gumstix_start.S:1.15 Mon Jan 2 21:46:59 2017
+++ src/sys/arch/evbarm/gumstix/gumstix_start.S Sat May 18 08:49:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: gumstix_start.S,v 1.15 2017/01/02 21:46:59 skrll Exp $ */
+/* $NetBSD: gumstix_start.S,v 1.16 2019/05/18 08:49:24 skrll Exp $ */
/*
* Copyright (C) 2005, 2006 WIDE Project and SOUM Corporation.
* All rights reserved.
@@ -67,11 +67,8 @@
#include <arm/armreg.h>
#include "assym.h"
-#if defined(OVERO) || defined(DUOVERO) || defined(PEPPER)
-#include <arm/omap/omap2_obioreg.h>
-#endif
-RCSID("$NetBSD: gumstix_start.S,v 1.15 2017/01/02 21:46:59 skrll Exp $")
+RCSID("$NetBSD: gumstix_start.S,v 1.16 2019/05/18 08:49:24 skrll Exp $")
/*
* CPWAIT -- Canonical method to wait for CP15 update.
@@ -111,12 +108,11 @@ _C_LABEL(gumstix_start):
/*
* Kernel is loaded in SDRAM (0xa0200000..), and is expected to run
- * in VA 0xc0200000.. (GUMSTIX)
- * VA == PA if OVERO.
+ * in VA 0xc0200000..
*/
/* save u-boot's args */
- adr ip, u_boot_args
+ adr ip, uboot_args
nop
nop
nop
@@ -127,15 +123,12 @@ _C_LABEL(gumstix_start):
/* Calculate RAM size, like vendor's u-boot. */
adr ip, ram_size
-#if defined(GUMSTIX) || defined(PEPPER)
ldr r0, [ip]
-#if defined(GUMSTIX)
mrc p15, 0, r1, c0, c0, 0
and r1, r1, #CPU_ID_XSCALE_COREGEN_MASK
cmp r1, #0x4000
bne 3f /* goto 3f, if basix or connex */
-#endif
0:
/* check memory size, if verdex or verdex-pro */
add r3, ip, r0
@@ -155,39 +148,6 @@ _C_LABEL(gumstix_start):
str r0, [r3] /* restore */
b 1b
3:
-#elif defined(OVERO)
- mov r1, #0x7f000000 /* mask */
- orr r1, r1, #0x00e00000 /* mask */
- mov r3, #0x6d000000 /* OMAP34xx SDRC */
- add r3, r3, #0x0080 /* CS0 MCFG */
- ldr r2, [r3]
- and r0, r1, r2, lsl #13
- add r3, r3, #0x0030 /* CS1 MCFG */
- ldr r2, [r3]
- and r2, r1, r2, lsl #13
- add r0, r0, r2
-#elif defined(DUOVERO)
- mov r0, #0
- mov r3, #0x4e000000 /* OMAP44xx DMM */
- add r3, r3, #0x0050
-0:
- ldr r2, [r3, #-4]! /* DMM_LISA_MAP_[3210] */
- and r1, r2, #0xff000000 /* get SYS_ADDR */
- tst r1, #0x80000000 /* is physical mem? */
- beq 1f
- and r1, r2, #0x00030000 /* get SDRC_ADDRSPC */
- cmp r1, #0x00020000 /* is Reserved? */
- beq 1f
-
- lsr r2, r2, #20
- and r1, r2, #0x7 /* get SYS_SIZE */
- mov r2, #0x01000000
- mov r2, r2, lsl r1
- add r0, r0, r2
-1:
- tst r3, #0x0000000f
- bne 0b
-#endif
str r0, [ip]
/* Build page table from scratch */
@@ -207,26 +167,9 @@ _C_LABEL(gumstix_start):
cmp r1, #0
bne 4b
-#if defined(CPU_CORTEX)
- mrc p15, 0, r1, c0, c0, 5 /* Read MPIDR */
- cmp r1, #0 /* Check MPIDR_MP (bit 31) */
- orrlt r1, r0, #TTBR_MPATTR
- orrge r1, r0, #TTBR_UPATTR
-#else
mov r1, r0
-#endif
mcr p15, 0, r1, c2, c0, 0 /* Set TTB */
mcr p15, 0, r1, c8, c7, 0 /* Flush TLB */
-#if defined(CPU_CORTEX)
- mcr p15, 0, r1, c2, c0, 1 /* Set TTB1 */
- mov r1, #TTBCR_S_N_1
- mcr p15, 0, r1, c2, c0, 2 /* Set TTBCR */
- mov r1, #0
- mcr p15, 0, r1, c8, c7, 0 /* Flush TLB */
-
- mov r1, #0
- mcr p15, 0, r1, c13, c0, 1 /* Write KERNEL_PID(#0) to CONTEXTIDR */
-#endif
/*
* Set the Domain Access register. Very important!
@@ -241,17 +184,6 @@ _C_LABEL(gumstix_start):
#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
orr r1, r1, #CPU_CONTROL_SYST_ENABLE
#endif
-#if defined(CPU_CORTEX)
-#if defined(CPU_CORTEXA8)
- /* Disable L2 cache beforehand. */
- mrc p15, 0, r2, c1, c0, 1
- bic r2, r2, #0x2 /* clear L2EN */
- mcr p15, 0, r2, c1, c0, 1
-#endif
-
- orr r1, r1, #(CPU_CONTROL_AFLT_ENABLE | CPU_CONTROL_DC_ENABLE)
- orr r1, r1, #(CPU_CONTROL_BPRD_ENABLE | CPU_CONTROL_IC_ENABLE)
-#endif
orr r1, r1, #CPU_CONTROL_MMU_ENABLE
mcr p15, 0, r1, c1, c0, 0
/*
@@ -259,9 +191,6 @@ _C_LABEL(gumstix_start):
*/
CPWAIT(r3)
-#if defined(MULTIPROCESSOR)
- bl omap_a9_mpinit /* omap_a9_mpinit(r0) */
-#endif
/* Jump to kernel code in TRUE VA */
ldr r0, Lstart
@@ -271,8 +200,8 @@ Lstart:
.word start
- .globl _C_LABEL(u_boot_args)
-u_boot_args:
+ .globl _C_LABEL(uboot_args)
+uboot_args:
.space 16 /* r0, r1, r2, r3 */
.globl _C_LABEL(ram_size)
@@ -281,11 +210,7 @@ ram_size:
#ifndef STARTUP_PAGETABLE_ADDR
-#if defined(GUMSTIX)
#define STARTUP_PAGETABLE_ADDR 0xa0000000 /* aligned 16kByte */
-#elif defined(OVERO) || defined(DUOVERO) || defined(PEPPER)
-#define STARTUP_PAGETABLE_ADDR 0x80000000 /* aligned 16kByte */
-#endif
#endif
Lstartup_pagetable:
.word STARTUP_PAGETABLE_ADDR
@@ -297,7 +222,6 @@ Lstartup_pagetable:
.word (pa) | (attr) ;
mmu_init_table:
-#if defined(GUMSTIX)
/* fill all table VA==PA */
MMU_INIT(0x00000000, 0x00000000,
@@ -313,101 +237,8 @@ mmu_init_table:
MMU_INIT(0xc0000000, SDRAM_START,
64, L1_S_PROTO | L1_S_C | L1_S_AP_KRW)
-#elif defined(OVERO) || defined(DUOVERO) || defined(PEPPER)
-
- /* fill all table VA==PA */
- MMU_INIT(0x00000000, 0x00000000,
- 1 << (32 - L1_S_SHIFT), L1_S_PROTO | L1_S_APv7_KRW | L1_S_V6_XN)
-
-#define SDRAM_START 0x80000000
-
- /* Map VA to PA, write-back cacheable (first 64M only) */
- MMU_INIT(KERNEL_BASE & 0xffffffff, SDRAM_START,
- 64,
-#if defined(MULTIPROCESSOR)
- L1_S_PROTO | L1_S_V6_S | L1_S_B | L1_S_C | L1_S_APv7_KRW
-#else
- L1_S_PROTO | L1_S_B | L1_S_C | L1_S_APv7_KRW
-#endif
- )
-
-#endif
MMU_INIT(0, 0, 0, 0) /* end of table */
#undef MMU_INIT
-#if defined(MULTIPROCESSOR)
-#define XPUTC(n)
-
-#define MD_CPU_HATCH _C_LABEL(a9tmr_init_cpu_clock)
-
-#include <arm/cortex/pl310_reg.h>
-#include <arm/cortex/a9_mpsubr.S>
-
-omap_a9_mpinit:
- mrc p15, 0, r1, c0, c0, 5 /* Read MPIDR */
- and r1, r1, #(MPIDR_MP | MPIDR_U)
- cmp r1, #MPIDR_MP
- bxne lr /* not MP */
-
- /* Invalidate CPU0 ways */
- mrc p15, 4, r3, c15, c0, 0;
- mov r1, #0xf;
- str r1, [r3, #SCU_INV_ALL_REG]
- dsb
- isb
-
- ldr r1, [r3, #SCU_CTL]
- orr r1, r1, #SCU_CTL_SCU_ENA
- str r1, [r3, #SCU_CTL]
- dsb
- isb
-
- movw r1, #:lower16:cortex_mmuinfo
- movt r1, #:upper16:cortex_mmuinfo
- str r0, [r1]
- /* Make sure the info makes into memory */
- mcr p15, 0, r1, c7, c10, 1 /* writeback the L1 cache line */
- dsb
- add r3, r3, #0x2000 /* PL310 L2 Cache controller */
- str r1, [r3, #L2C_CLEAN_PA] /* L2 cache also writeback */
- mov r0, #0
- str r0, [r3, #L2C_CACHE_SYNC]
-0:
- ldr r0, [r3, #L2C_CACHE_SYNC]
- tst r0, #0x1
- bne 0b
-
- movw r3, #:lower16:OMAP4_WUGEN_BASE
- movt r3, #:upper16:OMAP4_WUGEN_BASE
-
- /* First we setup the address for the secondaries to jump to. */
- adr r0, cortex_mpstart
- str r0, [r3, #OMAP4_AUX_CORE_BOOT1]
- dsb
-
- /* tell the secondary boot rom(s) to exit their loop */
- ldr r1, [r3, #OMAP4_AUX_CORE_BOOT0]
- orr r1, r1, #0xf0 /* add mask for cpu #1 */
- str r1, [r3, #OMAP4_AUX_CORE_BOOT0]
- dsb
-
- /* Now we kick it and return. */
- sev
- movw r3, #:lower16:arm_cpu_hatched
- movt r3, #:upper16:arm_cpu_hatched
-
- /* Let's wait for the secondary to hatch. */
- mov r1, #0x1000000
-1: dmb
- ldr r0, [r3]
- cmp r0, #0
- bxne lr
- subs r1, r1, #1
- bne 1b
-
- bx lr
-
-END(omap_a9_mpinit)
-#endif /* MULTIPROCESSOR */
Index: src/sys/arch/evbarm/gumstix/gumstixreg.h
diff -u src/sys/arch/evbarm/gumstix/gumstixreg.h:1.9 src/sys/arch/evbarm/gumstix/gumstixreg.h:1.10
--- src/sys/arch/evbarm/gumstix/gumstixreg.h:1.9 Sat Oct 15 16:30:46 2016
+++ src/sys/arch/evbarm/gumstix/gumstixreg.h Sat May 18 08:49:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: gumstixreg.h,v 1.9 2016/10/15 16:30:46 kiyohara Exp $ */
+/* $NetBSD: gumstixreg.h,v 1.10 2019/05/18 08:49:24 skrll Exp $ */
/*
* Copyright (C) 2005, 2006 WIDE Project and SOUM Corporation.
* All rights reserved.
@@ -51,11 +51,13 @@
#define OVERO_L4_PERIPHERAL_VBASE 0xc0100000
#define OVERO_L4_WAKEUP_VBASE 0xc0200000
#define OVERO_GPMC_VBASE 0xc0300000
+#define OVERO_SRDC_VBASE 0xc0400000
#define DUOVERO_L4_CM_VBASE 0xc0000000
#define DUOVERO_L4_PERIPHERAL_VBASE 0xc0100000
#define DUOVERO_L4_WAKEUP_VBASE 0xc0400000
#define DUOVERO_GPMC_VBASE 0xc0500000
+#define DUOVERO_DMM_VBASE 0xc1000000
#define PEPPER_PRCM_VBASE 0xc0000000
#define PEPPER_L4_PERIPHERAL_VBASE 0xc0100000
Index: src/sys/arch/evbarm/imx7/imx7_machdep.c
diff -u src/sys/arch/evbarm/imx7/imx7_machdep.c:1.9 src/sys/arch/evbarm/imx7/imx7_machdep.c:1.10
--- src/sys/arch/evbarm/imx7/imx7_machdep.c:1.9 Fri Sep 21 12:04:08 2018
+++ src/sys/arch/evbarm/imx7/imx7_machdep.c Sat May 18 08:49:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: imx7_machdep.c,v 1.9 2018/09/21 12:04:08 skrll Exp $ */
+/* $NetBSD: imx7_machdep.c,v 1.10 2019/05/18 08:49:24 skrll Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: imx7_machdep.c,v 1.9 2018/09/21 12:04:08 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: imx7_machdep.c,v 1.10 2019/05/18 08:49:24 skrll Exp $");
#include "opt_evbarm_boardtype.h"
#include "opt_arm_debug.h"
@@ -62,10 +62,18 @@ __KERNEL_RCSID(0, "$NetBSD: imx7_machdep
#include <machine/bootconfig.h>
#include <arm/imx/imx7var.h>
+#include <arm/imx/imx7_srcreg.h>
#include <arm/imx/imxuartvar.h>
+#include <arm/imx/imxuartreg.h>
#include <evbarm/imx7/platform.h>
+#ifdef VERBOSE_INIT_ARM
+#define VPRINTF(...) printf(__VA_ARGS__)
+#else
+#define VPRINTF(...) __nothing
+#endif
+
extern int _end[];
extern int KERNEL_BASE_phys[];
extern int KERNEL_BASE_virt[];
@@ -77,12 +85,6 @@ char *boot_args = NULL;
/* filled in before cleaning bss. keep in .data */
u_int uboot_args[4] __attribute__((__section__(".data")));
-/*
- * Macros to translate between physical and virtual for a subset of the
- * kernel address space. *Not* for general use.
- */
-#define KERN_VTOPDIFF ((vaddr_t)KERNEL_BASE_phys - (vaddr_t)KERNEL_BASE_virt)
-
#ifndef CONADDR
#define CONADDR (IMX7_AIPS_BASE + AIPS3_UART1_BASE)
#endif
@@ -96,11 +98,31 @@ u_int uboot_args[4] __attribute__((__sec
void imx7_setup_iomux(void);
void imx7_setup_gpio(void);
void imx7board_device_register(device_t, void *);
+void imx7_mpstart(void);
+void imx7_platform_early_putchar(char);
#ifdef KGDB
#include <sys/kgdb.h>
#endif
+static void
+earlyconsputc(dev_t dev, int c)
+{
+ uartputc(c);
+}
+
+static int
+earlyconsgetc(dev_t dev)
+{
+ return 0;
+}
+
+static struct consdev earlycons = {
+ .cn_putc = earlyconsputc,
+ .cn_getc = earlyconsgetc,
+ .cn_pollc = nullcnpollc,
+};
+
/*
* Static device mappings. These peripheral registers are mapped at
* fixed virtual addresses very early in initarm() so that we can use
@@ -142,6 +164,74 @@ static struct boot_physmem bp_highgig =
};
#endif
+void
+imx7_platform_early_putchar(char c)
+{
+#define CONADDR_VA (CONADDR - IMX7_IOREG_PBASE + KERNEL_IO_IOREG_VBASE)
+ volatile uint32_t *uartaddr = cpu_earlydevice_va_p() ?
+ (volatile uint32_t *)CONADDR_VA :
+ (volatile uint32_t *)CONADDR;
+
+ int timo = 150000;
+
+ while ((uartaddr[IMX_USR2 / 4] & IMX_USR2_TXDC) == 0) {
+ if (--timo == 0)
+ break;
+ }
+
+ uartaddr[IMX_UTXD / 4] = c;
+
+ timo = 150000;
+ while ((uartaddr[IMX_USR2 / 4] & IMX_USR2_TXDC) == 0) {
+ if (--timo == 0)
+ break;
+ }
+}
+
+void
+imx7_mpstart(void)
+{
+#if defined(MULTIPROCESSOR)
+ if (arm_cpu_max <= 1)
+ return;
+
+ const bus_space_tag_t bst = &armv7_generic_bs_tag;
+
+ const bus_space_handle_t bsh = KERNEL_IO_IOREG_VBASE + AIPS1_SRC_BASE;
+ const paddr_t mpstart = KERN_VTOPHYS((vaddr_t)cpu_mpstart);
+
+ bus_space_write_4(bst, bsh, SRC_GPR3, mpstart);
+
+ uint32_t rcr1 = bus_space_read_4(bst, bsh, SRC_A7RCR1);
+ rcr1 |= SRC_A7RCR1_A7_CORE1_ENABLE;
+ bus_space_write_4(bst, bsh, SRC_A7RCR1, rcr1);
+
+ arm_dsb();
+ __asm __volatile("sev" ::: "memory");
+
+ for (int loop = 0; loop < 16; loop++) {
+ VPRINTF("%u hatched %#x\n", loop, arm_cpu_hatched);
+ if (arm_cpu_hatched == __BITS(arm_cpu_max - 1, 1))
+ break;
+ int timo = 1500000;
+ while (arm_cpu_hatched != __BITS(arm_cpu_max - 1, 1))
+ if (--timo == 0)
+ break;
+ }
+ for (size_t i = 1; i < arm_cpu_max; i++) {
+ if ((arm_cpu_hatched & __BIT(i)) == 0) {
+ printf("%s: warning: cpu%zu failed to hatch\n",
+ __func__, i);
+ }
+ }
+
+ VPRINTF(" (%u cpu%s, hatched %#x)",
+ arm_cpu_max, arm_cpu_max ? "s" : "",
+ arm_cpu_hatched);
+#endif
+}
+
+
/*
* u_int initarm(...)
*
@@ -159,9 +249,17 @@ initarm(void *arg)
{
psize_t memsize;
- kern_vtopdiff = KERN_VTOPDIFF;
+ /*
+ * Heads up ... Setup the CPU / MMU / TLB functions
+ */
+ if (set_cpufuncs()) // starts PMC counter
+ panic("cpu not recognized!");
+
+ cn_tab = &earlycons;
+
+ extern char ARM_BOOTSTRAP_LxPT[];
+ pmap_devmap_bootstrap((vaddr_t)ARM_BOOTSTRAP_LxPT, devmap);
- pmap_devmap_register(devmap);
imx7_bootstrap(KERNEL_IO_IOREG_VBASE);
imx7_setup_iomux();
@@ -169,12 +267,6 @@ initarm(void *arg)
consinit();
- /*
- * Heads up ... Setup the CPU / MMU / TLB functions
- */
- if (set_cpufuncs()) // starts PMC counter
- panic("cpu not recognized!");
-
cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
#ifdef NO_POWERSAVE
@@ -266,7 +358,14 @@ initarm(void *arg)
&bp_highgig, 1);
}
#endif
- return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+ u_int sp = initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+
+ /*
+ * initarm_common flushes cache if required before AP start
+ */
+ imx7_mpstart();
+
+ return sp;
}
#ifdef CONSDEVNAME
Index: src/sys/arch/evbarm/kobo/kobo_machdep.c
diff -u src/sys/arch/evbarm/kobo/kobo_machdep.c:1.5 src/sys/arch/evbarm/kobo/kobo_machdep.c:1.6
--- src/sys/arch/evbarm/kobo/kobo_machdep.c:1.5 Fri Sep 21 12:04:09 2018
+++ src/sys/arch/evbarm/kobo/kobo_machdep.c Sat May 18 08:49:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: kobo_machdep.c,v 1.5 2018/09/21 12:04:09 skrll Exp $ */
+/* $NetBSD: kobo_machdep.c,v 1.6 2019/05/18 08:49:24 skrll Exp $ */
/*
* Copyright (c) 2002, 2003, 2005, 2010 Genetec Corporation.
@@ -102,7 +102,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobo_machdep.c,v 1.5 2018/09/21 12:04:09 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobo_machdep.c,v 1.6 2019/05/18 08:49:24 skrll Exp $");
#include "opt_evbarm_boardtype.h"
#include "opt_arm_debug.h"
@@ -151,6 +151,9 @@ char *boot_args = NULL;
extern char KERNEL_BASE_phys[];
+/* filled in before cleaning bss. keep in .data */
+u_int uboot_args[4] __attribute__((__section__(".data")));
+
/*
* Macros to translate between physical and virtual for a subset of the
* kernel address space. *Not* for general use.
@@ -428,14 +431,11 @@ initarm(void *arg)
if (set_cpufuncs()) // starts PMC counter
panic("cpu not recognized!");
- /* map some peripheral registers */
- pmap_devmap_bootstrap((vaddr_t)armreg_ttbr_read() & -L1_TABLE_SIZE,
- kobo_devmap);
+ extern char ARM_BOOTSTRAP_LxPT[];
+ pmap_devmap_bootstrap((vaddr_t)ARM_BOOTSTRAP_LxPT, kobo_devmap);
cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
- /* Register devmap for devices we mapped in start */
- pmap_devmap_register(kobo_devmap);
setup_ioports();
consinit();
Index: src/sys/arch/evbarm/netwalker/netwalker_start.S
diff -u src/sys/arch/evbarm/netwalker/netwalker_start.S:1.5 src/sys/arch/evbarm/netwalker/netwalker_start.S:1.6
--- src/sys/arch/evbarm/netwalker/netwalker_start.S:1.5 Tue May 6 11:22:53 2014
+++ src/sys/arch/evbarm/netwalker/netwalker_start.S Sat May 18 08:49:24 2019
@@ -1,4 +1,33 @@
-/* $NetBSD: netwalker_start.S,v 1.5 2014/05/06 11:22:53 hkenken Exp $ */
+/* $NetBSD: netwalker_start.S,v 1.6 2019/05/18 08:49:24 skrll Exp $ */
+
+/*-
+ * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
/*-
* Copyright (c) 2009 SHIMIZU Ryo <[email protected]>
@@ -66,7 +95,7 @@
#include <arm/imx/imxuartreg.h>
#include <evbarm/netwalker/netwalker_reg.h>
-RCSID("$NetBSD: netwalker_start.S,v 1.5 2014/05/06 11:22:53 hkenken Exp $")
+RCSID("$NetBSD: netwalker_start.S,v 1.6 2019/05/18 08:49:24 skrll Exp $")
#if defined(VERBOSE_INIT_ARM)
#define DEBUG_STARTUP
@@ -230,7 +259,391 @@ relocated:
.Lrelocate_address:
.word KERNEL_BASE_phys
-#include <arm/cortex/a9_mpsubr.S>
+#include "opt_console.h"
+#include "opt_cpuoptions.h"
+#include "opt_cputypes.h"
+#include "opt_multiprocessor.h"
+
+#include <arm/asm.h>
+#include <arm/armreg.h>
+#include <arm/cortex/scu_reg.h>
+#include "assym.h"
+
+// Macro to call routines in .text
+#if defined(KERNEL_BASES_EQUAL)
+#define CALL(f) bl _C_LABEL(f)
+#else
+#define CALL(f) \
+ movw fp, #:lower16:_C_LABEL(f); \
+ movt fp, #:upper16:_C_LABEL(f); \
+ sub fp, fp, #KERNEL_BASE_VOFFSET; \
+ blx fp
+#endif
+
+
+// We'll modify va and pa at run time so we can use relocatable addresses.
+#define MMU_INIT(va,pa,n_sec,attr) \
+ .word ((va) & 0xffffffff)|(n_sec) ; \
+ .word ((pa) & 0xffffffff)|(attr) ; \
+
+// Set up a preliminary mapping in the MMU to allow us to run at KERNEL_BASE
+// with caches on. If we are MULTIPROCESSOR, save the TTB address.
+//
+arm_boot_l1pt_init:
+
+ mov ip, r1 // save mmu table addr
+ // Build page table from scratch
+ mov r1, r0 // Start address to clear memory.
+ // Zero the entire table so all virtual addresses are invalid.
+ add r2, r1, #L1_TABLE_SIZE // Ending address
+ mov r4, #0
+ mov r5, #0
+ mov r6, #0
+ mov r7, #0
+1: stmia r1!, {r4-r7} // 16 bytes at a time
+ cmp r1, r2
+ blt 1b
+
+ // Now create our entries per the mmu_init_table.
+ l1table .req r0
+ va .req r1
+ pa .req r2
+ n_sec .req r3
+ attr .req r4
+ itable .req r5
+
+ mov attr, #0
+ mrc p15, 0, r3, c0, c0, 5 // MPIDR read
+ cmp r3, #0 // not zero?
+ movne attr, #L1_S_V6_S // yes, shareable attribute
+ mov itable, ip // reclaim table address
+ b 3f
+
+2: str pa, [l1table, va, lsl #2]
+ add va, va, #1
+ add pa, pa, #(L1_S_SIZE)
+ subs n_sec, n_sec, #1
+ bhi 2b
+
+3: ldmia itable!, {va, pa}
+ // Convert va to l1 offset: va = 4 * (va >> L1_S_SHIFT)
+ ubfx n_sec, va, #0, #L1_S_SHIFT
+ lsr va, va, #L1_S_SHIFT
+
+ // Do we need add sharing for this?
+ tst pa, #(L1_S_C|L1_S_B) // is this entry cacheable?
+ orrne pa, pa, attr // add sharing
+
+4: cmp n_sec, #0
+ bne 2b
+ bx lr // return
+
+ .unreq va
+ .unreq pa
+ .unreq n_sec
+ .unreq attr
+ .unreq itable
+ .unreq l1table
+
+//
+// Coprocessor register initialization values
+//
+#undef CPU_CONTROL_SWP_ENABLE // not present on A8
+#define CPU_CONTROL_SWP_ENABLE 0
+#ifdef __ARMEL__
+#define CPU_CONTROL_EX_BEND_SET 0
+#else
+#define CPU_CONTROL_EX_BEND_SET CPU_CONTROL_EX_BEND
+#endif
+#ifdef ARM32_DISABLE_ALIGNMENT_FAULTS
+#define CPU_CONTROL_AFLT_ENABLE_CLR CPU_CONTROL_AFLT_ENABLE
+#define CPU_CONTROL_AFLT_ENABLE_SET 0
+#else
+#define CPU_CONTROL_AFLT_ENABLE_CLR 0
+#define CPU_CONTROL_AFLT_ENABLE_SET CPU_CONTROL_AFLT_ENABLE
+#endif
+
+// bits to set in the Control Register
+//
+#define CPU_CONTROL_SET \
+ (CPU_CONTROL_MMU_ENABLE | \
+ CPU_CONTROL_AFLT_ENABLE_SET | \
+ CPU_CONTROL_DC_ENABLE | \
+ CPU_CONTROL_SWP_ENABLE | \
+ CPU_CONTROL_BPRD_ENABLE | \
+ CPU_CONTROL_IC_ENABLE | \
+ CPU_CONTROL_EX_BEND_SET | \
+ CPU_CONTROL_UNAL_ENABLE)
+
+// bits to clear in the Control Register
+//
+#define CPU_CONTROL_CLR \
+ (CPU_CONTROL_AFLT_ENABLE_CLR | \
+ CPU_CONTROL_TR_ENABLE)
+
+arm_cpuinit:
+ // Because the MMU may already be on do a typical sequence to set
+ // the Translation Table Base(s).
+ mov ip, lr
+ mov r10, r0 // save TTBR
+ mov r1, #0
+
+ mcr p15, 0, r1, c7, c5, 0 // invalidate I cache
+
+ mrc p15, 0, r2, c1, c0, 0 // SCTLR read
+ movw r1, #(CPU_CONTROL_DC_ENABLE|CPU_CONTROL_IC_ENABLE)
+ bic r2, r2, r1 // clear I+D cache enable
+
+#ifdef __ARMEB__
+ // SCTLR.EE determines the endianness of translation table lookups.
+ // So we need to make sure it's set before starting to use the new
+ // translation tables (which are big endian).
+ //
+ orr r2, r2, #CPU_CONTROL_EX_BEND
+ bic r2, r2, #CPU_CONTROL_MMU_ENABLE
+ pli [pc, #32] // preload the next few cachelines
+ pli [pc, #64]
+ pli [pc, #96]
+ pli [pc, #128]
+#endif
+
+ mcr p15, 0, r2, c1, c0, 0 // SCTLR write
+
+ XPUTC(#'F')
+ dsb // Drain the write buffers.
+
+ XPUTC(#'G')
+ mrc p15, 0, r1, c0, c0, 5 // MPIDR read
+ cmp r1, #0
+ orrlt r10, r10, #TTBR_MPATTR // MP, cachable (Normal WB)
+ orrge r10, r10, #TTBR_UPATTR // Non-MP, cacheable, normal WB
+ XPUTC(#'0')
+ mcr p15, 0, r10, c2, c0, 0 // TTBR0 write
+#if defined(ARM_MMU_EXTENDED)
+ // When using split TTBRs, we need to set both since the physical
+ // addresses we were/are using might be in either.
+ XPUTC(#'1')
+ mcr p15, 0, r10, c2, c0, 1 // TTBR1 write
+#endif
+
+ XPUTC(#'H')
+#if defined(ARM_MMU_EXTENDED)
+ XPUTC(#'1')
+ mov r1, #TTBCR_S_N_1 // make sure TTBCR_S_N is 1
+#else
+ XPUTC(#'0')
+ mov r1, #0 // make sure TTBCR is 0
+#endif
+ mcr p15, 0, r1, c2, c0, 2 // TTBCR write
+
+ isb
+
+ XPUTC(#'I')
+ mov r1, #0
+ mcr p15, 0, r1, c8, c7, 0 // TLBIALL (just this core)
+ dsb
+ isb
+
+ XPUTC(#'J')
+ mov r1, #0 // get KERNEL_PID
+ mcr p15, 0, r1, c13, c0, 1 // CONTEXTIDR write
+
+ // Set the Domain Access register. Very important!
+ XPUTC(#'K')
+ mov r1, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
+ mcr p15, 0, r1, c3, c0, 0 // DACR write
+
+ //
+ // Enable the MMU, etc.
+ //
+ XPUTC(#'L')
+ mrc p15, 0, r1, c1, c0, 0 // SCTLR read
+
+ movw r3, #:lower16:CPU_CONTROL_SET
+#if (CPU_CONTROL_SET & 0xffff0000)
+ movt r3, #:upper16:CPU_CONTROL_SET
+#endif
+ orr r0, r1, r3
+ bic r0, r0, #CPU_CONTROL_CLR
+ //cmp r0, r1 // any changes to SCTLR?
+ //bxeq ip // no, then return.
+
+ pli 1f
+ dsb
+
+ // turn mmu on!
+ //
+ mov r0, r0 // fetch instruction cacheline
+1: mcr p15, 0, r0, c1, c0, 0 // SCTLR write
+
+ // Ensure that the coprocessor has finished turning on the MMU.
+ //
+ mrc p15, 0, r0, c0, c0, 0 // Read an arbitrary value.
+ mov r0, r0 // Stall until read completes.
+ XPUTC(#'M')
+
+ bx ip // return
+
+ .p2align 2
+
+#if defined(VERBOSE_INIT_ARM) && defined(XPUTC_COM)
+#define TIMO 0x25000
+#ifndef COM_MULT
+#define COM_MULT 1
+#endif
+xputc:
+ mov r2, #TIMO
+#ifdef CONADDR
+ movw r3, #:lower16:CONADDR
+ movt r3, #:upper16:CONADDR
+#elif defined(CONSADDR)
+ movw r3, #:lower16:CONSADDR
+ movt r3, #:upper16:CONSADDR
+#endif
+1:
+#if COM_MULT == 1
+ ldrb r1, [r3, #(COM_LSR*COM_MULT)]
+#else
+#if COM_MULT == 2
+ ldrh r1, [r3, #(COM_LSR*COM_MULT)]
+#elif COM_MULT == 4
+ ldr r1, [r3, #(COM_LSR*COM_MULT)]
+#endif
+#ifdef COM_BSWAP
+ lsr r1, r1, #(COM_MULT-1)*8
+#endif
+#endif
+ tst r1, #LSR_TXRDY
+ bne 2f
+ subs r2, r2, #1
+ bne 1b
+2:
+#if COM_MULT == 1
+ strb r0, [r3, #COM_DATA]
+#else
+#ifdef COM_BSWAP
+ lsl r0, r0, #(COM_MULT-1)*8
+#endif
+#if COM_MULT == 2
+ strh r0, [r3, #COM_DATA]
+#else
+ str r0, [r3, #COM_DATA]
+#endif
+#endif
+
+ mov r2, #TIMO
+3:
+#if COM_MULT == 1
+ ldrb r1, [r3, #(COM_LSR*COM_MULT)]
+#else
+#if COM_MULT == 2
+ ldrh r1, [r3, #(COM_LSR*COM_MULT)]
+#elif COM_MULT == 4
+ ldr r1, [r3, #(COM_LSR*COM_MULT)]
+#endif
+#ifdef COM_BSWAP
+ lsr r1, r1, #(COM_MULT-1)*8
+#endif
+#endif
+ tst r1, #LSR_TSRE
+ bne 4f
+ subs r2, r2, #1
+ bne 3b
+4:
+ bx lr
+#endif /* VERBOSE_INIT_ARM */
+
+//
+// Perform the initialization of the Cortex core required by NetBSD.
+//
+//
+cortex_init:
+ mov r10, lr // save lr
+ mov r9, sp // save sp
+
+
+1:
+ cpsid if, #PSR_SVC32_MODE // SVC32 with no interrupts
+
+2:
+ mov r0, #0
+ msr spsr_sxc, r0 // set SPSR[23:8] to known value
+
+ mov sp, r9 // restore sp
+
+#if 0
+ mrc p14, 0, r0, c0, c0, 0 // MIDR read
+ ufbx r0, r0, #4, #4 // extract cortex part.
+ mov r5, #1
+ lsl r5, r5, r0
+#endif
+
+ XPUTC(#'@')
+
+ mrc p15, 0, r4, c1, c0, 0 // SCTLR read
+
+ mov r0, #0
+ mcr p15, 0, r0, c7, c5, 0 // toss i-cache
+
+
+ //
+ // Step 1b, invalidate the data cache
+ //
+ XPUTC(#'B')
+ CALL(armv7_dcache_wbinv_all)
+ XPUTC(#'C')
+
+ //
+ // Check to see if we are really MP before enabling SMP mode
+ //
+ mrc p15, 0, r1, c0, c0, 5 // MPIDR get
+ ubfx r1, r1, #30, #2 // get MP bits
+ cmp r1, #2 // is it MP?
+ bxne r10 // no, return
+
+ //
+ // Step 2, disable the data cache
+ //
+ mrc p15, 0, r2, c1, c0, 0 // SCTLR read
+ bic r2, r2, #CPU_CONTROL_DC_ENABLE // clear data cache enable
+ mcr p15, 0, r2, c1, c0, 0 // SCTLR write
+ isb
+ XPUTC(#'1')
+
+ //
+ // Step 4b, restore SCTLR (enable the data cache)
+ //
+ orr r4, r4, #CPU_CONTROL_IC_ENABLE // enable icache
+ orr r4, r4, #CPU_CONTROL_DC_ENABLE // enable dcache
+ mcr p15, 0, r4, c1, c0, 0 // SCTLR write
+ isb
+ XPUTC(#'-')
+
+ bx r10
+ASEND(cortex_init)
+
+
+ .global cortex_mpstart
+ .type cortex_mpstart,%object
+
+#ifdef VERBOSE_INIT_ARM
+ .pushsection .bss
+ /* temporary stack for secondary CPUs (for XPUTC) */
+#define BOOT_STACKSIZE 256
+ .align 3
+ .space BOOT_STACKSIZE * (MAXCPUS - 1)
+bootstk_cpus:
+ .popsection
+#endif
+
+cortex_mpstart:
+ //
+ // If not MULTIPROCESSOR, drop CPU into power saving state.
+ //
+3: wfi
+ b 3b
+ASEND(cortex_mpstart)
+
.Lmmu_init_table:
/* fill all table VA==PA */