xref: /rk3399_ARM-atf/drivers/arm/css/scmi/scmi_base_proto.c (revision 480e8dd9df291cc0e31695983fa6ff235e1671cd)
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