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