d->tag[tag_len] = '\0';
d->vdev->features &= host_features;
- virtio_feature_set(d->vdev, d->vdev->features);
+ virtio_feature_set(d->vdev);
+
return 0;
free_mem:
* Mask out features supported by both driver and device.
*/
vbdev->vdev->features &= host_features;
- virtio_feature_set(vbdev->vdev, vbdev->vdev->features);
+ virtio_feature_set(vbdev->vdev);
exit:
return rc;
/** Get the feature */
__u64 (*features_get)(struct virtio_dev *vdev);
/** Set the feature */
- void (*features_set)(struct virtio_dev *vdev, __u64 features);
+ void (*features_set)(struct virtio_dev *vdev);
/** Get and Set Status */
__u8 (*status_get)(struct virtio_dev *vdev);
void (*status_set)(struct virtio_dev *vdev, __u8 status);
/**
* The function to set the negotiated features.
- * @param vdev
- * Reference to the virtio device.
- * @param feature
- * A bit map of the feature negotiated.
+ *
+ * @param vdev Reference to the virtio device.
*/
-static inline void virtio_feature_set(struct virtio_dev *vdev, __u32 feature)
+static inline void virtio_feature_set(struct virtio_dev *vdev)
{
UK_ASSERT(vdev);
if (likely(vdev->cops->features_set))
- vdev->cops->features_set(vdev, feature);
+ vdev->cops->features_set(vdev);
}
/**
return features;
}
-static void vm_set_features(struct virtio_dev *vdev,
- __u64 features)
+static void vm_set_features(struct virtio_dev *vdev)
{
- struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
+ struct virtio_mmio_device *vm_dev;
+
+ UK_ASSERT(vdev);
+
+ vm_dev = to_virtio_mmio_device(vdev);
/* Give virtio_ring a chance to accept features. */
- virtqueue_feature_negotiate(features);
+ vdev->features = virtqueue_feature_negotiate(vdev->features);
/* Make sure there are no mixed devices */
if (vm_dev->version == 2 &&
- !uk_test_bit(VIRTIO_F_VERSION_1, &vdev->features)) {
- uk_pr_err("New virtio-mmio devices (version 2) must provide VIRTIO_F_VERSION_1 feature!\n");
+ !uk_test_bit(VIRTIO_F_VERSION_1, &vdev->features)) {
+ uk_pr_err("Modern virtio devices must set VIRTIO_F_VERSION_1\n");
return;
}
virtio_cwrite32(vm_dev->base, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 1);
virtio_cwrite32(vm_dev->base, VIRTIO_MMIO_DRIVER_FEATURES,
- (__u32)(vdev->features >> 32));
+ (__u32)(vdev->features >> 32));
virtio_cwrite32(vm_dev->base, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 0);
virtio_cwrite32(vm_dev->base, VIRTIO_MMIO_DRIVER_FEATURES,
- (__u32)vdev->features);
+ (__u32)vdev->features);
}
static int vm_get(struct virtio_dev *vdev, __u16 offset,
* Announce our enabled driver features back to the backend device
*/
vndev->vdev->features = drv_features;
- virtio_feature_set(vndev->vdev, vndev->vdev->features);
+ virtio_feature_set(vndev->vdev);
/**
* According to Virtio specification, section 2.3.1. Config fields
static int vpci_legacy_pci_config_get(struct virtio_dev *vdev, __u16 offset,
void *buf, __u32 len, __u8 type_len);
static __u64 vpci_legacy_pci_features_get(struct virtio_dev *vdev);
-static void vpci_legacy_pci_features_set(struct virtio_dev *vdev,
- __u64 features);
+static void vpci_legacy_pci_features_set(struct virtio_dev *vdev);
static int vpci_legacy_pci_vq_find(struct virtio_dev *vdev, __u16 num_vq,
__u16 *qdesc_size);
static void vpci_legacy_pci_status_set(struct virtio_dev *vdev, __u8 status);
return features;
}
-static void vpci_legacy_pci_features_set(struct virtio_dev *vdev,
- __u64 features)
+static void vpci_legacy_pci_features_set(struct virtio_dev *vdev)
{
struct virtio_pci_dev *vpdev = NULL;
UK_ASSERT(vdev);
+
vpdev = to_virtiopcidev(vdev);
+
/* Mask out features not supported by the virtqueue driver */
- features = virtqueue_feature_negotiate(features);
+ vdev->features = virtqueue_feature_negotiate(vdev->features);
+
virtio_cwrite32((void *) (unsigned long)vpdev->pci_base_addr,
- VIRTIO_PCI_GUEST_FEATURES, (__u32)features);
+ VIRTIO_PCI_GUEST_FEATURES, (__u32)vdev->features);
}
static int virtio_pci_legacy_add_dev(struct pci_device *pci_dev,