]> git.lizzy.rs Git - plan9front.git/commitdiff
pc, pc64: implement acpi reset (for efi)
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 2 Nov 2014 02:52:53 +0000 (03:52 +0100)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 2 Nov 2014 02:52:53 +0000 (03:52 +0100)
x230 booted in efi only (no csp) mode hangs
when traditional i8042reset() keyboard reset
is tried.

so we try acpireset() first which discoveres
and writes the acpi reset register.

sys/src/9/pc/archacpi.c
sys/src/9/pc/fns.h
sys/src/9/pc/mp.c
sys/src/9/pc64/fns.h

index f996d90df804708bc00875fe704ad098bd6194f0..a9482fc83a0d8fae0fe2fd77c80b80accf4bdce3 100644 (file)
@@ -862,3 +862,29 @@ amldelay(int us)
 {
        microdelay(us);
 }
+
+/*
+ * reset machine by writing acpi reset register.
+ */
+void
+acpireset(void)
+{
+       uchar *p;
+       Tbl *t;
+       int i;
+
+       for(i=0; i < ntblmap; i++){
+               t = tblmap[i];
+               if(memcmp(t->sig, "FACP", 4) != 0)
+                       continue;
+               if(get32(t->len) <= 128)
+                       break;
+               p = (uchar*)t;
+               if((get32(p + 112) & (1<<10)) == 0)
+                       break;
+               if(p[116+0] != IoSpace)
+                       break;
+               outb(get32(p+116+4), p[128]);
+               break;
+       }
+}
index 8ecaa0f7d21ffb6a8d8127232e9901721f3f25bf..93178a00032b03b622d3a9cd6b7bf233bd2f5e34 100644 (file)
@@ -1,6 +1,7 @@
 #include "../port/portfns.h"
 
 void   aamloop(int);
+void   acpireset(void);
 Dirtab*        addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong));
 void   archinit(void);
 int    bios32call(BIOS32ci*, u16int[3]);
index 765fa30b6f1c296206026783e185f229c8fe8477..63fe687fa81897138955b17902d299158d30744c 100644 (file)
@@ -585,6 +585,7 @@ mpshutdown(void)
        lapicicrw(0, 0x000C0000|ApicINIT);
 
        pcireset();
+       acpireset();
        i8042reset();
 
        /*
index fe67eddedfbf3666c49dd77d5ca3945afb19593c..15eb1a0f56821a7c399412b1c639eecb9382e78f 100644 (file)
@@ -1,6 +1,7 @@
 #include "../port/portfns.h"
 
 void   aamloop(int);
+void   acpireset(void);
 Dirtab*        addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong));
 void   archinit(void);
 int    bios32call(BIOS32ci*, u16int[3]);