1 /* 2 * Copyright (c) 2020 STMicroelectronics 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef RESOURCE_TABLE_H__ 8 #define RESOURCE_TABLE_H__ 9 10 #include <openamp/remoteproc.h> 11 #include <openamp/virtio.h> 12 13 #ifdef __cplusplus 14 extern "C" { 15 #endif 16 17 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0) 18 19 #define VDEV_ID 0xFF 20 #define VRING0_ID CONFIG_OPENAMP_RSC_TABLE_IPM_RX_ID /* (host to remote) */ 21 #define VRING1_ID CONFIG_OPENAMP_RSC_TABLE_IPM_TX_ID /* (remote to host) */ 22 23 #define VRING_COUNT 2 24 #define RPMSG_IPU_C0_FEATURES 1 25 26 #define VRING_RX_ADDRESS -1 /* allocated by Master processor */ 27 #define VRING_TX_ADDRESS -1 /* allocated by Master processor */ 28 #define VRING_BUFF_ADDRESS -1 /* allocated by Master processor */ 29 #define VRING_ALIGNMENT 16 /* fixed to match with Linux constraint */ 30 31 #endif 32 33 enum rsc_table_entries { 34 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0) 35 RSC_TABLE_VDEV_ENTRY, 36 #endif 37 #if defined(CONFIG_RAM_CONSOLE) 38 RSC_TABLE_TRACE_ENTRY, 39 #endif 40 RSC_TABLE_NUM_ENTRY 41 }; 42 43 struct fw_resource_table { 44 struct resource_table hdr; 45 uint32_t offset[RSC_TABLE_NUM_ENTRY]; 46 47 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0) 48 struct fw_rsc_vdev vdev; 49 struct fw_rsc_vdev_vring vring0; 50 struct fw_rsc_vdev_vring vring1; 51 #endif 52 53 #if defined(CONFIG_RAM_CONSOLE) 54 /* rpmsg trace entry */ 55 struct fw_rsc_trace cm_trace; 56 #endif 57 } METAL_PACKED_END; 58 59 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0) 60 #define VDEV_OFFSET offsetof(struct fw_resource_table, vdev), 61 #else 62 #define VDEV_OFFSET 63 #endif 64 65 #if defined(CONFIG_RAM_CONSOLE) 66 #define CM_TRACE_OFFSET offsetof(struct fw_resource_table, cm_trace), 67 #else 68 #define CM_TRACE_OFFSET 69 #endif 70 71 #define VDEV_ENTRY_HELPER(x) \ 72 .vdev = {RSC_VDEV, VIRTIO_ID_RPMSG, 0, RPMSG_IPU_C0_FEATURES, 0, 0, 0, \ 73 VRING_COUNT, {0, 0},}, \ 74 .vring0 = {VRING_TX_ADDRESS, VRING_ALIGNMENT, x, VRING0_ID, 0}, \ 75 .vring1 = {VRING_RX_ADDRESS, VRING_ALIGNMENT, x, VRING1_ID, 0}, 76 77 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0) 78 #define VDEV_ENTRY \ 79 VDEV_ENTRY_HELPER(CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF) 80 #else 81 #define VDEV_ENTRY 82 #endif 83 84 #if defined(CONFIG_RAM_CONSOLE) 85 #define CM_TRACE_ENTRY \ 86 .cm_trace = { \ 87 RSC_TRACE, \ 88 (uint32_t)ram_console_buf, CONFIG_RAM_CONSOLE_BUFFER_SIZE, 0,\ 89 "Zephyr_log", \ 90 }, 91 #else 92 #define CM_TRACE_ENTRY 93 #endif 94 95 #define RESOURCE_TABLE_INIT \ 96 { \ 97 .hdr = { \ 98 .ver = 1, \ 99 .num = RSC_TABLE_NUM_ENTRY, \ 100 }, \ 101 .offset = { \ 102 VDEV_OFFSET \ 103 CM_TRACE_OFFSET \ 104 }, \ 105 VDEV_ENTRY \ 106 CM_TRACE_ENTRY \ 107 } 108 109 void rsc_table_get(void **table_ptr, int *length); 110 111 #if (CONFIG_OPENAMP_RSC_TABLE_NUM_RPMSG_BUFF > 0) 112 struct fw_rsc_vdev *rsc_table_to_vdev(void *rsc_table); 113 struct fw_rsc_vdev_vring *rsc_table_get_vring0(void *rsc_table); 114 struct fw_rsc_vdev_vring *rsc_table_get_vring1(void *rsc_table); 115 #endif 116 117 #ifdef __cplusplus 118 } 119 #endif 120 121 #endif 122