aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVivek Kasireddy <vivek.kasireddy@intel.com>2022-11-17 17:30:53 -0800
committerGerd Hoffmann <kraxel@redhat.com>2023-01-26 08:31:41 +0100
commit347d001a65ba84c02ebd403000bf4e524cf678e6 (patch)
tree6e238120d38c8632fae52e721b0eb951bedd5416
parenta6982e7a2d2ca693e91c9016a56bc4efba5c56d7 (diff)
downloadlinux-347d001a65ba84c02ebd403000bf4e524cf678e6.tar.gz
drm/virtio: Attach and set suggested_x/y properties for the connector
These properties provide a way to suggest to the userspace the preferred positions for the outputs. Mutter already uses these properties to determine the best positions for the outputs. Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Dongwon Kim <dongwon.kim@intel.com> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20221118013054.182304-2-vivek.kasireddy@intel.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_display.c5
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_vq.c12
2 files changed, 17 insertions, 0 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
index 9ea7611a9e0f..868b0183c6df 100644
--- a/drivers/gpu/drm/virtio/virtgpu_display.c
+++ b/drivers/gpu/drm/virtio/virtgpu_display.c
@@ -282,6 +282,10 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
drm_connector_helper_add(connector, &virtio_gpu_conn_helper_funcs);
if (vgdev->has_edid)
drm_connector_attach_edid_property(connector);
+ drm_object_attach_property(&connector->base,
+ dev->mode_config.suggested_x_property, 0);
+ drm_object_attach_property(&connector->base,
+ dev->mode_config.suggested_y_property, 0);
drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_VIRTUAL);
drm_encoder_helper_add(encoder, &virtio_gpu_enc_helper_funcs);
@@ -350,6 +354,7 @@ int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev)
vgdev->ddev->mode_config.max_height = YRES_MAX;
vgdev->ddev->mode_config.fb_modifiers_not_supported = true;
+ drm_mode_create_suggested_offset_properties(vgdev->ddev);
for (i = 0 ; i < vgdev->num_scanouts; ++i)
vgdev_output_init(vgdev, i);
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index a04a9b20896d..a7cb95a63196 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -645,6 +645,17 @@ virtio_gpu_cmd_resource_attach_backing(struct virtio_gpu_device *vgdev,
virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence);
}
+static void virtio_gpu_update_output_position(struct virtio_gpu_output *output)
+{
+ struct drm_connector *connector = &output->conn;
+ struct drm_device *dev = connector->dev;
+
+ drm_object_property_set_value(&connector->base,
+ dev->mode_config.suggested_x_property, output->info.r.x);
+ drm_object_property_set_value(&connector->base,
+ dev->mode_config.suggested_y_property, output->info.r.y);
+}
+
static void virtio_gpu_cmd_get_display_info_cb(struct virtio_gpu_device *vgdev,
struct virtio_gpu_vbuffer *vbuf)
{
@@ -655,6 +666,7 @@ static void virtio_gpu_cmd_get_display_info_cb(struct virtio_gpu_device *vgdev,
spin_lock(&vgdev->display_info_lock);
for (i = 0; i < vgdev->num_scanouts; i++) {
vgdev->outputs[i].info = resp->pmodes[i];
+ virtio_gpu_update_output_position(&vgdev->outputs[i]);
if (resp->pmodes[i].enabled) {
DRM_DEBUG("output %d: %dx%d+%d+%d", i,
le32_to_cpu(resp->pmodes[i].r.width),