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