Skip to content

Commit f6a6178

Browse files
committed
legacy_apps: zynqmp_r5: add trace buffer support
trace buffer is a circular buffer to store logs. Linux remoteproc subsystem creates a debugfs file that can be used to print these logs on linux side. Signed-off-by: Tanmay Shah <tanmay.shah@amd.com>
1 parent 8180db7 commit f6a6178

3 files changed

Lines changed: 86 additions & 24 deletions

File tree

examples/legacy_apps/machine/xlnx/zynqmp_r5/platform_info.c

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
#define XLNX_METAL_LOG_LEVEL METAL_LOG_INFO
123123
#endif
124124

125-
void xlnx_log_handler(enum metal_log_level level, const char *format, ...);
125+
static void xlnx_log_handler(enum metal_log_level level, const char *format, ...);
126126

127127
#define XLNX_PLATFORM_METAL_INIT_PARAMS \
128128
{ \
@@ -184,6 +184,21 @@ int xlnx_hw_to_bsp_irq(int sys_irq);
184184
/* RPMsg virtio shared buffer pool */
185185
static struct rpmsg_virtio_shm_pool shpool;
186186

187+
/* circular buffer for trace buffer */
188+
static struct {
189+
char *c_buf;
190+
uint32_t c_len;
191+
uint32_t c_pos;
192+
uint32_t c_cnt;
193+
} circ;
194+
195+
static void rsc_trace_putchar(char c)
196+
{
197+
if (circ.c_pos >= circ.c_len)
198+
circ.c_pos = 0;
199+
circ.c_buf[circ.c_pos++] = c;
200+
}
201+
187202
static void xlnx_irq_isr(void *arg)
188203
{
189204
int vector;
@@ -248,12 +263,56 @@ platform_create_proc(int proc_index, int rsc_index)
248263
return &rproc_inst;
249264
}
250265

266+
static void xlnx_log_handler(enum metal_log_level level,
267+
const char *format, ...)
268+
{
269+
char msg[64];
270+
char *p;
271+
int32_t len = 0;
272+
va_list args;
273+
274+
if (level > METAL_LOG_DEBUG)
275+
level = METAL_LOG_EMERGENCY;
276+
277+
static const char * const level_strs[] = {
278+
"emergency",
279+
"alert",
280+
"critical",
281+
"error",
282+
"warning",
283+
"notice",
284+
"info",
285+
"debug",
286+
};
287+
288+
len = sprintf(msg, "%s: ", level_strs[level]);
289+
290+
if (len < 0 || len > (int32_t)sizeof(msg))
291+
len = 0;
292+
circ.c_cnt++;
293+
294+
va_start(args, format);
295+
vsnprintf(msg + len, (int32_t)sizeof(msg) - len, format, args);
296+
va_end(args);
297+
298+
/* copy at most sizeof(msg) to the circular buffer */
299+
for (len = 0, p = msg; *p && len < (int32_t)sizeof(msg); ++len, ++p)
300+
rsc_trace_putchar(*p);
301+
302+
xil_printf("%s", msg);
303+
}
304+
251305
static int xlnx_machine_init(void)
252306
{
253307

254308
struct metal_init_params metal_param = XLNX_PLATFORM_METAL_INIT_PARAMS;
255309
int ret;
256310

311+
/* Init circular buffer */
312+
circ.c_buf = get_rsc_trace_info(&circ.c_len);
313+
if (circ.c_buf && circ.c_len)
314+
circ.c_pos = circ.c_cnt = 0;
315+
257316
metal_init(&metal_param);
258317

259318
if (!kick_device.irq_info) {
@@ -297,21 +356,6 @@ static void xlnx_machine_cleanup(void)
297356
Xil_ICacheInvalidate();
298357
}
299358

300-
void xlnx_log_handler(enum metal_log_level level, const char *format, ...)
301-
{
302-
char msg[1024];
303-
va_list args;
304-
305-
va_start(args, format);
306-
vsnprintf(msg, sizeof(msg), format, args);
307-
va_end(args);
308-
309-
if (level > metal_get_log_level())
310-
return;
311-
312-
xil_printf("RPU%d: %s", XPAR_CPU_ID, msg);
313-
}
314-
315359
int platform_init(int argc, char *argv[], void **platform)
316360
{
317361
unsigned long proc_id = 0;

examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.c

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@
3737
#endif /* RING_RX */
3838
#define VRING_SIZE 256
3939

40-
#define NUM_TABLE_ENTRIES 1
40+
#define NUM_TABLE_ENTRIES 2
41+
#define RSC_TRACE_SZ (4*1024)
4142

4243
static struct remote_resource_table *initial_resources;
44+
static char rsc_trace_buf[RSC_TRACE_SZ];
4345

4446
struct remote_resource_table __resource resources = {
4547
/* Version */
@@ -51,19 +53,27 @@ struct remote_resource_table __resource resources = {
5153
{0, 0,},
5254

5355
/* Offsets of rsc entries */
54-
{
55-
offsetof(struct remote_resource_table, rpmsg_vdev),
56-
},
56+
.offset[0] = offsetof(struct remote_resource_table, rpmsg_vdev),
57+
.offset[1] = offsetof(struct remote_resource_table, rsc_trace),
5758

5859
/* Virtio device entry */
59-
{
60-
RSC_VDEV, VIRTIO_ID_RPMSG_, 31, RPMSG_VDEV_DFEATURES, 0, 0, 0,
61-
NUM_VRINGS, {0, 0},
62-
},
60+
.rpmsg_vdev = {
61+
RSC_VDEV, VIRTIO_ID_RPMSG_, 31, RPMSG_VDEV_DFEATURES, 0, 0, 0,
62+
NUM_VRINGS, {0, 0},
63+
},
6364

6465
/* Vring rsc entry - part of vdev rsc entry */
6566
{RING_TX, VRING_ALIGN, VRING_SIZE, 1, 0},
6667
{RING_RX, VRING_ALIGN, VRING_SIZE, 2, 0},
68+
69+
/* trace buffer for logs, accessible via debugfs */
70+
.rsc_trace = {
71+
.type = RSC_TRACE,
72+
.da = (uint32_t)rsc_trace_buf,
73+
.len = sizeof(rsc_trace_buf),
74+
.reserved = 0,
75+
.name = "r5_trace",
76+
},
6777
};
6878

6979
struct remote_resource_table_metadata __resource_metadata resources_metadata = {
@@ -74,6 +84,12 @@ struct remote_resource_table_metadata __resource_metadata resources_metadata = {
7484
.rsc_tbl = (uintptr_t)&resources
7585
};
7686

87+
char *get_rsc_trace_info(uint32_t *len)
88+
{
89+
*len = sizeof(rsc_trace_buf);
90+
return rsc_trace_buf;
91+
}
92+
7793
void *get_resource_table (int rsc_id, int *len)
7894
{
7995
(void) rsc_id;

examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct remote_resource_table {
3434
struct fw_rsc_vdev rpmsg_vdev;
3535
struct fw_rsc_vdev_vring rpmsg_vring0;
3636
struct fw_rsc_vdev_vring rpmsg_vring1;
37+
struct fw_rsc_trace rsc_trace;
3738
}__attribute__((packed, aligned(0x100)));
3839

3940
struct remote_resource_table_metadata {
@@ -44,6 +45,7 @@ struct remote_resource_table_metadata {
4445
const uintptr_t rsc_tbl;
4546
}__attribute__((packed));
4647

48+
char *get_rsc_trace_info(uint32_t *len);
4749
void *get_resource_table (int rsc_id, int *len);
4850
void free_resource_table (void);
4951
void restore_initial_rsc_table (void);

0 commit comments

Comments
 (0)