> Regarding your diff.  The approach seems reasonable to me.  The magic
> number in the gscbus.c doesn't fill me with joy.
> 
> > +           r[4] = cpu_gethpa(0) | (31 - irqbit);   /* iar */
> 
> I realise you're following existing practice, but maybe you could you
> add a gscbus_reg struct similar to what was used in the asp/lasi/wax
> code and use that?

I agree this wouldn't hurt, but then, locore uses hardcoded numbers
because these offsets don't end up in genassym.cf.

Oh well, some partial cleanup can't hurt.

New diff - also, because the interrupt assignments at gsc are actually
local to gsc interrupt controllers, there is no need to reverse the
order of cpu_intr_findirq(). The "irq" mention in dmesg is a bit
misleading, but fixing that would require the print function to be
passed to pdc_scanbus() and it's a bit out of scope of these changes.

Index: conf/GENERIC
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/conf/GENERIC,v
retrieving revision 1.175
diff -u -p -r1.175 GENERIC
--- conf/GENERIC        14 Feb 2018 23:51:49 -0000      1.175
+++ conf/GENERIC        3 May 2018 17:08:26 -0000
@@ -46,21 +46,19 @@ uturn0      at mainbus0             # U2/UTurn Runway IO
 uturn1 at mainbus0
 astro* at mainbus0             # Astro memory & I/O controller
 
-lasi0  at mainbus0 offset 0x100000 irq 28      # LASI host adapter
-lasi0  at mainbus0 offset 0xfd00000 irq 28     # LASI on C1[01]0, J2[01]0
-lasi0  at phantomas0 offset 0xfd00000 irq 28   # LASI on [AB]*
-lasi0  at uturn? offset 0xfd00000 irq 28       # LASI on [CJ]*
-lasi1  at mainbus0 offset 0x500000 irq 27      # 712 GIO card
-asp*   at mainbus0 irq 28      # this one comes w/ Viper and LEDs
-wax*   at mainbus0 irq 24      # Wax may host EISA as well
-wax*   at phantomas0 irq 24    # Wax on [AB]*
-wax*   at uturn? irq 24        # Wax on C*
+lasi0  at mainbus0 offset 0x100000             # LASI host adapter
+lasi0  at mainbus0 offset 0xfd00000            # LASI on C1[01]0, J2[01]0
+lasi0  at phantomas0 offset 0xfd00000          # LASI on [AB]*
+lasi0  at uturn? offset 0xfd00000              # LASI on [CJ]*
+lasi1  at mainbus0 offset 0x500000             # 712 GIO card
+asp*   at mainbus0             # this one comes w/ Viper and LEDs
+wax*   at mainbus0             # Wax may host EISA as well
+wax*   at phantomas0           # Wax on [AB]*
+wax*   at uturn?               # Wax on C*
 mongoose* at mainbus0 irq 17   # EISA Bus Adapter (i82350 or TI???)
 #vmeb* at mainbus0 irq ?       # VME bus adapter
-dino0  at phantomas? irq 26    # PCI bus bridge on [AB]*
-dino1  at phantomas? irq 25
-dino0  at uturn0 irq 26        # PCI bus bridge on [CJ]*
-dino1  at uturn1 irq 25
+dino*  at phantomas?           # PCI bus bridge on [AB]*
+dino*  at uturn?               # PCI bus bridge on [CJ]*
 pci*   at dino?
 option PCIVERBOSE
 #pckbc0        at dino? irq 9
@@ -176,12 +174,9 @@ onewire* at uow?
 udl*   at uhub?                # DisplayLink USB displays
 wsdisplay* at udl?
 
-sti0   at mainbus0 irq 11      # [H]CRX-{8,24,48}[Z] graphics
-sti0   at phantomas0 irq 11    # builtin graphics on BC*
-sti0   at uturn? irq 11
-sti1   at mainbus0 irq 12
-sti1   at phantomas0 irq 12
-sti1   at uturn? irq 12
+sti*   at mainbus0             # [H]CRX-{8,24,48}[Z] graphics
+sti*   at phantomas0           # builtin graphics on BC*
+sti*   at uturn?
 sti*   at pci?                 # EG-PCI, FX*
 
 # internal i/o space
