[PATCH v3 21/35] acpi: Support copying properties from device tree to ACPI
Bin Meng
bmeng.cn at gmail.com
Mon Jun 29 05:00:05 CEST 2020
Hi Simon,
On Sun, Jun 14, 2020 at 10:55 AM Simon Glass <sjg at chromium.org> wrote:
>
> Some drivers in Linux support both device tree and ACPI. U-Boot itself
> uses Linux device-tree bindings for its own configuration but does not use
> ACPI.
>
> It is convenient to copy these values over to the device tree for passing
copy these values over to "ACPI DP table"
> to linux. Add some convenience functions to help with this.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v3:
> - Fix incorrect function names and arguments in commments
> - Add error checking for acpi_dp_add...() functions
>
> arch/sandbox/dts/test.dts | 1 +
> include/acpi/acpi_dp.h | 51 +++++++++++++++++++++++++++++
> lib/acpi/acpi_dp.c | 56 ++++++++++++++++++++++++++++++++
> test/dm/acpi_dp.c | 67 +++++++++++++++++++++++++++++++++++++++
> 4 files changed, 175 insertions(+)
>
> diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
> index bad0b4f1a8..173778b09c 100644
> --- a/arch/sandbox/dts/test.dts
> +++ b/arch/sandbox/dts/test.dts
> @@ -111,6 +111,7 @@
> uint-value = <(-1234)>;
> int64-value = /bits/ 64 <0x1111222233334444>;
> int-array = <5678 9123 4567>;
> + str-value = "test string";
> interrupts-extended = <&irq 3 0>;
> };
>
> diff --git a/include/acpi/acpi_dp.h b/include/acpi/acpi_dp.h
> index efbec3d152..a90abcb102 100644
> --- a/include/acpi/acpi_dp.h
> +++ b/include/acpi/acpi_dp.h
> @@ -228,9 +228,60 @@ struct acpi_dp *acpi_dp_add_gpio(struct acpi_dp *dp, const char *name,
> *
> * This writes the table using acpigen and then frees it
> *
> + * @ctx: ACPI context
This change should be squashed into "[v3,19/35] acpi: Support writing
Device Properties objects via _DSD"
> * @table: Table to write
> * @return 0 if OK, -ve on error
> */
> int acpi_dp_write(struct acpi_ctx *ctx, struct acpi_dp *table);
>
> +/**
> + * acpi_dp_ofnode_copy_int() - Copy a property from device tree to DP
> + *
> + * This copies an integer property from the device tree to the ACPI DP table.
> + *
> + * @node: Node to copy from
> + * @dp: DP to copy to
> + * @prop: Property name to copy
> + * @return 0 if OK, -ve on error
> + */
> +int acpi_dp_ofnode_copy_int(ofnode node, struct acpi_dp *dp, const char *prop);
> +
> +/**
> + * acpi_dp_ofnode_copy_str() - Copy a property from device tree to DP
> + *
> + * This copies a string property from the device tree to the ACPI DP table.
> + *
> + * @node: Node to copy from
> + * @dp: DP to copy to
> + * @prop: Property name to copy
> + * @return 0 if OK, -ve on error
> + */
> +int acpi_dp_ofnode_copy_str(ofnode node, struct acpi_dp *dp, const char *prop);
> +
> +/**
> + * acpi_dp_dev_copy_int() - Copy a property from device tree to DP
> + *
> + * This copies an integer property from the device tree to the ACPI DP table.
> + *
> + * @dev: Device to copy from
> + * @dp: DP to copy to
> + * @prop: Property name to copy
> + * @return 0 if OK, -ve on error
> + */
> +int acpi_dp_dev_copy_int(const struct udevice *dev, struct acpi_dp *dp,
> + const char *prop);
> +
> +/**
> + * acpi_dp_dev_copy_str() - Copy a property from device tree to DP
> + *
> + * This copies a string property from the device tree to the ACPI DP table.
> + *
> + * @dev: Device to copy from
> + * @dp: DP to copy to
> + * @prop: Property name to copy
> + * @return 0 if OK, -ve on error
> + */
> +int acpi_dp_dev_copy_str(const struct udevice *dev, struct acpi_dp *dp,
> + const char *prop);
> +
> #endif
> diff --git a/lib/acpi/acpi_dp.c b/lib/acpi/acpi_dp.c
> index 4ff857a451..e85f077cc2 100644
> --- a/lib/acpi/acpi_dp.c
> +++ b/lib/acpi/acpi_dp.c
> @@ -344,3 +344,59 @@ struct acpi_dp *acpi_dp_add_gpio(struct acpi_dp *dp, const char *name,
>
> return gpio;
> }
> +
> +int acpi_dp_ofnode_copy_int(ofnode node, struct acpi_dp *dp, const char *prop)
> +{
> + int ret;
> + u32 val = 0;
> +
> + ret = ofnode_read_u32(node, prop, &val);
> + if (ret)
> + return ret;
> + if (!acpi_dp_add_integer(dp, prop, val))
> + return log_ret(-ENOMEM);
> +
> + return 0;
> +}
> +
> +int acpi_dp_ofnode_copy_str(ofnode node, struct acpi_dp *dp, const char *prop)
> +{
> + const char *val;
> +
> + val = ofnode_read_string(node, prop);
> + if (!val)
> + return -EINVAL;
> + if (!acpi_dp_add_string(dp, prop, val))
> + return log_ret(-ENOMEM);
> +
> + return 0;
> +}
> +
> +int acpi_dp_dev_copy_int(const struct udevice *dev, struct acpi_dp *dp,
> + const char *prop)
> +{
> + int ret;
> + u32 val = 0;
> +
> + ret = dev_read_u32(dev, prop, &val);
> + if (ret)
> + return ret;
> + if (!acpi_dp_add_integer(dp, prop, val))
> + return log_ret(-ENOMEM);
> +
> + return ret;
> +}
> +
> +int acpi_dp_dev_copy_str(const struct udevice *dev, struct acpi_dp *dp,
> + const char *prop)
> +{
> + const char *val;
> +
> + val = dev_read_string(dev, prop);
> + if (!val)
> + return -EINVAL;
> + if (!acpi_dp_add_string(dp, prop, val))
> + return log_ret(-ENOMEM);
> +
> + return 0;
> +}
> diff --git a/test/dm/acpi_dp.c b/test/dm/acpi_dp.c
> index 24615c384f..4432645a3e 100644
> --- a/test/dm/acpi_dp.c
> +++ b/test/dm/acpi_dp.c
> @@ -443,3 +443,70 @@ static int dm_test_acpi_dp_gpio(struct unit_test_state *uts)
> return 0;
> }
> DM_TEST(dm_test_acpi_dp_gpio, 0);
> +
> +/* Test copying info from the device tree to ACPI tables */
> +static int dm_test_acpi_dp_copy(struct unit_test_state *uts)
> +{
> + struct acpi_ctx *ctx;
> + struct udevice *dev;
> + struct acpi_dp *dp;
> + ofnode node;
> + u8 *ptr;
> +
> + ut_assertok(alloc_context(&ctx));
> +
> + dp = acpi_dp_new_table("FRED");
> + ut_assertnonnull(dp);
> +
> + ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev));
> + ut_asserteq_str("a-test", dev->name);
> +
> + ut_assertok(acpi_dp_dev_copy_int(dev, dp, "int-value"));
> + ut_asserteq(-EINVAL, acpi_dp_dev_copy_int(dev, dp, "missing-value"));
> + ut_assertok(acpi_dp_dev_copy_int(dev, dp, "uint-value"));
> +
> + ut_assertok(acpi_dp_dev_copy_str(dev, dp, "str-value"));
> + ut_asserteq(-EINVAL, acpi_dp_dev_copy_str(dev, dp, "missing-value"));
> +
> + node = ofnode_path("/chosen");
> + ut_assert(ofnode_valid(node));
> + ut_assertok(acpi_dp_ofnode_copy_int(node, dp, "int-values"));
> + ut_asserteq(-EINVAL,
> + acpi_dp_ofnode_copy_int(node, dp, "missing-value"));
> +
> + ut_assertok(acpi_dp_ofnode_copy_str(node, dp, "setting"));
> + ut_asserteq(-EINVAL,
> + acpi_dp_ofnode_copy_str(node, dp, "missing-value"));
> +
> + ptr = acpigen_get_current(ctx);
> + ut_assertok(acpi_dp_write(ctx, dp));
> + ut_asserteq(0x9d, acpigen_get_current(ctx) - ptr);
> +
> + ut_asserteq(STRING_PREFIX, ptr[0x2b]);
> + ut_asserteq_str("int-value", (char *)ptr + 0x2c);
> + ut_asserteq(WORD_PREFIX, ptr[0x36]);
> + ut_asserteq(1234, get_unaligned((u16 *)(ptr + 0x37)));
> +
> + ut_asserteq(STRING_PREFIX, ptr[0x3e]);
> + ut_asserteq_str("uint-value", (char *)ptr + 0x3f);
> + ut_asserteq(DWORD_PREFIX, ptr[0x4a]);
> + ut_asserteq(-1234, get_unaligned((u32 *)(ptr + 0x4b)));
> +
> + ut_asserteq(STRING_PREFIX, ptr[0x54]);
> + ut_asserteq_str("str-value", (char *)ptr + 0x55);
> + ut_asserteq(STRING_PREFIX, ptr[0x5f]);
> + ut_asserteq_str("test string", (char *)ptr + 0x60);
> +
> + ut_asserteq(STRING_PREFIX, ptr[0x71]);
> + ut_asserteq_str("int-values", (char *)ptr + 0x72);
> + ut_asserteq(WORD_PREFIX, ptr[0x7d]);
> + ut_asserteq(0x1937, get_unaligned((u16 *)(ptr + 0x7e)));
> +
> + ut_asserteq(STRING_PREFIX, ptr[0x85]);
> + ut_asserteq_str("setting", (char *)ptr + 0x86);
> + ut_asserteq(STRING_PREFIX, ptr[0x8e]);
> + ut_asserteq_str("sunrise ohoka", (char *)(ptr + 0x8f));
> +
> + return 0;
> +}
> +DM_TEST(dm_test_acpi_dp_copy, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> --
Other than above,
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
Regards,
Bin
More information about the U-Boot
mailing list