[PATCH v4 10/20] scmi_protocols: update struct scmi_base_discover_list_protocols_out

Marek Vasut marex at denx.de
Fri Jan 24 15:38:27 CET 2025


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

  /**


More information about the U-Boot mailing list