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