Hi Simon, -----"Simon Glass" <s...@chromium.org> schrieb: ----- > Betreff: [PATCH v2 21/35] acpi: Support copying properties from device tree > to ACPI > > 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 > to linux. Add some convenience functions to help with this. > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > Changes in v2: None > Changes in v1: None > > arch/sandbox/dts/test.dts | 1 + > include/acpi/acpi_dp.h | 50 +++++++++++++++++++++++++++++ > lib/acpi/acpi_dp.c | 52 ++++++++++++++++++++++++++++++ > test/dm/acpi_dp.c | 67 +++++++++++++++++++++++++++++++++++++++ > 4 files changed, 170 insertions(+) > > diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts > index b802c1c909..a90395fa62 100644 > --- a/arch/sandbox/dts/test.dts > +++ b/arch/sandbox/dts/test.dts > @@ -109,6 +109,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 f42602405a..9e5a70b286 100644 > --- a/include/acpi/acpi_dp.h > +++ b/include/acpi/acpi_dp.h > @@ -230,4 +230,54 @@ struct acpi_dp *acpi_dp_add_gpio(struct acpi_dp *dp, > const char *name, > */ > 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. > + * > + * @dev: Device to copy from
There is some copy/paste error here, the description here doesn't match the code. It should describe "node", not "dev". > + * @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_dev_copy_str() - Copy a property from device tree to DP This should be acpi_dp_ofnode_copy_str() > + * > + * This copies a string property from the device tree to the ACPI DP table. > + * > + * @dev: Device to copy from This should be "node". > + * @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 4ba5d555a0..819e51005a 100644 > --- a/lib/acpi/acpi_dp.c > +++ b/lib/acpi/acpi_dp.c > @@ -343,3 +343,55 @@ 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; > + acpi_dp_add_integer(dp, prop, val); The return value of the above function could be NULL, but this is not checked. > + > + return ret; > +} > + > +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; > + acpi_dp_add_string(dp, prop, val); Same here. > + > + 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; > + acpi_dp_add_integer(dp, prop, val); Same here. > + > + 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; > + acpi_dp_add_string(dp, prop, val); Same here. > + > + return 0; > +} > diff --git a/test/dm/acpi_dp.c b/test/dm/acpi_dp.c > index d6a054a98b..c1ab580cd2 100644 > --- a/test/dm/acpi_dp.c > +++ b/test/dm/acpi_dp.c > @@ -442,3 +442,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); > -- > 2.26.2.645.ge9eca65c58-goog > regards, Wolfgang