Change all references of num_cpus -> num_cores
[akaros.git] / kern / drivers / dev / acpi.c
index 69876ec..fda4525 100644 (file)
@@ -21,6 +21,9 @@
 #include <smp.h>
 #include <ip.h>
 #include <acpi.h>
+
+#include "../timers/hpet.h"
+
 #ifdef CONFIG_X86
 #include <arch/pci.h>
 #endif
@@ -63,7 +66,10 @@ static struct dirtab acpidir[] = {
  * required to do early initialization before we have user processes.
  * Other tables are given to the user level interpreter for
  * execution.
- */
+ *
+ * These historically returned a value to tell acpi whether or not it was okay
+ * to unmap the table.  (return 0 means there was no table, meaning it was okay
+ * to unmap).  We just use the kernbase mapping, so it's irrelevant. */
 static struct Parse ptables[] = {
        {"FACP", acpifadt},
        {"APIC", acpimadt,},
@@ -71,6 +77,7 @@ static struct Parse ptables[] = {
        {"SLIT", acpislit,},
        {"MSCT", acpimsct,},
        {"SSDT", acpitable,},
+       {"HPET", acpihpet,},
 };
 
 static struct Facs *facs;              /* Firmware ACPI control structure */
@@ -308,11 +315,6 @@ regcpy(struct Regio *dio, uintptr_t da, struct Regio *sio,
        return n * align;
 }
 
-// until we know.  TODO: spatch/find_replace this shit, same with mp.c
-//#define vmap(x,y) (void *)vmap_pmem((x),(y))
-//#define vunmap(x,y) vunmap_vmem((uintptr_t)(x),(y))
-#define vmap(x,y) ((void*)(x + KERNBASE))
-#define vunmap(x,y)
 /*
  * Perform I/O within region in access units of accsz bytes.
  * All units in bytes.
@@ -336,9 +338,9 @@ static long regio(struct Reg *r, void *p, uint32_t len, uintptr_t off, int iswr)
        switch (r->spc) {
                case Rsysmem:
                        if (r->p == NULL)
-                               r->p = vmap(r->base, len);
+                               r->p = KADDR_NOCHECK(r->base);
                        if (r->p == NULL)
-                               error("regio: vmap failed");
+                               error("regio: vmap/KADDR failed");
                        rp = (uintptr_t) r->p + off;
                        rio = memio;
                        break;
@@ -367,7 +369,7 @@ static long regio(struct Reg *r, void *p, uint32_t len, uintptr_t off, int iswr)
        return len;
 }
 
-static struct Atable *newtable(uint8_t * p)
+struct Atable *new_acpi_table(uint8_t * p)
 {
        struct Atable *t;
        struct Sdthdr *h;
@@ -417,24 +419,22 @@ static void *sdtmap(uintptr_t pa, int *n, int cksum)
                printk("sdtmap: NULL pa\n");
                return NULL;
        }
-       sdt = vmap(pa, sizeof(*sdt));
+       sdt = KADDR_NOCHECK(pa);
        if (sdt == NULL) {
                printk("acpi: vmap1: NULL\n");
                return NULL;
        }
        *n = l32get(sdt->length);
-       vunmap(sdt, sizeof(*sdt));
        if (!*n) {
                printk("sdt has zero length!\n");
                return NULL;
        }
-       if ((sdt = vmap(pa, *n)) == NULL) {
+       if ((sdt = KADDR_NOCHECK(pa)) == NULL) {
                printk("acpi: NULL vmap\n");
                return NULL;
        }
        if (cksum != 0 && sdtchecksum(sdt, *n) == NULL) {
                printk("acpi: SDT: bad checksum\n");
-               vunmap(sdt, sizeof(*sdt));
                return NULL;
        }
        return sdt;
@@ -449,7 +449,6 @@ static int loadfacs(uintptr_t pa)
                return -1;
        }
        if (memcmp(facs, "FACS", 4) != 0) {
-               //vunmap(facs, n);
                facs = NULL;
                return -1;
        }
@@ -474,7 +473,6 @@ static void loaddsdt(uintptr_t pa)
        if (dsdtp == NULL) {
                return;
        }
-       if (acpitable(dsdtp, n) == NULL) ;      //vunmap(dsdtp, n);
 }
 
 static void gasget(struct Gas *gas, uint8_t * p)
@@ -848,7 +846,7 @@ int pickcore(int mycolor, int index)
        if (slit == NULL) {
                return 0;
        }
-       ncorepercol = num_cpus / slit->rowlen;
+       ncorepercol = num_cores / slit->rowlen;
        color = slit->e[mycolor][index / ncorepercol].dom;
        return color * ncorepercol + index % ncorepercol;
 }
@@ -1073,7 +1071,7 @@ static struct Atable *acpitable(uint8_t * p, int len)
        if (len < Sdthdrsz) {
                return NULL;
        }
-       return newtable(p);
+       return new_acpi_table(p);
 }
 
 static char *dumptable(char *start, char *end, char *sig, uint8_t * p, int l)
@@ -1123,7 +1121,7 @@ static char *seprinttable(char *s, char *e, struct Atable *t)
  */
 static int acpixsdtload(char *sig)
 {
-       int i, l, t, unmap, found;
+       int i, l, t, found;
        uintptr_t dhpa;
        uint8_t *sdt;
        char tsig[5];
@@ -1137,7 +1135,6 @@ static int acpixsdtload(char *sig)
                        dhpa = l32get(xsdt->p + i);
                if ((sdt = sdtmap(dhpa, &l, 1)) == NULL)
                        continue;
-               unmap = 1;
                memmove(tsig, sdt, 4);
                tsig[4] = 0;
                if (sig == NULL || strcmp(sig, tsig) == 0) {
@@ -1145,13 +1142,11 @@ static int acpixsdtload(char *sig)
                        for (t = 0; t < ARRAY_SIZE(ptables); t++)
                                if (strcmp(tsig, ptables[t].sig) == 0) {
                                        //dumptable(table, &table[127], tsig, sdt, l);
-                                       unmap = ptables[t].f(sdt, l) == NULL;
+                                       ptables[t].f(sdt, l);
                                        found = 1;
                                        break;
                                }
                }
-//      if(unmap)
-//          vunmap(sdt, l);
        }
        return found;
 }
@@ -1219,7 +1214,6 @@ static void acpirsdptr(void)
                           xsdt->p[3]);
                kfree(xsdt);
                xsdt = NULL;
-               //vunmap(xsdt, xsdt->len);
                return;
        }
        xsdt->p += sizeof(struct Sdthdr);
@@ -1404,7 +1398,6 @@ static unsigned int getgpests(int n)
        return inb(gpes[n].stsio) & 1 << gpes[n].stsbit;
 }
 
-#warning "no acpi interrupts yet"
 #if 0
 static void acpiintr(Ureg *, void *)
 {