Module Name:    src
Committed By:   matt
Date:           Mon Jun 20 17:44:34 UTC 2011

Modified Files:
        src/sys/arch/evbppc/conf: files.explora files.virtex files.walnut
            std.explora std.obs405 std.virtex std.walnut
        src/sys/arch/evbppc/explora: explora_start.S machdep.c
        src/sys/arch/evbppc/obs405: obs200_machdep.c obs266_machdep.c
            obs600_autoconf.c obs600_machdep.c
        src/sys/arch/evbppc/virtex: machdep.c
        src/sys/arch/evbppc/walnut: machdep.c
        src/sys/arch/powerpc/conf: files.ibm4xx
        src/sys/arch/powerpc/ibm4xx: clock.c ibm4xx_machdep.c
        src/sys/arch/powerpc/include/ibm4xx: cpu.h
Added Files:
        src/sys/arch/powerpc/ibm4xx: pic_uic.c
Removed Files:
        src/sys/arch/powerpc/ibm4xx: intr.c
        src/sys/arch/powerpc/include/ibm4xx: ibm4xx_intr.h

Log Message:
Change IBM4xx to use the common powerpc PIC framework.
Consolidate most ibm4xx initppc function into ibm4xx_init
and Make all IBM4xx use it.
Change explora to use initppc instead of bootstrap.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbppc/conf/files.explora
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbppc/conf/files.virtex \
    src/sys/arch/evbppc/conf/std.explora src/sys/arch/evbppc/conf/std.obs405
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/evbppc/conf/files.walnut
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbppc/conf/std.virtex
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/evbppc/conf/std.walnut
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbppc/explora/explora_start.S
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/evbppc/explora/machdep.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/evbppc/obs405/obs200_machdep.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/evbppc/obs405/obs266_machdep.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbppc/obs405/obs600_autoconf.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/evbppc/obs405/obs600_machdep.c
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbppc/virtex/machdep.c
cvs rdiff -u -r1.52 -r1.53 src/sys/arch/evbppc/walnut/machdep.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/powerpc/conf/files.ibm4xx
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/powerpc/ibm4xx/clock.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/powerpc/ibm4xx/ibm4xx_machdep.c
cvs rdiff -u -r1.25 -r0 src/sys/arch/powerpc/ibm4xx/intr.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/powerpc/ibm4xx/pic_uic.c
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/powerpc/include/ibm4xx/cpu.h
cvs rdiff -u -r1.20 -r0 src/sys/arch/powerpc/include/ibm4xx/ibm4xx_intr.h

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/evbppc/conf/files.explora
diff -u src/sys/arch/evbppc/conf/files.explora:1.8 src/sys/arch/evbppc/conf/files.explora:1.9
--- src/sys/arch/evbppc/conf/files.explora:1.8	Wed Feb 20 21:43:34 2008
+++ src/sys/arch/evbppc/conf/files.explora	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: files.explora,v 1.8 2008/02/20 21:43:34 drochner Exp $
+#	$NetBSD: files.explora,v 1.9 2011/06/20 17:44:33 matt Exp $
 
 # maxpartitions must be first item in files.${ARCH}
 
@@ -10,11 +10,13 @@
 defparam	opt_explora.h	COM_CONSOLE_SPEED
 
 include		"arch/powerpc/fpu/files.fpu"
+include		"arch/powerpc/pic/files.pic"
 
 file	arch/evbppc/explora/autoconf.c
 file	arch/evbppc/explora/consinit.c
 file	arch/evbppc/explora/machdep.c
-file	arch/powerpc/ibm4xx/intr.c
+file	arch/powerpc/ibm4xx/ibm4xx_machdep.c
+file	arch/powerpc/ibm4xx/pic_uic.c
 file	dev/md_root.c				memory_disk_hooks
 
 # Explora local bus

Index: src/sys/arch/evbppc/conf/files.virtex
diff -u src/sys/arch/evbppc/conf/files.virtex:1.4 src/sys/arch/evbppc/conf/files.virtex:1.5
--- src/sys/arch/evbppc/conf/files.virtex:1.4	Thu Mar 18 13:47:04 2010
+++ src/sys/arch/evbppc/conf/files.virtex	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: files.virtex,v 1.4 2010/03/18 13:47:04 kiyohara Exp $
+#	$NetBSD: files.virtex,v 1.5 2011/06/20 17:44:33 matt Exp $
 #
 # Xilinx Virtex specific configuration
 
@@ -18,6 +18,8 @@
 file 	arch/evbppc/virtex/design_gsrd1.c 	design_gsrd1
 file 	arch/evbppc/virtex/design_gsrd2.c 	design_gsrd2 | design_dfc
 
+file	arch/powerpc/ibm4xx/ibm4xx_machdep.c
+
 # Memory Disk for install kernel
 file	dev/md_root.c				memory_disk_hooks
 
Index: src/sys/arch/evbppc/conf/std.explora
diff -u src/sys/arch/evbppc/conf/std.explora:1.4 src/sys/arch/evbppc/conf/std.explora:1.5
--- src/sys/arch/evbppc/conf/std.explora:1.4	Sun Dec 11 12:17:11 2005
+++ src/sys/arch/evbppc/conf/std.explora	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: std.explora,v 1.4 2005/12/11 12:17:11 christos Exp $
+#	$NetBSD: std.explora,v 1.5 2011/06/20 17:44:33 matt Exp $
 #
 # Standard/required options for NetBSD/explora.
 
@@ -18,7 +18,7 @@
 makeoptions	BOARDTYPE="explora"
 makeoptions	PPCDIR="ibm4xx"
 
-options 	PPC_INTR_IMPL="<powerpc/ibm4xx/ibm4xx_intr.h>"
+options 	PPC_INTR_IMPL="<powerpc/intr.h>"
 
 options 	INTSTK=8192
 
Index: src/sys/arch/evbppc/conf/std.obs405
diff -u src/sys/arch/evbppc/conf/std.obs405:1.4 src/sys/arch/evbppc/conf/std.obs405:1.5
--- src/sys/arch/evbppc/conf/std.obs405:1.4	Thu Mar 18 14:15:38 2010
+++ src/sys/arch/evbppc/conf/std.obs405	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: std.obs405,v 1.4 2010/03/18 14:15:38 kiyohara Exp $
+#	$NetBSD: std.obs405,v 1.5 2011/06/20 17:44:33 matt Exp $
 #
 # Standard/required options for NetBSD/obs405.
 
@@ -16,7 +16,7 @@
 makeoptions	BOARDTYPE="obs405"
 makeoptions	PPCDIR="ibm4xx"
 
-options 	PPC_INTR_IMPL="<powerpc/ibm4xx/ibm4xx_intr.h>"
+options 	PPC_INTR_IMPL="<powerpc/intr.h>"
 options 	PPC_PCI_MACHDEP_IMPL="<powerpc/ibm4xx/pci_machdep.h>"
 
 options 	INTSTK=16384

Index: src/sys/arch/evbppc/conf/files.walnut
diff -u src/sys/arch/evbppc/conf/files.walnut:1.16 src/sys/arch/evbppc/conf/files.walnut:1.17
--- src/sys/arch/evbppc/conf/files.walnut:1.16	Thu Mar 18 13:47:04 2010
+++ src/sys/arch/evbppc/conf/files.walnut	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: files.walnut,v 1.16 2010/03/18 13:47:04 kiyohara Exp $
+#	$NetBSD: files.walnut,v 1.17 2011/06/20 17:44:33 matt Exp $
 #
 # walnut-specific configuration info
 
@@ -6,6 +6,7 @@
 file	arch/evbppc/walnut/consinit.c
 file	arch/evbppc/walnut/machdep.c
 file	arch/powerpc/ibm4xx/ibm4xx_autoconf.c
+file	arch/powerpc/ibm4xx/ibm4xx_machdep.c
 
 # Memory Disk for install kernel
 file	dev/md_root.c				memory_disk_hooks

Index: src/sys/arch/evbppc/conf/std.virtex
diff -u src/sys/arch/evbppc/conf/std.virtex:1.2 src/sys/arch/evbppc/conf/std.virtex:1.3
--- src/sys/arch/evbppc/conf/std.virtex:1.2	Thu Mar 18 13:47:04 2010
+++ src/sys/arch/evbppc/conf/std.virtex	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: std.virtex,v 1.2 2010/03/18 13:47:04 kiyohara Exp $
+#	$NetBSD: std.virtex,v 1.3 2011/06/20 17:44:33 matt Exp $
 #
 # Standard/required options for NetBSD/virtex.
 
@@ -17,7 +17,7 @@
 makeoptions	BOARDTYPE="virtex"
 makeoptions	PPCDIR="ibm4xx"
 
-options 	PPC_INTR_IMPL="<powerpc/ibm4xx/ibm4xx_intr.h>"
+options 	PPC_INTR_IMPL="<powerpc/intr.h>"
 options 	KERNBASE=0x25000
 options 	INTSTK=16384
 

