Read from DPCD receiver capability field for DP to HDMI
converter. The features for DP to HDMI converter are

 - max TMDS characther clock rate
 - max bits per component
 - support for conversion from 3D frame sequential to frame pack
 - support for YCBCR422 pass through
 - support for YCBCR420 pass through
 - support for conversion from YCBCR444 to YCBCR422
 - support for conversion from YCBCR444 to YCBCR420

Signed-off-by: Mika Kahola <mika.kahola at intel.com>
---
 drivers/gpu/drm/drm_dp_helper.c |  8 ++++++++
 include/drm/drm_dp_helper.h     | 19 +++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index f5cf706..ccd0fcb 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -456,6 +456,14 @@ int drm_dp_bd(struct drm_dp_aux *aux, struct drm_dp_bd *bd)
                        bd->dfp.dvi.bpc = info[2] & DP_DS_VGA_MAX_BPC_MASK;
                        bd->dfp.dvi.dual_link = info[3] & DP_DS_DVI_DUAL_LINK;
                        bd->dfp.dvi.hi_color_depth = info[3] & 
DP_DS_DVI_HI_COLOR_DEPTH;
+               } else if (bd->type & DP_DS_PORT_TYPE_HDMI) {
+                       bd->dfp.hdmi.tmds_clk = info[1] * 2500;
+                       bd->dfp.hdmi.bpc = info[2] & DP_DS_VGA_MAX_BPC_MASK;
+                       bd->dfp.hdmi.frame_seq_to_frame_pack = info[3] & 
FRAME_SEQ_TO_FRAME_PACK;
+                       bd->dfp.hdmi.ycbcr422_pass_through = info[3] & 
YCBCR422_PASS_THROUGH;
+                       bd->dfp.hdmi.ycbcr420_pass_through = info[3] & 
YCBCR420_PASS_THROUGH;
+                       bd->dfp.hdmi.conversion_from_ycbcr444_to_ycbcr422 = 
info[3] & YCBCR444_TO_YCBCR422;
+                       bd->dfp.hdmi.conversion_from_ycbcr444_to_ycbcr420 = 
info[3] & YCBCR444_TO_YCBCR420;
                }
        }

diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 1a4e131..b8c4960 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -224,6 +224,12 @@
 /* offset 3 for DVI dual link and high color depth */
 # define DP_DS_DVI_DUAL_LINK                (1<<1)
 # define DP_DS_DVI_HI_COLOR_DEPTH           (1<<2)
+/* offset 3 for HDMI */
+# define FRAME_SEQ_TO_FRAME_PACK            (1<<0)
+# define YCBCR422_PASS_THROUGH              (1<<1)
+# define YCBCR420_PASS_THROUGH              (1<<2)
+# define YCBCR444_TO_YCBCR422               (1<<3)
+# define YCBCR444_TO_YCBCR420               (1<<4)

 /* link configuration */
 #define        DP_LINK_BW_SET                      0x100
@@ -822,6 +828,18 @@ struct drm_dp_dvi {
        bool dual_link;
        bool hi_color_depth;
 };
+/*
+ * DP to HDMI
+ */
+struct drm_dp_hdmi {
+       int tmds_clk;
+       uint8_t bpc;
+       bool frame_seq_to_frame_pack;
+       bool ycbcr422_pass_through;
+       bool ycbcr420_pass_through;
+       bool conversion_from_ycbcr444_to_ycbcr422;
+       bool conversion_from_ycbcr444_to_ycbcr420;
+};

 /*
  * Branch device
@@ -833,6 +851,7 @@ struct drm_dp_bd {
        union {
                struct drm_dp_vga vga;
                struct drm_dp_dvi dvi;
+               struct drm_dp_hdmi hdmi;
        } dfp;
 };

-- 
1.9.1

Reply via email to