1b4734308SPeng Fan /* SPDX-License-Identifier: BSD-3-Clause */ 2b4734308SPeng Fan /* 3b4734308SPeng Fan * Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved. 4b4734308SPeng Fan * Copyright (c) 2019, Linaro Limited 5b4734308SPeng Fan */ 6b4734308SPeng Fan 7b4734308SPeng Fan #ifndef SCMI_MSG_H 8b4734308SPeng Fan #define SCMI_MSG_H 9b4734308SPeng Fan 10b4734308SPeng Fan #include <stdbool.h> 11b4734308SPeng Fan #include <stddef.h> 12b4734308SPeng Fan #include <stdint.h> 13b4734308SPeng Fan 14b4734308SPeng Fan /* Minimum size expected for SMT based shared memory message buffers */ 15b4734308SPeng Fan #define SMT_BUF_SLOT_SIZE 128U 16b4734308SPeng Fan 17b4734308SPeng Fan /* A channel abstract a communication path between agent and server */ 18b4734308SPeng Fan struct scmi_msg_channel; 19b4734308SPeng Fan 20b4734308SPeng Fan /* 21b4734308SPeng Fan * struct scmi_msg_channel - Shared memory buffer for a agent-to-server channel 22b4734308SPeng Fan * 23b4734308SPeng Fan * @shm_addr: Address of the shared memory for the SCMI channel 24b4734308SPeng Fan * @shm_size: Byte size of the shared memory for the SCMI channel 257ece6597SMichal Simek * @busy: True when channel is busy, false when channel is free 26b4734308SPeng Fan * @agent_name: Agent name, SCMI protocol exposes 16 bytes max, or NULL 27b4734308SPeng Fan */ 28b4734308SPeng Fan struct scmi_msg_channel { 29b4734308SPeng Fan uintptr_t shm_addr; 30b4734308SPeng Fan size_t shm_size; 31b4734308SPeng Fan bool busy; 32b4734308SPeng Fan const char *agent_name; 33b4734308SPeng Fan }; 34b4734308SPeng Fan 35b4734308SPeng Fan /* 36b4734308SPeng Fan * Initialize SMT memory buffer, called by platform at init for each 37b4734308SPeng Fan * agent channel using the SMT header format. 38b4734308SPeng Fan * 39b4734308SPeng Fan * @chan: Pointer to the channel shared memory to be initialized 40b4734308SPeng Fan */ 41b4734308SPeng Fan void scmi_smt_init_agent_channel(struct scmi_msg_channel *chan); 42b4734308SPeng Fan 43b4734308SPeng Fan /* 44b4734308SPeng Fan * Process SMT formatted message in a fastcall SMC execution context. 45b4734308SPeng Fan * Called by platform on SMC entry. When returning, output message is 46b4734308SPeng Fan * available in shared memory for agent to read the response. 47b4734308SPeng Fan * 48b4734308SPeng Fan * @agent_id: SCMI agent ID the SMT belongs to 49b4734308SPeng Fan */ 50b4734308SPeng Fan void scmi_smt_fastcall_smc_entry(unsigned int agent_id); 51b4734308SPeng Fan 52b4734308SPeng Fan /* 53b4734308SPeng Fan * Process SMT formatted message in a secure interrupt execution context. 54b4734308SPeng Fan * Called by platform interrupt handler. When returning, output message is 55b4734308SPeng Fan * available in shared memory for agent to read the response. 56b4734308SPeng Fan * 57b4734308SPeng Fan * @agent_id: SCMI agent ID the SMT belongs to 58b4734308SPeng Fan */ 59b4734308SPeng Fan void scmi_smt_interrupt_entry(unsigned int agent_id); 60b4734308SPeng Fan 61b4734308SPeng Fan /* Platform callback functions */ 62b4734308SPeng Fan 63b4734308SPeng Fan /* 64b4734308SPeng Fan * Return the SCMI channel related to an agent 65b4734308SPeng Fan * @agent_id: SCMI agent ID 66b4734308SPeng Fan * Return a pointer to channel on success, NULL otherwise 67b4734308SPeng Fan */ 68b4734308SPeng Fan struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id); 69b4734308SPeng Fan 70b4734308SPeng Fan /* 71b4734308SPeng Fan * Return how many SCMI protocols supported by the platform 72b4734308SPeng Fan * According to the SCMI specification, this function does not target 73b4734308SPeng Fan * a specific agent ID and shall return all platform known capabilities. 74b4734308SPeng Fan */ 75b4734308SPeng Fan size_t plat_scmi_protocol_count(void); 76b4734308SPeng Fan 77b4734308SPeng Fan /* 78b4734308SPeng Fan * Get the count and list of SCMI protocols (but base) supported for an agent 79b4734308SPeng Fan * 80b4734308SPeng Fan * @agent_id: SCMI agent ID 81b4734308SPeng Fan * Return a pointer to a null terminated array supported protocol IDs. 82b4734308SPeng Fan */ 83b4734308SPeng Fan const uint8_t *plat_scmi_protocol_list(unsigned int agent_id); 84b4734308SPeng Fan 85b4734308SPeng Fan /* Get the name of the SCMI vendor for the platform */ 86b4734308SPeng Fan const char *plat_scmi_vendor_name(void); 87b4734308SPeng Fan 88b4734308SPeng Fan /* Get the name of the SCMI sub-vendor for the platform */ 89b4734308SPeng Fan const char *plat_scmi_sub_vendor_name(void); 90b4734308SPeng Fan 91b4734308SPeng Fan /* Handlers for SCMI Clock protocol services */ 92b4734308SPeng Fan 93b4734308SPeng Fan /* 94b4734308SPeng Fan * Return number of clock controllers for an agent 95b4734308SPeng Fan * @agent_id: SCMI agent ID 96b4734308SPeng Fan * Return number of clock controllers 97b4734308SPeng Fan */ 98b4734308SPeng Fan size_t plat_scmi_clock_count(unsigned int agent_id); 99b4734308SPeng Fan 100b4734308SPeng Fan /* 101b4734308SPeng Fan * Get clock controller string ID (aka name) 102b4734308SPeng Fan * @agent_id: SCMI agent ID 103b4734308SPeng Fan * @scmi_id: SCMI clock ID 104b4734308SPeng Fan * Return pointer to name or NULL 105b4734308SPeng Fan */ 106b4734308SPeng Fan const char *plat_scmi_clock_get_name(unsigned int agent_id, 107b4734308SPeng Fan unsigned int scmi_id); 108b4734308SPeng Fan 109b4734308SPeng Fan /* 110*684952d1SKamlesh Gurudasani * Get clock enable delay in microseconds 111*684952d1SKamlesh Gurudasani * @agent_id: SCMI agent ID 112*684952d1SKamlesh Gurudasani * @scmi_id: SCMI clock ID 113*684952d1SKamlesh Gurudasani * Return delay or zero if not supported 114*684952d1SKamlesh Gurudasani */ 115*684952d1SKamlesh Gurudasani uint32_t plat_scmi_clock_get_enable_delay(unsigned int agent_id, 116*684952d1SKamlesh Gurudasani unsigned int scmi_id); 117*684952d1SKamlesh Gurudasani 118*684952d1SKamlesh Gurudasani /* 119b4734308SPeng Fan * Get clock possible rate as an array of frequencies in Hertz. 120b4734308SPeng Fan * 121b4734308SPeng Fan * @agent_id: SCMI agent ID 122b4734308SPeng Fan * @scmi_id: SCMI clock ID 123b4734308SPeng Fan * @rates: If NULL, function returns, else output rates array 124b4734308SPeng Fan * @nb_elts: Array size of @rates. 125ca9d6edcSXiaoDong Huang * @start_idx: Start index of rates array 126b4734308SPeng Fan * Return an SCMI compliant error code 127b4734308SPeng Fan */ 128b4734308SPeng Fan int32_t plat_scmi_clock_rates_array(unsigned int agent_id, unsigned int scmi_id, 129ca9d6edcSXiaoDong Huang unsigned long *rates, size_t *nb_elts, 130ca9d6edcSXiaoDong Huang uint32_t start_idx); 131b4734308SPeng Fan 132b4734308SPeng Fan /* 133b4734308SPeng Fan * Get clock possible rate as range with regular steps in Hertz 134b4734308SPeng Fan * 135b4734308SPeng Fan * @agent_id: SCMI agent ID 136b4734308SPeng Fan * @scmi_id: SCMI clock ID 137b4734308SPeng Fan * @min_max_step: 3 cell array for min, max and step rate data 138b4734308SPeng Fan * Return an SCMI compliant error code 139b4734308SPeng Fan */ 140b4734308SPeng Fan int32_t plat_scmi_clock_rates_by_step(unsigned int agent_id, 141b4734308SPeng Fan unsigned int scmi_id, 142b4734308SPeng Fan unsigned long *min_max_step); 143*684952d1SKamlesh Gurudasani /* 144*684952d1SKamlesh Gurudasani * Get clock possible parents as an array of parent ids 145*684952d1SKamlesh Gurudasani * @agent_id: SCMI agent ID 146*684952d1SKamlesh Gurudasani * @scmi_id: SCMI clock ID 147*684952d1SKamlesh Gurudasani * @plat_possible_parents: If NULL, function returns, 148*684952d1SKamlesh Gurudasani * else output possible parents array 149*684952d1SKamlesh Gurudasani * @nb_elts: Array size of @plat_possible_parents 150*684952d1SKamlesh Gurudasani * @skip_parents: Number of parents to skip for 2nd iteration onwards 151*684952d1SKamlesh Gurudasani * Return an SCMI compliant error code 152*684952d1SKamlesh Gurudasani */ 153*684952d1SKamlesh Gurudasani int32_t plat_scmi_clock_get_possible_parents(unsigned int agent_id, 154*684952d1SKamlesh Gurudasani unsigned int scmi_id, 155*684952d1SKamlesh Gurudasani unsigned int *plat_possible_parents, 156*684952d1SKamlesh Gurudasani size_t *nb_elts, 157*684952d1SKamlesh Gurudasani unsigned int skip_parents); 158*684952d1SKamlesh Gurudasani /* 159*684952d1SKamlesh Gurudasani * Get clock parent 160*684952d1SKamlesh Gurudasani * @agent_id: SCMI agent ID 161*684952d1SKamlesh Gurudasani * @scmi_id: SCMI clock ID 162*684952d1SKamlesh Gurudasani * @parent_id: Target parent id 163*684952d1SKamlesh Gurudasani * Return a compliant SCMI error code 164*684952d1SKamlesh Gurudasani */ 165*684952d1SKamlesh Gurudasani int32_t plat_scmi_clock_get_parent(unsigned int agent_id, 166*684952d1SKamlesh Gurudasani unsigned int scmi_id, 167*684952d1SKamlesh Gurudasani unsigned int *parent_id); 168*684952d1SKamlesh Gurudasani /* 169*684952d1SKamlesh Gurudasani * Set clock parent 170*684952d1SKamlesh Gurudasani * @agent_id: SCMI agent ID 171*684952d1SKamlesh Gurudasani * @scmi_id: SCMI clock ID 172*684952d1SKamlesh Gurudasani * @parent_id: Target parent id 173*684952d1SKamlesh Gurudasani * Return a compliant SCMI error code 174*684952d1SKamlesh Gurudasani */ 175*684952d1SKamlesh Gurudasani int32_t plat_scmi_clock_set_parent(unsigned int agent_id, 176*684952d1SKamlesh Gurudasani unsigned int scmi_id, 177*684952d1SKamlesh Gurudasani unsigned int parent_id); 178b4734308SPeng Fan 179b4734308SPeng Fan /* 180b4734308SPeng Fan * Get clock rate in Hertz 181b4734308SPeng Fan * @agent_id: SCMI agent ID 182b4734308SPeng Fan * @scmi_id: SCMI clock ID 183b4734308SPeng Fan * Return clock rate or 0 if not supported 184b4734308SPeng Fan */ 185b4734308SPeng Fan unsigned long plat_scmi_clock_get_rate(unsigned int agent_id, 186b4734308SPeng Fan unsigned int scmi_id); 187b4734308SPeng Fan 188b4734308SPeng Fan /* 189b4734308SPeng Fan * Set clock rate in Hertz 190b4734308SPeng Fan * @agent_id: SCMI agent ID 191b4734308SPeng Fan * @scmi_id: SCMI clock ID 192b4734308SPeng Fan * @rate: Target clock frequency in Hertz 193b4734308SPeng Fan * Return a compliant SCMI error code 194b4734308SPeng Fan */ 195b4734308SPeng Fan int32_t plat_scmi_clock_set_rate(unsigned int agent_id, unsigned int scmi_id, 196b4734308SPeng Fan unsigned long rate); 197b4734308SPeng Fan 198b4734308SPeng Fan /* 199b4734308SPeng Fan * Get clock state (enabled or disabled) 200b4734308SPeng Fan * @agent_id: SCMI agent ID 201b4734308SPeng Fan * @scmi_id: SCMI clock ID 202b4734308SPeng Fan * Return 1 if clock is enabled, 0 if disables, or a negative SCMI error code 203b4734308SPeng Fan */ 204b4734308SPeng Fan int32_t plat_scmi_clock_get_state(unsigned int agent_id, unsigned int scmi_id); 205b4734308SPeng Fan 206b4734308SPeng Fan /* 207b4734308SPeng Fan * Get clock state (enabled or disabled) 208b4734308SPeng Fan * @agent_id: SCMI agent ID 209b4734308SPeng Fan * @scmi_id: SCMI clock ID 210b4734308SPeng Fan * @enable_not_disable: Enable clock if true, disable clock otherwise 211b4734308SPeng Fan * Return a compliant SCMI error code 212b4734308SPeng Fan */ 213b4734308SPeng Fan int32_t plat_scmi_clock_set_state(unsigned int agent_id, unsigned int scmi_id, 214b4734308SPeng Fan bool enable_not_disable); 215b4734308SPeng Fan 216*684952d1SKamlesh Gurudasani /* 217*684952d1SKamlesh Gurudasani * Get clock extended config 218*684952d1SKamlesh Gurudasani * @agent_id: SCMI agent ID 219*684952d1SKamlesh Gurudasani * @scmi_id: SCMI clock ID 220*684952d1SKamlesh Gurudasani * @extended_config_type: Type of Extended config value 221*684952d1SKamlesh Gurudasani * @extended_config_val: Value corresponding to extended configuration type 222*684952d1SKamlesh Gurudasani * Return a compliant SCMI error code 223*684952d1SKamlesh Gurudasani */ 224*684952d1SKamlesh Gurudasani int32_t plat_scmi_clock_get_extended_config(unsigned int agent_id, 225*684952d1SKamlesh Gurudasani unsigned int scmi_id, 226*684952d1SKamlesh Gurudasani unsigned char extended_config_type, 227*684952d1SKamlesh Gurudasani unsigned int *extended_config_val); 228*684952d1SKamlesh Gurudasani 229*684952d1SKamlesh Gurudasani /* 230*684952d1SKamlesh Gurudasani * Set clock extended config 231*684952d1SKamlesh Gurudasani * @agent_id: SCMI agent ID 232*684952d1SKamlesh Gurudasani * @scmi_id: SCMI clock ID 233*684952d1SKamlesh Gurudasani * @extended_config_type: Type of Extended config value 234*684952d1SKamlesh Gurudasani * @extended_config_val: Value corresponding to extended configuration type 235*684952d1SKamlesh Gurudasani * Return a compliant SCMI error code 236*684952d1SKamlesh Gurudasani */ 237*684952d1SKamlesh Gurudasani int32_t plat_scmi_clock_set_extended_config(unsigned int agent_id, 238*684952d1SKamlesh Gurudasani unsigned int scmi_id, 239*684952d1SKamlesh Gurudasani unsigned char extended_config_type, 240*684952d1SKamlesh Gurudasani unsigned int extended_config_val); 241*684952d1SKamlesh Gurudasani 242b4734308SPeng Fan /* Handlers for SCMI Reset Domain protocol services */ 243b4734308SPeng Fan 244b4734308SPeng Fan /* 245b4734308SPeng Fan * Return number of reset domains for the agent 246b4734308SPeng Fan * @agent_id: SCMI agent ID 247b4734308SPeng Fan * Return number of reset domains 248b4734308SPeng Fan */ 249b4734308SPeng Fan size_t plat_scmi_rstd_count(unsigned int agent_id); 250b4734308SPeng Fan 251b4734308SPeng Fan /* 252b4734308SPeng Fan * Get reset domain string ID (aka name) 253b4734308SPeng Fan * @agent_id: SCMI agent ID 254b4734308SPeng Fan * @scmi_id: SCMI reset domain ID 255b4734308SPeng Fan * Return pointer to name or NULL 256b4734308SPeng Fan */ 257b4734308SPeng Fan const char *plat_scmi_rstd_get_name(unsigned int agent_id, unsigned int scmi_id); 258b4734308SPeng Fan 259b4734308SPeng Fan /* 260b4734308SPeng Fan * Perform a reset cycle on a target reset domain 261b4734308SPeng Fan * @agent_id: SCMI agent ID 262b4734308SPeng Fan * @scmi_id: SCMI reset domain ID 263b4734308SPeng Fan * @state: Target reset state (see SCMI specification, 0 means context loss) 264b4734308SPeng Fan * Return a compliant SCMI error code 265b4734308SPeng Fan */ 266b4734308SPeng Fan int32_t plat_scmi_rstd_autonomous(unsigned int agent_id, unsigned int scmi_id, 267b4734308SPeng Fan unsigned int state); 268b4734308SPeng Fan 269b4734308SPeng Fan /* 270b4734308SPeng Fan * Assert or deassert target reset domain 271b4734308SPeng Fan * @agent_id: SCMI agent ID 272b4734308SPeng Fan * @scmi_id: SCMI reset domain ID 273b4734308SPeng Fan * @assert_not_deassert: Assert domain if true, otherwise deassert domain 274b4734308SPeng Fan * Return a compliant SCMI error code 275b4734308SPeng Fan */ 276b4734308SPeng Fan int32_t plat_scmi_rstd_set_state(unsigned int agent_id, unsigned int scmi_id, 277b4734308SPeng Fan bool assert_not_deassert); 278b4734308SPeng Fan 279b4734308SPeng Fan #endif /* SCMI_MSG_H */ 280