summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorticso <ticso@FreeBSD.org>2005-02-10 00:35:31 +0000
committerticso <ticso@FreeBSD.org>2005-02-10 00:35:31 +0000
commit8f2098faebcc09bcb77d5b60dd5436d2942927ea (patch)
treecc96aa828b3eb303916ce8cc009ac37dc4c52692
parent89a577e7b418e8029e0ca74c20fd14276cc79e61 (diff)
downloadFreeBSD-src-8f2098faebcc09bcb77d5b60dd5436d2942927ea.zip
FreeBSD-src-8f2098faebcc09bcb77d5b60dd5436d2942927ea.tar.gz
Implement interrupt routing for DEC_KN20AA.
Tested by: wilko MFC after: 2 weeks
-rw-r--r--sys/alpha/alpha/dec_kn20aa.c57
1 files changed, 22 insertions, 35 deletions
diff --git a/sys/alpha/alpha/dec_kn20aa.c b/sys/alpha/alpha/dec_kn20aa.c
index 714bbf9..d4d01d0 100644
--- a/sys/alpha/alpha/dec_kn20aa.c
+++ b/sys/alpha/alpha/dec_kn20aa.c
@@ -51,7 +51,7 @@ __FBSDID("$FreeBSD$");
void dec_kn20aa_init(void);
static void dec_kn20aa_cons_init(void);
static void dec_kn20aa_intr_init(void);
-static void dec_kn20aa_intr_map(void *);
+static int dec_kn20aa_intr_route(device_t pcib, device_t dev, int pin);
static void dec_kn20aa_intr_disable(int);
static void dec_kn20aa_intr_enable(int);
@@ -81,7 +81,7 @@ dec_kn20aa_init()
platform.iobus = "cia";
platform.cons_init = dec_kn20aa_cons_init;
platform.pci_intr_init = dec_kn20aa_intr_init;
- platform.pci_intr_map = dec_kn20aa_intr_map;
+ platform.pci_intr_route = dec_kn20aa_intr_route;
platform.pci_intr_disable = dec_kn20aa_intr_disable;
platform.pci_intr_enable = dec_kn20aa_intr_enable;
}
@@ -242,58 +242,45 @@ dec_kn20aa_intr_init()
dec_kn20aa_intr_enable(31);
}
-void
-dec_kn20aa_intr_map(void *arg)
+static int
+dec_kn20aa_intr_route(device_t pcib, device_t dev, int pin)
{
- pcicfgregs *cfg;
+ int irq = 255;
+ int slot = pci_get_slot(dev);
- cfg = (pcicfgregs *)arg;
- /*
- * Slot->interrupt translation. Appears to work, though it
- * may not hold up forever.
- *
- * The DEC engineers who did this hardware obviously engaged
- * in random drug testing.
- */
- switch (cfg->slot) {
+ switch (slot) {
case 11:
+ irq = pin - 1;
+ break;
+
case 12:
- cfg->intline = ((cfg->slot - 11) + 0) * 4;
+ irq = 4 + pin - 1;
break;
case 7:
- cfg->intline = 8;
+ irq = 8 + pin - 1;
break;
- case 9:
- cfg->intline = 12;
+ case 9: /* slot on AlphaStation 600 only */
+ irq = 12 + pin - 1;
break;
- case 6: /* 21040 on AlphaStation 500 */
- cfg->intline = 13;
+ case 8:
+ irq = 16 + pin - 1;
break;
- case 8:
- cfg->intline = 16;
+ case 6: /* 21040 on AlphaStation 500 */
+ if (pin == 1)
+ irq = 13;
break;
case 10: /* 8275EB on AlphaStation 500 */
- return;
+ break;
default:
- if(!cfg->bus){
- printf("dec_kn20aa_intr_map: weird slot %d\n",
- cfg->slot);
- return;
- } else {
- cfg->intline = cfg->slot;
- }
+ printf("dec_kn20aa_intr_route: weird slot %d\n", slot);
}
-
- cfg->intline += cfg->bus*16;
- if (cfg->intline > KN20AA_MAX_IRQ)
- panic("dec_kn20aa_intr_map: cfg->intline too large (%d)\n",
- cfg->intline);
+ return (irq);
}
void
OpenPOWER on IntegriCloud