diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3024-drm-amd-display-Update-FMT-and-OPPBUF-functions.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3024-drm-amd-display-Update-FMT-and-OPPBUF-functions.patch | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3024-drm-amd-display-Update-FMT-and-OPPBUF-functions.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3024-drm-amd-display-Update-FMT-and-OPPBUF-functions.patch new file mode 100644 index 00000000..6cf44935 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3024-drm-amd-display-Update-FMT-and-OPPBUF-functions.patch @@ -0,0 +1,374 @@ +From bfbb6cc651e164675367cb44918bb1993177bb98 Mon Sep 17 00:00:00 2001 +From: Eric Bernstein <eric.bernstein@amd.com> +Date: Tue, 12 Dec 2017 14:14:10 -0500 +Subject: [PATCH 3024/4131] drm/amd/display: Update FMT and OPPBUF functions + +Updates to FMT and OPPBUF programming from HW team +pseudocode review. + +Signed-off-by: Eric Bernstein <eric.bernstein@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 12 +--- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c | 72 ++++++++++++++++++++-- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h | 43 +++++++++---- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c | 16 ----- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h | 8 --- + drivers/gpu/drm/amd/display/dc/inc/hw/opp.h | 23 +++++-- + 6 files changed, 120 insertions(+), 54 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index 2ca364f..8257286 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -462,9 +462,6 @@ static enum dc_status dcn10_prog_pixclk_crtc_otg( + struct dc_stream_state *stream = pipe_ctx->stream; + enum dc_color_space color_space; + struct tg_color black_color = {0}; +- bool enableStereo = stream->timing.timing_3d_format == TIMING_3D_FORMAT_NONE ? +- false:true; +- bool rightEyePolarity = stream->timing.flags.RIGHT_EYE_3D_POLARITY; + + /* by upper caller loop, pipe0 is parent pipe and be called first. + * back end is set up by for pipe0. Other children pipe share back end +@@ -499,11 +496,6 @@ static enum dc_status dcn10_prog_pixclk_crtc_otg( + &stream->timing, + true); + +- pipe_ctx->stream_res.opp->funcs->opp_set_stereo_polarity( +- pipe_ctx->stream_res.opp, +- enableStereo, +- rightEyePolarity); +- + #if 0 /* move to after enable_crtc */ + /* TODO: OPP FMT, ABM. etc. should be done here. */ + /* or FPGA now. instance 0 only. TODO: move to opp.c */ +@@ -2251,10 +2243,10 @@ static void dcn10_setup_stereo(struct pipe_ctx *pipe_ctx, struct dc *dc) + + dcn10_config_stereo_parameters(stream, &flags); + +- pipe_ctx->stream_res.opp->funcs->opp_set_stereo_polarity( ++ pipe_ctx->stream_res.opp->funcs->opp_program_stereo( + pipe_ctx->stream_res.opp, + flags.PROGRAM_STEREO == 1 ? true:false, +- stream->timing.flags.RIGHT_EYE_3D_POLARITY == 1 ? true:false); ++ &stream->timing); + + pipe_ctx->stream_res.tg->funcs->program_stereo( + pipe_ctx->stream_res.tg, +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c +index 5f07886..f6ba0ee 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c +@@ -296,13 +296,75 @@ void opp1_program_fmt( + return; + } + +-void opp1_set_stereo_polarity( +- struct output_pixel_processor *opp, +- bool enable, bool rightEyePolarity) ++void opp1_program_stereo( ++ struct output_pixel_processor *opp, ++ bool enable, ++ const struct dc_crtc_timing *timing) + { + struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); + +- REG_UPDATE(FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, enable); ++ uint32_t active_width = timing->h_addressable - timing->h_border_right - timing->h_border_right; ++ uint32_t space1_size = timing->v_total - timing->v_addressable; ++ /* TODO: confirm computation of space2_size */ ++ uint32_t space2_size = timing->v_total - timing->v_addressable; ++ ++ if (!enable) { ++ active_width = 0; ++ space1_size = 0; ++ space2_size = 0; ++ } ++ ++ /* TODO: for which cases should FMT_STEREOSYNC_OVERRIDE be set? */ ++ REG_UPDATE(FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, 0); ++ ++ REG_UPDATE(OPPBUF_CONTROL, OPPBUF_ACTIVE_WIDTH, active_width); ++ ++ /* Program OPPBUF_3D_VACT_SPACE1_SIZE and OPPBUF_VACT_SPACE2_SIZE registers ++ * In 3D progressive frames, Vactive space happens only in between the 2 frames, ++ * so only need to program OPPBUF_3D_VACT_SPACE1_SIZE ++ * In 3D alternative frames, left and right frames, top and bottom field. ++ */ ++ if (timing->timing_3d_format == TIMING_3D_FORMAT_FRAME_ALTERNATE) ++ REG_UPDATE(OPPBUF_3D_PARAMETERS_0, OPPBUF_3D_VACT_SPACE2_SIZE, space2_size); ++ else ++ REG_UPDATE(OPPBUF_3D_PARAMETERS_0, OPPBUF_3D_VACT_SPACE1_SIZE, space1_size); ++ ++ /* TODO: Is programming of OPPBUF_DUMMY_DATA_R/G/B needed? */ ++ /* ++ REG_UPDATE(OPPBUF_3D_PARAMETERS_0, ++ OPPBUF_DUMMY_DATA_R, data_r); ++ REG_UPDATE(OPPBUF_3D_PARAMETERS_1, ++ OPPBUF_DUMMY_DATA_G, data_g); ++ REG_UPDATE(OPPBUF_3D_PARAMETERS_1, ++ OPPBUF_DUMMY_DATA_B, _data_b); ++ */ ++} ++ ++void opp1_program_oppbuf( ++ struct output_pixel_processor *opp, ++ struct oppbuf_params *oppbuf) ++{ ++ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); ++ ++ /* Program the oppbuf active width to be the frame width from mpc */ ++ REG_UPDATE(OPPBUF_CONTROL, OPPBUF_ACTIVE_WIDTH, oppbuf->active_width); ++ ++ /* Specifies the number of segments in multi-segment mode (DP-MSO operation) ++ * description "In 1/2/4 segment mode, specifies the horizontal active width in pixels of the display panel. ++ * In 4 segment split left/right mode, specifies the horizontal 1/2 active width in pixels of the display panel. ++ * Used to determine segment boundaries in multi-segment mode. Used to determine the width of the vertical active space in 3D frame packed modes. ++ * OPPBUF_ACTIVE_WIDTH must be integer divisible by the total number of segments." ++ */ ++ REG_UPDATE(OPPBUF_CONTROL, OPPBUF_DISPLAY_SEGMENTATION, oppbuf->mso_segmentation); ++ ++ /* description "Specifies the number of overlap pixels (1-8 overlapping pixels supported), used in multi-segment mode (DP-MSO operation)" */ ++ REG_UPDATE(OPPBUF_CONTROL, OPPBUF_OVERLAP_PIXEL_NUM, oppbuf->mso_overlap_pixel_num); ++ ++ /* description "Specifies the number of times a pixel is replicated (0-15 pixel replications supported). ++ * A value of 0 disables replication. The total number of times a pixel is output is OPPBUF_PIXEL_REPETITION + 1." ++ */ ++ REG_UPDATE(OPPBUF_CONTROL, OPPBUF_PIXEL_REPETITION, oppbuf->pixel_repetition); ++ + } + + /*****************************************/ +@@ -319,7 +381,7 @@ static struct opp_funcs dcn10_opp_funcs = { + .opp_set_dyn_expansion = opp1_set_dyn_expansion, + .opp_program_fmt = opp1_program_fmt, + .opp_program_bit_depth_reduction = opp1_program_bit_depth_reduction, +- .opp_set_stereo_polarity = opp1_set_stereo_polarity, ++ .opp_program_stereo = opp1_program_stereo, + .opp_destroy = opp1_destroy + }; + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h +index f3c298e..bc5058a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h +@@ -41,7 +41,10 @@ + SRI(FMT_DITHER_RAND_B_SEED, FMT, id), \ + SRI(FMT_CLAMP_CNTL, FMT, id), \ + SRI(FMT_DYNAMIC_EXP_CNTL, FMT, id), \ +- SRI(FMT_MAP420_MEMORY_CONTROL, FMT, id) ++ SRI(FMT_MAP420_MEMORY_CONTROL, FMT, id), \ ++ SRI(OPPBUF_CONTROL, OPPBUF, id),\ ++ SRI(OPPBUF_3D_PARAMETERS_0, OPPBUF, id), \ ++ SRI(OPPBUF_3D_PARAMETERS_1, OPPBUF, id) + + #define OPP_REG_LIST_DCN10(id) \ + OPP_REG_LIST_DCN(id) +@@ -54,7 +57,11 @@ + uint32_t FMT_DITHER_RAND_B_SEED; \ + uint32_t FMT_CLAMP_CNTL; \ + uint32_t FMT_DYNAMIC_EXP_CNTL; \ +- uint32_t FMT_MAP420_MEMORY_CONTROL; ++ uint32_t FMT_MAP420_MEMORY_CONTROL; \ ++ uint32_t OPPBUF_CONTROL; \ ++ uint32_t OPPBUF_CONTROL1; \ ++ uint32_t OPPBUF_3D_PARAMETERS_0; \ ++ uint32_t OPPBUF_3D_PARAMETERS_1 + + #define OPP_MASK_SH_LIST_DCN(mask_sh) \ + OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_EN, mask_sh), \ +@@ -78,10 +85,16 @@ + OPP_SF(FMT0_FMT_CLAMP_CNTL, FMT_CLAMP_COLOR_FORMAT, mask_sh), \ + OPP_SF(FMT0_FMT_DYNAMIC_EXP_CNTL, FMT_DYNAMIC_EXP_EN, mask_sh), \ + OPP_SF(FMT0_FMT_DYNAMIC_EXP_CNTL, FMT_DYNAMIC_EXP_MODE, mask_sh), \ +- OPP_SF(FMT0_FMT_MAP420_MEMORY_CONTROL, FMT_MAP420MEM_PWR_FORCE, mask_sh) ++ OPP_SF(FMT0_FMT_MAP420_MEMORY_CONTROL, FMT_MAP420MEM_PWR_FORCE, mask_sh), \ ++ OPP_SF(OPPBUF0_OPPBUF_CONTROL, OPPBUF_ACTIVE_WIDTH, mask_sh),\ ++ OPP_SF(OPPBUF0_OPPBUF_CONTROL, OPPBUF_PIXEL_REPETITION, mask_sh),\ ++ OPP_SF(OPPBUF0_OPPBUF_3D_PARAMETERS_0, OPPBUF_3D_VACT_SPACE1_SIZE, mask_sh), \ ++ OPP_SF(OPPBUF0_OPPBUF_3D_PARAMETERS_0, OPPBUF_3D_VACT_SPACE2_SIZE, mask_sh) + + #define OPP_MASK_SH_LIST_DCN10(mask_sh) \ +- OPP_MASK_SH_LIST_DCN(mask_sh) ++ OPP_MASK_SH_LIST_DCN(mask_sh), \ ++ OPP_SF(OPPBUF0_OPPBUF_CONTROL, OPPBUF_DISPLAY_SEGMENTATION, mask_sh),\ ++ OPP_SF(OPPBUF0_OPPBUF_CONTROL, OPPBUF_OVERLAP_PIXEL_NUM, mask_sh) + + #define OPP_DCN10_REG_FIELD_LIST(type) \ + type FMT_TRUNCATE_EN; \ +@@ -105,18 +118,25 @@ + type FMT_DYNAMIC_EXP_EN; \ + type FMT_DYNAMIC_EXP_MODE; \ + type FMT_MAP420MEM_PWR_FORCE; \ +- type FMT_STEREOSYNC_OVERRIDE; ++ type FMT_STEREOSYNC_OVERRIDE; \ ++ type OPPBUF_ACTIVE_WIDTH;\ ++ type OPPBUF_PIXEL_REPETITION;\ ++ type OPPBUF_DISPLAY_SEGMENTATION;\ ++ type OPPBUF_OVERLAP_PIXEL_NUM;\ ++ type OPPBUF_NUM_SEGMENT_PADDED_PIXELS; \ ++ type OPPBUF_3D_VACT_SPACE1_SIZE; \ ++ type OPPBUF_3D_VACT_SPACE2_SIZE + + struct dcn10_opp_registers { +- OPP_COMMON_REG_VARIABLE_LIST ++ OPP_COMMON_REG_VARIABLE_LIST; + }; + + struct dcn10_opp_shift { +- OPP_DCN10_REG_FIELD_LIST(uint8_t) ++ OPP_DCN10_REG_FIELD_LIST(uint8_t); + }; + + struct dcn10_opp_mask { +- OPP_DCN10_REG_FIELD_LIST(uint32_t) ++ OPP_DCN10_REG_FIELD_LIST(uint32_t); + }; + + struct dcn10_opp { +@@ -151,9 +171,10 @@ void opp1_program_bit_depth_reduction( + struct output_pixel_processor *opp, + const struct bit_depth_reduction_params *params); + +-void opp1_set_stereo_polarity( +- struct output_pixel_processor *opp, +- bool enable, bool rightEyePolarity); ++void opp1_program_stereo( ++ struct output_pixel_processor *opp, ++ bool enable, ++ const struct dc_crtc_timing *timing); + + void opp1_destroy(struct output_pixel_processor **opp); + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c +index 827dd14..4bf64d1 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c +@@ -91,11 +91,6 @@ static void optc1_disable_stereo(struct timing_generator *optc) + OTG_3D_STRUCTURE_EN, 0, + OTG_3D_STRUCTURE_V_UPDATE_MODE, 0, + OTG_3D_STRUCTURE_STEREO_SEL_OVR, 0); +- +- REG_UPDATE(OPPBUF_CONTROL, +- OPPBUF_ACTIVE_WIDTH, 0); +- REG_UPDATE(OPPBUF_3D_PARAMETERS_0, +- OPPBUF_3D_VACT_SPACE1_SIZE, 0); + } + + /** +@@ -1078,16 +1073,11 @@ void optc1_get_crtc_scanoutpos( + *v_position = position.vertical_count; + } + +- +- + static void optc1_enable_stereo(struct timing_generator *optc, + const struct dc_crtc_timing *timing, struct crtc_stereo_flags *flags) + { + struct optc *optc1 = DCN10TG_FROM_TG(optc); + +- uint32_t active_width = timing->h_addressable; +- uint32_t space1_size = timing->v_total - timing->v_addressable; +- + if (flags) { + uint32_t stereo_en; + stereo_en = flags->FRAME_PACKED == 0 ? 1 : 0; +@@ -1114,12 +1104,6 @@ static void optc1_enable_stereo(struct timing_generator *optc, + OTG_3D_STRUCTURE_STEREO_SEL_OVR, flags->FRAME_PACKED); + + } +- +- REG_UPDATE(OPPBUF_CONTROL, +- OPPBUF_ACTIVE_WIDTH, active_width); +- +- REG_UPDATE(OPPBUF_3D_PARAMETERS_0, +- OPPBUF_3D_VACT_SPACE1_SIZE, space1_size); + } + + void optc1_program_stereo(struct timing_generator *optc, +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h +index eec860fa..a3c7c20 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h +@@ -70,8 +70,6 @@ + SRI(OPTC_INPUT_CLOCK_CONTROL, ODM, inst),\ + SRI(OPTC_DATA_SOURCE_SELECT, ODM, inst),\ + SRI(OPTC_INPUT_GLOBAL_CONTROL, ODM, inst),\ +- SRI(OPPBUF_CONTROL, OPPBUF, inst),\ +- SRI(OPPBUF_3D_PARAMETERS_0, OPPBUF, inst),\ + SRI(CONTROL, VTG, inst),\ + SRI(OTG_VERT_SYNC_CONTROL, OTG, inst),\ + SRI(OTG_MASTER_UPDATE_MODE, OTG, inst),\ +@@ -129,8 +127,6 @@ struct dcn_optc_registers { + uint32_t OPTC_INPUT_CLOCK_CONTROL; + uint32_t OPTC_DATA_SOURCE_SELECT; + uint32_t OPTC_INPUT_GLOBAL_CONTROL; +- uint32_t OPPBUF_CONTROL; +- uint32_t OPPBUF_3D_PARAMETERS_0; + uint32_t CONTROL; + uint32_t OTG_GSL_WINDOW_X; + uint32_t OTG_GSL_WINDOW_Y; +@@ -215,8 +211,6 @@ struct dcn_optc_registers { + SF(ODM0_OPTC_INPUT_CLOCK_CONTROL, OPTC_INPUT_CLK_GATE_DIS, mask_sh),\ + SF(ODM0_OPTC_INPUT_GLOBAL_CONTROL, OPTC_UNDERFLOW_OCCURRED_STATUS, mask_sh),\ + SF(ODM0_OPTC_INPUT_GLOBAL_CONTROL, OPTC_UNDERFLOW_CLEAR, mask_sh),\ +- SF(OPPBUF0_OPPBUF_CONTROL, OPPBUF_ACTIVE_WIDTH, mask_sh),\ +- SF(OPPBUF0_OPPBUF_3D_PARAMETERS_0, OPPBUF_3D_VACT_SPACE1_SIZE, mask_sh),\ + SF(VTG0_CONTROL, VTG0_ENABLE, mask_sh),\ + SF(VTG0_CONTROL, VTG0_FP2, mask_sh),\ + SF(VTG0_CONTROL, VTG0_VCOUNT_INIT, mask_sh),\ +@@ -336,8 +330,6 @@ struct dcn_optc_registers { + type OPTC_SEG0_SRC_SEL;\ + type OPTC_UNDERFLOW_OCCURRED_STATUS;\ + type OPTC_UNDERFLOW_CLEAR;\ +- type OPPBUF_ACTIVE_WIDTH;\ +- type OPPBUF_3D_VACT_SPACE1_SIZE;\ + type VTG0_ENABLE;\ + type VTG0_FP2;\ + type VTG0_VCOUNT_INIT;\ +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h +index 17e143e..ab8fb77 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h +@@ -249,6 +249,21 @@ enum ovl_csc_adjust_item { + OVERLAY_COLOR_TEMPERATURE + }; + ++enum oppbuf_display_segmentation { ++ OPPBUF_DISPLAY_SEGMENTATION_1_SEGMENT = 0, ++ OPPBUF_DISPLAY_SEGMENTATION_2_SEGMENT = 1, ++ OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT = 2, ++ OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_LEFT = 3, ++ OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_RIGHT = 4 ++}; ++ ++struct oppbuf_params { ++ uint32_t active_width; ++ enum oppbuf_display_segmentation mso_segmentation; ++ uint32_t mso_overlap_pixel_num; ++ uint32_t pixel_repetition; ++}; ++ + struct opp_funcs { + + +@@ -277,10 +292,10 @@ struct opp_funcs { + + void (*opp_destroy)(struct output_pixel_processor **opp); + +- void (*opp_set_stereo_polarity)( +- struct output_pixel_processor *opp, +- bool enable, +- bool rightEyePolarity); ++ void (*opp_program_stereo)( ++ struct output_pixel_processor *opp, ++ bool enable, ++ const struct dc_crtc_timing *timing); + + }; + +-- +2.7.4 + |