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)
+{
+}