On 2019-08-29 1:38 a.m., Dave Airlie wrote: > On Thu, 29 Aug 2019 at 07:04, Bhawanpreet Lakha > <Bhawanpreet.Lakha@xxxxxxx> wrote: >> >> From: Bayan Zabihiyan <bayan.zabihiyan@xxxxxxx> >> >> [Why] >> Edid Utility wishes to include DSC module from driver instead >> of doing it's own logic which will need to be updated every time >> someone modifies the driver logic. >> >> [How] >> Modify some functions such that we dont need to pass the entire >> DC structure as parameter. >> -Remove DC inclusion from module. >> -Filter out problematic types and inclusions > > Do we really want the ifdef stuff upstream, the EDID utility isn't > shipped with the kernel is it. > > Dave. It's not, and this isn't a kernel configurable option anyway. So this really should be dropped or split out in a way that we don't need to use this. Nicholas Kazlauskas > >> >> Signed-off-by: Bayan Zabihiyan <bayan.zabihiyan@xxxxxxx> >> Reviewed-by: Jun Lei <Jun.Lei@xxxxxxx> >> Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@xxxxxxx> >> --- >> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +- >> drivers/gpu/drm/amd/display/dc/dc_dsc.h | 14 +++- >> drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 57 ++++++++------ >> drivers/gpu/drm/amd/display/dc/dc_types.h | 9 +++ >> drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 75 ++++++++++++++++--- >> drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h | 12 ++- >> 6 files changed, 125 insertions(+), 45 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >> index 654679c4fded..82ea8cf8563e 100644 >> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >> @@ -3677,8 +3677,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, >> dc_link_get_link_cap(aconnector->dc_link)); >> >> if (dsc_caps.is_dsc_supported) >> - if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc, >> + if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0], >> &dsc_caps, >> + aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override, >> link_bandwidth_kbps, >> &stream->timing, >> &stream->timing.dsc_cfg)) >> diff --git a/drivers/gpu/drm/amd/display/dc/dc_dsc.h b/drivers/gpu/drm/amd/display/dc/dc_dsc.h >> index 6e42209f0e20..0ed2962add5a 100644 >> --- a/drivers/gpu/drm/amd/display/dc/dc_dsc.h >> +++ b/drivers/gpu/drm/amd/display/dc/dc_dsc.h >> @@ -30,6 +30,7 @@ >> #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_0 0x0a0 /* DP 1.4a SCR */ >> #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_1 0x0a1 >> #define DP_DSC_BRANCH_MAX_LINE_WIDTH 0x0a2 >> +#include "dc_types.h" >> >> struct dc_dsc_bw_range { >> uint32_t min_kbps; /* Bandwidth if min_target_bpp_x16 is used */ >> @@ -39,13 +40,21 @@ struct dc_dsc_bw_range { >> uint32_t stream_kbps; /* Uncompressed stream bandwidth */ >> }; >> >> +struct display_stream_compressor { >> + const struct dsc_funcs *funcs; >> +#ifndef AMD_EDID_UTILITY >> + struct dc_context *ctx; >> + int inst; >> +#endif >> +}; >> >> bool dc_dsc_parse_dsc_dpcd(const uint8_t *dpcd_dsc_basic_data, >> const uint8_t *dpcd_dsc_ext_data, >> struct dsc_dec_dpcd_caps *dsc_sink_caps); >> >> bool dc_dsc_compute_bandwidth_range( >> - const struct dc *dc, >> + const struct display_stream_compressor *dsc, >> + const uint32_t dsc_min_slice_height_override, >> const uint32_t min_kbps, >> const uint32_t max_kbps, >> const struct dsc_dec_dpcd_caps *dsc_sink_caps, >> @@ -53,8 +62,9 @@ bool dc_dsc_compute_bandwidth_range( >> struct dc_dsc_bw_range *range); >> >> bool dc_dsc_compute_config( >> - const struct dc *dc, >> + const struct display_stream_compressor *dsc, >> const struct dsc_dec_dpcd_caps *dsc_sink_caps, >> + const uint32_t dsc_min_slice_height_override, >> uint32_t target_bandwidth_kbps, >> const struct dc_crtc_timing *timing, >> struct dc_dsc_config *dsc_cfg); >> diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h >> index dafc19a7b699..2869b26d966a 100644 >> --- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h >> +++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h >> @@ -26,6 +26,8 @@ >> #ifndef DC_HW_TYPES_H >> #define DC_HW_TYPES_H >> >> +#ifndef AMD_EDID_UTILITY >> + >> #include "os_types.h" >> #include "fixed31_32.h" >> #include "signal_types.h" >> @@ -587,6 +589,8 @@ struct scaling_taps { >> bool integer_scaling; >> }; >> >> +#endif /* AMD_EDID_UTILITY */ >> + >> enum dc_timing_standard { >> DC_TIMING_STANDARD_UNDEFINED, >> DC_TIMING_STANDARD_DMT, >> @@ -708,30 +712,6 @@ enum dc_timing_3d_format { >> TIMING_3D_FORMAT_MAX, >> }; >> >> -enum trigger_delay { >> - TRIGGER_DELAY_NEXT_PIXEL = 0, >> - TRIGGER_DELAY_NEXT_LINE, >> -}; >> - >> -enum crtc_event { >> - CRTC_EVENT_VSYNC_RISING = 0, >> - CRTC_EVENT_VSYNC_FALLING >> -}; >> - >> -struct crtc_trigger_info { >> - bool enabled; >> - struct dc_stream_state *event_source; >> - enum crtc_event event; >> - enum trigger_delay delay; >> -}; >> - >> -struct dc_crtc_timing_adjust { >> - uint32_t v_total_min; >> - uint32_t v_total_max; >> - uint32_t v_total_mid; >> - uint32_t v_total_mid_frame_num; >> -}; >> - >> #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT >> struct dc_dsc_config { >> uint32_t num_slices_h; /* Number of DSC slices - horizontal */ >> @@ -775,6 +755,33 @@ struct dc_crtc_timing { >> #endif >> }; >> >> +#ifndef AMD_EDID_UTILITY >> + >> +enum trigger_delay { >> + TRIGGER_DELAY_NEXT_PIXEL = 0, >> + TRIGGER_DELAY_NEXT_LINE, >> +}; >> + >> +enum crtc_event { >> + CRTC_EVENT_VSYNC_RISING = 0, >> + CRTC_EVENT_VSYNC_FALLING >> +}; >> + >> +struct crtc_trigger_info { >> + bool enabled; >> + struct dc_stream_state *event_source; >> + enum crtc_event event; >> + enum trigger_delay delay; >> +}; >> + >> +struct dc_crtc_timing_adjust { >> + uint32_t v_total_min; >> + uint32_t v_total_max; >> + uint32_t v_total_mid; >> + uint32_t v_total_mid_frame_num; >> +}; >> + >> + >> /* Passed on init */ >> enum vram_type { >> VIDEO_MEMORY_TYPE_GDDR5 = 2, >> @@ -845,5 +852,7 @@ struct tg_color { >> uint16_t color_b_cb; >> }; >> >> +#endif /* AMD_EDID_UTILITY */ >> + >> #endif /* DC_HW_TYPES_H */ >> >> diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h >> index 82abc4ff6c49..e6ae66791943 100644 >> --- a/drivers/gpu/drm/amd/display/dc/dc_types.h >> +++ b/drivers/gpu/drm/amd/display/dc/dc_types.h >> @@ -25,6 +25,11 @@ >> #ifndef DC_TYPES_H_ >> #define DC_TYPES_H_ >> >> +#ifndef AMD_EDID_UTILITY >> +/* AND EdidUtility only needs a portion >> + * of this file, including the rest only >> + * causes additional issues. >> + */ >> #include "os_types.h" >> #include "fixed31_32.h" >> #include "irq_types.h" >> @@ -745,6 +750,9 @@ struct dc_clock_config { >> uint32_t current_clock_khz;/*current clock in use*/ >> }; >> >> +#endif /*AMD_EDID_UTILITY*/ >> +//AMD EDID UTILITY does not need any of the above structures >> + >> #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT >> /* DSC DPCD capabilities */ >> union dsc_slice_caps1 { >> @@ -816,4 +824,5 @@ struct dsc_dec_dpcd_caps { >> uint32_t branch_max_line_width; >> }; >> #endif >> + >> #endif /* DC_TYPES_H_ */ >> diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c >> index 929ebd4cfb8c..e60f760585e4 100644 >> --- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c >> +++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c >> @@ -23,8 +23,7 @@ >> */ >> >> #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT >> -#include "dc.h" >> -#include "core_types.h" >> +#include "dc_hw_types.h" >> #include "dsc.h" >> #include <drm/drm_dp_helper.h> >> >> @@ -47,6 +46,59 @@ const struct dc_dsc_policy dsc_policy = { >> >> /* This module's internal functions */ >> >> +static uint32_t dc_dsc_bandwidth_in_kbps_from_timing( >> + const struct dc_crtc_timing *timing) >> +{ >> + uint32_t bits_per_channel = 0; >> + uint32_t kbps; >> + >> + if (timing->flags.DSC) { >> + kbps = (timing->pix_clk_100hz * timing->dsc_cfg.bits_per_pixel); >> + kbps = kbps / 160 + ((kbps % 160) ? 1 : 0); >> + return kbps; >> + } >> + >> + switch (timing->display_color_depth) { >> + case COLOR_DEPTH_666: >> + bits_per_channel = 6; >> + break; >> + case COLOR_DEPTH_888: >> + bits_per_channel = 8; >> + break; >> + case COLOR_DEPTH_101010: >> + bits_per_channel = 10; >> + break; >> + case COLOR_DEPTH_121212: >> + bits_per_channel = 12; >> + break; >> + case COLOR_DEPTH_141414: >> + bits_per_channel = 14; >> + break; >> + case COLOR_DEPTH_161616: >> + bits_per_channel = 16; >> + break; >> + default: >> + break; >> + } >> + >> + ASSERT(bits_per_channel != 0); >> + >> + kbps = timing->pix_clk_100hz / 10; >> + kbps *= bits_per_channel; >> + >> + if (timing->flags.Y_ONLY != 1) { >> + /*Only YOnly make reduce bandwidth by 1/3 compares to RGB*/ >> + kbps *= 3; >> + if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) >> + kbps /= 2; >> + else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) >> + kbps = kbps * 2 / 3; >> + } >> + >> + return kbps; >> + >> +} >> + >> static bool dsc_buff_block_size_from_dpcd(int dpcd_buff_block_size, int *buff_block_size) >> { >> >> @@ -178,12 +230,11 @@ static bool dsc_bpp_increment_div_from_dpcd(int bpp_increment_dpcd, uint32_t *bp >> } >> >> static void get_dsc_enc_caps( >> - const struct dc *dc, >> + const struct display_stream_compressor *dsc, >> struct dsc_enc_caps *dsc_enc_caps, >> int pixel_clock_100Hz) >> { >> // This is a static HW query, so we can use any DSC >> - struct display_stream_compressor *dsc = dc->res_pool->dscs[0]; >> >> memset(dsc_enc_caps, 0, sizeof(struct dsc_enc_caps)); >> if (dsc) >> @@ -290,7 +341,7 @@ static void get_dsc_bandwidth_range( >> struct dc_dsc_bw_range *range) >> { >> /* native stream bandwidth */ >> - range->stream_kbps = dc_bandwidth_in_kbps_from_timing(timing); >> + range->stream_kbps = dc_dsc_bandwidth_in_kbps_from_timing(timing); >> >> /* max dsc target bpp */ >> range->max_kbps = dsc_div_by_10_round_up(max_bpp * timing->pix_clk_100hz); >> @@ -806,7 +857,8 @@ bool dc_dsc_parse_dsc_dpcd(const uint8_t *dpcd_dsc_basic_data, const uint8_t *dp >> * If DSC is not possible, leave '*range' untouched. >> */ >> bool dc_dsc_compute_bandwidth_range( >> - const struct dc *dc, >> + const struct display_stream_compressor *dsc, >> + const uint32_t dsc_min_slice_height_override, >> const uint32_t min_bpp, >> const uint32_t max_bpp, >> const struct dsc_dec_dpcd_caps *dsc_sink_caps, >> @@ -818,14 +870,14 @@ bool dc_dsc_compute_bandwidth_range( >> struct dsc_enc_caps dsc_common_caps; >> struct dc_dsc_config config; >> >> - get_dsc_enc_caps(dc, &dsc_enc_caps, timing->pix_clk_100hz); >> + get_dsc_enc_caps(dsc, &dsc_enc_caps, timing->pix_clk_100hz); >> >> is_dsc_possible = intersect_dsc_caps(dsc_sink_caps, &dsc_enc_caps, >> timing->pixel_encoding, &dsc_common_caps); >> >> if (is_dsc_possible) >> is_dsc_possible = setup_dsc_config(dsc_sink_caps, &dsc_enc_caps, 0, timing, >> - dc->debug.dsc_min_slice_height_override, &config); >> + dsc_min_slice_height_override, &config); >> >> if (is_dsc_possible) >> get_dsc_bandwidth_range(min_bpp, max_bpp, &dsc_common_caps, timing, range); >> @@ -834,8 +886,9 @@ bool dc_dsc_compute_bandwidth_range( >> } >> >> bool dc_dsc_compute_config( >> - const struct dc *dc, >> + const struct display_stream_compressor *dsc, >> const struct dsc_dec_dpcd_caps *dsc_sink_caps, >> + const uint32_t dsc_min_slice_height_override, >> uint32_t target_bandwidth_kbps, >> const struct dc_crtc_timing *timing, >> struct dc_dsc_config *dsc_cfg) >> @@ -843,11 +896,11 @@ bool dc_dsc_compute_config( >> bool is_dsc_possible = false; >> struct dsc_enc_caps dsc_enc_caps; >> >> - get_dsc_enc_caps(dc, &dsc_enc_caps, timing->pix_clk_100hz); >> + get_dsc_enc_caps(dsc, &dsc_enc_caps, timing->pix_clk_100hz); >> is_dsc_possible = setup_dsc_config(dsc_sink_caps, >> &dsc_enc_caps, >> target_bandwidth_kbps, >> - timing, dc->debug.dsc_min_slice_height_override, dsc_cfg); >> + timing, dsc_min_slice_height_override, dsc_cfg); >> return is_dsc_possible; >> } >> #endif /* CONFIG_DRM_AMD_DC_DSC_SUPPORT */ >> diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h >> index 1ddb1c6fa149..c6ff3d78b435 100644 >> --- a/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h >> +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h >> @@ -28,7 +28,11 @@ >> >> #include "dc_dsc.h" >> #include "dc_hw_types.h" >> -#include "dc_dp_types.h" >> +#include "dc_types.h" >> +/* do not include any other headers >> + * or else it might break Edid Utility functionality. >> + */ >> + >> >> /* Input parameters for configuring DSC from the outside of DSC */ >> struct dsc_config { >> @@ -81,12 +85,6 @@ struct dsc_enc_caps { >> uint32_t bpp_increment_div; /* bpp increment divisor, e.g. if 16, it's 1/16th of a bit */ >> }; >> >> -struct display_stream_compressor { >> - const struct dsc_funcs *funcs; >> - struct dc_context *ctx; >> - int inst; >> -}; >> - >> struct dsc_funcs { >> void (*dsc_get_enc_caps)(struct dsc_enc_caps *dsc_enc_caps, int pixel_clock_100Hz); >> void (*dsc_read_state)(struct display_stream_compressor *dsc, struct dcn_dsc_state *s); >> -- >> 2.17.1 >> >> _______________________________________________ >> amd-gfx mailing list >> amd-gfx@xxxxxxxxxxxxxxxxxxxxx >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx > _______________________________________________ > amd-gfx mailing list > amd-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx > _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx