1b4734308SPeng Fan // SPDX-License-Identifier: BSD-3-Clause
2b4734308SPeng Fan /*
30dc9f52aSYann Gautier * Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved.
4b4734308SPeng Fan * Copyright (c) 2019-2020, Linaro Limited
5b4734308SPeng Fan */
6b4734308SPeng Fan
7b4734308SPeng Fan #include <assert.h>
8b4734308SPeng Fan
9b4734308SPeng Fan #include <drivers/scmi-msg.h>
10b4734308SPeng Fan #include <drivers/scmi.h>
11b4734308SPeng Fan
12b4734308SPeng Fan #include "common.h"
13b4734308SPeng Fan
14b3c8fd5dSPeng Fan #pragma weak scmi_msg_get_clock_handler
15b3c8fd5dSPeng Fan #pragma weak scmi_msg_get_rstd_handler
16b3c8fd5dSPeng Fan #pragma weak scmi_msg_get_pd_handler
17b3c8fd5dSPeng Fan #pragma weak scmi_msg_get_voltage_handler
18*e63819f2SJacky Bai #pragma weak scmi_msg_get_sensor_handler
19b3c8fd5dSPeng Fan
scmi_msg_get_clock_handler(struct scmi_msg * msg __unused)20b3c8fd5dSPeng Fan scmi_msg_handler_t scmi_msg_get_clock_handler(struct scmi_msg *msg __unused)
21b3c8fd5dSPeng Fan {
22b3c8fd5dSPeng Fan return NULL;
23b3c8fd5dSPeng Fan }
24b3c8fd5dSPeng Fan
scmi_msg_get_rstd_handler(struct scmi_msg * msg __unused)25b3c8fd5dSPeng Fan scmi_msg_handler_t scmi_msg_get_rstd_handler(struct scmi_msg *msg __unused)
26b3c8fd5dSPeng Fan {
27b3c8fd5dSPeng Fan return NULL;
28b3c8fd5dSPeng Fan }
29b3c8fd5dSPeng Fan
scmi_msg_get_pd_handler(struct scmi_msg * msg __unused)30b3c8fd5dSPeng Fan scmi_msg_handler_t scmi_msg_get_pd_handler(struct scmi_msg *msg __unused)
31b3c8fd5dSPeng Fan {
32b3c8fd5dSPeng Fan return NULL;
33b3c8fd5dSPeng Fan }
34b3c8fd5dSPeng Fan
scmi_msg_get_voltage_handler(struct scmi_msg * msg __unused)35b3c8fd5dSPeng Fan scmi_msg_handler_t scmi_msg_get_voltage_handler(struct scmi_msg *msg __unused)
36b3c8fd5dSPeng Fan {
37b3c8fd5dSPeng Fan return NULL;
38b3c8fd5dSPeng Fan }
39b3c8fd5dSPeng Fan
scmi_msg_get_sensor_handler(struct scmi_msg * msg __unused)40*e63819f2SJacky Bai scmi_msg_handler_t scmi_msg_get_sensor_handler(struct scmi_msg *msg __unused)
41*e63819f2SJacky Bai {
42*e63819f2SJacky Bai return NULL;
43*e63819f2SJacky Bai }
44*e63819f2SJacky Bai
scmi_status_response(struct scmi_msg * msg,int32_t status)45b4734308SPeng Fan void scmi_status_response(struct scmi_msg *msg, int32_t status)
46b4734308SPeng Fan {
47b4734308SPeng Fan assert(msg->out && msg->out_size >= sizeof(int32_t));
48b4734308SPeng Fan
49b4734308SPeng Fan memcpy(msg->out, &status, sizeof(int32_t));
50b4734308SPeng Fan msg->out_size_out = sizeof(int32_t);
51b4734308SPeng Fan }
52b4734308SPeng Fan
scmi_write_response(struct scmi_msg * msg,void * payload,size_t size)53b4734308SPeng Fan void scmi_write_response(struct scmi_msg *msg, void *payload, size_t size)
54b4734308SPeng Fan {
55b4734308SPeng Fan /*
56b4734308SPeng Fan * Output payload shall be at least the size of the status
57b4734308SPeng Fan * Output buffer shall be at least be the size of the status
58b4734308SPeng Fan * Output paylaod shall fit in output buffer
59b4734308SPeng Fan */
60b4734308SPeng Fan assert(payload && size >= sizeof(int32_t) && size <= msg->out_size &&
61b4734308SPeng Fan msg->out && msg->out_size >= sizeof(int32_t));
62b4734308SPeng Fan
63b4734308SPeng Fan memcpy(msg->out, payload, size);
64b4734308SPeng Fan msg->out_size_out = size;
65b4734308SPeng Fan }
66b4734308SPeng Fan
scmi_process_message(struct scmi_msg * msg)67b4734308SPeng Fan void scmi_process_message(struct scmi_msg *msg)
68b4734308SPeng Fan {
69b4734308SPeng Fan scmi_msg_handler_t handler = NULL;
70b4734308SPeng Fan
71b4734308SPeng Fan switch (msg->protocol_id) {
72b4734308SPeng Fan case SCMI_PROTOCOL_ID_BASE:
73b4734308SPeng Fan handler = scmi_msg_get_base_handler(msg);
74b4734308SPeng Fan break;
75b4734308SPeng Fan case SCMI_PROTOCOL_ID_CLOCK:
76b4734308SPeng Fan handler = scmi_msg_get_clock_handler(msg);
77b4734308SPeng Fan break;
78b4734308SPeng Fan case SCMI_PROTOCOL_ID_RESET_DOMAIN:
79b4734308SPeng Fan handler = scmi_msg_get_rstd_handler(msg);
80b4734308SPeng Fan break;
817e4833cdSPeng Fan case SCMI_PROTOCOL_ID_POWER_DOMAIN:
827e4833cdSPeng Fan handler = scmi_msg_get_pd_handler(msg);
837e4833cdSPeng Fan break;
84*e63819f2SJacky Bai case SCMI_PROTOCOL_ID_SENSOR:
85*e63819f2SJacky Bai handler = scmi_msg_get_sensor_handler(msg);
86*e63819f2SJacky Bai break;
87b4734308SPeng Fan default:
88b4734308SPeng Fan break;
89b4734308SPeng Fan }
90b4734308SPeng Fan
91b4734308SPeng Fan if (handler) {
92b4734308SPeng Fan handler(msg);
93b4734308SPeng Fan return;
94b4734308SPeng Fan }
95b4734308SPeng Fan
960dc9f52aSYann Gautier ERROR("Agent %u Protocol 0x%x Message 0x%x: not supported\n",
97b4734308SPeng Fan msg->agent_id, msg->protocol_id, msg->message_id);
98b4734308SPeng Fan
99b4734308SPeng Fan scmi_status_response(msg, SCMI_NOT_SUPPORTED);
100b4734308SPeng Fan }
101