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