]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/archacpi.c
pc, pc64: implement acpi reset (for efi)
[plan9front.git] / sys / src / 9 / pc / archacpi.c
index 0b6e7ea4886a272f31534dc4487965973b62a8eb..a9482fc83a0d8fae0fe2fd77c80b80accf4bdce3 100644 (file)
@@ -645,11 +645,17 @@ readtbls(Chan*, void *v, long n, vlong o)
 static int
 identify(void)
 {
+       uintptr pa;
        char *cp;
 
        if((cp = getconf("*acpi")) == nil)
                return 1;
-       if((rsd = sigsearch("RSD PTR ")) == nil)
+       pa = (uintptr)strtoull(cp, nil, 16);
+       if(pa <= 1)
+               rsd = sigsearch("RSD PTR ");
+       else
+               rsd = vmap(pa, sizeof(Rsd));
+       if(rsd == nil)
                return 1;
        if(checksum(rsd, 20) && checksum(rsd, 36))
                return 1;
@@ -856,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;
+       }
+}