Index: src/sys/arch/evbppc/conf/std.walnut
diff -u src/sys/arch/evbppc/conf/std.walnut:1.6 src/sys/arch/evbppc/conf/std.walnut:1.7
--- src/sys/arch/evbppc/conf/std.walnut:1.6	Sun Dec 11 12:17:11 2005
+++ src/sys/arch/evbppc/conf/std.walnut	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: std.walnut,v 1.6 2005/12/11 12:17:11 christos Exp $
+#	$NetBSD: std.walnut,v 1.7 2011/06/20 17:44:33 matt Exp $
 #
 # Standard/required options for NetBSD/walnut.
 
@@ -17,7 +17,7 @@
 makeoptions	BOARDTYPE="walnut"
 makeoptions	PPCDIR="ibm4xx"
 
-options 	PPC_INTR_IMPL="<powerpc/ibm4xx/ibm4xx_intr.h>"
+options 	PPC_INTR_IMPL="<powerpc/intr.h>"
 options 	PPC_PCI_MACHDEP_IMPL="<powerpc/ibm4xx/pci_machdep.h>"
 options 	KERNBASE=0x25000
 

Index: src/sys/arch/evbppc/explora/explora_start.S
diff -u src/sys/arch/evbppc/explora/explora_start.S:1.8 src/sys/arch/evbppc/explora/explora_start.S:1.9
--- src/sys/arch/evbppc/explora/explora_start.S:1.8	Mon Jan 17 08:23:54 2011
+++ src/sys/arch/evbppc/explora/explora_start.S	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: explora_start.S,v 1.8 2011/01/17 08:23:54 matt Exp $	*/
+/*	$NetBSD: explora_start.S,v 1.9 2011/06/20 17:44:33 matt Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -188,7 +188,7 @@
 	ori	3,3,__start@l
 
 /* Run the remaining setup in C. */
-	bl	_C_LABEL(bootstrap)
+	bl	_C_LABEL(initppc)
 
 	bl	_C_LABEL(main)
 

Index: src/sys/arch/evbppc/explora/machdep.c
diff -u src/sys/arch/evbppc/explora/machdep.c:1.35 src/sys/arch/evbppc/explora/machdep.c:1.36
--- src/sys/arch/evbppc/explora/machdep.c:1.35	Sat Jun 18 06:44:25 2011
+++ src/sys/arch/evbppc/explora/machdep.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.35 2011/06/18 06:44:25 matt Exp $	*/
+/*	$NetBSD: machdep.c,v 1.36 2011/06/20 17:44:33 matt Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.35 2011/06/18 06:44:25 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.36 2011/06/20 17:44:33 matt Exp $");
 
 #include "opt_explora.h"
 #include "opt_modular.h"
@@ -88,68 +88,13 @@
 static struct mem_region phys_mem[MEMREGIONS];
 static struct mem_region avail_mem[MEMREGIONS];
 
-void		bootstrap(u_int, u_int);
-static void	install_extint(void (*)(void));
-
-/*
- * Trap vectors
- */
-extern int defaulttrap, defaultsize;
-extern int sctrap, scsize;
-extern int alitrap, alisize;
-extern int dsitrap, dsisize;
-extern int isitrap, isisize;
-extern int mchktrap, mchksize;
-extern int tlbimiss4xx, tlbim4size;
-extern int tlbdmiss4xx, tlbdm4size;
-extern int pitfitwdog, pitfitwdogsize;
-extern int debugtrap, debugsize;
-extern int errata51handler, errata51size;
-#ifdef DDB
-extern int ddblow, ddbsize;
-#endif
-static struct {
-	int vector;
-	void *addr;
-	void *size;
-} trap_table[] = {
-	{ EXC_SC,	&sctrap,	&scsize },
-	{ EXC_ALI,	&alitrap,	&alisize },
-	{ EXC_DSI,	&dsitrap,	&dsisize },
-	{ EXC_ISI,	&isitrap,	&isisize },
-	{ EXC_MCHK,	&mchktrap,	&mchksize },
-	{ EXC_ITMISS,	&tlbimiss4xx,	&tlbim4size },
-	{ EXC_DTMISS,	&tlbdmiss4xx,	&tlbdm4size },
-	{ EXC_PIT,	&pitfitwdog,	&pitfitwdogsize },
-	{ EXC_DEBUG,	&debugtrap,	&debugsize },
-	{ (EXC_DTMISS|EXC_ALI), &errata51handler, &errata51size },
-#if defined(DDB)
-	{ EXC_PGM,	&ddblow,	&ddbsize },
-#endif /* DDB */
-};
-
-/*
- * Install a trap vector. We cannot use memcpy because the
- * destination may be zero.
- */
-static void
-trap_copy(void *src, int dest, size_t len)
-{
-	uint32_t *src_p = src;
-	uint32_t *dest_p = (void *)dest;
-
-	while (len > 0) {
-		*dest_p++ = *src_p++;
-		len -= sizeof(uint32_t);
-	}
-}
+void		initppc(vaddr_t, vaddr_t);
 
 void
-bootstrap(u_int startkernel, u_int endkernel)
+initppc(vaddr_t startkernel, vaddr_t endkernel)
 {
 	u_int i, j, t, br[4];
 	u_int maddr, msize, size;
-	struct cpu_info * const ci = &cpu_info[0];
 
 	br[0] = mfdcr(DCR_BR4);
 	br[1] = mfdcr(DCR_BR5);
@@ -197,100 +142,13 @@
 	ppc4xx_tlb_reserve(BASE_FB2, BASE_FB2, TLB_PG_SIZE, TLB_I | TLB_G);
 #endif
 
-	consinit();
-
 	/* Disable all external interrupts */
 	mtdcr(DCR_EXIER, 0);
 
 	/* Disable all timer interrupts */
 	mtspr(SPR_TCR, 0);
 
-	/* Initialize cache info for memcpy, etc. */
-	cpu_probe_cache();
-
-	/*
-	 * Initialize lwp0 and current pcb and pmap pointers.
-	 */
-	lwp0.l_cpu = ci;
-
-	curpcb = lwp_getpcb(&lwp0);
-	memset(curpcb, 0, sizeof(struct pcb));	/* XXX why? */
-	curpcb->pcb_pm = pmap_kernel();
-
-	/*
-	 * Install trap vectors.
-	 */
-
-	for (i = EXC_RSVD; i <= EXC_LAST; i += 0x100)
-		trap_copy(&defaulttrap, i, (size_t)&defaultsize);
-
-	for (i = 0; i < sizeof(trap_table)/sizeof(trap_table[0]); i++) {
-		trap_copy(trap_table[i].addr, trap_table[i].vector,
-		    (size_t)trap_table[i].size);
-	}
-
-	__syncicache((void *)EXC_RST, EXC_LAST - EXC_RST + 0x100);
-
-	/*
-	 * Set Exception vector base.
-	 * Handle trap instruction as PGM exception.
-	 */
-
-	mtspr(SPR_EVPR, 0);
-
-	t = mfspr(SPR_DBCR0);
-	t &= ~DBCR0_TDE;
-	mtspr(SPR_DBCR0, t);
-
-	/*
-	 * External interrupt handler install.
-	 */
-
-	install_extint(ext_intr);
-
-	/*
-	 * Now enable translation (and machine checks/recoverable interrupts).
-	 */
-	__asm volatile (
-	    "	mfmsr %0	\n"
-	    "	ori %0,%0,%1	\n"
-	    "	mtmsr %0	\n"
-	    "	sync		\n"
-	    : : "r" (0), "K" (PSL_IR|PSL_DR|PSL_ME) );
-
-	uvm_setpagesize();
-
-	/*
-	 * Initialize pmap module.
-	 */
-	pmap_bootstrap(startkernel, endkernel);
-	fake_mapiodev = 0;
-}
-
-static void
-install_extint(void (*handler)(void))
-{
-	extern int extint, extsize;
-	extern u_long extint_call;
-	u_long offset = (u_long)handler - (u_long)&extint_call;
-	int omsr, msr;
-
-#ifdef	DIAGNOSTIC
-	if (offset > 0x1ffffff)
-		panic("install_extint: too far away");
-#endif
-	__asm volatile (
-	    "	mfmsr %0	\n"
-	    "	andi. %1,%0,%2	\n"
-	    "	mtmsr %1	\n"
-	    : "=r" (omsr), "=r" (msr) : "K" ((u_short)~PSL_EE) );
-	extint_call = (extint_call & 0xfc000003) | offset;
-	memcpy((void *)EXC_EXI, &extint, (size_t)&extsize);
-	__syncicache((void *)&extint_call, sizeof extint_call);
-	__syncicache((void *)EXC_EXI, (int)&extsize);
-	__asm volatile (
-	    "	mtmsr %0	\n"
-	    : : "r" (omsr) );
+	ibm4xx_init(startkernel, endkernel, pic_ext_intr);
 }
 
 void
@@ -352,6 +210,7 @@
 	 * Look for the ibm4xx modules in the right place.
 	 */
 	module_machine = module_machine_ibm4xx;
