fix(scmi-msg): base: fix protocol list querying

Corrects the function reporting the SCMI protocols supported by the
platform to not assume 8 protocol IDs at most can be returned. Indeed
the number of protocol IDs returned depends on the SCMI output buffer
size.

Change-Id: Idafbe02d2b25b3bcacaf25977c560c0ac5bb8d62
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
This commit is contained in:
Etienne Carriere 2022-05-12 16:49:51 +02:00
parent d323f0cf00
commit cad90b569d

View file

@ -131,15 +131,12 @@ static unsigned int count_protocols_in_list(const uint8_t *protocol_list)
return count; return count;
} }
#define MAX_PROTOCOL_IN_LIST 8U
static void discover_list_protocols(struct scmi_msg *msg) static void discover_list_protocols(struct scmi_msg *msg)
{ {
const struct scmi_base_discover_list_protocols_a2p *a2p = NULL; const struct scmi_base_discover_list_protocols_a2p *a2p = NULL;
struct scmi_base_discover_list_protocols_p2a p2a = { struct scmi_base_discover_list_protocols_p2a p2a = {
.status = SCMI_SUCCESS, .status = SCMI_SUCCESS,
}; };
uint8_t outargs[sizeof(p2a) + MAX_PROTOCOL_IN_LIST] = { 0U };
const uint8_t *list = NULL; const uint8_t *list = NULL;
unsigned int count = 0U; unsigned int count = 0U;
@ -148,24 +145,22 @@ static void discover_list_protocols(struct scmi_msg *msg)
return; return;
} }
assert(msg->out_size > sizeof(outargs));
a2p = (void *)msg->in; a2p = (void *)msg->in;
list = plat_scmi_protocol_list(msg->agent_id); list = plat_scmi_protocol_list(msg->agent_id);
count = count_protocols_in_list(list); count = count_protocols_in_list(list);
if (count > a2p->skip) { if (count > a2p->skip) {
count = MIN(count - a2p->skip, MAX_PROTOCOL_IN_LIST); count = MIN(count - a2p->skip, msg->out_size - sizeof(p2a));
} else { } else {
count = 0U; count = 0U;
} }
p2a.num_protocols = count; p2a.num_protocols = count;
memcpy(outargs, &p2a, sizeof(p2a)); memcpy(msg->out, &p2a, sizeof(p2a));
memcpy(outargs + sizeof(p2a), list + a2p->skip, count); memcpy(msg->out + sizeof(p2a), list + a2p->skip, count);
msg->out_size_out = sizeof(p2a) + round_up(count, sizeof(uint32_t));
scmi_write_response(msg, outargs, sizeof(p2a) + round_up(count, sizeof(uint32_t)));
} }
static const scmi_msg_handler_t scmi_base_handler_table[] = { static const scmi_msg_handler_t scmi_base_handler_table[] = {