xref: /optee_os/core/drivers/scmi-msg/clock.h (revision 60c96f68b2cc9ea028b2a32c8110f67795a5df09)
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 
13*60c96f68SEtienne Carriere #include "common.h"
14*60c96f68SEtienne Carriere 
15a7a9e3baSEtienne Carriere #define SCMI_PROTOCOL_VERSION_CLOCK	0x20000
16a7a9e3baSEtienne Carriere 
17a7a9e3baSEtienne Carriere /*
18a7a9e3baSEtienne Carriere  * Identifiers of the SCMI Clock Management Protocol commands
19a7a9e3baSEtienne Carriere  */
20a7a9e3baSEtienne Carriere enum scmi_clock_command_id {
21a7a9e3baSEtienne Carriere 	SCMI_CLOCK_ATTRIBUTES = 0x003,
22a7a9e3baSEtienne Carriere 	SCMI_CLOCK_DESCRIBE_RATES = 0x004,
23a7a9e3baSEtienne Carriere 	SCMI_CLOCK_RATE_SET = 0x005,
24a7a9e3baSEtienne Carriere 	SCMI_CLOCK_RATE_GET = 0x006,
25a7a9e3baSEtienne Carriere 	SCMI_CLOCK_CONFIG_SET = 0x007,
26a7a9e3baSEtienne Carriere };
27a7a9e3baSEtienne Carriere 
28a7a9e3baSEtienne Carriere /* Protocol attributes */
29a7a9e3baSEtienne Carriere #define SCMI_CLOCK_CLOCK_COUNT_MASK			GENMASK_32(15, 0)
30a7a9e3baSEtienne Carriere #define SCMI_CLOCK_MAX_PENDING_TRANSITIONS_MASK		GENMASK_32(23, 16)
31a7a9e3baSEtienne Carriere 
32a7a9e3baSEtienne Carriere #define SCMI_CLOCK_PROTOCOL_ATTRIBUTES(_max_pending, _clk_count) \
33a7a9e3baSEtienne Carriere 	((((_max_pending) << 16) & SCMI_CLOCK_MAX_PENDING_TRANSITIONS_MASK) | \
34a7a9e3baSEtienne Carriere 	 (((_clk_count) & SCMI_CLOCK_CLOCK_COUNT_MASK)))
35a7a9e3baSEtienne Carriere 
36a7a9e3baSEtienne Carriere struct scmi_clock_attributes_a2p {
37a7a9e3baSEtienne Carriere 	uint32_t clock_id;
38a7a9e3baSEtienne Carriere };
39a7a9e3baSEtienne Carriere 
40a7a9e3baSEtienne Carriere #define SCMI_CLOCK_NAME_LENGTH_MAX	16
41a7a9e3baSEtienne Carriere 
42a7a9e3baSEtienne Carriere struct scmi_clock_attributes_p2a {
43a7a9e3baSEtienne Carriere 	int32_t status;
44a7a9e3baSEtienne Carriere 	uint32_t attributes;
45a7a9e3baSEtienne Carriere 	char clock_name[SCMI_CLOCK_NAME_LENGTH_MAX];
46a7a9e3baSEtienne Carriere };
47a7a9e3baSEtienne Carriere 
48a7a9e3baSEtienne Carriere /*
49a7a9e3baSEtienne Carriere  * Clock Rate Get
50a7a9e3baSEtienne Carriere  */
51a7a9e3baSEtienne Carriere 
52a7a9e3baSEtienne Carriere struct scmi_clock_rate_get_a2p {
53a7a9e3baSEtienne Carriere 	uint32_t clock_id;
54a7a9e3baSEtienne Carriere };
55a7a9e3baSEtienne Carriere 
56a7a9e3baSEtienne Carriere struct scmi_clock_rate_get_p2a {
57a7a9e3baSEtienne Carriere 	int32_t status;
58a7a9e3baSEtienne Carriere 	uint32_t rate[2];
59a7a9e3baSEtienne Carriere };
60a7a9e3baSEtienne Carriere 
61a7a9e3baSEtienne Carriere /*
62a7a9e3baSEtienne Carriere  * Clock Rate Set
63a7a9e3baSEtienne Carriere  */
64a7a9e3baSEtienne Carriere 
65a7a9e3baSEtienne Carriere /* If set, set the new clock rate asynchronously */
66a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ASYNC_POS			0
67a7a9e3baSEtienne Carriere /* If set, do not send a delayed asynchronous response */
68a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_POS	1
69a7a9e3baSEtienne Carriere /* Round up, if set, otherwise round down */
70a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_UP_POS		2
71a7a9e3baSEtienne Carriere /* If set, the platform chooses the appropriate rounding mode */
72a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_AUTO_POS		3
73a7a9e3baSEtienne Carriere 
74a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ASYNC_MASK \
75a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_ASYNC_POS)
76a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_MASK \
77a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_NO_DELAYED_RESPONSE_POS)
78a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_UP_MASK \
79a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_ROUND_UP_POS)
80a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_SET_ROUND_AUTO_MASK \
81a7a9e3baSEtienne Carriere 		BIT(SCMI_CLOCK_RATE_SET_ROUND_AUTO_POS)
82a7a9e3baSEtienne Carriere 
83a7a9e3baSEtienne Carriere struct scmi_clock_rate_set_a2p {
84a7a9e3baSEtienne Carriere 	uint32_t flags;
85a7a9e3baSEtienne Carriere 	uint32_t clock_id;
86a7a9e3baSEtienne Carriere 	uint32_t rate[2];
87a7a9e3baSEtienne Carriere };
88a7a9e3baSEtienne Carriere 
89a7a9e3baSEtienne Carriere struct scmi_clock_rate_set_p2a {
90a7a9e3baSEtienne Carriere 	int32_t status;
91a7a9e3baSEtienne Carriere };
92a7a9e3baSEtienne Carriere 
93a7a9e3baSEtienne Carriere /*
94a7a9e3baSEtienne Carriere  * Clock Config Set
95a7a9e3baSEtienne Carriere  */
96a7a9e3baSEtienne Carriere 
97a7a9e3baSEtienne Carriere #define SCMI_CLOCK_CONFIG_SET_ENABLE_POS	0
98a7a9e3baSEtienne Carriere 
99a7a9e3baSEtienne Carriere #define SCMI_CLOCK_CONFIG_SET_ENABLE_MASK \
100064bf8dcSEtienne Carriere 	BIT(SCMI_CLOCK_CONFIG_SET_ENABLE_POS)
101a7a9e3baSEtienne Carriere 
102a7a9e3baSEtienne Carriere struct scmi_clock_config_set_a2p {
103a7a9e3baSEtienne Carriere 	uint32_t clock_id;
104a7a9e3baSEtienne Carriere 	uint32_t attributes;
105a7a9e3baSEtienne Carriere };
106a7a9e3baSEtienne Carriere 
107a7a9e3baSEtienne Carriere struct scmi_clock_config_set_p2a {
108a7a9e3baSEtienne Carriere 	int32_t status;
109a7a9e3baSEtienne Carriere };
110a7a9e3baSEtienne Carriere 
111a7a9e3baSEtienne Carriere /*
112a7a9e3baSEtienne Carriere  * Clock Describe Rates
113a7a9e3baSEtienne Carriere  */
114a7a9e3baSEtienne Carriere 
115a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_FORMAT_RANGE 1
116a7a9e3baSEtienne Carriere #define SCMI_CLOCK_RATE_FORMAT_LIST  0
117a7a9e3baSEtienne Carriere 
118a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_REMAINING_MASK	GENMASK_32(31, 16)
119a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_REMAINING_POS		16
120a7a9e3baSEtienne Carriere 
121a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_FORMAT_MASK		BIT(12)
122a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_FORMAT_POS		12
123a7a9e3baSEtienne Carriere 
124a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_COUNT_MASK		GENMASK_32(11, 0)
125a7a9e3baSEtienne Carriere 
126a7a9e3baSEtienne Carriere #define SCMI_CLOCK_DESCRIBE_RATES_NUM_RATES_FLAGS(_count, _fmt, _rem_rates) \
127a7a9e3baSEtienne Carriere 	( \
128a7a9e3baSEtienne Carriere 		((_count) & SCMI_CLOCK_DESCRIBE_RATES_COUNT_MASK) | \
129a7a9e3baSEtienne Carriere 		(((_rem_rates) << SCMI_CLOCK_DESCRIBE_RATES_REMAINING_POS) & \
130a7a9e3baSEtienne Carriere 		 SCMI_CLOCK_DESCRIBE_RATES_REMAINING_MASK) | \
131a7a9e3baSEtienne Carriere 		(((_fmt) << SCMI_CLOCK_DESCRIBE_RATES_FORMAT_POS) & \
132a7a9e3baSEtienne Carriere 		 SCMI_CLOCK_DESCRIBE_RATES_FORMAT_MASK) \
133a7a9e3baSEtienne Carriere 	)
134a7a9e3baSEtienne Carriere 
135a7a9e3baSEtienne Carriere struct scmi_clock_rate {
136a7a9e3baSEtienne Carriere 	uint32_t low;
137a7a9e3baSEtienne Carriere 	uint32_t high;
138a7a9e3baSEtienne Carriere };
139a7a9e3baSEtienne Carriere 
140a7a9e3baSEtienne Carriere struct scmi_clock_describe_rates_a2p {
141a7a9e3baSEtienne Carriere 	uint32_t clock_id;
142a7a9e3baSEtienne Carriere 	uint32_t rate_index;
143a7a9e3baSEtienne Carriere };
144a7a9e3baSEtienne Carriere 
145a7a9e3baSEtienne Carriere struct scmi_clock_describe_rates_p2a {
146a7a9e3baSEtienne Carriere 	int32_t status;
147a7a9e3baSEtienne Carriere 	uint32_t num_rates_flags;
148a7a9e3baSEtienne Carriere 	struct scmi_clock_rate rates[];
149a7a9e3baSEtienne Carriere };
150a7a9e3baSEtienne Carriere 
151*60c96f68SEtienne Carriere #ifdef CFG_SCMI_MSG_CLOCK
152*60c96f68SEtienne Carriere /*
153*60c96f68SEtienne Carriere  * scmi_msg_get_clock_handler - Return a handler for a clock message
154*60c96f68SEtienne Carriere  * @msg - message to process
155*60c96f68SEtienne Carriere  * Return a function handler for the message or NULL
156*60c96f68SEtienne Carriere  */
157*60c96f68SEtienne Carriere scmi_msg_handler_t scmi_msg_get_clock_handler(struct scmi_msg *msg);
158*60c96f68SEtienne Carriere #else
159*60c96f68SEtienne Carriere static inline
scmi_msg_get_clock_handler(struct scmi_msg * msg __unused)160*60c96f68SEtienne Carriere scmi_msg_handler_t scmi_msg_get_clock_handler(struct scmi_msg *msg __unused)
161*60c96f68SEtienne Carriere {
162*60c96f68SEtienne Carriere 	return NULL;
163*60c96f68SEtienne Carriere }
164*60c96f68SEtienne Carriere #endif
165a7a9e3baSEtienne Carriere #endif /* SCMI_MSG_CLOCK_H */
166