
On 1/15/25 2:28 PM, Alice Guo wrote:
From: Ye Li ye.li@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[]; };
/**