xref: /rk3399_ARM-atf/plat/imx/imx8ulp/scmi/scmi.c (revision 1c408d3c40abbe48064c1e2ef5224c1d6edca3cd)
1*fcd41e86SJacky Bai /*
2*fcd41e86SJacky Bai  * Copyright 2021-2024 NXP
3*fcd41e86SJacky Bai  *
4*fcd41e86SJacky Bai  * SPDX-License-Identifier: BSD-3-Clause
5*fcd41e86SJacky Bai  */
6*fcd41e86SJacky Bai #include <assert.h>
7*fcd41e86SJacky Bai #include <stdint.h>
8*fcd41e86SJacky Bai 
9*fcd41e86SJacky Bai #include <drivers/scmi-msg.h>
10*fcd41e86SJacky Bai #include <drivers/scmi.h>
11*fcd41e86SJacky Bai 
12*fcd41e86SJacky Bai #include <platform_def.h>
13*fcd41e86SJacky Bai 
14*fcd41e86SJacky Bai #define SMT_BUFFER_BASE		0x2201f000
15*fcd41e86SJacky Bai #define SMT_BUFFER0_BASE	SMT_BUFFER_BASE
16*fcd41e86SJacky Bai #define SMT_BUFFER1_BASE	(SMT_BUFFER_BASE + 0x200)
17*fcd41e86SJacky Bai 
18*fcd41e86SJacky Bai static struct scmi_msg_channel scmi_channel[] = {
19*fcd41e86SJacky Bai 	[0] = {
20*fcd41e86SJacky Bai 		.shm_addr = SMT_BUFFER0_BASE,
21*fcd41e86SJacky Bai 		.shm_size = SMT_BUF_SLOT_SIZE,
22*fcd41e86SJacky Bai 	},
23*fcd41e86SJacky Bai };
24*fcd41e86SJacky Bai 
plat_scmi_get_channel(unsigned int agent_id)25*fcd41e86SJacky Bai struct scmi_msg_channel *plat_scmi_get_channel(unsigned int agent_id)
26*fcd41e86SJacky Bai {
27*fcd41e86SJacky Bai 	assert(agent_id < ARRAY_SIZE(scmi_channel));
28*fcd41e86SJacky Bai 
29*fcd41e86SJacky Bai 	return &scmi_channel[agent_id];
30*fcd41e86SJacky Bai }
31*fcd41e86SJacky Bai 
32*fcd41e86SJacky Bai static const char vendor[] = "NXP";
33*fcd41e86SJacky Bai static const char sub_vendor[] = "";
34*fcd41e86SJacky Bai 
plat_scmi_vendor_name(void)35*fcd41e86SJacky Bai const char *plat_scmi_vendor_name(void)
36*fcd41e86SJacky Bai {
37*fcd41e86SJacky Bai 	return vendor;
38*fcd41e86SJacky Bai }
39*fcd41e86SJacky Bai 
plat_scmi_sub_vendor_name(void)40*fcd41e86SJacky Bai const char *plat_scmi_sub_vendor_name(void)
41*fcd41e86SJacky Bai {
42*fcd41e86SJacky Bai 	return sub_vendor;
43*fcd41e86SJacky Bai }
44*fcd41e86SJacky Bai 
45*fcd41e86SJacky Bai /* Currently supporting Clocks and Reset Domains */
46*fcd41e86SJacky Bai static const uint8_t plat_protocol_list[] = {
47*fcd41e86SJacky Bai 	SCMI_PROTOCOL_ID_POWER_DOMAIN,
48*fcd41e86SJacky Bai 	SCMI_PROTOCOL_ID_SENSOR,
49*fcd41e86SJacky Bai 	0U /* Null termination */
50*fcd41e86SJacky Bai };
51*fcd41e86SJacky Bai 
plat_scmi_protocol_count(void)52*fcd41e86SJacky Bai size_t plat_scmi_protocol_count(void)
53*fcd41e86SJacky Bai {
54*fcd41e86SJacky Bai 	return ARRAY_SIZE(plat_protocol_list) - 1U;
55*fcd41e86SJacky Bai }
56*fcd41e86SJacky Bai 
plat_scmi_protocol_list(unsigned int agent_id __unused)57*fcd41e86SJacky Bai const uint8_t *plat_scmi_protocol_list(unsigned int agent_id __unused)
58*fcd41e86SJacky Bai {
59*fcd41e86SJacky Bai 	return plat_protocol_list;
60*fcd41e86SJacky Bai }
61*fcd41e86SJacky Bai 
imx8ulp_init_scmi_server(void)62*fcd41e86SJacky Bai void imx8ulp_init_scmi_server(void)
63*fcd41e86SJacky Bai {
64*fcd41e86SJacky Bai 	size_t i;
65*fcd41e86SJacky Bai 
66*fcd41e86SJacky Bai 	for (i = 0U; i < ARRAY_SIZE(scmi_channel); i++) {
67*fcd41e86SJacky Bai 		scmi_smt_init_agent_channel(&scmi_channel[i]);
68*fcd41e86SJacky Bai 	}
69*fcd41e86SJacky Bai }
70