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