tcg2_platform_get_log failing to read address and size of memory-region via ofnode_get_addr_size

Tim Harvey tharvey at gateworks.com
Tue Mar 26 02:15:37 CET 2024


Greetings,

I'm unable to understand why tcg2_platform_get_log is failing to read
a memory region.

For example the following diffs:

diff --git a/arch/arm/dts/imx8mm-venice-gw73xx.dtsi
b/arch/arm/dts/imx8mm-venice-gw73xx.dtsi
index 7b2130dbdb21..57b3c227ceaf 100644
--- a/arch/arm/dts/imx8mm-venice-gw73xx.dtsi
+++ b/arch/arm/dts/imx8mm-venice-gw73xx.dtsi
@@ -112,6 +112,7 @@
                compatible = "tcg,tpm_tis-spi";
                reg = <0x1>;
                spi-max-frequency = <36000000>;
+               memory-region = <&event_log>;
        };
 };
 diff --git a/arch/arm/dts/imx8mm-venice-gw700x.dtsi
b/arch/arm/dts/imx8mm-venice-gw700x.dtsi
index c305e325d007..697fd1148785 100644
--- a/arch/arm/dts/imx8mm-venice-gw700x.dtsi
+++ b/arch/arm/dts/imx8mm-venice-gw700x.dtsi
@@ -13,6 +13,17 @@
                reg = <0x0 0x40000000 0 0x80000000>;
        };

+       reserved-memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               event_log: tcg_event_log {
+                       no-map;
+                       reg = <0 0x40000000 0x2000>;
+               };
+       };
+
        gpio-keys {
                compatible = "gpio-keys";

And at runtime:
u-boot=> fdt addr $fdtcontroladdr
u-boot=> fdt list /soc at 0/bus at 30800000/spba-bus at 30800000/spi at 30830000/tpm at 1/
tpm at 1 {
        compatible = "tcg,tpm_tis-spi";
        reg = <0x00000001>;
        spi-max-frequency = <0x02255100>;
        memory-region = <0x00000025>;
};
u-boot=> fdt list /reserved-memory/
reserved-memory {
        #address-cells = <0x00000002>;
        #size-cells = <0x00000002>;
        ranges;
        tcg_event_log {
        };
};
u-boot=> fdt list /reserved-memory/tcg_event_log
tcg_event_log {
        no-map;
        reg = <0x00000000 0x40000000 0x00002000>;
        phandle = <0x00000025>;
};

So why does the following code in tcg2_platform_get_log() return -ENOMEM?

                if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0,
                                               0, &args))
                        return -ENODEV;

                a = ofnode_get_addr_size(args.node, "reg", &s);
                if (a == FDT_ADDR_T_NONE)
                        return -ENOMEM;

debugging shows that dev_read_phandle_with_args returns non-zero but
args.args_count is 0.

I feel like the construct of using dev_read_phandle_with_args followed
by the ofnode_get_addr_size is just wrong but I don't understand why
nor do I understand how my dt changes differ from what is in
arch/sandbox/dts/test.dts (other than its using address-size=1 which
doesn't appear to be the issue in my testing). The abstraction of the
ofnode and fdt stuff always trip me up... very confusing.

Can anyone explain the issue here?

Best Regards,

Tim


More information about the U-Boot mailing list