[PATCH 40/51] drm/amd/display: Enable Stereo in Dal3

Alex Deucher alexdeucher at gmail.com
Wed Jun 20 03:29:08 UTC 2018


On Tue, Jun 19, 2018 at 5:10 PM, Harry Wentland <harry.wentland at amd.com> wrote:
> From: Alvin lee <alvin.lee3 at amd.com>
>
> - program infoframe for Stereo
> - program stereo flip control registers properly
>
> Change-Id: If547e2677b72709359b3a8602357b80961f1bfce
> Signed-off-by: Alvin lee <alvin.lee3 at amd.com>
> Reviewed-by: Tony Cheng <Tony.Cheng at amd.com>
> Acked-by: Harry Wentland <harry.wentland at amd.com>
> ---
>  drivers/gpu/drm/amd/display/Makefile          |  3 +-
>  .../gpu/drm/amd/display/dc/core/dc_resource.c | 57 ++++++--------
>  drivers/gpu/drm/amd/display/dc/dc_stream.h    |  1 +
>  .../gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c | 18 ++++-
>  .../gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h |  4 +
>  .../amd/display/modules/inc/mod_info_packet.h | 15 ++++
>  .../amd/display/modules/info_packet/Makefile  | 31 ++++++++
>  .../display/modules/info_packet/info_packet.c | 74 +++++++++++++++++++
>  8 files changed, 165 insertions(+), 38 deletions(-)
>  create mode 100644 drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
>  create mode 100644 drivers/gpu/drm/amd/display/modules/info_packet/Makefile
>  create mode 100644 drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
>
> diff --git a/drivers/gpu/drm/amd/display/Makefile b/drivers/gpu/drm/amd/display/Makefile
> index a2c5be493555..c97dc9613325 100644
> --- a/drivers/gpu/drm/amd/display/Makefile
> +++ b/drivers/gpu/drm/amd/display/Makefile
> @@ -31,11 +31,12 @@ subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/inc/hw
>  subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/modules/inc
>  subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/modules/freesync
>  subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/modules/color
> +subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/modules/info_packet
>
>  #TODO: remove when Timing Sync feature is complete
>  subdir-ccflags-y += -DBUILD_FEATURE_TIMING_SYNC=0
>
> -DAL_LIBS = amdgpu_dm dc        modules/freesync modules/color
> +DAL_LIBS = amdgpu_dm dc        modules/freesync modules/color modules/info_packet
>
>  AMD_DAL = $(addsuffix /Makefile, $(addprefix $(FULL_AMD_DISPLAY_PATH)/,$(DAL_LIBS)))
>
> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> index 72f233963748..41562ffa1c62 100644
> --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> @@ -1488,6 +1488,20 @@ static bool is_hdr_static_meta_changed(struct dc_stream_state *cur_stream,
>         return false;
>  }
>
> +static bool is_vsc_info_packet_changed(struct dc_stream_state *cur_stream,
> +               struct dc_stream_state *new_stream)
> +{
> +       if (cur_stream == NULL)
> +               return true;
> +
> +       if (memcmp(&cur_stream->vsc_infopacket,
> +                       &new_stream->vsc_infopacket,
> +                       sizeof(struct dc_info_packet)) != 0)
> +               return true;
> +
> +       return false;
> +}
> +
>  static bool is_timing_changed(struct dc_stream_state *cur_stream,
>                 struct dc_stream_state *new_stream)
>  {
> @@ -1528,6 +1542,9 @@ static bool are_stream_backends_same(
>         if (stream_a->dpms_off != stream_b->dpms_off)
>                 return false;
>
> +       if (is_vsc_info_packet_changed(stream_a, stream_b))
> +               return false;
> +
>         return true;
>  }
>
> @@ -2414,43 +2431,10 @@ static void set_vsc_info_packet(
>                 struct dc_info_packet *info_packet,
>                 struct dc_stream_state *stream)
>  {
> -       unsigned int vscPacketRevision = 0;
> -       unsigned int i;
> -
> -       /*VSC packet set to 2 when DP revision >= 1.2*/
> -       if (stream->psr_version != 0) {
> -               vscPacketRevision = 2;
> -       }
> -
> -       /* VSC packet not needed based on the features
> -        * supported by this DP display
> -        */
> -       if (vscPacketRevision == 0)
> +       if (!stream->vsc_infopacket.valid)
>                 return;
>
> -       if (vscPacketRevision == 0x2) {
> -               /* Secondary-data Packet ID = 0*/
> -               info_packet->hb0 = 0x00;
> -               /* 07h - Packet Type Value indicating Video
> -                * Stream Configuration packet
> -                */
> -               info_packet->hb1 = 0x07;
> -               /* 02h = VSC SDP supporting 3D stereo and PSR
> -                * (applies to eDP v1.3 or higher).
> -                */
> -               info_packet->hb2 = 0x02;
> -               /* 08h = VSC packet supporting 3D stereo + PSR
> -                * (HB2 = 02h).
> -                */
> -               info_packet->hb3 = 0x08;
> -
> -               for (i = 0; i < 28; i++)
> -                       info_packet->sb[i] = 0;
> -
> -               info_packet->valid = true;
> -       }
> -
> -       /*TODO: stereo 3D support and extend pixel encoding colorimetry*/
> +       *info_packet = stream->vsc_infopacket;
>  }
>
>  void dc_resource_state_destruct(struct dc_state *context)
> @@ -2632,6 +2616,9 @@ bool pipe_need_reprogram(
>         if (pipe_ctx_old->stream->dpms_off != pipe_ctx->stream->dpms_off)
>                 return true;
>
> +       if (is_vsc_info_packet_changed(pipe_ctx_old->stream, pipe_ctx->stream))
> +               return true;
> +
>         return false;
>  }
>
> diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
> index 584c56b94937..bc496906b695 100644
> --- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
> +++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
> @@ -55,6 +55,7 @@ struct dc_stream_state {
>         struct dc_crtc_timing timing;
>         struct dc_crtc_timing_adjust adjust;
>         struct dc_info_packet vrr_infopacket;
> +       struct dc_info_packet vsc_infopacket;
>
>         struct rect src; /* composition area */
>         struct rect dst; /* stream addressable area */
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
> index 93f52c58bc69..8b124948c3d0 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
> @@ -302,10 +302,24 @@ bool hubp1_program_surface_flip_and_addr(
>  {
>         struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
>
> -       /* program flip type */
> -       REG_SET(DCSURF_FLIP_CONTROL, 0,
> +
> +       //program flip type
> +       REG_UPDATE(DCSURF_FLIP_CONTROL,
>                         SURFACE_FLIP_TYPE, flip_immediate);
>
> +
> +       if (address->type == PLN_ADDR_TYPE_GRPH_STEREO) {
> +               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_MODE_FOR_STEREOSYNC, 0x1);
> +               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_IN_STEREOSYNC, 0x1);
> +
> +       } else {
> +               // turn off stereo if not in stereo
> +               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_MODE_FOR_STEREOSYNC, 0x0);
> +               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_IN_STEREOSYNC, 0x0);
> +       }
> +
> +
> +
>         /* HW automatically latch rest of address register on write to
>          * DCSURF_PRIMARY_SURFACE_ADDRESS if SURFACE_UPDATE_LOCK is not used
>          *
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
> index d901d5092969..e2f5238b8c11 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
> +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
> @@ -272,6 +272,8 @@
>         HUBP_SF(HUBP0_DCSURF_SURFACE_CONFIG, H_MIRROR_EN, mask_sh),\
>         HUBP_SF(HUBP0_DCSURF_SURFACE_CONFIG, SURFACE_PIXEL_FORMAT, mask_sh),\
>         HUBP_SF(HUBPREQ0_DCSURF_FLIP_CONTROL, SURFACE_FLIP_TYPE, mask_sh),\
> +       HUBP_SF(HUBPREQ0_DCSURF_FLIP_CONTROL, SURFACE_FLIP_MODE_FOR_STEREOSYNC, mask_sh),\
> +       HUBP_SF(HUBPREQ0_DCSURF_FLIP_CONTROL, SURFACE_FLIP_IN_STEREOSYNC, mask_sh),\
>         HUBP_SF(HUBPREQ0_DCSURF_FLIP_CONTROL, SURFACE_FLIP_PENDING, mask_sh),\
>         HUBP_SF(HUBPREQ0_DCSURF_FLIP_CONTROL, SURFACE_UPDATE_LOCK, mask_sh),\
>         HUBP_SF(HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_WIDTH, mask_sh),\
> @@ -451,6 +453,8 @@
>         type H_MIRROR_EN;\
>         type SURFACE_PIXEL_FORMAT;\
>         type SURFACE_FLIP_TYPE;\
> +       type SURFACE_FLIP_MODE_FOR_STEREOSYNC;\
> +       type SURFACE_FLIP_IN_STEREOSYNC;\
>         type SURFACE_UPDATE_LOCK;\
>         type SURFACE_FLIP_PENDING;\
>         type PRI_VIEWPORT_WIDTH; \
> diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
> new file mode 100644
> index 000000000000..18bbf8ad5b5f
> --- /dev/null
> +++ b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
> @@ -0,0 +1,15 @@
> +#ifndef MOD_INFO_PACKET_H_
> +#define MOD_INFO_PACKET_H_

Please add a proper license to this file.

> +
> +struct info_packet_inputs {
> +       const struct dc_stream_state *pStream;
> +};
> +
> +struct info_packets {
> +       struct dc_info_packet *pVscInfoPacket;
> +};
> +
> +void mod_build_infopackets(struct info_packet_inputs *inputs,
> +               struct info_packets *info_packets);
> +
> +#endif
> diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/Makefile b/drivers/gpu/drm/amd/display/modules/info_packet/Makefile
> new file mode 100644
> index 000000000000..4c382d728536
> --- /dev/null
> +++ b/drivers/gpu/drm/amd/display/modules/info_packet/Makefile
> @@ -0,0 +1,31 @@
> +#
> +# Copyright 2017 Advanced Micro Devices, Inc.
> +#
> +# Permission is hereby granted, free of charge, to any person obtaining a
> +# copy of this software and associated documentation files (the "Software"),
> +# to deal in the Software without restriction, including without limitation
> +# the rights to use, copy, modify, merge, publish, distribute, sublicense,
> +# and/or sell copies of the Software, and to permit persons to whom the
> +# Software is furnished to do so, subject to the following conditions:
> +#
> +# The above copyright notice and this permission notice shall be included in
> +# all copies or substantial portions of the Software.
> +#
> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> +# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> +# OTHER DEALINGS IN THE SOFTWARE.
> +#
> +#
> +# Makefile for the 'info_packet' sub-module of DAL.
> +#
> +
> +INFO_PACKET = info_packet.o
> +
> +AMD_DAL_INFO_PACKET = $(addprefix $(AMDDALPATH)/modules/info_packet/,$(INFO_PACKET))
> +#$(info ************  DAL INFO_PACKET MODULE MAKEFILE ************)
> +
> +AMD_DISPLAY_FILES += $(AMD_DAL_INFO_PACKET)
> diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
> new file mode 100644
> index 000000000000..5d7186f07df8
> --- /dev/null
> +++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
> @@ -0,0 +1,74 @@
> +/*
> + * info_packet.c
> + *
> + *  Created on: Jun 6, 2018
> + *
> + */


Please add a proper license to this file.

Alex

> +
> +#include "mod_info_packet.h"
> +#include "core_types.h"
> +
> +static void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
> +               struct dc_info_packet *info_packet)
> +{
> +       unsigned int vscPacketRevision = 0;
> +       unsigned int i;
> +
> +       if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE)
> +               vscPacketRevision = 1;
> +
> +
> +       /*VSC packet set to 2 when DP revision >= 1.2*/
> +       if (stream->psr_version != 0)
> +               vscPacketRevision = 2;
> +
> +
> +       /* VSC packet not needed based on the features
> +        * supported by this DP display
> +        */
> +       if (vscPacketRevision == 0)
> +               return;
> +
> +       if (vscPacketRevision == 0x2) {
> +               /* Secondary-data Packet ID = 0*/
> +               info_packet->hb0 = 0x00;
> +               /* 07h - Packet Type Value indicating Video
> +                * Stream Configuration packet
> +                */
> +               info_packet->hb1 = 0x07;
> +               /* 02h = VSC SDP supporting 3D stereo and PSR
> +                * (applies to eDP v1.3 or higher).
> +                */
> +               info_packet->hb2 = 0x02;
> +               /* 08h = VSC packet supporting 3D stereo + PSR
> +                * (HB2 = 02h).
> +                */
> +               info_packet->hb3 = 0x08;
> +
> +               for (i = 0; i < 28; i++)
> +                       info_packet->sb[i] = 0;
> +
> +               info_packet->valid = true;
> +       }
> +
> +       if (vscPacketRevision == 0x1) {
> +
> +               info_packet->hb0 = 0x00;        // Secondary-data Packet ID = 0
> +               info_packet->hb1 = 0x07;        // 07h = Packet Type Value indicating Video Stream Configuration packet
> +               info_packet->hb2 = 0x01;        // 01h = Revision number. VSC SDP supporting 3D stereo only
> +               info_packet->hb3 = 0x01;        // 01h = VSC SDP supporting 3D stereo only (HB2 = 01h).
> +
> +               if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_INBAND_FA)
> +                       info_packet->sb[0] = 0x1;
> +
> +               info_packet->valid = true;
> +       }
> +}
> +
> +void mod_build_infopackets(struct info_packet_inputs *inputs,
> +               struct info_packets *info_packets)
> +{
> +       if (info_packets->pVscInfoPacket != NULL)
> +               mod_build_vsc_infopacket(inputs->pStream, info_packets->pVscInfoPacket);
> +}
> +
> --
> 2.17.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list