Module Name:    src
Committed By:   kiyohara
Date:           Fri May 23 13:56:18 UTC 2014

Modified Files:
        src/sys/arch/evbarm/conf: OVERO files.gumstix files.overo
        src/sys/arch/evbarm/gumstix: gumstix_machdep.c gumstix_start.S

Log Message:
Call arm32_*_init() and initarm_common().
OVERO work fine.  GUMSTIX build only now.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/evbarm/conf/OVERO
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/evbarm/conf/files.gumstix
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbarm/conf/files.overo
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/evbarm/gumstix/gumstix_machdep.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/evbarm/gumstix/gumstix_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/evbarm/conf/OVERO
diff -u src/sys/arch/evbarm/conf/OVERO:1.34 src/sys/arch/evbarm/conf/OVERO:1.35
--- src/sys/arch/evbarm/conf/OVERO:1.34	Sat Apr  5 23:45:11 2014
+++ src/sys/arch/evbarm/conf/OVERO	Fri May 23 13:56:18 2014
@@ -1,5 +1,5 @@
 #
-#	$NetBSD: OVERO,v 1.34 2014/04/05 23:45:11 khorben Exp $
+#	$NetBSD: OVERO,v 1.35 2014/05/23 13:56:18 kiyohara Exp $
 #
 #	OVERO -- Gumstix. Inc. Overo COMS platforms kernel
 #
@@ -16,7 +16,10 @@ maxusers	32
 
 options 	CPU_CORTEXA8
 options 	OMAP_3530
+options 	FPU_VFP
 options 	PMAPCOUNTERS
+options 	ARM_HAS_VBAR
+options 	__HAVE_MM_MD_DIRECT_MAPPED_PHYS
 makeoptions	CPUFLAGS="-mcpu=cortex-a8 -mfpu=neon"
 
 # Architecture options

Index: src/sys/arch/evbarm/conf/files.gumstix
diff -u src/sys/arch/evbarm/conf/files.gumstix:1.17 src/sys/arch/evbarm/conf/files.gumstix:1.18
--- src/sys/arch/evbarm/conf/files.gumstix:1.17	Thu Sep 23 07:08:57 2010
+++ src/sys/arch/evbarm/conf/files.gumstix	Fri May 23 13:56:18 2014
@@ -1,8 +1,12 @@
-#	$NetBSD: files.gumstix,v 1.17 2010/09/23 07:08:57 kiyohara Exp $
+#	$NetBSD: files.gumstix,v 1.18 2014/05/23 13:56:18 kiyohara Exp $
 #
 # Gumstix. Inc. Gumstix boards configuration info
 #
 
+file	arch/arm/arm32/arm32_boot.c
+file	arch/arm/arm32/arm32_kvminit.c
+file	arch/arm/arm32/arm32_reboot.c
+
 file	arch/evbarm/gumstix/gumstix_machdep.c
 defflag opt_gumstix.h				GUMSTIX
 						GUMSTIX_NETBSD_ARGS_BUSHEADER

Index: src/sys/arch/evbarm/conf/files.overo
diff -u src/sys/arch/evbarm/conf/files.overo:1.4 src/sys/arch/evbarm/conf/files.overo:1.5
--- src/sys/arch/evbarm/conf/files.overo:1.4	Sun Mar  6 02:22:27 2011
+++ src/sys/arch/evbarm/conf/files.overo	Fri May 23 13:56:18 2014
@@ -1,8 +1,12 @@
-#	$NetBSD: files.overo,v 1.4 2011/03/06 02:22:27 jakllsch Exp $
+#	$NetBSD: files.overo,v 1.5 2014/05/23 13:56:18 kiyohara Exp $
 #
 # Gumstix. Inc. Overo boards configuration info
 #
 
+file	arch/arm/arm32/arm32_boot.c
+file	arch/arm/arm32/arm32_kvminit.c
+file	arch/arm/arm32/arm32_reboot.c
+
 file	arch/evbarm/gumstix/gumstix_machdep.c
 defflag opt_gumstix.h				OVERO
 						GUMSTIX_NETBSD_ARGS_EXPANSION

