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