114928b88SAntonio Nino Diaz /* 214928b88SAntonio Nino Diaz * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. 314928b88SAntonio Nino Diaz * 414928b88SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 514928b88SAntonio Nino Diaz */ 614928b88SAntonio Nino Diaz 714928b88SAntonio Nino Diaz #ifndef SCMI_PRIVATE_H 814928b88SAntonio Nino Diaz #define SCMI_PRIVATE_H 914928b88SAntonio Nino Diaz 1014928b88SAntonio Nino Diaz #include <lib/mmio.h> 1114928b88SAntonio Nino Diaz 1214928b88SAntonio Nino Diaz /* 1314928b88SAntonio Nino Diaz * SCMI power domain management protocol message and response lengths. It is 1414928b88SAntonio Nino Diaz * calculated as sum of length in bytes of the message header (4) and payload 1514928b88SAntonio Nino Diaz * area (the number of bytes of parameters or return values in the payload). 1614928b88SAntonio Nino Diaz */ 1714928b88SAntonio Nino Diaz #define SCMI_PROTO_VERSION_MSG_LEN 4 1814928b88SAntonio Nino Diaz #define SCMI_PROTO_VERSION_RESP_LEN 12 1914928b88SAntonio Nino Diaz 2014928b88SAntonio Nino Diaz #define SCMI_PROTO_MSG_ATTR_MSG_LEN 8 2114928b88SAntonio Nino Diaz #define SCMI_PROTO_MSG_ATTR_RESP_LEN 12 2214928b88SAntonio Nino Diaz 2314928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_SET_MSG_LEN 16 2414928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_SET_RESP_LEN 8 2514928b88SAntonio Nino Diaz 2614928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_GET_MSG_LEN 4 2714928b88SAntonio Nino Diaz #define SCMI_AP_CORE_RESET_ADDR_GET_RESP_LEN 20 2814928b88SAntonio Nino Diaz 2914928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_MSG_LEN 16 3014928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_RESP_LEN 8 3114928b88SAntonio Nino Diaz 3214928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_GET_MSG_LEN 8 3314928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_GET_RESP_LEN 12 3414928b88SAntonio Nino Diaz 3514928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_SET_MSG_LEN 12 3614928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_SET_RESP_LEN 8 3714928b88SAntonio Nino Diaz 3814928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_GET_MSG_LEN 4 3914928b88SAntonio Nino Diaz #define SCMI_SYS_PWR_STATE_GET_RESP_LEN 12 4014928b88SAntonio Nino Diaz 4114928b88SAntonio Nino Diaz /* SCMI message header format bit field */ 4214928b88SAntonio Nino Diaz #define SCMI_MSG_ID_SHIFT 0 4314928b88SAntonio Nino Diaz #define SCMI_MSG_ID_WIDTH 8 4414928b88SAntonio Nino Diaz #define SCMI_MSG_ID_MASK ((1 << SCMI_MSG_ID_WIDTH) - 1) 4514928b88SAntonio Nino Diaz 4614928b88SAntonio Nino Diaz #define SCMI_MSG_TYPE_SHIFT 8 4714928b88SAntonio Nino Diaz #define SCMI_MSG_TYPE_WIDTH 2 4814928b88SAntonio Nino Diaz #define SCMI_MSG_TYPE_MASK ((1 << SCMI_MSG_TYPE_WIDTH) - 1) 4914928b88SAntonio Nino Diaz 5014928b88SAntonio Nino Diaz #define SCMI_MSG_PROTO_ID_SHIFT 10 5114928b88SAntonio Nino Diaz #define SCMI_MSG_PROTO_ID_WIDTH 8 5214928b88SAntonio Nino Diaz #define SCMI_MSG_PROTO_ID_MASK ((1 << SCMI_MSG_PROTO_ID_WIDTH) - 1) 5314928b88SAntonio Nino Diaz 5414928b88SAntonio Nino Diaz #define SCMI_MSG_TOKEN_SHIFT 18 5514928b88SAntonio Nino Diaz #define SCMI_MSG_TOKEN_WIDTH 10 5614928b88SAntonio Nino Diaz #define SCMI_MSG_TOKEN_MASK ((1 << SCMI_MSG_TOKEN_WIDTH) - 1) 5714928b88SAntonio Nino Diaz 5814928b88SAntonio Nino Diaz 5914928b88SAntonio Nino Diaz /* SCMI mailbox flags */ 6014928b88SAntonio Nino Diaz #define SCMI_FLAG_RESP_POLL 0 6114928b88SAntonio Nino Diaz #define SCMI_FLAG_RESP_INT 1 6214928b88SAntonio Nino Diaz 6314928b88SAntonio Nino Diaz /* SCMI power domain protocol `POWER_STATE_SET` message flags */ 6414928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_FLAG_SYNC 0 6514928b88SAntonio Nino Diaz #define SCMI_PWR_STATE_SET_FLAG_ASYNC 1 6614928b88SAntonio Nino Diaz 6714928b88SAntonio Nino Diaz /* 6814928b88SAntonio Nino Diaz * Helper macro to create an SCMI message header given protocol, message id 6914928b88SAntonio Nino Diaz * and token. 7014928b88SAntonio Nino Diaz */ 7114928b88SAntonio Nino Diaz #define SCMI_MSG_CREATE(_protocol, _msg_id, _token) \ 7214928b88SAntonio Nino Diaz ((((_protocol) & SCMI_MSG_PROTO_ID_MASK) << SCMI_MSG_PROTO_ID_SHIFT) | \ 7314928b88SAntonio Nino Diaz (((_msg_id) & SCMI_MSG_ID_MASK) << SCMI_MSG_ID_SHIFT) | \ 7414928b88SAntonio Nino Diaz (((_token) & SCMI_MSG_TOKEN_MASK) << SCMI_MSG_TOKEN_SHIFT)) 7514928b88SAntonio Nino Diaz 7614928b88SAntonio Nino Diaz /* Helper macro to get the token from a SCMI message header */ 7714928b88SAntonio Nino Diaz #define SCMI_MSG_GET_TOKEN(_msg) \ 7814928b88SAntonio Nino Diaz (((_msg) >> SCMI_MSG_TOKEN_SHIFT) & SCMI_MSG_TOKEN_MASK) 7914928b88SAntonio Nino Diaz 8014928b88SAntonio Nino Diaz /* SCMI Channel Status bit fields */ 8114928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_RES0_MASK 0xFFFFFFFE 8214928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_FREE_SHIFT 0 8314928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_FREE_WIDTH 1 8414928b88SAntonio Nino Diaz #define SCMI_CH_STATUS_FREE_MASK ((1 << SCMI_CH_STATUS_FREE_WIDTH) - 1) 8514928b88SAntonio Nino Diaz 8614928b88SAntonio Nino Diaz /* Helper macros to check and write the channel status */ 8714928b88SAntonio Nino Diaz #define SCMI_IS_CHANNEL_FREE(status) \ 8814928b88SAntonio Nino Diaz (!!(((status) >> SCMI_CH_STATUS_FREE_SHIFT) & SCMI_CH_STATUS_FREE_MASK)) 8914928b88SAntonio Nino Diaz 9014928b88SAntonio Nino Diaz #define SCMI_MARK_CHANNEL_BUSY(status) do { \ 9114928b88SAntonio Nino Diaz assert(SCMI_IS_CHANNEL_FREE(status)); \ 9214928b88SAntonio Nino Diaz (status) &= ~(SCMI_CH_STATUS_FREE_MASK << \ 9314928b88SAntonio Nino Diaz SCMI_CH_STATUS_FREE_SHIFT); \ 9414928b88SAntonio Nino Diaz } while (0) 9514928b88SAntonio Nino Diaz 9614928b88SAntonio Nino Diaz /* Helper macros to copy arguments to the mailbox payload */ 9714928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_ARG1(payld_arr, arg1) \ 9814928b88SAntonio Nino Diaz mmio_write_32((uintptr_t)&payld_arr[0], arg1) 9914928b88SAntonio Nino Diaz 10014928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_ARG2(payld_arr, arg1, arg2) do { \ 10114928b88SAntonio Nino Diaz SCMI_PAYLOAD_ARG1(payld_arr, arg1); \ 10214928b88SAntonio Nino Diaz mmio_write_32((uintptr_t)&payld_arr[1], arg2); \ 10314928b88SAntonio Nino Diaz } while (0) 10414928b88SAntonio Nino Diaz 10514928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_ARG3(payld_arr, arg1, arg2, arg3) do { \ 10614928b88SAntonio Nino Diaz SCMI_PAYLOAD_ARG2(payld_arr, arg1, arg2); \ 10714928b88SAntonio Nino Diaz mmio_write_32((uintptr_t)&payld_arr[2], arg3); \ 10814928b88SAntonio Nino Diaz } while (0) 10914928b88SAntonio Nino Diaz 11014928b88SAntonio Nino Diaz /* Helper macros to read return values from the mailbox payload */ 11114928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL1(payld_arr, val1) \ 11214928b88SAntonio Nino Diaz (val1) = mmio_read_32((uintptr_t)&payld_arr[0]) 11314928b88SAntonio Nino Diaz 11414928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL2(payld_arr, val1, val2) do { \ 11514928b88SAntonio Nino Diaz SCMI_PAYLOAD_RET_VAL1(payld_arr, val1); \ 11614928b88SAntonio Nino Diaz (val2) = mmio_read_32((uintptr_t)&payld_arr[1]); \ 11714928b88SAntonio Nino Diaz } while (0) 11814928b88SAntonio Nino Diaz 11914928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL3(payld_arr, val1, val2, val3) do { \ 12014928b88SAntonio Nino Diaz SCMI_PAYLOAD_RET_VAL2(payld_arr, val1, val2); \ 12114928b88SAntonio Nino Diaz (val3) = mmio_read_32((uintptr_t)&payld_arr[2]); \ 12214928b88SAntonio Nino Diaz } while (0) 12314928b88SAntonio Nino Diaz 12414928b88SAntonio Nino Diaz #define SCMI_PAYLOAD_RET_VAL4(payld_arr, val1, val2, val3, val4) do { \ 12514928b88SAntonio Nino Diaz SCMI_PAYLOAD_RET_VAL3(payld_arr, val1, val2, val3); \ 12614928b88SAntonio Nino Diaz (val4) = mmio_read_32((uintptr_t)&payld_arr[3]); \ 12714928b88SAntonio Nino Diaz } while (0) 12814928b88SAntonio Nino Diaz 12914928b88SAntonio Nino Diaz /* 13014928b88SAntonio Nino Diaz * Private data structure for representing the mailbox memory layout. Refer 13114928b88SAntonio Nino Diaz * the SCMI specification for more details. 13214928b88SAntonio Nino Diaz */ 13314928b88SAntonio Nino Diaz typedef struct mailbox_mem { 13414928b88SAntonio Nino Diaz uint32_t res_a; /* Reserved */ 13514928b88SAntonio Nino Diaz volatile uint32_t status; 13614928b88SAntonio Nino Diaz uint64_t res_b; /* Reserved */ 13714928b88SAntonio Nino Diaz uint32_t flags; 13814928b88SAntonio Nino Diaz volatile uint32_t len; 139*99477f05Ssah01 volatile uint32_t msg_header; 14014928b88SAntonio Nino Diaz uint32_t payload[]; 14114928b88SAntonio Nino Diaz } mailbox_mem_t; 14214928b88SAntonio Nino Diaz 14314928b88SAntonio Nino Diaz 14414928b88SAntonio Nino Diaz /* Private APIs for use within SCMI driver */ 14514928b88SAntonio Nino Diaz void scmi_get_channel(scmi_channel_t *ch); 14614928b88SAntonio Nino Diaz void scmi_send_sync_command(scmi_channel_t *ch); 14714928b88SAntonio Nino Diaz void scmi_put_channel(scmi_channel_t *ch); 14814928b88SAntonio Nino Diaz 14914928b88SAntonio Nino Diaz static inline void validate_scmi_channel(scmi_channel_t *ch) 15014928b88SAntonio Nino Diaz { 15114928b88SAntonio Nino Diaz assert(ch && ch->is_initialized); 15214928b88SAntonio Nino Diaz assert(ch->info && ch->info->scmi_mbx_mem); 15314928b88SAntonio Nino Diaz } 15414928b88SAntonio Nino Diaz 155b67d2029SMasahisa Kojima /* 156b67d2029SMasahisa Kojima * SCMI vendor specific protocol 157b67d2029SMasahisa Kojima */ 158b67d2029SMasahisa Kojima #define SCMI_SYS_VENDOR_EXT_PROTO_ID 0x80 159b67d2029SMasahisa Kojima 16014928b88SAntonio Nino Diaz #endif /* SCMI_PRIVATE_H */ 161