Index: src/sys/arch/evbarm/gumstix/gumstix_machdep.c
diff -u src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.48 src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.49
--- src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.48	Thu Sep 26 16:14:34 2013
+++ src/sys/arch/evbarm/gumstix/gumstix_machdep.c	Fri May 23 13:56:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: gumstix_machdep.c,v 1.48 2013/09/26 16:14:34 kiyohara Exp $ */
+/*	$NetBSD: gumstix_machdep.c,v 1.49 2014/05/23 13:56:18 kiyohara Exp $ */
 /*
  * Copyright (C) 2005, 2006, 2007  WIDE Project and SOUM Corporation.
  * All rights reserved.
@@ -144,11 +144,8 @@
 #include "opt_omap.h"
 #include "prcm.h"
 #endif
-#include "opt_ddb.h"
 #include "opt_kgdb.h"
 #include "opt_pmap_debug.h"
-#include "opt_md.h"
-#include "opt_modular.h"
 #include "opt_com.h"
 
 #include <sys/param.h>
@@ -156,8 +153,6 @@
 #include <sys/device.h>
 #include <sys/exec.h>
 #include <sys/kernel.h>
-#include <sys/ksyms.h>
-#include <sys/msgbuf.h>
 #include <sys/proc.h>
 #include <sys/reboot.h>
 #include <sys/systm.h>
@@ -165,11 +160,11 @@
 #include <sys/bus.h>
 #include <sys/cpu.h>
 
+#include <uvm/uvm_extern.h>
+
 #include <machine/autoconf.h>
 #include <machine/bootconfig.h>
-#include <machine/db_machdep.h>
 #include <arm/locore.h>
-#include <arm/undefined.h>
 
 #include <arm/arm32/machdep.h>
 #ifdef OVERO
@@ -185,28 +180,20 @@
 #include <evbarm/gumstix/gumstixreg.h>
 #include <evbarm/gumstix/gumstixvar.h>
 
-#include <uvm/uvm_extern.h>
-
 #include <dev/cons.h>
-#include <dev/md.h>
 
-#include <ddb/db_sym.h>
-#include <ddb/db_extern.h>
 #ifdef KGDB
 #include <sys/kgdb.h>
 #endif
 
-/* Kernel text starts 2MB in from the bottom of the kernel address space. */
-#define	KERNEL_TEXT_BASE	(KERNEL_BASE + 0x00200000)
-#ifndef KERNEL_VM_BASE
-#define	KERNEL_VM_BASE		(KERNEL_BASE + 0x01000000)
-#endif
-
 /*
- * The range 0xc1000000 - 0xccffffff is available for kernel VM space
+ * The range 0xc1000000 - 0xcfffffff is available for kernel VM space
  * Core-logic registers and I/O mappings occupy 0xfd000000 - 0xffffffff
  */
-#define KERNEL_VM_SIZE		0x0C000000
+#ifndef KERNEL_VM_BASE
+#define	KERNEL_VM_BASE		0xc1000000
+#endif
+#define KERNEL_VM_SIZE		0x0f000000
 
 BootConfig bootconfig;		/* Boot config storage */
 static char bootargs[MAX_BOOT_STRING];
@@ -216,39 +203,11 @@ char *boot_args = NULL;
 uint32_t system_serial_high;
 uint32_t system_serial_low;
 