+	fake_mapiodev = 0;
 }
 
 void

Index: src/sys/arch/evbppc/obs405/obs200_machdep.c
diff -u src/sys/arch/evbppc/obs405/obs200_machdep.c:1.17 src/sys/arch/evbppc/obs405/obs200_machdep.c:1.18
--- src/sys/arch/evbppc/obs405/obs200_machdep.c:1.17	Sat Jun 18 06:44:26 2011
+++ src/sys/arch/evbppc/obs405/obs200_machdep.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: obs200_machdep.c,v 1.17 2011/06/18 06:44:26 matt Exp $	*/
+/*	$NetBSD: obs200_machdep.c,v 1.18 2011/06/20 17:44:33 matt Exp $	*/
 /*	Original: machdep.c,v 1.3 2005/01/17 17:24:09 shige Exp	*/
 
 /*
@@ -68,12 +68,11 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: obs200_machdep.c,v 1.17 2011/06/18 06:44:26 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obs200_machdep.c,v 1.18 2011/06/20 17:44:33 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_ddb.h"
 #include "opt_ipkdb.h"
-#include "opt_modular.h"
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -130,14 +129,10 @@
 
 extern paddr_t msgbuf_paddr;
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-void *startsym, *endsym;
-#endif
-
-void initppc(u_int, u_int, char *, void *);
+void initppc(vaddr_t, vaddr_t, char *, void *);
 
 void
-initppc(u_int startkernel, u_int endkernel, char *args, void *info_block)
+initppc(vaddr_t startkernel, vaddr_t endkernel, char *args, void *info_block)
 {
 	u_int32_t pllmode;
 	u_int32_t psr;
@@ -163,17 +158,7 @@
 
 	/* Initialize IBM405GPr CPU */
 	ibm40x_memsize_init(memsize, startkernel);
-	ibm4xx_init((void (*)(void))ext_intr);
-
-	/*
-	 * Set the page size.
-	 */
-	uvm_setpagesize();
-
-	/*
-	 * Initialize pmap module.
-	 */
-	pmap_bootstrap(startkernel, endkernel);
+	ibm4xx_init(startkernel, endkernel, pic_ext_intr);
 
 #ifdef DEBUG
 	bios_board_print();
@@ -181,9 +166,6 @@
 	printf("  Chip Pin Strapping Register = 0x%08x\n", psr);
 #endif
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-	ksyms_addsyms_elf((int)((u_int)endsym - (u_int)startsym), startsym, endsym);
-#endif
 #ifdef DDB
 	if (boothowto & RB_KDB)
 		Debugger();

Index: src/sys/arch/evbppc/obs405/obs266_machdep.c
diff -u src/sys/arch/evbppc/obs405/obs266_machdep.c:1.18 src/sys/arch/evbppc/obs405/obs266_machdep.c:1.19
--- src/sys/arch/evbppc/obs405/obs266_machdep.c:1.18	Sat Jun 18 06:44:26 2011
+++ src/sys/arch/evbppc/obs405/obs266_machdep.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: obs266_machdep.c,v 1.18 2011/06/18 06:44:26 matt Exp $	*/
+/*	$NetBSD: obs266_machdep.c,v 1.19 2011/06/20 17:44:33 matt Exp $	*/
 /*	Original: md_machdep.c,v 1.3 2005/01/24 18:47:37 shige Exp $	*/
 
 /*
@@ -68,12 +68,11 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: obs266_machdep.c,v 1.18 2011/06/18 06:44:26 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obs266_machdep.c,v 1.19 2011/06/20 17:44:33 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_ddb.h"
 #include "opt_ipkdb.h"
-#include "opt_modular.h"
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -130,14 +129,10 @@
 
 extern paddr_t msgbuf_paddr;
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-void *startsym, *endsym;
-#endif
-
-void initppc(u_int, u_int, char *, void *);
+void initppc(vaddr_t, vaddr_t, char *, void *);
 
 void
-initppc(u_int startkernel, u_int endkernel, char *args, void *info_block)
+initppc(vaddr_t startkernel, vaddr_t endkernel, char *args, void *info_block)
 {
 	vaddr_t va;
 	u_int memsize;
@@ -156,25 +151,12 @@
 
 	/* Initialize IBM405GPr CPU */
 	ibm40x_memsize_init(memsize, startkernel);
-	ibm4xx_init((void (*)(void))ext_intr);
-
-	/*
-	 * Set the page size.
-	 */
-	uvm_setpagesize();
-
-	/*
-	 * Initialize pmap module.
-	 */
-	pmap_bootstrap(startkernel, endkernel);
+	ibm4xx_init(startkernel, endkernel, pic_ext_intr);
 
 #ifdef DEBUG
 	openbios_board_print();
 #endif
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-	ksyms_addsyms_elf((int)((u_int)endsym - (u_int)startsym), startsym, endsym);
-#endif
 #ifdef DDB
 	if (boothowto & RB_KDB)
 		Debugger();

Index: src/sys/arch/evbppc/obs405/obs600_autoconf.c
diff -u src/sys/arch/evbppc/obs405/obs600_autoconf.c:1.3 src/sys/arch/evbppc/obs405/obs600_autoconf.c:1.4
--- src/sys/arch/evbppc/obs405/obs600_autoconf.c:1.3	Sat Jun 18 06:44:26 2011
+++ src/sys/arch/evbppc/obs405/obs600_autoconf.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: obs600_autoconf.c,v 1.3 2011/06/18 06:44:26 matt Exp $	*/
+/*	$NetBSD: obs600_autoconf.c,v 1.4 2011/06/20 17:44:33 matt Exp $	*/
 
 /*
  * Copyright 2004 Shigeyuki Fukushima.
@@ -33,7 +33,7 @@
  * DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: obs600_autoconf.c,v 1.3 2011/06/18 06:44:26 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obs600_autoconf.c,v 1.4 2011/06/20 17:44:33 matt Exp $");
 
 #include <sys/systm.h>
 #include <sys/device.h>
@@ -57,8 +57,8 @@
 
 	/* Initialize intr and add UICs */
 	intr_init();
-	uic_add(DCR_UIC1_BASE, 30);	/* UIC1 cascade to irq 30 */
-	uic_add(DCR_UIC2_BASE, 28);	/* UIC2 cascade to irq 28 */
+	pic_add(&pic_uic1);
+	pic_add(&pic_uic2);
 
 	calc_delayconst();
 

Index: src/sys/arch/evbppc/obs405/obs600_machdep.c
diff -u src/sys/arch/evbppc/obs405/obs600_machdep.c:1.6 src/sys/arch/evbppc/obs405/obs600_machdep.c:1.7
--- src/sys/arch/evbppc/obs405/obs600_machdep.c:1.6	Sat Jun 18 06:44:26 2011
+++ src/sys/arch/evbppc/obs405/obs600_machdep.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: obs600_machdep.c,v 1.6 2011/06/18 06:44:26 matt Exp $	*/
+/*	$NetBSD: obs600_machdep.c,v 1.7 2011/06/20 17:44:33 matt Exp $	*/
 /*	Original: md_machdep.c,v 1.3 2005/01/24 18:47:37 shige Exp $	*/
 
 /*
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: obs600_machdep.c,v 1.6 2011/06/18 06:44:26 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obs600_machdep.c,v 1.7 2011/06/20 17:44:33 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_ddb.h"
@@ -138,16 +138,12 @@
 
 extern paddr_t msgbuf_paddr;
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-void *startsym, *endsym;
-#endif
-
-void initppc(u_int, u_int, int, char *[], char *);
+void initppc(vaddr_t, vaddr_t, int, char *[], char *);
 static int read_eeprom(int, char *);
 
 
 void
-initppc(u_int startkernel, u_int endkernel, int argc, char *argv[],
+initppc(vaddr_t startkernel, vaddr_t endkernel, int argc, char *argv[],
 	char *argstr)
 {
 	vaddr_t va;
@@ -168,25 +164,8 @@
 
 	/* Initialize AMCC 405EX CPU */
 	ibm40x_memsize_init(memsize, startkernel);
-	ibm4xx_init((void (*)(void))ext_intr);
-
-	/* Disable Watchdog, PIT and FIT interrupts. (u-boot uses PIT...) */
-	mtspr(SPR_TCR, 0);
-
-	/*
-	 * Set the page size.
-	 */
-	uvm_setpagesize();
+	ibm4xx_init(startkernel, endkernel, pic_ext_intr);
 
-	/*
-	 * Initialize pmap module.
-	 */
-	pmap_bootstrap(startkernel, endkernel);
-
-
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-	ksyms_addsyms_elf((int)((u_int)endsym - (u_int)startsym), startsym, endsym);
-#endif
 #ifdef DDB
 	if (boothowto & RB_KDB)
 		Debugger();

