diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-11-10 00:04:37 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-11-10 00:04:37 +0100 |
commit | bcb67353c1ae559d6f91ab0669a06db52000b15d (patch) | |
tree | e2e6e9b26b7f13e234315c5753982bca4100dd22 /sys/src/9/pc/archacpi.c | |
parent | b18a6413975a0a8d06e6d310072a0ff90b1ed541 (diff) |
pc, pc64: provide access to embedded controller with #P/ec file
Diffstat (limited to 'sys/src/9/pc/archacpi.c')
-rw-r--r-- | sys/src/9/pc/archacpi.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/sys/src/9/pc/archacpi.c b/sys/src/9/pc/archacpi.c index 7f9a52e51..6805f5c87 100644 --- a/sys/src/9/pc/archacpi.c +++ b/sys/src/9/pc/archacpi.c @@ -453,6 +453,30 @@ enumprt(void *dot, void *) return 1; } +static int +enumec(void *dot, void *) +{ + int cmdport, dataport; + uchar *b; + void *x; + char *id; + + b = nil; + id = eisaid(amlval(amlwalk(dot, "^_HID"))); + if(id == nil || strcmp(id, "PNP0C09") != 0) + return 1; + if((x = amlwalk(dot, "^_CRS")) == nil) + return 1; + if(amleval(x, "", &b) < 0 || amltag(b) != 'b' || amllen(b) < 16) + return 1; + if(b[0] != 0x47 || b[8] != 0x47) /* two i/o port descriptors */ + return 1; + dataport = b[0+2] | b[0+3]<<8; + cmdport = b[8+2] | b[8+3]<<8; + ecinit(cmdport, dataport); + return 1; +} + static void acpiinit(void) { @@ -589,6 +613,9 @@ Foundapic: for(i=0; i<16; i++) addirq(i, BusISA, 0, i, 0); + /* find embedded controller */ + amlenum(amlroot, "_HID", enumec, nil); + /* free the AML interpreter */ amlexit(); |