Use the newly introduced SHM_PAGE_SIZE register to read the page size and store it into virtio_shm_region. Signed-off-by: Sergio Lopez <slp@xxxxxxxxxx> --- drivers/virtio/virtio_mmio.c | 13 ++++++++++++- include/uapi/linux/virtio_mmio.h | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c index cd0a0407659517e6a318b117ba67258c59f1f983..92590c77901bee453d8c1a1ac60ad9cca90d1b59 100644 --- a/drivers/virtio/virtio_mmio.c +++ b/drivers/virtio/virtio_mmio.c @@ -537,6 +537,7 @@ static bool vm_get_shm_region(struct virtio_device *vdev, struct virtio_shm_region *region, u8 id) { struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); + u16 page_size = 0; u64 len, addr; /* Select the region we're interested in */ @@ -560,7 +561,17 @@ static bool vm_get_shm_region(struct virtio_device *vdev, region->addr = addr; - region->page_size = 4096 >> 12; + /* If supported by the device transport, read the region page size */ + if (__virtio_test_bit(vdev, VIRTIO_F_SHM_PAGE_SIZE)) + page_size = (u16) readl(vm_dev->base + VIRTIO_MMIO_SHM_PAGE_SIZE); + + /* For backwards compatibility, if the device didn't specify a + * page size, assume it to be 4096. + */ + if (page_size == 0) + page_size = 4096 >> 12; + + region->page_size = page_size; return true; } diff --git a/include/uapi/linux/virtio_mmio.h b/include/uapi/linux/virtio_mmio.h index 0650f91bea6c70f935764070d825d181a2379afb..c5a1cdad5a1c9bc954d7facfd8c05e2acbb28e96 100644 --- a/include/uapi/linux/virtio_mmio.h +++ b/include/uapi/linux/virtio_mmio.h @@ -133,6 +133,9 @@ #define VIRTIO_MMIO_SHM_BASE_LOW 0x0b8 #define VIRTIO_MMIO_SHM_BASE_HIGH 0x0bc +/* Shared memory region page size, in format PAGE_SIZE >> 12 */ +#define VIRTIO_MMIO_SHM_PAGE_SIZE 0x0c4 + /* Configuration atomicity value */ #define VIRTIO_MMIO_CONFIG_GENERATION 0x0fc -- 2.48.1