Index: src/sys/arch/evbppc/virtex/machdep.c
diff -u src/sys/arch/evbppc/virtex/machdep.c:1.19 src/sys/arch/evbppc/virtex/machdep.c:1.20
--- src/sys/arch/evbppc/virtex/machdep.c:1.19	Mon Jun 20 07:18:06 2011
+++ src/sys/arch/evbppc/virtex/machdep.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.19 2011/06/20 07:18:06 matt Exp $ */
+/*	$NetBSD: machdep.c,v 1.20 2011/06/20 17:44:33 matt Exp $ */
 
 /*
  * Copyright (c) 2006 Jachym Holecek
@@ -34,12 +34,11 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.19 2011/06/20 07:18:06 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.20 2011/06/20 17:44:33 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_ddb.h"
 #include "opt_ipkdb.h"
-#include "opt_modular.h"
 #include "opt_virtex.h"
 #include "opt_kgdb.h"
 
@@ -106,38 +105,9 @@
 paddr_t msgbuf_paddr;
 vaddr_t msgbuf_vaddr;
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-void *startsym, *endsym;
-#endif
-
-void initppc(u_int, u_int);
+void initppc(vaddr_t, vaddr_t);
 
 static void dumpsys(void);
-static void install_extint(void (*)(void));
-static void trapcpy(int, void *, size_t);
-
-
-/* These two live in powerpc/powerpc/trap_subr.S */
-extern int 		extint, extsize;
-extern u_long 		extint_call;
-
-extern int defaulttrap, defaultsize;
-extern int sctrap, scsize;
-extern int alitrap, alisize;
-extern int dsitrap, dsisize;
-extern int isitrap, isisize;
-extern int mchktrap, mchksize;
-extern int tlbimiss4xx, tlbim4size;
-extern int tlbdmiss4xx, tlbdm4size;
-extern int pitfitwdog, pitfitwdogsize;
-extern int debugtrap, debugsize;
-extern int errata51handler, errata51size;
-#ifdef DDB
-extern int ddblow, ddbsize;
-#endif
-#ifdef IPKDB
-extern int ipkdblow, ipkdbsize;
-#endif
 
 /* BSS segment start & end. */
 extern char 		edata[], end[];
@@ -147,43 +117,13 @@
 struct mem_region 	physmemr[MEMREGIONS];
 struct mem_region 	availmemr[MEMREGIONS];
 
-static struct {
-	int 	vector;
-	void 	*addr;
-	void 	*size;
-} traps[] = {
-	/* EXC_EXI handled by install_extint(). */
-	{ EXC_SC, 	&sctrap, 	&scsize 	},
-	{ EXC_ALI, 	&alitrap, 	&alisize 	},
-	{ EXC_DSI, 	&dsitrap, 	&dsisize 	},
-	{ EXC_ISI, 	&isitrap, 	&isisize 	},
-	{ EXC_MCHK, 	&mchktrap, 	&mchksize 	},
-	{ EXC_ITMISS, 	&tlbimiss4xx, 	&tlbim4size 	},
-	{ EXC_DTMISS, 	&tlbdmiss4xx, 	&tlbdm4size 	},
-
-	/* EXC_{PIT, FIT, WDOG} handlers are spaced by 0x10 bytes only.. */
-	{ EXC_PIT, 	&pitfitwdog, 	&pitfitwdogsize },
-	{ EXC_DEBUG, 	&debugtrap, 	&debugsize	},
-
-	/* PPC405GP Rev D errata item 51 */	
-	{ EXC_DTMISS|EXC_ALI, &errata51handler, &errata51size },
-
-#if defined(DDB)
-	{ EXC_PGM, 	&ddblow, 	&ddbsize 	},
-#elif defined(IPKDB)
-	{ EXC_PGM, 	&ipkdblow, 	&ipkdbsize 	},
-#endif
-};
-
 /* Maximum TLB page size. */
 #define TLB_PG_SIZE 	(16*1024*1024)
 
 void
-initppc(u_int startkernel, u_int endkernel)
+initppc(vaddr_t startkernel, vaddr_t endkernel)
 {
-	struct cpu_info * const ci = curcpu();
-	u_int 			addr, memsize;
-	int 			exc, dbcr0, i;
+	paddr_t			addr, memsize;
 
         /* Initialize cache info for memcpy, memset, etc. */
         cpu_probe_cache();
@@ -207,47 +147,8 @@
 	virtex_machdep_init(roundup(memsize, TLB_PG_SIZE), TLB_PG_SIZE,
 	    physmemr, availmemr);
 
-	lwp0.l_cpu = ci;
-
-	curpcb = lwp_getpcb(&lwp0);
-	memset(curpcb, 0, sizeof(struct pcb));
-	curpcb->pcb_pm = pmap_kernel();
-
-	for (exc = EXC_RSVD; exc <= EXC_LAST; exc += 0x100)
-		trapcpy(exc, &defaulttrap, (size_t)&defaultsize);
-
-	for (i = 0; i < __arraycount(traps); i++)
-		trapcpy(traps[i].vector, traps[i].addr, (size_t)traps[i].size);
-
-	__syncicache((void *)EXC_RST, EXC_LAST - EXC_RST + 0x100);
-
-	/* set exception vector base */
-	mtspr(SPR_EVPR, 0);
-
-	/* handle trap instruction as PGM exception */
-	dbcr0 = mfspr(SPR_DBCR0) & ~DBCR0_TDE;
-	mtspr(SPR_DBCR0, dbcr0);
-
-	install_extint(ext_intr);
-
-	/* enable translation */
-	__asm volatile (
-	    "	mfmsr %0 	\n"
-	    "	ori %0,%0,%1 	\n"
-	    "	mtmsr %0 	\n"
-	    "   sync 		\n"
-	    "	isync		\n"
-	    : : "r"(0), "K"(PSL_IR | PSL_DR | PSL_ME)); 
+	ibm4xx_init(startkernel, endkernel, pic_ext_intr);
 
-	/* now that we enabled MMU, we can map console */
-	consinit();
-
-	uvm_setpagesize();
-	pmap_bootstrap(startkernel, endkernel);
-
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-	ksyms_addsyms_elf((int)((u_int)endsym - (u_int)startsym), startsym, endsym);
-#endif
 #ifdef DDB
 	if (boothowto & RB_KDB)
 		Debugger();
@@ -274,42 +175,6 @@
 }
 
 /*
- * trapcpy:
- *
- * 	Install a trap vector. We cannot use memcpy because the
- * 	destination may be zero. Borrowed from Explora.
- */
-static void
-trapcpy(int dest, void *src, size_t len)
-{
-	uint32_t 		*dest_p = (void *)dest;
-	uint32_t 		*src_p = src;
-
-	while (len > 0) {
-		*dest_p++ = *src_p++;
-		len -= sizeof(uint32_t);
-	}
-}
-
-static void
-install_extint(void (*handler)(void))
-{
-	u_long 			offset = (u_long)handler - (u_long)&extint_call;
-
-#ifdef DIAGNOSTIC
-	if (offset > 0x1ffffff)
-		panic("install_extint: too far away");
-#endif
-
-	/* Patch branch target in EXC_EXI handler. */
-	extint_call = (extint_call & 0xfc000003) | offset;
-
-	memcpy((void *)EXC_EXI, &extint, (size_t)&extsize);
-	__syncicache((void *)&extint_call, sizeof(extint_call));
-	__syncicache((void *)EXC_EXI, (int)&extsize);
-}
-
-/*
  * Machine dependent startup code.
  */
 

Index: src/sys/arch/evbppc/walnut/machdep.c
diff -u src/sys/arch/evbppc/walnut/machdep.c:1.52 src/sys/arch/evbppc/walnut/machdep.c:1.53
--- src/sys/arch/evbppc/walnut/machdep.c:1.52	Mon Jun 20 07:18:06 2011
+++ src/sys/arch/evbppc/walnut/machdep.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.52 2011/06/20 07:18:06 matt Exp $	*/
+/*	$NetBSD: machdep.c,v 1.53 2011/06/20 17:44:33 matt Exp $	*/
 
 /*
  * Copyright 2001, 2002 Wasabi Systems, Inc.
@@ -67,12 +67,11 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.52 2011/06/20 07:18:06 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.53 2011/06/20 17:44:33 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_ddb.h"
 #include "opt_ipkdb.h"
-#include "opt_modular.h"
 
 #include <sys/param.h>
 #include <sys/boot_flag.h>
@@ -109,6 +108,8 @@
 #include <powerpc/ibm4xx/cpu.h>
 #include <powerpc/ibm4xx/dcr4xx.h>
 
+#include <powerpc/pic/picvar.h>
+
 #include <dev/cons.h>
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pciconf.h>
@@ -139,14 +140,9 @@
 paddr_t msgbuf_paddr;
 vaddr_t msgbuf_vaddr;
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-void *startsym, *endsym;
-#endif
-
-void initppc(u_int, u_int, char *, void *);
+void initppc(vaddr_t, vaddr_t, char *, void *);
 
 static void dumpsys(void);
-static void install_extint(void (*)(void));
 
 #define MEMREGIONS	8
 struct mem_region physmemr[MEMREGIONS];		/* Hard code memory */
