Date: Tue, 28 Aug 2007 17:09:30 GMT From: Rafal Jaworowski <raj@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 125785 for review Message-ID: <200708281709.l7SH9UOj006614@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125785 Change 125785 by raj@raj_booke_intgr on 2007/08/28 17:09:26 Cleanup after the IFC Move AIM files from sys/powerpc/powerpc to sys/powerpc/aim, minor other cleanups so as to let GENERIC (AIM) kernel build again. Affected files ... .. //depot/projects/e500/sys/powerpc/aim/interrupt.c#3 edit .. //depot/projects/e500/sys/powerpc/aim/nexus.c#3 edit .. //depot/projects/e500/sys/powerpc/aim/trap.c#4 edit .. //depot/projects/e500/sys/powerpc/aim/uio_machdep.c#3 edit .. //depot/projects/e500/sys/powerpc/aim/vm_machdep.c#4 edit .. //depot/projects/e500/sys/powerpc/powerpc/clock.c#4 delete .. //depot/projects/e500/sys/powerpc/powerpc/interrupt.c#4 delete .. //depot/projects/e500/sys/powerpc/powerpc/machdep.c#6 delete .. //depot/projects/e500/sys/powerpc/powerpc/nexus.c#4 delete .. //depot/projects/e500/sys/powerpc/powerpc/trap.c#4 delete .. //depot/projects/e500/sys/powerpc/powerpc/uio_machdep.c#4 delete .. //depot/projects/e500/sys/powerpc/powerpc/vm_machdep.c#4 delete .. //depot/projects/e500/sys/powerpc/psim/iobus.c#3 edit Differences ... ==== //depot/projects/e500/sys/powerpc/aim/interrupt.c#3 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/powerpc/powerpc/interrupt.c,v 1.5 2005/12/22 22:16:08 jhb Exp $ + * $FreeBSD: src/sys/powerpc/powerpc/interrupt.c,v 1.8 2007/08/11 19:25:32 marcel Exp $ */ /* @@ -49,30 +49,20 @@ #include <sys/vmmeter.h> #include <machine/cpu.h> +#include <machine/clock.h> #include <machine/db_machdep.h> #include <machine/fpu.h> #include <machine/frame.h> +#include <machine/intr_machdep.h> +#include <machine/md_var.h> #include <machine/pcb.h> #include <machine/psl.h> #include <machine/trap.h> #include <machine/spr.h> #include <machine/sr.h> -#include <machine/interruptvar.h> -void powerpc_interrupt(struct trapframe *); - -/* - * External interrupt install routines - */ -static void (*powerpc_extintr_handler)(void); - -void -ext_intr_install(void (*new_extint)(void)) -{ - powerpc_extintr_handler = new_extint; -} +#include "pic_if.h" -extern void decr_intr(struct trapframe *); extern void trap(struct trapframe *); /* @@ -83,14 +73,15 @@ void powerpc_interrupt(struct trapframe *framep) { - struct thread *td; + struct thread *td; + register_t ee; td = curthread; switch (framep->exc) { case EXC_EXI: atomic_add_int(&td->td_intr_nesting_level, 1); - (*powerpc_extintr_handler)(); + PIC_DISPATCH(pic, framep); atomic_subtract_int(&td->td_intr_nesting_level, 1); break; @@ -101,14 +92,12 @@ break; default: - /* - * Re-enable interrupts and call the generic trap code - */ -#if 0 - printf("powerpc_interrupt: got trap\n"); - mtmsr(mfmsr() | PSL_EE); - isync(); -#endif + /* Re-enable interrupts if applicable. */ + ee = framep->srr1 & PSL_EE; + if (ee != 0) { + mtmsr(mfmsr() | ee); + isync(); + } trap(framep); } } ==== //depot/projects/e500/sys/powerpc/aim/nexus.c#3 (text+ko) ==== @@ -52,7 +52,7 @@ * * from: FreeBSD: src/sys/i386/i386/nexus.c,v 1.43 2001/02/09 * - * $FreeBSD: src/sys/powerpc/powerpc/nexus.c,v 1.14 2007/04/20 03:24:59 grehan Exp $ + * $FreeBSD: src/sys/powerpc/powerpc/nexus.c,v 1.15 2007/08/11 19:25:32 marcel Exp $ */ #include "opt_psim.h" @@ -97,7 +97,7 @@ }; struct nexus_softc { - device_t sc_pic; + struct rman sc_rman; }; /* @@ -182,12 +182,24 @@ phandle_t root; phandle_t child; struct nexus_softc *sc; + u_long start, end; if ((root = OF_peer(0)) == -1) panic("nexus_probe: OF_peer failed."); sc = device_get_softc(dev); + start = 0; + end = INTR_VECTORS - 1; + + sc->sc_rman.rm_start = start; + sc->sc_rman.rm_end = end; + sc->sc_rman.rm_type = RMAN_ARRAY; + sc->sc_rman.rm_descr = "Interrupt request lines"; + if (rman_init(&sc->sc_rman) || + rman_manage_region(&sc->sc_rman, start, end)) + panic("nexus_probe IRQ rman"); + /* * Allow devices to identify */ @@ -302,31 +314,40 @@ static int nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, - driver_filter_t *filter, driver_intr_t *intr, void *arg, void **cookiep) + driver_filter_t *filter, driver_intr_t *ihand, void *arg, void **cookiep) { - struct nexus_softc *sc; + driver_t *driver; + int error; + + /* somebody tried to setup an irq that failed to allocate! */ + if (res == NULL) + panic("nexus_setup_intr: NULL irq resource!"); + + *cookiep = 0; + if ((rman_get_flags(res) & RF_SHAREABLE) == 0) + flags |= INTR_EXCL; + + driver = device_get_driver(child); - sc = device_get_softc(dev); + /* + * We depend here on rman_activate_resource() being idempotent. + */ + error = rman_activate_resource(res); + if (error) + return (error); - if (device_get_state(sc->sc_pic) != DS_ATTACHED) - panic("nexus_setup_intr: no pic attached\n"); + error = powerpc_setup_intr(device_get_nameunit(child), + rman_get_start(res), filter, ihand, arg, flags, cookiep); - return (PIC_SETUP_INTR(sc->sc_pic, child, res, flags, filter, intr, - arg, cookiep)); + return (error); } static int nexus_teardown_intr(device_t dev, device_t child, struct resource *res, - void *ih) + void *cookie) { - struct nexus_softc *sc; - sc = device_get_softc(dev); - - if (device_get_state(sc->sc_pic) != DS_ATTACHED) - panic("nexus_teardown_intr: no pic attached\n"); - - return (PIC_TEARDOWN_INTR(sc->sc_pic, child, res, ih)); + return (powerpc_teardown_intr(cookie)); } /* @@ -337,10 +358,8 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { - struct nexus_softc *sc; - struct resource *rv; - - sc = device_get_softc(bus); + struct nexus_softc *sc; + struct resource *rv; if (type != SYS_RES_IRQ) { device_printf(bus, "unknown resource request from %s\n", @@ -348,10 +367,21 @@ return (NULL); } - if (device_get_state(sc->sc_pic) != DS_ATTACHED) - panic("nexus_alloc_resource: no pic attached\n"); + if (count == 0 || start + count - 1 != end) { + device_printf(bus, "invalid IRQ allocation from %s\n", + device_get_nameunit(child)); + return (NULL); + } + + sc = device_get_softc(bus); - rv = PIC_ALLOCATE_INTR(sc->sc_pic, child, rid, start, flags); + rv = rman_reserve_resource(&sc->sc_rman, start, end, count, + flags, child); + if (rv == NULL) { + device_printf(bus, "IRQ allocation failed for %s\n", + device_get_nameunit(child)); + } else + rman_set_rid(rv, *rid); return (rv); } @@ -378,20 +408,14 @@ nexus_release_resource(device_t bus, device_t child, int type, int rid, struct resource *res) { - struct nexus_softc *sc; - sc = device_get_softc(bus); - if (type != SYS_RES_IRQ) { device_printf(bus, "unknown resource request from %s\n", device_get_nameunit(child)); return (EINVAL); } - if (device_get_state(sc->sc_pic) != DS_ATTACHED) - panic("nexus_release_resource: no pic attached\n"); - - return (PIC_RELEASE_INTR(sc->sc_pic, child, rid, res)); + return (rman_release_resource(res)); } static device_t @@ -418,17 +442,6 @@ return (cdev); } -int -nexus_install_intcntlr(device_t dev) -{ - struct nexus_softc *sc; - - sc = device_get_softc(device_get_parent(dev)); - sc->sc_pic = dev; - - return (0); -} - static const char * nexus_ofw_get_name(device_t bus, device_t dev) { ==== //depot/projects/e500/sys/powerpc/aim/trap.c#4 (text+ko) ==== @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/trap.c,v 1.64 2007/03/09 04:02:37 mohans Exp $"); +__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/trap.c,v 1.67 2007/08/07 18:40:02 marcel Exp $"); #include "opt_ktrace.h" @@ -433,8 +433,8 @@ } switch (error) { case 0: - if ((frame->fixreg[0] == SYS___syscall) && - (code != SYS_lseek)) { + if (frame->fixreg[0] == SYS___syscall && + code != SYS_freebsd6_lseek && code != SYS_lseek) { /* * 64-bit return, 32-bit syscall. Fixup byte order */ ==== //depot/projects/e500/sys/powerpc/aim/uio_machdep.c#3 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/uio_machdep.c,v 1.6 2006/12/05 04:01:52 grehan Exp $"); +__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/uio_machdep.c,v 1.7 2007/06/09 21:55:16 marcel Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -49,7 +49,7 @@ #include <vm/vm.h> #include <vm/vm_page.h> -#include <machine/cpu.h> +#include <machine/md_var.h> #include <machine/vmparam.h> /* ==== //depot/projects/e500/sys/powerpc/aim/vm_machdep.c#4 (text+ko) ==== @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $FreeBSD: src/sys/powerpc/powerpc/vm_machdep.c,v 1.113 2006/12/28 23:56:50 marcel Exp $ + * $FreeBSD: src/sys/powerpc/powerpc/vm_machdep.c,v 1.115 2007/06/06 06:01:56 grehan Exp $ */ /*- * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. @@ -154,7 +154,7 @@ pcb->pcb_lr = (register_t)fork_trampoline; pcb->pcb_usr = kernel_pmap->pm_sr[USER_SR]; - /* Setup to release sched_lock in fork_exit(). */ + /* Setup to release spin count in fork_exit(). */ td2->td_md.md_spinlock_count = 1; td2->td_md.md_saved_msr = PSL_KERNSET; @@ -327,7 +327,7 @@ pcb2->pcb_lr = (register_t)fork_trampoline; pcb2->pcb_usr = kernel_pmap->pm_sr[USER_SR]; - /* Setup to release sched_lock in fork_exit(). */ + /* Setup to release spin count in fork_exit(). */ td->td_md.md_spinlock_count = 1; td->td_md.md_saved_msr = PSL_KERNSET; } ==== //depot/projects/e500/sys/powerpc/psim/iobus.c#3 (text+ko) ==== @@ -311,7 +311,6 @@ int needactivate; struct resource *rv; struct rman *rm; - bus_space_tag_t tagval; sc = device_get_softc(bus);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708281709.l7SH9UOj006614>