From ab8b6311acfa76e41111ec5575e06ab574de67b2 Mon Sep 17 00:00:00 2001 From: Bowen Wang Date: Thu, 5 Sep 2024 19:11:06 +0800 Subject: [PATCH] drivers/rptun_ivshmem: port rptun_ivshmem to the new rptun framework 1. Use reserved[0] filed in struct fw_rsc_vdev and the driver master/slave to judge the device role; 2. Use struct fw_rsc_carveout in resource table to provide the share memory to virtio driver side; Signed-off-by: Bowen Wang --- drivers/rptun/rptun_ivshmem.c | 183 ++++++++++++++++++++++++++-------- 1 file changed, 140 insertions(+), 43 deletions(-) diff --git a/drivers/rptun/rptun_ivshmem.c b/drivers/rptun/rptun_ivshmem.c index b48e8907567..53c30397cd8 100644 --- a/drivers/rptun/rptun_ivshmem.c +++ b/drivers/rptun/rptun_ivshmem.c @@ -45,20 +45,44 @@ container_of(ivshmem_get_driver(dev), struct rptun_ivshmem_dev_s, drv) #define RPTUN_IVSHMEM_SHMEM_BAR 2 -#define RPTUN_IVSHMEM_WDOG_DELAY MSEC2TICK(1) +#define RPTUN_IVSHMEM_SHMEM_SIZE 0x10000 +#define RPTUN_IVSHMEM_WDOG_DELAY USEC2TICK(100) + +#define RPTUN_IVSHMEM_VIRTIO_NUM 3 +#define RPTUN_IVSHMEM_RSC_NUM (2 * RPTUN_IVSHMEM_VIRTIO_NUM) /**************************************************************************** * Private Types ****************************************************************************/ +struct aligned_data(8) rptun_ivshmem_rsc_s +{ + struct resource_table hdr; + uint32_t offset[RPTUN_IVSHMEM_RSC_NUM]; + struct fw_rsc_vdev rng0; + struct fw_rsc_vdev_vring rng0_vring; + struct fw_rsc_carveout rng0_carveout; + char rng0_shm[RPTUN_IVSHMEM_SHMEM_SIZE]; + struct fw_rsc_vdev rng1; + struct fw_rsc_vdev_vring rng1_vring; + struct fw_rsc_carveout rng1_carveout; + char rng1_shm[RPTUN_IVSHMEM_SHMEM_SIZE]; + struct fw_rsc_vdev rpmsg0; + struct fw_rsc_vdev_vring rpmsg0_vring0; + struct fw_rsc_vdev_vring rpmsg0_vring1; + struct fw_rsc_config rpmsg0_config; + struct fw_rsc_carveout rpmsg0_carveout; + char rpmsg0_shm[RPTUN_IVSHMEM_SHMEM_SIZE]; +}; + struct rptun_ivshmem_mem_s { - volatile uint64_t basem; - volatile uint32_t seqs; - volatile uint32_t seqm; - volatile uint32_t reserved; - volatile uint32_t rsc_size; - struct rptun_rsc_s rsc; + volatile uint64_t basem; + volatile uint32_t seqs; + volatile uint32_t seqm; + volatile uint32_t reserved; + volatile uint32_t rsc_size; + struct rptun_ivshmem_rsc_s rsc; }; struct rptun_ivshmem_dev_s @@ -88,7 +112,7 @@ struct rptun_ivshmem_dev_s static const char *rptun_ivshmem_get_cpuname(FAR struct rptun_dev_s *dev); static const FAR struct rptun_addrenv_s * rptun_ivshmem_get_addrenv(FAR struct rptun_dev_s *dev); -static FAR struct rptun_rsc_s * +static FAR struct resource_table * rptun_ivshmem_get_resource(FAR struct rptun_dev_s *dev); static bool rptun_ivshmem_is_autostart(FAR struct rptun_dev_s *dev); static bool rptun_ivshmem_is_master(FAR struct rptun_dev_s *dev); @@ -140,21 +164,16 @@ rptun_ivshmem_get_addrenv(FAR struct rptun_dev_s *dev) return &priv->raddrenv[0]; } -static FAR struct rptun_rsc_s * +static FAR struct resource_table * rptun_ivshmem_get_resource(FAR struct rptun_dev_s *dev) { FAR struct rptun_ivshmem_dev_s *priv = (FAR struct rptun_ivshmem_dev_s *)dev; FAR struct rptun_cmd_s *cmd = RPTUN_RSC2CMD(&priv->shmem->rsc); - priv->raddrenv[0].da = 0; - priv->raddrenv[0].size = priv->shmem_size; - if (priv->master) { - priv->raddrenv[0].pa = (uintptr_t)priv->shmem; - - /* Wait until slave is ready */ + /* Wait until salve is ready */ while (RPTUN_GET_CMD(cmd->cmd_slave) != RPTUN_CMD_READY) { @@ -166,34 +185,109 @@ rptun_ivshmem_get_resource(FAR struct rptun_dev_s *dev) } else { - FAR struct rptun_rsc_s *rsc = &priv->shmem->rsc; + FAR struct rptun_ivshmem_rsc_s *rsc = &priv->shmem->rsc; memset(priv->shmem, 0, priv->shmem_size); - rsc->rsc_tbl_hdr.ver = 1; - rsc->rsc_tbl_hdr.num = 1; - rsc->offset[0] = offsetof(struct rptun_rsc_s, - rpmsg_vdev); - rsc->rpmsg_vdev.type = RSC_VDEV; - rsc->rpmsg_vdev.id = VIRTIO_ID_RPMSG; - rsc->rpmsg_vdev.notifyid = 20; - rsc->rpmsg_vdev.dfeatures = 1 << VIRTIO_RPMSG_F_NS | - 1 << VIRTIO_RPMSG_F_ACK | - 1 << VIRTIO_RPMSG_F_BUFSZ; - rsc->rpmsg_vdev.config_len = sizeof(struct fw_rsc_config); - rsc->rpmsg_vdev.num_of_vrings = 2; - rsc->rpmsg_vring0.da = FW_RSC_U32_ADDR_ANY; - rsc->rpmsg_vring0.align = 8; - rsc->rpmsg_vring0.num = CONFIG_RPTUN_IVSHMEM_BUFFNUM; - rsc->rpmsg_vring0.notifyid = RSC_NOTIFY_ID_ANY; - rsc->rpmsg_vring1.da = FW_RSC_U32_ADDR_ANY; - rsc->rpmsg_vring1.align = 8; - rsc->rpmsg_vring1.num = CONFIG_RPTUN_IVSHMEM_BUFFNUM; - rsc->rpmsg_vring1.notifyid = RSC_NOTIFY_ID_ANY; - rsc->config.r2h_buf_size = CONFIG_RPTUN_IVSHMEM_BUFFSIZE; - rsc->config.h2r_buf_size = CONFIG_RPTUN_IVSHMEM_BUFFSIZE; + rsc->hdr.ver = 1; + rsc->hdr.num = RPTUN_IVSHMEM_RSC_NUM; - priv->shmem->rsc_size = sizeof(struct rptun_rsc_s); - cmd->cmd_slave = RPTUN_CMD(RPTUN_CMD_READY, 0); + /* Virtio Driver 0, VIRTIO_ID_ENTROPY */ + + rsc->offset[0] = offsetof(struct rptun_ivshmem_rsc_s, + rng0); + rsc->rng0.type = RSC_VDEV; + rsc->rng0.id = VIRTIO_ID_ENTROPY; + rsc->rng0.notifyid = RSC_NOTIFY_ID_ANY; + rsc->rng0.dfeatures = 0; + rsc->rng0.config_len = 0; + rsc->rng0.num_of_vrings = 1; + rsc->rng0.reserved[0] = VIRTIO_DEV_DRIVER; + rsc->rng0.reserved[1] = 0; + rsc->rng0_vring.align = 8; + rsc->rng0_vring.num = 8; + rsc->rng0_vring.notifyid = RSC_NOTIFY_ID_ANY; + rsc->rng0_vring.da = 0; + + /* Virtio Rng0 share memory buffer */ + + rsc->offset[1] = offsetof(struct rptun_ivshmem_rsc_s, + rng0_carveout); + rsc->rng0_carveout.type = RSC_CARVEOUT; + rsc->rng0_carveout.da = offsetof(struct rptun_ivshmem_mem_s, + rsc.rng0_shm); + rsc->rng0_carveout.pa = (uint32_t)METAL_BAD_PHYS; + rsc->rng0_carveout.len = sizeof(priv->shmem->rsc.rng0_shm); + memcpy(rsc->rng0_carveout.name, "rng0_shm", 9); + + /* Virtio Driver 1, VIRTIO_ID_ENTROPY */ + + rsc->offset[2] = offsetof(struct rptun_ivshmem_rsc_s, + rng1); + rsc->rng1.type = RSC_VDEV; + rsc->rng1.id = VIRTIO_ID_ENTROPY; + rsc->rng1.notifyid = RSC_NOTIFY_ID_ANY; + rsc->rng1.dfeatures = 0; + rsc->rng1.config_len = 0; + rsc->rng1.num_of_vrings = 1; + rsc->rng1.reserved[0] = VIRTIO_DEV_DRIVER; + rsc->rng1.reserved[1] = 0; + rsc->rng1_vring.align = 8; + rsc->rng1_vring.num = 8; + rsc->rng1_vring.notifyid = RSC_NOTIFY_ID_ANY; + rsc->rng1_vring.da = 0; + + /* Virtio Rng1 share memory buffer */ + + rsc->offset[3] = offsetof(struct rptun_ivshmem_rsc_s, + rng1_carveout); + rsc->rng1_carveout.type = RSC_CARVEOUT; + rsc->rng1_carveout.da = offsetof(struct rptun_ivshmem_mem_s, + rsc.rng1_shm); + rsc->rng1_carveout.pa = (uint32_t)METAL_BAD_PHYS; + rsc->rng1_carveout.len = sizeof(priv->shmem->rsc.rng1_shm); + memcpy(rsc->rng1_carveout.name, "rng1_shm", 9); + + /* Virtio Driver 2, VIRTIO_ID_RPMSG */ + + rsc->offset[4] = offsetof(struct rptun_ivshmem_rsc_s, + rpmsg0); + rsc->rpmsg0.type = RSC_VDEV; + rsc->rpmsg0.id = VIRTIO_ID_RPMSG; + rsc->rpmsg0.notifyid = RSC_NOTIFY_ID_ANY; + rsc->rpmsg0.dfeatures = (1 << VIRTIO_RPMSG_F_NS) | + (1 << VIRTIO_RPMSG_F_ACK) | + (1 << VIRTIO_RPMSG_F_BUFSZ) | + (1 << VIRTIO_RPMSG_F_CPUNAME); + rsc->rpmsg0.config_len = sizeof(struct fw_rsc_config); + rsc->rpmsg0.num_of_vrings = 2; + rsc->rpmsg0.reserved[0] = VIRTIO_DEV_DRIVER; + rsc->rpmsg0.reserved[1] = 0; + rsc->rpmsg0_vring0.align = 8; + rsc->rpmsg0_vring0.num = 8; + rsc->rpmsg0_vring0.notifyid = RSC_NOTIFY_ID_ANY; + rsc->rpmsg0_vring0.da = 0; + rsc->rpmsg0_vring1.align = 8; + rsc->rpmsg0_vring1.num = 8; + rsc->rpmsg0_vring1.notifyid = RSC_NOTIFY_ID_ANY; + rsc->rpmsg0_vring1.da = 0; + rsc->rpmsg0_config.h2r_buf_size = 0x600; + rsc->rpmsg0_config.r2h_buf_size = 0x600; + memcpy(rsc->rpmsg0_config.host_cpuname, "server", 6); + memcpy(rsc->rpmsg0_config.remote_cpuname, "proxy", 5); + + /* Virtio Rpmsg0 share memory buffer */ + + rsc->offset[5] = offsetof(struct rptun_ivshmem_rsc_s, + rpmsg0_carveout); + rsc->rpmsg0_carveout.type = RSC_CARVEOUT; + rsc->rpmsg0_carveout.da = offsetof(struct rptun_ivshmem_mem_s, + rsc.rpmsg0_shm); + rsc->rpmsg0_carveout.pa = (uint32_t)METAL_BAD_PHYS; + rsc->rpmsg0_carveout.len = sizeof(priv->shmem->rsc.rpmsg0_shm); + memcpy(rsc->rpmsg0_carveout.name, "rpmsg0_shm", 10); + + priv->shmem->rsc_size = sizeof(struct rptun_ivshmem_rsc_s); + cmd->cmd_slave = RPTUN_CMD(RPTUN_CMD_READY, 0); /* Wait until master is ready, slave needs to use master base to * initialize addrenv. @@ -204,8 +298,6 @@ rptun_ivshmem_get_resource(FAR struct rptun_dev_s *dev) usleep(1000); } - priv->raddrenv[0].pa = (uintptr_t)priv->shmem->basem; - priv->addrenv[0].va = (uint64_t)(uintptr_t)priv->shmem; priv->addrenv[0].pa = priv->shmem->basem; priv->addrenv[0].size = priv->shmem_size; @@ -213,7 +305,12 @@ rptun_ivshmem_get_resource(FAR struct rptun_dev_s *dev) simple_addrenv_initialize(&priv->addrenv[0]); } - return &priv->shmem->rsc; + priv->raddrenv[0].pa = priv->master ? (uintptr_t)priv->shmem : + (uintptr_t)priv->shmem->basem; + priv->raddrenv[0].da = 0; + priv->raddrenv[0].size = priv->shmem_size; + + return &priv->shmem->rsc.hdr; } static bool rptun_ivshmem_is_autostart(FAR struct rptun_dev_s *dev)