lkml.org 
[lkml]   [2021]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V3 11/19] virtio-pci-modern: introduce helper to set/get queue_enable
    Date
    This patch introduces a helper to set/get queue_enable for modern device.

    Signed-off-by: Jason Wang <jasowang@redhat.com>
    ---
    drivers/virtio/virtio_pci_modern.c | 37 +++++++++++++++++++++++++-----
    1 file changed, 31 insertions(+), 6 deletions(-)

    diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
    index 05b21e18f46c..0e62820b83ff 100644
    --- a/drivers/virtio/virtio_pci_modern.c
    +++ b/drivers/virtio/virtio_pci_modern.c
    @@ -234,6 +234,34 @@ static void vp_modern_queue_address(struct virtio_pci_modern_device *mdev,
    &cfg->queue_used_hi);
    }

    +/*
    + * vp_modern_set_queue_enable - enable a virtqueue
    + * @mdev: the modern virtio-pci device
    + * @index: the queue index
    + * @enable: whether the virtqueue is enable or not
    + */
    +static void vp_modern_set_queue_enable(struct virtio_pci_modern_device *mdev,
    + u16 index, bool enable)
    +{
    + vp_iowrite16(index, &mdev->common->queue_select);
    + vp_iowrite16(enable, &mdev->common->queue_enable);
    +}
    +
    +/*
    + * vp_modern_get_queue_enable - enable a virtqueue
    + * @mdev: the modern virtio-pci device
    + * @index: the queue index
    + *
    + * Returns whether a virtqueue is enabled or not
    + */
    +static bool vp_modern_get_queue_enable(struct virtio_pci_modern_device *mdev,
    + u16 index)
    +{
    + vp_iowrite16(index, &mdev->common->queue_select);
    +
    + return vp_ioread16(&mdev->common->queue_enable);
    +}
    +
    /* virtio config->finalize_features() implementation */
    static int vp_finalize_features(struct virtio_device *vdev)
    {
    @@ -460,7 +488,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,

    /* Check if queue is either not available or already active. */
    num = vp_ioread16(&cfg->queue_size);
    - if (!num || vp_ioread16(&cfg->queue_enable))
    + if (!num || vp_modern_get_queue_enable(mdev, index))
    return ERR_PTR(-ENOENT);

    if (num & (num - 1)) {
    @@ -538,7 +566,6 @@ static int vp_modern_find_vqs(struct virtio_device *vdev, unsigned nvqs,
    struct irq_affinity *desc)
    {
    struct virtio_pci_device *vp_dev = to_vp_device(vdev);
    - struct virtio_pci_common_cfg __iomem *cfg = vp_dev->mdev.common;
    struct virtqueue *vq;
    int rc = vp_find_vqs(vdev, nvqs, vqs, callbacks, names, ctx, desc);

    @@ -548,10 +575,8 @@ static int vp_modern_find_vqs(struct virtio_device *vdev, unsigned nvqs,
    /* Select and activate all queues. Has to be done last: once we do
    * this, there's no way to go back except reset.
    */
    - list_for_each_entry(vq, &vdev->vqs, list) {
    - vp_iowrite16(vq->index, &cfg->queue_select);
    - vp_iowrite16(1, &cfg->queue_enable);
    - }
    + list_for_each_entry(vq, &vdev->vqs, list)
    + vp_modern_set_queue_enable(&vp_dev->mdev, vq->index, true);

    return 0;
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-01-04 07:59    [W:4.315 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site