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