mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 17:57:38 -04:00
Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull virtio updates from Michael Tsirkin: "A bunch of new drivers including vdpa support for block and virtio-vdpa. Beginning of vq kick (aka doorbell) mapping support. Misc fixes" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: (40 commits) virtio_pci_modern: correct sparse tags for notify virtio_pci_modern: __force cast the notify mapping vDPA/ifcvf: get_config_size should return dev specific config size vDPA/ifcvf: enable Intel C5000X-PL virtio-block for vDPA vDPA/ifcvf: deduce VIRTIO device ID when probe vdpa_sim_blk: add support for vdpa management tool vdpa_sim_blk: handle VIRTIO_BLK_T_GET_ID vdpa_sim_blk: implement ramdisk behaviour vdpa: add vdpa simulator for block device vhost/vdpa: Remove the restriction that only supports virtio-net devices vhost/vdpa: use get_config_size callback in vhost_vdpa_config_validate() vdpa: add get_config_size callback in vdpa_config_ops vdpa_sim: cleanup kiovs in vdpasim_free() vringh: add vringh_kiov_length() helper vringh: implement vringh_kiov_advance() vringh: explain more about cleaning riov and wiov vringh: reset kiov 'consumed' field in __vringh_iov() vringh: add 'iotlb_lock' to synchronize iotlb accesses vdpa_sim: use iova module to allocate IOVA addresses vDPA/ifcvf: deduce VIRTIO device ID from pdev ids ...
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
#include <linux/vhost_iotlb.h>
|
||||
|
||||
/**
|
||||
* vDPA callback definition.
|
||||
* struct vdpa_calllback - vDPA callback definition.
|
||||
* @callback: interrupt callback function
|
||||
* @private: the data passed to the callback function
|
||||
*/
|
||||
@@ -18,7 +18,7 @@ struct vdpa_callback {
|
||||
};
|
||||
|
||||
/**
|
||||
* vDPA notification area
|
||||
* struct vdpa_notification_area - vDPA notification area
|
||||
* @addr: base address of the notification area
|
||||
* @size: size of the notification area
|
||||
*/
|
||||
@@ -28,7 +28,7 @@ struct vdpa_notification_area {
|
||||
};
|
||||
|
||||
/**
|
||||
* vDPA vq_state definition
|
||||
* struct vdpa_vq_state - vDPA vq_state definition
|
||||
* @avail_index: available index
|
||||
*/
|
||||
struct vdpa_vq_state {
|
||||
@@ -38,7 +38,7 @@ struct vdpa_vq_state {
|
||||
struct vdpa_mgmt_dev;
|
||||
|
||||
/**
|
||||
* vDPA device - representation of a vDPA device
|
||||
* struct vdpa_device - representation of a vDPA device
|
||||
* @dev: underlying device
|
||||
* @dma_dev: the actual device that is performing DMA
|
||||
* @config: the configuration ops for this device.
|
||||
@@ -59,7 +59,7 @@ struct vdpa_device {
|
||||
};
|
||||
|
||||
/**
|
||||
* vDPA IOVA range - the IOVA range support by the device
|
||||
* struct vdpa_iova_range - the IOVA range support by the device
|
||||
* @first: start of the IOVA range
|
||||
* @last: end of the IOVA range
|
||||
*/
|
||||
@@ -69,7 +69,7 @@ struct vdpa_iova_range {
|
||||
};
|
||||
|
||||
/**
|
||||
* vDPA_config_ops - operations for configuring a vDPA device.
|
||||
* struct vdpa_config_ops - operations for configuring a vDPA device.
|
||||
* Note: vDPA device drivers are required to implement all of the
|
||||
* operations unless it is mentioned to be optional in the following
|
||||
* list.
|
||||
@@ -150,6 +150,9 @@ struct vdpa_iova_range {
|
||||
* @set_status: Set the device status
|
||||
* @vdev: vdpa device
|
||||
* @status: virtio device status
|
||||
* @get_config_size: Get the size of the configuration space
|
||||
* @vdev: vdpa device
|
||||
* Returns size_t: configuration size
|
||||
* @get_config: Read from device specific configuration space
|
||||
* @vdev: vdpa device
|
||||
* @offset: offset from the beginning of
|
||||
@@ -231,6 +234,7 @@ struct vdpa_config_ops {
|
||||
u32 (*get_vendor_id)(struct vdpa_device *vdev);
|
||||
u8 (*get_status)(struct vdpa_device *vdev);
|
||||
void (*set_status)(struct vdpa_device *vdev, u8 status);
|
||||
size_t (*get_config_size)(struct vdpa_device *vdev);
|
||||
void (*get_config)(struct vdpa_device *vdev, unsigned int offset,
|
||||
void *buf, unsigned int len);
|
||||
void (*set_config)(struct vdpa_device *vdev, unsigned int offset,
|
||||
@@ -267,7 +271,7 @@ int _vdpa_register_device(struct vdpa_device *vdev, int nvqs);
|
||||
void _vdpa_unregister_device(struct vdpa_device *vdev);
|
||||
|
||||
/**
|
||||
* vdpa_driver - operations for a vDPA driver
|
||||
* struct vdpa_driver - operations for a vDPA driver
|
||||
* @driver: underlying device driver
|
||||
* @probe: the function to call when a device is found. Returns 0 or -errno.
|
||||
* @remove: the function to call when a device is removed.
|
||||
@@ -344,18 +348,18 @@ static inline void vdpa_get_config(struct vdpa_device *vdev, unsigned offset,
|
||||
}
|
||||
|
||||
/**
|
||||
* vdpa_mgmtdev_ops - vdpa device ops
|
||||
* @dev_add: Add a vdpa device using alloc and register
|
||||
* @mdev: parent device to use for device addition
|
||||
* @name: name of the new vdpa device
|
||||
* Driver need to add a new device using _vdpa_register_device()
|
||||
* after fully initializing the vdpa device. Driver must return 0
|
||||
* on success or appropriate error code.
|
||||
* @dev_del: Remove a vdpa device using unregister
|
||||
* @mdev: parent device to use for device removal
|
||||
* @dev: vdpa device to remove
|
||||
* Driver need to remove the specified device by calling
|
||||
* _vdpa_unregister_device().
|
||||
* struct vdpa_mgmtdev_ops - vdpa device ops
|
||||
* @dev_add: Add a vdpa device using alloc and register
|
||||
* @mdev: parent device to use for device addition
|
||||
* @name: name of the new vdpa device
|
||||
* Driver need to add a new device using _vdpa_register_device()
|
||||
* after fully initializing the vdpa device. Driver must return 0
|
||||
* on success or appropriate error code.
|
||||
* @dev_del: Remove a vdpa device using unregister
|
||||
* @mdev: parent device to use for device removal
|
||||
* @dev: vdpa device to remove
|
||||
* Driver need to remove the specified device by calling
|
||||
* _vdpa_unregister_device().
|
||||
*/
|
||||
struct vdpa_mgmtdev_ops {
|
||||
int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name);
|
||||
|
||||
@@ -13,6 +13,8 @@ struct virtio_pci_modern_device {
|
||||
void __iomem *device;
|
||||
/* Base of vq notifications (non-legacy mode). */
|
||||
void __iomem *notify_base;
|
||||
/* Physical base of vq notifications */
|
||||
resource_size_t notify_pa;
|
||||
/* Where to read and clear interrupt */
|
||||
u8 __iomem *isr;
|
||||
|
||||
@@ -99,13 +101,8 @@ void vp_modern_set_queue_size(struct virtio_pci_modern_device *mdev,
|
||||
u16 vp_modern_get_queue_size(struct virtio_pci_modern_device *mdev,
|
||||
u16 idx);
|
||||
u16 vp_modern_get_num_queues(struct virtio_pci_modern_device *mdev);
|
||||
u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
|
||||
u16 idx);
|
||||
void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
|
||||
size_t minlen,
|
||||
u32 align,
|
||||
u32 start, u32 size,
|
||||
size_t *len);
|
||||
void __iomem * vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
|
||||
u16 index, resource_size_t *pa);
|
||||
int vp_modern_probe(struct virtio_pci_modern_device *mdev);
|
||||
void vp_modern_remove(struct virtio_pci_modern_device *mdev);
|
||||
#endif
|
||||
|
||||
@@ -46,6 +46,9 @@ struct vringh {
|
||||
/* IOTLB for this vring */
|
||||
struct vhost_iotlb *iotlb;
|
||||
|
||||
/* spinlock to synchronize IOTLB accesses */
|
||||
spinlock_t *iotlb_lock;
|
||||
|
||||
/* The function to call to notify the guest about added buffers */
|
||||
void (*notify)(struct vringh *);
|
||||
};
|
||||
@@ -196,6 +199,19 @@ static inline void vringh_kiov_cleanup(struct vringh_kiov *kiov)
|
||||
kiov->iov = NULL;
|
||||
}
|
||||
|
||||
static inline size_t vringh_kiov_length(struct vringh_kiov *kiov)
|
||||
{
|
||||
size_t len = 0;
|
||||
int i;
|
||||
|
||||
for (i = kiov->i; i < kiov->used; i++)
|
||||
len += kiov->iov[i].iov_len;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
void vringh_kiov_advance(struct vringh_kiov *kiov, size_t len);
|
||||
|
||||
int vringh_getdesc_kern(struct vringh *vrh,
|
||||
struct vringh_kiov *riov,
|
||||
struct vringh_kiov *wiov,
|
||||
@@ -258,7 +274,8 @@ static inline __virtio64 cpu_to_vringh64(const struct vringh *vrh, u64 val)
|
||||
|
||||
#if IS_REACHABLE(CONFIG_VHOST_IOTLB)
|
||||
|
||||
void vringh_set_iotlb(struct vringh *vrh, struct vhost_iotlb *iotlb);
|
||||
void vringh_set_iotlb(struct vringh *vrh, struct vhost_iotlb *iotlb,
|
||||
spinlock_t *iotlb_lock);
|
||||
|
||||
int vringh_init_iotlb(struct vringh *vrh, u64 features,
|
||||
unsigned int num, bool weak_barriers,
|
||||
|
||||
Reference in New Issue
Block a user