diff options
Diffstat (limited to 'usr.sbin/acpi/amldb/aml/aml_region.c')
-rw-r--r-- | usr.sbin/acpi/amldb/aml/aml_region.c | 432 |
1 files changed, 142 insertions, 290 deletions
diff --git a/usr.sbin/acpi/amldb/aml/aml_region.c b/usr.sbin/acpi/amldb/aml/aml_region.c index 5f318a5..e50091a 100644 --- a/usr.sbin/acpi/amldb/aml/aml_region.c +++ b/usr.sbin/acpi/amldb/aml/aml_region.c @@ -44,316 +44,157 @@ #include <machine/acpica_osd.h> #endif -#define AML_REGION_INPUT 0 -#define AML_REGION_OUTPUT 1 +/* + * Dummy functions for aml_region_io_simple() + */ +u_int32_t +aml_region_prompt_read(struct aml_region_handle *h, u_int32_t value) +{ -#define AML_REGION_SYSMEM 0 -#define AML_REGION_SYSIO 1 -#define AML_REGION_PCICFG 2 -#define AML_REGION_EMBCTL 3 -#define AML_REGION_SMBUS 4 + return (value); +} -static int -aml_region_io_system(struct aml_environ *env, boolean_t io, int regtype, - u_int32_t flags, u_int32_t *valuep, u_int32_t baseaddr, - u_int32_t bitoffset, u_int32_t bitlen) +u_int32_t +aml_region_prompt_write(struct aml_region_handle *h, u_int32_t value) { - u_int8_t val, tmp, masklow, maskhigh; - u_int8_t offsetlow, offsethigh; - vm_offset_t addr, vaddr, byteoffset, bytelen; - u_int32_t pci_bus; - u_int32_t pci_devfunc; - int value, readval; - int state, i; - int debug; - - /* save debug level and shut it up */ - debug = aml_debug; - aml_debug = 0; - - value = *valuep; - val = readval = 0; - masklow = maskhigh = 0xff; - state = 0; - vaddr = 0; - pci_bus = pci_devfunc = 0; - - byteoffset = bitoffset / 8; - bytelen = bitlen / 8 + ((bitlen % 8) ? 1 : 0); - addr = baseaddr + byteoffset; - offsetlow = bitoffset % 8; - if (bytelen > 1) { - offsethigh = (bitlen - (8 - offsetlow)) % 8; - } else { - offsethigh = 0; - } - if (offsetlow) { - masklow = (~((1 << bitlen) - 1) << offsetlow) | \ - ~(0xff << offsetlow); - AML_DEBUGPRINT("\t[offsetlow = 0x%x, masklow = 0x%x, ~masklow = 0x%x]\n", - offsetlow, masklow, ~masklow & 0xff); - } - if (offsethigh) { - maskhigh = 0xff << offsethigh; - AML_DEBUGPRINT("\t[offsethigh = 0x%x, maskhigh = 0x%x, ~maskhigh = 0x%x]\n", - offsethigh, maskhigh, ~maskhigh & 0xff); - } + return (value); +} - if (regtype == AML_REGION_SYSMEM) { - OsdMapMemory((void *)addr, bytelen, (void **)&vaddr); - } - if (regtype == AML_REGION_PCICFG) { - /* Access to PCI Config space */ - struct aml_name *pci_info; - - /* Obtain PCI bus number */ - pci_info = aml_search_name(env, "_BBN"); - if (!pci_info || pci_info->property->type != aml_t_num) { - AML_DEBUGPRINT("Cannot locate _BBN. Using default 0\n"); - pci_bus = 0; - } else { - AML_DEBUGPRINT("found _BBN: %d\n", - pci_info->property->num.number); - pci_bus = pci_info->property->num.number & 0xff; - } +int +aml_region_prompt_update_value(u_int32_t orgval, u_int32_t value, + struct aml_region_handle *h) +{ + return (0); +} - /* Obtain device & function number */ - pci_info = aml_search_name(env, "_ADR"); - if (!pci_info || pci_info->property->type != aml_t_num) { - printf("Cannot locate: _ADR\n"); - state = -1; - goto io_done; +/* + * Primitive functions for aml_region_io_simple() + */ +int +aml_region_read_simple(struct aml_region_handle *h, vm_offset_t offset, u_int32_t *valuep) +{ + u_int32_t value; + + switch (h->regtype) { + case AML_REGION_SYSMEM: + /* XXX should be MI */ + switch (h->unit) { + case 1: + value = *(volatile u_int8_t *)(h->vaddr + offset); + value &= 0xff; + break; + case 2: + value = *(volatile u_int16_t *)(h->vaddr + offset); + value &= 0xffff; + break; + case 4: + value = *(volatile u_int32_t *)(h->vaddr + offset); + break; } - pci_devfunc = pci_info->property->num.number; - - AML_DEBUGPRINT("[pci%d.%d]", pci_bus, pci_devfunc); - } - - /* simple I/O ? */ - if (offsetlow == 0 && offsethigh == 0 && - (bitlen == 8 || bitlen == 16 || bitlen == 32)) { - switch (io) { - case AML_REGION_INPUT: - switch (regtype) { - case AML_REGION_SYSMEM: - /* XXX should be MI */ - switch (bitlen) { - case 8: - value = *(volatile u_int8_t *)(vaddr); - value &= 0xff; - break; - case 16: - value = *(volatile u_int16_t *)(vaddr); - value &= 0xffff; - break; - case 32: - value = *(volatile u_int32_t *)(vaddr); - break; - } - break; - case AML_REGION_SYSIO: - switch (bitlen) { - case 8: - value = OsdIn8(addr); - value &= 0xff; - break; - case 16: - value = OsdIn16(addr); - value &= 0xffff; - break; - case 32: - value = OsdIn32(addr); - break; - } - break; - case AML_REGION_PCICFG: - switch (bitlen) { - case 8: - OsdReadPciCfgByte(pci_bus, pci_devfunc, - addr, (UINT8 *)&value); - value &= 0xff; - break; - case 16: - OsdReadPciCfgWord(pci_bus, pci_devfunc, - addr, (UINT16 *)&value); - value &= 0xffff; - break; - case 32: - OsdReadPciCfgDword(pci_bus, pci_devfunc, - addr, &value); - break; - } - break; - default: - printf("aml_region_io_system: not supported yet (%d)\n", - regtype); - value = 0; - break; - } - *valuep = value; + break; + case AML_REGION_SYSIO: + switch (h->unit) { + case 1: + value = OsdIn8(h->addr + offset); + value &= 0xff; + break; + case 2: + value = OsdIn16(h->addr + offset); + value &= 0xffff; + break; + case 4: + value = OsdIn32(h->addr + offset); break; - case AML_REGION_OUTPUT: - switch (regtype) { - case AML_REGION_SYSMEM: - /* XXX should be MI */ - switch (bitlen) { - case 8: - value &= 0xff; - *(volatile u_int8_t *)(vaddr) = value; - break; - case 16: - value &= 0xffff; - *(volatile u_int16_t *)(vaddr) = value; - break; - case 32: - *(volatile u_int32_t *)(vaddr) = value; - break; - } - break; - case AML_REGION_SYSIO: - switch (bitlen) { - case 8: - value &= 0xff; - OsdOut8(addr, value); - break; - case 16: - value &= 0xffff; - OsdOut16(addr, value); - break; - case 32: - OsdOut32(addr, value); - break; - } - break; - case AML_REGION_PCICFG: - switch (bitlen) { - case 8: - OsdWritePciCfgByte(pci_bus, pci_devfunc, - addr, value); - break; - case 16: - OsdWritePciCfgWord(pci_bus, pci_devfunc, - addr, value); - break; - case 32: - OsdWritePciCfgDword(pci_bus, pci_devfunc, - addr, value); - break; - } - break; - default: - printf("aml_region_io_system: not supported yet (%d)\n", - regtype); - break; - } + } + break; + case AML_REGION_PCICFG: + switch (h->unit) { + case 1: + OsdReadPciCfgByte(h->pci_bus, h->pci_devfunc, + h->addr + offset, (UINT8 *)&value); + value &= 0xff; + break; + case 2: + OsdReadPciCfgWord(h->pci_bus, h->pci_devfunc, + h->addr + offset, (UINT16 *)&value); + value &= 0xffff; + break; + case 4: + OsdReadPciCfgDword(h->pci_bus, h->pci_devfunc, + h->addr + offset, &value); break; } - goto io_done; + break; + default: + printf("aml_region_read_simple: not supported yet (%d)\n", + h->regtype); + value = 0; + break; } + *valuep = value; + return (0); +} - for (i = 0; i < bytelen; i++) { - /* XXX */ - switch (regtype) { - case AML_REGION_SYSMEM: - val = *(volatile u_int8_t *)(vaddr + i); +int +aml_region_write_simple(struct aml_region_handle *h, vm_offset_t offset, u_int32_t value) +{ + + switch (h->regtype) { + case AML_REGION_SYSMEM: + /* XXX should be MI */ + switch (h->unit) { + case 1: + value &= 0xff; + *(volatile u_int8_t *)(h->vaddr + offset) = value; + break; + case 2: + value &= 0xffff; + *(volatile u_int16_t *)(h->vaddr + offset) = value; break; - case AML_REGION_SYSIO: - val = OsdIn8(addr + i); + case 4: + *(volatile u_int32_t *)(h->vaddr + offset) = value; + break; + } + break; + case AML_REGION_SYSIO: + switch (h->unit) { + case 1: + value &= 0xff; + OsdOut8(h->addr + offset, value); break; - case AML_REGION_PCICFG: - OsdReadPciCfgByte(pci_bus, pci_devfunc, addr + i, &val); + case 2: + value &= 0xffff; + OsdOut16(h->addr + offset, value); break; - default: - printf("aml_region_io_system: not supported yet (%d)\n", - regtype); - val = 0; + case 4: + OsdOut32(h->addr + offset, value); break; } - - AML_DEBUGPRINT("\t[%d:0x%02x@0x%x]", regtype, val, addr + i); - - switch (io) { - case AML_REGION_INPUT: - tmp = val; - /* the lowest byte? */ - if (i == 0) { - if (offsetlow) { - readval = tmp & ~masklow; - } else { - readval = tmp; - } - } else { - if (i == bytelen - 1 && offsethigh) { - tmp = tmp & ~maskhigh; - } - readval = (tmp << (8 * i)) | readval; - } - - AML_DEBUGPRINT("\n"); - /* goto to next byte... */ - if (i < bytelen - 1) { - continue; - } - /* final adjustment before finishing region access */ - if (offsetlow) { - readval = readval >> offsetlow; - } - AML_DEBUGPRINT("\t[read(%d, 0x%x)&mask:0x%x]\n", - regtype, addr + i, readval); - value = readval; - *valuep = value; - + break; + case AML_REGION_PCICFG: + switch (h->unit) { + case 1: + OsdWritePciCfgByte(h->pci_bus, h->pci_devfunc, + h->addr + offset, value); break; - case AML_REGION_OUTPUT: - tmp = value & 0xff; - /* the lowest byte? */ - if (i == 0) { - if (offsetlow) { - tmp = (val & masklow) | tmp << offsetlow; - } - value = value >> (8 - offsetlow); - } else { - if (i == bytelen - 1 && offsethigh) { - tmp = (val & maskhigh) | tmp; - } - value = value >> 8; - } - - AML_DEBUGPRINT("->[%d:0x%02x@0x%x]\n", - regtype, tmp, addr + i); - val = tmp; - - /* XXX */ - switch (regtype) { - case AML_REGION_SYSMEM: - *(volatile u_int8_t *)(vaddr + i) = val; - break; - case AML_REGION_SYSIO: - OsdOut8(addr + i, val); - break; - case AML_REGION_PCICFG: - OsdWritePciCfgByte(pci_bus, pci_devfunc, - addr + i, val); - break; - default: - printf("aml_region_io_system: not supported yet (%d)\n", - regtype); - break; - } - + case 2: + OsdWritePciCfgWord(h->pci_bus, h->pci_devfunc, + h->addr + offset, value); + break; + case 4: + OsdWritePciCfgDword(h->pci_bus, h->pci_devfunc, + h->addr + offset, value); break; } + break; + default: + printf("aml_region_write_simple: not supported yet (%d)\n", + h->regtype); + break; } -io_done: - if (regtype == AML_REGION_SYSMEM) { - OsdUnMapMemory((void *)vaddr, bytelen); - } - - aml_debug = debug; /* restore debug devel */ - - return (state); + return (0); } static int @@ -405,7 +246,9 @@ aml_region_read(struct aml_environ *env, int regtype, u_int32_t flags, int value; int state; - state = aml_region_io_system(env, AML_REGION_INPUT, regtype, + AML_REGION_READ_DEBUG(regtype, flags, addr, bitoffset, bitlen); + + state = aml_region_io(env, AML_REGION_INPUT, regtype, flags, &value, addr, bitoffset, bitlen); AML_SYSASSERT(state != -1); @@ -419,6 +262,7 @@ aml_region_read_into_buffer(struct aml_environ *env, int regtype, { int state; + AML_REGION_READ_INTO_BUFFER_DEBUG(regtype, flags, addr, bitoffset, bitlen); state = aml_region_io_buffer(AML_REGION_INPUT, regtype, flags, buffer, addr, bitoffset, bitlen); @@ -431,7 +275,9 @@ aml_region_write(struct aml_environ *env, int regtype, u_int32_t flags, { int state; - state = aml_region_io_system(env, AML_REGION_OUTPUT, regtype, + AML_REGION_WRITE_DEBUG(regtype, flags, value, addr, bitoffset, bitlen); + + state = aml_region_io(env, AML_REGION_OUTPUT, regtype, flags, &value, addr, bitoffset, bitlen); AML_SYSASSERT(state != -1); @@ -445,6 +291,9 @@ aml_region_write_from_buffer(struct aml_environ *env, int regtype, { int state; + AML_REGION_WRITE_FROM_BUFFER_DEBUG(regtype, flags, + addr, bitoffset, bitlen); + state = aml_region_io_buffer(AML_REGION_OUTPUT, regtype, flags, buffer, addr, bitoffset, bitlen); @@ -460,6 +309,9 @@ aml_region_bcopy(struct aml_environ *env, int regtype, vm_offset_t to_addr, to_vaddr; size_t len; + AML_REGION_BCOPY_DEBUG(regtype, flags, addr, bitoffset, bitlen, + dflags, daddr, dbitoffset, dbitlen); + if (regtype != AML_REGION_SYSMEM) { printf("aml_region_bcopy: region type isn't system memory!\n"); return (-1); |