xref: /optee_os/core/include/drivers/scmi-msg.h (revision 56a1f10ed99d683ee3a8af29b6147a59a99ef3e0)
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