]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
drm/amd/display: Rename more dc_surface stuff to plane_state
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / amd / display / dc / dcn10 / dcn10_resource.c
index 77fc251d45ba2f94b2ee89c4f3e935b2b0317d9f..3fe6df92f91ff81849090c08bb0645abe33300a0 100644 (file)
@@ -33,7 +33,7 @@
 #include "dcn10/dcn10_ipp.h"
 #include "dcn10/dcn10_mpc.h"
 #include "irq/dcn10/irq_service_dcn10.h"
-#include "dcn10/dcn10_transform.h"
+#include "dcn10/dcn10_dpp.h"
 #include "dcn10/dcn10_timing_generator.h"
 #include "dcn10/dcn10_hw_sequencer.h"
 #include "dce110/dce110_hw_sequencer.h"
@@ -136,17 +136,6 @@ enum dcn10_clk_src_array_id {
 /* macros to expend register list macro defined in HW object header file
  * end *********************/
 
-static const struct dce_disp_clk_registers disp_clk_regs = {
-               CLK_DCN10_REG_LIST()
-};
-
-static const struct dce_disp_clk_shift disp_clk_shift = {
-               CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce_disp_clk_mask disp_clk_mask = {
-               CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
 
 static const struct dce_dmcu_registers dmcu_regs = {
                DMCU_DCN10_REG_LIST()
@@ -277,7 +266,7 @@ static const struct dce110_link_enc_registers link_enc_regs[] = {
 
 #define ipp_regs(id)\
 [id] = {\
-       IPP_DCN10_REG_LIST(id),\
+       IPP_REG_LIST_DCN10(id),\
 }
 
 static const struct dcn10_ipp_registers ipp_regs[] = {
@@ -288,16 +277,16 @@ static const struct dcn10_ipp_registers ipp_regs[] = {
 };
 
 static const struct dcn10_ipp_shift ipp_shift = {
-               IPP_DCN10_MASK_SH_LIST(__SHIFT)
+               IPP_MASK_SH_LIST_DCN10(__SHIFT)
 };
 
 static const struct dcn10_ipp_mask ipp_mask = {
-               IPP_DCN10_MASK_SH_LIST(_MASK),
+               IPP_MASK_SH_LIST_DCN10(_MASK),
 };
 
 #define opp_regs(id)\
 [id] = {\
-       OPP_DCN10_REG_LIST(id),\
+       OPP_REG_LIST_DCN10(id),\
 }
 
 static const struct dcn10_opp_registers opp_regs[] = {
@@ -308,56 +297,46 @@ static const struct dcn10_opp_registers opp_regs[] = {
 };
 
 static const struct dcn10_opp_shift opp_shift = {
-               OPP_DCN10_MASK_SH_LIST(__SHIFT)
+               OPP_MASK_SH_LIST_DCN10(__SHIFT)
 };
 
 static const struct dcn10_opp_mask opp_mask = {
-               OPP_DCN10_MASK_SH_LIST(_MASK),
+               OPP_MASK_SH_LIST_DCN10(_MASK),
 };
 
 #define tf_regs(id)\
 [id] = {\
-       TF_REG_LIST_DCN(id),\
+       TF_REG_LIST_DCN10(id),\
 }
 
-static const struct dcn_transform_registers tf_regs[] = {
+static const struct dcn_dpp_registers tf_regs[] = {
        tf_regs(0),
        tf_regs(1),
        tf_regs(2),
        tf_regs(3),
 };
 
-static const struct dcn_transform_shift tf_shift = {
-               TF_REG_LIST_SH_MASK_DCN(__SHIFT)
+static const struct dcn_dpp_shift tf_shift = {
+       TF_REG_LIST_SH_MASK_DCN10(__SHIFT)
 };
 
-static const struct dcn_transform_mask tf_mask = {
-               TF_REG_LIST_SH_MASK_DCN(_MASK),
+static const struct dcn_dpp_mask tf_mask = {
+       TF_REG_LIST_SH_MASK_DCN10(_MASK),
 };
 
-
-#define mpcc_regs(id)\
-[id] = {\
-       MPCC_COMMON_REG_LIST_DCN1_0(id),\
-       MPC_COMMON_REG_LIST_DCN1_0(0),\
-       MPC_COMMON_REG_LIST_DCN1_0(1),\
-       MPC_COMMON_REG_LIST_DCN1_0(2),\
-       MPC_COMMON_REG_LIST_DCN1_0(3),\
-}
-
-static const struct dcn_mpcc_registers mpcc_regs[] = {
-       mpcc_regs(0),
-       mpcc_regs(1),
-       mpcc_regs(2),
-       mpcc_regs(3),
+static const struct dcn_mpc_registers mpc_regs = {
+               MPC_COMMON_REG_LIST_DCN1_0(0),
+               MPC_COMMON_REG_LIST_DCN1_0(1),
+               MPC_COMMON_REG_LIST_DCN1_0(2),
+               MPC_COMMON_REG_LIST_DCN1_0(3)
 };
 
-static const struct dcn_mpcc_shift mpcc_shift = {
-       MPCC_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT)
+static const struct dcn_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT)
 };
 
-static const struct dcn_mpcc_mask mpcc_mask = {
-       MPCC_COMMON_MASK_SH_LIST_DCN1_0(_MASK),
+static const struct dcn_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN1_0(_MASK),
 };
 
 #define tg_regs(id)\
@@ -385,7 +364,7 @@ static const struct bios_registers bios_regs = {
 
 #define mi_regs(id)\
 [id] = {\
-       MI_DCN10_REG_LIST(id)\
+       MI_REG_LIST_DCN10(id)\
 }
 
 
@@ -397,11 +376,11 @@ static const struct dcn_mi_registers mi_regs[] = {
 };
 
 static const struct dcn_mi_shift mi_shift = {
-               MI_DCN10_MASK_SH_LIST(__SHIFT)
+               MI_MASK_SH_LIST_DCN10(__SHIFT)
 };
 
 static const struct dcn_mi_mask mi_mask = {
-               MI_DCN10_MASK_SH_LIST(_MASK)
+               MI_MASK_SH_LIST_DCN10(_MASK)
 };
 
 #define clk_src_regs(index, pllid)\
@@ -435,6 +414,7 @@ static const struct resource_caps res_cap = {
 
 static const struct dc_debug debug_defaults_drv = {
                .disable_dcc = false,
+               .sanity_checks = true,
                .disable_dmcu = true,
                .force_abm_enable = false,
                .timing_trace = false,
@@ -443,7 +423,7 @@ static const struct dc_debug debug_defaults_drv = {
                .disable_pplib_wm_range = false,
 #if defined(CONFIG_DRM_AMD_DC_DCN1_0)
                .use_dml_wm = false,
-               .use_max_voltage = false
+               .disable_pipe_split = true
 #endif
 };
 
@@ -456,32 +436,32 @@ static const struct dc_debug debug_defaults_diags = {
                .disable_pplib_clock_request = true,
                .disable_pplib_wm_range = true,
                .use_dml_wm = false,
-               .use_max_voltage = false
+               .disable_pipe_split = false
 #endif
 };
 
-static void dcn10_transform_destroy(struct transform **xfm)
+static void dcn10_dpp_destroy(struct transform **xfm)
 {
-       dm_free(TO_DCN10_TRANSFORM(*xfm));
+       dm_free(TO_DCN10_DPP(*xfm));
        *xfm = NULL;
 }
 
-static struct transform *dcn10_transform_create(
+static struct transform *dcn10_dpp_create(
        struct dc_context *ctx,
        uint32_t inst)
 {
-       struct dcn10_transform *transform =
-               dm_alloc(sizeof(struct dcn10_transform));
+       struct dcn10_dpp *dpp =
+               dm_alloc(sizeof(struct dcn10_dpp));
 
-       if (!transform)
+       if (!dpp)
                return NULL;
 
-       if (dcn10_transform_construct(transform, ctx,
+       if (dcn10_dpp_construct(dpp, ctx, inst,
                        &tf_regs[inst], &tf_shift, &tf_mask))
-               return &transform->base;
+               return &dpp->base;
 
        BREAK_TO_DEBUGGER();
-       dm_free(transform);
+       dm_free(dpp);
        return NULL;
 }
 
@@ -518,22 +498,20 @@ static struct output_pixel_processor *dcn10_opp_create(
        return &opp->base;
 }
 
-static struct mpcc *dcn10_mpcc_create(
-       struct dc_context *ctx,
-       int inst)
+static struct mpc *dcn10_mpc_create(struct dc_context *ctx)
 {
-       struct dcn10_mpcc *mpcc10 = dm_alloc(sizeof(struct dcn10_mpcc));
+       struct dcn10_mpc *mpc10 = dm_alloc(sizeof(struct dcn10_mpc));
 
-       if (!mpcc10)
+       if (!mpc10)
                return NULL;
 
-       dcn10_mpcc_construct(mpcc10, ctx,
-                       &mpcc_regs[inst],
-                       &mpcc_shift,
-                       &mpcc_mask,
-                       inst);
+       dcn10_mpc_construct(mpc10, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       4);
 
-       return &mpcc10->base;
+       return &mpc10->base;
 }
 
 static struct timing_generator *dcn10_timing_generator_create(
@@ -621,12 +599,8 @@ static void read_dce_straps(
        struct dc_context *ctx,
        struct resource_straps *straps)
 {
-       /* TODO: Registers are missing */
-       /*REG_GET_2(CC_DC_HDMI_STRAPS,
-                       HDMI_DISABLE, &straps->hdmi_disable,
-                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
-
-       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);*/
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
 }
 
 static struct audio *create_audio(
@@ -716,12 +690,16 @@ static void destruct(struct dcn10_resource_pool *pool)
                }
        }
 
+       if (pool->base.mpc != NULL) {
+               dm_free(TO_DCN10_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
        for (i = 0; i < pool->base.pipe_count; i++) {
                if (pool->base.opps[i] != NULL)
                        pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
 
                if (pool->base.transforms[i] != NULL)
-                       dcn10_transform_destroy(&pool->base.transforms[i]);
+                       dcn10_dpp_destroy(&pool->base.transforms[i]);
 
                if (pool->base.ipps[i] != NULL)
                        pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
@@ -739,11 +717,6 @@ static void destruct(struct dcn10_resource_pool *pool)
                        dm_free(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
                        pool->base.timing_generators[i] = NULL;
                }
-
-               if (pool->base.mpcc[i] != NULL) {
-                       dm_free(TO_DCN10_MPCC(pool->base.mpcc[i]));
-                       pool->base.mpcc[i] = NULL;
-               }
        }
 
        for (i = 0; i < pool->base.stream_enc_count; i++) {
@@ -801,8 +774,8 @@ static void get_pixel_clock_parameters(
        const struct pipe_ctx *pipe_ctx,
        struct pixel_clk_params *pixel_clk_params)
 {
-       const struct core_stream *stream = pipe_ctx->stream;
-       pixel_clk_params->requested_pix_clk = stream->public.timing.pix_clk_khz;
+       const struct dc_stream_state *stream = pipe_ctx->stream;
+       pixel_clk_params->requested_pix_clk = stream->timing.pix_clk_khz;
        pixel_clk_params->encoder_object_id = stream->sink->link->link_enc->id;
        pixel_clk_params->signal_type = pipe_ctx->stream->signal;
        pixel_clk_params->controller_id = pipe_ctx->pipe_idx + 1;
@@ -811,23 +784,23 @@ static void get_pixel_clock_parameters(
                LINK_RATE_REF_FREQ_IN_KHZ;
        pixel_clk_params->flags.ENABLE_SS = 0;
        pixel_clk_params->color_depth =
-               stream->public.timing.display_color_depth;
+               stream->timing.display_color_depth;
        pixel_clk_params->flags.DISPLAY_BLANKED = 1;
-       pixel_clk_params->pixel_encoding = stream->public.timing.pixel_encoding;
+       pixel_clk_params->pixel_encoding = stream->timing.pixel_encoding;
 
-       if (stream->public.timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
+       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
                pixel_clk_params->color_depth = COLOR_DEPTH_888;
 
-       if (stream->public.timing.pixel_encoding == PIXEL_ENCODING_YCBCR420)
+       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420)
                pixel_clk_params->requested_pix_clk  /= 2;
 
 }
 
-static void build_clamping_params(struct core_stream *stream)
+static void build_clamping_params(struct dc_stream_state *stream)
 {
        stream->clamping.clamping_level = CLAMPING_FULL_RANGE;
-       stream->clamping.c_depth = stream->public.timing.display_color_depth;
-       stream->clamping.pixel_encoding = stream->public.timing.pixel_encoding;
+       stream->clamping.c_depth = stream->timing.display_color_depth;
+       stream->clamping.pixel_encoding = stream->timing.pixel_encoding;
 }
 
 static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
@@ -840,7 +813,7 @@ static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
                &pipe_ctx->pix_clk_params,
                &pipe_ctx->pll_settings);
 
-       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->public.timing.pixel_encoding;
+       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->timing.pixel_encoding;
 
        resource_build_bit_depth_reduction_params(pipe_ctx->stream,
                                        &pipe_ctx->stream->bit_depth_params);
@@ -849,7 +822,7 @@ static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
        return DC_OK;
 }
 
-static enum dc_status validate_mapped_resource(
+static enum dc_status build_mapped_resource(
                const struct core_dc *dc,
                struct validate_context *context,
                struct validate_context *old_context)
@@ -858,8 +831,7 @@ static enum dc_status validate_mapped_resource(
        uint8_t i, j;
 
        for (i = 0; i < context->stream_count; i++) {
-               struct core_stream *stream = context->streams[i];
-               struct core_link *link = stream->sink->link;
+               struct dc_stream_state *stream = context->streams[i];
 
                if (old_context && resource_is_stream_unchanged(old_context, stream)) {
                        if (stream != NULL && old_context->streams[i] != NULL) {
@@ -867,7 +839,7 @@ static enum dc_status validate_mapped_resource(
                                resource_build_bit_depth_reduction_params(stream,
                                                &stream->bit_depth_params);
                                stream->clamping.pixel_encoding =
-                                               stream->public.timing.pixel_encoding;
+                                               stream->timing.pixel_encoding;
 
                                resource_build_bit_depth_reduction_params(stream,
                                                                &stream->bit_depth_params);
@@ -884,29 +856,11 @@ static enum dc_status validate_mapped_resource(
                        if (context->res_ctx.pipe_ctx[j].stream != stream)
                                continue;
 
-
-                       if (!pipe_ctx->tg->funcs->validate_timing(
-                                       pipe_ctx->tg, &stream->public.timing))
-                               return DC_FAIL_CONTROLLER_VALIDATE;
-
                        status = build_pipe_hw_param(pipe_ctx);
 
                        if (status != DC_OK)
                                return status;
 
-                       if (!link->link_enc->funcs->validate_output_with_stream(
-                               link->link_enc, pipe_ctx))
-                               return DC_FAIL_ENC_VALIDATE;
-
-                       /* TODO: validate audio ASIC caps, encoder */
-
-                       status = dc_link_validate_mode_timing(
-                               stream, link, &stream->public.timing);
-
-                       if (status != DC_OK)
-                               return status;
-
-
                        /* do not need to validate non root pipes */
                        break;
                }
@@ -929,8 +883,8 @@ enum dc_status dcn10_validate_with_context(
                return result;
 
        for (i = 0; i < set_count; i++) {
-               context->streams[i] = DC_STREAM_TO_CORE(set[i].stream);
-               dc_stream_retain(&context->streams[i]->public);
+               context->streams[i] = set[i].stream;
+               dc_stream_retain(context->streams[i]);
                context->stream_count++;
        }
 
@@ -942,7 +896,7 @@ enum dc_status dcn10_validate_with_context(
        if (result != DC_OK)
                return result;
 
-       result = validate_mapped_resource(dc, context, old_context);
+       result = build_mapped_resource(dc, context, old_context);
        if (result != DC_OK)
                return result;
 
@@ -962,13 +916,13 @@ enum dc_status dcn10_validate_with_context(
 
 enum dc_status dcn10_validate_guaranteed(
                const struct core_dc *dc,
-               const struct dc_stream *dc_stream,
+               struct dc_stream_state *dc_stream,
                struct validate_context *context)
 {
        enum dc_status result = DC_ERROR_UNEXPECTED;
 
-       context->streams[0] = DC_STREAM_TO_CORE(dc_stream);
-       dc_stream_retain(&context->streams[0]->public);
+       context->streams[0] = dc_stream;
+       dc_stream_retain(context->streams[0]);
        context->stream_count++;
 
        result = resource_map_pool_resources(dc, context, NULL);
@@ -977,7 +931,7 @@ enum dc_status dcn10_validate_guaranteed(
                result = resource_map_phy_clock_resources(dc, context, NULL);
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, NULL);
+               result = build_mapped_resource(dc, context, NULL);
 
        if (result == DC_OK) {
                validate_guaranteed_copy_streams(
@@ -993,7 +947,7 @@ enum dc_status dcn10_validate_guaranteed(
 static struct pipe_ctx *dcn10_acquire_idle_pipe_for_layer(
                struct validate_context *context,
                const struct resource_pool *pool,
-               struct core_stream *stream)
+               struct dc_stream_state *stream)
 {
        struct resource_context *res_ctx = &context->res_ctx;
        struct pipe_ctx *head_pipe = resource_get_head_pipe_for_stream(res_ctx, stream);
@@ -1007,12 +961,11 @@ static struct pipe_ctx *dcn10_acquire_idle_pipe_for_layer(
 
        idle_pipe->stream = head_pipe->stream;
        idle_pipe->tg = head_pipe->tg;
+       idle_pipe->opp = head_pipe->opp;
 
-       idle_pipe->mpcc = pool->mpcc[idle_pipe->pipe_idx];
        idle_pipe->mi = pool->mis[idle_pipe->pipe_idx];
        idle_pipe->ipp = pool->ipps[idle_pipe->pipe_idx];
        idle_pipe->xfm = pool->transforms[idle_pipe->pipe_idx];
-       idle_pipe->opp = pool->opps[idle_pipe->pipe_idx];
 
        return idle_pipe;
 }
@@ -1338,10 +1291,7 @@ static bool construct(
        }
 
        if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
-               pool->base.display_clock = dce120_disp_clk_create(ctx,
-                               &disp_clk_regs,
-                               &disp_clk_shift,
-                               &disp_clk_mask);
+               pool->base.display_clock = dce120_disp_clk_create(ctx);
                if (pool->base.display_clock == NULL) {
                        dm_error("DC: failed to create display clock!\n");
                        BREAK_TO_DEBUGGER();
@@ -1372,6 +1322,19 @@ static bool construct(
        dml_init_instance(&dc->dml, DML_PROJECT_RAVEN1);
        dc->dcn_ip = dcn10_ip_defaults;
        dc->dcn_soc = dcn10_soc_defaults;
+
+       dc->dcn_soc.number_of_channels = dc->ctx->asic_id.vram_width / ddr4_dram_width;
+       ASSERT(dc->dcn_soc.number_of_channels < 3);
+       if (dc->dcn_soc.number_of_channels == 0)/*old sbios bug*/
+               dc->dcn_soc.number_of_channels = 2;
+
+       if (dc->dcn_soc.number_of_channels == 1) {
+               dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 = 19.2f;
+               dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8 = 17.066f;
+               dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72 = 14.933f;
+               dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65 = 12.8f;
+       }
+
        if (!dc->public.debug.disable_pplib_clock_request)
                dcn_bw_update_from_pplib(dc);
        dcn_bw_sync_calcs_and_dml(dc);
@@ -1388,7 +1351,7 @@ static bool construct(
        #endif
        }
 
-       /* mem input -> ipp -> transform -> opp -> TG */
+       /* mem input -> ipp -> dpp -> opp -> TG */
        for (i = 0; i < pool->base.pipe_count; i++) {
                pool->base.mis[i] = dcn10_mem_input_create(ctx, i);
                if (pool->base.mis[i] == NULL) {
@@ -1406,12 +1369,12 @@ static bool construct(
                        goto ipp_create_fail;
                }
 
-               pool->base.transforms[i] = dcn10_transform_create(ctx, i);
+               pool->base.transforms[i] = dcn10_dpp_create(ctx, i);
                if (pool->base.transforms[i] == NULL) {
                        BREAK_TO_DEBUGGER();
                        dm_error(
-                               "DC: failed to create transform!\n");
-                       goto transform_create_fail;
+                               "DC: failed to create dpp!\n");
+                       goto dpp_create_fail;
                }
 
                pool->base.opps[i] = dcn10_opp_create(ctx, i);
@@ -1429,12 +1392,12 @@ static bool construct(
                        dm_error("DC: failed to create tg!\n");
                        goto otg_create_fail;
                }
-               pool->base.mpcc[i] = dcn10_mpcc_create(ctx, i);
-               if (pool->base.mpcc[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create mpcc!\n");
-                       goto mpcc_create_fail;
-               }
+       }
+       pool->base.mpc = dcn10_mpc_create(ctx);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto mpc_create_fail;
        }
 
        if (!resource_construct(num_virtual_links, dc, &pool->base,
@@ -1443,17 +1406,17 @@ static bool construct(
                        goto res_create_fail;
 
        dcn10_hw_sequencer_construct(dc);
-       dc->public.caps.max_surfaces =  pool->base.pipe_count;
+       dc->public.caps.max_planes =  pool->base.pipe_count;
 
        dc->public.cap_funcs = cap_funcs;
 
        return true;
 
 disp_clk_create_fail:
-mpcc_create_fail:
+mpc_create_fail:
 otg_create_fail:
 opp_create_fail:
-transform_create_fail:
+dpp_create_fail:
 ipp_create_fail:
 mi_create_fail:
 irqs_create_fail: