xref: /rk3399_ARM-atf/plat/arm/board/tc/tc_sfcp.c (revision 2801427972c4b0d4c0165edb509f21186103f21f)
1*05076cbfSJackson Cooper-Driver /*
2*05076cbfSJackson Cooper-Driver  * Copyright (c) 2026, Arm Limited and Contributors. All rights reserved.
3*05076cbfSJackson Cooper-Driver  *
4*05076cbfSJackson Cooper-Driver  * SPDX-License-Identifier: BSD-3-Clause
5*05076cbfSJackson Cooper-Driver  *
6*05076cbfSJackson Cooper-Driver  */
7*05076cbfSJackson Cooper-Driver 
8*05076cbfSJackson Cooper-Driver #include <assert.h>
9*05076cbfSJackson Cooper-Driver 
10*05076cbfSJackson Cooper-Driver #include "mhu_v3_x.h"
11*05076cbfSJackson Cooper-Driver #include <sfcp_platform.h>
12*05076cbfSJackson Cooper-Driver 
13*05076cbfSJackson Cooper-Driver #include <platform_def.h>
14*05076cbfSJackson Cooper-Driver 
15*05076cbfSJackson Cooper-Driver /* These must be kept up to data with the routing table
16*05076cbfSJackson Cooper-Driver  * definition in RSE as the node IDs are global
17*05076cbfSJackson Cooper-Driver  */
18*05076cbfSJackson Cooper-Driver #define AP_MONITOR_NODE_ID (2)
19*05076cbfSJackson Cooper-Driver 
20*05076cbfSJackson Cooper-Driver static struct mhu_v3_x_dev_t mhu_rse_ap_snd_dev = { PLAT_RSE_AP_SND_MHU_BASE,
21*05076cbfSJackson Cooper-Driver 						    MHU_V3_X_PBX_FRAME };
22*05076cbfSJackson Cooper-Driver static struct mhu_v3_x_dev_t mhu_rse_ap_recv_dev = { PLAT_RSE_AP_RCV_MHU_BASE,
23*05076cbfSJackson Cooper-Driver 						     MHU_V3_X_MBX_FRAME };
24*05076cbfSJackson Cooper-Driver 
25*05076cbfSJackson Cooper-Driver static struct sfcp_platform_device_t sender_devices[] = {
26*05076cbfSJackson Cooper-Driver 	/* Link ID 0 is reserved */
27*05076cbfSJackson Cooper-Driver 	[0] = { 0 },
28*05076cbfSJackson Cooper-Driver 	[1] = { &mhu_rse_ap_snd_dev, SFCP_PLATFORM_DEVICE_TYPE_MHUV3 },
29*05076cbfSJackson Cooper-Driver };
30*05076cbfSJackson Cooper-Driver 
31*05076cbfSJackson Cooper-Driver struct sfcp_platform_device_t
sfcp_platform_get_send_device(sfcp_link_id_t link_id)32*05076cbfSJackson Cooper-Driver sfcp_platform_get_send_device(sfcp_link_id_t link_id)
33*05076cbfSJackson Cooper-Driver {
34*05076cbfSJackson Cooper-Driver 	assert(link_id < ARRAY_SIZE(sender_devices));
35*05076cbfSJackson Cooper-Driver 
36*05076cbfSJackson Cooper-Driver 	return sender_devices[link_id];
37*05076cbfSJackson Cooper-Driver }
38*05076cbfSJackson Cooper-Driver 
39*05076cbfSJackson Cooper-Driver static struct sfcp_platform_device_t receiver_devices[] = {
40*05076cbfSJackson Cooper-Driver 	/* Link ID 0 is reserved */
41*05076cbfSJackson Cooper-Driver 	[0] = { 0 },
42*05076cbfSJackson Cooper-Driver 	[1] = { &mhu_rse_ap_recv_dev, SFCP_PLATFORM_DEVICE_TYPE_MHUV3 },
43*05076cbfSJackson Cooper-Driver };
44*05076cbfSJackson Cooper-Driver 
45*05076cbfSJackson Cooper-Driver struct sfcp_platform_device_t
sfcp_platform_get_receive_device(sfcp_link_id_t link_id)46*05076cbfSJackson Cooper-Driver sfcp_platform_get_receive_device(sfcp_link_id_t link_id)
47*05076cbfSJackson Cooper-Driver {
48*05076cbfSJackson Cooper-Driver 	assert(link_id < ARRAY_SIZE(receiver_devices));
49*05076cbfSJackson Cooper-Driver 
50*05076cbfSJackson Cooper-Driver 	return receiver_devices[link_id];
51*05076cbfSJackson Cooper-Driver }
52*05076cbfSJackson Cooper-Driver 
53*05076cbfSJackson Cooper-Driver sfcp_link_id_t
sfcp_platform_get_receive_link_id(struct sfcp_platform_device_t device)54*05076cbfSJackson Cooper-Driver sfcp_platform_get_receive_link_id(struct sfcp_platform_device_t device)
55*05076cbfSJackson Cooper-Driver {
56*05076cbfSJackson Cooper-Driver 	for (uint8_t i = 1; i < ARRAY_SIZE(receiver_devices); i++) {
57*05076cbfSJackson Cooper-Driver 		if ((receiver_devices[i].type == device.type) &&
58*05076cbfSJackson Cooper-Driver 		    (receiver_devices[i].device == device.device)) {
59*05076cbfSJackson Cooper-Driver 			return i;
60*05076cbfSJackson Cooper-Driver 		}
61*05076cbfSJackson Cooper-Driver 	}
62*05076cbfSJackson Cooper-Driver 
63*05076cbfSJackson Cooper-Driver 	return 0;
64*05076cbfSJackson Cooper-Driver }
65*05076cbfSJackson Cooper-Driver 
sfcp_platform_get_my_node_id(void)66*05076cbfSJackson Cooper-Driver sfcp_node_id_t sfcp_platform_get_my_node_id(void)
67*05076cbfSJackson Cooper-Driver {
68*05076cbfSJackson Cooper-Driver 	return AP_MONITOR_NODE_ID;
69*05076cbfSJackson Cooper-Driver }
70*05076cbfSJackson Cooper-Driver 
71*05076cbfSJackson Cooper-Driver /* Currently only link defined is to RSE. All other links are
72*05076cbfSJackson Cooper-Driver  * defined as 0 (invalid link ID) as SFCP is currently only
73*05076cbfSJackson Cooper-Driver  * used for communication with the RSE.
74*05076cbfSJackson Cooper-Driver  *
75*05076cbfSJackson Cooper-Driver  * TODO: Once SFCP has been adopted by other components
76*05076cbfSJackson Cooper-Driver  * update this table to add link IDs for communication
77*05076cbfSJackson Cooper-Driver  * with other nodes
78*05076cbfSJackson Cooper-Driver  */
79*05076cbfSJackson Cooper-Driver static const uint8_t ap_monitor_routing_tables[] = {
80*05076cbfSJackson Cooper-Driver 	[0] = 1,
81*05076cbfSJackson Cooper-Driver 	[1] = 0,
82*05076cbfSJackson Cooper-Driver 	[2] = 0,
83*05076cbfSJackson Cooper-Driver 	[3] = 0,
84*05076cbfSJackson Cooper-Driver };
85*05076cbfSJackson Cooper-Driver 
sfcp_platform_get_routing_tables(const uint8_t ** routing_tables,size_t * routing_tables_size)86*05076cbfSJackson Cooper-Driver void sfcp_platform_get_routing_tables(const uint8_t **routing_tables,
87*05076cbfSJackson Cooper-Driver 				      size_t *routing_tables_size)
88*05076cbfSJackson Cooper-Driver {
89*05076cbfSJackson Cooper-Driver 	assert(routing_tables != NULL);
90*05076cbfSJackson Cooper-Driver 	assert(routing_tables_size != NULL);
91*05076cbfSJackson Cooper-Driver 
92*05076cbfSJackson Cooper-Driver 	*routing_tables = ap_monitor_routing_tables;
93*05076cbfSJackson Cooper-Driver 	*routing_tables_size = ARRAY_SIZE(ap_monitor_routing_tables);
94*05076cbfSJackson Cooper-Driver }
95