From 8c8e837230040fcbc261c7763e5f62f2e20b9fa2 Mon Sep 17 00:00:00 2001 From: wangzhi16 Date: Wed, 9 Apr 2025 10:57:37 +0800 Subject: [PATCH] arch/*_rptun.c: port all the chip's rptun driver to new rptun framework New rptun framework need provide the carveout device to provide the share memmory. And need add the cpuname feature for rpmsg virtio device to let rpmsg virtio can know remote cpuname. Signed-off-by: wangzhi16 Signed-off-by: Bowen Wang --- arch/arm/src/imx9/imx9_rptun.c | 10 +++++---- arch/arm/src/imx9/imx9_rsctable.c | 9 +++++--- arch/arm/src/mx8mp/mx8mp_rptun.c | 9 ++++---- arch/arm/src/mx8mp/mx8mp_rsctable.c | 12 ++++++---- arch/arm/src/nrf53/nrf53_rptun.c | 30 ++++++++++++++++++++----- arch/arm/src/stm32h7/stm32_rptun.c | 30 ++++++++++++++++++++----- arch/risc-v/src/k230/k230_rptun.c | 30 ++++++++++++++++++++----- arch/risc-v/src/mpfs/mpfs_ihc.c | 23 +++++++++++++------ arch/risc-v/src/qemu-rv/qemu_rv_rptun.c | 30 ++++++++++++++++++++----- 9 files changed, 137 insertions(+), 46 deletions(-) diff --git a/arch/arm/src/imx9/imx9_rptun.c b/arch/arm/src/imx9/imx9_rptun.c index c80093beac3..c221c82a5a7 100644 --- a/arch/arm/src/imx9/imx9_rptun.c +++ b/arch/arm/src/imx9/imx9_rptun.c @@ -80,7 +80,8 @@ static const char *imx9_rptun_get_cpuname(struct rptun_dev_s *dev); static const char *imx9_rptun_get_firmware(struct rptun_dev_s *dev); static const struct rptun_addrenv_s * imx9_rptun_get_addrenv(struct rptun_dev_s *dev); -static struct rptun_rsc_s *imx9_rptun_get_resource(struct rptun_dev_s *dev); +static struct resource_table * +imx9_rptun_get_resource(struct rptun_dev_s *dev); static bool imx9_rptun_is_autostart(struct rptun_dev_s *dev); static bool imx9_rptun_is_master(struct rptun_dev_s *dev); static int imx9_rptun_start(struct rptun_dev_s *dev); @@ -149,14 +150,15 @@ imx9_rptun_get_addrenv(struct rptun_dev_s *dev) * Name: imx9_rptun_get_resource ****************************************************************************/ -static struct rptun_rsc_s *imx9_rptun_get_resource(struct rptun_dev_s *dev) +static struct resource_table * +imx9_rptun_get_resource(struct rptun_dev_s *dev) { struct imx9_rptun_dev_s *priv = container_of(dev, struct imx9_rptun_dev_s, rptun); if (priv->shmem != NULL) { - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } priv->shmem = (struct imx9_rptun_shmem_s *)VRING_SHMEM; @@ -166,7 +168,7 @@ static struct rptun_rsc_s *imx9_rptun_get_resource(struct rptun_dev_s *dev) imx9_rsctable_copy(); } - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } /**************************************************************************** diff --git a/arch/arm/src/imx9/imx9_rsctable.c b/arch/arm/src/imx9/imx9_rsctable.c index 70f54caaf1a..937f6ff7e08 100644 --- a/arch/arm/src/imx9/imx9_rsctable.c +++ b/arch/arm/src/imx9/imx9_rsctable.c @@ -27,6 +27,7 @@ #include "imx9_rsctable.h" #include +#include /**************************************************************************** * Pre-processor Definitions @@ -40,7 +41,8 @@ #define RESOURCE_TABLE_BASE 0x88220000 #define NO_RESOURCE_ENTRIES (1) -#define RSC_VDEV_FEATURE_NS (1) /* Support name service announcement */ +#define RSC_VDEV_FEATURE (1 << VIRTIO_RPMSG_F_NS | \ + 1 << VIRTIO_RPMSG_F_CPUNAME) #define IMX9_RSC_TABLE_VERSION (1) /**************************************************************************** @@ -81,7 +83,7 @@ const struct rptun_rsc_s g_imx9_rsc_table = RSC_VDEV, 7, 2, - RSC_VDEV_FEATURE_NS, + RSC_VDEV_FEATURE, 0, 0, 0, @@ -111,7 +113,8 @@ const struct rptun_rsc_s g_imx9_rsc_table = .config = { - 0 + .host_cpuname = "netcore", + .remote_cpuname = "nuttx" } }; diff --git a/arch/arm/src/mx8mp/mx8mp_rptun.c b/arch/arm/src/mx8mp/mx8mp_rptun.c index 666d93009a8..0cee2454a5c 100644 --- a/arch/arm/src/mx8mp/mx8mp_rptun.c +++ b/arch/arm/src/mx8mp/mx8mp_rptun.c @@ -84,7 +84,7 @@ static const char *mx8mp_rptun_get_cpuname(struct rptun_dev_s *dev); static const char *mx8mp_rptun_get_firmware(struct rptun_dev_s *dev); static const struct rptun_addrenv_s * mx8mp_rptun_get_addrenv(struct rptun_dev_s *dev); -static struct rptun_rsc_s * +static struct resource_table * mx8mp_rptun_get_resource(struct rptun_dev_s *dev); static bool mx8mp_rptun_is_autostart(struct rptun_dev_s *dev); static bool mx8mp_rptun_is_master(struct rptun_dev_s *dev); @@ -154,14 +154,15 @@ mx8mp_rptun_get_addrenv(struct rptun_dev_s *dev) * Name: mx8mp_rptun_get_resource ****************************************************************************/ -static struct rptun_rsc_s *mx8mp_rptun_get_resource(struct rptun_dev_s *dev) +static struct resource_table * +mx8mp_rptun_get_resource(struct rptun_dev_s *dev) { struct mx8mp_rptun_dev_s *priv = container_of(dev, struct mx8mp_rptun_dev_s, rptun); if (priv->shmem != NULL) { - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } priv->shmem = (struct mx8mp_rptun_shmem_s *)VRING_SHMEM; @@ -171,7 +172,7 @@ static struct rptun_rsc_s *mx8mp_rptun_get_resource(struct rptun_dev_s *dev) mx8mp_copy_rsc_table(); } - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } /**************************************************************************** diff --git a/arch/arm/src/mx8mp/mx8mp_rsctable.c b/arch/arm/src/mx8mp/mx8mp_rsctable.c index 0210b147442..0a3fc9742fc 100644 --- a/arch/arm/src/mx8mp/mx8mp_rsctable.c +++ b/arch/arm/src/mx8mp/mx8mp_rsctable.c @@ -26,6 +26,8 @@ #include "mx8mp_rsctable.h" #include +#include +#include /**************************************************************************** * Pre-processor Definitions @@ -39,7 +41,8 @@ #define VRING_SIZE 0x8000 #define NO_RESOURCE_ENTRIES (1) -#define RSC_VDEV_FEATURE_NS (1) /* Support name service announcement */ +#define RSC_VDEV_FEATURE (1 << VIRTIO_RPMSG_F_NS | \ + 1 << VIRTIO_RPMSG_F_CPUNAME) #define MX8MP_RSC_TABLE_VERSION (1) /**************************************************************************** @@ -80,7 +83,7 @@ const struct rptun_rsc_s g_mx8mp_rsc_table = RSC_VDEV, 7, 2, - RSC_VDEV_FEATURE_NS, + RSC_VDEV_FEATURE, 0, 0, 0, @@ -110,8 +113,9 @@ const struct rptun_rsc_s g_mx8mp_rsc_table = .config = { - 0 - } + .host_cpuname = "netcore", + .remote_cpuname = "nuttx", + }, }; /**************************************************************************** diff --git a/arch/arm/src/nrf53/nrf53_rptun.c b/arch/arm/src/nrf53/nrf53_rptun.c index c99315abb9f..1f0d49a7366 100644 --- a/arch/arm/src/nrf53/nrf53_rptun.c +++ b/arch/arm/src/nrf53/nrf53_rptun.c @@ -102,7 +102,7 @@ struct nrf53_rptun_dev_s ****************************************************************************/ static const char *nrf53_rptun_get_cpuname(struct rptun_dev_s *dev); -static struct rptun_rsc_s * +static struct resource_table * nrf53_rptun_get_resource(struct rptun_dev_s *dev); static bool nrf53_rptun_is_autostart(struct rptun_dev_s *dev); static bool nrf53_rptun_is_master(struct rptun_dev_s *dev); @@ -167,7 +167,7 @@ static const char *nrf53_rptun_get_cpuname(struct rptun_dev_s *dev) * Name: nrf53_rptun_get_resource ****************************************************************************/ -static struct rptun_rsc_s * +static struct resource_table * nrf53_rptun_get_resource(struct rptun_dev_s *dev) { struct nrf53_rptun_dev_s *priv = container_of(dev, @@ -176,7 +176,7 @@ nrf53_rptun_get_resource(struct rptun_dev_s *dev) if (priv->shmem != NULL) { - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } #ifdef CONFIG_NRF53_APPCORE @@ -194,7 +194,7 @@ nrf53_rptun_get_resource(struct rptun_dev_s *dev) priv->shmem->base = (uintptr_t)priv->shmem; rsc->rsc_tbl_hdr.ver = 1; - rsc->rsc_tbl_hdr.num = 1; + rsc->rsc_tbl_hdr.num = 2; rsc->rsc_tbl_hdr.reserved[0] = 0; rsc->rsc_tbl_hdr.reserved[1] = 0; rsc->offset[0] = offsetof(struct rptun_rsc_s, @@ -204,7 +204,8 @@ nrf53_rptun_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vdev.id = VIRTIO_ID_RPMSG; rsc->rpmsg_vdev.dfeatures = 1 << VIRTIO_RPMSG_F_NS | 1 << VIRTIO_RPMSG_F_ACK - | 1 << VIRTIO_RPMSG_F_BUFSZ; + | 1 << VIRTIO_RPMSG_F_BUFSZ + | 1 << VIRTIO_RPMSG_F_CPUNAME; rsc->rpmsg_vdev.config_len = sizeof(struct fw_rsc_config); rsc->rpmsg_vdev.num_of_vrings = VRINGS; @@ -216,6 +217,23 @@ nrf53_rptun_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vring1.notifyid = VRING1_NOTIFYID; rsc->config.r2h_buf_size = VRING_SIZE; rsc->config.h2r_buf_size = VRING_SIZE; + strlcpy((char *)rsc->config.host_cpuname, "appcore", + VIRTIO_RPMSG_CPUNAME_SIZE); + strlcpy((char *)rsc->config.remote_cpuname, "netcore", + VIRTIO_RPMSG_CPUNAME_SIZE); + + /* Carveout, reserved 512 for vring descriptors and memory + * management header + */ + + rsc->offset[1] = offsetof(struct rptun_rsc_s, + carveout); + rsc->carveout.type = RSC_CARVEOUT; + rsc->carveout.da = (uintptr_t)rsc + ALIGN_UP(sizeof + (struct rptun_rsc_s), VRING_ALIGN); + rsc->carveout.pa = FW_RSC_U32_ADDR_ANY; + rsc->carveout.len = VRING_SIZE * VRING_NR * VRINGS + 512; + memcpy(rsc->carveout.name, "vdev0buffer", 11); } else { @@ -227,7 +245,7 @@ nrf53_rptun_get_resource(struct rptun_dev_s *dev) } } - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } /**************************************************************************** diff --git a/arch/arm/src/stm32h7/stm32_rptun.c b/arch/arm/src/stm32h7/stm32_rptun.c index 0c9584a8079..4646171defa 100644 --- a/arch/arm/src/stm32h7/stm32_rptun.c +++ b/arch/arm/src/stm32h7/stm32_rptun.c @@ -108,7 +108,7 @@ struct stm32_rptun_dev_s ****************************************************************************/ static const char *stm32_rptun_get_cpuname(struct rptun_dev_s *dev); -static struct rptun_rsc_s * +static struct resource_table * stm32_rptun_get_resource(struct rptun_dev_s *dev); static bool stm32_rptun_is_autostart(struct rptun_dev_s *dev); static bool stm32_rptun_is_master(struct rptun_dev_s *dev); @@ -173,7 +173,7 @@ static const char *stm32_rptun_get_cpuname(struct rptun_dev_s *dev) * Name: stm32_rptun_get_resource ****************************************************************************/ -static struct rptun_rsc_s * +static struct resource_table * stm32_rptun_get_resource(struct rptun_dev_s *dev) { struct stm32_rptun_dev_s *priv = container_of(dev, @@ -182,7 +182,7 @@ stm32_rptun_get_resource(struct rptun_dev_s *dev) if (priv->shmem != NULL) { - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } #ifdef CONFIG_ARCH_CHIP_STM32H7_CORTEXM7 @@ -197,7 +197,7 @@ stm32_rptun_get_resource(struct rptun_dev_s *dev) rsc = &priv->shmem->rsc; rsc->rsc_tbl_hdr.ver = 1; - rsc->rsc_tbl_hdr.num = 1; + rsc->rsc_tbl_hdr.num = 2; rsc->rsc_tbl_hdr.reserved[0] = 0; rsc->rsc_tbl_hdr.reserved[1] = 0; rsc->offset[0] = offsetof(struct rptun_rsc_s, @@ -207,7 +207,8 @@ stm32_rptun_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vdev.id = VIRTIO_ID_RPMSG; rsc->rpmsg_vdev.dfeatures = 1 << VIRTIO_RPMSG_F_NS | 1 << VIRTIO_RPMSG_F_ACK - | 1 << VIRTIO_RPMSG_F_BUFSZ; + | 1 << VIRTIO_RPMSG_F_BUFSZ + | 1 << VIRTIO_RPMSG_F_CPUNAME; rsc->rpmsg_vdev.config_len = sizeof(struct fw_rsc_config); rsc->rpmsg_vdev.num_of_vrings = VRINGS; @@ -219,6 +220,23 @@ stm32_rptun_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vring1.notifyid = VRING1_NOTIFYID; rsc->config.r2h_buf_size = VRING_SIZE; rsc->config.h2r_buf_size = VRING_SIZE; + strlcpy((char *)rsc->config.host_cpuname, "cm7", + VIRTIO_RPMSG_CPUNAME_SIZE); + strlcpy((char *)rsc->config.remote_cpuname, "cm4", + VIRTIO_RPMSG_CPUNAME_SIZE); + + /* Carveout, reserved 512 for vrings descriptors and memory + * management header + */ + + rsc->offset[1] = offsetof(struct rptun_rsc_s, + carveout); + rsc->carveout.type = RSC_CARVEOUT; + rsc->carveout.da = (uintptr_t)rsc + ALIGN_UP(sizeof + (struct rptun_rsc_s), VRING_ALIGN); + rsc->carveout.pa = FW_RSC_U32_ADDR_ANY; + rsc->carveout.len = VRING_SIZE * VRING_NR * VRINGS + 512; + memcpy(rsc->carveout.name, "vdev0buffer", 11); priv->shmem->base = (uintptr_t)priv->shmem; } @@ -232,7 +250,7 @@ stm32_rptun_get_resource(struct rptun_dev_s *dev) } } - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } /**************************************************************************** diff --git a/arch/risc-v/src/k230/k230_rptun.c b/arch/risc-v/src/k230/k230_rptun.c index 810a778d533..b740dafccb2 100644 --- a/arch/risc-v/src/k230/k230_rptun.c +++ b/arch/risc-v/src/k230/k230_rptun.c @@ -132,7 +132,7 @@ struct k230_rptun_dev_s ****************************************************************************/ static const char *rp_get_cpuname(struct rptun_dev_s *dev); -static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev); +static struct resource_table *rp_get_resource(struct rptun_dev_s *dev); static bool rp_is_autostart(struct rptun_dev_s *dev); static bool rp_is_master(struct rptun_dev_s *dev); static int rp_start(struct rptun_dev_s *dev); @@ -173,14 +173,14 @@ static const char *rp_get_cpuname(struct rptun_dev_s *dev) return priv->peername; } -static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) +static struct resource_table *rp_get_resource(struct rptun_dev_s *dev) { struct k230_rptun_dev_s *priv = as_k230_rptun_dev(dev); struct rptun_rsc_s *rsc; if (priv->shmem != NULL) { - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } priv->shmem = SHMEM; @@ -192,7 +192,7 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) rsc = &priv->shmem->rsc; rsc->rsc_tbl_hdr.ver = 1; - rsc->rsc_tbl_hdr.num = 1; + rsc->rsc_tbl_hdr.num = 2; rsc->rsc_tbl_hdr.reserved[0] = 0; rsc->rsc_tbl_hdr.reserved[1] = 0; rsc->offset[0] = offsetof(struct rptun_rsc_s, @@ -202,7 +202,8 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vdev.id = VIRTIO_ID_RPMSG; rsc->rpmsg_vdev.dfeatures = 1 << VIRTIO_RPMSG_F_NS | 1 << VIRTIO_RPMSG_F_ACK - | 1 << VIRTIO_RPMSG_F_BUFSZ; + | 1 << VIRTIO_RPMSG_F_BUFSZ + | 1 << VIRTIO_RPMSG_F_CPUNAME; rsc->rpmsg_vdev.config_len = sizeof(struct fw_rsc_config); rsc->rpmsg_vdev.num_of_vrings = VRINGS; @@ -214,6 +215,23 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vring1.notifyid = VRING1_NOTIFYID; rsc->config.r2h_buf_size = VRING_SIZE; rsc->config.h2r_buf_size = VRING_SIZE; + strlcpy((char *)rsc->config.host_cpuname, "master", + VIRTIO_RPMSG_CPUNAME_SIZE); + strlcpy((char *)rsc->config.remote_cpuname, "remote", + VIRTIO_RPMSG_CPUNAME_SIZE); + + /* Carveout, reserved 512 for vrings descriptors and memory + * management header + */ + + rsc->offset[1] = offsetof(struct rptun_rsc_s, + carveout); + rsc->carveout.type = RSC_CARVEOUT; + rsc->carveout.da = (uintptr_t)rsc + ALIGN_UP(sizeof + (struct rptun_rsc_s), VRING_ALIGN); + rsc->carveout.pa = FW_RSC_U32_ADDR_ANY; + rsc->carveout.len = VRING_SIZE * VRING_NR * VRINGS + 512; + memcpy(rsc->carveout.name, "vdev0buffer", 11); priv->shmem->base = (uintptr_t)priv->shmem; @@ -232,7 +250,7 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) rpinfo("shmem:%lx, dev:%p\n", priv->shmem->base, dev); } - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } static bool rp_is_autostart(struct rptun_dev_s *dev) diff --git a/arch/risc-v/src/mpfs/mpfs_ihc.c b/arch/risc-v/src/mpfs/mpfs_ihc.c index 84dcd92a258..8da7a169b5f 100644 --- a/arch/risc-v/src/mpfs/mpfs_ihc.c +++ b/arch/risc-v/src/mpfs/mpfs_ihc.c @@ -81,7 +81,7 @@ /* rptun initialization names */ -#define MPFS_RPTUN_CPU_NAME "mpfs-ihc" +#define MPFS_RPTUN_CPU_NAME "mpfsihc" /* Vring configuration parameters */ @@ -147,7 +147,8 @@ struct mpfs_ihc_work_arg_s ****************************************************************************/ static const char *mpfs_rptun_get_cpuname(struct rptun_dev_s *dev); -static struct rptun_rsc_s *mpfs_rptun_get_resource(struct rptun_dev_s *dev); +static struct resource_table * +mpfs_rptun_get_resource(struct rptun_dev_s *dev); static bool mpfs_rptun_is_autostart(struct rptun_dev_s *dev); static bool mpfs_rptun_is_master(struct rptun_dev_s *dev); static int mpfs_rptun_start(struct rptun_dev_s *dev); @@ -845,7 +846,7 @@ static const char *mpfs_rptun_get_cpuname(struct rptun_dev_s *dev) * ****************************************************************************/ -static struct rptun_rsc_s * +static struct resource_table * mpfs_rptun_get_resource(struct rptun_dev_s *dev) { struct mpfs_rptun_dev_s *priv = container_of(dev, @@ -857,7 +858,7 @@ mpfs_rptun_get_resource(struct rptun_dev_s *dev) if (priv->shmem != NULL) { - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } else { @@ -876,10 +877,12 @@ mpfs_rptun_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vdev.id = VIRTIO_ID_RPMSG; rsc->rpmsg_vdev.notifyid = VDEV_NOTIFYID; rsc->rpmsg_vdev.dfeatures = 1 << VIRTIO_RPMSG_F_NS | - 1 << VIRTIO_RPMSG_F_ACK; + 1 << VIRTIO_RPMSG_F_ACK | + 1 << VIRTIO_RPMSG_F_CPUNAME; rsc->rpmsg_vdev.gfeatures = 1 << VIRTIO_RPMSG_F_NS | - 1 << VIRTIO_RPMSG_F_ACK; + 1 << VIRTIO_RPMSG_F_ACK | + 1 << VIRTIO_RPMSG_F_CPUNAME; /* If the master is up already, don't clear the status here */ @@ -888,6 +891,8 @@ mpfs_rptun_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vdev.status = 0; } + rsc->rpmsg_vdev.reserved[0] = VIRTIO_DEV_DRIVER; + rsc->rpmsg_vdev.reserved[1] = 0; rsc->rpmsg_vdev.config_len = sizeof(struct fw_rsc_config); rsc->rpmsg_vdev.num_of_vrings = VRINGS; rsc->rpmsg_vring0.align = VRING_ALIGN; @@ -900,6 +905,10 @@ mpfs_rptun_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vring1.notifyid = VRING1_NOTIFYID; rsc->config.r2h_buf_size = VRING_SIZE; rsc->config.h2r_buf_size = VRING_SIZE; + strlcpy((char *)rsc->config.host_cpuname, MPFS_RPTUN_CPU_NAME, + VIRTIO_RPMSG_CPUNAME_SIZE); + strlcpy((char *)rsc->config.remote_cpuname, "nuttx", + VIRTIO_RPMSG_CPUNAME_SIZE); } /* It might be tempting to set this at mpfs_rptun_start(), but it's only @@ -914,7 +923,7 @@ mpfs_rptun_get_resource(struct rptun_dev_s *dev) up_enable_irq(g_plic_irq); - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } /**************************************************************************** diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_rptun.c b/arch/risc-v/src/qemu-rv/qemu_rv_rptun.c index 5c4bdc21fff..8eb1d727057 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_rptun.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_rptun.c @@ -117,7 +117,7 @@ struct qemu_rptun_dev_s ****************************************************************************/ static const char *rp_get_cpuname(struct rptun_dev_s *dev); -static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev); +static struct resource_table *rp_get_resource(struct rptun_dev_s *dev); static bool rp_is_autostart(struct rptun_dev_s *dev); static bool rp_is_master(struct rptun_dev_s *dev); static int rp_start(struct rptun_dev_s *dev); @@ -201,14 +201,14 @@ static const char *rp_get_cpuname(struct rptun_dev_s *dev) return priv->peername; } -static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) +static struct resource_table *rp_get_resource(struct rptun_dev_s *dev) { struct qemu_rptun_dev_s *priv = as_qemu_rptun_dev(dev); struct rptun_rsc_s *rsc; if (priv->shmem != NULL) { - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } priv->shmem = SHMEM + CONFIG_QEMU_RPTUN_SHM_SIZE * priv->ndx; @@ -220,7 +220,7 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) rsc = &priv->shmem->rsc; rsc->rsc_tbl_hdr.ver = 1; - rsc->rsc_tbl_hdr.num = 1; + rsc->rsc_tbl_hdr.num = 2; rsc->rsc_tbl_hdr.reserved[0] = 0; rsc->rsc_tbl_hdr.reserved[1] = 0; rsc->offset[0] = offsetof(struct rptun_rsc_s, @@ -230,7 +230,8 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vdev.id = VIRTIO_ID_RPMSG; rsc->rpmsg_vdev.dfeatures = 1 << VIRTIO_RPMSG_F_NS | 1 << VIRTIO_RPMSG_F_ACK - | 1 << VIRTIO_RPMSG_F_BUFSZ; + | 1 << VIRTIO_RPMSG_F_BUFSZ + | 1 << VIRTIO_RPMSG_F_CPUNAME; rsc->rpmsg_vdev.config_len = sizeof(struct fw_rsc_config); rsc->rpmsg_vdev.num_of_vrings = VRINGS; @@ -242,6 +243,23 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) rsc->rpmsg_vring1.notifyid = VRING1_NOTIFYID; rsc->config.r2h_buf_size = VRING_SIZE; rsc->config.h2r_buf_size = VRING_SIZE; + strlcpy((char *)rsc->config.host_cpuname, "master", + VIRTIO_RPMSG_CPUNAME_SIZE); + snprintf((char *)rsc->config.remote_cpuname, VIRTIO_RPMSG_CPUNAME_SIZE, + "remote%d", priv->ndx + 1); + + /* Carveout, reserved 512 for vrings descriptors and memory + * management header + */ + + rsc->offset[1] = offsetof(struct rptun_rsc_s, + carveout); + rsc->carveout.type = RSC_CARVEOUT; + rsc->carveout.da = (uintptr_t)rsc + ALIGN_UP(sizeof + (struct rptun_rsc_s), VRING_ALIGN); + rsc->carveout.pa = FW_RSC_U32_ADDR_ANY; + rsc->carveout.len = VRING_SIZE * VRING_NR * VRINGS + 512; + memcpy(rsc->carveout.name, "vdev0buffer", 11); priv->shmem->base = (uintptr_t)priv->shmem; } @@ -258,7 +276,7 @@ static struct rptun_rsc_s *rp_get_resource(struct rptun_dev_s *dev) } rpinfo("shmem:%p, dev:%p\n", (void *)priv->shmem->base, dev); - return &priv->shmem->rsc; + return &priv->shmem->rsc.rsc_tbl_hdr; } static bool rp_is_autostart(struct rptun_dev_s *dev)