summaryrefslogtreecommitdiffstats
path: root/sys/alpha/mcbus/mcpcia.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/alpha/mcbus/mcpcia.c')
-rw-r--r--sys/alpha/mcbus/mcpcia.c99
1 files changed, 59 insertions, 40 deletions
diff --git a/sys/alpha/mcbus/mcpcia.c b/sys/alpha/mcbus/mcpcia.c
index 0712261..2a229b3 100644
--- a/sys/alpha/mcbus/mcpcia.c
+++ b/sys/alpha/mcbus/mcpcia.c
@@ -73,7 +73,7 @@ struct mcpcia_softc {
vm_offset_t io_base; /* sparse i/o */
int mcpcia_inst; /* our mcpcia instance # */
struct swiz_space io_space; /* accessor for ports */
- struct swiz_space mem_space; /* accessor for memory */
+ struct swiz_space mem_space; /* accessor for memory */
struct rman io_rman; /* resource manager for ports */
struct rman mem_rman; /* resource manager for memory */
};
@@ -261,63 +261,82 @@ mcpcia_disable_intr(struct mcpcia_softc *sc, int irq)
static void
mcpcia_disable_intr_vec(int vector)
{
- int gid, mid, irq;
- vm_offset_t p;
+ int mid, irq;
+ struct mcpcia_softc *sc = mcpcia_root;
+
+ if (vector < MCPCIA_VEC_PCI) {
+ printf("EISA isable (0x%x)\n", vector);
+ return;
+ }
- printf("D<%03x>", vector);
if (vector == MCPCIA_VEC_NCR) {
mid = 5;
irq = 16;
} else {
+ int tmp, slot;
+ tmp = vector - MCPCIA_VEC_PCI;
+ mid = (tmp / MCPCIA_VECWIDTH_PER_MCPCIA) + 4;
+ tmp &= (MCPCIA_VECWIDTH_PER_MCPCIA - 1);
+ slot = tmp / MCPCIA_VECWIDTH_PER_SLOT;
+ if (slot < 2 || slot > 5) {
+ printf("Bad slot (%d) for vector %x\n", slot, vector);
+ return;
+ }
+ tmp -= (2 * MCPCIA_VECWIDTH_PER_SLOT);
+ irq = (tmp / MCPCIA_VECWIDTH_PER_INTPIN);
irq = ((vector - 0x900) >> 4) - 8;
- if (irq < 32)
- mid = 4;
- else {
- irq -= 32;
- mid = 5;
+ }
+ printf("D<%03x>=%d,%d\n", vector, mid, irq);
+ while (sc) {
+ if (mcbus_get_mid(sc->dev) == mid) {
+ break;
}
+ sc = sc->next;
}
-
- gid = MCBUS_GID_FROM_INSTANCE(0);
- p = (MCBUS_IOSPACE |
- (((u_int64_t) gid) << MCBUS_GID_SHIFT) |
- (((u_int64_t) mid) << MCBUS_MID_SHIFT) |
- MCPCIA_PCI_BRIDGE |
- _MCPCIA_INT_MASK0);
-
- alpha_mb();
- REGVAL(p) &= ~(1 << irq);
- alpha_mb();
+ if (sc == NULL) {
+ panic("couldn't find MCPCIA softc for vector 0x%x", vector);
+ }
+ mcpcia_disable_intr(sc, irq);
}
static void
mcpcia_enable_intr_vec(int vector)
{
- int gid, mid, irq;
- vm_offset_t p;
+ int mid, irq;
+ struct mcpcia_softc *sc = mcpcia_root;
+
+ if (vector < MCPCIA_VEC_PCI) {
+ printf("EISA ensable (0x%x)\n", vector);
+ return;
+ }
- printf("E<%03x>", vector);
if (vector == MCPCIA_VEC_NCR) {
mid = 5;
irq = 16;
} else {
- irq = ((vector - 0x900) >> 4) - 8;
- if (irq < 32)
- mid = 4;
- else
- mid = 5;
+ int tmp, slot;
+ tmp = vector - MCPCIA_VEC_PCI;
+ mid = (tmp / MCPCIA_VECWIDTH_PER_MCPCIA) + 4;
+ tmp &= (MCPCIA_VECWIDTH_PER_MCPCIA - 1);
+ slot = tmp / MCPCIA_VECWIDTH_PER_SLOT;
+ if (slot < 2 || slot > 5) {
+ printf("Bad slot (%d) for vector %x\n", slot, vector);
+ return;
+ }
+ tmp -= (2 * MCPCIA_VECWIDTH_PER_SLOT);
+ irq = (tmp / MCPCIA_VECWIDTH_PER_INTPIN);
}
-
- gid = MCBUS_GID_FROM_INSTANCE(0);
- p = (MCBUS_IOSPACE |
- (((u_int64_t) gid) << MCBUS_GID_SHIFT) |
- (((u_int64_t) mid) << MCBUS_MID_SHIFT) |
- MCPCIA_PCI_BRIDGE |
- _MCPCIA_INT_MASK0);
-
- alpha_mb();
- REGVAL(p) |= (1 << irq);
- alpha_mb();
+ printf("E<%03x>=%d,%d\n", vector, mid, irq);
+ while (sc) {
+ if (mcbus_get_mid(sc->dev) == mid) {
+ break;
+ }
+ sc = sc->next;
+ }
+ if (sc == NULL) {
+ panic("couldn't find MCPCIA softc for vector 0x%x", vector);
+ }
+ mcpcia_enable_intr(sc, irq);
}
static int
@@ -343,7 +362,7 @@ mcpcia_setup_intr(device_t dev, device_t child, struct resource *ir, int flags,
if (slot == 0) {
device_t bdev;
- /* bridged - get slot from granparent */
+ /* bridged - get slot from grandparent */
/* note that this is broken for all but the most trival case */
bdev = device_get_parent(device_get_parent(child));
slot = pci_get_slot(bdev);
OpenPOWER on IntegriCloud