From: Dave Airlie airl...@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 airl...@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
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel