Skip to content

Commit 1581b2d

Browse files
committed
drm/edid: Add display_info.rgb_quant_range_selectable
Move the CEA-861 QS bit handling entirely into the edid code. No need to bother the drivers with this. Cc: Alex Deucher <alexander.deucher@amd.com> Cc: "Christian König" <christian.koenig@amd.com> Cc: "David (ChunMing) Zhou" <David1.Zhou@amd.com> Cc: amd-gfx@lists.freedesktop.org Cc: Eric Anholt <eric@anholt.net> (supporter:DRM DRIVERS FOR VC4) Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Acked-by: Eric Anholt <eric@anholt.net> Link: https://patchwork.freedesktop.org/patch/msgid/20190108172828.15184-4-ville.syrjala@linux.intel.com
1 parent 8ee491b commit 1581b2d

File tree

9 files changed

+43
-68
lines changed

9 files changed

+43
-68
lines changed

drivers/gpu/drm/drm_edid.c

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3641,6 +3641,20 @@ static bool cea_db_is_hdmi_forum_vsdb(const u8 *db)
36413641
return oui == HDMI_FORUM_IEEE_OUI;
36423642
}
36433643

3644+
static bool cea_db_is_vcdb(const u8 *db)
3645+
{
3646+
if (cea_db_tag(db) != USE_EXTENDED_TAG)
3647+
return false;
3648+
3649+
if (cea_db_payload_len(db) != 2)
3650+
return false;
3651+
3652+
if (cea_db_extended_tag(db) != EXT_VIDEO_CAPABILITY_BLOCK)
3653+
return false;
3654+
3655+
return true;
3656+
}
3657+
36443658
static bool cea_db_is_y420cmdb(const u8 *db)
36453659
{
36463660
if (cea_db_tag(db) != USE_EXTENDED_TAG)
@@ -4223,41 +4237,6 @@ bool drm_detect_monitor_audio(struct edid *edid)
42234237
}
42244238
EXPORT_SYMBOL(drm_detect_monitor_audio);
42254239

4226-
/**
4227-
* drm_rgb_quant_range_selectable - is RGB quantization range selectable?
4228-
* @edid: EDID block to scan
4229-
*
4230-
* Check whether the monitor reports the RGB quantization range selection
4231-
* as supported. The AVI infoframe can then be used to inform the monitor
4232-
* which quantization range (full or limited) is used.
4233-
*
4234-
* Return: True if the RGB quantization range is selectable, false otherwise.
4235-
*/
4236-
bool drm_rgb_quant_range_selectable(struct edid *edid)
4237-
{
4238-
u8 *edid_ext;
4239-
int i, start, end;
4240-
4241-
edid_ext = drm_find_cea_extension(edid);
4242-
if (!edid_ext)
4243-
return false;
4244-
4245-
if (cea_db_offsets(edid_ext, &start, &end))
4246-
return false;
4247-
4248-
for_each_cea_db(edid_ext, i, start, end) {
4249-
if (cea_db_tag(&edid_ext[i]) == USE_EXTENDED_TAG &&
4250-
cea_db_payload_len(&edid_ext[i]) == 2 &&
4251-
cea_db_extended_tag(&edid_ext[i]) ==
4252-
EXT_VIDEO_CAPABILITY_BLOCK) {
4253-
DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]);
4254-
return edid_ext[i + 2] & EDID_CEA_VCDB_QS;
4255-
}
4256-
}
4257-
4258-
return false;
4259-
}
4260-
EXPORT_SYMBOL(drm_rgb_quant_range_selectable);
42614240

