aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2015-03-11 22:26:43 -0400
committerRusty Russell <rusty@rustcorp.com.au>2015-03-13 01:25:43 -0400
commit87e7bf1450c9f6bd0927f63ebc0fe2d12e8bc83d (patch)
treea4292d97cd9671365d410c6c840d162c5a0da99b
parent71e4b8bf0482fc7d70e9d4c10b13c207a285d58a (diff)
virtio_mmio: generation support
virtio_mmio currently lacks generation support which makes multi-byte field access racy. Fix by getting the value at offset 0xfc for version 2 devices. Nothing we can do for version 1, so return generation id 0. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r--drivers/virtio/virtio_mmio.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index cad569890908..9c877d2375a5 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -174,6 +174,16 @@ static void vm_set(struct virtio_device *vdev, unsigned offset,
174 writeb(ptr[i], vm_dev->base + VIRTIO_MMIO_CONFIG + offset + i); 174 writeb(ptr[i], vm_dev->base + VIRTIO_MMIO_CONFIG + offset + i);
175} 175}
176 176
177static u32 vm_generation(struct virtio_device *vdev)
178{
179 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
180
181 if (vm_dev->version == 1)
182 return 0;
183 else
184 return readl(vm_dev->base + VIRTIO_MMIO_CONFIG_GENERATION);
185}
186
177static u8 vm_get_status(struct virtio_device *vdev) 187static u8 vm_get_status(struct virtio_device *vdev)
178{ 188{
179 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); 189 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
@@ -440,6 +450,7 @@ static const char *vm_bus_name(struct virtio_device *vdev)
440static const struct virtio_config_ops virtio_mmio_config_ops = { 450static const struct virtio_config_ops virtio_mmio_config_ops = {
441 .get = vm_get, 451 .get = vm_get,
442 .set = vm_set, 452 .set = vm_set,
453 .generation = vm_generation,
443 .get_status = vm_get_status, 454 .get_status = vm_get_status,
444 .set_status = vm_set_status, 455 .set_status = vm_set_status,
445 .reset = vm_reset, 456 .reset = vm_reset,