1*6445c834SPeng Fan /* 2*6445c834SPeng Fan * Copyright 2024-2025 NXP 3*6445c834SPeng Fan * 4*6445c834SPeng Fan * SPDX-License-Identifier: BSD-3-Clause 5*6445c834SPeng Fan */ 6*6445c834SPeng Fan 7*6445c834SPeng Fan #include <assert.h> 8*6445c834SPeng Fan 9*6445c834SPeng Fan #include <arch_helpers.h> 10*6445c834SPeng Fan #include <common/debug.h> 11*6445c834SPeng Fan #include <drivers/arm/css/scmi.h> 12*6445c834SPeng Fan 13*6445c834SPeng Fan #include "scmi_private.h" 14*6445c834SPeng Fan 15*6445c834SPeng Fan int scmi_base_protocol_attributes(void *p, uint32_t *num_protocols, uint32_t *num_agents) 16*6445c834SPeng Fan { 17*6445c834SPeng Fan mailbox_mem_t *mbx_mem; 18*6445c834SPeng Fan unsigned int token = 0U; 19*6445c834SPeng Fan int ret; 20*6445c834SPeng Fan uint32_t attr; 21*6445c834SPeng Fan scmi_channel_t *ch = (scmi_channel_t *)p; 22*6445c834SPeng Fan 23*6445c834SPeng Fan validate_scmi_channel(ch); 24*6445c834SPeng Fan 25*6445c834SPeng Fan scmi_get_channel(ch); 26*6445c834SPeng Fan 27*6445c834SPeng Fan mbx_mem = (mailbox_mem_t *)(ch->info->scmi_mbx_mem); 28*6445c834SPeng Fan mbx_mem->msg_header = SCMI_MSG_CREATE(SCMI_BASE_PROTO_ID, 29*6445c834SPeng Fan SCMI_PROTO_ATTR_MSG, token); 30*6445c834SPeng Fan mbx_mem->len = SCMI_PROTO_ATTR_MSG_LEN; 31*6445c834SPeng Fan mbx_mem->flags = SCMI_FLAG_RESP_POLL; 32*6445c834SPeng Fan 33*6445c834SPeng Fan scmi_send_sync_command(ch); 34*6445c834SPeng Fan 35*6445c834SPeng Fan /* Get the return values */ 36*6445c834SPeng Fan SCMI_PAYLOAD_RET_VAL2(mbx_mem->payload, ret, attr); 37*6445c834SPeng Fan assert(mbx_mem->len == SCMI_BASE_RESET_AGENT_CONFIGURATION_RESP_LEN); 38*6445c834SPeng Fan assert(token == SCMI_MSG_GET_TOKEN(mbx_mem->msg_header)); 39*6445c834SPeng Fan 40*6445c834SPeng Fan scmi_put_channel(ch); 41*6445c834SPeng Fan 42*6445c834SPeng Fan if (ret == SCMI_E_SUCCESS) { 43*6445c834SPeng Fan if (num_protocols) { 44*6445c834SPeng Fan *num_protocols = attr & 0xFF; 45*6445c834SPeng Fan } 46*6445c834SPeng Fan 47*6445c834SPeng Fan if (num_agents) { 48*6445c834SPeng Fan *num_agents = (attr >> 8) & 0xFF; 49*6445c834SPeng Fan } 50*6445c834SPeng Fan } 51*6445c834SPeng Fan 52*6445c834SPeng Fan return ret; 53*6445c834SPeng Fan } 54*6445c834SPeng Fan 55*6445c834SPeng Fan int scmi_base_discover_agent(void *p, uint32_t agent_id, uint32_t *agent_id_resp, char *name) 56*6445c834SPeng Fan { 57*6445c834SPeng Fan mailbox_mem_t *mbx_mem; 58*6445c834SPeng Fan unsigned int token = 0U; 59*6445c834SPeng Fan int ret; 60*6445c834SPeng Fan scmi_channel_t *ch = (scmi_channel_t *)p; 61*6445c834SPeng Fan 62*6445c834SPeng Fan validate_scmi_channel(ch); 63*6445c834SPeng Fan 64*6445c834SPeng Fan scmi_get_channel(ch); 65*6445c834SPeng Fan 66*6445c834SPeng Fan mbx_mem = (mailbox_mem_t *)(ch->info->scmi_mbx_mem); 67*6445c834SPeng Fan mbx_mem->msg_header = SCMI_MSG_CREATE(SCMI_BASE_PROTO_ID, 68*6445c834SPeng Fan SCMI_BASE_DISCOVER_AGENT, token); 69*6445c834SPeng Fan mbx_mem->len = SCMI_BASE_DISCOVER_AGENT_MSG_LEN; 70*6445c834SPeng Fan mbx_mem->flags = SCMI_FLAG_RESP_POLL; 71*6445c834SPeng Fan SCMI_PAYLOAD_ARG1(mbx_mem->payload, agent_id); 72*6445c834SPeng Fan 73*6445c834SPeng Fan scmi_send_sync_command(ch); 74*6445c834SPeng Fan 75*6445c834SPeng Fan /* Get the return values */ 76*6445c834SPeng Fan if (agent_id_resp) { 77*6445c834SPeng Fan SCMI_PAYLOAD_RET_VAL2(mbx_mem->payload, ret, *agent_id_resp); 78*6445c834SPeng Fan } else { 79*6445c834SPeng Fan SCMI_PAYLOAD_RET_VAL1(mbx_mem->payload, ret); 80*6445c834SPeng Fan } 81*6445c834SPeng Fan assert(token == SCMI_MSG_GET_TOKEN(mbx_mem->msg_header)); 82*6445c834SPeng Fan 83*6445c834SPeng Fan if (name != NULL) { 84*6445c834SPeng Fan memcpy(name, (void *)&mbx_mem->payload[2], 85*6445c834SPeng Fan SCMI_BASE_DISCOVER_AGENT_RESP_LEN - 8); 86*6445c834SPeng Fan } 87*6445c834SPeng Fan 88*6445c834SPeng Fan scmi_put_channel(ch); 89*6445c834SPeng Fan 90*6445c834SPeng Fan return ret; 91*6445c834SPeng Fan } 92*6445c834SPeng Fan 93*6445c834SPeng Fan int scmi_base_reset_agent_config(void *p, uint32_t agent_id, uint32_t flags) 94*6445c834SPeng Fan { 95*6445c834SPeng Fan mailbox_mem_t *mbx_mem; 96*6445c834SPeng Fan unsigned int token = 0U; 97*6445c834SPeng Fan int ret; 98*6445c834SPeng Fan scmi_channel_t *ch = (scmi_channel_t *)p; 99*6445c834SPeng Fan 100*6445c834SPeng Fan validate_scmi_channel(ch); 101*6445c834SPeng Fan 102*6445c834SPeng Fan scmi_get_channel(ch); 103*6445c834SPeng Fan 104*6445c834SPeng Fan mbx_mem = (mailbox_mem_t *)(ch->info->scmi_mbx_mem); 105*6445c834SPeng Fan mbx_mem->msg_header = SCMI_MSG_CREATE(SCMI_BASE_PROTO_ID, 106*6445c834SPeng Fan SCMI_BASE_RESET_AGENT_CONFIGURATION, token); 107*6445c834SPeng Fan mbx_mem->len = SCMI_BASE_RESET_AGENT_CONFIGURATION_MSG_LEN; 108*6445c834SPeng Fan mbx_mem->flags = SCMI_FLAG_RESP_POLL; 109*6445c834SPeng Fan SCMI_PAYLOAD_ARG2(mbx_mem->payload, agent_id, flags); 110*6445c834SPeng Fan 111*6445c834SPeng Fan scmi_send_sync_command(ch); 112*6445c834SPeng Fan 113*6445c834SPeng Fan /* Get the return values */ 114*6445c834SPeng Fan SCMI_PAYLOAD_RET_VAL1(mbx_mem->payload, ret); 115*6445c834SPeng Fan assert(mbx_mem->len == SCMI_BASE_RESET_AGENT_CONFIGURATION_RESP_LEN); 116*6445c834SPeng Fan assert(token == SCMI_MSG_GET_TOKEN(mbx_mem->msg_header)); 117*6445c834SPeng Fan 118*6445c834SPeng Fan scmi_put_channel(ch); 119*6445c834SPeng Fan 120*6445c834SPeng Fan return ret; 121*6445c834SPeng Fan } 122