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