-vm_offset_t physical_start;
-vm_offset_t physical_freestart;
-vm_offset_t physical_freeend;
-vm_offset_t physical_end;
-u_int free_pages;
-
-/*int debug_flags;*/
-#ifndef PMAP_STATIC_L1S
-int max_processes = 64;			/* Default number */
-#endif	/* !PMAP_STATIC_L1S */
-
-pv_addr_t minidataclean;
-
-vm_offset_t msgbufphys;
-
-#ifdef PMAP_DEBUG
-extern int pmap_debug_level;
-#endif
-
-#define KERNEL_PT_SYS		0	/* Page table for mapping proc0 zero page */
-#define KERNEL_PT_KERNEL	1	/* Page table for mapping kernel */
-#define	KERNEL_PT_KERNEL_NUM	((KERNEL_VM_BASE - KERNEL_BASE) >> 22)
-#define KERNEL_PT_VMDATA	(KERNEL_PT_KERNEL+KERNEL_PT_KERNEL_NUM)
-				        /* Page tables for mapping kernel VM */
-#define	KERNEL_PT_VMDATA_NUM	4	/* start with 16MB of KVM */
-#define NUM_KERNEL_PTS		(KERNEL_PT_VMDATA + KERNEL_PT_VMDATA_NUM)
-
-pv_addr_t kernel_pt_table[NUM_KERNEL_PTS];
-
 /* Prototypes */
 #if defined(GUMSTIX)
 static void	read_system_serial(void);
 #elif defined(OVERO)
+static void	overo_reset(void);
 static void	find_cpu_clock(void);
 #endif
 static void	process_kernel_args(int, char *[]);
@@ -287,77 +246,6 @@ static char console[16];
 extern void gxio_config_pin(void);
 extern void gxio_config_expansion(char *);
 
-/*
- * void cpu_reboot(int howto, char *bootstr)
- *
- * Deal with any syncing, unmounting, dumping and shutdown hooks,
- * then reset the CPU.
- */
-void
-cpu_reboot(int howto, char *bootstr)
-{
-
-#ifdef DIAGNOSTIC
-	/* info */
-	printf("boot: howto=%08x curproc=%p\n", howto, curproc);
-#endif
-
-	/*
-	 * If we are still cold then hit the air brakes
-	 * and crash to earth fast
-	 */
-	if (cold) {
-		doshutdownhooks();
-		pmf_system_shutdown(boothowto);
-		printf("The operating system has halted.\n");
-		printf("Please press any key to reboot.\n\n");
-		cngetc();
-		printf("rebooting...\n");
-#if defined(OMAP_3530) && NPRCM > 0
-		prcm_cold_reset();
-#endif
-		cpu_reset();
-		/*NOTREACHED*/
-	}
-
-	/*
-	 * If RB_NOSYNC was not specified sync the discs.
-	 * Note: Unless cold is set to 1 here, syslogd will die during the
-	 * unmount.  It looks like syslogd is getting woken up only to find
-	 * that it cannot page part of the binary in as the filesystem has
-	 * been unmounted.
-	 */
-	if (!(howto & RB_NOSYNC))
-		bootsync();
-
-	/* Say NO to interrupts */
-	splhigh();
-
-	/* Do a dump if requested. */
-	if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP)
-		dumpsys();
-
-	/* Run any shutdown hooks */
-	doshutdownhooks();
-
-	pmf_system_shutdown(boothowto);
-
-	/* Make sure IRQ's are disabled */
-	IRQdisable;
-
-	if (howto & RB_HALT) {
-		printf("The operating system has halted.\n");
-		printf("Please press any key to reboot.\n\n");
-		cngetc();
-	}
-
-	printf("rebooting...\n");
-#if defined(OMAP_3530) && NPRCM > 0
-	prcm_cold_reset();
-#endif
-	cpu_reset();
-	/*NOTREACHED*/
-}
 
 static inline pd_entry_t *
 read_ttb(void)
