Skip to content

Commit a208513

Browse files
committedAug 1, 2024
openamp: Load the resource table manually in resource_table_init.
This patch allows removing the Open-AMP section used for the resource table by loading it manually. The Open-AMP ELF loader would attempt to load this section if the firmware is built for SDRAM. Note that since we're not using copy tables or ARM CC, the resource table has always been copied manually. Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
1 parent 96ccceb commit a208513

File tree

2 files changed

+47
-123
lines changed

2 files changed

+47
-123
lines changed
 

‎libraries/openamp_arduino/src/openamp_conf.h

+3
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ extern int __OPENAMP_region_end__[];
151151
#define SHM_START_ADDRESS ((metal_phys_addr_t)__OPENAMP_region_start__)
152152
#define SHM_SIZE (size_t)((void *)__OPENAMP_region_end__ - (void *) __OPENAMP_region_start__)
153153

154+
#define SHM_RSC_SIZE (1024)
155+
#define SHM_RSC_ADDR ((void *)__OPENAMP_region_start__ - SHM_RSC_SIZE)
156+
154157
#endif
155158

156159
#define VRING_RX_ADDRESS SHM_START_ADDRESS

‎libraries/openamp_arduino/src/rsc_table.c

+44-123
Original file line numberDiff line numberDiff line change
@@ -21,137 +21,58 @@
2121
******************************************************************************
2222
*/
2323

24-
/** @addtogroup RSC_TABLE
25-
* @{
26-
*/
27-
28-
/** @addtogroup resource_table
29-
* @{
30-
*/
31-
32-
/** @addtogroup resource_table_Private_Includes
33-
* @{
34-
*/
35-
36-
3724
#if defined(__ICCARM__) || defined (__CC_ARM)
3825
#include <stddef.h> /* needed for offsetof definition*/
3926
#endif
4027
#include "rsc_table.h"
4128
#include "openamp/open_amp.h"
4229

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-
7130
#if defined (__LOG_TRACE_IO_)
7231
extern char system_log_buf[];
7332
#endif
7433

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;
15778
}

0 commit comments

Comments
 (0)
Please sign in to comment.