Skip to content

Commit 90517c9

Browse files
Hersen Wualexdeucher
authored andcommitted
drm/amd/display: dsc mst 2 4K displays go dark with 2 lane HBR3
[Why] call stack of amdgpu dsc mst pbn, slot num calculation is as below: -compute_bpp_x16_from_target_bandwidth -decide_dsc_target_bpp_x16 -setup_dsc_config -dc_dsc_compute_bandwidth_range -compute_mst_dsc_configs_for_link -compute_mst_dsc_configs_for_state from pbn -> dsc target bpp_x16 bpp_x16 is calulated by compute_bpp_x16_from_target_bandwidth. Beside pixel clock and bpp, num_slices_h and bpp_increment_div will also affect bpp_x16. from dsc target bpp_x16 -> pbn within dm_update_mst_vcpi_slots_for_dsc, pbn = drm_dp_calc_pbn_mode(clock, bpp_x16, true); drm_dp_calc_pbn_mode(int clock, int bpp, bool dsc) { return DIV_ROUND_UP_ULL(mul_u32_u32(clock * (bpp / 16), 64 * 1006), 8 * 54 * 1000 * 1000); } bpp / 16 trunc digits after decimal point. This will cause calculation delta. drm_dp_calc_pbn_mode does not have other informations, like num_slices_h, bpp_increment_div. therefore, it does not do revese calcuation properly from bpp_x16 to pbn. pbn from drm_dp_calc_pbn_mode is less than pbn from compute_mst_dsc_configs_for_state. This cause not enough mst slot allocated to display. display could not visually light up. [How] pass pbn from compute_mst_dsc_configs_for_state to dm_update_mst_vcpi_slots_for_dsc Cc: [email protected] Reviewed-by: Scott Foster <[email protected]> Acked-by: Mikita Lipski <[email protected]> Signed-off-by: Hersen Wu <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 9987fbb commit 90517c9

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6794,14 +6794,15 @@ const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = {
67946794

67956795
#if defined(CONFIG_DRM_AMD_DC_DCN)
67966796
static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
6797-
struct dc_state *dc_state)
6797+
struct dc_state *dc_state,
6798+
struct dsc_mst_fairness_vars *vars)
67986799
{
67996800
struct dc_stream_state *stream = NULL;
68006801
struct drm_connector *connector;
68016802
struct drm_connector_state *new_con_state;
68026803
struct amdgpu_dm_connector *aconnector;
68036804
struct dm_connector_state *dm_conn_state;
6804-
int i, j, clock, bpp;
6805+
int i, j, clock;
68056806
int vcpi, pbn_div, pbn = 0;
68066807

68076808
for_each_new_connector_in_state(state, connector, new_con_state, i) {
@@ -6840,9 +6841,15 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
68406841
}
68416842

68426843
pbn_div = dm_mst_get_pbn_divider(stream->link);
6843-
bpp = stream->timing.dsc_cfg.bits_per_pixel;
68446844
clock = stream->timing.pix_clk_100hz / 10;
6845-
pbn = drm_dp_calc_pbn_mode(clock, bpp, true);
6845+
/* pbn is calculated by compute_mst_dsc_configs_for_state*/
6846+
for (j = 0; j < dc_state->stream_count; j++) {
6847+
if (vars[j].aconnector == aconnector) {
6848+
pbn = vars[j].pbn;
6849+
break;
6850+
}
6851+
}
6852+
68466853
vcpi = drm_dp_mst_atomic_enable_dsc(state,
68476854
aconnector->port,
68486855
pbn, pbn_div,
@@ -10247,6 +10254,9 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
1024710254
int ret, i;
1024810255
bool lock_and_validation_needed = false;
1024910256
struct dm_crtc_state *dm_old_crtc_state;
10257+
#if defined(CONFIG_DRM_AMD_DC_DCN)
10258+
struct dsc_mst_fairness_vars vars[MAX_PIPES];
10259+
#endif
1025010260

1025110261
trace_amdgpu_dm_atomic_check_begin(state);
1025210262

@@ -10477,10 +10487,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
1047710487
goto fail;
1047810488

1047910489
#if defined(CONFIG_DRM_AMD_DC_DCN)
10480-
if (!compute_mst_dsc_configs_for_state(state, dm_state->context))
10490+
if (!compute_mst_dsc_configs_for_state(state, dm_state->context, vars))
1048110491
goto fail;
1048210492

10483-
ret = dm_update_mst_vcpi_slots_for_dsc(state, dm_state->context);
10493+
ret = dm_update_mst_vcpi_slots_for_dsc(state, dm_state->context, vars);
1048410494
if (ret)
1048510495
goto fail;
1048610496
#endif

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -518,12 +518,7 @@ struct dsc_mst_fairness_params {
518518
uint32_t num_slices_h;
519519
uint32_t num_slices_v;
520520
uint32_t bpp_overwrite;
521-
};
522-
523-
struct dsc_mst_fairness_vars {
524-
int pbn;
525-
bool dsc_enabled;
526-
int bpp_x16;
521+
struct amdgpu_dm_connector *aconnector;
527522
};
528523

529524
static int kbps_to_peak_pbn(int kbps)
@@ -750,12 +745,12 @@ static void try_disable_dsc(struct drm_atomic_state *state,
750745

751746
static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
752747
struct dc_state *dc_state,
753-
struct dc_link *dc_link)
748+
struct dc_link *dc_link,
749+
struct dsc_mst_fairness_vars *vars)
754750
{
755751
int i;
756752
struct dc_stream_state *stream;
757753
struct dsc_mst_fairness_params params[MAX_PIPES];
758-
struct dsc_mst_fairness_vars vars[MAX_PIPES];
759754
struct amdgpu_dm_connector *aconnector;
760755
int count = 0;
761756
bool debugfs_overwrite = false;
@@ -776,6 +771,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
776771
params[count].timing = &stream->timing;
777772
params[count].sink = stream->sink;
778773
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
774+
params[count].aconnector = aconnector;
779775
params[count].port = aconnector->port;
780776
params[count].clock_force_enable = aconnector->dsc_settings.dsc_force_enable;
781777
if (params[count].clock_force_enable == DSC_CLK_FORCE_ENABLE)
@@ -798,6 +794,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
798794
}
799795
/* Try no compression */
800796
for (i = 0; i < count; i++) {
797+
vars[i].aconnector = params[i].aconnector;
801798
vars[i].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps);
802799
vars[i].dsc_enabled = false;
803800
vars[i].bpp_x16 = 0;
@@ -851,7 +848,8 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
851848
}
852849