@@ -484,20 +372,10 @@ static const struct pmap_devmap gumstix_
 u_int
 initarm(void *arg)
 {
-#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
-#ifdef DIAGNOSTIC
-	extern vsize_t xscale_minidata_clean_size; /* used in KASSERT */
-#endif
-	extern vaddr_t xscale_cache_clean_addr;
-#endif
+	extern char KERNEL_BASE_phys[];
 	extern uint32_t *u_boot_args[];
 	extern uint32_t ram_size;
 	enum { r0 = 0, r1 = 1, r2 = 2, r3 = 3 }; /* args from u-boot */
-	int loop;
-	int loop1;
-	u_int l1pagetable;
-	paddr_t memstart;
-	psize_t memsize;
 
 	/*
 	 * We mapped PA == VA in gumstix_start.S.
@@ -514,11 +392,15 @@ initarm(void *arg)
 	 * Overo:
 	 * Physical Address Range     Description
 	 * -----------------------    ----------------------------------
-	 * 0x80000000 - 0x8fffffff    SDRAM Bank 0 (256MB, 512MB or 1024MB)
+	 * 0x80000000 - 0x8fffffff    SDRAM Bank 0 (256MB or 512MB)
 	 * 0x80000000 - 0x83ffffff    KERNEL_BASE
 	 */
 
-#if defined(OVERO)
+#if defined(GUMSTIX)
+	cpu_reset_address = NULL;
+#elif defined(OVERO)
+	cpu_reset_address = overo_reset;
+
 	find_cpu_clock();	// find our CPU speed.
 #endif
 
@@ -592,9 +474,6 @@ initarm(void *arg)
 	read_system_serial();
 #endif
 
-	memstart = SDRAM_START;
-	memsize = ram_size;
-
 #ifdef VERBOSE_INIT_ARM
 	printf("initarm: Configuring system ...\n");
 #endif
@@ -602,392 +481,24 @@ initarm(void *arg)
 	/* Fake bootconfig structure for the benefit of pmap.c */
 	/* XXX must make the memory description h/w independent */
 	bootconfig.dramblocks = 1;
-	bootconfig.dram[0].address = memstart;
-	bootconfig.dram[0].pages = memsize / PAGE_SIZE;
-
-	/*
-	 * Set up the variables that define the availablilty of
-	 * physical memory.  For now, we're going to set
-	 * physical_freestart to 0xa0200000 (where the kernel
-	 * was loaded), and allocate the memory we need downwards.
-	 * If we get too close to the L1 table that we set up, we
-	 * will panic.  We will update physical_freestart and
-	 * physical_freeend later to reflect what pmap_bootstrap()
-	 * wants to see.
-	 *
-	 * XXX pmap_bootstrap() needs an enema.
-	 */
-	physical_start = bootconfig.dram[0].address;
-	physical_end = physical_start + memsize;
-
-#if defined(GUMSTIX)
-	physical_freestart = 0xa0009000UL;
-	physical_freeend = 0xa0200000UL;
-#elif defined(OVERO)
-	physical_freestart = 0x80009000UL;
-	physical_freeend = 0x80200000UL;
-#endif
-
-	physmem = (physical_end - physical_start) / PAGE_SIZE;
-
-#ifdef VERBOSE_INIT_ARM
-	/* Tell the user about the memory */
-	printf("physmemory: %d pages at 0x%08lx -> 0x%08lx\n", physmem,
-	    physical_start, physical_end - 1);
-#endif
-
-	/*
-	 * Okay, the kernel starts 2MB in from the bottom of physical
-	 * memory.  We are going to allocate our bootstrap pages downwards
-	 * from there.
-	 *
-	 * We need to allocate some fixed page tables to get the kernel
-	 * going.  We allocate one page directory and a number of page
-	 * tables and store the physical addresses in the kernel_pt_table
-	 * array.
-	 *
-	 * The kernel page directory must be on a 16K boundary.  The page
-	 * tables must be on 4K bounaries.  What we do is allocate the
-	 * page directory on the first 16K boundary that we encounter, and
-	 * the page tables on 4K boundaries otherwise.  Since we allocate
-	 * at least 3 L2 page tables, we are guaranteed to encounter at
-	 * least one 16K aligned region.
-	 */
-
-#ifdef VERBOSE_INIT_ARM
-	printf("Allocating page tables\n");
-#endif
-
-	free_pages = (physical_freeend - physical_freestart) / PAGE_SIZE;
-
-#ifdef VERBOSE_INIT_ARM
-	printf("freestart = 0x%08lx, free_pages = %d (0x%08x)\n",
-	    physical_freestart, free_pages, free_pages);
-#endif
-
-	/* Define a macro to simplify memory allocation */
-#define	valloc_pages(var, np)				\
-	alloc_pages((var).pv_pa, (np));			\
-	(var).pv_va = KERNEL_BASE + (var).pv_pa - physical_start;
-
-#define alloc_pages(var, np)				\
-	physical_freeend -= ((np) * PAGE_SIZE);		\
-	if (physical_freeend < physical_freestart)	\
-		panic("initarm: out of memory");	\
-	(var) = physical_freeend;			\
-	free_pages -= (np);				\
-	memset((char *)(var), 0, ((np) * PAGE_SIZE));
-
-	loop1 = 0;
-	for (loop = 0; loop <= NUM_KERNEL_PTS; ++loop) {
-		/* Are we 16KB aligned for an L1 ? */
-		if ((physical_freeend & (L1_TABLE_SIZE - 1)) == 0 &&
-		    kernel_l1pt.pv_pa == 0) {
-			valloc_pages(kernel_l1pt, L1_TABLE_SIZE / PAGE_SIZE);
-		} else {
-			valloc_pages(kernel_pt_table[loop1],
-			    L2_TABLE_SIZE / PAGE_SIZE);
-			++loop1;
-		}
-	}
-
-	/* This should never be able to happen but better confirm that. */
-	if (!kernel_l1pt.pv_pa || (kernel_l1pt.pv_pa & (L1_TABLE_SIZE-1)) != 0)
-		panic("initarm: Failed to align the kernel page directory");
-
-	/*
-	 * Allocate a page for the system page mapped to V0x00000000
-	 * This page will just contain the system vectors and can be
-	 * shared by all processes.
-	 */
-	alloc_pages(systempage.pv_pa, 1);
-#if defined(CPU_CORTEXA8)
-	systempage.pv_va = ARM_VECTORS_HIGH;
-#endif
-
-	/* Allocate stacks for all modes */
-	valloc_pages(irqstack, IRQ_STACK_SIZE);
-	valloc_pages(abtstack, ABT_STACK_SIZE);
-	valloc_pages(undstack, UND_STACK_SIZE);
-	valloc_pages(kernelstack, UPAGES);
-
-	/* Allocate enough pages for cleaning the Mini-Data cache. */
-#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
-	KASSERT(xscale_minidata_clean_size <= PAGE_SIZE);
-#endif
-	valloc_pages(minidataclean, 1);
-
-#ifdef VERBOSE_INIT_ARM
-	printf("IRQ stack: p0x%08lx v0x%08lx\n", irqstack.pv_pa,
-	    irqstack.pv_va);
-	printf("ABT stack: p0x%08lx v0x%08lx\n", abtstack.pv_pa,
-	    abtstack.pv_va);
-	printf("UND stack: p0x%08lx v0x%08lx\n", undstack.pv_pa,
-	    undstack.pv_va);
-	printf("SVC stack: p0x%08lx v0x%08lx\n", kernelstack.pv_pa,
-	    kernelstack.pv_va);
-#endif
-
-	/*
-	 * XXX Defer this to later so that we can reclaim the memory
-	 * XXX used by the RedBoot page tables.
-	 */
-	alloc_pages(msgbufphys, round_page(MSGBUFSIZE) / PAGE_SIZE);
-
-	/*
-	 * Ok we have allocated physical pages for the primary kernel
-	 * page tables
-	 */
-
-#ifdef VERBOSE_INIT_ARM
-	printf("Creating L1 page table at 0x%08lx\n", kernel_l1pt.pv_pa);
-#endif
-
-	/*
-	 * Now we start construction of the L1 page table
-	 * We start by mapping the L2 page tables into the L1.
-	 * This means that we can replace L1 mappings later on if necessary
-	 */
-	l1pagetable = kernel_l1pt.pv_va;
-
-	/* Map the L2 pages tables in the L1 page table */
-#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
-	pmap_link_l2pt(l1pagetable, 0x00000000,
-	    &kernel_pt_table[KERNEL_PT_SYS]);
-#elif defined(CPU_CORTEXA8)
-	pmap_link_l2pt(l1pagetable, ARM_VECTORS_HIGH & ~(0x00400000 - 1),
-	    &kernel_pt_table[KERNEL_PT_SYS]);
-#endif
-	for (loop = 0; loop < KERNEL_PT_KERNEL_NUM; loop++)
-		pmap_link_l2pt(l1pagetable, KERNEL_BASE + loop * 0x00400000,
-		    &kernel_pt_table[KERNEL_PT_KERNEL + loop]);
-	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
-		pmap_link_l2pt(l1pagetable, KERNEL_VM_BASE + loop * 0x00400000,
-		    &kernel_pt_table[KERNEL_PT_VMDATA + loop]);
-
-	/* update the top of the kernel VM */
-	pmap_curmaxkvaddr =
-	    KERNEL_VM_BASE + (KERNEL_PT_VMDATA_NUM * 0x00400000);
-
-#ifdef VERBOSE_INIT_ARM
-	printf("Mapping kernel\n");
-#endif
-
-	/* Now we fill in the L2 pagetable for the kernel static code/data */
-	{
-		extern char etext[], _end[];
-		size_t textsize = (uintptr_t) etext - KERNEL_TEXT_BASE;
-		size_t totalsize = (uintptr_t) _end - KERNEL_TEXT_BASE;
-		u_int logical;
-
-		textsize = (textsize + PGOFSET) & ~PGOFSET;
-		totalsize = (totalsize + PGOFSET) & ~PGOFSET;
-
-		logical = 0x00200000;	/* offset of kernel in RAM */
-
-		logical += pmap_map_chunk(l1pagetable, KERNEL_BASE + logical,
-		    physical_start + logical, textsize,
-		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-		logical += pmap_map_chunk(l1pagetable, KERNEL_BASE + logical,
-		    physical_start + logical, totalsize - textsize,
-		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-	}
-
-#ifdef VERBOSE_INIT_ARM
-	printf("Constructing L2 page tables\n");
-#endif
-
-	/* Map the stack pages */
-	pmap_map_chunk(l1pagetable, irqstack.pv_va, irqstack.pv_pa,
-	    IRQ_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-	pmap_map_chunk(l1pagetable, abtstack.pv_va, abtstack.pv_pa,
-	    ABT_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-	pmap_map_chunk(l1pagetable, undstack.pv_va, undstack.pv_pa,
-	    UND_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-	pmap_map_chunk(l1pagetable, kernelstack.pv_va, kernelstack.pv_pa,
-	    UPAGES * PAGE_SIZE, VM_PROT_READ | VM_PROT_WRITE, PTE_CACHE);
-
-	pmap_map_chunk(l1pagetable, kernel_l1pt.pv_va, kernel_l1pt.pv_pa,
-	    L1_TABLE_SIZE, VM_PROT_READ | VM_PROT_WRITE, PTE_PAGETABLE);
-
-	for (loop = 0; loop < NUM_KERNEL_PTS; ++loop) {
-		pmap_map_chunk(l1pagetable, kernel_pt_table[loop].pv_va,
-		    kernel_pt_table[loop].pv_pa, L2_TABLE_SIZE,
-		    VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
-	}
-
-	/* Map the Mini-Data cache clean area. */
-#if defined(GUMSTIX)
-	xscale_setup_minidata(l1pagetable, minidataclean.pv_va,
-	    minidataclean.pv_pa);
-#endif
-
-	/* Map the vector page. */
-#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
-#if 1
-	/* MULTI-ICE requires that page 0 is NC/NB so that it can download the
-	 * cache-clean code there.  */
-	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
-#else
-	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-#endif
-#elif defined(CPU_CORTEXA8)
-	pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH, systempage.pv_pa,
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-#endif
-
-	/*
-	 * map integrated peripherals at same address in l1pagetable
-	 * so that we can continue to use console.
-	 */
-	pmap_devmap_bootstrap(l1pagetable, gumstix_devmap);
-
-#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
-	/*
-	 * Give the XScale global cache clean code an appropriately
-	 * sized chunk of unmapped VA space starting at 0xff000000
-	 * (our device mappings end before this address).
-	 */
-	xscale_cache_clean_addr = 0xff000000U;
-#endif
-
-	/*
-	 * Now we have the real page tables in place so we can switch to them.
-	 * Once this is done we will be running with the REAL kernel page
-	 * tables.
-	 */
-
-	/*
-	 * Update the physical_freestart/physical_freeend/free_pages
-	 * variables.
-	 */
-	{
-		extern char _end[];
-
-		physical_freestart = physical_start +
-		    (((((uintptr_t) _end) + PGOFSET) & ~PGOFSET) -
-		     KERNEL_BASE);
-		physical_freeend = physical_end;
-		free_pages =
-		    (physical_freeend - physical_freestart) / PAGE_SIZE;
-	}
+	bootconfig.dram[0].address = SDRAM_START;
+	bootconfig.dram[0].pages = ram_size / PAGE_SIZE;
 
-	/* Switch tables */
-#ifdef VERBOSE_INIT_ARM
-	printf("freestart = 0x%08lx, free_pages = %d (0x%x)\n",
-	    physical_freestart, free_pages, free_pages);
-	printf("switching to new L1 page table  @%#lx...", kernel_l1pt.pv_pa);
-#endif
-
-	cpu_setttb(kernel_l1pt.pv_pa, true);
-	cpu_tlb_flushID();
-	cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2));
-
-	/*
-	 * Moved from cpu_startup() as data_abort_handler() references
-	 * this during uvm init
-	 */
-	uvm_lwp_setuarea(&lwp0, kernelstack.pv_va);
-
-#ifdef VERBOSE_INIT_ARM
-	printf("bootstrap done.\n");
-#endif
+	KASSERT(ram_size <= KERNEL_VM_BASE - KERNEL_BASE);
 
+	arm32_bootmem_init(bootconfig.dram[0].address, ram_size,
+	    (uintptr_t) KERNEL_BASE_phys);
+	arm32_kernel_vm_init(KERNEL_VM_BASE,
 #if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
-	arm32_vector_init(ARM_VECTORS_LOW, ARM_VEC_ALL);
+	    ARM_VECTORS_LOW,
 #elif defined(CPU_CORTEXA8)
-	arm32_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
+	    ARM_VECTORS_HIGH,
 #endif
+	    0, gumstix_devmap, true);
 
-	/*
-	 * Pages were allocated during the secondary bootstrap for the
-	 * stacks for different CPU modes.
-	 * We must now set the r13 registers in the different CPU modes to
-	 * point to these stacks.
-	 * Since the ARM stacks use STMFD etc. we must set r13 to the top end
-	 * of the stack memory.
-	 */
-#ifdef	VERBOSE_INIT_ARM
-	printf("init subsystems: stacks ");
-#endif
-
-	set_stackptr(PSR_IRQ32_MODE,
-	    irqstack.pv_va + IRQ_STACK_SIZE * PAGE_SIZE);
-	set_stackptr(PSR_ABT32_MODE,
-	    abtstack.pv_va + ABT_STACK_SIZE * PAGE_SIZE);
-	set_stackptr(PSR_UND32_MODE,
-	    undstack.pv_va + UND_STACK_SIZE * PAGE_SIZE);
-
-	/*
-	 * Well we should set a data abort handler.
-	 * Once things get going this will change as we will need a proper
-	 * handler.
-	 * Until then we will use a handler that just panics but tells us
-	 * why.
-	 * Initialisation of the vectors will just panic on a data abort.
-	 * This just fills in a slighly better one.
-	 */
-#ifdef	VERBOSE_INIT_ARM
-	printf("vectors ");
-#endif
-	data_abort_handler_address = (u_int)data_abort_handler;
-	prefetch_abort_handler_address = (u_int)prefetch_abort_handler;
-	undefined_handler_address = (u_int)undefinedinstruction_bounce;
-
-	/* Initialise the undefined instruction handlers */
-#ifdef	VERBOSE_INIT_ARM
-	printf("undefined ");
-#endif
-	undefined_init();
-
-	/* Load memory into UVM. */
-#ifdef	VERBOSE_INIT_ARM
-	printf("page ");
-#endif
-	uvm_setpagesize();	/* initialize PAGE_SIZE-dependent variables */
-	uvm_page_physload(atop(physical_freestart), atop(physical_freeend),
-	    atop(physical_freestart), atop(physical_freeend),
-	    VM_FREELIST_DEFAULT);
-
-	/* Boot strap pmap telling it where the kernel page table is */
-#ifdef	VERBOSE_INIT_ARM
-	printf("pmap ");
-#endif
-	pmap_bootstrap(KERNEL_VM_BASE, KERNEL_VM_BASE + KERNEL_VM_SIZE);
-
-#ifdef __HAVE_MEMORY_DISK__
-	md_root_setconf(memory_disk, sizeof memory_disk);
-#endif
-
-#ifdef BOOTHOWTO
-	boothowto |= BOOTHOWTO;
-#endif
-
-#ifdef KGDB
-	if (boothowto & RB_KDB) {
-		kgdb_debug_init = 1;
-		kgdb_connect(1);
-	}
-#endif
-
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-	/* Firmware doesn't load symbols. */
-	ddb_init(0, NULL, NULL);
-#endif
-
-#ifdef DDB
-	db_machine_init();
-	if (boothowto & RB_KDB)
-		Debugger();
-#endif
-
-	/* We have our own device_register() */
 	evbarm_device_register = gumstix_device_register;
 
-	/* We return the new stack pointer address */
-	return(kernelstack.pv_va + USPACE_SVC_STACK_TOP);
+	return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
 }
 
 #if defined(GUMSTIX)
@@ -1034,7 +545,18 @@ read_system_serial(void)
 		printf("%02x", system_serial[i]);
 	printf("\n");
 }
+
 #elif defined(OVERO)
+
+static void
+overo_reset(void)
+{
+
+#if NPRCM > 0
+	prcm_cold_reset();
+#endif
+}
+
 static void
 find_cpu_clock(void)
 {

Index: src/sys/arch/evbarm/gumstix/gumstix_start.S
diff -u src/sys/arch/evbarm/gumstix/gumstix_start.S:1.12 src/sys/arch/evbarm/gumstix/gumstix_start.S:1.13
--- src/sys/arch/evbarm/gumstix/gumstix_start.S:1.12	Sun Aug 18 15:58:20 2013
+++ src/sys/arch/evbarm/gumstix/gumstix_start.S	Fri May 23 13:56:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: gumstix_start.S,v 1.12 2013/08/18 15:58:20 matt Exp $ */
+/*	$NetBSD: gumstix_start.S,v 1.13 2014/05/23 13:56:18 kiyohara Exp $ */
 /*
  * Copyright (C) 2005, 2006 WIDE Project and SOUM Corporation.
  * All rights reserved.
@@ -66,7 +66,7 @@
 #include <arm/armreg.h>
 #include "assym.h"
 
-RCSID("$NetBSD: gumstix_start.S,v 1.12 2013/08/18 15:58:20 matt Exp $")
+RCSID("$NetBSD: gumstix_start.S,v 1.13 2014/05/23 13:56:18 kiyohara Exp $")
 
 /*
  * CPWAIT -- Canonical method to wait for CP15 update.
@@ -182,6 +182,14 @@ _C_LABEL(gumstix_start):
 	mcr	p15, 0, r0, c2, c0, 0	/* Set TTB */
 	mcr	p15, 0, r0, c8, c7, 0	/* Flush TLB */
 
+#if defined(CPU_CORTEXA8)
+	mcr	p15, 0, r0, c2, c0, 1	/* Set TTB1 */
+	mov	r0, #TTBCR_S_N_1
+	mcr	p15, 0, r0, c2, c0, 2	/* Set TTBCR */
+	mov	r0, #0
+	mcr	p15, 0, r0, c8, c7, 0	/* Flush TLB */
+#endif
+
 	/*
 	 * Set the Domain Access register.  Very important!
 	 * startup_pagetable puts to domain 0 now.

Reply via email to