Index: conf/RAMDISK
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/conf/RAMDISK,v
retrieving revision 1.109
diff -u -p -r1.109 RAMDISK
--- conf/RAMDISK        30 Dec 2016 22:36:07 -0000      1.109
+++ conf/RAMDISK        3 May 2018 17:08:26 -0000
@@ -48,20 +48,18 @@ uturn0              at mainbus0             # U2/UTurn 
Runway I
 uturn1         at mainbus0
 astro*         at mainbus0             # Astro memory & I/O controller
 
-lasi0          at mainbus0 offset 0x100000 irq 28      # LASI host adapter
-lasi0          at mainbus0 offset 0xfd00000 irq 28     # LASI on C1[01]0, 
J2[01]0
-lasi0          at phantomas0 offset 0xfd00000 irq 28   # LASI on [AB]*
-lasi0          at uturn? offset 0xfd00000 irq 28       # LASI on [CJ]*
-lasi1          at mainbus0 offset 0x500000 irq 27      # 712 GIO card
-asp*           at mainbus0 irq 28      # this one comes w/ Viper and LEDs
-wax*           at mainbus0 irq 24      # Wax may host EISA as well
-wax*           at phantomas0 irq 24    # Wax on [AB]*
-wax*           at uturn? irq 24        # Wax on C*
+lasi0          at mainbus0 offset 0x100000     # LASI host adapter
+lasi0          at mainbus0 offset 0xfd00000    # LASI on C1[01]0, J2[01]0
+lasi0          at phantomas0 offset 0xfd00000  # LASI on [AB]*
+lasi0          at uturn? offset 0xfd00000      # LASI on [CJ]*
+lasi1          at mainbus0 offset 0x500000     # 712 GIO card
+asp*           at mainbus0             # this one comes w/ Viper and LEDs
+wax*           at mainbus0             # Wax may host EISA as well
+wax*           at phantomas0           # Wax on [AB]*
+wax*           at uturn?               # Wax on C*
 mongoose*      at mainbus0 irq 17      # EISA Bus Adapter (i82350 or TI???)
-dino0          at phantomas? irq 26    # PCI bus bridge on [AB]*
-dino1          at phantomas? irq 25
-dino0          at uturn0 irq 26        # PCI bus bridge on [CJ]*
-dino1          at uturn1 irq 25
+dino*          at phantomas?           # PCI bus bridge on [AB]*
+dino*          at uturn0               # PCI bus bridge on [CJ]*
 pci*           at dino?
 com1           at dino? irq 11
 
@@ -112,12 +110,9 @@ ugl*               at uhub?                # Genesys Logic 
GL620USB
 wi*            at uhub?                # WaveLAN IEEE 802.11DS
 ural*          at uhub?                # Ralink RT2500
 
-sti0           at mainbus0 irq 11      # [H]CRX-{8,24,48}[Z] graphics
-sti0           at phantomas0 irq 11    # builtin graphics on BC*
-sti0           at uturn? irq 11
-sti1           at mainbus0 irq 12
-sti1           at phantomas0 irq 12
-sti1           at uturn? irq 12
+sti*           at mainbus0             # [H]CRX-{8,24,48}[Z] graphics
+sti*           at phantomas0           # builtin graphics on BC*
+sti*           at uturn?
 sti*           at pci?                 # EG-PCI, FX*
 
 gsc0           at asp?                 # Snakes, old 715, old 725, 735/755
Index: dev/apic.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/dev/apic.c,v
retrieving revision 1.18
diff -u -p -r1.18 apic.c
--- dev/apic.c  8 Sep 2015 07:14:04 -0000       1.18
+++ dev/apic.c  3 May 2018 17:08:26 -0000
@@ -134,8 +134,10 @@ apic_intr_map(struct pci_attach_args *pa
            PCI_INTERRUPT_LINE(reg));
 #endif
        line = PCI_INTERRUPT_LINE(reg);
