diff -urpN xf86-video-ati-7.6.1.orig/src/drmmode_display.c xf86-video-ati-7.6.1/src/drmmode_display.c --- xf86-video-ati-7.6.1.orig/src/drmmode_display.c 2015-11-11 20:39:30.000000000 -0800 +++ xf86-video-ati-7.6.1/src/drmmode_display.c 2015-11-19 16:19:34.126829985 -0800 @@ -32,6 +32,7 @@ #include #include #include +#include #include "cursorstr.h" #include "damagestr.h" #include "micmap.h" @@ -1374,9 +1375,9 @@ static int subpixel_conv_table[7] = { 0, const char *output_names[] = { "None", "VGA", - "DVI", - "DVI", - "DVI", + "DVI-I", + "DVI-D", + "DVI-A", "Composite", "S-video", "LVDS", @@ -1384,7 +1385,7 @@ const char *output_names[] = { "None", "DIN", "DisplayPort", "HDMI", - "HDMI", + "HDMI-B", "TV", "eDP" }; @@ -1438,7 +1439,7 @@ static int parse_path_blob(drmModeProper } static void -drmmode_create_name(ScrnInfoPtr pScrn, drmModeConnectorPtr koutput, char *name, +drmmode_create_name(ScrnInfoPtr pScrn, drmModeConnectorPtr koutput, char *name, char *prefix, drmModePropertyBlobPtr path_blob, int *num_dvi, int *num_hdmi) { xf86OutputPtr output; @@ -1451,42 +1452,65 @@ drmmode_create_name(ScrnInfoPtr pScrn, d if (output) { snprintf(name, 32, "%s-%s", output->name, extra_path); } else { - if (koutput->connector_type >= NUM_OUTPUT_NAMES) - snprintf(name, 32, "Unknown%d-%d", koutput->connector_type, - koutput->connector_type_id - 1); + if (koutput->connector_type >= NUM_OUTPUT_NAMES) { #ifdef RADEON_PIXMAP_SHARING - else if (pScrn->is_gpu) - snprintf(name, 32, "%s-%d-%d", - output_names[koutput->connector_type], pScrn->scrnIndex - GPU_SCREEN_OFFSET + 1, + if (pScrn->is_gpu) + snprintf(prefix, 32, "Unknown-%d", pScrn->scrnIndex - GPU_SCREEN_OFFSET + 1); + else +#endif + strncpy(prefix, "Unknown", 32); + snprintf(name, 32, "%s-%d-%d", prefix, koutput->connector_type, koutput->connector_type_id - 1); + } else { + /* override_output_number is for special-case output name hacks. + * If set to a nonnegative value, override_output_number will be used + * to choose the numeric output suffix instead of connector_type_id. + * If set to -2, no numeric suffix will be appended at all. */ + int override_output_number = -1; +#ifdef RADEON_PIXMAP_SHARING + if (pScrn->is_gpu) + snprintf(prefix, 32, "%s-%d", output_names[koutput->connector_type], + pScrn->scrnIndex - GPU_SCREEN_OFFSET + 1); + else #endif - else { - /* need to do smart conversion here for compat with non-kms ATI driver */ - if (koutput->connector_type_id == 1) { - switch(koutput->connector_type) { - case DRM_MODE_CONNECTOR_DVII: - case DRM_MODE_CONNECTOR_DVID: - case DRM_MODE_CONNECTOR_DVIA: - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_dvi); - (*num_dvi)++; - break; - case DRM_MODE_CONNECTOR_HDMIA: - case DRM_MODE_CONNECTOR_HDMIB: - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_hdmi); - (*num_hdmi)++; - break; - case DRM_MODE_CONNECTOR_VGA: - case DRM_MODE_CONNECTOR_DisplayPort: - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], - koutput->connector_type_id - 1); - break; - default: - snprintf(name, 32, "%s", output_names[koutput->connector_type]); - break; + if (koutput->connector_type_id == 1) { + /* This legacy naming convention has become so widely relied + * upon that, without some automagic migration mechanism, + * changing it would cause too much breakage */ + switch(koutput->connector_type) { + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_DVID: + case DRM_MODE_CONNECTOR_DVIA: + strncpy(prefix, "DVI", 32); + override_output_number = (*num_dvi)++; + break; + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + strncpy(prefix, "HDMI", 32); + override_output_number = (*num_hdmi)++; + break; + case DRM_MODE_CONNECTOR_VGA: + case DRM_MODE_CONNECTOR_DisplayPort: + strncpy(prefix, output_names[koutput->connector_type], 32); + break; + default: + strncpy(prefix, output_names[koutput->connector_type], 32); + override_output_number = -2; + break; + } + } else { + strncpy(prefix, output_names[koutput->connector_type], 32); } - } else { - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], - koutput->connector_type_id - 1); + switch(override_output_number) { + case -2: + strncpy(name, prefix, 32); + break; + case -1: + snprintf(name, 32, "%s-%d", prefix, koutput->connector_type_id - 1); + break; + default: + snprintf(name, 32, "%s-%d", prefix, override_output_number); + break; } } } @@ -1503,7 +1527,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, d drmmode_output_private_ptr drmmode_output; drmModePropertyPtr props; drmModePropertyBlobPtr path_blob = NULL; - char name[32]; + char prefix[32], name[32]; int i; const char *s; @@ -1535,7 +1559,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, d } } - drmmode_create_name(pScrn, koutput, name, path_blob, num_dvi, num_hdmi); + drmmode_create_name(pScrn, koutput, name, prefix, path_blob, num_dvi, num_hdmi); if (path_blob) drmModeFreePropertyBlob(path_blob);