diff --git a/examples/legacy_apps/examples/echo/freertos/main.c b/examples/legacy_apps/examples/echo/freertos/main.c index 04ba1ef..79f04d4 100644 --- a/examples/legacy_apps/examples/echo/freertos/main.c +++ b/examples/legacy_apps/examples/echo/freertos/main.c @@ -10,7 +10,7 @@ #include #include #include -#include "platform_info.h" +#include "platform_info_common.h" #include "rpmsg-echo.h" #include #include "task.h" diff --git a/examples/legacy_apps/examples/echo/generic/main.c b/examples/legacy_apps/examples/echo/generic/main.c index db2035f..43f0671 100644 --- a/examples/legacy_apps/examples/echo/generic/main.c +++ b/examples/legacy_apps/examples/echo/generic/main.c @@ -9,7 +9,7 @@ #include #include #include -#include "platform_info.h" +#include "platform_info_common.h" #include "rpmsg-echo.h" #include diff --git a/examples/legacy_apps/examples/echo/rpmsg-echo.c b/examples/legacy_apps/examples/echo/rpmsg-echo.c index 2a6b232..329c53a 100644 --- a/examples/legacy_apps/examples/echo/rpmsg-echo.c +++ b/examples/legacy_apps/examples/echo/rpmsg-echo.c @@ -15,7 +15,7 @@ #include #include #include -#include "platform_info.h" +#include "platform_info_common.h" #include "rpmsg-echo.h" #define SHUTDOWN_MSG 0xEF56A55A diff --git a/examples/legacy_apps/examples/matrix_multiply/matrix_multiply.h b/examples/legacy_apps/examples/matrix_multiply/matrix_multiply.h index e0058a9..79e9f53 100644 --- a/examples/legacy_apps/examples/matrix_multiply/matrix_multiply.h +++ b/examples/legacy_apps/examples/matrix_multiply/matrix_multiply.h @@ -7,6 +7,8 @@ #ifndef MATRIX_MULTIPLY_H #define MATRIX_MULTIPLY_H +#include + #define RPMSG_SERVICE_NAME "rpmsg-openamp-demo-channel" int rpmsg_matrix_app(struct rpmsg_device *rdev, void *priv); diff --git a/examples/legacy_apps/machine/xlnx/CMakeLists.txt b/examples/legacy_apps/machine/xlnx/CMakeLists.txt index 7d9600e..035b642 100644 --- a/examples/legacy_apps/machine/xlnx/CMakeLists.txt +++ b/examples/legacy_apps/machine/xlnx/CMakeLists.txt @@ -11,6 +11,11 @@ cmake_minimum_required(VERSION 3.24) enable_language(C ASM ) +if (NOT DEFINED ${OPENAMP_APP_NAME}) + add_subdirectory(${MACHINE}) + return() +endif(NOT DEFINED ${OPENAMP_APP_NAME}) + set_property (GLOBAL PROPERTY OPENAMP_APP_NAME "${OPENAMP_APP_NAME}") SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/") diff --git a/examples/legacy_apps/machine/xlnx/zynqmp_r5/CMakeLists.txt b/examples/legacy_apps/machine/xlnx/zynqmp_r5/CMakeLists.txt index 92bf66d5..ce0c6ec 100644 --- a/examples/legacy_apps/machine/xlnx/zynqmp_r5/CMakeLists.txt +++ b/examples/legacy_apps/machine/xlnx/zynqmp_r5/CMakeLists.txt @@ -11,7 +11,7 @@ endif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_SYSTEM}/gic_init.c") # If not provided, add default value for resource table if(NOT DEFINED ${RSC_TABLE}) - set(RSC_TABLE 0x3ed00000 CACHE STRING "") + set(RSC_TABLE 0x9800000 CACHE STRING "") endif(NOT DEFINED ${RSC_TABLE}) set (_linker_script "${CMAKE_CURRENT_SOURCE_DIR}/linker_remote.ld") diff --git a/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_large_text.ld b/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_large_text.ld index d255d3c..459f961 100644 --- a/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_large_text.ld +++ b/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_large_text.ld @@ -18,7 +18,7 @@ _UNDEF_STACK_SIZE = DEFINED(_UNDEF_STACK_SIZE) ? _UNDEF_STACK_SIZE : 1024; /* TCM size is set to 2*0x20000 for R5 in lockstep mode */ MEMORY { - psu_ddr_S_AXI_BASEADDR : ORIGIN = 0x3ED00000, LENGTH = 0x00040000 + psu_ddr_S_AXI_BASEADDR : ORIGIN = 0x9800000, LENGTH = 0x00060000 psu_ocm_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x10000 psu_r5_tcm_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000, LENGTH = 0x10000 psu_r5_tcm_ram_1_S_AXI_BASEADDR : ORIGIN = 0x20000, LENGTH = 0x10000 @@ -275,7 +275,7 @@ _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 ); . += _HEAP_SIZE; _heap_end = .; HeapLimit = .; -} > psu_r5_tcm_ram_0_S_AXI_BASEADDR +} > psu_ddr_S_AXI_BASEADDR .stack (NOLOAD) : { . = ALIGN(16); diff --git a/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_remote.ld b/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_remote.ld index d255d3c..459f961 100644 --- a/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_remote.ld +++ b/examples/legacy_apps/machine/xlnx/zynqmp_r5/linker_remote.ld @@ -18,7 +18,7 @@ _UNDEF_STACK_SIZE = DEFINED(_UNDEF_STACK_SIZE) ? _UNDEF_STACK_SIZE : 1024; /* TCM size is set to 2*0x20000 for R5 in lockstep mode */ MEMORY { - psu_ddr_S_AXI_BASEADDR : ORIGIN = 0x3ED00000, LENGTH = 0x00040000 + psu_ddr_S_AXI_BASEADDR : ORIGIN = 0x9800000, LENGTH = 0x00060000 psu_ocm_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x10000 psu_r5_tcm_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000, LENGTH = 0x10000 psu_r5_tcm_ram_1_S_AXI_BASEADDR : ORIGIN = 0x20000, LENGTH = 0x10000 @@ -275,7 +275,7 @@ _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 ); . += _HEAP_SIZE; _heap_end = .; HeapLimit = .; -} > psu_r5_tcm_ram_0_S_AXI_BASEADDR +} > psu_ddr_S_AXI_BASEADDR .stack (NOLOAD) : { . = ALIGN(16); diff --git a/examples/legacy_apps/machine/xlnx/zynqmp_r5/platform_info.c b/examples/legacy_apps/machine/xlnx/zynqmp_r5/platform_info.c index 560e345..dad77e1 100644 --- a/examples/legacy_apps/machine/xlnx/zynqmp_r5/platform_info.c +++ b/examples/legacy_apps/machine/xlnx/zynqmp_r5/platform_info.c @@ -101,9 +101,9 @@ #endif /* versal */ #ifndef SHARED_MEM_PA #if XPAR_CPU_ID == 0 -#define SHARED_MEM_PA 0x3ED40000UL +#define SHARED_MEM_PA 0x9860000UL #else -#define SHARED_MEM_PA 0x3EF40000UL +#define SHARED_MEM_PA 0x9C60000UL #endif /* XPAR_CPU_ID */ #endif /* !SHARED_MEM_PA */ @@ -122,7 +122,7 @@ #define XLNX_METAL_LOG_LEVEL METAL_LOG_INFO #endif -void xlnx_log_handler(enum metal_log_level level, const char *format, ...); +static void xlnx_log_handler(enum metal_log_level level, const char *format, ...); #define XLNX_PLATFORM_METAL_INIT_PARAMS \ { \ @@ -184,6 +184,21 @@ int xlnx_hw_to_bsp_irq(int sys_irq); /* RPMsg virtio shared buffer pool */ static struct rpmsg_virtio_shm_pool shpool; +/* circular buffer for trace buffer */ +static struct { + char *c_buf; + uint32_t c_len; + uint32_t c_pos; + uint32_t c_cnt; +} circ; + +static void rsc_trace_putchar(char c) +{ + if (circ.c_pos >= circ.c_len) + circ.c_pos = 0; + circ.c_buf[circ.c_pos++] = c; +} + static void xlnx_irq_isr(void *arg) { int vector; @@ -248,12 +263,54 @@ platform_create_proc(int proc_index, int rsc_index) return &rproc_inst; } +static void xlnx_log_handler(enum metal_log_level level, + const char *format, ...) +{ + static const char * const level_strs[] = { + "emergency", + "alert", + "critical", + "error", + "warning", + "notice", + "info", + "debug", + }; + char msg[128]; + char *p; + int32_t len; + va_list args; + + + if (level > METAL_LOG_DEBUG) + level = METAL_LOG_EMERGENCY; + + len = snprintf(msg, sizeof(msg), "%s: ", level_strs[level]); + + circ.c_cnt++; + + va_start(args, format); + vsnprintf(msg + len, (int32_t)sizeof(msg) - len, format, args); + va_end(args); + + /* copy at most sizeof(msg) to the circular buffer */ + for (len = 0, p = msg; *p && len < (int32_t)sizeof(msg); ++len, ++p) + rsc_trace_putchar(*p); + + xil_printf("%s", msg); +} + static int xlnx_machine_init(void) { struct metal_init_params metal_param = XLNX_PLATFORM_METAL_INIT_PARAMS; int ret; + /* Init circular buffer */ + circ.c_buf = get_rsc_trace_info(&circ.c_len); + if (circ.c_buf && circ.c_len) + circ.c_pos = circ.c_cnt = 0; + metal_init(&metal_param); if (!kick_device.irq_info) { @@ -297,21 +354,6 @@ static void xlnx_machine_cleanup(void) Xil_ICacheInvalidate(); } -void xlnx_log_handler(enum metal_log_level level, const char *format, ...) -{ - char msg[1024]; - va_list args; - - va_start(args, format); - vsnprintf(msg, sizeof(msg), format, args); - va_end(args); - - if (level > metal_get_log_level()) - return; - - xil_printf("RPU%d: %s", XPAR_CPU_ID, msg); -} - int platform_init(int argc, char *argv[], void **platform) { unsigned long proc_id = 0; diff --git a/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.c b/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.c index 732d6b7..485edcf 100644 --- a/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.c +++ b/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.c @@ -37,9 +37,11 @@ #endif /* RING_RX */ #define VRING_SIZE 256 -#define NUM_TABLE_ENTRIES 1 +#define NUM_TABLE_ENTRIES 2 +#define RSC_TRACE_SZ (4*1024) static struct remote_resource_table *initial_resources; +static char rsc_trace_buf[RSC_TRACE_SZ]; struct remote_resource_table __resource resources = { /* Version */ @@ -51,19 +53,27 @@ struct remote_resource_table __resource resources = { {0, 0,}, /* Offsets of rsc entries */ - { - offsetof(struct remote_resource_table, rpmsg_vdev), - }, + .offset[0] = offsetof(struct remote_resource_table, rpmsg_vdev), + .offset[1] = offsetof(struct remote_resource_table, rsc_trace), /* Virtio device entry */ - { - RSC_VDEV, VIRTIO_ID_RPMSG_, 31, RPMSG_VDEV_DFEATURES, 0, 0, 0, - NUM_VRINGS, {0, 0}, - }, + .rpmsg_vdev = { + RSC_VDEV, VIRTIO_ID_RPMSG_, 31, RPMSG_VDEV_DFEATURES, 0, 0, 0, + NUM_VRINGS, {0, 0}, + }, /* Vring rsc entry - part of vdev rsc entry */ {RING_TX, VRING_ALIGN, VRING_SIZE, 1, 0}, {RING_RX, VRING_ALIGN, VRING_SIZE, 2, 0}, + + /* trace buffer for logs, accessible via debugfs */ + .rsc_trace = { + .type = RSC_TRACE, + .da = (uint32_t)rsc_trace_buf, + .len = sizeof(rsc_trace_buf), + .reserved = 0, + .name = "r5_trace", + }, }; struct remote_resource_table_metadata __resource_metadata resources_metadata = { @@ -74,6 +84,12 @@ struct remote_resource_table_metadata __resource_metadata resources_metadata = { .rsc_tbl = (uintptr_t)&resources }; +char *get_rsc_trace_info(uint32_t *len) +{ + *len = sizeof(rsc_trace_buf); + return rsc_trace_buf; +} + void *get_resource_table (int rsc_id, int *len) { (void) rsc_id; diff --git a/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.h b/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.h index 806312a..7d61ac0 100644 --- a/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.h +++ b/examples/legacy_apps/machine/xlnx/zynqmp_r5/rsc_table.h @@ -34,6 +34,7 @@ struct remote_resource_table { struct fw_rsc_vdev rpmsg_vdev; struct fw_rsc_vdev_vring rpmsg_vring0; struct fw_rsc_vdev_vring rpmsg_vring1; + struct fw_rsc_trace rsc_trace; }__attribute__((packed, aligned(0x100))); struct remote_resource_table_metadata { @@ -44,6 +45,7 @@ struct remote_resource_table_metadata { const uintptr_t rsc_tbl; }__attribute__((packed)); +char *get_rsc_trace_info(uint32_t *len); void *get_resource_table (int rsc_id, int *len); void free_resource_table (void); void restore_initial_rsc_table (void);