1 /*
2  * Copyright (c) 2020 STMicroelectronics
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef RESOURCE_TABLE_H__
8 #define RESOURCE_TABLE_H__
9 
10 #include <openamp/remoteproc.h>
11 #include <openamp/virtio.h>
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0)
18 
19 #define VDEV_ID                 0xFF
20 #define VRING0_ID               CONFIG_OPENAMP_RSC_TABLE_IPM_RX_ID /* (host to remote) */
21 #define VRING1_ID               CONFIG_OPENAMP_RSC_TABLE_IPM_TX_ID /* (remote to host) */
22 
23 #define VRING_COUNT             2
24 #define RPMSG_IPU_C0_FEATURES   1
25 
26 #define VRING_RX_ADDRESS        -1  /* allocated by Master processor */
27 #define VRING_TX_ADDRESS        -1  /* allocated by Master processor */
28 #define VRING_BUFF_ADDRESS      -1  /* allocated by Master processor */
29 #define VRING_ALIGNMENT         16  /* fixed to match with Linux constraint */
30 
31 #endif
32 
33 enum rsc_table_entries {
34 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0)
35 	RSC_TABLE_VDEV_ENTRY,
36 #endif
37 #if defined(CONFIG_RAM_CONSOLE)
38 	RSC_TABLE_TRACE_ENTRY,
39 #endif
40 	RSC_TABLE_NUM_ENTRY
41 };
42 
43 struct fw_resource_table {
44 	struct resource_table hdr;
45 	uint32_t offset[RSC_TABLE_NUM_ENTRY];
46 
47 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0)
48 	struct fw_rsc_vdev vdev;
49 	struct fw_rsc_vdev_vring vring0;
50 	struct fw_rsc_vdev_vring vring1;
51 #endif
52 
53 #if defined(CONFIG_RAM_CONSOLE)
54 	/* rpmsg trace entry */
55 	struct fw_rsc_trace cm_trace;
56 #endif
57 } METAL_PACKED_END;
58 
59 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0)
60 	#define VDEV_OFFSET	offsetof(struct fw_resource_table, vdev),
61 #else
62 	#define VDEV_OFFSET
63 #endif
64 
65 #if defined(CONFIG_RAM_CONSOLE)
66 	#define CM_TRACE_OFFSET	offsetof(struct fw_resource_table, cm_trace),
67 #else
68 	#define CM_TRACE_OFFSET
69 #endif
70 
71 #define VDEV_ENTRY_HELPER(x)							\
72 	.vdev = {RSC_VDEV, VIRTIO_ID_RPMSG, 0, RPMSG_IPU_C0_FEATURES, 0, 0, 0,	\
73 		VRING_COUNT, {0, 0},},						\
74 	.vring0 = {VRING_TX_ADDRESS, VRING_ALIGNMENT, x, VRING0_ID, 0},		\
75 	.vring1 = {VRING_RX_ADDRESS, VRING_ALIGNMENT, x, VRING1_ID, 0},
76 
77 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0)
78 	#define VDEV_ENTRY							\
79 		VDEV_ENTRY_HELPER(CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF)
80 #else
81 	#define VDEV_ENTRY
82 #endif
83 
84 #if defined(CONFIG_RAM_CONSOLE)
85 	#define CM_TRACE_ENTRY							\
86 		.cm_trace = {							\
87 			RSC_TRACE,						\
88 			(uint32_t)ram_console_buf, CONFIG_RAM_CONSOLE_BUFFER_SIZE, 0,\
89 			"Zephyr_log",						\
90 		},
91 #else
92 	#define CM_TRACE_ENTRY
93 #endif
94 
95 #define RESOURCE_TABLE_INIT			\
96 {						\
97 	.hdr = {				\
98 		.ver = 1,			\
99 		.num = RSC_TABLE_NUM_ENTRY,	\
100 	},					\
101 	.offset = {				\
102 		VDEV_OFFSET			\
103 		CM_TRACE_OFFSET			\
104 	},					\
105 	VDEV_ENTRY				\
106 	CM_TRACE_ENTRY				\
107 }
108 
109 void rsc_table_get(void **table_ptr, int *length);
110 
111 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0)
112 struct fw_rsc_vdev *rsc_table_to_vdev(void *rsc_table);
113 struct fw_rsc_vdev_vring *rsc_table_get_vring0(void *rsc_table);
114 struct fw_rsc_vdev_vring *rsc_table_get_vring1(void *rsc_table);
115 #endif
116 
117 #ifdef __cplusplus
118 }
119 #endif
120 
121 #endif
122