On 1/15/25 2:28 PM, Alice Guo wrote:
From: Ye Li <ye...@nxp.com>

@protocols is an array of protocol identifiers that are implemented,
excluding the Base protocol. The number of elements of @protocols is
specified by callee-side. Currently, set it to 4 is enough for i.MX95.
Can you please try something like this instead ? That should be future-proof:

diff --git a/drivers/firmware/scmi/base.c b/drivers/firmware/scmi/base.c
index f4e3974ff5b..92d278edfaf 100644
--- a/drivers/firmware/scmi/base.c
+++ b/drivers/firmware/scmi/base.c
@@ -258,17 +258,16 @@ static int scmi_base_discover_impl_version_int(struct udevice *dev,
 static int scmi_base_discover_list_protocols_int(struct udevice *dev,
                                                 u8 **protocols)
 {
-       struct scmi_base_discover_list_protocols_out out;
+       struct scmi_base_discover_list_protocols_out *out;
        int cur;
        struct scmi_msg msg = {
                .protocol_id = SCMI_PROTOCOL_ID_BASE,
                .message_id = SCMI_BASE_DISCOVER_LIST_PROTOCOLS,
                .in_msg = (u8 *)&cur,
                .in_msg_sz = sizeof(cur),
-               .out_msg = (u8 *)&out,
-               .out_msg_sz = sizeof(out),
        };
        u32 num_agents, num_protocols;
+       int size;
        u8 *buf;
        int i, ret;

@@ -276,29 +275,34 @@ static int scmi_base_discover_list_protocols_int(struct udevice *dev,
        if (ret)
                return ret;

-       buf = calloc(sizeof(u8), num_protocols);
-       if (!buf)
+       size = sizeof(*out) + sizeof(u8) * num_protocols;
+       out = calloc(1, size);
+       if (!out)
                return -ENOMEM;

+       msg.out_msg = (u8 *)out;
+       msg.out_msg_sz = size;
+       buf = (u8 *)out->protocols;
+
        cur = 0;
        do {
                ret = devm_scmi_process_msg(dev, &msg);
                if (ret)
                        goto err;
-               if (out.status) {
-                       ret = scmi_to_linux_errno(out.status);
+               if (out->status) {
+                       ret = scmi_to_linux_errno(out->status);
                        goto err;
                }

-               for (i = 0; i < out.num_protocols; i++, cur++)
-                       buf[cur] = out.protocols[i / 4] >> ((i % 4) * 8);
+               for (i = 0; i < out->num_protocols; i++, cur++)
+                       buf[cur] = out->protocols[i / 4] >> ((i % 4) * 8);
        } while (cur < num_protocols);

        *protocols = buf;

        return num_protocols;
 err:
-       free(buf);
+       free(out);

        return ret;
 }
diff --git a/include/scmi_protocols.h b/include/scmi_protocols.h
index a51234eda5c..29a7fd85cc0 100644
--- a/include/scmi_protocols.h
+++ b/include/scmi_protocols.h
@@ -148,7 +148,7 @@ struct scmi_base_discover_impl_version_out {
 struct scmi_base_discover_list_protocols_out {
        s32 status;
        u32 num_protocols;
-       u32 protocols[4];
+       u32 protocols[];
 };

 /**

Reply via email to