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