... |
... |
@@ -2142,6 +2142,51 @@ drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes) |
2142
|
2142
|
return MODE_OK;
|
2143
|
2143
|
}
|
2144
|
2144
|
|
|
2145
|
+static void
|
|
2146
|
+drmmode_output_attach_tile(xf86OutputPtr output)
|
|
2147
|
+{
|
|
2148
|
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1, 17, 99, 901, 0)
|
|
2149
|
+ drmmode_output_private_ptr drmmode_output = output->driver_private;
|
|
2150
|
+ drmModeConnectorPtr koutput = drmmode_output->mode_output;
|
|
2151
|
+ AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(output->scrn);
|
|
2152
|
+ struct xf86CrtcTileInfo tile_info, *set = NULL;
|
|
2153
|
+ int i;
|
|
2154
|
+
|
|
2155
|
+ if (!koutput) {
|
|
2156
|
+ xf86OutputSetTile(output, NULL);
|
|
2157
|
+ return;
|
|
2158
|
+ }
|
|
2159
|
+
|
|
2160
|
+ /* look for a TILE property */
|
|
2161
|
+ for (i = 0; i < koutput->count_props; i++) {
|
|
2162
|
+ drmModePropertyPtr props;
|
|
2163
|
+ props = drmModeGetProperty(pAMDGPUEnt->fd, koutput->props[i]);
|
|
2164
|
+ if (!props)
|
|
2165
|
+ continue;
|
|
2166
|
+
|
|
2167
|
+ if (!(props->flags & DRM_MODE_PROP_BLOB)) {
|
|
2168
|
+ drmModeFreeProperty(props);
|
|
2169
|
+ continue;
|
|
2170
|
+ }
|
|
2171
|
+
|
|
2172
|
+ if (!strcmp(props->name, "TILE")) {
|
|
2173
|
+ drmModeFreePropertyBlob(drmmode_output->tile_blob);
|
|
2174
|
+ drmmode_output->tile_blob =
|
|
2175
|
+ drmModeGetPropertyBlob(pAMDGPUEnt->fd,
|
|
2176
|
+ koutput->prop_values[i]);
|
|
2177
|
+ }
|
|
2178
|
+ drmModeFreeProperty(props);
|
|
2179
|
+ }
|
|
2180
|
+ if (drmmode_output->tile_blob) {
|
|
2181
|
+ if (xf86OutputParseKMSTile(drmmode_output->tile_blob->data,
|
|
2182
|
+ drmmode_output->tile_blob->length,
|
|
2183
|
+ &tile_info) == TRUE)
|
|
2184
|
+ set = &tile_info;
|
|
2185
|
+ }
|
|
2186
|
+ xf86OutputSetTile(output, set);
|
|
2187
|
+#endif
|
|
2188
|
+}
|
|
2189
|
+
|
2145
|
2190
|
static int
|
2146
|
2191
|
koutput_get_prop_idx(int fd, drmModeConnectorPtr koutput,
|
2147
|
2192
|
int type, const char *name)
|
... |
... |
@@ -2213,6 +2258,8 @@ static DisplayModePtr drmmode_output_get_modes(xf86OutputPtr output) |
2213
|
2258
|
}
|
2214
|
2259
|
xf86OutputSetEDID(output, mon);
|
2215
|
2260
|
|
|
2261
|
+ drmmode_output_attach_tile(output);
|
|
2262
|
+
|
2216
|
2263
|
/* modes should already be available */
|
2217
|
2264
|
for (i = 0; i < koutput->count_modes; i++) {
|
2218
|
2265
|
Mode = xnfalloc(sizeof(DisplayModeRec));
|
... |
... |
@@ -2230,8 +2277,11 @@ static void drmmode_output_destroy(xf86OutputPtr output) |
2230
|
2277
|
drmmode_output_private_ptr drmmode_output = output->driver_private;
|
2231
|
2278
|
int i;
|
2232
|
2279
|
|
2233
|
|
- if (drmmode_output->edid_blob)
|
2234
|
|
- drmModeFreePropertyBlob(drmmode_output->edid_blob);
|
|
2280
|
+ drmModeFreePropertyBlob(drmmode_output->edid_blob);
|
|
2281
|
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1, 17, 99, 901, 0)
|
|
2282
|
+ drmModeFreePropertyBlob(drmmode_output->tile_blob);
|
|
2283
|
+#endif
|
|
2284
|
+
|
2235
|
2285
|
for (i = 0; i < drmmode_output->num_props; i++) {
|
2236
|
2286
|
drmModeFreeProperty(drmmode_output->props[i].mode_prop);
|
2237
|
2287
|
free(drmmode_output->props[i].atoms);
|