don't do accounting on acpi io and memory access. use tmpmap() for memory access. Reference: /n/atom/patch/applied/acpiiotmp Date: Mon Mar 10 18:35:18 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/acpiio.c Mon Mar 10 18:19:38 2014 +++ /sys/src/nix/k10/acpiio.c Mon Mar 10 18:19:39 2014 @@ -11,19 +11,64 @@ extern int pcibusno(void*); +static void +memtr(char *s, uintmem pa, int len, void *data) +{ + if(len <= 8) + print("aml: %s %#P len %d %#llux\n", s, pa, len, getle(data, len)); + else + print("aml: %s %#P len %d\n", s, pa, len); +} + +static uint +seglen(uintmem pa, uintmem len, uintmem sgsz) +{ + uintmem end, slen; + + end = pa+sgsz & ~(sgsz-1); + slen = end - pa; + if(slen > len) + slen = len; + return slen; +} + static int readmem(Amlio *io, void *data, int len, int off) { - memmove(data, io->va + off, len); -print("aml: readmem: va %#p len %d %llux\n", io->va + off, len, getle(data, len)); + uchar *va, *d; + uintmem s, slen; + + s = io->off+off; + d = data; + for(; len != 0; len -= slen){ + slen = seglen(s, len, PGSZ); + va = tmpmap(s); + memmove(d, va, slen); + tmpunmap(va); + s += slen; + d += slen; + } + memtr("readmem", io->off+off, len, data); return len; } static int writemem(Amlio *io, void *data, int len, int off) { - memmove(io->va + off, data, len); -print("aml: writemem: va %#p len %d\n", io->va + off, len); + uchar *va, *s; + uintmem d, slen; + + d = io->off+off; + s = data; + for(; len != 0; len -= slen){ + slen = seglen(d, len, PGSZ); + va = tmpmap(d); + memmove(va, s, slen); + tmpunmap(va); + s += slen; + d += slen; + } + memtr("writemem", io->off+off, len, data); return len; } @@ -186,19 +231,17 @@ print("amlmapio: address space %d not implemented\n", io->space); break; case MemSpace: - if((io->va = vmapoverlap(io->off, io->len)) == nil){ - print("amlmapio: vmap failed: [%llux, %llux)\n", io->off, io->off+io->len); - break; - } + print("aml: map [%#llux, %#llux)\n", io->off, io->off+io->len); + // adrmapck(io->off, io->len, Aacpireclaim, Mfree, Cnone); io->read = readmem; io->write = writemem; return 0; case IoSpace: snprint(buf, sizeof(buf), "%N", io->name); - if(ioalloc(io->off, io->len, 0, buf) < 0){ - print("amlmapio: ioalloc failed\n"); - break; - } + // if(ioalloc(io->off, io->len, 0, buf) < 0){ + // print("amlmapio: ioalloc failed [%llux-%llux)\n", io->off, io->off+io->len); + // // break; + // } io->read = readioport; io->write = writeioport; return 0; @@ -225,10 +268,9 @@ { switch(io->space){ case MemSpace: -// vunmap(io->va, io->len); break; case IoSpace: - iofree(io->off); + // iofree(io->off); break; } }