]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amd/display: DIO Supported for virtual displays
authorWesley Chalmers <Wesley.Chalmers@amd.com>
Fri, 29 Jan 2021 17:37:37 +0000 (12:37 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 9 Feb 2021 20:48:18 +0000 (15:48 -0500)
[WHY]
Virtual displays do not use the backend of the pipe, and so have
infinite backend bandwidth.

[HOW]
Add a skip_dio_check bool to the VBA struct, which is used to override
the DIOSupport calculations.

Signed-off-by: Wesley Chalmers <Wesley.Chalmers@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Anson Jacob <Anson.Jacob@amd.com>
Acked-by: Chris Park <Chris.Park@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c
drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
drivers/gpu/drm/amd/display/dc/dml/dcn21/display_mode_vba_21.c
drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c
drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c
drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h

index 6505373483bbafe50ec2bbc909b9f54ed64e7dfb..a0a4ab47a1c0d5da24fc98387241e22e640eb516 100644 (file)
@@ -2097,6 +2097,7 @@ int dcn20_populate_dml_pipes_from_context(
                        pipes[pipe_cnt].pipe.dest.pixel_rate_mhz *= 2;
                pipes[pipe_cnt].pipe.dest.otg_inst = res_ctx->pipe_ctx[i].stream_res.tg->inst;
                pipes[pipe_cnt].dout.dp_lanes = 4;
+               pipes[pipe_cnt].dout.is_virtual = 0;
                pipes[pipe_cnt].pipe.dest.vtotal_min = res_ctx->pipe_ctx[i].stream->adjust.v_total_min;
                pipes[pipe_cnt].pipe.dest.vtotal_max = res_ctx->pipe_ctx[i].stream->adjust.v_total_max;
                switch (get_num_odm_splits(&res_ctx->pipe_ctx[i])) {
@@ -2150,6 +2151,7 @@ int dcn20_populate_dml_pipes_from_context(
                        break;
                default:
                        /* In case there is no signal, set dp with 4 lanes to allow max config */
+                       pipes[pipe_cnt].dout.is_virtual = 1;
                        pipes[pipe_cnt].dout.output_type = dm_dp;
                        pipes[pipe_cnt].dout.dp_lanes = 4;
                }
index f33e3de08176397bf65275ee4a002b97d8fc063d..0f3f510fd83b8a0b54542145df9c44a90507eed7 100644 (file)
@@ -4168,10 +4168,11 @@ void dml20_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
        for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
                locals->DIOSupport[i] = true;
                for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
-                       if (locals->OutputBppPerState[i][k] == BPP_INVALID
-                                       || (mode_lib->vba.OutputFormat[k] == dm_420
+                       if (!mode_lib->vba.skip_dio_check[k]
+                                       && (locals->OutputBppPerState[i][k] == BPP_INVALID
+                                               || (mode_lib->vba.OutputFormat[k] == dm_420
                                                        && mode_lib->vba.Interlace[k] == true
-                                                       && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true)) {
+                                                       && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true))) {
                                locals->DIOSupport[i] = false;
                        }
                }
index 47e8e71113ee5305ba10a30a9e7e427b620bde23..210c96cd5b03b5bfe4277f84e3562c4f51e42fc4 100644 (file)
@@ -4289,10 +4289,11 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
        for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
                locals->DIOSupport[i] = true;
                for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
-                       if (locals->OutputBppPerState[i][k] == BPP_INVALID
-                                       || (mode_lib->vba.OutputFormat[k] == dm_420
+                       if (!mode_lib->vba.skip_dio_check[k]
+                                       && (locals->OutputBppPerState[i][k] == BPP_INVALID
+                                               || (mode_lib->vba.OutputFormat[k] == dm_420
                                                        && mode_lib->vba.Interlace[k] == true
-                                                       && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true)) {
+                                                       && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true))) {
                                locals->DIOSupport[i] = false;
                        }
                }
index 0bcec113ecac124bf24f2fab7b8b1297a83f8e0a..398210d1af34fcb8eaf3270833d71bfb30ba30f0 100644 (file)
@@ -4257,10 +4257,11 @@ void dml21_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
        for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
                locals->DIOSupport[i] = true;
                for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
-                       if (locals->OutputBppPerState[i][k] == BPP_INVALID
-                                       || (mode_lib->vba.OutputFormat[k] == dm_420
+                       if (!mode_lib->vba.skip_dio_check[k]
+                                       && (locals->OutputBppPerState[i][k] == BPP_INVALID
+                                               || (mode_lib->vba.OutputFormat[k] == dm_420
                                                        && mode_lib->vba.Interlace[k] == true
-                                                       && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true)) {
+                                                       && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true))) {
                                locals->DIOSupport[i] = false;
                        }
                }
index 8fdb34aa70ff331941515e02f7061e4c645029e1..bc07082c135755950e31b63af9bec7356907db1d 100644 (file)
@@ -4263,7 +4263,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
        for (i = 0; i < v->soc.num_states; i++) {
                v->DIOSupport[i] = true;
                for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
-                       if (v->BlendingAndTiming[k] == k && (v->Output[k] == dm_dp || v->Output[k] == dm_edp || v->Output[k] == dm_hdmi)
+                       if (!v->skip_dio_check[k] && v->BlendingAndTiming[k] == k && (v->Output[k] == dm_dp || v->Output[k] == dm_edp || v->Output[k] == dm_hdmi)
                                        && (v->OutputBppPerState[i][k] == 0
                                                        || (v->OutputFormat[k] == dm_420 && v->Interlace[k] == true && v->ProgressiveToInterlaceUnitInOPP == true))) {
                                v->DIOSupport[i] = false;
index dd0c3b1780d702967ad3ef5a7db79cc14df1a6d7..0c5128187e0896868134d3436e41fc9256effc0a 100644 (file)
@@ -297,6 +297,7 @@ struct _vcs_dpi_display_output_params_st {
        int num_active_wb;
        int output_bpc;
        int output_type;
+       int is_virtual;
        int output_format;
        int dsc_slices;
        int max_audio_sample_rate;
index c9fbb33f05a32e8c918ad30098186aae6b92c469..bc0485a59018ad2622e3c19c2895b340cbe44c2f 100644 (file)
@@ -451,6 +451,8 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)
                                dout->output_bpp;
                mode_lib->vba.Output[mode_lib->vba.NumberOfActivePlanes] =
                                (enum output_encoder_class) (dout->output_type);
+               mode_lib->vba.skip_dio_check[mode_lib->vba.NumberOfActivePlanes] =
+                               dout->is_virtual;
 
                if (!dout->dsc_enable)
                        mode_lib->vba.ForcedOutputLinkBPP[mode_lib->vba.NumberOfActivePlanes] = dout->output_bpp;
index 3529fedc4c523c1ac37eeb763ef7c8360ae3ff8d..025aa5bd8ea0a0191d37343b06a69a4e93257861 100644 (file)
@@ -340,6 +340,7 @@ struct vba_vars_st {
        unsigned int DSCInputBitPerComponent[DC__NUM_DPP__MAX];
        enum output_format_class OutputFormat[DC__NUM_DPP__MAX];
        enum output_encoder_class Output[DC__NUM_DPP__MAX];
+       bool skip_dio_check[DC__NUM_DPP__MAX];
        unsigned int BlendingAndTiming[DC__NUM_DPP__MAX];
        bool SynchronizedVBlank;
        unsigned int NumberOfCursors[DC__NUM_DPP__MAX];