xref: /rk3399_ARM-atf/drivers/scmi-msg/clock.h (revision 958e071f68f3422c18acb969fb19813026cf9d9c)
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_CLOCK_H
8b4734308SPeng Fan #define SCMI_MSG_CLOCK_H
9b4734308SPeng Fan 
10b4734308SPeng Fan #include <stdint.h>
11b4734308SPeng Fan 
12b4734308SPeng Fan #include <lib/utils_def.h>
13b4734308SPeng Fan 
14*684952d1SKamlesh Gurudasani #define SCMI_PROTOCOL_VERSION_CLOCK	0x30000U
15b4734308SPeng Fan 
16b4734308SPeng Fan /*
17b4734308SPeng Fan  * Identifiers of the SCMI Clock Management Protocol commands
18b4734308SPeng Fan  */
19b4734308SPeng Fan enum scmi_clock_command_id {
20b4734308SPeng Fan 	SCMI_CLOCK_ATTRIBUTES = 0x003,
21b4734308SPeng Fan 	SCMI_CLOCK_DESCRIBE_RATES = 0x004,
22b4734308SPeng Fan 	SCMI_CLOCK_RATE_SET = 0x005,
23b4734308SPeng Fan 	SCMI_CLOCK_RATE_GET = 0x006,
24b4734308SPeng Fan 	SCMI_CLOCK_CONFIG_SET = 0x007,
25*684952d1SKamlesh Gurudasani 	SCMI_CLOCK_CONFIG_GET = 0x00B,
26*684952d1SKamlesh Gurudasani 	SCMI_CLOCK_POSSIBLE_PARENTS_GET = 0xC,
27*684952d1SKamlesh Gurudasani 	SCMI_CLOCK_PARENT_SET = 0xD,
28*684952d1SKamlesh Gurudasani 	SCMI_CLOCK_PARENT_GET = 0xE,
29b4734308SPeng Fan };
30b4734308SPeng Fan 
31b4734308SPeng Fan /* Protocol attributes */
32b4734308SPeng Fan #define SCMI_CLOCK_CLOCK_COUNT_MASK			GENMASK(15, 0)
33b4734308SPeng Fan #define SCMI_CLOCK_MAX_PENDING_TRANSITIONS_MASK		GENMASK(23, 16)
34b4734308SPeng Fan 
35b4734308SPeng Fan #define SCMI_CLOCK_PROTOCOL_ATTRIBUTES(_max_pending, _clk_count) \
36b4734308SPeng Fan 	((((_max_pending) << 16) & SCMI_CLOCK_MAX_PENDING_TRANSITIONS_MASK) | \
37b4734308SPeng Fan 	 (((_clk_count) & SCMI_CLOCK_CLOCK_COUNT_MASK)))
38b4734308SPeng Fan 
39b4734308SPeng Fan struct scmi_clock_attributes_a2p {
40b4734308SPeng Fan 	uint32_t clock_id;
41b4734308SPeng Fan };
42b4734308SPeng Fan 
43b4734308SPeng Fan #define SCMI_CLOCK_NAME_LENGTH_MAX	16U
44b4734308SPeng Fan 
45b4734308SPeng Fan struct scmi_clock_attributes_p2a {
46b4734308SPeng Fan 	int32_t status;
47b4734308SPeng Fan 	uint32_t attributes;
48b4734308SPeng Fan 	char clock_name[SCMI_CLOCK_NAME_LENGTH_MAX];
49*684952d1SKamlesh Gurudasani 	uint32_t clock_enable_delay;
50b4734308SPeng Fan };
51b4734308SPeng Fan 
52b4734308SPeng Fan /*
53b4734308SPeng Fan  * Clock Rate Get
54b4734308SPeng Fan  */
55b4734308SPeng Fan 
56b4734308SPeng Fan struct scmi_clock_rate_get_a2p {
57b4734308SPeng Fan 	uint32_t clock_id;
58b4734308SPeng Fan };
59b4734308SPeng Fan 
60b4734308SPeng Fan struct scmi_clock_rate_get_p2a {
61b4734308SPeng Fan 	int32_t status;
62b4734308SPeng Fan 	uint32_t rate[2];
63b4734308SPeng Fan };
64b4734308SPeng Fan 
65b4734308SPeng Fan /*
66b4734308SPeng Fan  * Clock Rate Set
67b4734308SPeng Fan  */
68b4734308SPeng Fan 
69b4734308SPeng Fan /* If set, set the new clock rate asynchronously */
70b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_ASYNC_POS			0
71b4734308SPeng Fan /* If set, do not send a delayed asynchronous response */
72b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_POS	1
73b4734308SPeng Fan /* Round up, if set, otherwise round down */
74b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_ROUND_UP_POS		2
75b4734308SPeng Fan /* If set, the platform chooses the appropriate rounding mode */
76b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_ROUND_AUTO_POS		3
77b4734308SPeng Fan 
78b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_ASYNC_MASK \
79b4734308SPeng Fan 		BIT(SCMI_CLOCK_RATE_SET_ASYNC_POS)
80b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_MASK \
81b4734308SPeng Fan 		BIT(SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_POS)
82b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_ROUND_UP_MASK \
83b4734308SPeng Fan 		BIT(SCMI_CLOCK_RATE_SET_ROUND_UP_POS)
84b4734308SPeng Fan #define SCMI_CLOCK_RATE_SET_ROUND_AUTO_MASK \
85b4734308SPeng Fan 		BIT(SCMI_CLOCK_RATE_SET_ROUND_AUTO_POS)
86b4734308SPeng Fan 
87b4734308SPeng Fan struct scmi_clock_rate_set_a2p {
88b4734308SPeng Fan 	uint32_t flags;
89b4734308SPeng Fan 	uint32_t clock_id;
90b4734308SPeng Fan 	uint32_t rate[2];
91b4734308SPeng Fan };
92b4734308SPeng Fan 
93b4734308SPeng Fan struct scmi_clock_rate_set_p2a {
94b4734308SPeng Fan 	int32_t status;
95b4734308SPeng Fan };
96b4734308SPeng Fan 
97b4734308SPeng Fan /*
98b4734308SPeng Fan  * Clock Config Set
99b4734308SPeng Fan  */
100b4734308SPeng Fan 
101*684952d1SKamlesh Gurudasani #define SCMI_CLOCK_CONFIG_SET_ENABLE_MASK		  GENMASK_32(1, 0)
102*684952d1SKamlesh Gurudasani #define SCMI_CLOCK_EXTENDED_CONFIG_SET_TYPE_MASK	  GENMASK_32(23, 16)
103*684952d1SKamlesh Gurudasani #define SCMI_CLOCK_CONFIG_SET_RESERVED_STATE              2U
104*684952d1SKamlesh Gurudasani /* If extended config is supported and being actively used, config_set allows
105*684952d1SKamlesh Gurudasani  * updating extended configuration parameters while preserving the current
106*684952d1SKamlesh Gurudasani  * clock state (enabled/disabled remains unchanged).
107*684952d1SKamlesh Gurudasani  */
108*684952d1SKamlesh Gurudasani #define SCMI_CLOCK_CONFIG_SET_UNCHANGED_STATE		  3U
109b4734308SPeng Fan 
110b4734308SPeng Fan 
111b4734308SPeng Fan struct scmi_clock_config_set_a2p {
112b4734308SPeng Fan 	uint32_t clock_id;
113b4734308SPeng Fan 	uint32_t attributes;
114*684952d1SKamlesh Gurudasani 	uint32_t extended_config_val;
115b4734308SPeng Fan };
116b4734308SPeng Fan 
117b4734308SPeng Fan struct scmi_clock_config_set_p2a {
118b4734308SPeng Fan 	int32_t status;
119b4734308SPeng Fan };
120b4734308SPeng Fan 
121b4734308SPeng Fan /*
122*684952d1SKamlesh Gurudasani  * Clock Config Get
123*684952d1SKamlesh Gurudasani  */
124*684952d1SKamlesh Gurudasani 
125*684952d1SKamlesh Gurudasani #define SCMI_CLOCK_EXTENDED_CONFIG_SUPPORT_POS		27
126*684952d1SKamlesh Gurudasani #define SCMI_CLOCK_EXTENDED_CONFIG_GET_TYPE_MASK	GENMASK_32(7, 0)
127*684952d1SKamlesh Gurudasani 
128*684952d1SKamlesh Gurudasani struct scmi_clock_config_get_a2p {
129*684952d1SKamlesh Gurudasani 	uint32_t clock_id;
130*684952d1SKamlesh Gurudasani 	uint32_t flags;
131*684952d1SKamlesh Gurudasani };
132*684952d1SKamlesh Gurudasani 
133*684952d1SKamlesh Gurudasani struct scmi_clock_config_get_p2a {
134*684952d1SKamlesh Gurudasani 	int32_t status;
135*684952d1SKamlesh Gurudasani 	uint32_t attributes;
136*684952d1SKamlesh Gurudasani 	uint32_t config;
137*684952d1SKamlesh Gurudasani 	uint32_t extended_config_val;
138*684952d1SKamlesh Gurudasani };
139*684952d1SKamlesh Gurudasani 
140*684952d1SKamlesh Gurudasani /*
141*684952d1SKamlesh Gurudasani  * Clock Possible Parents
142*684952d1SKamlesh Gurudasani  */
143*684952d1SKamlesh Gurudasani struct scmi_clock_possible_parents_get_a2p {
144*684952d1SKamlesh Gurudasani 	uint32_t clock_id;
145*684952d1SKamlesh Gurudasani 	uint32_t skip_parents;
146*684952d1SKamlesh Gurudasani };
147*684952d1SKamlesh Gurudasani 
148*684952d1SKamlesh Gurudasani struct scmi_clock_possible_parents_get_p2a {
149*684952d1SKamlesh Gurudasani 	int32_t status;
150*684952d1SKamlesh Gurudasani 	uint32_t flags;
151*684952d1SKamlesh Gurudasani 	uint32_t possible_parents[];
152*684952d1SKamlesh Gurudasani };
153*684952d1SKamlesh Gurudasani 
154*684952d1SKamlesh Gurudasani /*
155*684952d1SKamlesh Gurudasani  * Clock Parent Get
156*684952d1SKamlesh Gurudasani  */
157*684952d1SKamlesh Gurudasani #define SCMI_CLOCK_PARENT_IDENTIFIER_SUPPORT_POS	28
158*684952d1SKamlesh Gurudasani 
159*684952d1SKamlesh Gurudasani struct scmi_clock_parent_get_a2p {
160*684952d1SKamlesh Gurudasani 	uint32_t clock_id;
161*684952d1SKamlesh Gurudasani };
162*684952d1SKamlesh Gurudasani 
163*684952d1SKamlesh Gurudasani struct scmi_clock_parent_get_p2a {
164*684952d1SKamlesh Gurudasani 	int32_t status;
165*684952d1SKamlesh Gurudasani 	uint32_t parent_id;
166*684952d1SKamlesh Gurudasani };
167*684952d1SKamlesh Gurudasani 
168*684952d1SKamlesh Gurudasani /*
169*684952d1SKamlesh Gurudasani  * Clock Parent Set
170*684952d1SKamlesh Gurudasani  */
171*684952d1SKamlesh Gurudasani struct scmi_clock_parent_set_a2p {
172*684952d1SKamlesh Gurudasani 	uint32_t clock_id;
173*684952d1SKamlesh Gurudasani 	uint32_t parent_id;
174*684952d1SKamlesh Gurudasani };
175*684952d1SKamlesh Gurudasani 
176*684952d1SKamlesh Gurudasani struct scmi_clock_parent_set_p2a {
177*684952d1SKamlesh Gurudasani 	int32_t status;
178*684952d1SKamlesh Gurudasani };
179*684952d1SKamlesh Gurudasani 
180*684952d1SKamlesh Gurudasani /*
181b4734308SPeng Fan  * Clock Describe Rates
182b4734308SPeng Fan  */
183b4734308SPeng Fan 
184b4734308SPeng Fan #define SCMI_CLOCK_RATE_FORMAT_RANGE			1U
185b4734308SPeng Fan #define SCMI_CLOCK_RATE_FORMAT_LIST			0U
186b4734308SPeng Fan 
187b4734308SPeng Fan #define SCMI_CLOCK_DESCRIBE_RATES_REMAINING_MASK	GENMASK_32(31, 16)
188b4734308SPeng Fan #define SCMI_CLOCK_DESCRIBE_RATES_REMAINING_POS		16
189b4734308SPeng Fan 
190b4734308SPeng Fan #define SCMI_CLOCK_DESCRIBE_RATES_FORMAT_MASK		BIT(12)
191b4734308SPeng Fan #define SCMI_CLOCK_DESCRIBE_RATES_FORMAT_POS		12
192b4734308SPeng Fan 
193b4734308SPeng Fan #define SCMI_CLOCK_DESCRIBE_RATES_COUNT_MASK		GENMASK_32(11, 0)
194b4734308SPeng Fan 
195b4734308SPeng Fan #define SCMI_CLOCK_DESCRIBE_RATES_NUM_RATES_FLAGS(_count, _fmt, _rem_rates) \
196b4734308SPeng Fan 	( \
197b4734308SPeng Fan 		((_count) & SCMI_CLOCK_DESCRIBE_RATES_COUNT_MASK) | \
198b4734308SPeng Fan 		(((_rem_rates) << SCMI_CLOCK_DESCRIBE_RATES_REMAINING_POS) & \
199b4734308SPeng Fan 		 SCMI_CLOCK_DESCRIBE_RATES_REMAINING_MASK) | \
200b4734308SPeng Fan 		(((_fmt) << SCMI_CLOCK_DESCRIBE_RATES_FORMAT_POS) & \
201b4734308SPeng Fan 		 SCMI_CLOCK_DESCRIBE_RATES_FORMAT_MASK) \
202b4734308SPeng Fan 	)
203b4734308SPeng Fan 
204b4734308SPeng Fan struct scmi_clock_rate {
205b4734308SPeng Fan 	uint32_t low;
206b4734308SPeng Fan 	uint32_t high;
207b4734308SPeng Fan };
208b4734308SPeng Fan 
209b4734308SPeng Fan struct scmi_clock_describe_rates_a2p {
210b4734308SPeng Fan 	uint32_t clock_id;
211b4734308SPeng Fan 	uint32_t rate_index;
212b4734308SPeng Fan };
213b4734308SPeng Fan 
214b4734308SPeng Fan struct scmi_clock_describe_rates_p2a {
215b4734308SPeng Fan 	int32_t status;
216b4734308SPeng Fan 	uint32_t num_rates_flags;
217b4734308SPeng Fan 	struct scmi_clock_rate rates[];
218b4734308SPeng Fan };
219b4734308SPeng Fan 
220b4734308SPeng Fan #endif /* SCMI_MSG_CLOCK_H */
221