From owner-svn-src-user@FreeBSD.ORG Sun Dec 22 00:22:58 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id A6EE1F2E; Sun, 22 Dec 2013 00:22:58 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 873641E9C; Sun, 22 Dec 2013 00:22:58 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id rBM0Mwqu081241; Sun, 22 Dec 2013 00:22:58 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id rBM0Mvil081237; Sun, 22 Dec 2013 00:22:57 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201312220022.rBM0Mvil081237@svn.freebsd.org> From: Nathan Whitehorn Date: Sun, 22 Dec 2013 00:22:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r259704 - user/nwhitehorn/mips_pic_if/mips/atheros X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Dec 2013 00:22:58 -0000 Author: nwhitehorn Date: Sun Dec 22 00:22:57 2013 New Revision: 259704 URL: http://svnweb.freebsd.org/changeset/base/259704 Log: Speculative conversion of AR71XX to pic_if. Compile-tested only. Modified: user/nwhitehorn/mips_pic_if/mips/atheros/apb.c user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c Modified: user/nwhitehorn/mips_pic_if/mips/atheros/apb.c ============================================================================== --- user/nwhitehorn/mips_pic_if/mips/atheros/apb.c Sun Dec 22 00:08:20 2013 (r259703) +++ user/nwhitehorn/mips_pic_if/mips/atheros/apb.c Sun Dec 22 00:22:57 2013 (r259704) @@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include "pic_if.h" + #define APB_INTR_PMC 5 #undef APB_DEBUG @@ -73,15 +75,10 @@ static int apb_filter(void *); static int apb_probe(device_t); static int apb_release_resource(device_t, device_t, int, int, struct resource *); -static int apb_setup_intr(device_t, device_t, struct resource *, int, - driver_filter_t *, driver_intr_t *, void *, void **); -static int apb_teardown_intr(device_t, device_t, struct resource *, - void *); static void -apb_mask_irq(void *source) +apb_mask_irq(device_t dev, u_int irq) { - unsigned int irq = (unsigned int)source; uint32_t reg; reg = ATH_READ_REG(AR71XX_MISC_INTR_MASK); @@ -90,10 +87,9 @@ apb_mask_irq(void *source) } static void -apb_unmask_irq(void *source) +apb_unmask_irq(device_t dev, u_int irq) { uint32_t reg; - unsigned int irq = (unsigned int)source; reg = ATH_READ_REG(AR71XX_MISC_INTR_MASK); ATH_WRITE_REG(AR71XX_MISC_INTR_MASK, reg | (1 << irq)); @@ -144,6 +140,9 @@ apb_attach(device_t dev) return (ENXIO); } + /* Register this interrupt domain */ + mips_register_pic(dev, APB_PIC_ID, APB_NIRQS, 0); + bus_generic_probe(dev); bus_enumerate_hinted_children(dev); bus_generic_attach(dev); @@ -151,8 +150,7 @@ apb_attach(device_t dev) /* * Unmask performance counter IRQ */ - apb_unmask_irq((void*)APB_INTR_PMC); - sc->sc_intr_counter[APB_INTR_PMC] = mips_intrcnt_create("apb irq5: pmc"); + apb_unmask_irq(dev, APB_INTR_PMC); return (0); } @@ -278,73 +276,24 @@ apb_release_resource(device_t dev, devic return (0); } -static int -apb_setup_intr(device_t bus, device_t child, struct resource *ires, - int flags, driver_filter_t *filt, driver_intr_t *handler, - void *arg, void **cookiep) +static void +apb_enable_irq(device_t bus, u_int irq, u_int vector) { struct apb_softc *sc = device_get_softc(bus); - struct intr_event *event; - int irq, error; - - irq = rman_get_start(ires); if (irq > APB_IRQ_END) panic("%s: bad irq %d", __func__, irq); - event = sc->sc_eventstab[irq]; - if (event == NULL) { - error = intr_event_create(&event, (void *)irq, 0, irq, - apb_mask_irq, apb_unmask_irq, - NULL, NULL, - "apb intr%d:", irq); - - if (error == 0) { - sc->sc_eventstab[irq] = event; - sc->sc_intr_counter[irq] = - mips_intrcnt_create(event->ie_name); - } - else - return (error); - } + sc->sc_eventstab[irq] = vector; - intr_event_add_handler(event, device_get_nameunit(child), filt, - handler, arg, intr_priority(flags), flags, cookiep); - mips_intrcnt_setname(sc->sc_intr_counter[irq], event->ie_fullname); - - apb_unmask_irq((void*)irq); - - return (0); -} - -static int -apb_teardown_intr(device_t dev, device_t child, struct resource *ires, - void *cookie) -{ - struct apb_softc *sc = device_get_softc(dev); - int irq, result; - - irq = rman_get_start(ires); - if (irq > APB_IRQ_END) - panic("%s: bad irq %d", __func__, irq); - - if (sc->sc_eventstab[irq] == NULL) - panic("Trying to teardown unoccupied IRQ"); - - apb_mask_irq((void*)irq); - - result = intr_event_remove_handler(cookie); - if (!result) - sc->sc_eventstab[irq] = NULL; - - return (result); + apb_unmask_irq(bus, irq); } static int apb_filter(void *arg) { struct apb_softc *sc = arg; - struct intr_event *event; + u_int vector; uint32_t reg, irq; struct thread *td; struct trapframe *tf; @@ -371,27 +320,18 @@ apb_filter(void *arg) break; } - event = sc->sc_eventstab[irq]; - if (!event || TAILQ_EMPTY(&event->ie_handlers)) { - if (irq == APB_INTR_PMC) { - td = PCPU_GET(curthread); - tf = td->td_intr_frame; - - if (pmc_intr) - (*pmc_intr)(PCPU_GET(cpuid), tf); - - mips_intrcnt_inc(sc->sc_intr_counter[irq]); - - continue; - } - /* Ignore timer interrupts */ - if (irq != 0) - printf("Stray APB IRQ %d\n", irq); + vector = sc->sc_eventstab[irq]; + if (irq == APB_INTR_PMC) { + td = PCPU_GET(curthread); + tf = td->td_intr_frame; + + if (pmc_intr) + (*pmc_intr)(PCPU_GET(cpuid), tf); + continue; } - intr_event_handle(event, PCPU_GET(curthread)->td_intr_frame); - mips_intrcnt_inc(sc->sc_intr_counter[irq]); + mips_dispatch_intr(vector, NULL); } } @@ -433,7 +373,8 @@ apb_hinted_child(device_t bus, const cha } if (resource_int_value(dname, dunit, "irq", &irq) == 0) { - result = bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1); + result = bus_set_resource(child, SYS_RES_IRQ, 0, + mips_get_irq(APB_PIC_ID, irq), 1); if (result != 0) device_printf(bus, "warning: bus_set_resource() failed\n"); @@ -485,13 +426,18 @@ static device_method_t apb_methods[] = { DEVMETHOD(bus_get_resource_list, apb_get_resource_list), DEVMETHOD(bus_hinted_child, apb_hinted_child), DEVMETHOD(bus_release_resource, apb_release_resource), - DEVMETHOD(bus_setup_intr, apb_setup_intr), - DEVMETHOD(bus_teardown_intr, apb_teardown_intr), DEVMETHOD(device_attach, apb_attach), DEVMETHOD(device_probe, apb_probe), + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), + /* PIC interface */ + DEVMETHOD(pic_enable, apb_enable_irq), + DEVMETHOD(pic_mask, apb_mask_irq), + DEVMETHOD(pic_unmask, apb_unmask_irq), + DEVMETHOD_END }; Modified: user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h ============================================================================== --- user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h Sun Dec 22 00:08:20 2013 (r259703) +++ user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h Sun Dec 22 00:22:57 2013 (r259704) @@ -31,16 +31,15 @@ #define APB_IRQ_BASE 0 #define APB_IRQ_END 7 #define APB_NIRQS 8 +#define APB_PIC_ID 0x100 /* FDT-ize? */ struct apb_softc { struct rman apb_irq_rman; struct rman apb_mem_rman; - /* IRQ events structs for child devices */ - struct intr_event *sc_eventstab[APB_NIRQS]; - mips_intrcnt_t sc_intr_counter[APB_NIRQS]; /* Resources and cookies for MIPS CPU INTs */ struct resource *sc_misc_irq; void *sc_misc_ih; + u_int sc_eventstab[APB_NIRQS]; }; struct apb_ivar { Modified: user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c ============================================================================== --- user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c Sun Dec 22 00:08:20 2013 (r259703) +++ user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c Sun Dec 22 00:22:57 2013 (r259704) @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include "pcib_if.h" +#include "pic_if.h" #include #include @@ -77,6 +78,8 @@ struct mtx ar71xx_pci_mtx; MTX_SYSINIT(ar71xx_pci_mtx, &ar71xx_pci_mtx, "ar71xx PCI space mutex", MTX_SPIN); +#define AR71XX_PCI_PIC_ID 0x200 + struct ar71xx_pci_softc { device_t sc_dev; @@ -85,23 +88,17 @@ struct ar71xx_pci_softc { struct rman sc_mem_rman; struct rman sc_irq_rman; - struct intr_event *sc_eventstab[AR71XX_PCI_NIRQS]; - mips_intrcnt_t sc_intr_counter[AR71XX_PCI_NIRQS]; + u_int sc_eventstab[AR71XX_PCI_NIRQS]; struct resource *sc_irq; void *sc_ih; }; -static int ar71xx_pci_setup_intr(device_t, device_t, struct resource *, int, - driver_filter_t *, driver_intr_t *, void *, void **); -static int ar71xx_pci_teardown_intr(device_t, device_t, struct resource *, - void *); static int ar71xx_pci_intr(void *); static void -ar71xx_pci_mask_irq(void *source) +ar71xx_pci_mask_irq(device_t dev, u_int irq) { uint32_t reg; - unsigned int irq = (unsigned int)source; /* XXX is the PCI lock required here? */ reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK); @@ -111,10 +108,9 @@ ar71xx_pci_mask_irq(void *source) } static void -ar71xx_pci_unmask_irq(void *source) +ar71xx_pci_unmask_irq(device_t dev, u_int irq) { uint32_t reg; - unsigned int irq = (unsigned int)source; /* XXX is the PCI lock required here? */ reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK); @@ -463,6 +459,9 @@ ar71xx_pci_attach(device_t dev) #endif /* AR71XX_ATH_EEPROM */ device_add_child(dev, "pci", busno); + + mips_register_pic(dev, AR71XX_PCI_PIC_ID, AR71XX_PCI_NIRQS, 0); + return (bus_generic_attach(dev)); } @@ -553,72 +552,23 @@ ar71xx_pci_activate_resource(device_t bu return (res); } -static int -ar71xx_pci_setup_intr(device_t bus, device_t child, struct resource *ires, - int flags, driver_filter_t *filt, driver_intr_t *handler, - void *arg, void **cookiep) +static void +ar71xx_pci_enable_intr(device_t bus, u_int irq, u_int vector) { struct ar71xx_pci_softc *sc = device_get_softc(bus); - struct intr_event *event; - int irq, error; - - irq = rman_get_start(ires); - - if (irq > AR71XX_PCI_IRQ_END) - panic("%s: bad irq %d", __func__, irq); - - event = sc->sc_eventstab[irq]; - if (event == NULL) { - error = intr_event_create(&event, (void *)irq, 0, irq, - ar71xx_pci_mask_irq, ar71xx_pci_unmask_irq, NULL, NULL, - "pci intr%d:", irq); - - if (error == 0) { - sc->sc_eventstab[irq] = event; - sc->sc_intr_counter[irq] = - mips_intrcnt_create(event->ie_name); - } - else - return (error); - } - intr_event_add_handler(event, device_get_nameunit(child), filt, - handler, arg, intr_priority(flags), flags, cookiep); - mips_intrcnt_setname(sc->sc_intr_counter[irq], event->ie_fullname); - - ar71xx_pci_unmask_irq((void*)irq); - - return (0); -} - -static int -ar71xx_pci_teardown_intr(device_t dev, device_t child, struct resource *ires, - void *cookie) -{ - struct ar71xx_pci_softc *sc = device_get_softc(dev); - int irq, result; - - irq = rman_get_start(ires); if (irq > AR71XX_PCI_IRQ_END) panic("%s: bad irq %d", __func__, irq); - if (sc->sc_eventstab[irq] == NULL) - panic("Trying to teardown unoccupied IRQ"); - - ar71xx_pci_mask_irq((void*)irq); + sc->sc_eventstab[irq] = vector; - result = intr_event_remove_handler(cookie); - if (!result) - sc->sc_eventstab[irq] = NULL; - - return (result); + ar71xx_pci_unmask_irq(bus, irq); } static int ar71xx_pci_intr(void *arg) { struct ar71xx_pci_softc *sc = arg; - struct intr_event *event; uint32_t reg, irq, mask; reg = ATH_READ_REG(AR71XX_PCI_INTR_STATUS); @@ -629,20 +579,11 @@ ar71xx_pci_intr(void *arg) reg &= mask; for (irq = AR71XX_PCI_IRQ_START; irq <= AR71XX_PCI_IRQ_END; irq++) { if (reg & (1 << irq)) { - event = sc->sc_eventstab[irq]; - if (!event || TAILQ_EMPTY(&event->ie_handlers)) { - /* Ignore timer interrupts */ - if (irq != 0) - printf("Stray IRQ %d\n", irq); - continue; - } - /* Flush DDR FIFO for IP2 */ ar71xx_device_ddr_flush_ip2(); /* TODO: frame instead of NULL? */ - intr_event_handle(event, NULL); - mips_intrcnt_inc(sc->sc_intr_counter[irq]); + mips_dispatch_intr(sc->sc_eventstab[irq], NULL); } } @@ -665,7 +606,8 @@ ar71xx_pci_route_interrupt(device_t pcib panic("%s: PCI slot %d is less then AR71XX_PCI_BASE_SLOT", __func__, pci_get_slot(device)); - return (pci_get_slot(device) - sc->sc_baseslot); + return (mips_get_irq(AR71XX_PCI_PIC_ID, pci_get_slot(device) - + sc->sc_baseslot)); } static device_method_t ar71xx_pci_methods[] = { @@ -683,8 +625,8 @@ static device_method_t ar71xx_pci_method DEVMETHOD(bus_release_resource, bus_generic_release_resource), DEVMETHOD(bus_activate_resource, ar71xx_pci_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), - DEVMETHOD(bus_setup_intr, ar71xx_pci_setup_intr), - DEVMETHOD(bus_teardown_intr, ar71xx_pci_teardown_intr), + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), /* pcib interface */ DEVMETHOD(pcib_maxslots, ar71xx_pci_maxslots), @@ -692,6 +634,11 @@ static device_method_t ar71xx_pci_method DEVMETHOD(pcib_write_config, ar71xx_pci_write_config), DEVMETHOD(pcib_route_interrupt, ar71xx_pci_route_interrupt), + /* PIC interface */ + DEVMETHOD(pic_enable, ar71xx_pci_enable_intr), + DEVMETHOD(pic_mask, ar71xx_pci_mask_irq), + DEVMETHOD(pic_unmask, ar71xx_pci_unmask_irq), + DEVMETHOD_END };