From: Peng Fan <[email protected]>

SCMI base protocol device does not have a device tree, it should use and
need to use the agent base channel.

For scmi_base.[x], there is no real device tree node for it. ofnode_null() is
assigned as the device tree node for scmi base protocol device:
commit 7eb4eb541c14 ("firmware: scmi: install base protocol to SCMI agent")

However with recent update in commit 0535e46d55d7
("scripts/dtc: Update to upstream version v1.7.2-35-g52f07dcca47c"),
SPL panic in fdt_check_node_offset_()->fdt_next_tag(), because offset is -1
and SPL_OF_LIBFDT_ASSUME_MASK is 0xFF.

So add a check in x_get_channel() to validate the protocol devices'
ofnode.

Reported-by: Ye Li <[email protected]>
Closes: 
https://lore.kernel.org/u-boot/[email protected]/
Signed-off-by: Peng Fan <[email protected]>
---
 drivers/firmware/scmi/mailbox_agent.c | 2 +-
 drivers/firmware/scmi/optee_agent.c   | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/firmware/scmi/mailbox_agent.c 
b/drivers/firmware/scmi/mailbox_agent.c
index 16a82f55ab7..cda94565de5 100644
--- a/drivers/firmware/scmi/mailbox_agent.c
+++ b/drivers/firmware/scmi/mailbox_agent.c
@@ -101,7 +101,7 @@ static int scmi_mbox_get_channel(struct udevice *dev,
        struct scmi_mbox_channel *chan;
        int ret;
 
-       if (!dev_read_prop(protocol, "shmem", NULL)) {
+       if (!dev_has_ofnode(protocol) || !dev_read_prop(protocol, "shmem", 
NULL)) {
                /* Uses agent base channel */
                *channel = container_of(base_chan, struct scmi_channel, ref);
 
diff --git a/drivers/firmware/scmi/optee_agent.c 
b/drivers/firmware/scmi/optee_agent.c
index 631625d715b..7170bd1e682 100644
--- a/drivers/firmware/scmi/optee_agent.c
+++ b/drivers/firmware/scmi/optee_agent.c
@@ -331,7 +331,8 @@ static int scmi_optee_get_channel(struct udevice *dev,
        u32 channel_id;
        int ret;
 
-       if (dev_read_u32(protocol, "linaro,optee-channel-id", &channel_id)) {
+       if (!dev_has_ofnode(protocol) ||
+           dev_read_u32(protocol, "linaro,optee-channel-id", &channel_id)) {
                /* Uses agent base channel */
                *channel = container_of(base_chan, struct scmi_channel, ref);
 

-- 
2.51.0

Reply via email to