| /* |
| * Copyright (c) 2021 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #define SHM_DEVICE_NAME "sram0.shm" |
| |
| #define RPMSG_VQ_0 (0) /* TX virtqueue queue index */ |
| #define RPMSG_VQ_1 (1) /* RX virtqueue queue index */ |
| #define VRING_COUNT (2) /* Number of used vring buffers. */ |
| |
| #define IPC_INSTANCE_COUNT (CONFIG_RPMSG_MULTI_INSTANCES_NO) /* Number of IPC instances.*/ |
| |
| /* Private macros. */ |
| #define VRING_DESC_SIZEOF(num) ((num) * (sizeof(struct vring_desc))) |
| #define VRING_AVAIL_SIZEOF(num) (sizeof(struct vring_avail) + \ |
| ((num) * sizeof(uint16_t)) + sizeof(uint16_t)) |
| #define VRING_USED_SIZEOF(num) (sizeof(struct vring_used) + \ |
| ((num) * sizeof(struct vring_used_elem)) + \ |
| sizeof(uint16_t)) |
| |
| #define VRING_FIRST_SUM(num) (VRING_DESC_SIZEOF(num) + VRING_AVAIL_SIZEOF(num)) |
| |
| |
| /* Compute size of vring buffer based on its size and alignment. */ |
| #define VRING_SIZE_COMPUTE(vring_size, align) (ROUND_UP(VRING_FIRST_SUM((vring_size)), \ |
| (align)) + VRING_USED_SIZEOF((vring_size))) |
| |
| /* Macro for calculating used memory by virtqueue buffers for remote device. */ |
| #define VIRTQUEUE_SIZE_GET(vring_size) (RPMSG_BUFFER_SIZE * (vring_size)) |
| |
| /* Macro for getting the size of shared memory occupied by single IPC instance. */ |
| #define SHMEM_INST_SIZE_GET(vring_size) (VDEV_STATUS_SIZE + \ |
| (VRING_COUNT * VIRTQUEUE_SIZE_GET((vring_size))) + \ |
| (VRING_COUNT * VRING_SIZE_COMPUTE((vring_size), \ |
| (VRING_ALIGNMENT)))) |
| |
| /* Returns size of used shared memory consumed by all IPC instances*/ |
| #define SHMEM_CONSUMED_SIZE_GET(vring_size) (IPC_INSTANCE_COUNT * \ |
| SHMEM_INST_SIZE_GET((vring_size))) |
| |
| /* Returns maximum allowable size of vring buffers to fit memory requirements. */ |
| #define VRING_SIZE_GET(shmem_size) ((SHMEM_CONSUMED_SIZE_GET(32)) < (shmem_size) ? 32 : \ |
| (SHMEM_CONSUMED_SIZE_GET(16)) < (shmem_size) ? 16 : \ |
| (SHMEM_CONSUMED_SIZE_GET(8)) < (shmem_size) ? 8 : \ |
| (SHMEM_CONSUMED_SIZE_GET(4)) < (shmem_size) ? 4 : \ |
| (SHMEM_CONSUMED_SIZE_GET(2)) < (shmem_size) ? 2 : 1) |
| |
| /* Returns size of used shared memory of single instance in case of using |
| * maximum allowable vring buffer size. |
| */ |
| #define SHMEM_INST_SIZE_AUTOALLOC_GET(shmem_size) \ |
| (SHMEM_INST_SIZE_GET(VRING_SIZE_GET((shmem_size)))) |
| |
| /* Returns start address of ipc instance in shared memory. It assumes that |
| * maximum allowable vring buffer size is used. |
| */ |
| #define SHMEM_INST_ADDR_AUTOALLOC_GET(shmem_addr, shmem_size, id) \ |
| ((shmem_addr) + \ |
| ((id) * (SHMEM_INST_SIZE_AUTOALLOC_GET(shmem_size)))) |
| |
| #ifdef CONFIG_RPMSG_MULTI_INSTANCE_MASTER |
| #define VIRTQUEUE_ID (0) |
| #else |
| #define VIRTQUEUE_ID (1) |
| #endif |