Introduce a new feature, HOST_PAGE_SIZE, that indicates the host
provides its page size as a value in virtio_gpu_config.

Signed-off-by: Sergio Lopez <s...@redhat.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.c |  1 +
 drivers/gpu/drm/virtio/virtgpu_drv.h |  2 ++
 drivers/gpu/drm/virtio/virtgpu_kms.c | 13 ++++++++++---
 include/uapi/linux/virtio_gpu.h      |  5 +++++
 4 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c 
b/drivers/gpu/drm/virtio/virtgpu_drv.c
index 
2d88e390feb468bf8783f13d90d0c4759dff0dcf..2e81aeaffdc6924dd88fb0778edef22084526866
 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
@@ -154,6 +154,7 @@ static unsigned int features[] = {
        VIRTIO_GPU_F_RESOURCE_UUID,
        VIRTIO_GPU_F_RESOURCE_BLOB,
        VIRTIO_GPU_F_CONTEXT_INIT,
+       VIRTIO_GPU_F_HOST_PAGE_SIZE,
 };
 static struct virtio_driver virtio_gpu_driver = {
        .feature_table = features,
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h 
b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 
f17660a71a3e7a22b5d4fefa6b754c227a294037..439223b5f7cf8c9a120a28b7b7d57516928112e7
 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -257,6 +257,7 @@ struct virtio_gpu_device {
        bool has_resource_blob;
        bool has_host_visible;
        bool has_context_init;
+       bool has_host_page_size;
        struct virtio_shm_region host_visible_region;
        struct drm_mm host_visible_mm;
 
@@ -270,6 +271,7 @@ struct virtio_gpu_device {
        uint32_t num_capsets;
        uint64_t capset_id_mask;
        struct list_head cap_cache;
+       uint32_t host_page_size;
 
        /* protects uuid state when exporting */
        spinlock_t resource_export_lock;
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c 
b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 
7dfb2006c561ca13b15d979ddb8bf2d753e35dad..4ab95712434615c2cc35f2ff80d33b40c4212cfb
 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -123,7 +123,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct 
drm_device *dev)
        struct virtio_gpu_device *vgdev;
        /* this will expand later */
        struct virtqueue *vqs[2];
-       u32 num_scanouts, num_capsets;
+       u32 num_scanouts, num_capsets, host_page_size;
        int ret = 0;
 
        if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1))
@@ -196,6 +196,12 @@ int virtio_gpu_init(struct virtio_device *vdev, struct 
drm_device *dev)
        if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_CONTEXT_INIT)) {
                vgdev->has_context_init = true;
        }
+       if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_HOST_PAGE_SIZE)) {
+               vgdev->has_host_page_size = true;
+               virtio_cread_le(vgdev->vdev, struct virtio_gpu_config,
+                               host_page_size, &host_page_size);
+               vgdev->host_page_size = host_page_size;
+       }
 
        DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible",
                 vgdev->has_virgl_3d    ? '+' : '-',
@@ -203,8 +209,9 @@ int virtio_gpu_init(struct virtio_device *vdev, struct 
drm_device *dev)
                 vgdev->has_resource_blob ? '+' : '-',
                 vgdev->has_host_visible ? '+' : '-');
 
-       DRM_INFO("features: %ccontext_init\n",
-                vgdev->has_context_init ? '+' : '-');
+       DRM_INFO("features: %ccontext_init %chost_page_size\n",
+                vgdev->has_context_init ? '+' : '-',
+                vgdev->has_host_page_size ? '+' : '-');
 
        ret = virtio_find_vqs(vgdev->vdev, 2, vqs, vqs_info, NULL);
        if (ret) {
diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gpu.h
index 
bf2c9cabd20793e3851e749baadf210341445501..adc264df4e458e9c754936c3015c069e5ee6b899
 100644
--- a/include/uapi/linux/virtio_gpu.h
+++ b/include/uapi/linux/virtio_gpu.h
@@ -64,6 +64,10 @@
  * context_init and multiple timelines
  */
 #define VIRTIO_GPU_F_CONTEXT_INIT        4
+/*
+ * Config struct contains host page size
+ */
+#define VIRTIO_GPU_F_HOST_PAGE_SIZE      5
 
 enum virtio_gpu_ctrl_type {
        VIRTIO_GPU_UNDEFINED = 0,
@@ -364,6 +368,7 @@ struct virtio_gpu_config {
        __le32 events_clear;
        __le32 num_scanouts;
        __le32 num_capsets;
+       __le32 host_page_size;
 };
 
 /* simple formats for fbcon/X use */

-- 
2.48.1

Reply via email to