-       if (sc->sc_irq[line] == 0)
-               sc->sc_irq[line] = cpu_intr_findirq();
+       if (sc->sc_irq[line] <= 0) {
+               if ((sc->sc_irq[line] = cpu_intr_findirq()) == -1)
+                       return 1;
+       }
        *ihp = (line << APIC_INT_LINE_SHIFT) | sc->sc_irq[line];
        return (APIC_INT_IRQ(*ihp) == 0);
 }
Index: dev/asp.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/dev/asp.c,v
retrieving revision 1.14
diff -u -p -r1.14 asp.c
--- dev/asp.c   9 Jun 2005 18:01:36 -0000       1.14
+++ dev/asp.c   3 May 2018 17:08:26 -0000
@@ -45,7 +45,6 @@
 #include <machine/cpufunc.h>
 
 #include <hppa/dev/cpudevs.h>
-#include <hppa/dev/viper.h>
 
 #include <hppa/gsc/gscbusvar.h>
 
@@ -60,14 +59,9 @@ struct asp_hwr {
 };
 
 struct asp_trs {
-       u_int32_t asp_irr;
-       u_int32_t asp_imr;
-       u_int32_t asp_ipr;
-       u_int32_t asp_icr;
-       u_int32_t asp_iar;
-       u_int32_t asp_resv[3];
+       struct gscbus_ic asp_ic;
        u_int8_t  asp_cled;
-       u_int8_t  asp_resv1[3];
+       u_int8_t  asp_resv[3];
        struct {
                u_int           :20,
                        asp_spu : 3,    /* SPU ID board jumper */
@@ -111,14 +105,6 @@ const struct asp_spus_tag {
        { "#7", 0 }
 };
 
-struct asp_softc {
-       struct  device sc_dev;
-       struct gscbus_ic sc_ic;
-
-       volatile struct asp_hwr *sc_hw;
-       volatile struct asp_trs *sc_trs;
-};
-
 #define        ASP_IOMASK      0xfe000000
 /* ASP "Primary Controller" HPA */
 #define        ASP_CHPA        0xF0800000
@@ -126,8 +112,8 @@ struct asp_softc {
 int    aspmatch(struct device *, void *, void *);
 void   aspattach(struct device *, struct device *, void *);
 
-struct cfattach asp_ca = {
-       sizeof(struct asp_softc), aspmatch, aspattach
+const struct cfattach asp_ca = {
+       sizeof(struct device), aspmatch, aspattach
 };
 
 struct cfdriver asp_cd = {
@@ -156,45 +142,41 @@ aspattach(parent, self, aux)
        struct device *self;
        void *aux;
 {
-       register struct confargs *ca = aux;
-       register struct asp_softc *sc = (struct asp_softc *)self;
+       struct confargs *ca = aux;
+       volatile struct asp_trs *trs;
+       volatile struct asp_hwr *hw;
+       struct gscbus_ic *ic;
        struct gsc_attach_args ga;
        bus_space_handle_t ioh;
-       register u_int32_t irr;
-       register int s;
+       int s;
 
        if (bus_space_map(ca->ca_iot, ca->ca_hpa, IOMOD_HPASIZE, 0, &ioh)) {
                printf(": can't map IO space\n");
                return;
        }
 
-       sc->sc_trs = (struct asp_trs *)ASP_CHPA;
-       sc->sc_hw = (struct asp_hwr *)ca->ca_hpa;
+       hw = (struct asp_hwr *)ca->ca_hpa;
+       trs = (struct asp_trs *)ASP_CHPA;
+       ic = (struct gscbus_ic *)&trs->asp_ic;
 
 #ifdef USELEDS
-       machine_ledaddr = &sc->sc_trs->asp_cled;
-       machine_ledword = asp_spus[sc->sc_trs->asp_spu].ledword;
+       machine_ledaddr = &trs->asp_cled;
+       machine_ledword = asp_spus[trs->asp_spu].ledword;
 #endif
 
        /* reset ASP */
-       /* sc->sc_hw->asp_reset = 1; */
+       /* hw->asp_reset = 1; */
        /* delay(400000); */
 
        s = splhigh();
-       viper_setintrwnd(1 << ca->ca_irq);
-
-       sc->sc_trs->asp_imr = ~0;
-       irr = sc->sc_trs->asp_irr;
-       sc->sc_trs->asp_imr = 0;
+       ic->imr = ~0;
+       (void)ic->irr;
+       ic->imr = 0;
        splx(s);
 
        printf (": %s rev %d, lan %d scsi %d\n",
-           asp_spus[sc->sc_trs->asp_spu].name, sc->sc_hw->asp_version,
-           sc->sc_trs->asp_lan, sc->sc_trs->asp_scsi);
-
-       sc->sc_ic.gsc_type = gsc_asp;
-       sc->sc_ic.gsc_dv = sc;
-       sc->sc_ic.gsc_base = sc->sc_trs;
+           asp_spus[trs->asp_spu].name, hw->asp_version,
+           trs->asp_lan, trs->asp_scsi);
 
        ga.ga_ca = *ca; /* clone from us */
        ga.ga_dp.dp_bc[0] = ga.ga_dp.dp_bc[1];
@@ -206,6 +188,7 @@ aspattach(parent, self, aux)
        ga.ga_dp.dp_mod = 0;
        ga.ga_hpamask = ASP_IOMASK;
        ga.ga_name = "gsc";
-       ga.ga_ic = &sc->sc_ic;
+       ga.ga_parent = gsc_asp;
+       ga.ga_ic = ic;
        config_found(self, &ga, gscprint);
 }
Index: dev/dino.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/dev/dino.c,v
retrieving revision 1.31
diff -u -p -r1.31 dino.c
--- dev/dino.c  29 Mar 2014 18:09:29 -0000      1.31
+++ dev/dino.c  3 May 2018 17:08:26 -0000
@@ -394,7 +394,7 @@ dino_intr_string(void *v, pci_intr_handl
 {
        static char buf[32];
 
-       snprintf(buf, 32, "irq %ld", ih);
+       snprintf(buf, 32, "dino irq %ld", ih);
 
        return (buf);
 }
@@ -1681,7 +1681,7 @@ dinoattach(parent, self, aux)
        volatile struct dino_regs *r;
        const char *p = NULL;
        u_int data;
-       int s;
+       int s, irqbit;
 
        sc->sc_bt = ca->ca_iot;
        sc->sc_dmat = ca->ca_dmatag;
@@ -1731,20 +1731,6 @@ dinoattach(parent, self, aux)
 
        /* TODO reserve dino's pci space ? */
 
-       s = splhigh();
-       r->imr = ~0;
-       data = r->irr0;
-       data = r->irr1;
-       r->imr = 0;
-       __asm volatile ("" ::: "memory");
-       r->icr = 0;
-       r->iar0 = cpu_gethpa(0) | (31 - ca->ca_irq);
-       splx(s);
-
-       sc->sc_ih = cpu_intr_establish(IPL_NESTED, ca->ca_irq,
-           dino_intr, (void *)sc->sc_regs, sc->sc_dv.dv_xname);
-       /* TODO establish the bus error interrupt */
-
        sc->sc_ver = ca->ca_type.iodc_revision;
        switch ((ca->ca_type.iodc_model << 4) |
            (ca->ca_type.iodc_revision >> 4)) {
@@ -1774,8 +1760,39 @@ dinoattach(parent, self, aux)
                break;
        }
 
+       irqbit = cpu_intr_findirq();
+       if (irqbit >= 0)
+               printf(" irq %d", irqbit);
+
        printf(": %s V%d.%d\n", p, sc->sc_ver >> 4, sc->sc_ver & 0xf);
 
+       s = splhigh();
+       r->imr = ~0;
+       data = r->irr0;
+       data = r->irr1;
+       r->imr = 0;
+       __asm volatile ("" ::: "memory");
+       r->icr = 0;
+       if (irqbit >= 0)
+               r->iar0 = cpu_gethpa(0) | (31 - irqbit);
+       splx(s);
+
+       if (irqbit < 0)
+               sc->sc_ih = NULL;
+       else
+               sc->sc_ih = cpu_intr_establish(IPL_NESTED, irqbit,
+                   dino_intr, (void *)sc->sc_regs, sc->sc_dv.dv_xname);
+       if (sc->sc_ih == NULL) {
+               printf("%s: can't establish interrupt\n", sc->sc_dv.dv_xname);
+               return;
+       }
+
+       /* TODO establish the bus error interrupt */
+
+       /* scan for ps2 kbd/ms, serial, and flying toasters */
+       ca->ca_hpamask = -1;
+       pdc_scanbus(self, ca, MAXMODBUS, 0, 0);
+
        sc->sc_iot = dino_iomemt;
        sc->sc_iot.hbt_cookie = sc;
        sc->sc_iot.hbt_map = dino_iomap;
@@ -1788,10 +1805,6 @@ dinoattach(parent, self, aux)
        sc->sc_pc._cookie = sc;
        sc->sc_dmatag = dino_dmat;
        sc->sc_dmatag._cookie = sc;
-
-       /* scan for ps2 kbd/ms, serial, and flying toasters */
-       ca->ca_hpamask = -1;
-       pdc_scanbus(self, ca, MAXMODBUS, 0, 0);
 
        bzero(&pba, sizeof(pba));
        pba.pba_busname = "pci";
Index: dev/lasi.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/dev/lasi.c,v
retrieving revision 1.22
diff -u -p -r1.22 lasi.c
--- dev/lasi.c  15 Sep 2004 20:11:28 -0000      1.22
+++ dev/lasi.c  3 May 2018 17:08:26 -0000
@@ -54,27 +54,17 @@ struct lasi_hwr {
        u_int32_t lasi_arbmask;
 };
 
-struct lasi_trs {
-       u_int32_t lasi_irr;     /* int requset register */
-       u_int32_t lasi_imr;     /* int mask register */
-       u_int32_t lasi_ipr;     /* int pending register */
-       u_int32_t lasi_icr;     /* int command? register */
-       u_int32_t lasi_iar;     /* int acquire? register */
-};
-
 struct lasi_softc {
        struct device sc_dev;
-       struct gscbus_ic sc_ic;
 
        struct lasi_hwr volatile *sc_hw;
-       struct lasi_trs volatile *sc_trs;
        struct gsc_attach_args ga;      /* for deferred attach */
 };
 
 int    lasimatch(struct device *, void *, void *);
 void   lasiattach(struct device *, struct device *, void *);
 
-struct cfattach lasi_ca = {
+const struct cfattach lasi_ca = {
        sizeof(struct lasi_softc), lasimatch, lasiattach
 };
 
@@ -91,8 +81,8 @@ lasimatch(parent, cfdata, aux)   
        void *cfdata;
        void *aux;
 {
-       register struct confargs *ca = aux;
-       /* register struct cfdata *cf = cfdata; */
+       struct confargs *ca = aux;
+       /* struct cfdata *cf = cfdata; */
 
        if (ca->ca_type.iodc_type != HPPA_TYPE_BHA ||
            ca->ca_type.iodc_sv_model != HPPA_BHA_LASI)
@@ -109,8 +99,9 @@ lasiattach(parent, self, aux)
 {
        struct lasi_softc *sc = (struct lasi_softc *)self;
        struct confargs *ca = aux;
+       struct gscbus_ic *ic;
        bus_space_handle_t ioh, ioh2;
-       int s, in;
+       int s;
 
        if (bus_space_map(ca->ca_iot, ca->ca_hpa,
            IOMOD_HPASIZE, 0, &ioh)) {
@@ -125,8 +116,8 @@ lasiattach(parent, self, aux)
                return;
        }
 
-       sc->sc_trs = (struct lasi_trs *)ca->ca_hpa;
        sc->sc_hw = (struct lasi_hwr *)(ca->ca_hpa + 0xc000);
+       ic = (struct gscbus_ic *)ca->ca_hpa;
 
        /* XXX should we reset the chip here? */
 
@@ -135,17 +126,13 @@ lasiattach(parent, self, aux)
 
        /* interrupts guts */
        s = splhigh();
-       sc->sc_trs->lasi_iar = cpu_gethpa(0) | (31 - ca->ca_irq);
-       sc->sc_trs->lasi_icr = 0;
-       sc->sc_trs->lasi_imr = ~0U;
-       in = sc->sc_trs->lasi_irr;
-       sc->sc_trs->lasi_imr = 0;
+       ic->iar = 0; /* will be set up by gsc when attaching */
+       ic->icr = 0;
+       ic->imr = ~0U;
+       (void)ic->irr;
+       ic->imr = 0;
        splx(s);
 
-       sc->sc_ic.gsc_type = gsc_lasi;
-       sc->sc_ic.gsc_dv = sc;
-       sc->sc_ic.gsc_base = sc->sc_trs;
-
 #ifdef USELEDS
        /* figure out the leds address */
        switch (cpu_hvers) {
@@ -203,6 +190,10 @@ lasiattach(parent, self, aux)
                sc->ga.ga_dp.dp_bc[5] = sc->ga.ga_dp.dp_mod;
                sc->ga.ga_dp.dp_mod = 0;
        }
+       sc->ga.ga_name = "gsc";
+       sc->ga.ga_hpamask = LASI_IOMASK;
+       sc->ga.ga_parent = gsc_lasi;
+       sc->ga.ga_ic = ic;
        if (sc->sc_dev.dv_unit)
                config_defer(self, lasi_gsc_attach);
        else {
@@ -221,9 +212,6 @@ lasi_gsc_attach(self)
 {
        struct lasi_softc *sc = (struct lasi_softc *)self;
 
-       sc->ga.ga_name = "gsc";
-       sc->ga.ga_hpamask = LASI_IOMASK;
-       sc->ga.ga_ic = &sc->sc_ic;
        config_found(self, &sc->ga, gscprint);
 }
 
@@ -231,7 +219,7 @@ void
 lasi_cold_hook(on)
        int on;
 {
-       register struct lasi_softc *sc = lasi_cd.cd_devs[0];
+       struct lasi_softc *sc = lasi_cd.cd_devs[0];
 
        if (!sc)
                return;
Index: dev/wax.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/dev/wax.c,v
retrieving revision 1.10
diff -u -p -r1.10 wax.c
--- dev/wax.c   8 Nov 2004 20:53:25 -0000       1.10
+++ dev/wax.c   3 May 2018 17:08:26 -0000
@@ -40,27 +40,12 @@
 
 #define        WAX_IOMASK      0xfff00000
 
-struct wax_regs {
-       u_int32_t wax_irr;      /* int request register */
-       u_int32_t wax_imr;      /* int mask register */
-       u_int32_t wax_ipr;      /* int pending register */
-       u_int32_t wax_icr;      /* int command? register */
-       u_int32_t wax_iar;      /* int acquire? register */
-};
-
-struct wax_softc {
-       struct device sc_dv;
-       struct gscbus_ic sc_ic;
-
-       struct wax_regs volatile *sc_regs;
-};
-
 int    waxmatch(struct device *, void *, void *);
 void   waxattach(struct device *, struct device *, void *);
 void   wax_gsc_attach(struct device *);
 
-struct cfattach wax_ca = {
-       sizeof(struct wax_softc), waxmatch, waxattach
+const struct cfattach wax_ca = {
+       sizeof(struct device), waxmatch, waxattach
 };
 
 struct cfdriver wax_cd = {
@@ -91,34 +76,29 @@ waxattach(parent, self, aux)
        struct device *self;
        void *aux;
 {
-       struct wax_softc *sc = (struct wax_softc *)self;
        struct confargs *ca = aux;
        struct gsc_attach_args ga;
+       struct gscbus_ic *ic;
        bus_space_handle_t ioh;
-       int s, in;
+       int s;
 
        if (bus_space_map(ca->ca_iot, ca->ca_hpa, IOMOD_HPASIZE, 0, &ioh)) {
                printf(": can't map IO space\n");
                return;
        }
 
-       sc->sc_regs = (struct wax_regs *)ca->ca_hpa;
-
        printf("\n");
 
        /* interrupts guts */
+       ic = (struct gscbus_ic *)ca->ca_hpa;
        s = splhigh();
-       sc->sc_regs->wax_iar = cpu_gethpa(0) | (31 - ca->ca_irq);
-       sc->sc_regs->wax_icr = 0;
-       sc->sc_regs->wax_imr = ~0U;
-       in = sc->sc_regs->wax_irr;
-       sc->sc_regs->wax_imr = 0;
+       ic->iar = 0; /* will be set up by gsc when attaching */
+       ic->icr = 0;
+       ic->imr = ~0U;
+       (void)ic->irr;
+       ic->imr = 0;
        splx(s);
 
-       sc->sc_ic.gsc_type = gsc_wax;
-       sc->sc_ic.gsc_dv = sc;
-       sc->sc_ic.gsc_base = sc->sc_regs;
-
        ga.ga_ca = *ca; /* clone from us */
        if (!strcmp(parent->dv_xname, "mainbus0")) {
                ga.ga_dp.dp_bc[0] = ga.ga_dp.dp_bc[1];
@@ -132,6 +112,8 @@ waxattach(parent, self, aux)
 
        ga.ga_name = "gsc";
        ga.ga_hpamask = WAX_IOMASK;
-       ga.ga_ic = &sc->sc_ic;
+       ga.ga_parent = gsc_wax;
+       ga.ga_ic = ic;
+
        config_found(self, &ga, gscprint);
 }
Index: gsc/gscbus.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/gsc/gscbus.c,v
retrieving revision 1.30
diff -u -p -r1.30 gscbus.c
--- gsc/gscbus.c        28 Nov 2010 20:09:40 -0000      1.30
+++ gsc/gscbus.c        3 May 2018 17:08:26 -0000
@@ -38,13 +38,14 @@
 #include <machine/iomod.h>
 #include <machine/autoconf.h>
 #include <machine/cpufunc.h>
+#include <hppa/dev/viper.h>
 
 #include <hppa/gsc/gscbusvar.h>
 
 int    gscmatch(struct device *, void *, void *);
 void   gscattach(struct device *, struct device *, void *);
 
-struct cfattach gsc_ca = {
+const struct cfattach gsc_ca = {
        sizeof(struct gsc_softc), gscmatch, gscattach
 };
 
@@ -71,18 +72,41 @@ gscattach(parent, self, aux)
 {
        struct gsc_softc *sc = (struct gsc_softc *)self;
        struct gsc_attach_args *ga = aux;
+       int s, irqbit;
 
        sc->sc_iot = ga->ga_iot;
        sc->sc_ic = ga->ga_ic;
 
+       irqbit = cpu_intr_findirq();
+       if (irqbit >= 0)
+               printf(" irq %d", irqbit);
+
 #ifdef USELEDS
        if (machine_ledaddr)
                printf(": %sleds", machine_ledword? "word" : "");
 #endif
        printf ("\n");
 
-       sc->sc_ih = cpu_intr_establish(IPL_NESTED, ga->ga_irq,
-           gsc_intr, (void *)sc->sc_ic->gsc_base, sc->sc_dev.dv_xname);
+       if (irqbit < 0)
+               sc->sc_ih = NULL;
+       else
+               sc->sc_ih = cpu_intr_establish(IPL_NESTED, irqbit,
+                   gsc_intr, (void *)sc->sc_ic, sc->sc_dev.dv_xname);
+       if (sc->sc_ih == NULL) {
+               printf("%s: can't establish interrupt\n", sc->sc_dev.dv_xname);
+               return;
+       }
+
+       /*
+        * On ASP, the IAR register is not writable; we need to go through
+        * the memory controller to achieve proper routing.
+        */
+       s = splhigh();
+       if (ga->ga_parent == gsc_asp)
+               viper_setintrwnd(1 << irqbit);
+       else
+               sc->sc_ic->iar = cpu_gethpa(0) | (31 - irqbit);
+       splx(s);
 
        pdc_scanbus(self, &ga->ga_ca, MAXMODBUS, 0, 0);
 }
@@ -108,11 +132,10 @@ gsc_intr_establish(sc, irq, pri, handler
        void *arg;
        const char *name;
 {
-       volatile u_int32_t *r = sc->sc_ic->gsc_base;
        void *iv;
 
        if ((iv = cpu_intr_map(sc->sc_ih, pri, irq, handler, arg, name)))
-               r[1] |= (1 << irq);
+               sc->sc_ic->imr |= (1 << irq);
        else {
 #ifdef GSCDEBUG
                printf("%s: attaching irq %d, already occupied\n",
@@ -129,9 +152,7 @@ gsc_intr_disestablish(sc, v)
        void *v;
 {
 #if notyet
-       volatile u_int32_t *r = sc->sc_ic->gsc_base;
-
-       r[1] &= ~(1 << irq);
+       sc->sc_ic->imr &= ~(1 << irq);
 
        cpu_intr_unmap(sc->sc_ih, v);
 #endif
Index: gsc/gscbusvar.h
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/gsc/gscbusvar.h,v
retrieving revision 1.14
diff -u -p -r1.14 gscbusvar.h
--- gsc/gscbusvar.h     28 Nov 2010 20:09:40 -0000      1.14
+++ gsc/gscbusvar.h     3 May 2018 17:08:26 -0000
@@ -26,10 +26,16 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+/*
+ * Layout of the interrupt registers, part of the parent bus.
+ */
 struct gscbus_ic {
-       enum {gsc_unknown = 0, gsc_lasi, gsc_wax, gsc_asp} gsc_type;
-       void *gsc_dv;
-       volatile void *gsc_base;
+       volatile u_int32_t irr; /* int request register */
+       volatile u_int32_t imr; /* int mask register */
+       volatile u_int32_t ipr; /* int pending register */
+       volatile u_int32_t icr; /* int control register */
+       volatile u_int32_t iar; /* int address register */
+       volatile u_int32_t rsvd[3];
 };
 
 struct gsc_attach_args {
@@ -43,6 +49,7 @@ struct gsc_attach_args {
 #define        ga_dmatag       ga_ca.ca_dmatag
 #define        ga_irq          ga_ca.ca_irq
 #define        ga_pdc_iodc_read        ga_ca.ca_pdc_iodc_read
+       enum { gsc_unknown = 0, gsc_asp, gsc_lasi, gsc_wax } ga_parent;
        struct gscbus_ic *ga_ic;        /* IC pointer */
 }; 
 
Index: hppa/intr.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/hppa/intr.c,v
retrieving revision 1.49
diff -u -p -r1.49 intr.c
--- hppa/intr.c 13 Sep 2015 14:58:20 -0000      1.49
+++ hppa/intr.c 3 May 2018 17:08:26 -0000
@@ -134,6 +134,10 @@ cpu_intr_init(void)
        ssm(PSL_I, mask);
 }
 
+/*
+ * Find an available, non-shared interrupt bit.
+ * Returns -1 if all interrupt bits are in use.
+ */
 int
 cpu_intr_findirq(void)
 {
Index: hppa/mainbus.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/hppa/hppa/mainbus.c,v
retrieving revision 1.87
diff -u -p -r1.87 mainbus.c
--- hppa/mainbus.c      13 Sep 2015 11:40:01 -0000      1.87
+++ hppa/mainbus.c      3 May 2018 17:08:26 -0000
@@ -1238,7 +1238,7 @@ mbattach(parent, self, aux)
 }
 
 /*
- * retrive CPU #N HPA value
+ * Retrieve CPU #N HPA value
  */
 hppa_hpa_t
 cpu_gethpa(n)

Reply via email to