Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Jan 2014 22:51:10 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r260350 - stable/10/sys/dev/acpica
Message-ID:  <201401052251.s05MpAk1016651@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sun Jan  5 22:51:09 2014
New Revision: 260350
URL: http://svnweb.freebsd.org/changeset/base/260350

Log:
  MFC r258164:
  Handle case when ACPI reports HPET device, but does not provide memory
  resource for it.  In such case take the address range from the HPET table.
  
  This fixes hpet(4) driver attach on Asrock C2750D4I board.

Modified:
  stable/10/sys/dev/acpica/acpi_hpet.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/acpica/acpi_hpet.c
==============================================================================
--- stable/10/sys/dev/acpica/acpi_hpet.c	Sun Jan  5 22:50:32 2014	(r260349)
+++ stable/10/sys/dev/acpica/acpi_hpet.c	Sun Jan  5 22:51:09 2014	(r260350)
@@ -293,7 +293,7 @@ hpet_find(ACPI_HANDLE handle, UINT32 lev
 		return (AE_OK);
 	if (ACPI_FAILURE(acpi_GetInteger(handle, "_UID", &uid)) ||
 	    id == uid)
-		*((int *)status) = 1;
+		*status = acpi_get_device(handle);
 	return (AE_OK);
 }
 
@@ -321,7 +321,7 @@ hpet_identify(driver_t *driver, device_t
 	ACPI_TABLE_HPET *hpet;
 	ACPI_STATUS	status;
 	device_t	child;
-	int 		i, found;
+	int		i;
 
 	/* Only one HPET device can be added. */
 	if (devclass_get_device(hpet_devclass, 0))
@@ -332,12 +332,18 @@ hpet_identify(driver_t *driver, device_t
 		if (ACPI_FAILURE(status))
 			return;
 		/* Search for HPET device with same ID. */
-		found = 0;
+		child = NULL;
 		AcpiWalkNamespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
-		    100, hpet_find, NULL, (void *)(uintptr_t)hpet->Sequence, (void *)&found);
+		    100, hpet_find, NULL, (void *)(uintptr_t)hpet->Sequence,
+		    (void *)&child);
 		/* If found - let it be probed in normal way. */
-		if (found)
+		if (child) {
+			if (bus_get_resource(child, SYS_RES_MEMORY, 0,
+			    NULL, NULL) != 0)
+				bus_set_resource(child, SYS_RES_MEMORY, 0,
+				    hpet->Address.Address, HPET_MEM_WIDTH);
 			continue;
+		}
 		/* If not - create it from table info. */
 		child = BUS_ADD_CHILD(parent, 2, "hpet", 0);
 		if (child == NULL) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401052251.s05MpAk1016651>