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 70*a7a9e3baSEtienne Carriere /* Handlers for SCMI Clock protocol services */ 71*a7a9e3baSEtienne Carriere 72*a7a9e3baSEtienne Carriere /* 73*a7a9e3baSEtienne Carriere * Return number of clock controllers for an agent 74*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 75*a7a9e3baSEtienne Carriere * Return number of clock controllers 76*a7a9e3baSEtienne Carriere */ 77*a7a9e3baSEtienne Carriere size_t plat_scmi_clock_count(unsigned int agent_id); 78*a7a9e3baSEtienne Carriere 79*a7a9e3baSEtienne Carriere /* 80*a7a9e3baSEtienne Carriere * Get clock controller string ID (aka name) 81*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 82*a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 83*a7a9e3baSEtienne Carriere * Return pointer to name or NULL 84*a7a9e3baSEtienne Carriere */ 85*a7a9e3baSEtienne Carriere const char *plat_scmi_clock_get_name(unsigned int agent_id, 86*a7a9e3baSEtienne Carriere unsigned int scmi_id); 87*a7a9e3baSEtienne Carriere 88*a7a9e3baSEtienne Carriere /* 89*a7a9e3baSEtienne Carriere * Get clock possible rate as an array of frequencies in Hertz. 90*a7a9e3baSEtienne Carriere * 91*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 92*a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 93*a7a9e3baSEtienne Carriere * @rates: If NULL, function returns, else output rates array 94*a7a9e3baSEtienne Carriere * @nb_elts: Array size of @rates. 95*a7a9e3baSEtienne Carriere * Return an SCMI compliant error code 96*a7a9e3baSEtienne Carriere */ 97*a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_rates_array(unsigned int agent_id, unsigned int scmi_id, 98*a7a9e3baSEtienne Carriere unsigned long *rates, size_t *nb_elts); 99*a7a9e3baSEtienne Carriere 100*a7a9e3baSEtienne Carriere /* 101*a7a9e3baSEtienne Carriere * Get clock possible rate as range with regular steps in Hertz 102*a7a9e3baSEtienne Carriere * 103*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 104*a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 105*a7a9e3baSEtienne Carriere * @min_max_step: 3 cell array for min, max and step rate data 106*a7a9e3baSEtienne Carriere * Return an SCMI compliant error code 107*a7a9e3baSEtienne Carriere */ 108*a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_rates_by_step(unsigned int agent_id, 109*a7a9e3baSEtienne Carriere unsigned int scmi_id, 110*a7a9e3baSEtienne Carriere unsigned long *min_max_step); 111*a7a9e3baSEtienne Carriere 112*a7a9e3baSEtienne Carriere /* 113*a7a9e3baSEtienne Carriere * Get clock rate in Hertz 114*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 115*a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 116*a7a9e3baSEtienne Carriere * Return clock rate or 0 if not supported 117*a7a9e3baSEtienne Carriere */ 118*a7a9e3baSEtienne Carriere unsigned long plat_scmi_clock_get_rate(unsigned int agent_id, 119*a7a9e3baSEtienne Carriere unsigned int scmi_id); 120*a7a9e3baSEtienne Carriere 121*a7a9e3baSEtienne Carriere /* 122*a7a9e3baSEtienne Carriere * Set clock rate in Hertz 123*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 124*a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 125*a7a9e3baSEtienne Carriere * @rate: Target clock frequency in Hertz 126*a7a9e3baSEtienne Carriere * Return a compliant SCMI error code 127*a7a9e3baSEtienne Carriere */ 128*a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_set_rate(unsigned int agent_id, unsigned int scmi_id, 129*a7a9e3baSEtienne Carriere unsigned long rate); 130*a7a9e3baSEtienne Carriere 131*a7a9e3baSEtienne Carriere /* 132*a7a9e3baSEtienne Carriere * Get clock state (enabled or disabled) 133*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 134*a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 135*a7a9e3baSEtienne Carriere * Return 1 if clock is enabled, 0 if disables, or a negative SCMI error code 136*a7a9e3baSEtienne Carriere */ 137*a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_get_state(unsigned int agent_id, unsigned int scmi_id); 138*a7a9e3baSEtienne Carriere 139*a7a9e3baSEtienne Carriere /* 140*a7a9e3baSEtienne Carriere * Get clock state (enabled or disabled) 141*a7a9e3baSEtienne Carriere * @agent_id: SCMI agent ID 142*a7a9e3baSEtienne Carriere * @scmi_id: SCMI clock ID 143*a7a9e3baSEtienne Carriere * @enable_not_disable: Enable clock if true, disable clock otherwise 144*a7a9e3baSEtienne Carriere * Return a compliant SCMI error code 145*a7a9e3baSEtienne Carriere */ 146*a7a9e3baSEtienne Carriere int32_t plat_scmi_clock_set_state(unsigned int agent_id, unsigned int scmi_id, 147*a7a9e3baSEtienne Carriere bool enable_not_disable); 148ae8c8068SEtienne Carriere #endif /* SCMI_MSG_H */ 149