42624241
/**
42634242
* drm_default_rgb_quant_range - default RGB quantization range
@@ -4278,6 +4257,16 @@ drm_default_rgb_quant_range(const struct drm_display_mode *mode)
42784257
}
42794258
EXPORT_SYMBOL(drm_default_rgb_quant_range);
42804259

4260+
static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db)
4261+
{
4262+
struct drm_display_info *info = &connector->display_info;
4263+
4264+
DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", db[2]);
4265+
4266+
if (db[2] & EDID_CEA_VCDB_QS)
4267+
info->rgb_quant_range_selectable = true;
4268+
}
4269+
42814270
static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector,
42824271
const u8 *db)
42834272
{
@@ -4452,6 +4441,8 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
44524441
drm_parse_hdmi_forum_vsdb(connector, db);
44534442
if (cea_db_is_y420cmdb(db))
44544443
drm_parse_y420cmdb_bitmap(connector, db);
4444+
if (cea_db_is_vcdb(db))
4445+
drm_parse_vcdb(connector, db);
44554446
}
44564447
}
44574448

@@ -4472,6 +4463,7 @@ drm_reset_display_info(struct drm_connector *connector)
44724463
info->max_tmds_clock = 0;
44734464
info->dvi_dual = false;
44744465
info->has_hdmi_infoframe = false;
4466+
info->rgb_quant_range_selectable = false;
44754467
memset(&info->hdmi, 0, sizeof(info->hdmi));
44764468

44774469
info->non_desktop = 0;
@@ -4939,15 +4931,15 @@ EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
49394931
* @connector: the connector
49404932
* @mode: DRM display mode
49414933
* @rgb_quant_range: RGB quantization range (Q)
4942-
* @rgb_quant_range_selectable: Sink support selectable RGB quantization range (QS)
49434934
*/
49444935
void
49454936
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
49464937
struct drm_connector *connector,
49474938
const struct drm_display_mode *mode,
4948-
enum hdmi_quantization_range rgb_quant_range,
4949-
bool rgb_quant_range_selectable)
4939+
enum hdmi_quantization_range rgb_quant_range)
49504940
{
4941+
const struct drm_display_info *info = &connector->display_info;
4942+
49514943
/*
49524944
* CEA-861:
49534945
* "A Source shall not send a non-zero Q value that does not correspond
@@ -4958,7 +4950,7 @@ drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
49584950
* HDMI 2.0 recommends sending non-zero Q when it does match the
49594951
* default RGB quantization range for the mode, even when QS=0.
49604952
*/
4961-
if (rgb_quant_range_selectable ||
4953+
if (info->rgb_quant_range_selectable ||
49624954
rgb_quant_range == drm_default_rgb_quant_range(mode))
49634955
frame->quantization_range = rgb_quant_range;
49644956
else

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1057,7 +1057,6 @@ struct intel_hdmi {
10571057
} dp_dual_mode;
10581058
bool has_hdmi_sink;
10591059
bool has_audio;
1060-
bool rgb_quant_range_selectable;
10611060
struct intel_connector *attached_connector;
10621061
struct cec_notifier *cec_notifier;
10631062
};

drivers/gpu/drm/i915/intel_hdmi.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,6 @@ static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder,
462462
const struct intel_crtc_state *crtc_state,
463463
const struct drm_connector_state *conn_state)
464464
{
465-
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
466465
const struct drm_display_mode *adjusted_mode =
467466
&crtc_state->base.adjusted_mode;
468467
union hdmi_infoframe frame;
@@ -488,8 +487,7 @@ static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder,
488487
adjusted_mode,
489488
crtc_state->limited_color_range ?
490489
HDMI_QUANTIZATION_RANGE_LIMITED :
491-
HDMI_QUANTIZATION_RANGE_FULL,
492-
intel_hdmi->rgb_quant_range_selectable);
490+
HDMI_QUANTIZATION_RANGE_FULL);
493491

494492
drm_hdmi_avi_infoframe_content_type(&frame.avi,
495493
conn_state);
@@ -1816,7 +1814,6 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
18161814

18171815
intel_hdmi->has_hdmi_sink = false;
18181816
intel_hdmi->has_audio = false;
1819-
intel_hdmi->rgb_quant_range_selectable = false;
18201817

18211818
intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
18221819
intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
@@ -1900,9 +1897,6 @@ intel_hdmi_set_edid(struct drm_connector *connector)
19001897

19011898
to_intel_connector(connector)->detect_edid = edid;
19021899
if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
1903-
intel_hdmi->rgb_quant_range_selectable =
1904-
drm_rgb_quant_range_selectable(edid);
1905-
19061900
intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
19071901
intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
19081902

drivers/gpu/drm/i915/intel_lspcon.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -492,8 +492,7 @@ void lspcon_set_infoframes(struct intel_encoder *encoder,
492492
adjusted_mode,
493493
crtc_state->limited_color_range ?
494494
HDMI_QUANTIZATION_RANGE_LIMITED :
495-
HDMI_QUANTIZATION_RANGE_FULL,
496-
false);
495+
HDMI_QUANTIZATION_RANGE_FULL);
497496

498497
ret = hdmi_infoframe_pack(&frame, buf, sizeof(buf));
499498
if (ret < 0) {

drivers/gpu/drm/i915/intel_sdvo.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ struct intel_sdvo {
103103

104104
bool has_hdmi_monitor;
105105
bool has_hdmi_audio;
106-
bool rgb_quant_range_selectable;
107106

108107
/* DDC bus used by this SDVO encoder */
109108
uint8_t ddc_bus;
@@ -1004,8 +1003,7 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo,
10041003
adjusted_mode,
10051004
pipe_config->limited_color_range ?
10061005
HDMI_QUANTIZATION_RANGE_LIMITED :
1007-
HDMI_QUANTIZATION_RANGE_FULL,
1008-
intel_sdvo->rgb_quant_range_selectable);
1006+
HDMI_QUANTIZATION_RANGE_FULL);
10091007

