
On Mon, May 11, 2020 at 4:34 AM Simon Glass sjg@chromium.org wrote:
Add a function to build up the ACPI path for a device and another for its scope.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Wolfgang Wallner wolfgang.wallner@br-automation.com
Changes in v2: None Changes in v1:
- Split into more patches for review
- Add tests
- Rebase on top of common.h series
arch/sandbox/dts/test.dts | 3 ++ include/acpi/acpi_device.h | 44 ++++++++++++++++++ lib/acpi/Makefile | 1 + lib/acpi/acpi_device.c | 83 +++++++++++++++++++++++++++++++++ test/dm/acpi.c | 95 ++++++++++++++++++++++++++++++++------ 5 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 include/acpi/acpi_device.h create mode 100644 lib/acpi/acpi_device.c
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 15cd2330a3..b802c1c909 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -253,6 +253,9 @@
acpi-test { compatible = "denx,u-boot-acpi-test";
child {
compatible = "denx,u-boot-acpi-test";
}; }; acpi-test2 {
diff --git a/include/acpi/acpi_device.h b/include/acpi/acpi_device.h new file mode 100644 index 0000000000..37a675f101 --- /dev/null +++ b/include/acpi/acpi_device.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/*
- Generation of tables for particular device types
- Copyright 2019 Google LLC
- Mostly taken from coreboot file of the same name
- */
+#ifndef __ACPI_DEVICE_H +#define __ACPI_DEVICE_H
+struct udevice;
+/* Length of a full path to an ACPI device */ +#define ACPI_PATH_MAX 30
+/**
- acpi_device_path() - Get the full path to an ACPI device
- This gets the full path in the form XXXX.YYYY.ZZZZ where XXXX is the root
- and ZZZZ is the device. All parent devices are added to the path.
- @dev: Device to check
- @buf: Buffer to place the path in (should be ACPI_PATH_MAX long)
- @maxlen: Size of buffer (typically ACPI_PATH_MAX)
- @return 0 if OK, -ve on error
- */
+int acpi_device_path(const struct udevice *dev, char *buf, int maxlen);
+/**
- acpi_device_scope() - Get the scope of an ACPI device
- This gets the scope which is the full path of the parent device, as per
- acpi_device_path().
- @dev: Device to check
- @buf: Buffer to place the path in (should be ACPI_PATH_MAX long)
- @maxlen: Size of buffer (typically ACPI_PATH_MAX)
- @return 0 if OK, -EINVAL if the device has no parent, other -ve on other
error
- */
+int acpi_device_scope(const struct udevice *dev, char *scope, int maxlen);
+#endif diff --git a/lib/acpi/Makefile b/lib/acpi/Makefile index 660491ef71..caae6c01bd 100644 --- a/lib/acpi/Makefile +++ b/lib/acpi/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0+ #
+obj-y += acpi_device.o obj-y += acpi_table.o diff --git a/lib/acpi/acpi_device.c b/lib/acpi/acpi_device.c new file mode 100644 index 0000000000..f9af2343c1 --- /dev/null +++ b/lib/acpi/acpi_device.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-2.0 +/*
- Generation of tables for particular device types
- Copyright 2019 Google LLC
- Mostly taken from coreboot file of the same name
- */
+#include <common.h> +#include <dm.h> +#include <log.h> +#include <acpi/acpi_device.h> +#include <dm/acpi.h>
+/**
- acpi_device_path_fill() - Find the root device and build a path from there
- This recursively reaches back to the root device and progressively adds path
- elements until the device is reached.
- @dev: Device to return path of
- @buf: Buffer to hold the path
- @buf_len: Length of buffer
- @cur: Current position in the buffer
- @return new position in buffer after adding @dev, or -ve on error
- */
+static int acpi_device_path_fill(const struct udevice *dev, char *buf,
size_t buf_len, int cur)
+{
char name[ACPI_NAME_MAX];
int next = 0;
int ret;
ret = acpi_get_name(dev, name);
if (ret)
return ret;
/*
* Make sure this name segment will fit, including the path segment
* separator and possible NUL terminator, if this is the last segment.
typo: NULL
*/
if (cur + strlen(name) + 2 > buf_len)
return -ENOSPC;
/* Walk up the tree to the root device */
if (dev_get_parent(dev)) {
next = acpi_device_path_fill(dev_get_parent(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",
dev_get_parent(dev) && *name ? "." : "", name);
return next;
+}
[snip]
Reviewed-by: Bin Meng bmeng.cn@gmail.com