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