virtio: add support for 64 bit features.
Change u32 to u64, and use BIT_ULL and 1ULL everywhere. Note: transports are unchanged, and only set low 32 bit. This guarantees that no transport sets e.g. VERSION_1 by mistake without proper support. Based on patch by Rusty. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
		
					parent
					
						
							
								0ffaeadfc4
							
						
					
				
			
			
				commit
				
					
						d025477368
					
				
			
		
					 11 changed files with 23 additions and 23 deletions
				
			
		|  | @ -94,7 +94,7 @@ static unsigned desc_size(const struct lguest_device_desc *desc) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* This gets the device's feature bits. */ | /* This gets the device's feature bits. */ | ||||||
| static u32 lg_get_features(struct virtio_device *vdev) | static u64 lg_get_features(struct virtio_device *vdev) | ||||||
| { | { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
| 	u32 features = 0; | 	u32 features = 0; | ||||||
|  |  | ||||||
|  | @ -68,7 +68,7 @@ static inline struct device *mic_dev(struct mic_vdev *mvdev) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* This gets the device's feature bits. */ | /* This gets the device's feature bits. */ | ||||||
| static u32 mic_get_features(struct virtio_device *vdev) | static u64 mic_get_features(struct virtio_device *vdev) | ||||||
| { | { | ||||||
| 	unsigned int i, bits; | 	unsigned int i, bits; | ||||||
| 	u32 features = 0; | 	u32 features = 0; | ||||||
|  |  | ||||||
|  | @ -207,7 +207,7 @@ static void rproc_virtio_reset(struct virtio_device *vdev) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* provide the vdev features as retrieved from the firmware */ | /* provide the vdev features as retrieved from the firmware */ | ||||||
| static u32 rproc_virtio_get_features(struct virtio_device *vdev) | static u64 rproc_virtio_get_features(struct virtio_device *vdev) | ||||||
| { | { | ||||||
| 	struct rproc_vdev *rvdev = vdev_to_rvdev(vdev); | 	struct rproc_vdev *rvdev = vdev_to_rvdev(vdev); | ||||||
| 	struct fw_rsc_vdev *rsc; | 	struct fw_rsc_vdev *rsc; | ||||||
|  |  | ||||||
|  | @ -80,7 +80,7 @@ static unsigned desc_size(const struct kvm_device_desc *desc) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* This gets the device's feature bits. */ | /* This gets the device's feature bits. */ | ||||||
| static u32 kvm_get_features(struct virtio_device *vdev) | static u64 kvm_get_features(struct virtio_device *vdev) | ||||||
| { | { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
| 	u32 features = 0; | 	u32 features = 0; | ||||||
|  |  | ||||||
|  | @ -660,7 +660,7 @@ static void virtio_ccw_reset(struct virtio_device *vdev) | ||||||
| 	kfree(ccw); | 	kfree(ccw); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static u32 virtio_ccw_get_features(struct virtio_device *vdev) | static u64 virtio_ccw_get_features(struct virtio_device *vdev) | ||||||
| { | { | ||||||
| 	struct virtio_ccw_device *vcdev = to_vc_device(vdev); | 	struct virtio_ccw_device *vcdev = to_vc_device(vdev); | ||||||
| 	struct virtio_feature_desc *features; | 	struct virtio_feature_desc *features; | ||||||
|  |  | ||||||
|  | @ -159,7 +159,7 @@ static int virtio_dev_probe(struct device *_d) | ||||||
| 	int err, i; | 	int err, i; | ||||||
| 	struct virtio_device *dev = dev_to_virtio(_d); | 	struct virtio_device *dev = dev_to_virtio(_d); | ||||||
| 	struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); | 	struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); | ||||||
| 	u32 device_features; | 	u64 device_features; | ||||||
| 
 | 
 | ||||||
| 	/* We have a driver! */ | 	/* We have a driver! */ | ||||||
| 	add_status(dev, VIRTIO_CONFIG_S_DRIVER); | 	add_status(dev, VIRTIO_CONFIG_S_DRIVER); | ||||||
|  | @ -171,14 +171,14 @@ static int virtio_dev_probe(struct device *_d) | ||||||
| 	dev->features = 0; | 	dev->features = 0; | ||||||
| 	for (i = 0; i < drv->feature_table_size; i++) { | 	for (i = 0; i < drv->feature_table_size; i++) { | ||||||
| 		unsigned int f = drv->feature_table[i]; | 		unsigned int f = drv->feature_table[i]; | ||||||
| 		BUG_ON(f >= 32); | 		BUG_ON(f >= 64); | ||||||
| 		if (device_features & (1 << f)) | 		if (device_features & (1ULL << f)) | ||||||
| 			__virtio_set_bit(dev, f); | 			__virtio_set_bit(dev, f); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Transport features always preserved to pass to finalize_features. */ | 	/* Transport features always preserved to pass to finalize_features. */ | ||||||
| 	for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++) | 	for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++) | ||||||
| 		if (device_features & (1 << i)) | 		if (device_features & (1ULL << i)) | ||||||
| 			__virtio_set_bit(dev, i); | 			__virtio_set_bit(dev, i); | ||||||
| 
 | 
 | ||||||
| 	dev->config->finalize_features(dev); | 	dev->config->finalize_features(dev); | ||||||
|  |  | ||||||
|  | @ -142,7 +142,7 @@ struct virtio_mmio_vq_info { | ||||||
| 
 | 
 | ||||||
| /* Configuration interface */ | /* Configuration interface */ | ||||||
| 
 | 
 | ||||||
| static u32 vm_get_features(struct virtio_device *vdev) | static u64 vm_get_features(struct virtio_device *vdev) | ||||||
| { | { | ||||||
| 	struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); | 	struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -102,7 +102,7 @@ static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* virtio config->get_features() implementation */ | /* virtio config->get_features() implementation */ | ||||||
| static u32 vp_get_features(struct virtio_device *vdev) | static u64 vp_get_features(struct virtio_device *vdev) | ||||||
| { | { | ||||||
| 	struct virtio_pci_device *vp_dev = to_vp_device(vdev); | 	struct virtio_pci_device *vp_dev = to_vp_device(vdev); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -101,7 +101,7 @@ struct virtio_device { | ||||||
| 	const struct virtio_config_ops *config; | 	const struct virtio_config_ops *config; | ||||||
| 	const struct vringh_config_ops *vringh_config; | 	const struct vringh_config_ops *vringh_config; | ||||||
| 	struct list_head vqs; | 	struct list_head vqs; | ||||||
| 	u32 features; | 	u64 features; | ||||||
| 	void *priv; | 	void *priv; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -66,7 +66,7 @@ struct virtio_config_ops { | ||||||
| 			vq_callback_t *callbacks[], | 			vq_callback_t *callbacks[], | ||||||
| 			const char *names[]); | 			const char *names[]); | ||||||
| 	void (*del_vqs)(struct virtio_device *); | 	void (*del_vqs)(struct virtio_device *); | ||||||
| 	u32 (*get_features)(struct virtio_device *vdev); | 	u64 (*get_features)(struct virtio_device *vdev); | ||||||
| 	void (*finalize_features)(struct virtio_device *vdev); | 	void (*finalize_features)(struct virtio_device *vdev); | ||||||
| 	const char *(*bus_name)(struct virtio_device *vdev); | 	const char *(*bus_name)(struct virtio_device *vdev); | ||||||
| 	int (*set_vq_affinity)(struct virtqueue *vq, int cpu); | 	int (*set_vq_affinity)(struct virtqueue *vq, int cpu); | ||||||
|  | @ -88,11 +88,11 @@ static inline bool __virtio_test_bit(const struct virtio_device *vdev, | ||||||
| { | { | ||||||
| 	/* Did you forget to fix assumptions on max features? */ | 	/* Did you forget to fix assumptions on max features? */ | ||||||
| 	if (__builtin_constant_p(fbit)) | 	if (__builtin_constant_p(fbit)) | ||||||
| 		BUILD_BUG_ON(fbit >= 32); | 		BUILD_BUG_ON(fbit >= 64); | ||||||
| 	else | 	else | ||||||
| 		BUG_ON(fbit >= 32); | 		BUG_ON(fbit >= 64); | ||||||
| 
 | 
 | ||||||
| 	return vdev->features & BIT(fbit); | 	return vdev->features & BIT_ULL(fbit); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -105,11 +105,11 @@ static inline void __virtio_set_bit(struct virtio_device *vdev, | ||||||
| { | { | ||||||
| 	/* Did you forget to fix assumptions on max features? */ | 	/* Did you forget to fix assumptions on max features? */ | ||||||
| 	if (__builtin_constant_p(fbit)) | 	if (__builtin_constant_p(fbit)) | ||||||
| 		BUILD_BUG_ON(fbit >= 32); | 		BUILD_BUG_ON(fbit >= 64); | ||||||
| 	else | 	else | ||||||
| 		BUG_ON(fbit >= 32); | 		BUG_ON(fbit >= 64); | ||||||
| 
 | 
 | ||||||
| 	vdev->features |= BIT(fbit); | 	vdev->features |= BIT_ULL(fbit); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -122,11 +122,11 @@ static inline void __virtio_clear_bit(struct virtio_device *vdev, | ||||||
| { | { | ||||||
| 	/* Did you forget to fix assumptions on max features? */ | 	/* Did you forget to fix assumptions on max features? */ | ||||||
| 	if (__builtin_constant_p(fbit)) | 	if (__builtin_constant_p(fbit)) | ||||||
| 		BUILD_BUG_ON(fbit >= 32); | 		BUILD_BUG_ON(fbit >= 64); | ||||||
| 	else | 	else | ||||||
| 		BUG_ON(fbit >= 32); | 		BUG_ON(fbit >= 64); | ||||||
| 
 | 
 | ||||||
| 	vdev->features &= ~BIT(fbit); | 	vdev->features &= ~BIT_ULL(fbit); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
| 
 | 
 | ||||||
| struct virtio_device { | struct virtio_device { | ||||||
| 	void *dev; | 	void *dev; | ||||||
| 	u32 features; | 	u64 features; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct virtqueue { | struct virtqueue { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Michael S. Tsirkin
				Michael S. Tsirkin