@@ -155,29 +151,8 @@
 struct board_cfg_data board_data;
 
 void
-initppc(u_int startkernel, u_int endkernel, char *args, void *info_block)
+initppc(vaddr_t startkernel, vaddr_t endkernel, char *args, void *info_block)
 {
-	extern int defaulttrap, defaultsize;
-	extern int sctrap, scsize;
-	extern int alitrap, alisize;
-	extern int dsitrap, dsisize;
-	extern int isitrap, isisize;
-	extern int mchktrap, mchksize;
-	extern int tlbimiss4xx, tlbim4size;
-	extern int tlbdmiss4xx, tlbdm4size;
-	extern int pitfitwdog, pitfitwdogsize;
-	extern int debugtrap, debugsize;
-	extern int errata51handler, errata51size;
-#ifdef DDB
-	extern int ddblow, ddbsize;
-#endif
-#ifdef IPKDB
-	extern int ipkdblow, ipkdbsize;
-#endif
-	vaddr_t va;
-	int exc, dbcr0;
-	struct cpu_info * const ci = curcpu();
-
 	/* Disable all external interrupts */
 	mtdcr(DCR_UIC0_BASE + DCR_UIC_ER, 0);
 
@@ -196,113 +171,17 @@
 	availmemr[0].size = board_data.mem_size - availmemr[0].start;
 
 	/* Linear map kernel memory */
-	for (va = 0; va < endkernel; va += TLB_PG_SIZE)
+	for (vaddr_t va = 0; va < endkernel; va += TLB_PG_SIZE) {
 		ppc4xx_tlb_reserve(va, va, TLB_PG_SIZE, TLB_EX);
+	}
 
 	/* Map console after physmem (see pmap_tlbmiss()) */
 	ppc4xx_tlb_reserve(0xef000000, roundup(physmemr[0].size, TLB_PG_SIZE),
 	    TLB_PG_SIZE, TLB_I | TLB_G);
 
-	/*
-	 * Initialize lwp0 and current pcb and pmap pointers.
-	 */
-	lwp0.l_cpu = ci;
-
-	curpcb = lwp_getpcb(&lwp0);
-	memset(curpcb, 0, sizeof(struct pcb));
-	curpcb->pcb_pm = pmap_kernel();
-
-	/*
-	 * Set up trap vectors
-	 */
-	for (exc = EXC_RSVD; exc <= EXC_LAST; exc += 0x100)
-		switch (exc) {
-		default:
-			memcpy((void *)exc, &defaulttrap, (size_t)&defaultsize);
-			break;
-		case EXC_EXI:
-			/*
-			 * This one is (potentially) installed during autoconf
-			 */
-			break;
-		case EXC_SC:
-			memcpy((void *)EXC_SC, &sctrap, (size_t)&scsize);
-			break;
-		case EXC_ALI:
-			memcpy((void *)EXC_ALI, &alitrap, (size_t)&alisize);
-			break;
-		case EXC_DSI:
-			memcpy((void *)EXC_DSI, &dsitrap, (size_t)&dsisize);
-			break;
-		case EXC_ISI:
-			memcpy((void *)EXC_ISI, &isitrap, (size_t)&isisize);
-			break;
-		case EXC_MCHK:
-			memcpy((void *)EXC_MCHK, &mchktrap, (size_t)&mchksize);
-			break;
-		case EXC_ITMISS:
-			memcpy((void *)EXC_ITMISS, &tlbimiss4xx,
-				(size_t)&tlbim4size);
-			break;
-		case EXC_DTMISS:
-			memcpy((void *)EXC_DTMISS, &tlbdmiss4xx,
-				(size_t)&tlbdm4size);
-			break;
-		/*
-		 * EXC_PIT, EXC_FIT, EXC_WDOG handlers
-		 * are spaced by 0x10 bytes only..
-		 */
-		case EXC_PIT:
-			memcpy((void *)EXC_PIT, &pitfitwdog,
-				(size_t)&pitfitwdogsize);
-			break;
-		case EXC_DEBUG:
-			memcpy((void *)EXC_DEBUG, &debugtrap,
-				(size_t)&debugsize);
-			break;
-		case EXC_DTMISS|EXC_ALI:
-                        /* PPC405GP Rev D errata item 51 */
-			memcpy((void *)(EXC_DTMISS|EXC_ALI), &errata51handler,
-				(size_t)&errata51size);
-			break;
-#if defined(DDB) || defined(IPKDB)
-		case EXC_PGM:
-#if defined(DDB)
-			memcpy((void *)exc, &ddblow, (size_t)&ddbsize);
-#elif defined(IPKDB)
-			memcpy((void *)exc, &ipkdblow, (size_t)&ipkdbsize);
-#endif
-#endif /* DDB | IPKDB */
-			break;
-		}
-
-	__syncicache((void *)EXC_RST, EXC_LAST - EXC_RST + 0x100);
-	mtspr(SPR_EVPR, 0);		/* Set Exception vector base */
-
-	consinit();
-
-	/* Handle trap instruction as PGM exception */
-	__asm volatile("mfspr %0,%1":"=r"(dbcr0):"K"(SPR_DBCR0));
-	__asm volatile("mtspr %0,%1"::"K"(SPR_DBCR0),"r"(dbcr0 & ~DBCR0_TDE));
-
-	/*
-	 * external interrupt handler install
-	 */
-	install_extint(ext_intr);
-
-	/*
-	 * Now enable translation (and machine checks/recoverable interrupts).
-	 */
-	__asm volatile ("mfmsr %0; ori %0,%0,%1; mtmsr %0; isync"
-		      : : "r"(0), "K"(PSL_IR|PSL_DR));
-	/* XXXX PSL_ME - With ME set kernel gets stuck... */
-
-	uvm_setpagesize();
+	mtspr(SPR_TCR, 0);	/* disable all timers */
 
-	/*
-	 * Initialize pmap module.
-	 */
-	pmap_bootstrap(startkernel, endkernel);
+	ibm4xx_init(startkernel, endkernel, pic_ext_intr);
 
 #ifdef DEBUG
 	printf("Board config data:\n");
@@ -322,9 +201,6 @@
 	printf("  pci_speed = %u\n", board_data.pci_speed);
 #endif
 
-#if NKSYMS || defined(DDB) || defined(MODULAR)
-	ksyms_addsyms_elf((int)((u_int)endsym - (u_int)startsym), startsym, endsym);
-#endif
 #ifdef DDB
 	if (boothowto & RB_KDB)
 		Debugger();
@@ -344,26 +220,6 @@
 	module_machine = module_machine_ibm4xx;
 }
 
-static void
-install_extint(void (*handler)(void))
-{
-	extern int extint, extsize;
-	extern u_long extint_call;
-	u_long offset = (u_long)handler - (u_long)&extint_call;
-	int msr;
-
-#ifdef	DIAGNOSTIC
-	if (offset > 0x1ffffff)
-		panic("install_extint: too far away");
-#endif
-	__asm volatile ("mfmsr %0; wrteei 0" : "=r"(msr));
-	extint_call = (extint_call & 0xfc000003) | offset;
-	memcpy((void *)EXC_EXI, &extint, (size_t)&extsize);
-	__syncicache((void *)&extint_call, sizeof extint_call);
-	__syncicache((void *)EXC_EXI, (int)&extsize);
-	__asm volatile ("mtmsr %0" :: "r"(msr));
-}
-
 /*
  * Machine dependent startup code.
  */

Index: src/sys/arch/powerpc/conf/files.ibm4xx
diff -u src/sys/arch/powerpc/conf/files.ibm4xx:1.12 src/sys/arch/powerpc/conf/files.ibm4xx:1.13
--- src/sys/arch/powerpc/conf/files.ibm4xx:1.12	Sat Nov  6 16:30:15 2010
+++ src/sys/arch/powerpc/conf/files.ibm4xx	Mon Jun 20 17:44:33 2011
@@ -1,11 +1,12 @@
-#	$NetBSD: files.ibm4xx,v 1.12 2010/11/06 16:30:15 uebayasi Exp $
+#	$NetBSD: files.ibm4xx,v 1.13 2011/06/20 17:44:33 matt Exp $
 #
 # IBM 4xx specific configuration info
 
 include "arch/powerpc/fpu/files.fpu"
+include "arch/powerpc/pic/files.pic"
 
 defflag opt_uic.h			MULTIUIC
-file	arch/powerpc/ibm4xx/intr.c
+file	arch/powerpc/ibm4xx/pic_uic.c
 
 # Board Properties
 file	arch/powerpc/ibm4xx/board_prop.c

Index: src/sys/arch/powerpc/ibm4xx/clock.c
diff -u src/sys/arch/powerpc/ibm4xx/clock.c:1.25 src/sys/arch/powerpc/ibm4xx/clock.c:1.26
--- src/sys/arch/powerpc/ibm4xx/clock.c:1.25	Sat Jun 18 06:41:41 2011
+++ src/sys/arch/powerpc/ibm4xx/clock.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: clock.c,v 1.25 2011/06/18 06:41:41 matt Exp $	*/
+/*	$NetBSD: clock.c,v 1.26 2011/06/20 17:44:33 matt Exp $	*/
 /*      $OpenBSD: clock.c,v 1.3 1997/10/13 13:42:53 pefo Exp $  */
 
 /*
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.25 2011/06/18 06:41:41 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.26 2011/06/20 17:44:33 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -97,15 +97,17 @@
 	ci->ci_ev_statclock.ev_count++;
 
 	/* Nobody can interrupt us, but see if we're allowed to run. */
-	if (! (ci->ci_cpl & mask_statclock))
+	int s = splclock();
+	if (IPL_CLOCK > s)
   		statclock(frame);
+	splx(s);
 }
 
 void
 decr_intr(struct clockframe *frame)
 {
 	struct cpu_info * const ci = curcpu();
-	int pri;
+	int pcpl;
 	long tbtick, xticks;
 	int nticks;
 
@@ -125,8 +127,8 @@
 
 	ci->ci_data.cpu_nintr++;
 	ci->ci_ev_clock.ev_count++;
-	pri = splclock();
-	if (pri & mask_clock) {
+	pcpl = splclock();
+	if (pcpl >= IPL_CLOCK) {
 		tickspending += nticks;
 		ticksmissed += nticks;
 	} else {
@@ -152,7 +154,7 @@
 			hardclock(frame);
 		hardclock(frame);
 	}
-	splx(pri);
+	splx(pcpl);
 }
 
 void

Index: src/sys/arch/powerpc/ibm4xx/ibm4xx_machdep.c
diff -u src/sys/arch/powerpc/ibm4xx/ibm4xx_machdep.c:1.16 src/sys/arch/powerpc/ibm4xx/ibm4xx_machdep.c:1.17
--- src/sys/arch/powerpc/ibm4xx/ibm4xx_machdep.c:1.16	Sat Jun 18 06:41:41 2011
+++ src/sys/arch/powerpc/ibm4xx/ibm4xx_machdep.c	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ibm4xx_machdep.c,v 1.16 2011/06/18 06:41:41 matt Exp $	*/
+/*	$NetBSD: ibm4xx_machdep.c,v 1.17 2011/06/20 17:44:33 matt Exp $	*/
 /*	Original: ibm40x_machdep.c,v 1.3 2005/01/17 17:19:36 shige Exp $ */
 
 /*
@@ -68,17 +68,19 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ibm4xx_machdep.c,v 1.16 2011/06/18 06:41:41 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ibm4xx_machdep.c,v 1.17 2011/06/20 17:44:33 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
 #include "opt_ipkdb.h"
+#include "opt_modular.h"
 
 #include <sys/param.h>
 #include <sys/msgbuf.h>
 #include <sys/proc.h>
 #include <sys/cpu.h>
+#include <sys/ksyms.h>
 
 #include <uvm/uvm_extern.h>
 
@@ -111,122 +113,99 @@
 vaddr_t msgbuf_vaddr;
 char msgbuf[MSGBUFSIZE];
 
+#if NKSYMS || defined(DDB) || defined(MODULAR)
+void *startsym, *endsym;
+#endif
+
 /*
- * ibm4xx_init:
+ * Trap vectors
  */
-void
-ibm4xx_init(void (*handler)(void))
-{
-	extern int defaulttrap, defaultsize;
-	extern int sctrap, scsize;
-	extern int alitrap, alisize;
-	extern int dsitrap, dsisize;
-	extern int isitrap, isisize;
-	extern int mchktrap, mchksize;
-	extern int tlbimiss4xx, tlbim4size;
-	extern int tlbdmiss4xx, tlbdm4size;
-	extern int pitfitwdog, pitfitwdogsize;
-	extern int debugtrap, debugsize;
-	extern int errata51handler, errata51size;
+extern const uint32_t defaulttrap[], defaultsize;
+extern const uint32_t sctrap[], scsize;
+extern const uint32_t alitrap[], alisize;
+extern const uint32_t dsitrap[], dsisize;
+extern const uint32_t isitrap[], isisize;
+extern const uint32_t mchktrap[], mchksize;
+extern const uint32_t tlbimiss4xx[], tlbim4size;
+extern const uint32_t tlbdmiss4xx[], tlbdm4size;
+extern const uint32_t pitfitwdog[], pitfitwdogsize;
+extern const uint32_t debugtrap[], debugsize;
+extern const uint32_t errata51handler[], errata51size;
 #ifdef DDB
-	extern int ddblow, ddbsize;
+extern const uint32_t ddblow[], ddbsize;
+extern const uint32_t ipkdblow[], ipkdbsize;
 #endif
-#ifdef IPKDB
-	extern int ipkdblow, ipkdbsize;
-#endif
-	uintptr_t exc;
-	struct cpu_info * const ci = curcpu();
+static const struct exc_info trap_table[] = {
+	{ EXC_SC,	sctrap,		(uintptr_t)&scsize },
+	{ EXC_ALI,	alitrap,	(uintptr_t)&alisize },
+	{ EXC_DSI,	dsitrap,	(uintptr_t)&dsisize },
+	{ EXC_ISI,	isitrap,	(uintptr_t)&isisize },
+	{ EXC_MCHK,	mchktrap,	(uintptr_t)&mchksize },
+	{ EXC_ITMISS,	tlbimiss4xx,	(uintptr_t)&tlbim4size },
+	{ EXC_DTMISS,	tlbdmiss4xx,	(uintptr_t)&tlbdm4size },
+	{ EXC_PIT,	pitfitwdog,	(uintptr_t)&pitfitwdogsize },
+	{ EXC_DEBUG,	debugtrap,	(uintptr_t)&debugsize },
+	{ (EXC_DTMISS|EXC_ALI),
+			errata51handler, (uintptr_t)&errata51size },
+#if defined(DDB)
+	{ EXC_PGM,	ddblow,		(uintptr_t)&ddbsize },
+#endif /* DDB */
+#if defined(IPKBD)
+	{ EXC_PGM,	ipkdblow,	(uintptr_t)&ipkdbsize },
+#endif /* DDB */
+};
+
+/*
+ * Install a trap vector. We cannot use memcpy because the
+ * destination may be zero.
+ */
+static void
+trap_copy(const uint32_t *src, vaddr_t dest, size_t len)
+{
+	uint32_t *dest_p = (void *)dest;
 
+	while (len > 0) {
+		*dest_p++ = *src++;
+		len -= sizeof(uint32_t);
+	}
+}
+
+/*
+ * ibm4xx_init:
+ */
+void
+ibm4xx_init(vaddr_t startkernel, vaddr_t endkernel, void (*handler)(void))
+{
 	/* Initialize cache info for memcpy, etc. */
 	cpu_probe_cache();
 
 	/*
-	 * Initialize lwp0 and current pcb and pmap pointers.
+	 * Initialize current pcb and pmap pointers.
 	 */
-	KASSERT(ci != NULL);
-	KASSERT(curcpu() == ci);
-	lwp0.l_cpu = ci;
+	KASSERT(curcpu() == &cpu_info[0]);
+	KASSERT(lwp0.l_cpu == curcpu());
+	KASSERT(curlwp == &lwp0);
 
-	curpcb = lwp_getpcb(&lwp0);
+	curpcb = lwp_getpcb(curlwp);
 	memset(curpcb, 0, sizeof(struct pcb));
 
 	curpcb->pcb_pm = pmap_kernel();
 
-	/*
-	 * Set up trap vectors
-	 */
-	for (exc = EXC_RSVD; exc <= EXC_LAST; exc += 0x100)
-		switch (exc) {
-		default:
-			memcpy((void *)exc, &defaulttrap, (size_t)&defaultsize);
-			break;
-		case EXC_EXI:
-			/*
-			 * This one is (potentially) installed during autoconf
-			 */
-			break;
-		case EXC_SC:
-			memcpy((void *)EXC_SC, &sctrap, (size_t)&scsize);
-			break;
-		case EXC_ALI:
-			memcpy((void *)EXC_ALI, &alitrap, (size_t)&alisize);
-			break;
-		case EXC_DSI:
-			memcpy((void *)EXC_DSI, &dsitrap, (size_t)&dsisize);
-			break;
-		case EXC_ISI:
-			memcpy((void *)EXC_ISI, &isitrap, (size_t)&isisize);
-			break;
-		case EXC_MCHK:
-			memcpy((void *)EXC_MCHK, &mchktrap, (size_t)&mchksize);
-			break;
-		case EXC_ITMISS:
-			memcpy((void *)EXC_ITMISS, &tlbimiss4xx,
-				(size_t)&tlbim4size);
-			break;
-		case EXC_DTMISS:
-			memcpy((void *)EXC_DTMISS, &tlbdmiss4xx,
-				(size_t)&tlbdm4size);
-			break;
-		/* 
-		 * EXC_PIT, EXC_FIT, EXC_WDOG handlers 
-		 * are spaced by 0x10 bytes only.. 
-		 */
-		case EXC_PIT:	
-			memcpy((void *)EXC_PIT, &pitfitwdog,
-				(size_t)&pitfitwdogsize);
-			break;
-		case EXC_DEBUG:
-			memcpy((void *)EXC_DEBUG, &debugtrap,
-				(size_t)&debugsize);
-			break;
-		case EXC_DTMISS|EXC_ALI:
-                        /* PPC405GP Rev D errata item 51 */	
-			memcpy((void *)(EXC_DTMISS|EXC_ALI), &errata51handler,
-				(size_t)&errata51size);
-			break;
-#if defined(DDB) || defined(IPKDB)
-		case EXC_PGM:
-#if defined(DDB)
-			memcpy((void *)exc, &ddblow, (size_t)&ddbsize);
-#elif defined(IPKDB)
-			memcpy((void *)exc, &ipkdblow, (size_t)&ipkdbsize);
-#endif
-#endif /* DDB | IPKDB */
-			break;
-		}
+	for (uintptr_t exc = EXC_RSVD; exc <= EXC_LAST; exc += 0x100) {
+		trap_copy(defaulttrap, exc, (uintptr_t)&defaultsize);
+	}
 
+	for (size_t i = 0; i < __arraycount(trap_table); i++) {
+		trap_copy(trap_table[i].exc_addr, trap_table[i].exc_vector,
+		    trap_table[i].exc_size); 
+	}
+        
 	__syncicache((void *)EXC_RST, EXC_LAST - EXC_RST + 0x100);
-	mtspr(SPR_EVPR, 0);		/* Set Exception vector base */
 
-	consinit();
+	mtspr(SPR_EVPR, 0);		/* Set Exception vector base */
 
 	/* Handle trap instruction as PGM exception */
-	{
-	  int dbcr0;
-	  __asm volatile("mfspr %0,%1":"=r"(dbcr0):"K"(SPR_DBCR0));
-	  __asm volatile("mtspr %0,%1"::"K"(SPR_DBCR0),"r"(dbcr0 & ~DBCR0_TDE));
-	}
+	mtspr(SPR_DBCR0, mfspr(SPR_DBCR0) & ~DBCR0_TDE);
 
 	/*
 	 * external interrupt handler install
@@ -241,7 +220,28 @@
 		      : : "r"(0), "K"(PSL_IR|PSL_DR)); 
 	/* XXXX PSL_ME - With ME set kernel gets stuck... */
 
-	KASSERT(curcpu() == ci);
+	/*
+	 * turn on console after enable translation
+	 */
+	consinit();
+
+	uvm_setpagesize();
+
+        /*
+         * Initialize pmap module.
+         */
+        pmap_bootstrap(startkernel, endkernel);
+
+	/*
+	 * Let's take all the indirect calls via our stubs and patch 
+	 * them to be direct calls.
+	 */
+	cpu_fixup_stubs();
+
+#if NKSYMS || defined(DDB) || defined(MODULAR)
+	ksyms_addsyms_elf((uintptr_t)endsym - (uintptr_t)startsym,
+	    startsym, endsym);
+#endif
 }
 
 void

Index: src/sys/arch/powerpc/include/ibm4xx/cpu.h
diff -u src/sys/arch/powerpc/include/ibm4xx/cpu.h:1.19 src/sys/arch/powerpc/include/ibm4xx/cpu.h:1.20
--- src/sys/arch/powerpc/include/ibm4xx/cpu.h:1.19	Mon Jun 20 06:24:30 2011
+++ src/sys/arch/powerpc/include/ibm4xx/cpu.h	Mon Jun 20 17:44:33 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.19 2011/06/20 06:24:30 matt Exp $	*/
+/*	$NetBSD: cpu.h,v 1.20 2011/06/20 17:44:33 matt Exp $	*/
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -46,6 +46,12 @@
 #if defined(_KERNEL)
 extern char bootpath[];
 
+struct exc_info {
+	vaddr_t exc_vector;
+	const uint32_t *exc_addr; 
+	uintptr_t exc_size;
+}; 
+
 #include <sys/param.h>
 #include <sys/device.h>
 #include <prop/proplib.h>
@@ -61,7 +67,7 @@
 extern void ibm40x_memsize_init(u_int, u_int);
 
 /* export from ibm4xx/ibm4xx_machdep.c */
-extern void ibm4xx_init(void (*)(void));
+extern void ibm4xx_init(vaddr_t, vaddr_t, void (*)(void));
 extern void ibm4xx_cpu_startup(const char *);
 extern void ibm4xx_dumpsys(void);
 extern void ibm4xx_install_extint(void (*)(void));
@@ -75,6 +81,8 @@
 /* export from ibm4xx/4xx_locore.S */
 extern void ppc4xx_reset(void) __dead;
 
+extern void intr_init(void);
+
 /*
  * DCR (Device Control Register) access. These have to be
  * macros because register address is encoded as immediate
@@ -122,6 +130,13 @@
 	mtdcr(DCR_SDR0_CFGADDR, reg);
 	return mfdcr(DCR_SDR0_CFGDATA);
 }
+
+#include <powerpc/pic/picvar.h>
+
+extern struct pic_ops pic_uic403;
+extern struct pic_ops pic_uic0;
+extern struct pic_ops pic_uic1;
+extern struct pic_ops pic_uic2;
 #endif /* _KERNEL */
 
 /* Board info dictionary */

Added files:

Index: src/sys/arch/powerpc/ibm4xx/pic_uic.c
diff -u /dev/null src/sys/arch/powerpc/ibm4xx/pic_uic.c:1.1
--- /dev/null	Mon Jun 20 17:44:34 2011
+++ src/sys/arch/powerpc/ibm4xx/pic_uic.c	Mon Jun 20 17:44:33 2011
@@ -0,0 +1,380 @@
+/*	$NetBSD: pic_uic.c,v 1.1 2011/06/20 17:44:33 matt Exp $	*/
+
+/*
+ * Copyright 2002 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed for the NetBSD Project by
+ *      Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: pic_uic.c,v 1.1 2011/06/20 17:44:33 matt Exp $");
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/evcnt.h>
+#include <sys/cpu.h>
+
+#include <machine/intr.h>
+#include <machine/psl.h>
+
+#include <powerpc/spr.h>
+#include <powerpc/ibm4xx/spr.h>
+#include <powerpc/ibm4xx/cpu.h>
+
+#include <powerpc/pic/picvar.h>
+
+
+/*
+ * Number of interrupts (hard + soft), irq number legality test,
+ * mapping of irq number to mask and a way to pick irq number
+ * off a mask of active intrs.
+ */
+#define	IRQ_TO_MASK(irq) 	(0x80000000UL >> ((irq) & 0x1f))
+#define	IRQ_OF_MASK(mask) 	__builtin_clz(mask)
+
+static void	uic_enable_irq(struct pic_ops *, int, int);
+static void	uic_disable_irq(struct pic_ops *, int);
+static int	uic_get_irq(struct pic_ops *, int);
+static void	uic_ack_irq(struct pic_ops *, int);
+static void	uic_establish_irq(struct pic_ops *, int, int, int);
+
+struct uic {
+	uint32_t uic_intr_enable;	/* cached intr enable mask */
+	uint32_t (*uic_mf_intr_status)(void);
+	uint32_t (*uic_mf_intr_enable)(void);
+	void (*uic_mt_intr_enable)(uint32_t);
+	void (*uic_mt_intr_ack)(uint32_t);
+};
+
+/*
+ * Platform specific code may override any of the above.
+ */
+#ifdef PPC_IBM403
+
+#include <powerpc/ibm4xx/dcr403cgx.h>
+
+static uint32_t
+uic403_mfdcr_intr_status(void)
+{
+	return mfdcr(DCR_EXISR);
+}
+
+static uint32_t
+uic403_mfdcr_intr_enable(void)
+{
+	return mfdcr(DCR_EXIER);
+}
+
+static void
+uic403_mtdcr_intr_ack(uint32_t v)
+{
+	mtdcr(DCR_EXISR, v);
+}
+
+static void
+uic403_mtdcr_intr_enable(uint32_t v)
+{
+	mtdcr(DCR_EXIER, v);
+}
+
+struct uic uic403 = {
+	.uic_intr_enable =	0,
+	.uic_mf_intr_status =	uic403_mfdcr_intr_status,
+	.uic_mf_intr_enable =	uic403_mfdcr_intr_enable,
+	.uic_mt_intr_enable =	uic403_mtdcr_intr_enable,
+	.uic_mt_intr_ack =	uic403_mtdcr_intr_ack,
+};
+
+struct pic_ops pic_uic403 = {
+	.pic_cookie = &uic403,
+	.pic_numintrs = 32,
+	.pic_enable_irq = uic_enable_irq,
+	.pic_reenable_irq = uic_enable_irq,
+	.pic_disable_irq = uic_disable_irq,
+	.pic_establish_irq = uic_establish_irq,
+	.pic_get_irq = uic_get_irq,
+	.pic_ack_irq = uic_ack_irq,
+	.pic_finish_setup = NULL,
+	.pic_name = "uic0"
+};
+
+#else /* Generic 405/440/460 Universal Interrupt Controller */
+
+#include <powerpc/ibm4xx/dcr4xx.h>
+
+#include "opt_uic.h"
+
+/* 405EP/405GP/405GPr/Virtex-4 */
+
+static uint32_t
+uic0_mfdcr_intr_status(void)
+{
+	return mfdcr(DCR_UIC0_BASE + DCR_UIC_MSR);
+}
+
+static uint32_t
+uic0_mfdcr_intr_enable(void)
+{
+	return mfdcr(DCR_UIC0_BASE + DCR_UIC_ER);
+}
+
+static void
+uic0_mtdcr_intr_ack(uint32_t v)
+{
+	mtdcr(DCR_UIC0_BASE + DCR_UIC_SR, v);
+}
+
+static void
+uic0_mtdcr_intr_enable(uint32_t v)
+{
+	mtdcr(DCR_UIC0_BASE + DCR_UIC_ER, v);
+}
+
+struct uic uic0 = {
+	.uic_intr_enable =	0,
+	.uic_mf_intr_status =	uic0_mfdcr_intr_status,
+	.uic_mf_intr_enable =	uic0_mfdcr_intr_enable,
+	.uic_mt_intr_enable =	uic0_mtdcr_intr_enable,
+	.uic_mt_intr_ack =	uic0_mtdcr_intr_ack,
+};
+
+struct pic_ops pic_uic0 = {
+	.pic_cookie = &uic0,
+	.pic_numintrs = 32,
+	.pic_enable_irq = uic_enable_irq,
+	.pic_reenable_irq = uic_enable_irq,
+	.pic_disable_irq = uic_disable_irq,
+	.pic_establish_irq = uic_establish_irq,
+	.pic_get_irq = uic_get_irq,
+	.pic_ack_irq = uic_ack_irq,
+	.pic_finish_setup = NULL,
+	.pic_name = "uic0"
+};
+
+#ifdef MULTIUIC
+
+/* 440EP/440GP/440SP/405EX/440SPe/440GX */
+
+static uint32_t
+uic1_mfdcr_intr_status(void)
+{
+	return mfdcr(DCR_UIC1_BASE + DCR_UIC_MSR);
+}
+
+static uint32_t
+uic1_mfdcr_intr_enable(void)
+{
+	return mfdcr(DCR_UIC1_BASE + DCR_UIC_ER);
+}
+
+static void
+uic1_mtdcr_intr_ack(uint32_t v)
+{
+	mtdcr(DCR_UIC1_BASE + DCR_UIC_SR, v);
+}
+
+static void
+uic1_mtdcr_intr_enable(uint32_t v)
+{
+	mtdcr(DCR_UIC1_BASE + DCR_UIC_ER, v);
+}
+
+extern struct pic_ops pic_uic1;
+
+static void
+uic1_finish_setup(struct pic_ops *pic)
+{
+	intr_establish(30, IPL_NONE, IST_LEVEL, pic_handle_intr, &pic_uic1);
+}
+
+struct uic uic1 = {
+	.uic_intr_enable =	0,
+	.uic_mf_intr_status =	uic1_mfdcr_intr_status,
+	.uic_mf_intr_enable =	uic1_mfdcr_intr_enable,
+	.uic_mt_intr_enable =	uic1_mtdcr_intr_enable,
+	.uic_mt_intr_ack =	uic1_mtdcr_intr_ack,
+};
+
+struct pic_ops pic_uic1 = {
+	.pic_cookie = &uic1,
+	.pic_numintrs = 32,
+	.pic_enable_irq = uic_enable_irq,
+	.pic_reenable_irq = uic_enable_irq,
+	.pic_disable_irq = uic_disable_irq,
+	.pic_establish_irq = uic_establish_irq,
+	.pic_get_irq = uic_get_irq,
+	.pic_ack_irq = uic_ack_irq,
+	.pic_finish_setup = uic1_finish_setup,
+	.pic_name = "uic1"
+};
+
+/* 440EP/440GP/440SP/405EX/440SPe */
+
+static uint32_t
+uic2_mfdcr_intr_status(void)
+{
+	return mfdcr(DCR_UIC2_BASE + DCR_UIC_MSR);
+}
+
+static uint32_t
+uic2_mfdcr_intr_enable(void)
+{
+	return mfdcr(DCR_UIC2_BASE + DCR_UIC_ER);
+}
+
+static void
+uic2_mtdcr_intr_ack(uint32_t v)
+{
+	mtdcr(DCR_UIC2_BASE + DCR_UIC_SR, v);
+}
+
+static void
+uic2_mtdcr_intr_enable(uint32_t v)
+{
+	mtdcr(DCR_UIC2_BASE + DCR_UIC_ER, v);
+}
+
+extern struct pic_ops pic_uic2;
+
+static void
+uic2_finish_setup(struct pic_ops *pic)
+{
+	intr_establish(28, IPL_NONE, IST_LEVEL, pic_handle_intr, &pic_uic2);
+}
+
+static struct uic uic2 = {
+	.uic_intr_enable =	0,
+	.uic_mf_intr_status =	uic2_mfdcr_intr_status,
+	.uic_mf_intr_enable =	uic2_mfdcr_intr_enable,
+	.uic_mt_intr_enable =	uic2_mtdcr_intr_enable,
+	.uic_mt_intr_ack =	uic2_mtdcr_intr_ack,
+};
+
+struct pic_ops pic_uic2 = {
+	.pic_cookie = &uic2,
+	.pic_numintrs = 32,
+	.pic_enable_irq = uic_enable_irq,
+	.pic_reenable_irq = uic_enable_irq,
+	.pic_disable_irq = uic_disable_irq,
+	.pic_establish_irq = uic_establish_irq,
+	.pic_get_irq = uic_get_irq,
+	.pic_ack_irq = uic_ack_irq,
+	.pic_finish_setup = uic2_finish_setup,
+	.pic_name = "uic2"
+};
+
+#endif /* MULTIUIC */
+#endif /* !PPC_IBM403 */
+
+/* Write External Enable Immediate */
+#define	wrteei(en) 		__asm volatile ("wrteei %0" : : "K"(en))
+
+/* Enforce In Order Execution of I/O */
+#define	eieio() 		__asm volatile ("eieio")
+
+/*
+ * Set up interrupt mapping array.
+ */
+void
+intr_init(void)
+{
+#ifdef PPC_IBM403
+	struct pic_ops * const pic = &pic_uic403;
+#else
+	struct pic_ops * const pic = &pic_uic0;
+#endif
+	struct uic * const uic = pic->pic_cookie;
+
+	uic->uic_mt_intr_enable(0x00000000); 	/* mask all */
+	uic->uic_mt_intr_ack(0xffffffff);	/* acknowledge all */
+
+	pic_add(pic);
+}
+
+static void
+uic_disable_irq(struct pic_ops *pic, int irq)
+{
+	struct uic * const uic = pic->pic_cookie;
+	const uint32_t irqmask = IRQ_TO_MASK(irq);
+	if ((uic->uic_intr_enable & irqmask) == 0)
+		return;
+	uic->uic_intr_enable ^= irqmask;
+	(*uic->uic_mt_intr_enable)(uic->uic_intr_enable);
+#ifdef IRQ_DEBUG
+	printf("%s: %s: irq=%d, mask=%08x\n", __func__,
+	    pic->pic_name, irq, irqmask);
+#endif
+}
+
+static void
+uic_enable_irq(struct pic_ops *pic, int irq, int type)
+{
+	struct uic * const uic = pic->pic_cookie;
+	const uint32_t irqmask = IRQ_TO_MASK(irq);
+	if ((uic->uic_intr_enable & irqmask) != 0)
+		return;
+	uic->uic_intr_enable ^= irqmask;
+	(*uic->uic_mt_intr_enable)(uic->uic_intr_enable);
+#ifdef IRQ_DEBUG
+	printf("%s: %s: irq=%d, mask=%08x\n", __func__,
+	    pic->pic_name, irq, irqmask);
+#endif
+}
+
+static void
+uic_ack_irq(struct pic_ops *pic, int irq)
+{
+	struct uic * const uic = pic->pic_cookie;
+	const uint32_t irqmask = IRQ_TO_MASK(irq);
+
+	(*uic->uic_mt_intr_ack)(irqmask);
+}
+
+static int
+uic_get_irq(struct pic_ops *pic, int dummy)
+{
+	struct uic * const uic = pic->pic_cookie;
+
+	const uint32_t irqmask = (*uic->uic_mf_intr_status)();
+	if (irqmask == 0)
+		return 255;
+	return IRQ_OF_MASK(irqmask);
+}
+
+/*
+ * Register an interrupt handler.
+ */
+static void
+uic_establish_irq(struct pic_ops *pic, int irq, int type, int ipl)
+{
+}

Reply via email to