This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 1b24139020e17619ffbe1ad7784ac808d5c944b4 Author: Yongrong Wang <[email protected]> AuthorDate: Wed Jul 10 21:02:42 2024 +0800 virtio-pci/mmio: Features change to 64 bit in all virtio_dispatch and fix compile warning virtio/virtio-pci-legacy.c:399:48: warning: passing argument 2 of ‘pci_bus_write_io_dword’ makes integer from pointer without a cast [-Wint-con> 399 | pci_write_io_dword(vpdev->dev, vpdev->ioaddr + VIRTIO_PCI_GUEST_FEATURES, | ^ | | | void * /home/wyr/work/code/project/vela/nuttx/include/nuttx/pci/pci.h:559:65: note: expected ‘uintptr_t’ {aka ‘long unsigned int’} but argument is of > 559 | int pci_bus_write_io_dword(FAR struct pci_bus_s *bus, uintptr_t where, | ~~~~~~~~~~^~~~~ Signed-off-by: Yongrong Wang <[email protected]> --- drivers/virtio/virtio-mmio.c | 26 +++++++++++++++++--------- drivers/virtio/virtio-pci-legacy.c | 16 +++++++++++----- drivers/virtio/virtio-pci-modern.c | 22 ++++++++++++++-------- drivers/virtio/virtio-pci.c | 4 ++-- drivers/virtio/virtio-pci.h | 4 ++-- include/nuttx/virtio/virtio.h | 2 +- 6 files changed, 47 insertions(+), 27 deletions(-) diff --git a/drivers/virtio/virtio-mmio.c b/drivers/virtio/virtio-mmio.c index b11756ef55..6caeb60f28 100644 --- a/drivers/virtio/virtio-mmio.c +++ b/drivers/virtio/virtio-mmio.c @@ -221,11 +221,11 @@ static void virtio_mmio_write_config(FAR struct virtio_device *vdev, static void virtio_mmio_read_config(FAR struct virtio_device *vdev, uint32_t offset, FAR void *dst, int length); -static uint32_t virtio_mmio_get_features(FAR struct virtio_device *vdev); +static uint64_t virtio_mmio_get_features(FAR struct virtio_device *vdev); static void virtio_mmio_set_features(FAR struct virtio_device *vdev, - uint32_t features); -static uint32_t virtio_mmio_negotiate_features(struct virtio_device *vdev, - uint32_t features); + uint64_t features); +static uint64_t virtio_mmio_negotiate_features(struct virtio_device *vdev, + uint64_t features); static void virtio_mmio_reset_device(FAR struct virtio_device *vdev); static void virtio_mmio_notify(FAR struct virtqueue *vq); @@ -652,13 +652,18 @@ byte_read: * Name: virtio_mmio_get_features ****************************************************************************/ -static uint32_t virtio_mmio_get_features(FAR struct virtio_device *vdev) +static uint64_t virtio_mmio_get_features(FAR struct virtio_device *vdev) { FAR struct virtio_mmio_device_s *vmdev = (FAR struct virtio_mmio_device_s *)vdev; + uint32_t feature_lo; + uint32_t feature_hi; metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 0); - return metal_io_read32(&vmdev->cfg_io, VIRTIO_MMIO_DEVICE_FEATURES); + feature_lo = metal_io_read32(&vmdev->cfg_io, VIRTIO_MMIO_DEVICE_FEATURES); + metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 1); + feature_hi = metal_io_read32(&vmdev->cfg_io, VIRTIO_MMIO_DEVICE_FEATURES); + return ((uint64_t)feature_hi << 32) | (uint64_t)feature_lo; } /**************************************************************************** @@ -666,13 +671,16 @@ static uint32_t virtio_mmio_get_features(FAR struct virtio_device *vdev) ****************************************************************************/ static void virtio_mmio_set_features(FAR struct virtio_device *vdev, - uint32_t features) + uint64_t features) { FAR struct virtio_mmio_device_s *vmdev = (FAR struct virtio_mmio_device_s *)vdev; metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 0); metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES, features); + metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 1); + metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES, + features >> 32); vdev->features = features; } @@ -680,8 +688,8 @@ static void virtio_mmio_set_features(FAR struct virtio_device *vdev, * Name: virtio_mmio_negotiate_features ****************************************************************************/ -static uint32_t virtio_mmio_negotiate_features(struct virtio_device *vdev, - uint32_t features) +static uint64_t virtio_mmio_negotiate_features(struct virtio_device *vdev, + uint64_t features) { features = features & virtio_mmio_get_features(vdev); virtio_mmio_set_features(vdev, features); diff --git a/drivers/virtio/virtio-pci-legacy.c b/drivers/virtio/virtio-pci-legacy.c index 40243c813e..2fa293298a 100644 --- a/drivers/virtio/virtio-pci-legacy.c +++ b/drivers/virtio/virtio-pci-legacy.c @@ -122,10 +122,10 @@ static void virtio_pci_legacy_write_config(FAR struct virtio_device *vdev, static void virtio_pci_legacy_read_config(FAR struct virtio_device *vdev, uint32_t offset, FAR void *dst, int length); -static uint32_t +static uint64_t virtio_pci_legacy_get_features(FAR struct virtio_device *vdev); static void virtio_pci_legacy_set_features(FAR struct virtio_device *vdev, - uint32_t features); + uint64_t features); static void virtio_pci_legacy_notify(FAR struct virtqueue *vq); /**************************************************************************** @@ -367,7 +367,7 @@ static void virtio_pci_legacy_read_config(FAR struct virtio_device *vdev, * Name: virtio_pci_legacy_get_features ****************************************************************************/ -static uint32_t +static uint64_t virtio_pci_legacy_get_features(FAR struct virtio_device *vdev) { FAR struct virtio_pci_device_s *vpdev = @@ -385,14 +385,20 @@ virtio_pci_legacy_get_features(FAR struct virtio_device *vdev) ****************************************************************************/ static void virtio_pci_legacy_set_features(FAR struct virtio_device *vdev, - uint32_t features) + uint64_t features) { FAR struct virtio_pci_device_s *vpdev = (FAR struct virtio_pci_device_s *)vdev; + if ((features >> 32) != 0) + { + features = (uint64_t)((uint32_t)features); + vrtwarn("Virtio pci legacy not support feature bits larger than 32\n"); + } + pci_write_io_dword(vpdev->dev, (uintptr_t)(vpdev->ioaddr + VIRTIO_PCI_GUEST_FEATURES), - vdev->features); + features); vdev->features = features; } diff --git a/drivers/virtio/virtio-pci-modern.c b/drivers/virtio/virtio-pci-modern.c index b3ea09db29..75451eda82 100644 --- a/drivers/virtio/virtio-pci-modern.c +++ b/drivers/virtio/virtio-pci-modern.c @@ -176,10 +176,10 @@ static void virtio_pci_modern_write_config(FAR struct virtio_device *vdev, static void virtio_pci_modern_read_config(FAR struct virtio_device *vdev, uint32_t offset, FAR void *dst, int length); -static uint32_t +static uint64_t virtio_pci_modern_get_features(FAR struct virtio_device *vdev); static void virtio_pci_modern_set_features(FAR struct virtio_device *vdev, - uint32_t features); + uint64_t features); static void virtio_pci_modern_notify(FAR struct virtqueue *vq); /**************************************************************************** @@ -560,17 +560,22 @@ static void virtio_pci_modern_read_config(FAR struct virtio_device *vdev, * Name: virtio_pci_modern_get_features ****************************************************************************/ -static uint32_t +static uint64_t virtio_pci_modern_get_features(FAR struct virtio_device *vdev) { FAR struct virtio_pci_device_s *vpdev = (FAR struct virtio_pci_device_s *)vdev; FAR struct virtio_pci_common_cfg_s *cfg = vpdev->common; - uint32_t feature; + uint32_t feature_lo; + uint32_t feature_hi; pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature_select, 0); - pci_read_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature, &feature); - return feature; + pci_read_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature, + &feature_lo); + pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature_select, 1); + pci_read_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature, + &feature_hi); + return ((uint64_t)feature_hi << 32) | (uint64_t)feature_lo; } /**************************************************************************** @@ -578,7 +583,7 @@ virtio_pci_modern_get_features(FAR struct virtio_device *vdev) ****************************************************************************/ static void virtio_pci_modern_set_features(FAR struct virtio_device *vdev, - uint32_t features) + uint64_t features) { FAR struct virtio_pci_device_s *vpdev = (FAR struct virtio_pci_device_s *)vdev; @@ -587,7 +592,8 @@ static void virtio_pci_modern_set_features(FAR struct virtio_device *vdev, pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature_select, 0); pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature, features); pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature_select, 1); - pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature, 0); + pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature, + features >> 32); vdev->features = features; } diff --git a/drivers/virtio/virtio-pci.c b/drivers/virtio/virtio-pci.c index 126ecb36f7..5c8eafd241 100644 --- a/drivers/virtio/virtio-pci.c +++ b/drivers/virtio/virtio-pci.c @@ -448,9 +448,9 @@ void virtio_pci_delete_virtqueues(FAR struct virtio_device *vdev) * Name: virtio_pci_negotiate_features ****************************************************************************/ -uint32_t +uint64_t virtio_pci_negotiate_features(FAR struct virtio_device *vdev, - uint32_t features) + uint64_t features) { features = features & vdev->func->get_features(vdev); vdev->func->set_features(vdev, features); diff --git a/drivers/virtio/virtio-pci.h b/drivers/virtio/virtio-pci.h index 66a36f9342..67334f7b5e 100644 --- a/drivers/virtio/virtio-pci.h +++ b/drivers/virtio/virtio-pci.h @@ -108,9 +108,9 @@ struct virtio_pci_device_s ****************************************************************************/ void virtio_pci_reset_device(FAR struct virtio_device *vdev); -uint32_t +uint64_t virtio_pci_negotiate_features(FAR struct virtio_device *vdev, - uint32_t features); + uint64_t features); int virtio_pci_create_virtqueues(FAR struct virtio_device *vdev, unsigned int flags, unsigned int nvqs, diff --git a/include/nuttx/virtio/virtio.h b/include/nuttx/virtio/virtio.h index 3f6b46f9e9..92f039af81 100644 --- a/include/nuttx/virtio/virtio.h +++ b/include/nuttx/virtio/virtio.h @@ -48,7 +48,7 @@ /* Virtio helper functions */ #define virtio_has_feature(vdev, fbit) \ - (((vdev)->features & (1UL << (fbit))) != 0) + (((vdev)->features & (1ULL << (fbit))) != 0) #define virtio_read_config_member(vdev, structname, member, ptr) \ virtio_read_config((vdev), offsetof(structname, member), \
