1*14928b88SAntonio Nino Diaz /* 2*14928b88SAntonio Nino Diaz * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. 3*14928b88SAntonio Nino Diaz * 4*14928b88SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 5*14928b88SAntonio Nino Diaz */ 6*14928b88SAntonio Nino Diaz 7*14928b88SAntonio Nino Diaz #ifndef SCMI_PRIVATE_H 8*14928b88SAntonio Nino Diaz #define SCMI_PRIVATE_H 9*14928b88SAntonio Nino Diaz 10*14928b88SAntonio Nino Diaz #include <lib/mmio.h> 11*14928b88SAntonio Nino Diaz 12*14928b88SAntonio Nino Diaz /* 13*14928b88SAntonio Nino Diaz * SCMI power domain management protocol message and response lengths. It is 14*14928b88SAntonio Nino Diaz * calculated as sum of length in bytes of the message header (4) and payload 15*14928b88SAntonio Nino Diaz * area (the number of bytes of parameters or return values in the payload). 16*14928b88SAntonio Nino Diaz */ 17*14928b88SAntonio Nino Diaz #define SCMI_PROTO_VERSION_MSG_LEN 4 18*14928b88SAntonio Nino Diaz #define SCMI_PROTO_VERSION_RESP_LEN 12 19*14928b88SAntonio Nino Diaz 20*14928b88SAntonio Nino Diaz #define SCMI_PROTO_MSG_ATTR_MSG_LEN 8 21*14928b88SAntonio Nino Diaz #define SCMI_PROTO_MSG_ATTR_RESP_LEN 12 22*14928b88SAntonio Nino Diaz 23*14928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_SET_MSG_LEN 16 24*14928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_SET_RESP_LEN 8 25*14928b88SAntonio Nino Diaz 26*14928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_GET_MSG_LEN 4 27*14928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_GET_RESP_LEN 20 28*14928b88SAntonio Nino Diaz 29*14928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_MSG_LEN 16 30*14928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_RESP_LEN 8 31*14928b88SAntonio Nino Diaz 32*14928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_GET_MSG_LEN 8 33*14928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_GET_RESP_LEN 12 34*14928b88SAntonio Nino Diaz 35*14928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_SET_MSG_LEN 12 36*14928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_SET_RESP_LEN 8 37*14928b88SAntonio Nino Diaz 38*14928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_GET_MSG_LEN 4 39*14928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_GET_RESP_LEN 12 40*14928b88SAntonio Nino Diaz 41*14928b88SAntonio Nino Diaz /* SCMI message header format bit field */ 42*14928b88SAntonio Nino Diaz #define SCMI_MSG_ID_SHIFT 0 43*14928b88SAntonio Nino Diaz #define SCMI_MSG_ID_WIDTH 8 44*14928b88SAntonio Nino Diaz #define SCMI_MSG_ID_MASK ((1 << SCMI_MSG_ID_WIDTH) - 1) 45*14928b88SAntonio Nino Diaz 46*14928b88SAntonio Nino Diaz #define SCMI_MSG_TYPE_SHIFT 8 47*14928b88SAntonio Nino Diaz #define SCMI_MSG_TYPE_WIDTH 2 48*14928b88SAntonio Nino Diaz #define SCMI_MSG_TYPE_MASK ((1 << SCMI_MSG_TYPE_WIDTH) - 1) 49*14928b88SAntonio Nino Diaz 50*14928b88SAntonio Nino Diaz #define SCMI_MSG_PROTO_ID_SHIFT 10 51*14928b88SAntonio Nino Diaz #define SCMI_MSG_PROTO_ID_WIDTH 8 52*14928b88SAntonio Nino Diaz #define SCMI_MSG_PROTO_ID_MASK ((1 << SCMI_MSG_PROTO_ID_WIDTH) - 1) 53*14928b88SAntonio Nino Diaz 54*14928b88SAntonio Nino Diaz #define SCMI_MSG_TOKEN_SHIFT 18 55*14928b88SAntonio Nino Diaz #define SCMI_MSG_TOKEN_WIDTH 10 56*14928b88SAntonio Nino Diaz #define SCMI_MSG_TOKEN_MASK ((1 << SCMI_MSG_TOKEN_WIDTH) - 1) 57*14928b88SAntonio Nino Diaz 58*14928b88SAntonio Nino Diaz 59*14928b88SAntonio Nino Diaz /* SCMI mailbox flags */ 60*14928b88SAntonio Nino Diaz #define SCMI_FLAG_RESP_POLL 0 61*14928b88SAntonio Nino Diaz #define SCMI_FLAG_RESP_INT 1 62*14928b88SAntonio Nino Diaz 63*14928b88SAntonio Nino Diaz /* SCMI power domain protocol `POWER_STATE_SET` message flags */ 64*14928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_FLAG_SYNC 0 65*14928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_FLAG_ASYNC 1 66*14928b88SAntonio Nino Diaz 67*14928b88SAntonio Nino Diaz /* 68*14928b88SAntonio Nino Diaz * Helper macro to create an SCMI message header given protocol, message id 69*14928b88SAntonio Nino Diaz * and token. 70*14928b88SAntonio Nino Diaz */ 71*14928b88SAntonio Nino Diaz #define SCMI_MSG_CREATE(_protocol, _msg_id, _token) \ 72*14928b88SAntonio Nino Diaz ((((_protocol) & SCMI_MSG_PROTO_ID_MASK) << SCMI_MSG_PROTO_ID_SHIFT) | \ 73*14928b88SAntonio Nino Diaz (((_msg_id) & SCMI_MSG_ID_MASK) << SCMI_MSG_ID_SHIFT) | \ 74*14928b88SAntonio Nino Diaz (((_token) & SCMI_MSG_TOKEN_MASK) << SCMI_MSG_TOKEN_SHIFT)) 75*14928b88SAntonio Nino Diaz 76*14928b88SAntonio Nino Diaz /* Helper macro to get the token from a SCMI message header */ 77*14928b88SAntonio Nino Diaz #define SCMI_MSG_GET_TOKEN(_msg) \ 78*14928b88SAntonio Nino Diaz (((_msg) >> SCMI_MSG_TOKEN_SHIFT) & SCMI_MSG_TOKEN_MASK) 79*14928b88SAntonio Nino Diaz 80*14928b88SAntonio Nino Diaz /* SCMI Channel Status bit fields */ 81*14928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_RES0_MASK 0xFFFFFFFE 82*14928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_FREE_SHIFT 0 83*14928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_FREE_WIDTH 1 84*14928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_FREE_MASK ((1 << SCMI_CH_STATUS_FREE_WIDTH) - 1) 85*14928b88SAntonio Nino Diaz 86*14928b88SAntonio Nino Diaz /* Helper macros to check and write the channel status */ 87*14928b88SAntonio Nino Diaz #define SCMI_IS_CHANNEL_FREE(status) \ 88*14928b88SAntonio Nino Diaz (!!(((status) >> SCMI_CH_STATUS_FREE_SHIFT) & SCMI_CH_STATUS_FREE_MASK)) 89*14928b88SAntonio Nino Diaz 90*14928b88SAntonio Nino Diaz #define SCMI_MARK_CHANNEL_BUSY(status) do { \ 91*14928b88SAntonio Nino Diaz assert(SCMI_IS_CHANNEL_FREE(status)); \ 92*14928b88SAntonio Nino Diaz (status) &= ~(SCMI_CH_STATUS_FREE_MASK << \ 93*14928b88SAntonio Nino Diaz SCMI_CH_STATUS_FREE_SHIFT); \ 94*14928b88SAntonio Nino Diaz } while (0) 95*14928b88SAntonio Nino Diaz 96*14928b88SAntonio Nino Diaz /* Helper macros to copy arguments to the mailbox payload */ 97*14928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_ARG1(payld_arr, arg1) \ 98*14928b88SAntonio Nino Diaz mmio_write_32((uintptr_t)&payld_arr[0], arg1) 99*14928b88SAntonio Nino Diaz 100*14928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_ARG2(payld_arr, arg1, arg2) do { \ 101*14928b88SAntonio Nino Diaz SCMI_PAYLOAD_ARG1(payld_arr, arg1); \ 102*14928b88SAntonio Nino Diaz mmio_write_32((uintptr_t)&payld_arr[1], arg2); \ 103*14928b88SAntonio Nino Diaz } while (0) 104*14928b88SAntonio Nino Diaz 105*14928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_ARG3(payld_arr, arg1, arg2, arg3) do { \ 106*14928b88SAntonio Nino Diaz SCMI_PAYLOAD_ARG2(payld_arr, arg1, arg2); \ 107*14928b88SAntonio Nino Diaz mmio_write_32((uintptr_t)&payld_arr[2], arg3); \ 108*14928b88SAntonio Nino Diaz } while (0) 109*14928b88SAntonio Nino Diaz 110*14928b88SAntonio Nino Diaz /* Helper macros to read return values from the mailbox payload */ 111*14928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL1(payld_arr, val1) \ 112*14928b88SAntonio Nino Diaz (val1) = mmio_read_32((uintptr_t)&payld_arr[0]) 113*14928b88SAntonio Nino Diaz 114*14928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL2(payld_arr, val1, val2) do { \ 115*14928b88SAntonio Nino Diaz SCMI_PAYLOAD_RET_VAL1(payld_arr, val1); \ 116*14928b88SAntonio Nino Diaz (val2) = mmio_read_32((uintptr_t)&payld_arr[1]); \ 117*14928b88SAntonio Nino Diaz } while (0) 118*14928b88SAntonio Nino Diaz 119*14928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL3(payld_arr, val1, val2, val3) do { \ 120*14928b88SAntonio Nino Diaz SCMI_PAYLOAD_RET_VAL2(payld_arr, val1, val2); \ 121*14928b88SAntonio Nino Diaz (val3) = mmio_read_32((uintptr_t)&payld_arr[2]); \ 122*14928b88SAntonio Nino Diaz } while (0) 123*14928b88SAntonio Nino Diaz 124*14928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL4(payld_arr, val1, val2, val3, val4) do { \ 125*14928b88SAntonio Nino Diaz SCMI_PAYLOAD_RET_VAL3(payld_arr, val1, val2, val3); \ 126*14928b88SAntonio Nino Diaz (val4) = mmio_read_32((uintptr_t)&payld_arr[3]); \ 127*14928b88SAntonio Nino Diaz } while (0) 128*14928b88SAntonio Nino Diaz 129*14928b88SAntonio Nino Diaz /* 130*14928b88SAntonio Nino Diaz * Private data structure for representing the mailbox memory layout. Refer 131*14928b88SAntonio Nino Diaz * the SCMI specification for more details. 132*14928b88SAntonio Nino Diaz */ 133*14928b88SAntonio Nino Diaz typedef struct mailbox_mem { 134*14928b88SAntonio Nino Diaz uint32_t res_a; /* Reserved */ 135*14928b88SAntonio Nino Diaz volatile uint32_t status; 136*14928b88SAntonio Nino Diaz uint64_t res_b; /* Reserved */ 137*14928b88SAntonio Nino Diaz uint32_t flags; 138*14928b88SAntonio Nino Diaz volatile uint32_t len; 139*14928b88SAntonio Nino Diaz uint32_t msg_header; 140*14928b88SAntonio Nino Diaz uint32_t payload[]; 141*14928b88SAntonio Nino Diaz } mailbox_mem_t; 142*14928b88SAntonio Nino Diaz 143*14928b88SAntonio Nino Diaz 144*14928b88SAntonio Nino Diaz /* Private APIs for use within SCMI driver */ 145*14928b88SAntonio Nino Diaz void scmi_get_channel(scmi_channel_t *ch); 146*14928b88SAntonio Nino Diaz void scmi_send_sync_command(scmi_channel_t *ch); 147*14928b88SAntonio Nino Diaz void scmi_put_channel(scmi_channel_t *ch); 148*14928b88SAntonio Nino Diaz 149*14928b88SAntonio Nino Diaz static inline void validate_scmi_channel(scmi_channel_t *ch) 150*14928b88SAntonio Nino Diaz { 151*14928b88SAntonio Nino Diaz assert(ch && ch->is_initialized); 152*14928b88SAntonio Nino Diaz assert(ch->info && ch->info->scmi_mbx_mem); 153*14928b88SAntonio Nino Diaz } 154*14928b88SAntonio Nino Diaz 155*14928b88SAntonio Nino Diaz #endif /* SCMI_PRIVATE_H */ 156