Skip to content

Commit 8576568

Browse files
CertainLach1Naim
authored andcommitted
drm/edid: MSO should only be used for non-eDP displays
As per DisplayID v2.1a spec: If Offset 06h[2:0] is programmed to 001b (External DisplayPort), this field shall be cleared to 00b (Not supported). Link: https://lore.kernel.org/lkml/3abc1087618c822e5676e67a3ec2e64e506dc5ec@intel.com/ Signed-off-by: Yaroslav Bolyukin <iam@lach.pw> Reviewed-by: Jani Nikula <jani.nikula@intel.com>
1 parent 70e9fb0 commit 8576568

2 files changed

Lines changed: 27 additions & 13 deletions

File tree

drivers/gpu/drm/drm_displayid_internal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,13 @@ struct displayid_formula_timing_block {
142142
struct displayid_formula_timings_9 timings[];
143143
} __packed;
144144

145+
#define DISPLAYID_VESA_DP_TYPE GENMASK(2, 0)
145146
#define DISPLAYID_VESA_MSO_OVERLAP GENMASK(3, 0)
146147
#define DISPLAYID_VESA_MSO_MODE GENMASK(6, 5)
147148

149+
#define DISPLAYID_VESA_DP_TYPE_EDP 0
150+
#define DISPLAYID_VESA_DP_TYPE_DP 1
151+
148152
struct displayid_vesa_vendor_specific_block {
149153
struct displayid_block base;
150154
u8 oui[3];

drivers/gpu/drm/drm_edid.c

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6533,6 +6533,7 @@ static void drm_parse_vesa_specific_block(struct drm_connector *connector,
65336533
struct displayid_vesa_vendor_specific_block *vesa =
65346534
(struct displayid_vesa_vendor_specific_block *)block;
65356535
struct drm_display_info *info = &connector->display_info;
6536+
int dp_type;
65366537

65376538
if (block->num_bytes < 3) {
65386539
drm_dbg_kms(connector->dev,
@@ -6551,20 +6552,29 @@ static void drm_parse_vesa_specific_block(struct drm_connector *connector,
65516552
return;
65526553
}
65536554

6554-
switch (FIELD_GET(DISPLAYID_VESA_MSO_MODE, vesa->mso)) {
6555-
default:
6556-
drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Reserved MSO mode value\n",
6555+
dp_type = FIELD_GET(DISPLAYID_VESA_DP_TYPE, vesa->data_structure_type);
6556+
if (dp_type > 1) {
6557+
drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Reserved dp type value\n",
65576558
connector->base.id, connector->name);
6558-
fallthrough;
6559-
case 0:
6560-
info->mso_stream_count = 0;
6561-
break;
6562-
case 1:
6563-
info->mso_stream_count = 2; /* 2 or 4 links */
6564-
break;
6565-
case 2:
6566-
info->mso_stream_count = 4; /* 4 links */
6567-
break;
6559+
}
6560+
6561+
/* MSO is only supported for eDP */
6562+
if (dp_type == DISPLAYID_VESA_DP_TYPE_EDP) {
6563+
switch (FIELD_GET(DISPLAYID_VESA_MSO_MODE, vesa->mso)) {
6564+
default:
6565+
drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Reserved MSO mode value\n",
6566+
connector->base.id, connector->name);
6567+
fallthrough;
6568+
case 0:
6569+
info->mso_stream_count = 0;
6570+
break;
6571+
case 1:
6572+
info->mso_stream_count = 2; /* 2 or 4 links */
6573+
break;
6574+
case 2:
6575+
info->mso_stream_count = 4; /* 4 links */
6576+
break;
6577+
}
65686578
}
65696579

65706580
if (info->mso_stream_count) {

0 commit comments

Comments
 (0)