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