10101008
len = hdmi_infoframe_pack(&frame, sdvo_data, sizeof(sdvo_data));
10111009
if (len < 0)
@@ -1805,8 +1803,6 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
18051803
if (intel_sdvo_connector->is_hdmi) {
18061804
intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid);
18071805
intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
1808-
intel_sdvo->rgb_quant_range_selectable =
1809-
drm_rgb_quant_range_selectable(edid);
18101806
}
18111807
} else
18121808
status = connector_status_disconnected;
@@ -1855,7 +1851,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
18551851

18561852
intel_sdvo->has_hdmi_monitor = false;
18571853
intel_sdvo->has_hdmi_audio = false;
1858-
intel_sdvo->rgb_quant_range_selectable = false;
18591854

18601855
if ((intel_sdvo_connector->output_flag & response) == 0)
18611856
ret = connector_status_disconnected;

drivers/gpu/drm/radeon/radeon_audio.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,8 +526,7 @@ static int radeon_audio_set_avi_packet(struct drm_encoder *encoder,
526526
drm_hdmi_avi_infoframe_quant_range(&frame, connector, mode,
527527
radeon_encoder->output_csc == RADEON_OUTPUT_CSC_TVRGB ?
528528
HDMI_QUANTIZATION_RANGE_LIMITED :
529-
HDMI_QUANTIZATION_RANGE_FULL,
530-
drm_rgb_quant_range_selectable(radeon_connector_edid(connector)));
529+
HDMI_QUANTIZATION_RANGE_FULL);
531530
}
532531

533532
err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));

drivers/gpu/drm/vc4/vc4_hdmi.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ struct vc4_hdmi_encoder {
109109
struct vc4_encoder base;
110110
bool hdmi_monitor;
111111
bool limited_rgb_range;
112-
bool rgb_range_selectable;
113112
};
114113

115114
static inline struct vc4_hdmi_encoder *
@@ -280,11 +279,6 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
280279

281280
vc4_encoder->hdmi_monitor = drm_detect_hdmi_monitor(edid);
282281

283-
if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
284-
vc4_encoder->rgb_range_selectable =
285-
drm_rgb_quant_range_selectable(edid);
286-
}
287-
288282
drm_connector_update_edid_property(connector, edid);
289283
ret = drm_add_edid_modes(connector, edid);
290284
kfree(edid);
@@ -435,8 +429,7 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
435429
hdmi->connector, mode,
436430
vc4_encoder->limited_rgb_range ?
437431
HDMI_QUANTIZATION_RANGE_LIMITED :
438-
HDMI_QUANTIZATION_RANGE_FULL,
439-
vc4_encoder->rgb_range_selectable);
432+
HDMI_QUANTIZATION_RANGE_FULL);
440433

441434
frame.avi.right_bar = cstate->tv.margins.right;
442435
frame.avi.left_bar = cstate->tv.margins.left;

include/drm/drm_connector.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,12 @@ struct drm_display_info {
365365
*/
366366
bool has_hdmi_infoframe;
367367

368+
/**
369+
* @rgb_quant_range_selectable: Does the sink support selecting
370+
* the RGB quantization range?
371+
*/
372+
bool rgb_quant_range_selectable;
373+
368374
/**
369375
* @edid_hdmi_dc_modes: Mask of supported hdmi deep color modes. Even
370376
* more stuff redundant with @bus_formats.

include/drm/drm_edid.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,7 @@ void
362362
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
363363
struct drm_connector *connector,
364364
const struct drm_display_mode *mode,
365-
enum hdmi_quantization_range rgb_quant_range,
366-
bool rgb_quant_range_selectable);
365+
enum hdmi_quantization_range rgb_quant_range);
367366

368367
/**
369368
* drm_eld_mnl - Get ELD monitor name length in bytes.
@@ -471,7 +470,6 @@ u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
471470
enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);
472471
bool drm_detect_hdmi_monitor(struct edid *edid);
473472
bool drm_detect_monitor_audio(struct edid *edid);
474-
bool drm_rgb_quant_range_selectable(struct edid *edid);
475473
enum hdmi_quantization_range
476474
drm_default_rgb_quant_range(const struct drm_display_mode *mode);
477475
int drm_add_modes_noedid(struct drm_connector *connector,

0 commit comments

Comments
 (0)