mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 17:44:19 +00:00

LF-4715-1 drivers: scmi-msg: add sensor support Add scmi sensor support Signed-off-by: Peng Fan <peng.fan@nxp.com> Signed-off-by: Jacky Bai <ping.bai@nxp.com> Change-Id: I810e270b138bf5486b32df121056bfa5103c129f
100 lines
2.3 KiB
C
100 lines
2.3 KiB
C
// SPDX-License-Identifier: BSD-3-Clause
|
|
/*
|
|
* Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved.
|
|
* Copyright (c) 2019-2020, Linaro Limited
|
|
*/
|
|
|
|
#include <assert.h>
|
|
|
|
#include <drivers/scmi-msg.h>
|
|
#include <drivers/scmi.h>
|
|
|
|
#include "common.h"
|
|
|
|
#pragma weak scmi_msg_get_clock_handler
|
|
#pragma weak scmi_msg_get_rstd_handler
|
|
#pragma weak scmi_msg_get_pd_handler
|
|
#pragma weak scmi_msg_get_voltage_handler
|
|
#pragma weak scmi_msg_get_sensor_handler
|
|
|
|
scmi_msg_handler_t scmi_msg_get_clock_handler(struct scmi_msg *msg __unused)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
scmi_msg_handler_t scmi_msg_get_rstd_handler(struct scmi_msg *msg __unused)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
scmi_msg_handler_t scmi_msg_get_pd_handler(struct scmi_msg *msg __unused)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
scmi_msg_handler_t scmi_msg_get_voltage_handler(struct scmi_msg *msg __unused)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
scmi_msg_handler_t scmi_msg_get_sensor_handler(struct scmi_msg *msg __unused)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
void scmi_status_response(struct scmi_msg *msg, int32_t status)
|
|
{
|
|
assert(msg->out && msg->out_size >= sizeof(int32_t));
|
|
|
|
memcpy(msg->out, &status, sizeof(int32_t));
|
|
msg->out_size_out = sizeof(int32_t);
|
|
}
|
|
|
|
void scmi_write_response(struct scmi_msg *msg, void *payload, size_t size)
|
|
{
|
|
/*
|
|
* Output payload shall be at least the size of the status
|
|
* Output buffer shall be at least be the size of the status
|
|
* Output paylaod shall fit in output buffer
|
|
*/
|
|
assert(payload && size >= sizeof(int32_t) && size <= msg->out_size &&
|
|
msg->out && msg->out_size >= sizeof(int32_t));
|
|
|
|
memcpy(msg->out, payload, size);
|
|
msg->out_size_out = size;
|
|
}
|
|
|
|
void scmi_process_message(struct scmi_msg *msg)
|
|
{
|
|
scmi_msg_handler_t handler = NULL;
|
|
|
|
switch (msg->protocol_id) {
|
|
case SCMI_PROTOCOL_ID_BASE:
|
|
handler = scmi_msg_get_base_handler(msg);
|
|
break;
|
|
case SCMI_PROTOCOL_ID_CLOCK:
|
|
handler = scmi_msg_get_clock_handler(msg);
|
|
break;
|
|
case SCMI_PROTOCOL_ID_RESET_DOMAIN:
|
|
handler = scmi_msg_get_rstd_handler(msg);
|
|
break;
|
|
case SCMI_PROTOCOL_ID_POWER_DOMAIN:
|
|
handler = scmi_msg_get_pd_handler(msg);
|
|
break;
|
|
case SCMI_PROTOCOL_ID_SENSOR:
|
|
handler = scmi_msg_get_sensor_handler(msg);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (handler) {
|
|
handler(msg);
|
|
return;
|
|
}
|
|
|
|
ERROR("Agent %u Protocol 0x%x Message 0x%x: not supported\n",
|
|
msg->agent_id, msg->protocol_id, msg->message_id);
|
|
|
|
scmi_status_response(msg, SCMI_NOT_SUPPORTED);
|
|
}
|