xref: /rk3399_ARM-atf/drivers/scmi-msg/entry.c (revision e63819f2bc307e7a42d43151242009f91ceeb06b)
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 
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 
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 
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 
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 
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 
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 
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 
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