[PATCH] modesetting: add tile property support (v2.1)

Dave Airlie airlied at gmail.com
Tue Mar 31 17:31:43 PDT 2015


From: Dave Airlie <airlied at redhat.com>

This adds tiling support to the server modesetting driver,
it retrieves the tile info from the kernel and translates
it into the server format and exposes the property.

v2.1: fix resetting tile property (Chris)

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 hw/xfree86/drivers/modesetting/drmmode_display.c | 42 ++++++++++++++++++++++++
 hw/xfree86/drivers/modesetting/drmmode_display.h |  1 +
 2 files changed, 43 insertions(+)

diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index c7cb453..81d3e26 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -749,6 +749,46 @@ drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
     return MODE_OK;
 }
 
+static void
+drmmode_output_attach_tile(xf86OutputPtr output)
+{
+    drmmode_output_private_ptr drmmode_output = output->driver_private;
+    drmModeConnectorPtr koutput = drmmode_output->mode_output;
+    drmmode_ptr drmmode = drmmode_output->drmmode;
+    int i;
+    struct xf86CrtcTileInfo tile_info, *set = NULL;
+
+    if (!koutput) {
+        xf86OutputSetTile(output, NULL);
+        return;
+    }
+
+    /* look for a TILE property */
+    for (i = 0; i < koutput->count_props; i++) {
+        drmModePropertyPtr props;
+        props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
+        if (!props)
+            continue;
+
+        if (!(props->flags & DRM_MODE_PROP_BLOB)) {
+            drmModeFreeProperty(props);
+            continue;
+        }
+
+        if (!strcmp(props->name, "TILE")) {
+            drmModeFreePropertyBlob(drmmode_output->tile_blob);
+            drmmode_output->tile_blob =
+                drmModeGetPropertyBlob(drmmode->fd, koutput->prop_values[i]);
+        }
+        drmModeFreeProperty(props);
+    }
+    if (drmmode_output->tile_blob) {
+        if (xf86OutputParseKMSTile(drmmode_output->tile_blob->data, drmmode_output->tile_blob->length, &tile_info) == TRUE)
+            set = &tile_info;
+    }
+    xf86OutputSetTile(output, set);
+}
+
 static Bool
 has_panel_fitter(xf86OutputPtr output)
 {
@@ -857,6 +897,8 @@ drmmode_output_get_modes(xf86OutputPtr output)
     }
     xf86OutputSetEDID(output, mon);
 
+    drmmode_output_attach_tile(output);
+
     /* modes should already be available */
     for (i = 0; i < koutput->count_modes; i++) {
         Mode = xnfalloc(sizeof(DisplayModeRec));
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
index 769842d..746692b 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.h
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
@@ -121,6 +121,7 @@ typedef struct {
     drmModeConnectorPtr mode_output;
     drmModeEncoderPtr *mode_encoders;
     drmModePropertyBlobPtr edid_blob;
+    drmModePropertyBlobPtr tile_blob;
     int dpms_enum_id;
     int num_props;
     drmmode_prop_ptr props;
-- 
2.3.3



More information about the xorg-devel mailing list