summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica/acpi_resource.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/acpica/acpi_resource.c')
-rw-r--r--sys/dev/acpica/acpi_resource.c273
1 files changed, 146 insertions, 127 deletions
diff --git a/sys/dev/acpica/acpi_resource.c b/sys/dev/acpica/acpi_resource.c
index 9f01e94..cde23e2 100644
--- a/sys/dev/acpica/acpi_resource.c
+++ b/sys/dev/acpica/acpi_resource.c
@@ -60,14 +60,14 @@ acpi_lookup_irq_handler(ACPI_RESOURCE *res, void *context)
struct lookup_irq_request *req;
u_int irqnum, irq;
- switch (res->Id) {
- case ACPI_RSTYPE_IRQ:
- case ACPI_RSTYPE_EXT_IRQ:
- if (res->Id == ACPI_RSTYPE_IRQ) {
- irqnum = res->Data.Irq.NumberOfInterrupts;
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_IRQ:
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ if (res->Type == ACPI_RESOURCE_TYPE_IRQ) {
+ irqnum = res->Data.Irq.InterruptCount;
irq = res->Data.Irq.Interrupts[0];
} else {
- irqnum = res->Data.ExtendedIrq.NumberOfInterrupts;
+ irqnum = res->Data.ExtendedIrq.InterruptCount;
irq = res->Data.ExtendedIrq.Interrupts[0];
}
if (irqnum != 1)
@@ -111,23 +111,23 @@ acpi_config_intr(device_t dev, ACPI_RESOURCE *res)
u_int irq;
int pol, trig;
- switch (res->Id) {
- case ACPI_RSTYPE_IRQ:
- KASSERT(res->Data.Irq.NumberOfInterrupts == 1,
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_IRQ:
+ KASSERT(res->Data.Irq.InterruptCount == 1,
("%s: multiple interrupts", __func__));
irq = res->Data.Irq.Interrupts[0];
- trig = res->Data.Irq.EdgeLevel;
- pol = res->Data.Irq.ActiveHighLow;
+ trig = res->Data.Irq.Triggering;
+ pol = res->Data.Irq.Polarity;
break;
- case ACPI_RSTYPE_EXT_IRQ:
- KASSERT(res->Data.ExtendedIrq.NumberOfInterrupts == 1,
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ KASSERT(res->Data.ExtendedIrq.InterruptCount == 1,
("%s: multiple interrupts", __func__));
irq = res->Data.ExtendedIrq.Interrupts[0];
- trig = res->Data.ExtendedIrq.EdgeLevel;
- pol = res->Data.ExtendedIrq.ActiveHighLow;
+ trig = res->Data.ExtendedIrq.Triggering;
+ pol = res->Data.ExtendedIrq.Polarity;
break;
default:
- panic("%s: bad resource type %u", __func__, res->Id);
+ panic("%s: bad resource type %u", __func__, res->Type);
}
BUS_CONFIG_INTR(dev, irq, (trig == ACPI_EDGE_SENSITIVE) ?
INTR_TRIGGER_EDGE : INTR_TRIGGER_LEVEL, (pol == ACPI_ACTIVE_HIGH) ?
@@ -186,129 +186,129 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
curr += res->Length;
/* Handle the individual resource types */
- switch(res->Id) {
- case ACPI_RSTYPE_END_TAG:
+ switch(res->Type) {
+ case ACPI_RESOURCE_TYPE_END_TAG:
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n"));
curr = last;
break;
- case ACPI_RSTYPE_FIXED_IO:
- if (res->Data.FixedIo.RangeLength <= 0)
+ case ACPI_RESOURCE_TYPE_FIXED_IO:
+ if (res->Data.FixedIo.AddressLength <= 0)
break;
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedIo 0x%x/%d\n",
- res->Data.FixedIo.BaseAddress,
- res->Data.FixedIo.RangeLength));
+ res->Data.FixedIo.Address,
+ res->Data.FixedIo.AddressLength));
set->set_ioport(dev, context,
- res->Data.FixedIo.BaseAddress,
- res->Data.FixedIo.RangeLength);
+ res->Data.FixedIo.Address,
+ res->Data.FixedIo.AddressLength);
break;
- case ACPI_RSTYPE_IO:
- if (res->Data.Io.RangeLength <= 0)
+ case ACPI_RESOURCE_TYPE_IO:
+ if (res->Data.Io.AddressLength <= 0)
break;
- if (res->Data.Io.MinBaseAddress == res->Data.Io.MaxBaseAddress) {
+ if (res->Data.Io.Minimum == res->Data.Io.Maximum) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x/%d\n",
- res->Data.Io.MinBaseAddress,
- res->Data.Io.RangeLength));
+ res->Data.Io.Minimum,
+ res->Data.Io.AddressLength));
set->set_ioport(dev, context,
- res->Data.Io.MinBaseAddress,
- res->Data.Io.RangeLength);
+ res->Data.Io.Minimum,
+ res->Data.Io.AddressLength);
} else {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x-0x%x/%d\n",
- res->Data.Io.MinBaseAddress,
- res->Data.Io.MaxBaseAddress,
- res->Data.Io.RangeLength));
+ res->Data.Io.Minimum,
+ res->Data.Io.Maximum,
+ res->Data.Io.AddressLength));
set->set_iorange(dev, context,
- res->Data.Io.MinBaseAddress,
- res->Data.Io.MaxBaseAddress,
- res->Data.Io.RangeLength,
+ res->Data.Io.Minimum,
+ res->Data.Io.Maximum,
+ res->Data.Io.AddressLength,
res->Data.Io.Alignment);
}
break;
- case ACPI_RSTYPE_FIXED_MEM32:
- if (res->Data.FixedMemory32.RangeLength <= 0)
+ case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+ if (res->Data.FixedMemory32.AddressLength <= 0)
break;
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedMemory32 0x%x/%d\n",
- res->Data.FixedMemory32.RangeBaseAddress,
- res->Data.FixedMemory32.RangeLength));
+ res->Data.FixedMemory32.Address,
+ res->Data.FixedMemory32.AddressLength));
set->set_memory(dev, context,
- res->Data.FixedMemory32.RangeBaseAddress,
- res->Data.FixedMemory32.RangeLength);
+ res->Data.FixedMemory32.Address,
+ res->Data.FixedMemory32.AddressLength);
break;
- case ACPI_RSTYPE_MEM32:
- if (res->Data.Memory32.RangeLength <= 0)
+ case ACPI_RESOURCE_TYPE_MEMORY32:
+ if (res->Data.Memory32.AddressLength <= 0)
break;
- if (res->Data.Memory32.MinBaseAddress ==
- res->Data.Memory32.MaxBaseAddress) {
+ if (res->Data.Memory32.Minimum ==
+ res->Data.Memory32.Maximum) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x/%d\n",
- res->Data.Memory32.MinBaseAddress,
- res->Data.Memory32.RangeLength));
+ res->Data.Memory32.Minimum,
+ res->Data.Memory32.AddressLength));
set->set_memory(dev, context,
- res->Data.Memory32.MinBaseAddress,
- res->Data.Memory32.RangeLength);
+ res->Data.Memory32.Minimum,
+ res->Data.Memory32.AddressLength);
} else {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x-0x%x/%d\n",
- res->Data.Memory32.MinBaseAddress,
- res->Data.Memory32.MaxBaseAddress,
- res->Data.Memory32.RangeLength));
+ res->Data.Memory32.Minimum,
+ res->Data.Memory32.Maximum,
+ res->Data.Memory32.AddressLength));
set->set_memoryrange(dev, context,
- res->Data.Memory32.MinBaseAddress,
- res->Data.Memory32.MaxBaseAddress,
- res->Data.Memory32.RangeLength,
+ res->Data.Memory32.Minimum,
+ res->Data.Memory32.Maximum,
+ res->Data.Memory32.AddressLength,
res->Data.Memory32.Alignment);
}
break;
- case ACPI_RSTYPE_MEM24:
- if (res->Data.Memory24.RangeLength <= 0)
+ case ACPI_RESOURCE_TYPE_MEMORY24:
+ if (res->Data.Memory24.AddressLength <= 0)
break;
- if (res->Data.Memory24.MinBaseAddress ==
- res->Data.Memory24.MaxBaseAddress) {
+ if (res->Data.Memory24.Minimum ==
+ res->Data.Memory24.Maximum) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x/%d\n",
- res->Data.Memory24.MinBaseAddress,
- res->Data.Memory24.RangeLength));
- set->set_memory(dev, context, res->Data.Memory24.MinBaseAddress,
- res->Data.Memory24.RangeLength);
+ res->Data.Memory24.Minimum,
+ res->Data.Memory24.AddressLength));
+ set->set_memory(dev, context, res->Data.Memory24.Minimum,
+ res->Data.Memory24.AddressLength);
} else {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x-0x%x/%d\n",
- res->Data.Memory24.MinBaseAddress,
- res->Data.Memory24.MaxBaseAddress,
- res->Data.Memory24.RangeLength));
+ res->Data.Memory24.Minimum,
+ res->Data.Memory24.Maximum,
+ res->Data.Memory24.AddressLength));
set->set_memoryrange(dev, context,
- res->Data.Memory24.MinBaseAddress,
- res->Data.Memory24.MaxBaseAddress,
- res->Data.Memory24.RangeLength,
+ res->Data.Memory24.Minimum,
+ res->Data.Memory24.Maximum,
+ res->Data.Memory24.AddressLength,
res->Data.Memory24.Alignment);
}
break;
- case ACPI_RSTYPE_IRQ:
+ case ACPI_RESOURCE_TYPE_IRQ:
/*
* from 1.0b 6.4.2
* "This structure is repeated for each separate interrupt
* required"
*/
set->set_irq(dev, context, res->Data.Irq.Interrupts,
- res->Data.Irq.NumberOfInterrupts, res->Data.Irq.EdgeLevel,
- res->Data.Irq.ActiveHighLow);
+ res->Data.Irq.InterruptCount, res->Data.Irq.Triggering,
+ res->Data.Irq.Polarity);
break;
- case ACPI_RSTYPE_DMA:
+ case ACPI_RESOURCE_TYPE_DMA:
/*
* from 1.0b 6.4.3
* "This structure is repeated for each separate dma channel
* required"
*/
set->set_drq(dev, context, res->Data.Dma.Channels,
- res->Data.Dma.NumberOfChannels);
+ res->Data.Dma.ChannelCount);
break;
- case ACPI_RSTYPE_START_DPF:
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "start dependant functions\n"));
- set->set_start_dependant(dev, context,
+ case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "start dependent functions\n"));
+ set->set_start_dependent(dev, context,
res->Data.StartDpf.CompatibilityPriority);
break;
- case ACPI_RSTYPE_END_DPF:
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "end dependant functions\n"));
- set->set_end_dependant(dev, context);
+ case ACPI_RESOURCE_TYPE_END_DEPENDENT:
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "end dependent functions\n"));
+ set->set_end_dependent(dev, context);
break;
- case ACPI_RSTYPE_ADDRESS32:
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
if (res->Data.Address32.AddressLength <= 0)
break;
if (res->Data.Address32.ProducerConsumer != ACPI_CONSUMER) {
@@ -331,47 +331,47 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address32/Memory 0x%x/%d\n",
- res->Data.Address32.MinAddressRange,
+ res->Data.Address32.Minimum,
res->Data.Address32.AddressLength));
set->set_memory(dev, context,
- res->Data.Address32.MinAddressRange,
+ res->Data.Address32.Minimum,
res->Data.Address32.AddressLength);
} else {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address32/IO 0x%x/%d\n",
- res->Data.Address32.MinAddressRange,
+ res->Data.Address32.Minimum,
res->Data.Address32.AddressLength));
set->set_ioport(dev, context,
- res->Data.Address32.MinAddressRange,
+ res->Data.Address32.Minimum,
res->Data.Address32.AddressLength);
}
} else {
if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address32/Memory 0x%x-0x%x/%d\n",
- res->Data.Address32.MinAddressRange,
- res->Data.Address32.MaxAddressRange,
+ res->Data.Address32.Minimum,
+ res->Data.Address32.Maximum,
res->Data.Address32.AddressLength));
set->set_memoryrange(dev, context,
- res->Data.Address32.MinAddressRange,
- res->Data.Address32.MaxAddressRange,
+ res->Data.Address32.Minimum,
+ res->Data.Address32.Maximum,
res->Data.Address32.AddressLength,
res->Data.Address32.Granularity);
} else {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address32/IO 0x%x-0x%x/%d\n",
- res->Data.Address32.MinAddressRange,
- res->Data.Address32.MaxAddressRange,
+ res->Data.Address32.Minimum,
+ res->Data.Address32.Maximum,
res->Data.Address32.AddressLength));
set->set_iorange(dev, context,
- res->Data.Address32.MinAddressRange,
- res->Data.Address32.MaxAddressRange,
+ res->Data.Address32.Minimum,
+ res->Data.Address32.Maximum,
res->Data.Address32.AddressLength,
res->Data.Address32.Granularity);
}
}
break;
- case ACPI_RSTYPE_ADDRESS16:
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
if (res->Data.Address16.AddressLength <= 0)
break;
if (res->Data.Address16.ProducerConsumer != ACPI_CONSUMER) {
@@ -394,62 +394,62 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
if (res->Data.Address16.ResourceType == ACPI_MEMORY_RANGE) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address16/Memory 0x%x/%d\n",
- res->Data.Address16.MinAddressRange,
+ res->Data.Address16.Minimum,
res->Data.Address16.AddressLength));
set->set_memory(dev, context,
- res->Data.Address16.MinAddressRange,
+ res->Data.Address16.Minimum,
res->Data.Address16.AddressLength);
} else {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address16/IO 0x%x/%d\n",
- res->Data.Address16.MinAddressRange,
+ res->Data.Address16.Minimum,
res->Data.Address16.AddressLength));
set->set_ioport(dev, context,
- res->Data.Address16.MinAddressRange,
+ res->Data.Address16.Minimum,
res->Data.Address16.AddressLength);
}
} else {
if (res->Data.Address16.ResourceType == ACPI_MEMORY_RANGE) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address16/Memory 0x%x-0x%x/%d\n",
- res->Data.Address16.MinAddressRange,
- res->Data.Address16.MaxAddressRange,
+ res->Data.Address16.Minimum,
+ res->Data.Address16.Maximum,
res->Data.Address16.AddressLength));
set->set_memoryrange(dev, context,
- res->Data.Address16.MinAddressRange,
- res->Data.Address16.MaxAddressRange,
+ res->Data.Address16.Minimum,
+ res->Data.Address16.Maximum,
res->Data.Address16.AddressLength,
res->Data.Address16.Granularity);
} else {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"Address16/IO 0x%x-0x%x/%d\n",
- res->Data.Address16.MinAddressRange,
- res->Data.Address16.MaxAddressRange,
+ res->Data.Address16.Minimum,
+ res->Data.Address16.Maximum,
res->Data.Address16.AddressLength));
set->set_iorange(dev, context,
- res->Data.Address16.MinAddressRange,
- res->Data.Address16.MaxAddressRange,
+ res->Data.Address16.Minimum,
+ res->Data.Address16.Maximum,
res->Data.Address16.AddressLength,
res->Data.Address16.Granularity);
}
}
break;
- case ACPI_RSTYPE_ADDRESS64:
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"unimplemented Address64 resource\n"));
break;
- case ACPI_RSTYPE_EXT_IRQ:
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
if (res->Data.ExtendedIrq.ProducerConsumer != ACPI_CONSUMER) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"ignored ExtIRQ producer\n"));
break;
}
- set->set_irq(dev, context,res->Data.ExtendedIrq.Interrupts,
- res->Data.ExtendedIrq.NumberOfInterrupts,
- res->Data.ExtendedIrq.EdgeLevel,
- res->Data.ExtendedIrq.ActiveHighLow);
+ set->set_ext_irq(dev, context, res->Data.ExtendedIrq.Interrupts,
+ res->Data.ExtendedIrq.InterruptCount,
+ res->Data.ExtendedIrq.Triggering,
+ res->Data.ExtendedIrq.Polarity);
break;
- case ACPI_RSTYPE_VENDOR:
+ case ACPI_RESOURCE_TYPE_VENDOR:
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
"unimplemented VendorSpecific resource\n"));
break;
@@ -479,13 +479,15 @@ static void acpi_res_set_memory(device_t dev, void *context,
static void acpi_res_set_memoryrange(device_t dev, void *context,
u_int32_t low, u_int32_t high,
u_int32_t length, u_int32_t align);
-static void acpi_res_set_irq(device_t dev, void *context, u_int32_t *irq,
+static void acpi_res_set_irq(device_t dev, void *context, u_int8_t *irq,
int count, int trig, int pol);
-static void acpi_res_set_drq(device_t dev, void *context, u_int32_t *drq,
+static void acpi_res_set_ext_irq(device_t dev, void *context,
+ u_int32_t *irq, int count, int trig, int pol);
+static void acpi_res_set_drq(device_t dev, void *context, u_int8_t *drq,
int count);
-static void acpi_res_set_start_dependant(device_t dev, void *context,
+static void acpi_res_set_start_dependent(device_t dev, void *context,
int preference);
-static void acpi_res_set_end_dependant(device_t dev, void *context);
+static void acpi_res_set_end_dependent(device_t dev, void *context);
struct acpi_parse_resource_set acpi_res_parse_set = {
acpi_res_set_init,
@@ -495,9 +497,10 @@ struct acpi_parse_resource_set acpi_res_parse_set = {
acpi_res_set_memory,
acpi_res_set_memoryrange,
acpi_res_set_irq,
+ acpi_res_set_ext_irq,
acpi_res_set_drq,
- acpi_res_set_start_dependant,
- acpi_res_set_end_dependant
+ acpi_res_set_start_dependent,
+ acpi_res_set_end_dependent
};
struct acpi_res_context {
@@ -576,7 +579,7 @@ acpi_res_set_memoryrange(device_t dev, void *context, u_int32_t low,
}
static void
-acpi_res_set_irq(device_t dev, void *context, u_int32_t *irq, int count,
+acpi_res_set_irq(device_t dev, void *context, u_int8_t *irq, int count,
int trig, int pol)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -592,7 +595,23 @@ acpi_res_set_irq(device_t dev, void *context, u_int32_t *irq, int count,
}
static void
-acpi_res_set_drq(device_t dev, void *context, u_int32_t *drq, int count)
+acpi_res_set_ext_irq(device_t dev, void *context, u_int32_t *irq, int count,
+ int trig, int pol)
+{
+ struct acpi_res_context *cp = (struct acpi_res_context *)context;
+
+ if (cp == NULL || irq == NULL)
+ return;
+
+ /* This implements no resource relocation. */
+ if (count != 1)
+ return;
+
+ bus_set_resource(dev, SYS_RES_IRQ, cp->ar_nirq++, *irq, 1);
+}
+
+static void
+acpi_res_set_drq(device_t dev, void *context, u_int8_t *drq, int count)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -607,23 +626,23 @@ acpi_res_set_drq(device_t dev, void *context, u_int32_t *drq, int count)
}
static void
-acpi_res_set_start_dependant(device_t dev, void *context, int preference)
+acpi_res_set_start_dependent(device_t dev, void *context, int preference)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
if (cp == NULL)
return;
- device_printf(dev, "dependant functions not supported\n");
+ device_printf(dev, "dependent functions not supported\n");
}
static void
-acpi_res_set_end_dependant(device_t dev, void *context)
+acpi_res_set_end_dependent(device_t dev, void *context)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
if (cp == NULL)
return;
- device_printf(dev, "dependant functions not supported\n");
+ device_printf(dev, "dependent functions not supported\n");
}
/*
OpenPOWER on IntegriCloud