summaryrefslogtreecommitdiffstats
path: root/usr.sbin/acpi/amldb/aml/aml_region.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/acpi/amldb/aml/aml_region.c')
-rw-r--r--usr.sbin/acpi/amldb/aml/aml_region.c432
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);
OpenPOWER on IntegriCloud