853850
bool compute_mst_dsc_configs_for_state(struct drm_atomic_state *state,
854-
struct dc_state *dc_state)
851+
struct dc_state *dc_state,
852+
struct dsc_mst_fairness_vars *vars)
855853
{
856854
int i, j;
857855
struct dc_stream_state *stream;
@@ -882,7 +880,7 @@ bool compute_mst_dsc_configs_for_state(struct drm_atomic_state *state,
882880
return false;
883881

884882
mutex_lock(&aconnector->mst_mgr.lock);
885-
if (!compute_mst_dsc_configs_for_link(state, dc_state, stream->link)) {
883+
if (!compute_mst_dsc_configs_for_link(state, dc_state, stream->link, vars)) {
886884
mutex_unlock(&aconnector->mst_mgr.lock);
887885
return false;
888886
}

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,17 @@ void
3939
dm_dp_create_fake_mst_encoders(struct amdgpu_device *adev);
4040

4141
#if defined(CONFIG_DRM_AMD_DC_DCN)
42+
43+
struct dsc_mst_fairness_vars {
44+
int pbn;
45+
bool dsc_enabled;
46+
int bpp_x16;
47+
struct amdgpu_dm_connector *aconnector;
48+
};
49+
4250
bool compute_mst_dsc_configs_for_state(struct drm_atomic_state *state,
43-
struct dc_state *dc_state);
51+
struct dc_state *dc_state,
52+
struct dsc_mst_fairness_vars *vars);
4453
#endif
4554

4655
#endif

0 commit comments

Comments
 (0)