svn commit: r220805 - head/sys/dev/acpica

Jung-uk Kim jkim at FreeBSD.org
Mon Apr 18 23:12:42 UTC 2011


Author: jkim
Date: Mon Apr 18 23:12:41 2011
New Revision: 220805
URL: http://svn.freebsd.org/changeset/base/220805

Log:
  Do not assume PM timer GAS type is I/O or memory.  It may be an unsupported
  type, i. e., a broken table.  Also, do not hardcode ACPI timer frequency in
  device description.

Modified:
  head/sys/dev/acpica/acpi_timer.c

Modified: head/sys/dev/acpica/acpi_timer.c
==============================================================================
--- head/sys/dev/acpica/acpi_timer.c	Mon Apr 18 22:09:03 2011	(r220804)
+++ head/sys/dev/acpica/acpi_timer.c	Mon Apr 18 23:12:41 2011	(r220805)
@@ -130,9 +130,17 @@ acpi_timer_identify(driver_t *driver, de
     }
     acpi_timer_dev = dev;
 
+    switch (AcpiGbl_FADT.XPmTimerBlock.SpaceId) {
+    case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+	rtype = SYS_RES_MEMORY;
+	break;
+    case ACPI_ADR_SPACE_SYSTEM_IO:
+	rtype = SYS_RES_IOPORT;
+	break;
+    default:
+	return_VOID;
+    }
     rid = 0;
-    rtype = AcpiGbl_FADT.XPmTimerBlock.SpaceId ?
-	SYS_RES_IOPORT : SYS_RES_MEMORY;
     rlen = AcpiGbl_FADT.PmTimerLength;
     rstart = AcpiGbl_FADT.XPmTimerBlock.Address;
     if (bus_set_resource(dev, rtype, rid, rstart, rlen))
@@ -152,9 +160,17 @@ acpi_timer_probe(device_t dev)
     if (dev != acpi_timer_dev)
 	return (ENXIO);
 
+    switch (AcpiGbl_FADT.XPmTimerBlock.SpaceId) {
+    case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+	rtype = SYS_RES_MEMORY;
+	break;
+    case ACPI_ADR_SPACE_SYSTEM_IO:
+	rtype = SYS_RES_IOPORT;
+	break;
+    default:
+	return (ENXIO);
+    }
     rid = 0;
-    rtype = AcpiGbl_FADT.XPmTimerBlock.SpaceId ?
-	SYS_RES_IOPORT : SYS_RES_MEMORY;
     acpi_timer_reg = bus_alloc_resource_any(dev, rtype, &rid, RF_ACTIVE);
     if (acpi_timer_reg == NULL) {
 	device_printf(dev, "couldn't allocate resource (%s 0x%lx)\n",
@@ -195,8 +211,9 @@ acpi_timer_probe(device_t dev)
     }
     tc_init(&acpi_timer_timecounter);
 
-    sprintf(desc, "%d-bit timer at 3.579545MHz",
-	(AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) ? 32 : 24);
+    sprintf(desc, "%d-bit timer at %u.%06uMHz",
+	(AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) != 0 ? 32 : 24,
+	acpi_timer_frequency / 1000000, acpi_timer_frequency % 1000000);
     device_set_desc_copy(dev, desc);
 
     /* Release the resource, we'll allocate it again during attach. */
@@ -211,9 +228,17 @@ acpi_timer_attach(device_t dev)
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
+    switch (AcpiGbl_FADT.XPmTimerBlock.SpaceId) {
+    case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+	rtype = SYS_RES_MEMORY;
+	break;
+    case ACPI_ADR_SPACE_SYSTEM_IO:
+	rtype = SYS_RES_IOPORT;
+	break;
+    default:
+	return (ENXIO);
+    }
     rid = 0;
-    rtype = AcpiGbl_FADT.XPmTimerBlock.SpaceId ?
-	SYS_RES_IOPORT : SYS_RES_MEMORY;
     acpi_timer_reg = bus_alloc_resource_any(dev, rtype, &rid, RF_ACTIVE);
     if (acpi_timer_reg == NULL)
 	return (ENXIO);


More information about the svn-src-head mailing list