|
21 | 21 | ****************************************************************************** |
22 | 22 | */ |
23 | 23 |
|
24 | | -/** @addtogroup RSC_TABLE |
25 | | - * @{ |
26 | | - */ |
27 | | - |
28 | | -/** @addtogroup resource_table |
29 | | - * @{ |
30 | | - */ |
31 | | - |
32 | | -/** @addtogroup resource_table_Private_Includes |
33 | | - * @{ |
34 | | - */ |
35 | | - |
36 | | - |
37 | 24 | #if defined(__ICCARM__) || defined (__CC_ARM) |
38 | 25 | #include <stddef.h> /* needed for offsetof definition*/ |
39 | 26 | #endif |
40 | 27 | #include "rsc_table.h" |
41 | 28 | #include "openamp/open_amp.h" |
42 | 29 |
|
43 | | -/** |
44 | | - * @} |
45 | | - */ |
46 | | - |
47 | | -/** @addtogroup resource_table_Private_TypesDefinitions |
48 | | - * @{ |
49 | | - */ |
50 | | - |
51 | | -/** |
52 | | - * @} |
53 | | - */ |
54 | | - |
55 | | -/** @addtogroup resource_table_Private_Defines |
56 | | - * @{ |
57 | | - */ |
58 | | - |
59 | | -/* Place resource table in special ELF section */ |
60 | | -#if defined(__GNUC__) |
61 | | -#define __section_t(S) __attribute__((__section__(#S))) |
62 | | -#define __resource __section_t(.resource_table) |
63 | | -#endif |
64 | | - |
65 | | -#define RPMSG_IPU_C0_FEATURES 1 |
66 | | -#define VRING_COUNT 2 |
67 | | - |
68 | | -/* VirtIO rpmsg device id */ |
69 | | -#define VIRTIO_ID_RPMSG_ 7 |
70 | | - |
71 | 30 | #if defined (__LOG_TRACE_IO_) |
72 | 31 | extern char system_log_buf[]; |
73 | 32 | #endif |
74 | 33 |
|
75 | | -#if defined(__GNUC__) |
76 | | -#if !defined (__CC_ARM) |
77 | | -/* Since GCC is not initializing the resource_table at startup, it is declared as volatile to avoid compiler optimization |
78 | | - * for the CM4 (see resource_table_init() below) |
79 | | - */ |
80 | | -volatile struct shared_resource_table __resource __attribute__((used)) resource_table; |
81 | | -#else |
82 | | -struct shared_resource_table __resource __attribute__((used)) resource_table = { |
83 | | -#endif |
84 | | -#elif defined(__ICCARM__) |
85 | | -__root struct shared_resource_table resource_table @ ".resource_table" = { |
86 | | -#endif |
87 | | - |
88 | | -#if defined(__ICCARM__) || defined (__CC_ARM) |
89 | | - .version = 1, |
90 | | - .num = 2, |
91 | | - .reserved = {0, 0}, |
92 | | - .offset = { |
93 | | - offsetof(struct shared_resource_table, vdev), |
94 | | - offsetof(struct shared_resource_table, cm_trace), |
95 | | - }, |
96 | | - |
97 | | - /* Virtio device entry */ |
98 | | - .vdev= { |
99 | | - RSC_VDEV, VIRTIO_ID_RPMSG_, 0, RPMSG_IPU_C0_FEATURES, 0, 0, 0, |
100 | | - VRING_COUNT, {0, 0}, |
101 | | - }, |
102 | | - |
103 | | - /* Vring rsc entry - part of vdev rsc entry */ |
104 | | - .vring0 = {VRING_TX_ADDRESS, VRING_ALIGNMENT, VRING_NUM_BUFFS, VRING0_ID, 0}, |
105 | | - .vring1 = {VRING_RX_ADDRESS, VRING_ALIGNMENT, VRING_NUM_BUFFS, VRING1_ID, 0}, |
106 | | - |
107 | | -#if defined (__LOG_TRACE_IO_) |
108 | | - .cm_trace = { |
109 | | - RSC_TRACE, |
110 | | - (uint32_t)system_log_buf, SYSTEM_TRACE_BUF_SZ, 0, "cm4_log", |
111 | | - }, |
112 | | -#endif |
113 | | -} ; |
114 | | -#endif |
115 | | - |
116 | | -void resource_table_init(int RPMsgRole, void **table_ptr, int *length) |
117 | | -{ |
118 | | - |
119 | | -#if defined (__GNUC__) && ! defined (__CC_ARM) |
120 | | -#ifdef CORE_CM7 |
121 | | - /* |
122 | | - * Currently the GCC linker doesn't initialize the resource_table global variable at startup |
123 | | - * it is done here by the CM7 application. |
124 | | - */ |
125 | | - memset(&resource_table, '\0', sizeof(struct shared_resource_table)); |
126 | | - resource_table.num = 1; |
127 | | - resource_table.version = 1; |
128 | | - resource_table.offset[0] = offsetof(struct shared_resource_table, vdev); |
129 | | - |
130 | | - resource_table.vring0.da = VRING_TX_ADDRESS; |
131 | | - resource_table.vring0.align = VRING_ALIGNMENT; |
132 | | - resource_table.vring0.num = VRING_NUM_BUFFS; |
133 | | - resource_table.vring0.notifyid = VRING0_ID; |
134 | | - |
135 | | - resource_table.vring1.da = VRING_RX_ADDRESS; |
136 | | - resource_table.vring1.align = VRING_ALIGNMENT; |
137 | | - resource_table.vring1.num = VRING_NUM_BUFFS; |
138 | | - resource_table.vring1.notifyid = VRING1_ID; |
139 | | - |
140 | | - |
141 | | - resource_table.vdev.type = RSC_VDEV; |
142 | | - resource_table.vdev.id = VIRTIO_ID_RPMSG_; |
143 | | - resource_table.vdev.num_of_vrings=VRING_COUNT; |
144 | | - resource_table.vdev.dfeatures = RPMSG_IPU_C0_FEATURES; |
145 | | -#else |
146 | | - /* For CM4 let's wait until the resource_table is correctly initialized */ |
147 | | - while(resource_table.vring1.da != VRING_RX_ADDRESS) |
148 | | - { |
149 | | - |
150 | | - } |
151 | | -#endif |
152 | | -#endif |
153 | | - |
154 | | - (void)RPMsgRole; |
155 | | - *length = sizeof(resource_table); |
156 | | - *table_ptr = &resource_table; |
| 34 | +void resource_table_init(int RPMsgRole, void **table_ptr, int *length) { |
| 35 | + (void)RPMsgRole; |
| 36 | + volatile struct shared_resource_table *resource_table = SHM_RSC_ADDR; |
| 37 | + |
| 38 | + #ifdef CORE_CM7 |
| 39 | + memset(resource_table, 0, SHM_RSC_SIZE); |
| 40 | + resource_table->num = 1; |
| 41 | + resource_table->version = 1; |
| 42 | + resource_table->offset[0] = offsetof(struct shared_resource_table, vdev); |
| 43 | + #if defined (__LOG_TRACE_IO_) |
| 44 | + resource_table->offset[1] = offsetof(struct shared_resource_table, cm_trace); |
| 45 | + #endif |
| 46 | + |
| 47 | + resource_table->vring0.da = VRING_TX_ADDRESS; |
| 48 | + resource_table->vring0.align = VRING_ALIGNMENT; |
| 49 | + resource_table->vring0.num = VRING_NUM_BUFFS; |
| 50 | + resource_table->vring0.notifyid = VRING0_ID; |
| 51 | + |
| 52 | + resource_table->vring1.da = VRING_RX_ADDRESS; |
| 53 | + resource_table->vring1.align = VRING_ALIGNMENT; |
| 54 | + resource_table->vring1.num = VRING_NUM_BUFFS; |
| 55 | + resource_table->vring1.notifyid = VRING1_ID; |
| 56 | + |
| 57 | + #if defined (__LOG_TRACE_IO_) |
| 58 | + resource_table->cm_trace.type; |
| 59 | + resource_table->cm_trace.da; |
| 60 | + resource_table->cm_trace.len; |
| 61 | + resource_table->cm_trace.reserved = 0; |
| 62 | + resource_table->cm_trace.name = (uint8_t[]){"cm_trace"}; |
| 63 | + #endif |
| 64 | + |
| 65 | + resource_table->vdev.type = RSC_VDEV; |
| 66 | + resource_table->vdev.id = VIRTIO_ID_RPMSG; |
| 67 | + resource_table->vdev.num_of_vrings=VRING_COUNT; |
| 68 | + resource_table->vdev.dfeatures = (1 << VIRTIO_RPMSG_F_NS); |
| 69 | + #else |
| 70 | + // For CM4, wait until the resource_table is initialized by the host |
| 71 | + while(resource_table->vring1.da != VRING_RX_ADDRESS) { |
| 72 | + |
| 73 | + } |
| 74 | + #endif |
| 75 | + |
| 76 | + *length = SHM_RSC_SIZE; |
| 77 | + *table_ptr = resource_table; |
157 | 78 | } |
0 commit comments