summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/mp.c
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-05-16 01:28:41 +0000
committeraiju <aiju@phicode.de>2011-05-16 01:28:41 +0000
commit2e1fcabe9ee43afebf096cc0044fff06b5867b06 (patch)
tree032304884d0a6228ea32ac59e8682677bc59928c /sys/src/9/pc/mp.c
parent266e791298a30748fd930c5c460bc4d3b2c7f961 (diff)
improved interrupt vector allocation code
Diffstat (limited to 'sys/src/9/pc/mp.c')
-rw-r--r--sys/src/9/pc/mp.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/sys/src/9/pc/mp.c b/sys/src/9/pc/mp.c
index 77ac729ec..9aff6ebe5 100644
--- a/sys/src/9/pc/mp.c
+++ b/sys/src/9/pc/mp.c
@@ -705,6 +705,24 @@ mpintrcpu(void)
return mpapic[i].apicno;
}
+/* hardcoded VectorAPIC and stuff. bad. */
+static int
+allocvector(void)
+{
+ static int round = 0, num = 1;
+ static Lock l;
+ int vno;
+
+ lock(&l);
+ if(num >= 24) {
+ if(++round >= 8) round = 0;
+ num = 1;
+ }
+ vno = 64 + num++ * 8 + round;
+ unlock(&l);
+ return vno;
+}
+
static int
mpintrenablex(Vctl* v, int tbdf)
{
@@ -806,13 +824,7 @@ mpintrenablex(Vctl* v, int tbdf)
* vector regardless of whether the devices on that pin use
* the same IRQ as devices on another pin.
*/
- vno = VectorAPIC + (incref(&mpvnoref)-1)*8;
-//print("%s vector %d (imask)\n", v->name, vno);
- if(vno > MaxVectorAPIC){
- print("mpintrenable: vno %d, irq %d, tbdf %uX\n",
- vno, v->irq, tbdf);
- return -1;
- }
+ vno = allocvector();
hi = mpintrcpu()<<24;
lo = mpintrinit(bus, aintr->intr, vno, v->irq);
//print("lo 0x%uX: busno %d intr %d vno %d irq %d elcr 0x%uX\n",
@@ -869,11 +881,7 @@ msiintrenable(Vctl *v)
break;
}
- vno = VectorAPIC + (incref(&mpvnoref)-1)*8;
- if(vno > MaxVectorAPIC) {
- print("msiintrenable: vno %d\n", vno);
- return -1;
- }
+ vno = allocvector();
cpu = mpintrcpu();
pcicfgw32(pci, cap + MSIAddr, (0xFEE << 20) | (cpu << 12));
pcicfgw32(pci, cap + MSIAddr + 4, 0);