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