xref: /optee_os/core/drivers/scmi-msg/clock.h (revision 064bf8dc50d06d72e0d220d811b2261ea5cdea95)
1a7a9e3baSEtienne Carriere /* SPDX-License-Identifier: BSD-3-Clause */
2a7a9e3baSEtienne Carriere /*
3a7a9e3baSEtienne Carriere  * Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved.
4a7a9e3baSEtienne Carriere  * Copyright (c) 2019, Linaro Limited
5a7a9e3baSEtienne Carriere  */
6a7a9e3baSEtienne Carriere 
7a7a9e3baSEtienne Carriere #ifndef SCMI_MSG_CLOCK_H
8a7a9e3baSEtienne Carriere #define SCMI_MSG_CLOCK_H
9a7a9e3baSEtienne Carriere 
10a7a9e3baSEtienne Carriere #include <stdint.h>
11a7a9e3baSEtienne Carriere #include <util.h>
12a7a9e3baSEtienne Carriere 
13a7a9e3baSEtienne Carriere #define SCMI_PROTOCOL_VERSION_CLOCK	0x20000
14a7a9e3baSEtienne Carriere 
15a7a9e3baSEtienne Carriere /*
16a7a9e3baSEtienne Carriere  * Identifiers of the SCMI Clock Management Protocol commands
17a7a9e3baSEtienne Carriere  */
18a7a9e3baSEtienne Carriere enum scmi_clock_command_id {
19a7a9e3baSEtienne Carriere 	SCMI_CLOCK_ATTRIBUTES = 0x003,
20a7a9e3baSEtienne Carriere 	SCMI_CLOCK_DESCRIBE_RATES = 0x004,
21a7a9e3baSEtienne Carriere 	SCMI_CLOCK_RATE_SET = 0x005,
22a7a9e3baSEtienne Carriere 	SCMI_CLOCK_RATE_GET = 0x006,
23a7a9e3baSEtienne Carriere 	SCMI_CLOCK_CONFIG_SET = 0x007,
24a7a9e3baSEtienne Carriere };
25a7a9e3baSEtienne Carriere 
26a7a9e3baSEtienne Carriere /* Protocol attributes */
27a7a9e3baSEtienne Carriere #define SCMI_CLOCK_CLOCK_COUNT_MASK			GENMASK_32(15, 0)
28a7a9e3baSEtienne Carriere #define SCMI_CLOCK_MAX_PENDING_TRANSITIONS_MASK		GENMASK_32(23, 16)
29a7a9e3baSEtienne Carriere 
30a7a9e3baSEtienne Carriere #define SCMI_CLOCK_PROTOCOL_ATTRIBUTES(_max_pending, _clk_count) \
31a7a9e3baSEtienne Carriere 	((((_max_pending) << 16) & SCMI_CLOCK_MAX_PENDING_TRANSITIONS_MASK) | \
32a7a9e3baSEtienne Carriere 	 (((_clk_count) & SCMI_CLOCK_CLOCK_COUNT_MASK)))
33a7a9e3baSEtienne Carriere 
34a7a9e3baSEtienne Carriere struct scmi_clock_attributes_a2p {
35a7a9e3baSEtienne Carriere 	uint32_t clock_id;
36a7a9e3baSEtienne Carriere };
37a7a9e3baSEtienne Carriere 
38a7a9e3baSEtienne Carriere #define SCMI_CLOCK_NAME_LENGTH_MAX	16
39a7a9e3baSEtienne Carriere 
40a7a9e3baSEtienne Carriere struct scmi_clock_attributes_p2a {
41a7a9e3baSEtienne Carriere 	int32_t status;
42a7a9e3baSEtienne Carriere 	uint32_t attributes;
43a7a9e3baSEtienne Carriere 	char clock_name[SCMI_CLOCK_NAME_LENGTH_MAX];
44a7a9e3baSEtienne Carriere };
45a7a9e3baSEtienne Carriere 
46a7a9e3baSEtienne Carriere /*
47a7a9e3baSEtienne Carriere  * Clock Rate Get
48a7a9e3baSEtienne Carriere  */
49a7a9e3baSEtienne Carriere 
50a7a9e3baSEtienne Carriere struct scmi_clock_rate_get_a2p {
51a7a9e3baSEtienne Carriere 	uint32_t clock_id;
52a7a9e3baSEtienne Carriere };
53a7a9e3baSEtienne Carriere 
54a7a9e3baSEtienne Carriere struct scmi_clock_rate_get_p2a {
55a7a9e3baSEtienne Carriere 	int32_t status;
56a7a9e3baSEtienne Carriere 	uint32_t rate[2];
57a7a9e3baSEtienne Carriere };
58a7a9e3baSEtienne Carriere 
59a7a9e3baSEtienne Carriere /*
60a7a9e3baSEtienne Carriere  * Clock Rate Set
61a7a9e3baSEtienne Carriere  */
62a7a9e3baSEtienne Carriere 
63a7a9e3baSEtienne Carriere /* If set, set the new clock rate asynchronously */
64a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ASYNC_POS			0
65a7a9e3baSEtienne Carriere /* If set, do not send a delayed asynchronous response */
66a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_POS	1
67a7a9e3baSEtienne Carriere /* Round up, if set, otherwise round down */
68a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_UP_POS		2
69a7a9e3baSEtienne Carriere /* If set, the platform chooses the appropriate rounding mode */
70a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_AUTO_POS		3
71a7a9e3baSEtienne Carriere 
72a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ASYNC_MASK \
73a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_ASYNC_POS)
74a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_MASK \
75a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_POS)
76a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_UP_MASK \
77a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_ROUND_UP_POS)
78a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_AUTO_MASK \
79a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_ROUND_AUTO_POS)
80a7a9e3baSEtienne Carriere 
81a7a9e3baSEtienne Carriere struct scmi_clock_rate_set_a2p {
82a7a9e3baSEtienne Carriere 	uint32_t flags;
83a7a9e3baSEtienne Carriere 	uint32_t clock_id;
84a7a9e3baSEtienne Carriere 	uint32_t rate[2];
85a7a9e3baSEtienne Carriere };
86a7a9e3baSEtienne Carriere 
87a7a9e3baSEtienne Carriere struct scmi_clock_rate_set_p2a {
88a7a9e3baSEtienne Carriere 	int32_t status;
89a7a9e3baSEtienne Carriere };
90a7a9e3baSEtienne Carriere 
91a7a9e3baSEtienne Carriere /*
92a7a9e3baSEtienne Carriere  * Clock Config Set
93a7a9e3baSEtienne Carriere  */
94a7a9e3baSEtienne Carriere 
95a7a9e3baSEtienne Carriere #define SCMI_CLOCK_CONFIG_SET_ENABLE_POS	0
96a7a9e3baSEtienne Carriere 
97a7a9e3baSEtienne Carriere #define SCMI_CLOCK_CONFIG_SET_ENABLE_MASK \
98*064bf8dcSEtienne Carriere 	BIT(SCMI_CLOCK_CONFIG_SET_ENABLE_POS)
99a7a9e3baSEtienne Carriere 
100a7a9e3baSEtienne Carriere struct scmi_clock_config_set_a2p {
101a7a9e3baSEtienne Carriere 	uint32_t clock_id;
102a7a9e3baSEtienne Carriere 	uint32_t attributes;
103a7a9e3baSEtienne Carriere };
104a7a9e3baSEtienne Carriere 
105a7a9e3baSEtienne Carriere struct scmi_clock_config_set_p2a {
106a7a9e3baSEtienne Carriere 	int32_t status;
107a7a9e3baSEtienne Carriere };
108a7a9e3baSEtienne Carriere 
109a7a9e3baSEtienne Carriere /*
110a7a9e3baSEtienne Carriere  * Clock Describe Rates
111a7a9e3baSEtienne Carriere  */
112a7a9e3baSEtienne Carriere 
113a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_FORMAT_RANGE 1
114a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_FORMAT_LIST  0
115a7a9e3baSEtienne Carriere 
116a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_REMAINING_MASK	GENMASK_32(31, 16)
117a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_REMAINING_POS		16
118a7a9e3baSEtienne Carriere 
119a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_FORMAT_MASK		BIT(12)
120a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_FORMAT_POS		12
121a7a9e3baSEtienne Carriere 
122a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_COUNT_MASK		GENMASK_32(11, 0)
123a7a9e3baSEtienne Carriere 
124a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_NUM_RATES_FLAGS(_count, _fmt, _rem_rates) \
125a7a9e3baSEtienne Carriere 	( \
126a7a9e3baSEtienne Carriere 		((_count) & SCMI_CLOCK_DESCRIBE_RATES_COUNT_MASK) | \
127a7a9e3baSEtienne Carriere 		(((_rem_rates) << SCMI_CLOCK_DESCRIBE_RATES_REMAINING_POS) & \
128a7a9e3baSEtienne Carriere 		 SCMI_CLOCK_DESCRIBE_RATES_REMAINING_MASK) | \
129a7a9e3baSEtienne Carriere 		(((_fmt) << SCMI_CLOCK_DESCRIBE_RATES_FORMAT_POS) & \
130a7a9e3baSEtienne Carriere 		 SCMI_CLOCK_DESCRIBE_RATES_FORMAT_MASK) \
131a7a9e3baSEtienne Carriere 	)
132a7a9e3baSEtienne Carriere 
133a7a9e3baSEtienne Carriere struct scmi_clock_rate {
134a7a9e3baSEtienne Carriere 	uint32_t low;
135a7a9e3baSEtienne Carriere 	uint32_t high;
136a7a9e3baSEtienne Carriere };
137a7a9e3baSEtienne Carriere 
138a7a9e3baSEtienne Carriere struct scmi_clock_describe_rates_a2p {
139a7a9e3baSEtienne Carriere 	uint32_t clock_id;
140a7a9e3baSEtienne Carriere 	uint32_t rate_index;
141a7a9e3baSEtienne Carriere };
142a7a9e3baSEtienne Carriere 
143a7a9e3baSEtienne Carriere struct scmi_clock_describe_rates_p2a {
144a7a9e3baSEtienne Carriere 	int32_t status;
145a7a9e3baSEtienne Carriere 	uint32_t num_rates_flags;
146a7a9e3baSEtienne Carriere 	struct scmi_clock_rate rates[];
147a7a9e3baSEtienne Carriere };
148a7a9e3baSEtienne Carriere 
149a7a9e3baSEtienne Carriere #endif /* SCMI_MSG_CLOCK_H */
150