summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2020-07-07 13:11:39 -0600
committerBin Meng <bmeng.cn@gmail.com>2020-07-17 14:32:24 +0800
commit1361a53c1ae1f0534825e12ed41fb44aefd2c224 (patch)
tree628a4f293065b7b549edadc42868d10a190d8019 /test
parent4b724a13770c39ee3806dd30d349b6f8d03cfbc6 (diff)
downloadu-boot-1361a53c1ae1f0534825e12ed41fb44aefd2c224.tar.gz
u-boot-1361a53c1ae1f0534825e12ed41fb44aefd2c224.tar.xz
u-boot-1361a53c1ae1f0534825e12ed41fb44aefd2c224.zip
acpi: Add a function to get a device path and scope
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> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/dm/acpi.c95
1 files changed, 82 insertions, 13 deletions
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index 4c46dd83a6..5b8459311c 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -14,14 +14,27 @@
#include <version.h>
#include <tables_csum.h>
#include <version.h>
+#include <acpi/acpi_device.h>
#include <acpi/acpi_table.h>
#include <dm/acpi.h>
#include <dm/test.h>
#include <test/ut.h>
#define ACPI_TEST_DEV_NAME "ABCD"
+#define ACPI_TEST_CHILD_NAME "EFGH"
#define BUF_SIZE 4096
+/**
+ * struct testacpi_platdata - Platform data for the test ACPI device
+ *
+ * @no_name: true to emit an empty ACPI name from testacpi_get_name()
+ * @return_error: true to return an error instead of a name
+ */
+struct testacpi_platdata {
+ bool return_error;
+ bool no_name;
+};
+
static int testacpi_write_tables(const struct udevice *dev,
struct acpi_ctx *ctx)
{
@@ -40,7 +53,18 @@ static int testacpi_write_tables(const struct udevice *dev,
static int testacpi_get_name(const struct udevice *dev, char *out_name)
{
- return acpi_copy_name(out_name, ACPI_TEST_DEV_NAME);
+ struct testacpi_platdata *plat = dev_get_platdata(dev);
+
+ if (plat->return_error)
+ return -EINVAL;
+ if (plat->no_name) {
+ *out_name = '\0';
+ return 0;
+ }
+ if (device_get_uclass_id(dev->parent) == UCLASS_TEST_ACPI)
+ return acpi_copy_name(out_name, ACPI_TEST_CHILD_NAME);
+ else
+ return acpi_copy_name(out_name, ACPI_TEST_DEV_NAME);
}
struct acpi_ops testacpi_ops = {
@@ -57,6 +81,8 @@ U_BOOT_DRIVER(testacpi_drv) = {
.name = "testacpi_drv",
.of_match = testacpi_ids,
.id = UCLASS_TEST_ACPI,
+ .bind = dm_scan_fdt_dev,
+ .platdata_auto_alloc_size = sizeof(struct testacpi_platdata),
ACPI_OPS_PTR(&testacpi_ops)
};
@@ -138,6 +164,7 @@ static int dm_test_acpi_write_tables(struct unit_test_state *uts)
struct acpi_dmar *dmar;
struct acpi_ctx ctx;
void *buf;
+ int i;
buf = malloc(BUF_SIZE);
ut_assertnonnull(buf);
@@ -147,24 +174,26 @@ static int dm_test_acpi_write_tables(struct unit_test_state *uts)
ut_assertok(acpi_write_dev_tables(&ctx));
/*
- * We should have two dmar tables, one for each "denx,u-boot-acpi-test"
- * device
+ * We should have three dmar tables, one for each
+ * "denx,u-boot-acpi-test" device
*/
- ut_asserteq_ptr(dmar + 2, ctx.current);
+ ut_asserteq_ptr(dmar + 3, ctx.current);
ut_asserteq(DMAR_INTR_REMAP, dmar->flags);
ut_asserteq(32 - 1, dmar->host_address_width);
ut_asserteq(DMAR_INTR_REMAP, dmar[1].flags);
ut_asserteq(32 - 1, dmar[1].host_address_width);
- /* Check that the pointers were added correctly */
- ut_asserteq(map_to_sysmem(dmar), ctx.rsdt->entry[0]);
- ut_asserteq(map_to_sysmem(dmar + 1), ctx.rsdt->entry[1]);
- ut_asserteq(0, ctx.rsdt->entry[2]);
+ ut_asserteq(DMAR_INTR_REMAP, dmar[2].flags);
+ ut_asserteq(32 - 1, dmar[2].host_address_width);
- ut_asserteq(map_to_sysmem(dmar), ctx.xsdt->entry[0]);
- ut_asserteq(map_to_sysmem(dmar + 1), ctx.xsdt->entry[1]);
- ut_asserteq(0, ctx.xsdt->entry[2]);
+ /* Check that the pointers were added correctly */
+ for (i = 0; i < 3; i++) {
+ ut_asserteq(map_to_sysmem(dmar + i), ctx.rsdt->entry[i]);
+ ut_asserteq(map_to_sysmem(dmar + i), ctx.xsdt->entry[i]);
+ }
+ ut_asserteq(0, ctx.rsdt->entry[3]);
+ ut_asserteq(0, ctx.xsdt->entry[3]);
return 0;
}
@@ -268,17 +297,20 @@ static int dm_test_acpi_cmd_list(struct unit_test_state *uts)
addr = ALIGN(addr + sizeof(struct acpi_rsdp), 16);
ut_assert_nextline("RSDT %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
addr, sizeof(struct acpi_table_header) +
- 2 * sizeof(u32), U_BOOT_BUILD_DATE);
+ 3 * sizeof(u32), U_BOOT_BUILD_DATE);
addr = ALIGN(addr + sizeof(struct acpi_rsdt), 16);
ut_assert_nextline("XSDT %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
addr, sizeof(struct acpi_table_header) +
- 2 * sizeof(u64), U_BOOT_BUILD_DATE);
+ 3 * sizeof(u64), U_BOOT_BUILD_DATE);
addr = ALIGN(addr + sizeof(struct acpi_xsdt), 64);
ut_assert_nextline("DMAR %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
addr, sizeof(struct acpi_dmar), U_BOOT_BUILD_DATE);
addr = ALIGN(addr + sizeof(struct acpi_dmar), 16);
ut_assert_nextline("DMAR %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
addr, sizeof(struct acpi_dmar), U_BOOT_BUILD_DATE);
+ addr = ALIGN(addr + sizeof(struct acpi_dmar), 16);
+ ut_assert_nextline("DMAR %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
+ addr, sizeof(struct acpi_dmar), U_BOOT_BUILD_DATE);
ut_assert_console_end();
return 0;
@@ -315,3 +347,40 @@ static int dm_test_acpi_cmd_dump(struct unit_test_state *uts)
return 0;
}
DM_TEST(dm_test_acpi_cmd_dump, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test acpi_device_path() */
+static int dm_test_acpi_device_path(struct unit_test_state *uts)
+{
+ struct testacpi_platdata *plat;
+ char buf[ACPI_PATH_MAX];
+ struct udevice *dev, *child;
+
+ ut_assertok(uclass_first_device_err(UCLASS_TEST_ACPI, &dev));
+ ut_assertok(acpi_device_path(dev, buf, sizeof(buf)));
+ ut_asserteq_str("\\_SB." ACPI_TEST_DEV_NAME, buf);
+
+ /* Test running out of space */
+ buf[5] = '\0';
+ ut_asserteq(-ENOSPC, acpi_device_path(dev, buf, 5));
+ ut_asserteq('\0', buf[5]);
+
+ /* Test a three-component name */
+ ut_assertok(device_first_child_err(dev, &child));
+ ut_assertok(acpi_device_path(child, buf, sizeof(buf)));
+ ut_asserteq_str("\\_SB." ACPI_TEST_DEV_NAME "." ACPI_TEST_CHILD_NAME,
+ buf);
+
+ /* Test handling of a device which doesn't produce a name */
+ plat = dev_get_platdata(dev);
+ plat->no_name = true;
+ ut_assertok(acpi_device_path(child, buf, sizeof(buf)));
+ ut_asserteq_str("\\_SB." ACPI_TEST_CHILD_NAME, buf);
+
+ /* Test handling of a device which returns an error */
+ plat = dev_get_platdata(dev);
+ plat->return_error = true;
+ ut_asserteq(-EINVAL, acpi_device_path(child, buf, sizeof(buf)));
+
+ return 0;
+}
+DM_TEST(dm_test_acpi_device_path, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);