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
scmi_base_protocol_attributes(void * p,uint32_t * num_protocols,uint32_t * num_agents)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
scmi_base_discover_agent(void * p,uint32_t agent_id,uint32_t * agent_id_resp,char * name)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
scmi_base_reset_agent_config(void * p,uint32_t agent_id,uint32_t flags)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