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