1 // SPDX-License-Identifier: BSD-3-Clause 2 /* 3 * Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved. 4 * Copyright (c) 2019, Linaro Limited 5 */ 6 #include <speculation_barrier.h> 7 #include <drivers/scmi-msg.h> 8 #include <drivers/scmi.h> 9 #include <trace.h> 10 11 #include "base.h" 12 #include "clock.h" 13 #include "common.h" 14 15 void scmi_status_response(struct scmi_msg *msg, int32_t status) 16 { 17 assert(msg->out && msg->out_size >= sizeof(int32_t)); 18 19 memcpy(msg->out, &status, sizeof(int32_t)); 20 msg->out_size_out = sizeof(int32_t); 21 } 22 23 void scmi_write_response(struct scmi_msg *msg, void *payload, size_t size) 24 { 25 /* 26 * Output payload shall be at least the size of the status 27 * Output buffer shall be at least be the size of the status 28 * Output paylaod shall fit in output buffer 29 */ 30 assert(payload && size >= sizeof(int32_t) && size <= msg->out_size && 31 msg->out && msg->out_size >= sizeof(int32_t)); 32 33 memcpy(msg->out, payload, size); 34 msg->out_size_out = size; 35 } 36 37 void scmi_process_message(struct scmi_msg *msg) 38 { 39 scmi_msg_handler_t handler = NULL; 40 41 switch (msg->protocol_id) { 42 case SCMI_PROTOCOL_ID_BASE: 43 handler = scmi_msg_get_base_handler(msg); 44 break; 45 #ifdef CFG_SCMI_MSG_CLOCK 46 case SCMI_PROTOCOL_ID_CLOCK: 47 handler = scmi_msg_get_clock_handler(msg); 48 break; 49 #endif 50 default: 51 break; 52 } 53 54 if (handler) { 55 handler(msg); 56 return; 57 } 58 59 DMSG("Agent %u Protocol %#x Message %#x: not supported", 60 msg->agent_id, msg->protocol_id, msg->message_id); 61 62 scmi_status_response(msg, SCMI_NOT_SUPPORTED); 63 } 64