[PATCH] Adjust hints matching for ACPI devices

From: John Baldwin <jhb_at_freebsd.org>
Date: Thu, 20 Aug 2009 17:05:20 -0400
This patch adjusts how the acpi0 device matches hint devices with built-in 
devices.  First, it relaxes the matching somewhat so that if the memory and 
I/O ports specified in hints match a device then mismatches in IRQs or DRQs 
are ignored.  This should fix the problem with atrtc1 devices because the 
ACPI-enumerated atrtc device did not include an IRQ.  The second change is a 
hack to allow floppy drive controllers to match the hints on systems where 
the BIOS does not include 0x3f0 in the list of resources for the floppy drive 
(see the comments above fdc_isa_alloc_resources() for the gory details).  
This should fix the reports of the floppy controller showing up as fdc1 
rather than fdc0.

--- //depot/vendor/freebsd/src/sys/dev/acpica/acpi.c	2009/08/02 14:30:16
+++ //depot/user/jhb/acpipci/dev/acpica/acpi.c	2009/08/20 21:00:30
_at__at_ -1008,14 +1004,27 _at__at_
 	    continue;
 
 	/*
-	 * Check for matching resources.  We must have at least one,
-	 * and all resources specified have to match.
+	 * Check for matching resources.  We must have at least one match.
+	 * Since I/O and memory resources cannot be shared, if we get a
+	 * match on either of those, ignore any mismatches in IRQs or DRQs.
 	 *
 	 * XXX: We may want to revisit this to be more lenient and wire
 	 * as long as it gets one match.
 	 */
 	matches = 0;
 	if (resource_long_value(name, unit, "port", &value) == 0) {
+	    /*
+	     * Floppy drive controllers are notorious for having a
+	     * wide variety of resources not all of which include the
+	     * first port that is specified by the hint (typically
+	     * 0x3f0) (see the comment above fdc_isa_alloc_resources()
+	     * in fdc_isa.c).  However, they do all seem to include
+	     * port + 2 (e.g. 0x3f2) so for a floppy device, look for
+	     * 'value + 2' in the port resources instead of the hint
+	     * value.
+	     */
+	    if (strcmp(name, "fdc") == 0)
+		value += 2;
 	    if (acpi_match_resource_hint(child, SYS_RES_IOPORT, value))
 		matches++;
 	    else
_at__at_ -1027,6 +1036,8 _at__at_
 	    else
 		continue;
 	}
+	if (matches > 0)
+	    goto matched;
 	if (resource_long_value(name, unit, "irq", &value) == 0) {
 	    if (acpi_match_resource_hint(child, SYS_RES_IRQ, value))
 		matches++;
_at__at_ -1040,6 +1051,7 _at__at_
 		continue;
 	}
 
+    matched:
 	if (matches > 0) {
 	    /* We have a winner! */
 	    *unitp = unit;

-- 
John Baldwin
Received on Thu Aug 20 2009 - 19:05:27 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:54 UTC