summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/archacpi.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-11-10 00:04:37 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2014-11-10 00:04:37 +0100
commitbcb67353c1ae559d6f91ab0669a06db52000b15d (patch)
treee2e6e9b26b7f13e234315c5753982bca4100dd22 /sys/src/9/pc/archacpi.c
parentb18a6413975a0a8d06e6d310072a0ff90b1ed541 (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.c27
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();