Commit 532a0d2a authored by Webb Chen's avatar Webb Chen Committed by Alex Deucher

drm/amd/display: Revert "dc: Keep VBios pixel rate div setting util next mode set"

This reverts commit 4d4d3ff1 ("drm/amd/display: Keep VBios pixel rate div
setting util next mode set") which causes issue.
Reviewed-by: default avatarCharlene Liu <charlene.liu@amd.com>
Acked-by: default avatarWayne Lin <wayne.lin@amd.com>
Signed-off-by: default avatarWebb Chen <yi-lchen@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f2303026
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#include "link/hwss/link_hwss_hpo_dp.h" #include "link/hwss/link_hwss_hpo_dp.h"
#include "link/hwss/link_hwss_dio_fixed_vs_pe_retimer.h" #include "link/hwss/link_hwss_dio_fixed_vs_pe_retimer.h"
#include "link/hwss/link_hwss_hpo_fixed_vs_pe_retimer_dp.h" #include "link/hwss/link_hwss_hpo_fixed_vs_pe_retimer_dp.h"
#include "hw_sequencer_private.h"
#if defined(CONFIG_DRM_AMD_DC_SI) #if defined(CONFIG_DRM_AMD_DC_SI)
#include "dce60/dce60_resource.h" #include "dce60/dce60_resource.h"
...@@ -3903,9 +3902,6 @@ enum dc_status dc_validate_with_context(struct dc *dc, ...@@ -3903,9 +3902,6 @@ enum dc_status dc_validate_with_context(struct dc *dc,
if (res != DC_OK) if (res != DC_OK)
goto fail; goto fail;
if (dc->hwseq->funcs.calculate_pix_rate_divider)
dc->hwseq->funcs.calculate_pix_rate_divider(dc, context, add_streams[i]);
if (!add_all_planes_for_stream(dc, add_streams[i], set, set_count, context)) { if (!add_all_planes_for_stream(dc, add_streams[i], set, set_count, context)) {
res = DC_FAIL_ATTACH_SURFACES; res = DC_FAIL_ATTACH_SURFACES;
goto fail; goto fail;
......
...@@ -58,8 +58,8 @@ static void dccg314_trigger_dio_fifo_resync( ...@@ -58,8 +58,8 @@ static void dccg314_trigger_dio_fifo_resync(
static void dccg314_get_pixel_rate_div( static void dccg314_get_pixel_rate_div(
struct dccg *dccg, struct dccg *dccg,
uint32_t otg_inst, uint32_t otg_inst,
uint32_t *k1, enum pixel_rate_div *k1,
uint32_t *k2) enum pixel_rate_div *k2)
{ {
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
uint32_t val_k1 = PIXEL_RATE_DIV_NA, val_k2 = PIXEL_RATE_DIV_NA; uint32_t val_k1 = PIXEL_RATE_DIV_NA, val_k2 = PIXEL_RATE_DIV_NA;
...@@ -93,8 +93,8 @@ static void dccg314_get_pixel_rate_div( ...@@ -93,8 +93,8 @@ static void dccg314_get_pixel_rate_div(
return; return;
} }
*k1 = val_k1; *k1 = (enum pixel_rate_div)val_k1;
*k2 = val_k2; *k2 = (enum pixel_rate_div)val_k2;
} }
static void dccg314_set_pixel_rate_div( static void dccg314_set_pixel_rate_div(
...@@ -104,8 +104,7 @@ static void dccg314_set_pixel_rate_div( ...@@ -104,8 +104,7 @@ static void dccg314_set_pixel_rate_div(
enum pixel_rate_div k2) enum pixel_rate_div k2)
{ {
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
uint32_t cur_k1 = PIXEL_RATE_DIV_NA; enum pixel_rate_div cur_k1 = PIXEL_RATE_DIV_NA, cur_k2 = PIXEL_RATE_DIV_NA;
uint32_t cur_k2 = PIXEL_RATE_DIV_NA;
// Don't program 0xF into the register field. Not valid since // Don't program 0xF into the register field. Not valid since
// K1 / K2 field is only 1 / 2 bits wide // K1 / K2 field is only 1 / 2 bits wide
...@@ -374,7 +373,6 @@ static const struct dccg_funcs dccg314_funcs = { ...@@ -374,7 +373,6 @@ static const struct dccg_funcs dccg314_funcs = {
.disable_dsc = dccg31_disable_dscclk, .disable_dsc = dccg31_disable_dscclk,
.enable_dsc = dccg31_enable_dscclk, .enable_dsc = dccg31_enable_dscclk,
.set_pixel_rate_div = dccg314_set_pixel_rate_div, .set_pixel_rate_div = dccg314_set_pixel_rate_div,
.get_pixel_rate_div = dccg314_get_pixel_rate_div,
.trigger_dio_fifo_resync = dccg314_trigger_dio_fifo_resync, .trigger_dio_fifo_resync = dccg314_trigger_dio_fifo_resync,
.set_valid_pixel_rate = dccg314_set_valid_pixel_rate, .set_valid_pixel_rate = dccg314_set_valid_pixel_rate,
.set_dtbclk_p_src = dccg314_set_dtbclk_p_src .set_dtbclk_p_src = dccg314_set_dtbclk_p_src
......
...@@ -58,8 +58,8 @@ static void dccg32_trigger_dio_fifo_resync( ...@@ -58,8 +58,8 @@ static void dccg32_trigger_dio_fifo_resync(
static void dccg32_get_pixel_rate_div( static void dccg32_get_pixel_rate_div(
struct dccg *dccg, struct dccg *dccg,
uint32_t otg_inst, uint32_t otg_inst,
uint32_t *k1, enum pixel_rate_div *k1,
uint32_t *k2) enum pixel_rate_div *k2)
{ {
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
uint32_t val_k1 = PIXEL_RATE_DIV_NA, val_k2 = PIXEL_RATE_DIV_NA; uint32_t val_k1 = PIXEL_RATE_DIV_NA, val_k2 = PIXEL_RATE_DIV_NA;
...@@ -93,8 +93,8 @@ static void dccg32_get_pixel_rate_div( ...@@ -93,8 +93,8 @@ static void dccg32_get_pixel_rate_div(
return; return;
} }
*k1 = val_k1; *k1 = (enum pixel_rate_div)val_k1;
*k2 = val_k2; *k2 = (enum pixel_rate_div)val_k2;
} }
static void dccg32_set_pixel_rate_div( static void dccg32_set_pixel_rate_div(
...@@ -104,8 +104,7 @@ static void dccg32_set_pixel_rate_div( ...@@ -104,8 +104,7 @@ static void dccg32_set_pixel_rate_div(
enum pixel_rate_div k2) enum pixel_rate_div k2)
{ {
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
uint32_t cur_k1 = PIXEL_RATE_DIV_NA; enum pixel_rate_div cur_k1 = PIXEL_RATE_DIV_NA, cur_k2 = PIXEL_RATE_DIV_NA;
uint32_t cur_k2 = PIXEL_RATE_DIV_NA;
// Don't program 0xF into the register field. Not valid since // Don't program 0xF into the register field. Not valid since
// K1 / K2 field is only 1 / 2 bits wide // K1 / K2 field is only 1 / 2 bits wide
...@@ -344,7 +343,6 @@ static const struct dccg_funcs dccg32_funcs = { ...@@ -344,7 +343,6 @@ static const struct dccg_funcs dccg32_funcs = {
.otg_add_pixel = dccg32_otg_add_pixel, .otg_add_pixel = dccg32_otg_add_pixel,
.otg_drop_pixel = dccg32_otg_drop_pixel, .otg_drop_pixel = dccg32_otg_drop_pixel,
.set_pixel_rate_div = dccg32_set_pixel_rate_div, .set_pixel_rate_div = dccg32_set_pixel_rate_div,
.get_pixel_rate_div = dccg32_get_pixel_rate_div,
.trigger_dio_fifo_resync = dccg32_trigger_dio_fifo_resync, .trigger_dio_fifo_resync = dccg32_trigger_dio_fifo_resync,
.set_dtbclk_p_src = dccg32_set_dtbclk_p_src, .set_dtbclk_p_src = dccg32_set_dtbclk_p_src,
}; };
......
...@@ -52,11 +52,11 @@ ...@@ -52,11 +52,11 @@
static void enc32_dp_set_odm_combine( static void enc32_dp_set_odm_combine(
struct stream_encoder *enc, struct stream_encoder *enc,
bool two_pixel_per_cyle) bool odm_combine)
{ {
struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc); struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
REG_UPDATE(DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, two_pixel_per_cyle ? 1 : 0); REG_UPDATE(DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, odm_combine ? 1 : 0);
} }
/* setup stream encoder in dvi mode */ /* setup stream encoder in dvi mode */
...@@ -241,12 +241,46 @@ static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing) ...@@ -241,12 +241,46 @@ static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
return two_pix; return two_pix;
} }
static bool is_h_timing_divisible_by_2(const struct dc_crtc_timing *timing)
{
/* math borrowed from function of same name in inc/resource
* checks if h_timing is divisible by 2
*/
bool divisible = false;
uint16_t h_blank_start = 0;
uint16_t h_blank_end = 0;
if (timing) {
h_blank_start = timing->h_total - timing->h_front_porch;
h_blank_end = h_blank_start - timing->h_addressable;
/* HTOTAL, Hblank start/end, and Hsync start/end all must be
* divisible by 2 in order for the horizontal timing params
* to be considered divisible by 2. Hsync start is always 0.
*/
divisible = (timing->h_total % 2 == 0) &&
(h_blank_start % 2 == 0) &&
(h_blank_end % 2 == 0) &&
(timing->h_sync_width % 2 == 0);
}
return divisible;
}
static bool is_dp_dig_pixel_rate_div_policy(struct dc *dc, const struct dc_crtc_timing *timing)
{
/* should be functionally the same as dcn32_is_dp_dig_pixel_rate_div_policy for DP encoders*/
return is_h_timing_divisible_by_2(timing) &&
dc->debug.enable_dp_dig_pixel_rate_div_policy;
}
void enc32_stream_encoder_dp_unblank( void enc32_stream_encoder_dp_unblank(
struct dc_link *link, struct dc_link *link,
struct stream_encoder *enc, struct stream_encoder *enc,
const struct encoder_unblank_param *param) const struct encoder_unblank_param *param)
{ {
struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc); struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
struct dc *dc = enc->ctx->dc;
if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) { if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
uint32_t n_vid = 0x8000; uint32_t n_vid = 0x8000;
...@@ -257,7 +291,7 @@ void enc32_stream_encoder_dp_unblank( ...@@ -257,7 +291,7 @@ void enc32_stream_encoder_dp_unblank(
/* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */ /* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */
if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1 if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1
|| param->pix_per_cycle > 1) { || is_dp_dig_pixel_rate_div_policy(dc, &param->timing)) {
/*this logic should be the same in get_pixel_clock_parameters() */ /*this logic should be the same in get_pixel_clock_parameters() */
n_multiply = 1; n_multiply = 1;
pix_per_cycle = 1; pix_per_cycle = 1;
......
...@@ -146,8 +146,8 @@ static void dccg35_set_dppclk_root_clock_gating(struct dccg *dccg, ...@@ -146,8 +146,8 @@ static void dccg35_set_dppclk_root_clock_gating(struct dccg *dccg,
static void dccg35_get_pixel_rate_div( static void dccg35_get_pixel_rate_div(
struct dccg *dccg, struct dccg *dccg,
uint32_t otg_inst, uint32_t otg_inst,
uint32_t *k1, enum pixel_rate_div *k1,
uint32_t *k2) enum pixel_rate_div *k2)
{ {
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
uint32_t val_k1 = PIXEL_RATE_DIV_NA, val_k2 = PIXEL_RATE_DIV_NA; uint32_t val_k1 = PIXEL_RATE_DIV_NA, val_k2 = PIXEL_RATE_DIV_NA;
...@@ -192,8 +192,7 @@ static void dccg35_set_pixel_rate_div( ...@@ -192,8 +192,7 @@ static void dccg35_set_pixel_rate_div(
enum pixel_rate_div k2) enum pixel_rate_div k2)
{ {
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
uint32_t cur_k1 = PIXEL_RATE_DIV_NA; enum pixel_rate_div cur_k1 = PIXEL_RATE_DIV_NA, cur_k2 = PIXEL_RATE_DIV_NA;
uint32_t cur_k2 = PIXEL_RATE_DIV_NA;
// Don't program 0xF into the register field. Not valid since // Don't program 0xF into the register field. Not valid since
// K1 / K2 field is only 1 / 2 bits wide // K1 / K2 field is only 1 / 2 bits wide
...@@ -1019,7 +1018,6 @@ static const struct dccg_funcs dccg35_funcs = { ...@@ -1019,7 +1018,6 @@ static const struct dccg_funcs dccg35_funcs = {
.disable_dsc = dccg35_disable_dscclk, .disable_dsc = dccg35_disable_dscclk,
.enable_dsc = dccg35_enable_dscclk, .enable_dsc = dccg35_enable_dscclk,
.set_pixel_rate_div = dccg35_set_pixel_rate_div, .set_pixel_rate_div = dccg35_set_pixel_rate_div,
.get_pixel_rate_div = dccg35_get_pixel_rate_div,
.trigger_dio_fifo_resync = dccg35_trigger_dio_fifo_resync, .trigger_dio_fifo_resync = dccg35_trigger_dio_fifo_resync,
.set_valid_pixel_rate = dccg35_set_valid_pixel_rate, .set_valid_pixel_rate = dccg35_set_valid_pixel_rate,
.enable_symclk_se = dccg35_enable_symclk_se, .enable_symclk_se = dccg35_enable_symclk_se,
......
...@@ -273,12 +273,46 @@ static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing) ...@@ -273,12 +273,46 @@ static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
return two_pix; return two_pix;
} }
static bool is_h_timing_divisible_by_2(const struct dc_crtc_timing *timing)
{
/* math borrowed from function of same name in inc/resource
* checks if h_timing is divisible by 2
*/
bool divisible = false;
uint16_t h_blank_start = 0;
uint16_t h_blank_end = 0;
if (timing) {
h_blank_start = timing->h_total - timing->h_front_porch;
h_blank_end = h_blank_start - timing->h_addressable;
/* HTOTAL, Hblank start/end, and Hsync start/end all must be
* divisible by 2 in order for the horizontal timing params
* to be considered divisible by 2. Hsync start is always 0.
*/
divisible = (timing->h_total % 2 == 0) &&
(h_blank_start % 2 == 0) &&
(h_blank_end % 2 == 0) &&
(timing->h_sync_width % 2 == 0);
}
return divisible;
}
static bool is_dp_dig_pixel_rate_div_policy(struct dc *dc, const struct dc_crtc_timing *timing)
{
/* should be functionally the same as dcn32_is_dp_dig_pixel_rate_div_policy for DP encoders*/
return is_h_timing_divisible_by_2(timing) &&
dc->debug.enable_dp_dig_pixel_rate_div_policy;
}
static void enc35_stream_encoder_dp_unblank( static void enc35_stream_encoder_dp_unblank(
struct dc_link *link, struct dc_link *link,
struct stream_encoder *enc, struct stream_encoder *enc,
const struct encoder_unblank_param *param) const struct encoder_unblank_param *param)
{ {
struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc); struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
struct dc *dc = enc->ctx->dc;
if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) { if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
uint32_t n_vid = 0x8000; uint32_t n_vid = 0x8000;
...@@ -289,7 +323,7 @@ static void enc35_stream_encoder_dp_unblank( ...@@ -289,7 +323,7 @@ static void enc35_stream_encoder_dp_unblank(
/* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */ /* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */
if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1 if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1
|| param->pix_per_cycle > 1) { || is_dp_dig_pixel_rate_div_policy(dc, &param->timing)) {
/*this logic should be the same in get_pixel_clock_parameters() */ /*this logic should be the same in get_pixel_clock_parameters() */
n_multiply = 1; n_multiply = 1;
pix_per_cycle = 1; pix_per_cycle = 1;
......
...@@ -1782,7 +1782,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) ...@@ -1782,7 +1782,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
struct dc_stream_state *edp_streams[MAX_NUM_EDP]; struct dc_stream_state *edp_streams[MAX_NUM_EDP];
struct dc_link *edp_link_with_sink = NULL; struct dc_link *edp_link_with_sink = NULL;
struct dc_link *edp_link = NULL; struct dc_link *edp_link = NULL;
struct pipe_ctx *pipe_ctx = NULL;
struct dce_hwseq *hws = dc->hwseq; struct dce_hwseq *hws = dc->hwseq;
int edp_with_sink_num; int edp_with_sink_num;
int edp_num; int edp_num;
...@@ -1819,26 +1818,9 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) ...@@ -1819,26 +1818,9 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
can_apply_edp_fast_boot = dc_validate_boot_timing(dc, can_apply_edp_fast_boot = dc_validate_boot_timing(dc,
edp_stream->sink, &edp_stream->timing); edp_stream->sink, &edp_stream->timing);
edp_stream->apply_edp_fast_boot_optimization = can_apply_edp_fast_boot; edp_stream->apply_edp_fast_boot_optimization = can_apply_edp_fast_boot;
if (can_apply_edp_fast_boot) { if (can_apply_edp_fast_boot)
DC_LOG_EVENT_LINK_TRAINING("eDP fast boot Enable\n"); DC_LOG_EVENT_LINK_TRAINING("eDP fast boot disabled to optimize link rate\n");
// Vbios & Driver support different pixel rate div policy.
pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, edp_stream);
if (pipe_ctx &&
hws->funcs.is_dp_dig_pixel_rate_div_policy &&
hws->funcs.is_dp_dig_pixel_rate_div_policy(pipe_ctx)) {
// Get Vbios div factor from register
dc->res_pool->dccg->funcs->get_pixel_rate_div(
dc->res_pool->dccg,
pipe_ctx->stream_res.tg->inst,
&pipe_ctx->pixel_rate_divider.div_factor1,
&pipe_ctx->pixel_rate_divider.div_factor2);
// VBios doesn't support pixel rate div, so force it.
// If VBios supports it, we check it from reigster or other flags.
pipe_ctx->pixel_per_cycle = 1;
}
}
break; break;
} }
} }
......
...@@ -828,14 +828,17 @@ enum dc_status dcn20_enable_stream_timing( ...@@ -828,14 +828,17 @@ enum dc_status dcn20_enable_stream_timing(
struct mpc_dwb_flow_control flow_control; struct mpc_dwb_flow_control flow_control;
struct mpc *mpc = dc->res_pool->mpc; struct mpc *mpc = dc->res_pool->mpc;
bool rate_control_2x_pclk = (interlace || optc2_is_two_pixels_per_containter(&stream->timing)); bool rate_control_2x_pclk = (interlace || optc2_is_two_pixels_per_containter(&stream->timing));
unsigned int k1_div = PIXEL_RATE_DIV_NA;
unsigned int k2_div = PIXEL_RATE_DIV_NA;
if (hws->funcs.calculate_dccg_k1_k2_values && dc->res_pool->dccg->funcs->set_pixel_rate_div) {
hws->funcs.calculate_dccg_k1_k2_values(pipe_ctx, &k1_div, &k2_div);
if (dc->res_pool->dccg->funcs->set_pixel_rate_div)
dc->res_pool->dccg->funcs->set_pixel_rate_div( dc->res_pool->dccg->funcs->set_pixel_rate_div(
dc->res_pool->dccg, dc->res_pool->dccg,
pipe_ctx->stream_res.tg->inst, pipe_ctx->stream_res.tg->inst,
pipe_ctx->pixel_rate_divider.div_factor1, k1_div, k2_div);
pipe_ctx->pixel_rate_divider.div_factor2); }
/* by upper caller loop, pipe0 is parent pipe and be called first. /* 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 * back end is set up by for pipe0. Other children pipe share back end
* with pipe 0. No program is needed. * with pipe 0. No program is needed.
...@@ -2890,6 +2893,9 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx) ...@@ -2890,6 +2893,9 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx)
struct dccg *dccg = dc->res_pool->dccg; struct dccg *dccg = dc->res_pool->dccg;
enum phyd32clk_clock_source phyd32clk; enum phyd32clk_clock_source phyd32clk;
int dp_hpo_inst; int dp_hpo_inst;
struct dce_hwseq *hws = dc->hwseq;
unsigned int k1_div = PIXEL_RATE_DIV_NA;
unsigned int k2_div = PIXEL_RATE_DIV_NA;
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link); struct link_encoder *link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
struct stream_encoder *stream_enc = pipe_ctx->stream_res.stream_enc; struct stream_encoder *stream_enc = pipe_ctx->stream_res.stream_enc;
...@@ -2910,13 +2916,14 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx) ...@@ -2910,13 +2916,14 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx)
dccg->funcs->enable_symclk_se(dccg, stream_enc->stream_enc_inst, dccg->funcs->enable_symclk_se(dccg, stream_enc->stream_enc_inst,
link_enc->transmitter - TRANSMITTER_UNIPHY_A); link_enc->transmitter - TRANSMITTER_UNIPHY_A);
} }
if (hws->funcs.calculate_dccg_k1_k2_values && dc->res_pool->dccg->funcs->set_pixel_rate_div) {
hws->funcs.calculate_dccg_k1_k2_values(pipe_ctx, &k1_div, &k2_div);
if (dc->res_pool->dccg->funcs->set_pixel_rate_div)
dc->res_pool->dccg->funcs->set_pixel_rate_div( dc->res_pool->dccg->funcs->set_pixel_rate_div(
dc->res_pool->dccg, dc->res_pool->dccg,
pipe_ctx->stream_res.tg->inst, pipe_ctx->stream_res.tg->inst,
pipe_ctx->pixel_rate_divider.div_factor1, k1_div, k2_div);
pipe_ctx->pixel_rate_divider.div_factor2); }
link_hwss->setup_stream_encoder(pipe_ctx); link_hwss->setup_stream_encoder(pipe_ctx);
......
...@@ -332,29 +332,6 @@ unsigned int dcn314_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsig ...@@ -332,29 +332,6 @@ unsigned int dcn314_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsig
return odm_combine_factor; return odm_combine_factor;
} }
void dcn314_calculate_pix_rate_divider(
struct dc *dc,
struct dc_state *context,
const struct dc_stream_state *stream)
{
struct dce_hwseq *hws = dc->hwseq;
struct pipe_ctx *pipe_ctx = NULL;
unsigned int k1_div = PIXEL_RATE_DIV_NA;
unsigned int k2_div = PIXEL_RATE_DIV_NA;
pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
if (pipe_ctx) {
pipe_ctx->pixel_per_cycle = 1;
if (hws->funcs.calculate_dccg_k1_k2_values)
hws->funcs.calculate_dccg_k1_k2_values(pipe_ctx, &k1_div, &k2_div);
pipe_ctx->pixel_rate_divider.div_factor1 = k1_div;
pipe_ctx->pixel_rate_divider.div_factor2 = k2_div;
}
}
void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx) void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx)
{ {
uint32_t pix_per_cycle = 1; uint32_t pix_per_cycle = 1;
......
...@@ -39,10 +39,6 @@ void dcn314_enable_power_gating_plane(struct dce_hwseq *hws, bool enable); ...@@ -39,10 +39,6 @@ void dcn314_enable_power_gating_plane(struct dce_hwseq *hws, bool enable);
unsigned int dcn314_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsigned int *k1_div, unsigned int *k2_div); unsigned int dcn314_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsigned int *k1_div, unsigned int *k2_div);
void dcn314_calculate_pix_rate_divider(struct dc *dc,
struct dc_state *context,
const struct dc_stream_state *stream);
void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx); void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx);
void dcn314_resync_fifo_dccg_dio(struct dce_hwseq *hws, struct dc *dc, struct dc_state *context); void dcn314_resync_fifo_dccg_dio(struct dce_hwseq *hws, struct dc *dc, struct dc_state *context);
......
...@@ -152,7 +152,6 @@ static const struct hwseq_private_funcs dcn314_private_funcs = { ...@@ -152,7 +152,6 @@ static const struct hwseq_private_funcs dcn314_private_funcs = {
.set_shaper_3dlut = dcn20_set_shaper_3dlut, .set_shaper_3dlut = dcn20_set_shaper_3dlut,
.setup_hpo_hw_control = dcn31_setup_hpo_hw_control, .setup_hpo_hw_control = dcn31_setup_hpo_hw_control,
.calculate_dccg_k1_k2_values = dcn314_calculate_dccg_k1_k2_values, .calculate_dccg_k1_k2_values = dcn314_calculate_dccg_k1_k2_values,
.calculate_pix_rate_divider = dcn314_calculate_pix_rate_divider,
.set_pixels_per_cycle = dcn314_set_pixels_per_cycle, .set_pixels_per_cycle = dcn314_set_pixels_per_cycle,
.resync_fifo_dccg_dio = dcn314_resync_fifo_dccg_dio, .resync_fifo_dccg_dio = dcn314_resync_fifo_dccg_dio,
}; };
......
...@@ -1159,14 +1159,15 @@ unsigned int dcn32_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsign ...@@ -1159,14 +1159,15 @@ unsigned int dcn32_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsign
void dcn32_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx) void dcn32_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx)
{ {
uint32_t pix_per_cycle = pipe_ctx->pixel_per_cycle; uint32_t pix_per_cycle = 1;
uint32_t odm_combine_factor = 1; uint32_t odm_combine_factor = 1;
if (!pipe_ctx || !pipe_ctx->stream || !pipe_ctx->stream_res.stream_enc) if (!pipe_ctx || !pipe_ctx->stream || !pipe_ctx->stream_res.stream_enc)
return; return;
odm_combine_factor = get_odm_config(pipe_ctx, NULL); odm_combine_factor = get_odm_config(pipe_ctx, NULL);
if (optc2_is_two_pixels_per_containter(&pipe_ctx->stream->timing) || odm_combine_factor > 1) if (optc2_is_two_pixels_per_containter(&pipe_ctx->stream->timing) || odm_combine_factor > 1
|| dcn32_is_dp_dig_pixel_rate_div_policy(pipe_ctx))
pix_per_cycle = 2; pix_per_cycle = 2;
if (pipe_ctx->stream_res.stream_enc->funcs->set_input_mode) if (pipe_ctx->stream_res.stream_enc->funcs->set_input_mode)
...@@ -1212,8 +1213,8 @@ void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx, ...@@ -1212,8 +1213,8 @@ void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx,
struct dc_link *link = stream->link; struct dc_link *link = stream->link;
struct dce_hwseq *hws = link->dc->hwseq; struct dce_hwseq *hws = link->dc->hwseq;
struct pipe_ctx *odm_pipe; struct pipe_ctx *odm_pipe;
uint32_t pix_per_cycle = 1;
params.pix_per_cycle = pipe_ctx->pixel_per_cycle;
params.opp_cnt = 1; params.opp_cnt = 1;
for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe) for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe)
params.opp_cnt++; params.opp_cnt++;
...@@ -1229,14 +1230,13 @@ void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx, ...@@ -1229,14 +1230,13 @@ void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx,
pipe_ctx->stream_res.hpo_dp_stream_enc, pipe_ctx->stream_res.hpo_dp_stream_enc,
pipe_ctx->stream_res.tg->inst); pipe_ctx->stream_res.tg->inst);
} else if (dc_is_dp_signal(pipe_ctx->stream->signal)) { } else if (dc_is_dp_signal(pipe_ctx->stream->signal)) {
if (optc2_is_two_pixels_per_containter(&stream->timing) || params.opp_cnt > 1) if (optc2_is_two_pixels_per_containter(&stream->timing) || params.opp_cnt > 1
params.pix_per_cycle = 2; || dcn32_is_dp_dig_pixel_rate_div_policy(pipe_ctx)) {
if (params.pix_per_cycle == 2)
params.timing.pix_clk_100hz /= 2; params.timing.pix_clk_100hz /= 2;
pix_per_cycle = 2;
}
pipe_ctx->stream_res.stream_enc->funcs->dp_set_odm_combine( pipe_ctx->stream_res.stream_enc->funcs->dp_set_odm_combine(
pipe_ctx->stream_res.stream_enc, params.pix_per_cycle > 1); pipe_ctx->stream_res.stream_enc, pix_per_cycle > 1);
pipe_ctx->stream_res.stream_enc->funcs->dp_unblank(link, pipe_ctx->stream_res.stream_enc, &params); pipe_ctx->stream_res.stream_enc->funcs->dp_unblank(link, pipe_ctx->stream_res.stream_enc, &params);
} }
...@@ -1257,32 +1257,6 @@ bool dcn32_is_dp_dig_pixel_rate_div_policy(struct pipe_ctx *pipe_ctx) ...@@ -1257,32 +1257,6 @@ bool dcn32_is_dp_dig_pixel_rate_div_policy(struct pipe_ctx *pipe_ctx)
return false; return false;
} }
void dcn32_calculate_pix_rate_divider(
struct dc *dc,
struct dc_state *context,
const struct dc_stream_state *stream)
{
struct dce_hwseq *hws = dc->hwseq;
struct pipe_ctx *pipe_ctx = NULL;
unsigned int k1_div = PIXEL_RATE_DIV_NA;
unsigned int k2_div = PIXEL_RATE_DIV_NA;
pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
if (pipe_ctx) {
pipe_ctx->pixel_per_cycle = 1;
if (dcn32_is_dp_dig_pixel_rate_div_policy(pipe_ctx))
pipe_ctx->pixel_per_cycle = 2;
if (hws->funcs.calculate_dccg_k1_k2_values)
hws->funcs.calculate_dccg_k1_k2_values(pipe_ctx, &k1_div, &k2_div);
pipe_ctx->pixel_rate_divider.div_factor1 = k1_div;
pipe_ctx->pixel_rate_divider.div_factor2 = k2_div;
}
}
static void apply_symclk_on_tx_off_wa(struct dc_link *link) static void apply_symclk_on_tx_off_wa(struct dc_link *link)
{ {
/* There are use cases where SYMCLK is referenced by OTG. For instance /* There are use cases where SYMCLK is referenced by OTG. For instance
......
...@@ -91,10 +91,6 @@ void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx, ...@@ -91,10 +91,6 @@ void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx,
bool dcn32_is_dp_dig_pixel_rate_div_policy(struct pipe_ctx *pipe_ctx); bool dcn32_is_dp_dig_pixel_rate_div_policy(struct pipe_ctx *pipe_ctx);
void dcn32_calculate_pix_rate_divider(struct dc *dc,
struct dc_state *context,
const struct dc_stream_state *stream);
void dcn32_disable_link_output(struct dc_link *link, void dcn32_disable_link_output(struct dc_link *link,
const struct link_resource *link_res, const struct link_resource *link_res,
enum signal_type signal); enum signal_type signal);
......
...@@ -161,7 +161,6 @@ static const struct hwseq_private_funcs dcn32_private_funcs = { ...@@ -161,7 +161,6 @@ static const struct hwseq_private_funcs dcn32_private_funcs = {
.set_pixels_per_cycle = dcn32_set_pixels_per_cycle, .set_pixels_per_cycle = dcn32_set_pixels_per_cycle,
.resync_fifo_dccg_dio = dcn32_resync_fifo_dccg_dio, .resync_fifo_dccg_dio = dcn32_resync_fifo_dccg_dio,
.is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy, .is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy,
.calculate_pix_rate_divider = dcn32_calculate_pix_rate_divider,
.apply_single_controller_ctx_to_hw = dce110_apply_single_controller_ctx_to_hw, .apply_single_controller_ctx_to_hw = dce110_apply_single_controller_ctx_to_hw,
.reset_back_end_for_pipe = dcn20_reset_back_end_for_pipe, .reset_back_end_for_pipe = dcn20_reset_back_end_for_pipe,
.populate_mcm_luts = dcn401_populate_mcm_luts, .populate_mcm_luts = dcn401_populate_mcm_luts,
......
...@@ -162,7 +162,6 @@ static const struct hwseq_private_funcs dcn35_private_funcs = { ...@@ -162,7 +162,6 @@ static const struct hwseq_private_funcs dcn35_private_funcs = {
.set_pixels_per_cycle = dcn32_set_pixels_per_cycle, .set_pixels_per_cycle = dcn32_set_pixels_per_cycle,
.resync_fifo_dccg_dio = dcn314_resync_fifo_dccg_dio, .resync_fifo_dccg_dio = dcn314_resync_fifo_dccg_dio,
.is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy, .is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy,
.calculate_pix_rate_divider = dcn32_calculate_pix_rate_divider,
.dsc_pg_control = dcn35_dsc_pg_control, .dsc_pg_control = dcn35_dsc_pg_control,
.dsc_pg_status = dcn32_dsc_pg_status, .dsc_pg_status = dcn32_dsc_pg_status,
.enable_plane = dcn35_enable_plane, .enable_plane = dcn35_enable_plane,
......
...@@ -160,7 +160,6 @@ static const struct hwseq_private_funcs dcn351_private_funcs = { ...@@ -160,7 +160,6 @@ static const struct hwseq_private_funcs dcn351_private_funcs = {
.calculate_dccg_k1_k2_values = dcn32_calculate_dccg_k1_k2_values, .calculate_dccg_k1_k2_values = dcn32_calculate_dccg_k1_k2_values,
.set_pixels_per_cycle = dcn32_set_pixels_per_cycle, .set_pixels_per_cycle = dcn32_set_pixels_per_cycle,
.is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy, .is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy,
.calculate_pix_rate_divider = dcn32_calculate_pix_rate_divider,
.dsc_pg_control = dcn35_dsc_pg_control, .dsc_pg_control = dcn35_dsc_pg_control,
.dsc_pg_status = dcn32_dsc_pg_status, .dsc_pg_status = dcn32_dsc_pg_status,
.enable_plane = dcn35_enable_plane, .enable_plane = dcn35_enable_plane,
......
...@@ -177,9 +177,6 @@ struct hwseq_private_funcs { ...@@ -177,9 +177,6 @@ struct hwseq_private_funcs {
struct dc_state *context, struct dc_state *context,
struct dc *dc); struct dc *dc);
bool (*is_dp_dig_pixel_rate_div_policy)(struct pipe_ctx *pipe_ctx); bool (*is_dp_dig_pixel_rate_div_policy)(struct pipe_ctx *pipe_ctx);
void (*calculate_pix_rate_divider)(struct dc *dc,
struct dc_state *context,
const struct dc_stream_state *stream);
void (*reset_back_end_for_pipe)(struct dc *dc, void (*reset_back_end_for_pipe)(struct dc *dc,
struct pipe_ctx *pipe_ctx, struct pipe_ctx *pipe_ctx,
struct dc_state *context); struct dc_state *context);
......
...@@ -399,11 +399,6 @@ union pipe_update_flags { ...@@ -399,11 +399,6 @@ union pipe_update_flags {
uint32_t raw; uint32_t raw;
}; };
struct pixel_rate_divider {
uint32_t div_factor1;
uint32_t div_factor2;
};
enum p_state_switch_method { enum p_state_switch_method {
P_STATE_UNKNOWN = 0, P_STATE_UNKNOWN = 0,
P_STATE_V_BLANK = 1, P_STATE_V_BLANK = 1,
...@@ -469,8 +464,6 @@ struct pipe_ctx { ...@@ -469,8 +464,6 @@ struct pipe_ctx {
bool has_vactive_margin; bool has_vactive_margin;
/* subvp_index: only valid if the pipe is a SUBVP_MAIN*/ /* subvp_index: only valid if the pipe is a SUBVP_MAIN*/
uint8_t subvp_index; uint8_t subvp_index;
uint32_t pixel_per_cycle;
struct pixel_rate_divider pixel_rate_divider;
}; };
/* Data used for dynamic link encoder assignment. /* Data used for dynamic link encoder assignment.
......
...@@ -176,11 +176,6 @@ struct dccg_funcs { ...@@ -176,11 +176,6 @@ struct dccg_funcs {
enum pixel_rate_div k1, enum pixel_rate_div k1,
enum pixel_rate_div k2); enum pixel_rate_div k2);
void (*get_pixel_rate_div)(struct dccg *dccg,
uint32_t otg_inst,
uint32_t *div_factor1,
uint32_t *div_factor2);
void (*set_valid_pixel_rate)( void (*set_valid_pixel_rate)(
struct dccg *dccg, struct dccg *dccg,
int ref_dtbclk_khz, int ref_dtbclk_khz,
......
...@@ -99,7 +99,6 @@ struct encoder_unblank_param { ...@@ -99,7 +99,6 @@ struct encoder_unblank_param {
struct dc_link_settings link_settings; struct dc_link_settings link_settings;
struct dc_crtc_timing timing; struct dc_crtc_timing timing;
int opp_cnt; int opp_cnt;
uint32_t pix_per_cycle;
}; };
struct encoder_set_dp_phy_pattern_param { struct encoder_set_dp_phy_pattern_param {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment