Hi Matthew, On Fri, 2 Mar 2007 21:46:43 +0000, Matthew Garrett wrote: > On Fri, Mar 02, 2007 at 10:41:55PM +0100, Jean Delvare wrote: > > > I like the patch, after adding some casts to the printf args it > > compiles fine. However you print warnings each time a resource has been > > reserved... without checking if it hasn't been reserved by ACPI itself! > > My machine looks like this: > > Oops! I'll look into fixing that. Thanks, that's an excellent point... Here is what I have come up with, by mixing your patch with Rudolf Marek's one. Again this is only a reporting patch, but now it only reports real unreserved accesses. I plan to use it for debugging purposes. Signed-off-by: Jean Delvare <khali at linux-fr.org> --- drivers/acpi/osl.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) --- linux-2.6.21-rc2.orig/drivers/acpi/osl.c 2007-03-06 20:59:00.000000000 +0100 +++ linux-2.6.21-rc2/drivers/acpi/osl.c 2007-03-06 21:33:13.000000000 +0100 @@ -35,6 +35,7 @@ #include <linux/kmod.h> #include <linux/delay.h> #include <linux/workqueue.h> +#include <linux/ioport.h> #include <linux/nmi.h> #include <linux/acpi.h> #include <acpi/acpi.h> @@ -370,6 +371,7 @@ u64 acpi_os_get_timer(void) acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width) { u32 dummy; + struct resource *conflict, res; if (!value) value = &dummy; @@ -388,6 +390,23 @@ acpi_status acpi_os_read_port(acpi_io_ad BUG(); } + res.flags = IORESOURCE_IO; + res.name = "_ACPI Access"; + res.start = port; + res.end = port + width/8 - 1; + + conflict = ____request_resource(&ioport_resource, &res); + while (conflict && conflict->child) + conflict = ____request_resource(conflict, &res); + + if (conflict && strncmp(conflict->name, "ACPI ", 5)) { + printk (KERN_INFO "ACPI read from allocated ioport %lx, value %lx, width %d\n", + (unsigned long)port, (unsigned long)(*value), (int)width); + } + + if (conflict == NULL) + release_resource(&res); + return AE_OK; } @@ -395,6 +414,25 @@ EXPORT_SYMBOL(acpi_os_read_port); acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width) { + struct resource *conflict, res; + + res.flags = IORESOURCE_IO; + res.name = "_ACPI Access"; + res.start = port; + res.end = port + width/8 - 1; + + conflict = ____request_resource(&ioport_resource, &res); + while (conflict && conflict->child) + conflict = ____request_resource(conflict, &res); + + if (conflict && strncmp(conflict->name, "ACPI ", 5)) { + printk (KERN_INFO "ACPI write to allocated ioport %lx, value %lx, width %d\n", + (unsigned long)port, (unsigned long)(value), (int)width); + } + + if (conflict == NULL) + release_resource(&res); + switch (width) { case 8: outb(value, port); @@ -419,6 +457,7 @@ acpi_os_read_memory(acpi_physical_addres { u32 dummy; void __iomem *virt_addr; + struct resource *conflict, res; virt_addr = ioremap(phys_addr, width); if (!value) @@ -440,6 +479,22 @@ acpi_os_read_memory(acpi_physical_addres iounmap(virt_addr); + res.flags = IORESOURCE_MEM; + res.name = "_ACPI Access"; + res.start = phys_addr; + res.end = phys_addr + width/8 - 1; + + conflict = ____request_resource(&iomem_resource, &res); + while (conflict && conflict->child) + conflict = ____request_resource(conflict, &res); + + if (conflict && strncmp(conflict->name, "ACPI ", 5)) + pr_info("ACPI read from allocated iomem %lx, value %lx, width %d\n", + (unsigned long)phys_addr, (unsigned long)(*value), (int)width); + + if (conflict == NULL) + release_resource(&res); + return AE_OK; } @@ -447,6 +502,23 @@ acpi_status acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) { void __iomem *virt_addr; + struct resource *conflict, res; + + res.flags = IORESOURCE_MEM; + res.name = "_ACPI Access"; + res.start = phys_addr; + res.end = phys_addr + width/8 - 1; + + conflict = ____request_resource(&iomem_resource, &res); + while (conflict && conflict->child) + conflict = ____request_resource(conflict, &res); + + if (conflict && strncmp(conflict->name, "ACPI ", 5)) + pr_info("ACPI write to allocated iomem %lx, value %lx, width %d\n", + (unsigned long)phys_addr, (unsigned long)value, (int)width); + + if (conflict == NULL) + release_resource(&res); virt_addr = ioremap(phys_addr, width); -- Jean Delvare