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