[coreboot-gerrit] Change in coreboot[master]: acpi: device: Walk up the tree to find identifier

Duncan Laurie (Code Review) gerrit at coreboot.org
Wed May 23 01:40:09 CEST 2018


Duncan Laurie has uploaded this change for review. ( https://review.coreboot.org/26487


Change subject: acpi: device: Walk up the tree to find identifier
......................................................................

acpi: device: Walk up the tree to find identifier

Instead of just checking the immediate parent for an device name,
walk up the tree to check if any parent can identify the device.

This allows devices to be nested more than one level deep and
still have them identified in one place by the SOC.

The recursive method calling this function has been changed to
handle a null return from acpi_device_name and abort instead of
continuing and perhaps forming an invalid ACPI path.

Change-Id: Ic17c5b6facdcb1a0ac696912867d62652b2bf18e
Signed-off-by: Duncan Laurie <dlaurie at google.com>
---
M src/arch/x86/acpi_device.c
1 file changed, 22 insertions(+), 7 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/87/26487/1

diff --git a/src/arch/x86/acpi_device.c b/src/arch/x86/acpi_device.c
index c8d313e..c838015 100644
--- a/src/arch/x86/acpi_device.c
+++ b/src/arch/x86/acpi_device.c
@@ -55,6 +55,9 @@
 /* Locate and return the ACPI name for this device */
 const char *acpi_device_name(struct device *dev)
 {
+	struct device *pdev = dev;
+	const char *name;
+
 	if (!dev)
 		return NULL;
 
@@ -62,30 +65,42 @@
 	if (dev->ops->acpi_name)
 		return dev->ops->acpi_name(dev);
 
-	/* Check parent device in case it has a global handler */
-	if (dev->bus && dev->bus->dev->ops->acpi_name)
-		return dev->bus->dev->ops->acpi_name(dev);
+	/* Walk up the tree to find if any parent can identify this device */
+	while (pdev->bus) {
+		if (pdev->path.type == DEVICE_PATH_ROOT)
+			break;
+		if (pdev->bus->dev->ops && pdev->bus->dev->ops->acpi_name)
+			name = pdev->bus->dev->ops->acpi_name(dev);
+		if (name)
+			return name;
+		pdev = pdev->bus->dev;
+	}
 
 	return NULL;
 }
 
 /* Recursive function to find the root device and print a path from there */
-static size_t acpi_device_path_fill(struct device *dev, char *buf,
-				    size_t buf_len, size_t cur)
+static ssize_t acpi_device_path_fill(struct device *dev, char *buf,
+				     size_t buf_len, size_t cur)
 {
 	const char *name = acpi_device_name(dev);
-	size_t next = 0;
+	ssize_t next = 0;
+
+	if (!name)
+		return -1;
 
 	/*
 	 * Make sure this name segment will fit, including the path segment
 	 * separator and possible NUL terminator if this is the last segment.
 	 */
-	if (!dev || !name || (cur + strlen(name) + 2) > buf_len)
+	if (!dev || (cur + strlen(name) + 2) > buf_len)
 		return cur;
 
 	/* Walk up the tree to the root device */
 	if (dev->path.type != DEVICE_PATH_ROOT && dev->bus && dev->bus->dev)
 		next = acpi_device_path_fill(dev->bus->dev, buf, buf_len, cur);
+	if (next < 0)
+		return next;
 
 	/* Fill in the path from the root device */
 	next += snprintf(buf + next, buf_len - next, "%s%s",

-- 
To view, visit https://review.coreboot.org/26487
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic17c5b6facdcb1a0ac696912867d62652b2bf18e
Gerrit-Change-Number: 26487
Gerrit-PatchSet: 1
Gerrit-Owner: Duncan Laurie <dlaurie at chromium.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180522/aa7c88b1/attachment.html>


More information about the coreboot-gerrit mailing list