diff options
Diffstat (limited to 'sys/dev/acpica/acpi_resource.c')
-rw-r--r-- | sys/dev/acpica/acpi_resource.c | 247 |
1 files changed, 126 insertions, 121 deletions
diff --git a/sys/dev/acpica/acpi_resource.c b/sys/dev/acpica/acpi_resource.c index b7d465c..7a428ca 100644 --- a/sys/dev/acpica/acpi_resource.c +++ b/sys/dev/acpica/acpi_resource.c @@ -38,12 +38,9 @@ __FBSDID("$FreeBSD$"); #include <sys/rman.h> #include "acpi.h" - #include <dev/acpica/acpivar.h> -/* - * Hooks for the ACPI CA debugging infrastructure - */ +/* Hooks for the ACPI CA debugging infrastructure */ #define _COMPONENT ACPI_BUS ACPI_MODULE_NAME("RESOURCE") @@ -58,7 +55,8 @@ ACPI_MODULE_NAME("RESOURCE") * code for _PRS someday. */ ACPI_STATUS -acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resource_set *set) +acpi_parse_resources(device_t dev, ACPI_HANDLE handle, + struct acpi_parse_resource_set *set) { ACPI_BUFFER buf; ACPI_RESOURCE *res; @@ -78,85 +76,79 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc * the PCI interrupt link. */ - /* - * Fetch the device's current resources. - */ + /* Fetch the device's current resources. */ buf.Length = ACPI_ALLOCATE_BUFFER; if (ACPI_FAILURE((status = AcpiGetCurrentResources(handle, &buf)))) { if (status != AE_NOT_FOUND) printf("can't fetch resources for %s - %s\n", acpi_name(handle), AcpiFormatException(status)); - return_ACPI_STATUS(status); + return_ACPI_STATUS (status); } ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s - got %ld bytes of resources\n", - acpi_name(handle), (long)buf.Length)); + acpi_name(handle), (long)buf.Length)); set->set_init(dev, &context); - /* - * Iterate through the resources - */ + /* Iterate through the resources */ curr = buf.Pointer; last = (char *)buf.Pointer + buf.Length; while (curr < last) { res = (ACPI_RESOURCE *)curr; curr += res->Length; - /* - * Handle the individual resource types - */ + /* Handle the individual resource types */ switch(res->Id) { case ACPI_RSTYPE_END_TAG: ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n")); curr = last; break; - case ACPI_RSTYPE_FIXED_IO: if (res->Data.FixedIo.RangeLength <= 0) break; ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedIo 0x%x/%d\n", - res->Data.FixedIo.BaseAddress, - res->Data.FixedIo.RangeLength)); + res->Data.FixedIo.BaseAddress, + res->Data.FixedIo.RangeLength)); set->set_ioport(dev, context, res->Data.FixedIo.BaseAddress, res->Data.FixedIo.RangeLength); break; - case ACPI_RSTYPE_IO: if (res->Data.Io.RangeLength <= 0) break; if (res->Data.Io.MinBaseAddress == res->Data.Io.MaxBaseAddress) { ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x/%d\n", - res->Data.Io.MinBaseAddress, - res->Data.Io.RangeLength)); + res->Data.Io.MinBaseAddress, + res->Data.Io.RangeLength)); set->set_ioport(dev, context, res->Data.Io.MinBaseAddress, res->Data.Io.RangeLength); } 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.MinBaseAddress, + res->Data.Io.MaxBaseAddress, + res->Data.Io.RangeLength)); set->set_iorange(dev, context, res->Data.Io.MinBaseAddress, res->Data.Io.MaxBaseAddress, - res->Data.Io.RangeLength, res->Data.Io.Alignment); + res->Data.Io.RangeLength, + res->Data.Io.Alignment); } break; - case ACPI_RSTYPE_FIXED_MEM32: if (res->Data.FixedMemory32.RangeLength <= 0) break; ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedMemory32 0x%x/%d\n", res->Data.FixedMemory32.RangeBaseAddress, res->Data.FixedMemory32.RangeLength)); - set->set_memory(dev, context, res->Data.FixedMemory32.RangeBaseAddress, + set->set_memory(dev, context, + res->Data.FixedMemory32.RangeBaseAddress, res->Data.FixedMemory32.RangeLength); break; - case ACPI_RSTYPE_MEM32: if (res->Data.Memory32.RangeLength <= 0) break; - if (res->Data.Memory32.MinBaseAddress == res->Data.Memory32.MaxBaseAddress) { + if (res->Data.Memory32.MinBaseAddress == + res->Data.Memory32.MaxBaseAddress) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x/%d\n", res->Data.Memory32.MinBaseAddress, res->Data.Memory32.RangeLength)); @@ -165,9 +157,9 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc res->Data.Memory32.RangeLength); } 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.MinBaseAddress, + res->Data.Memory32.MaxBaseAddress, + res->Data.Memory32.RangeLength)); set->set_memoryrange(dev, context, res->Data.Memory32.MinBaseAddress, res->Data.Memory32.MaxBaseAddress, @@ -175,21 +167,22 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc res->Data.Memory32.Alignment); } break; - case ACPI_RSTYPE_MEM24: if (res->Data.Memory24.RangeLength <= 0) break; - if (res->Data.Memory24.MinBaseAddress == res->Data.Memory24.MaxBaseAddress) { + if (res->Data.Memory24.MinBaseAddress == + res->Data.Memory24.MaxBaseAddress) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x/%d\n", - res->Data.Memory24.MinBaseAddress, - res->Data.Memory24.RangeLength)); + res->Data.Memory24.MinBaseAddress, + res->Data.Memory24.RangeLength)); set->set_memory(dev, context, res->Data.Memory24.MinBaseAddress, res->Data.Memory24.RangeLength); } 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.MinBaseAddress, + res->Data.Memory24.MaxBaseAddress, + res->Data.Memory24.RangeLength)); set->set_memoryrange(dev, context, res->Data.Memory24.MinBaseAddress, res->Data.Memory24.MaxBaseAddress, @@ -197,7 +190,6 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc res->Data.Memory24.Alignment); } break; - case ACPI_RSTYPE_IRQ: /* * from 1.0b 6.4.2 @@ -207,78 +199,79 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc set->set_irq(dev, context, res->Data.Irq.Interrupts, res->Data.Irq.NumberOfInterrupts); break; - case ACPI_RSTYPE_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); break; - case ACPI_RSTYPE_START_DPF: ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "start dependant functions\n")); set->set_start_dependant(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); break; - case ACPI_RSTYPE_ADDRESS32: if (res->Data.Address32.AddressLength <= 0) break; if (res->Data.Address32.ProducerConsumer != ACPI_CONSUMER) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "ignored Address32 %s producer\n", - (res->Data.Address32.ResourceType == ACPI_IO_RANGE) ? - "IO" : "Memory")); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "ignored Address32 %s producer\n", + res->Data.Address32.ResourceType == ACPI_IO_RANGE ? + "IO" : "Memory")); break; } if (res->Data.Address32.ResourceType != ACPI_MEMORY_RANGE && res->Data.Address32.ResourceType != ACPI_IO_RANGE) { ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "ignored Address32 for non-memory, non-I/O\n")); + "ignored Address32 for non-memory, non-I/O\n")); break; } - if ((res->Data.Address32.MinAddressFixed == ACPI_ADDRESS_FIXED) && - (res->Data.Address32.MaxAddressFixed == ACPI_ADDRESS_FIXED)) { + if (res->Data.Address32.MinAddressFixed == ACPI_ADDRESS_FIXED && + res->Data.Address32.MaxAddressFixed == ACPI_ADDRESS_FIXED) { + 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.AddressLength)); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "Address32/Memory 0x%x/%d\n", + res->Data.Address32.MinAddressRange, + res->Data.Address32.AddressLength)); set->set_memory(dev, context, res->Data.Address32.MinAddressRange, res->Data.Address32.AddressLength); } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Address32/IO 0x%x/%d\n", - res->Data.Address32.MinAddressRange, - res->Data.Address32.AddressLength)); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "Address32/IO 0x%x/%d\n", + res->Data.Address32.MinAddressRange, + res->Data.Address32.AddressLength)); set->set_ioport(dev, context, res->Data.Address32.MinAddressRange, 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.AddressLength)); + 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.AddressLength)); set->set_memoryrange(dev, context, res->Data.Address32.MinAddressRange, res->Data.Address32.MaxAddressRange, 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.AddressLength)); + 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.AddressLength)); set->set_iorange(dev, context, res->Data.Address32.MinAddressRange, res->Data.Address32.MaxAddressRange, @@ -287,14 +280,14 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc } } break; - case ACPI_RSTYPE_ADDRESS16: if (res->Data.Address16.AddressLength <= 0) break; if (res->Data.Address16.ProducerConsumer != ACPI_CONSUMER) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "ignored Address16 %s producer\n", - (res->Data.Address16.ResourceType == ACPI_IO_RANGE) ? - "IO" : "Memory")); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "ignored Address16 %s producer\n", + res->Data.Address16.ResourceType == ACPI_IO_RANGE ? + "IO" : "Memory")); break; } if (res->Data.Address16.ResourceType != ACPI_MEMORY_RANGE && @@ -304,39 +297,44 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc break; } - if ((res->Data.Address16.MinAddressFixed == ACPI_ADDRESS_FIXED) && - (res->Data.Address16.MaxAddressFixed == ACPI_ADDRESS_FIXED)) { + if (res->Data.Address16.MinAddressFixed == ACPI_ADDRESS_FIXED && + res->Data.Address16.MaxAddressFixed == ACPI_ADDRESS_FIXED) { + 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.AddressLength)); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "Address16/Memory 0x%x/%d\n", + res->Data.Address16.MinAddressRange, + res->Data.Address16.AddressLength)); set->set_memory(dev, context, res->Data.Address16.MinAddressRange, res->Data.Address16.AddressLength); } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Address16/IO 0x%x/%d\n", - res->Data.Address16.MinAddressRange, - res->Data.Address16.AddressLength)); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "Address16/IO 0x%x/%d\n", + res->Data.Address16.MinAddressRange, + res->Data.Address16.AddressLength)); set->set_ioport(dev, context, res->Data.Address16.MinAddressRange, 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.AddressLength)); + 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.AddressLength)); set->set_memoryrange(dev, context, res->Data.Address16.MinAddressRange, res->Data.Address16.MaxAddressRange, 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.AddressLength)); + 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.AddressLength)); set->set_iorange(dev, context, res->Data.Address16.MinAddressRange, res->Data.Address16.MaxAddressRange, @@ -345,27 +343,27 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc } } break; - case ACPI_RSTYPE_ADDRESS64: - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "unimplemented Address64 resource\n")); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "unimplemented Address64 resource\n")); break; - case ACPI_RSTYPE_EXT_IRQ: /* XXX special handling? */ set->set_irq(dev, context,res->Data.ExtendedIrq.Interrupts, res->Data.ExtendedIrq.NumberOfInterrupts); break; - case ACPI_RSTYPE_VENDOR: - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "unimplemented VendorSpecific resource\n")); + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "unimplemented VendorSpecific resource\n")); break; default: break; } } + AcpiOsFree(buf.Pointer); set->set_done(dev, context); - return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS (AE_OK); } /* @@ -374,17 +372,22 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc */ static void acpi_res_set_init(device_t dev, void **context); static void acpi_res_set_done(device_t dev, void *context); -static void acpi_res_set_ioport(device_t dev, void *context, u_int32_t base, u_int32_t length); -static void acpi_res_set_iorange(device_t dev, void *context, u_int32_t low, u_int32_t high, +static void acpi_res_set_ioport(device_t dev, void *context, + u_int32_t base, u_int32_t length); +static void acpi_res_set_iorange(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_memory(device_t dev, void *context, u_int32_t base, u_int32_t length); -static void acpi_res_set_memoryrange(device_t dev, void *context, u_int32_t low, u_int32_t high, +static void acpi_res_set_memory(device_t dev, void *context, + u_int32_t base, u_int32_t length); +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, int count); static void 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); +static void acpi_res_set_start_dependant(device_t dev, void *context, + int preference); static void acpi_res_set_end_dependant(device_t dev, void *context); struct acpi_parse_resource_set acpi_res_parse_set = { @@ -429,7 +432,8 @@ acpi_res_set_done(device_t dev, void *context) } static void -acpi_res_set_ioport(device_t dev, void *context, u_int32_t base, u_int32_t length) +acpi_res_set_ioport(device_t dev, void *context, u_int32_t base, + u_int32_t length) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -439,7 +443,8 @@ acpi_res_set_ioport(device_t dev, void *context, u_int32_t base, u_int32_t lengt } static void -acpi_res_set_iorange(device_t dev, void *context, u_int32_t low, u_int32_t high, u_int32_t length, u_int32_t align) +acpi_res_set_iorange(device_t dev, void *context, u_int32_t low, + u_int32_t high, u_int32_t length, u_int32_t align) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -449,7 +454,8 @@ acpi_res_set_iorange(device_t dev, void *context, u_int32_t low, u_int32_t high, } static void -acpi_res_set_memory(device_t dev, void *context, u_int32_t base, u_int32_t length) +acpi_res_set_memory(device_t dev, void *context, u_int32_t base, + u_int32_t length) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -460,7 +466,8 @@ acpi_res_set_memory(device_t dev, void *context, u_int32_t base, u_int32_t lengt } 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) +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) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -474,13 +481,11 @@ acpi_res_set_irq(device_t dev, void *context, u_int32_t *irq, int count) { struct acpi_res_context *cp = (struct acpi_res_context *)context; - if (cp == NULL) - return; - if (irq == NULL) + if (cp == NULL || irq == NULL) return; - /*This implements no resource relocation.*/ - if(count != 1) + /* This implements no resource relocation. */ + if (count != 1) return; bus_set_resource(dev, SYS_RES_IRQ, cp->ar_nirq++, *irq, 1); @@ -491,13 +496,11 @@ acpi_res_set_drq(device_t dev, void *context, u_int32_t *drq, int count) { struct acpi_res_context *cp = (struct acpi_res_context *)context; - if (cp == NULL) - return; - if (drq == NULL) + if (cp == NULL || drq == NULL) return; - /*This implements no resource relocation.*/ - if(count != 1) + /* This implements no resource relocation. */ + if (count != 1) return; bus_set_resource(dev, SYS_RES_DRQ, cp->ar_ndrq++, *drq, 1); @@ -520,6 +523,7 @@ acpi_res_set_end_dependant(device_t dev, void *context) if (cp == NULL) return; + device_printf(dev, "dependant functions not supported\n"); } /* @@ -553,20 +557,19 @@ static driver_t acpi_sysresource_driver = { }; static devclass_t acpi_sysresource_devclass; -DRIVER_MODULE(acpi_sysresource, acpi, acpi_sysresource_driver, acpi_sysresource_devclass, 0, 0); +DRIVER_MODULE(acpi_sysresource, acpi, acpi_sysresource_driver, + acpi_sysresource_devclass, 0, 0); static int acpi_sysresource_probe(device_t dev) { - if (acpi_disabled("sysresource")) - return(ENXIO); - if (acpi_MatchHid(dev, "PNP0C02")) { + if (!acpi_disabled("sysresource") && acpi_MatchHid(dev, "PNP0C02")) device_set_desc(dev, "system resource"); - } else { - return(ENXIO); - } + else + return (ENXIO); + device_quiet(dev); - return(-100); + return (-100); } static int @@ -587,7 +590,9 @@ acpi_sysresource_attach(device_t dev) rid = i; res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0, ~0, 1, 0); rid = i; - res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, RF_SHAREABLE); + res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, + RF_SHAREABLE); } - return(0); + + return (0); } |