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 7ae8c8068SEtienne Carriere #ifndef SCMI_MSG_H 8ae8c8068SEtienne Carriere #define SCMI_MSG_H 9ae8c8068SEtienne Carriere 10ae8c8068SEtienne Carriere #include <compiler.h> 11ae8c8068SEtienne Carriere #include <kernel/panic.h> 12ae8c8068SEtienne Carriere #include <mm/core_memprot.h> 13ae8c8068SEtienne Carriere #include <stdbool.h> 14ae8c8068SEtienne Carriere #include <stddef.h> 15ae8c8068SEtienne Carriere #include <stdint.h> 16ae8c8068SEtienne Carriere 17ae8c8068SEtienne Carriere /* Minimum size expected for SMT based shared memory message buffers */ 18ae8c8068SEtienne Carriere #define SMT_BUF_SLOT_SIZE 128 19ae8c8068SEtienne Carriere 20ae8c8068SEtienne Carriere /* A channel abstract a communication path between agent and server */ 21ae8c8068SEtienne Carriere struct scmi_msg_channel; 22ae8c8068SEtienne Carriere 23ae8c8068SEtienne Carriere /* 24ae8c8068SEtienne Carriere * struct scmi_msg_channel - Shared memory buffer for a agent-to-server channel 25ae8c8068SEtienne Carriere * 26ae8c8068SEtienne Carriere * @shm_addr: Address of the shared memory for the SCMI channel 27ae8c8068SEtienne Carriere * @shm_size: Byte size of the shared memory for the SCMI channel 28ae8c8068SEtienne Carriere * @busy: True when channel is busy, flase when channel is free 29ae8c8068SEtienne Carriere * @threaded: True is executed in a threaded context, false otherwise 30ae8c8068SEtienne Carriere * @agent_name: Optional agent name, SCMI protocol exposes 16 bytes max 31ae8c8068SEtienne Carriere */ 32ae8c8068SEtienne Carriere struct scmi_msg_channel { 33ae8c8068SEtienne Carriere struct io_pa_va shm_addr; 34ae8c8068SEtienne Carriere size_t shm_size; 35ae8c8068SEtienne Carriere bool busy; 36ae8c8068SEtienne Carriere bool threaded; 37ae8c8068SEtienne Carriere const char *agent_name; 38ae8c8068SEtienne Carriere }; 39ae8c8068SEtienne Carriere 40ae8c8068SEtienne Carriere /* Platform callback functions */ 41ae8c8068SEtienne Carriere 42ae8c8068SEtienne Carriere /* 43ae8c8068SEtienne Carriere * Return the SCMI channel related to an agent 44ae8c8068SEtienne Carriere * @agent_id: SCMI agent ID 45ae8c8068SEtienne Carriere * Return a pointer to channel on success, NULL otherwise 46ae8c8068SEtienne Carriere */ 47ae8c8068SEtienne Carriere struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id); 48ae8c8068SEtienne Carriere 49ae8c8068SEtienne Carriere /* 50ae8c8068SEtienne Carriere * Return how many SCMI protocols supported by the platform 51ae8c8068SEtienne Carriere * According to the SCMI specification, this function does not target 52ae8c8068SEtienne Carriere * a specific agent ID and shall return all platform known capabilities. 53ae8c8068SEtienne Carriere */ 54ae8c8068SEtienne Carriere size_t plat_scmi_protocol_count(void); 55ae8c8068SEtienne Carriere 56ae8c8068SEtienne Carriere /* 57ae8c8068SEtienne Carriere * Get the count and list of SCMI protocols (but base) supported for an agent 58ae8c8068SEtienne Carriere * 59ae8c8068SEtienne Carriere * @agent_id: SCMI agent ID 60ae8c8068SEtienne Carriere * Return a pointer to a null terminated array supported protocol IDs. 61ae8c8068SEtienne Carriere */ 62ae8c8068SEtienne Carriere const uint8_t *plat_scmi_protocol_list(unsigned int agent_id); 63ae8c8068SEtienne Carriere 64ae8c8068SEtienne Carriere /* Get the name of the SCMI vendor for the platform */ 65ae8c8068SEtienne Carriere const char *plat_scmi_vendor_name(void); 66ae8c8068SEtienne Carriere 67ae8c8068SEtienne Carriere /* Get the name of the SCMI sub-vendor for the platform */ 68ae8c8068SEtienne Carriere const char *plat_scmi_sub_vendor_name(void); 69ae8c8068SEtienne Carriere 70a7a9e3baSEtienne Carriere /* Handlers for SCMI Clock protocol services */ 71a7a9e3baSEtienne Carriere 72a7a9e3baSEtienne Carriere /* 73a7a9e3baSEtienne Carriere * Return number of clock controllers for an agent 74a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 75a7a9e3baSEtienne Carriere * Return number of clock controllers 76a7a9e3baSEtienne Carriere */ 77a7a9e3baSEtienne Carriere size_t plat_scmi_clock_count(unsigned int agent_id); 78a7a9e3baSEtienne Carriere 79a7a9e3baSEtienne Carriere /* 80a7a9e3baSEtienne Carriere * Get clock controller string ID (aka name) 81a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 82a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 83a7a9e3baSEtienne Carriere * Return pointer to name or NULL 84a7a9e3baSEtienne Carriere */ 85a7a9e3baSEtienne Carriere const char *plat_scmi_clock_get_name(unsigned int agent_id, 86a7a9e3baSEtienne Carriere unsigned int scmi_id); 87a7a9e3baSEtienne Carriere 88a7a9e3baSEtienne Carriere /* 89a7a9e3baSEtienne Carriere * Get clock possible rate as an array of frequencies in Hertz. 90a7a9e3baSEtienne Carriere * 91a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 92a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 93a7a9e3baSEtienne Carriere * @rates: If NULL, function returns, else output rates array 94a7a9e3baSEtienne Carriere * @nb_elts: Array size of @rates. 95a7a9e3baSEtienne Carriere * Return an SCMI compliant error code 96a7a9e3baSEtienne Carriere */ 97a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_rates_array(unsigned int agent_id, unsigned int scmi_id, 98a7a9e3baSEtienne Carriere unsigned long *rates, size_t *nb_elts); 99a7a9e3baSEtienne Carriere 100a7a9e3baSEtienne Carriere /* 101a7a9e3baSEtienne Carriere * Get clock possible rate as range with regular steps in Hertz 102a7a9e3baSEtienne Carriere * 103a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 104a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 105a7a9e3baSEtienne Carriere * @min_max_step: 3 cell array for min, max and step rate data 106a7a9e3baSEtienne Carriere * Return an SCMI compliant error code 107a7a9e3baSEtienne Carriere */ 108a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_rates_by_step(unsigned int agent_id, 109a7a9e3baSEtienne Carriere unsigned int scmi_id, 110a7a9e3baSEtienne Carriere unsigned long *min_max_step); 111a7a9e3baSEtienne Carriere 112a7a9e3baSEtienne Carriere /* 113a7a9e3baSEtienne Carriere * Get clock rate in Hertz 114a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 115a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 116a7a9e3baSEtienne Carriere * Return clock rate or 0 if not supported 117a7a9e3baSEtienne Carriere */ 118a7a9e3baSEtienne Carriere unsigned long plat_scmi_clock_get_rate(unsigned int agent_id, 119a7a9e3baSEtienne Carriere unsigned int scmi_id); 120a7a9e3baSEtienne Carriere 121a7a9e3baSEtienne Carriere /* 122a7a9e3baSEtienne Carriere * Set clock rate in Hertz 123a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 124a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 125a7a9e3baSEtienne Carriere * @rate: Target clock frequency in Hertz 126a7a9e3baSEtienne Carriere * Return a compliant SCMI error code 127a7a9e3baSEtienne Carriere */ 128a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_set_rate(unsigned int agent_id, unsigned int scmi_id, 129a7a9e3baSEtienne Carriere unsigned long rate); 130a7a9e3baSEtienne Carriere 131a7a9e3baSEtienne Carriere /* 132a7a9e3baSEtienne Carriere * Get clock state (enabled or disabled) 133a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 134a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 135a7a9e3baSEtienne Carriere * Return 1 if clock is enabled, 0 if disables, or a negative SCMI error code 136a7a9e3baSEtienne Carriere */ 137a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_get_state(unsigned int agent_id, unsigned int scmi_id); 138a7a9e3baSEtienne Carriere 139a7a9e3baSEtienne Carriere /* 140a7a9e3baSEtienne Carriere * Get clock state (enabled or disabled) 141a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 142a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 143a7a9e3baSEtienne Carriere * @enable_not_disable: Enable clock if true, disable clock otherwise 144a7a9e3baSEtienne Carriere * Return a compliant SCMI error code 145a7a9e3baSEtienne Carriere */ 146a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_set_state(unsigned int agent_id, unsigned int scmi_id, 147a7a9e3baSEtienne Carriere bool enable_not_disable); 148*56a1f10eSEtienne Carriere 149*56a1f10eSEtienne Carriere /* Handlers for SCMI Reset Domain protocol services */ 150*56a1f10eSEtienne Carriere 151*56a1f10eSEtienne Carriere /* 152*56a1f10eSEtienne Carriere * Return number of reset domains for the agent 153*56a1f10eSEtienne Carriere * @agent_id: SCMI agent ID 154*56a1f10eSEtienne Carriere * Return number of reset domains 155*56a1f10eSEtienne Carriere */ 156*56a1f10eSEtienne Carriere size_t plat_scmi_rd_count(unsigned int agent_id); 157*56a1f10eSEtienne Carriere 158*56a1f10eSEtienne Carriere /* 159*56a1f10eSEtienne Carriere * Get reset domain string ID (aka name) 160*56a1f10eSEtienne Carriere * @agent_id: SCMI agent ID 161*56a1f10eSEtienne Carriere * @scmi_id: SCMI reset domain ID 162*56a1f10eSEtienne Carriere * Return pointer to name or NULL 163*56a1f10eSEtienne Carriere */ 164*56a1f10eSEtienne Carriere const char *plat_scmi_rd_get_name(unsigned int agent_id, unsigned int scmi_id); 165*56a1f10eSEtienne Carriere 166*56a1f10eSEtienne Carriere /* 167*56a1f10eSEtienne Carriere * Perform a reset cycle on a target reset domain 168*56a1f10eSEtienne Carriere * @agent_id: SCMI agent ID 169*56a1f10eSEtienne Carriere * @scmi_id: SCMI reset domain ID 170*56a1f10eSEtienne Carriere * @state: Target reset state (see SCMI specification, 0 means context loss) 171*56a1f10eSEtienne Carriere * Return a compliant SCMI error code 172*56a1f10eSEtienne Carriere */ 173*56a1f10eSEtienne Carriere int32_t plat_scmi_rd_autonomous(unsigned int agent_id, unsigned int scmi_id, 174*56a1f10eSEtienne Carriere unsigned int state); 175*56a1f10eSEtienne Carriere 176*56a1f10eSEtienne Carriere /* 177*56a1f10eSEtienne Carriere * Assert or deassert target reset domain 178*56a1f10eSEtienne Carriere * @agent_id: SCMI agent ID 179*56a1f10eSEtienne Carriere * @scmi_id: SCMI reset domain ID 180*56a1f10eSEtienne Carriere * @assert_not_deassert: Assert domain if true, otherwise deassert domain 181*56a1f10eSEtienne Carriere * Return a compliant SCMI error code 182*56a1f10eSEtienne Carriere */ 183*56a1f10eSEtienne Carriere int32_t plat_scmi_rd_set_state(unsigned int agent_id, unsigned int scmi_id, 184*56a1f10eSEtienne Carriere bool assert_not_deassert); 185*56a1f10eSEtienne Carriere 186ae8c8068SEtienne Carriere #endif /* SCMI_MSG_H */ 187