|
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