mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
virtio: use u32, not bitmap for features
It seemed like a good idea to use bitmap for features in struct virtio_device, but it's actually a pain, and seems to become even more painful when we get more than 32 feature bits. Just change it to a u32 for now. Based on patch by Rusty. Suggested-by: David Hildenbrand <[email protected]> Signed-off-by: Rusty Russell <[email protected]> Signed-off-by: Cornelia Huck <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Reviewed-by: Cornelia Huck <[email protected]>
This commit is contained in:
parent
d4024af56f
commit
e16e12be34
16 changed files with 42 additions and 74 deletions
|
|
@ -49,9 +49,9 @@ static ssize_t features_show(struct device *_d,
|
|||
|
||||
/* We actually represent this as a bitstring, as it could be
|
||||
* arbitrary length in future. */
|
||||
for (i = 0; i < ARRAY_SIZE(dev->features)*BITS_PER_LONG; i++)
|
||||
for (i = 0; i < sizeof(dev->features)*8; i++)
|
||||
len += sprintf(buf+len, "%c",
|
||||
test_bit(i, dev->features) ? '1' : '0');
|
||||
__virtio_test_bit(dev, i) ? '1' : '0');
|
||||
len += sprintf(buf+len, "\n");
|
||||
return len;
|
||||
}
|
||||
|
|
@ -168,18 +168,18 @@ static int virtio_dev_probe(struct device *_d)
|
|||
device_features = dev->config->get_features(dev);
|
||||
|
||||
/* Features supported by both device and driver into dev->features. */
|
||||
memset(dev->features, 0, sizeof(dev->features));
|
||||
dev->features = 0;
|
||||
for (i = 0; i < drv->feature_table_size; i++) {
|
||||
unsigned int f = drv->feature_table[i];
|
||||
BUG_ON(f >= 32);
|
||||
if (device_features & (1 << f))
|
||||
set_bit(f, dev->features);
|
||||
__virtio_set_bit(dev, f);
|
||||
}
|
||||
|
||||
/* Transport features always preserved to pass to finalize_features. */
|
||||
for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++)
|
||||
if (device_features & (1 << i))
|
||||
set_bit(i, dev->features);
|
||||
__virtio_set_bit(dev, i);
|
||||
|
||||
dev->config->finalize_features(dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -155,16 +155,12 @@ static u32 vm_get_features(struct virtio_device *vdev)
|
|||
static void vm_finalize_features(struct virtio_device *vdev)
|
||||
{
|
||||
struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
|
||||
int i;
|
||||
|
||||
/* Give virtio_ring a chance to accept features. */
|
||||
vring_transport_features(vdev);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(vdev->features); i++) {
|
||||
writel(i, vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES_SEL);
|
||||
writel(vdev->features[i],
|
||||
vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES);
|
||||
}
|
||||
writel(0, vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES_SEL);
|
||||
writel(vdev->features, vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES);
|
||||
}
|
||||
|
||||
static void vm_get(struct virtio_device *vdev, unsigned offset,
|
||||
|
|
|
|||
|
|
@ -120,8 +120,7 @@ static void vp_finalize_features(struct virtio_device *vdev)
|
|||
vring_transport_features(vdev);
|
||||
|
||||
/* We only support 32 feature bits. */
|
||||
BUILD_BUG_ON(ARRAY_SIZE(vdev->features) != 1);
|
||||
iowrite32(vdev->features[0], vp_dev->ioaddr+VIRTIO_PCI_GUEST_FEATURES);
|
||||
iowrite32(vdev->features, vp_dev->ioaddr + VIRTIO_PCI_GUEST_FEATURES);
|
||||
}
|
||||
|
||||
/* virtio config->get() implementation */
|
||||
|
|
|
|||
|
|
@ -781,7 +781,7 @@ void vring_transport_features(struct virtio_device *vdev)
|
|||
break;
|
||||
default:
|
||||
/* We don't understand this bit. */
|
||||
clear_bit(i, vdev->features);
|
||||
__virtio_clear_bit(vdev, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue