Skip to content

Commit 98cee13

Browse files
tnmysharnopo
authored andcommitted
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 bb8eb62 commit 98cee13

3 files changed

Lines changed: 88 additions & 24 deletions

File tree

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

Lines changed: 62 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+
circ.c_buf[circ.c_pos++] = c;
198+
if (circ.c_pos >= circ.c_len)
199+
circ.c_pos = 0;
200+
}
201+
187202
static void xlnx_irq_isr(void *arg)
188203
{
189204
int vector;
@@ -248,12 +263,58 @@ 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+
static const char * const level_strs[] = {
270+
"emergency",
271+
"alert",
272+
"critical",
273+
"error",
274+
"warning",
275+
"notice",
276+
"info",
277+
"debug",
278+
};
279+
char msg[128];
280+
char *p;
281+
int32_t len;
282+
va_list args;
283+
284+
/*
285+
* print unexpected log level with "emergency" level to notify user
286+
* about the error.
287+
*/
288+
if (level > METAL_LOG_DEBUG)
289+
level = METAL_LOG_EMERGENCY;
290+
291+
len = snprintf(msg, sizeof(msg), "RPU%d: %s: ", XPAR_CPU_ID,
292+
level_strs[level]);
293+
294+
circ.c_cnt++;
295+
296+
va_start(args, format);
297+
vsnprintf(msg + len, (int32_t)sizeof(msg) - len, format, args);
298+
va_end(args);
299+
300+
/* copy at most sizeof(msg) to the circular buffer */
301+
for (len = 0, p = msg; *p && len < (int32_t)sizeof(msg); ++len, ++p)
302+
rsc_trace_putchar(*p);
303+
304+
xil_printf("%s", msg);
305+
}
306+
251307
static int xlnx_machine_init(void)
252308
{
253309

254310
struct metal_init_params metal_param = XLNX_PLATFORM_METAL_INIT_PARAMS;
255311
int ret;
256312

313+
/* Init circular buffer */
314+
circ.c_buf = get_rsc_trace_info(&circ.c_len);
315+
if (circ.c_buf && circ.c_len)
316+
circ.c_pos = circ.c_cnt = 0;
317+
257318
metal_init(&metal_param);
258319

259320
if (!kick_device.irq_info) {
@@ -297,21 +358,6 @@ static void xlnx_machine_cleanup(void)
297358
Xil_ICacheInvalidate();
298359
}
299360

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-
315361
int platform_init(int argc, char *argv[], void **platform)
316362
{
317363
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 4096
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)