summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/archacpi.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-06-19 16:30:11 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-06-19 16:30:11 +0200
commit69470de37d11d50d9f1b6a6d2af1869b08cd2e53 (patch)
tree3a5cc50447a5fc2360b917d9e8b5732e771a3e77 /sys/src/9/pc/archacpi.c
parent89efb07d4fb901c1129a455b09335d671efe871c (diff)
acpi: work arround missing _BBN, check _HID
Diffstat (limited to 'sys/src/9/pc/archacpi.c')
-rw-r--r--sys/src/9/pc/archacpi.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/sys/src/9/pc/archacpi.c b/sys/src/9/pc/archacpi.c
index 7796d25c6..bff356d25 100644
--- a/sys/src/9/pc/archacpi.c
+++ b/sys/src/9/pc/archacpi.c
@@ -281,24 +281,50 @@ Foundbus:
bus->aintr = ai;
}
+static char*
+eisaid(void *v)
+{
+ static char id[8];
+ ulong b, l;
+ int i;
+
+ if(amltag(v) == 's')
+ return v;
+ b = amlint(v);
+ for(l = 0, i=24; i>=0; i -= 8, b >>= 8)
+ l |= (b & 0xFF) << i;
+ id[7] = 0;
+ for(i=6; i>=3; i--, l >>= 4)
+ id[i] = "0123456789ABCDEF"[l & 0xF];
+ for(i=2; i>=0; i--, l >>= 5)
+ id[i] = '@' + (l & 0x1F);
+ return id;
+}
+
static int
pcibusno(void *dot)
{
int bno, adr, tbdf;
Pcidev *pdev;
void *p, *x;
+ char *id;
- p = nil;
- if(x = amlwalk(dot, "^_BBN")){
- if(amleval(x, "", &p) < 0)
- return -1;
- return amlint(p);
+ id = nil;
+ if(x = amlwalk(dot, "^_HID")){
+ p = nil;
+ if(amleval(x, "", &p) == 0)
+ id = eisaid(p);
}
- if((x = amlwalk(dot, "^_ADR")) == nil)
- return -1;
+ if((x = amlwalk(dot, "^_BBN")) == nil)
+ if((x = amlwalk(dot, "^_ADR")) == nil)
+ return -1;
+ p = nil;
if(amleval(x, "", &p) < 0)
return -1;
adr = amlint(p);
+ /* if root bridge, then we are done here */
+ if(id && (strcmp(id, "PNP0A03")==0 || strcmp(id, "PNP0A08")==0))
+ return adr;
x = amlwalk(dot, "^");
if(x == nil || x == dot)
return -1;