[PATCH v4 2/2] drm: Add HDMI 2.0 VIC support for AVI info-frames

Ville Syrjälä ville.syrjala at linux.intel.com
Thu Mar 23 17:42:47 UTC 2017


On Thu, Mar 23, 2017 at 05:11:44PM +0000, Jose Abreu wrote:
> Hi Shashank,
> 
> 
> On 23-03-2017 16:43, Sharma, Shashank wrote:
> > Regards
> >
> > Shashank
> >
> >
> > On 3/23/2017 6:33 PM, Jose Abreu wrote:
> >> Hi Shashank,
> >>
> >>
> >> On 23-03-2017 16:08, Sharma, Shashank wrote:
> >>> Regards
> >>>
> >>> Shashank
> >>>
> >>>
> >>> On 3/23/2017 5:57 PM, Jose Abreu wrote:
> >>>> Hi Ville,
> >>>>
> >>>>
> >>>> On 23-03-2017 15:45, Ville Syrjälä wrote:
> >>>>> On Thu, Mar 23, 2017 at 03:28:29PM +0000, Jose Abreu wrote:
> >>>>>> Hi Shashank,
> >>>>>>
> >>>>>>
> >>>>>> On 23-03-2017 15:14, Shashank Sharma wrote:
> >>>>>>> HDMI 1.4b support the CEA video modes as per range of
> >>>>>>> CEA-861-D (VIC 1-64).
> >>>>>>> For any other mode, the VIC filed in AVI infoframes should
> >>>>>>> be 0.
> >>>>>>> HDMI 2.0 sinks, support video modes range as per CEA-861-F
> >>>>>>> spec, which is
> >>>>>>> extended to (VIC 1-107).
> >>>>>>>
> >>>>>>> This patch adds a bool input variable, which indicates if
> >>>>>>> the connected
> >>>>>>> sink is a HDMI 2.0 sink or not. This will make sure that we
> >>>>>>> don't pass a
> >>>>>>> HDMI 2.0 VIC to a HDMI 1.4 sink.
> >>>>>>>
> >>>>>>> This patch touches all drm drivers, who are callers of this
> >>>>>>> function
> >>>>>>> drm_hdmi_avi_infoframe_from_display_mode but to make sure
> >>>>>>> there is
> >>>>>>> no change in current behavior, is_hdmi2 is kept as false.
> >>>>>>>
> >>>>>>> In case of I915 driver, this patch checks the
> >>>>>>> connector->display_info
> >>>>>>> to check if the connected display is HDMI 2.0.
> >>>>>>>
> >>>>>>> Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
> >>>>>>> Cc: Jose Abreu <jose.abreu at synopsys.com>
> >>>>>>> Cc: Andrzej Hajda <a.hajda at samsung.com>
> >>>>>>> Cc: Alex Deucher <alexander.deucher at amd.com>
> >>>>>>> Cc: Daniel Vetter <daniel.vetter at intel.com>
> >>>>>>>
> >>>>>>> PS: This patch touches a few lines in few files, which were
> >>>>>>> already above 80 char, so checkpatch gives 80 char warning
> >>>>>>> again.
> >>>>>>> - gpu/drm/omapdrm/omap_encoder.c
> >>>>>>> - gpu/drm/i915/intel_sdvo.c
> >>>>>>>
> >>>>>>> Signed-off-by: Shashank Sharma <shashank.sharma at intel.com>
> >>>>>>> ---
> >>>>>>>    drivers/gpu/drm/amd/amdgpu/dce_v10_0.c    |  2 +-
> >>>>>>>    drivers/gpu/drm/amd/amdgpu/dce_v11_0.c    |  2 +-
> >>>>>>>    drivers/gpu/drm/amd/amdgpu/dce_v8_0.c     |  2 +-
> >>>>>>>    drivers/gpu/drm/bridge/analogix-anx78xx.c |  3 ++-
> >>>>>>>    drivers/gpu/drm/bridge/sii902x.c          |  2 +-
> >>>>>>>    drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  2 +-
> >>>>>>>    drivers/gpu/drm/drm_edid.c                | 12
> >>>>>>> +++++++++++-
> >>>>>>>    drivers/gpu/drm/exynos/exynos_hdmi.c      |  2 +-
> >>>>>>>    drivers/gpu/drm/i2c/tda998x_drv.c         |  2 +-
> >>>>>>>    drivers/gpu/drm/i915/intel_hdmi.c         |  5 ++++-
> >>>>>>>    drivers/gpu/drm/i915/intel_sdvo.c         |  3 ++-
> >>>>>>>    drivers/gpu/drm/mediatek/mtk_hdmi.c       |  2 +-
> >>>>>>>    drivers/gpu/drm/omapdrm/omap_encoder.c    |  3 ++-
> >>>>>>>    drivers/gpu/drm/radeon/radeon_audio.c     |  2 +-
> >>>>>>>    drivers/gpu/drm/rockchip/inno_hdmi.c      |  2 +-
> >>>>>>>    drivers/gpu/drm/sti/sti_hdmi.c            |  2 +-
> >>>>>>>    drivers/gpu/drm/tegra/hdmi.c              |  2 +-
> >>>>>>>    drivers/gpu/drm/tegra/sor.c               |  2 +-
> >>>>>>>    drivers/gpu/drm/vc4/vc4_hdmi.c            |  2 +-
> >>>>>>>    drivers/gpu/drm/zte/zx_hdmi.c             |  2 +-
> >>>>>>>    include/drm/drm_edid.h                    |  3 ++-
> >>>>>>>    21 files changed, 38 insertions(+), 21 deletions(-)
> >>>>>>>
> >>>>>> [snip]
> >>>>>>
> >>>>>>> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
> >>>>>>> b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
> >>>>>>> index af93f7a..5ff2886 100644
> >>>>>>> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
> >>>>>>> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
> >>>>>>> @@ -1146,7 +1146,7 @@ static void hdmi_config_AVI(struct
> >>>>>>> dw_hdmi *hdmi, struct drm_display_mode *mode)
> >>>>>>>        u8 val;
> >>>>>>>          /* Initialise info frame from DRM mode */
> >>>>>>> -    drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
> >>>>>>> +    drm_hdmi_avi_infoframe_from_display_mode(&frame, mode,
> >>>>>>> false);
> >>>>>>>          if (hdmi->hdmi_data.enc_out_format == YCBCR444)
> >>>>>>>            frame.colorspace = HDMI_COLORSPACE_YUV444;
> >>>>>>>
> >>>>>> dw-hdmi controller has full support for HDMI 2.0 features.
> >>>>>> It all
> >>>>>> depends on the platform it is integrated.
> >>>>>>
> >>>>>> I think adding a parameter to
> >>>>>> drm_hdmi_avi_infoframe_from_display_mode is not the best idea
> >>>>>> because of this case: A bridge can have support for HDMI 2.0
> >>>>>> features but the platform may limit this support. I guess it
> >>>>>> can
> >>>>>> happen in other drivers too.
> >>>>> Your driver is in full control of what gets passed here. So I
> >>>>> don't see
> >>>>> why that would be a problem.
> >>>>>
> >>>>> Also this doesn't really have anything to do with the
> >>>>> capabilities of
> >>>>> the source. All we want to make sure is that we don't send a
> >>>>> VIC the
> >>>>> sink will not understand.
> >>>>>
> >>>> But the driver is not aware of the platform limitations, its
> >>>> generic to the controller only. We could add a field in pdata
> >>>> which tells if platform is HDMI 2.0+ but what about other
> >>>> bridge
> >>>> drivers or HDMI drivers? They will have to replicate the same
> >>>> thing also.
> >>>>
> >>>> Best regards,
> >>>> Jose Miguel Abreu
> >>> I think the driver would be aware of the platform's
> >>> capabilities, isn't it ?
> >>> Else how would it even decide which mode to allow, and which to
> >>> reject ?
> >> The DRM core propagates the mode to the chain of configuration
> >> before reaching the bridge driver also, there is a callback
> >> supplied by pdata (mode_valid) which can check if the mode is
> >> valid. (see
> >> https://urldefense.proofpoint.com/v2/url?u=https-3A__cgit.freedesktop.org_-7Eairlied_linux_tree_drivers_gpu_drm_bridge_synopsys_dw-2Dhdmi.c-3Fh-3Ddrm-2Dnext-23n1740&d=DwID-g&c=DPL6_X_6JkXFx7AXWqB0tg&r=WHDsc6kcWAl4i96Vm5hJ_19IJiuxx_p_Rzo2g-uHDKw&m=zC1cWRy6RDWimQG2o866yYylV7c5h_U4aGWjVtnIHH0&s=DPZA3OgLWOO299hjy9dBDBK66kmUGfZArxKbeHNMKOc&e=
> >> )
> >>
> >> Best regards,
> >> Jose Miguel Abreu
> >>
> >>
> >>> Regards
> >>> Shashank
> > Please correct me if my understanding is not right, but drivers
> > call mode_valid() to prune/reject modes which they cant support.
> > and they call drm_set_infoframe_from_videomode() function, when
> > they are going ahead to the modeset with a mode.
> > Why would a driver choose to do a modeset, which it could not
> > support (shouldn't mode_valid have dropped it in atomic_check()
> > or may be even edid_parsing time ?)
> 
> Yes, thats all correct :) I got a little out of topic here, sorry.
> 
> The thing I don't agree with is the adding of the parameter for
> the drm_hdmi_avi_infoframe_from_display_mode(), because I think
> its not enough. I will state why:
> 
> Picture this scenario:
>     1) EDID is read from HDMI 2.0 sink
>     2) The 2.0 modes are probed and as there is no check for
> these modes (they are in the CEA table) they will be added to
> mode list
>     3) The modes are passed to userspace. This is a problem
> because userspace does not yet understand the new aspect ratios,
> but lets imagine it understands
>     4) User selects an HDMI 2.0 mode
>     5) The drm core checks if mode is valid with driver, the
> driver can say yes or no. Lets think it says yes because the
> platform supports HDMI 2.0 modes.
>     6) Mode is committed but VIC will be set to zero according to
> the patch

That's only because you haven't updated your driver to pass 'true'
as needed.

The other option would be to pass the connector instead of a boolean,
but according to Shashank that would required a lot of plumbing changes
because many drivers don't have the connector immediately available
where they call these functions. And plumbing the connector through
probably requires intimate knowledge of each driver, and thus is not
something we would be confortable doing. Hence I think the bool is the
best short term solution, letting each driver author figure out how to
get at the right connector and pass on the required information.

I don't really understand what you're even suggesting as an alternative.
We need to know what the sink supports, and if your driver is architected
in some crazy way where you don't even have that information where it's
needed, I don't think there's anything anyone can do.

-- 
Ville Syrjälä
Intel OTC


More information about the dri-devel mailing list