Merge tag 'drm-misc-next-2023-09-11-1' of git://anongit.freedesktop.org/drm/drm-misc...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / msm / disp / dpu1 / dpu_kms.c
index a16ae7db6245cca23159a1e955531c8cfadc4563..82381d12414d82a27b12eda72ecce4e4924abf96 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "msm_drv.h"
 #include "msm_mmu.h"
+#include "msm_mdss.h"
 #include "msm_gem.h"
 #include "disp/msm_disp_snapshot.h"
 
@@ -544,8 +545,6 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
 
                info.is_cmd_mode = msm_dsi_is_cmd_mode(priv->dsi[i]);
 
-               info.dsc = msm_dsi_get_dsc_config(priv->dsi[i]);
-
                encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI, &info);
                if (IS_ERR(encoder)) {
                        DPU_ERROR("encoder init failed for dsi display\n");
@@ -794,7 +793,7 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
                        ret = PTR_ERR(crtc);
                        return ret;
                }
-               priv->crtcs[priv->num_crtcs++] = crtc;
+               priv->num_crtcs++;
        }
 
        /* All CRTCs are compatible with all encoders */
@@ -890,6 +889,7 @@ static void dpu_kms_mdp_snapshot(struct msm_disp_state *disp_state, struct msm_k
        int i;
        struct dpu_kms *dpu_kms;
        const struct dpu_mdss_cfg *cat;
+       void __iomem *base;
 
        dpu_kms = to_dpu_kms(kms);
 
@@ -900,37 +900,67 @@ static void dpu_kms_mdp_snapshot(struct msm_disp_state *disp_state, struct msm_k
        /* dump CTL sub-blocks HW regs info */
        for (i = 0; i < cat->ctl_count; i++)
                msm_disp_snapshot_add_block(disp_state, cat->ctl[i].len,
-                               dpu_kms->mmio + cat->ctl[i].base, "ctl_%d", i);
+                               dpu_kms->mmio + cat->ctl[i].base, cat->ctl[i].name);
 
        /* dump DSPP sub-blocks HW regs info */
-       for (i = 0; i < cat->dspp_count; i++)
-               msm_disp_snapshot_add_block(disp_state, cat->dspp[i].len,
-                               dpu_kms->mmio + cat->dspp[i].base, "dspp_%d", i);
+       for (i = 0; i < cat->dspp_count; i++) {
+               base = dpu_kms->mmio + cat->dspp[i].base;
+               msm_disp_snapshot_add_block(disp_state, cat->dspp[i].len, base, cat->dspp[i].name);
+
+               if (cat->dspp[i].sblk && cat->dspp[i].sblk->pcc.len > 0)
+                       msm_disp_snapshot_add_block(disp_state, cat->dspp[i].sblk->pcc.len,
+                                                   base + cat->dspp[i].sblk->pcc.base, "%s_%s",
+                                                   cat->dspp[i].name,
+                                                   cat->dspp[i].sblk->pcc.name);
+       }
 
        /* dump INTF sub-blocks HW regs info */
        for (i = 0; i < cat->intf_count; i++)
                msm_disp_snapshot_add_block(disp_state, cat->intf[i].len,
-                               dpu_kms->mmio + cat->intf[i].base, "intf_%d", i);
+                               dpu_kms->mmio + cat->intf[i].base, cat->intf[i].name);
 
        /* dump PP sub-blocks HW regs info */
-       for (i = 0; i < cat->pingpong_count; i++)
-               msm_disp_snapshot_add_block(disp_state, cat->pingpong[i].len,
-                               dpu_kms->mmio + cat->pingpong[i].base, "pingpong_%d", i);
+       for (i = 0; i < cat->pingpong_count; i++) {
+               base = dpu_kms->mmio + cat->pingpong[i].base;
+               msm_disp_snapshot_add_block(disp_state, cat->pingpong[i].len, base,
+                                           cat->pingpong[i].name);
+
+               /* TE2 sub-block has length of 0, so will not print it */
+
+               if (cat->pingpong[i].sblk && cat->pingpong[i].sblk->dither.len > 0)
+                       msm_disp_snapshot_add_block(disp_state, cat->pingpong[i].sblk->dither.len,
+                                                   base + cat->pingpong[i].sblk->dither.base,
+                                                   "%s_%s", cat->pingpong[i].name,
+                                                   cat->pingpong[i].sblk->dither.name);
+       }
 
        /* dump SSPP sub-blocks HW regs info */
-       for (i = 0; i < cat->sspp_count; i++)
-               msm_disp_snapshot_add_block(disp_state, cat->sspp[i].len,
-                               dpu_kms->mmio + cat->sspp[i].base, "sspp_%d", i);
+       for (i = 0; i < cat->sspp_count; i++) {
+               base = dpu_kms->mmio + cat->sspp[i].base;
+               msm_disp_snapshot_add_block(disp_state, cat->sspp[i].len, base, cat->sspp[i].name);
+
+               if (cat->sspp[i].sblk && cat->sspp[i].sblk->scaler_blk.len > 0)
+                       msm_disp_snapshot_add_block(disp_state, cat->sspp[i].sblk->scaler_blk.len,
+                                                   base + cat->sspp[i].sblk->scaler_blk.base,
+                                                   "%s_%s", cat->sspp[i].name,
+                                                   cat->sspp[i].sblk->scaler_blk.name);
+
+               if (cat->sspp[i].sblk && cat->sspp[i].sblk->csc_blk.len > 0)
+                       msm_disp_snapshot_add_block(disp_state, cat->sspp[i].sblk->csc_blk.len,
+                                                   base + cat->sspp[i].sblk->csc_blk.base,
+                                                   "%s_%s", cat->sspp[i].name,
+                                                   cat->sspp[i].sblk->csc_blk.name);
+       }
 
        /* dump LM sub-blocks HW regs info */
        for (i = 0; i < cat->mixer_count; i++)
                msm_disp_snapshot_add_block(disp_state, cat->mixer[i].len,
-                               dpu_kms->mmio + cat->mixer[i].base, "lm_%d", i);
+                               dpu_kms->mmio + cat->mixer[i].base, cat->mixer[i].name);
 
        /* dump WB sub-blocks HW regs info */
        for (i = 0; i < cat->wb_count; i++)
                msm_disp_snapshot_add_block(disp_state, cat->wb[i].len,
-                               dpu_kms->mmio + cat->wb[i].base, "wb_%d", i);
+                               dpu_kms->mmio + cat->wb[i].base, cat->wb[i].name);
 
        if (cat->mdp[0].features & BIT(DPU_MDP_PERIPH_0_REMOVED)) {
                msm_disp_snapshot_add_block(disp_state, MDP_PERIPH_TOP0,
@@ -943,9 +973,20 @@ static void dpu_kms_mdp_snapshot(struct msm_disp_state *disp_state, struct msm_k
        }
 
        /* dump DSC sub-blocks HW regs info */
-       for (i = 0; i < cat->dsc_count; i++)
-               msm_disp_snapshot_add_block(disp_state, cat->dsc[i].len,
-                               dpu_kms->mmio + cat->dsc[i].base, "dsc_%d", i);
+       for (i = 0; i < cat->dsc_count; i++) {
+               base = dpu_kms->mmio + cat->dsc[i].base;
+               msm_disp_snapshot_add_block(disp_state, cat->dsc[i].len, base, cat->dsc[i].name);
+
+               if (cat->dsc[i].features & BIT(DPU_DSC_HW_REV_1_2)) {
+                       struct dpu_dsc_blk enc = cat->dsc[i].sblk->enc;
+                       struct dpu_dsc_blk ctl = cat->dsc[i].sblk->ctl;
+
+                       msm_disp_snapshot_add_block(disp_state, enc.len, base + enc.base, "%s_%s",
+                                                   cat->dsc[i].name, enc.name);
+                       msm_disp_snapshot_add_block(disp_state, ctl.len, base + ctl.base, "%s_%s",
+                                                   cat->dsc[i].name, ctl.name);
+               }
+       }
 
        pm_runtime_put_sync(&dpu_kms->pdev->dev);
 }
@@ -1011,11 +1052,14 @@ unsigned long dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name)
        return clk_get_rate(clk);
 }
 
+#define        DPU_PERF_DEFAULT_MAX_CORE_CLK_RATE      412500000
+
 static int dpu_kms_hw_init(struct msm_kms *kms)
 {
        struct dpu_kms *dpu_kms;
        struct drm_device *dev;
        int i, rc = -EINVAL;
+       unsigned long max_core_clk_rate;
        u32 core_rev;
 
        if (!kms) {
@@ -1084,7 +1128,20 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
                goto power_error;
        }
 
-       rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
+       dpu_kms->mdss = msm_mdss_get_mdss_data(dpu_kms->pdev->dev.parent);
+       if (IS_ERR(dpu_kms->mdss)) {
+               rc = PTR_ERR(dpu_kms->mdss);
+               DPU_ERROR("failed to get MDSS data: %d\n", rc);
+               goto power_error;
+       }
+
+       if (!dpu_kms->mdss) {
+               rc = -EINVAL;
+               DPU_ERROR("NULL MDSS data\n");
+               goto power_error;
+       }
+
+       rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mdss, dpu_kms->mmio);
        if (rc) {
                DPU_ERROR("rm init failed: %d\n", rc);
                goto power_error;
@@ -1092,7 +1149,8 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
 
        dpu_kms->rm_init = true;
 
-       dpu_kms->hw_mdp = dpu_hw_mdptop_init(MDP_TOP, dpu_kms->mmio,
+       dpu_kms->hw_mdp = dpu_hw_mdptop_init(dpu_kms->catalog->mdp,
+                                            dpu_kms->mmio,
                                             dpu_kms->catalog);
        if (IS_ERR(dpu_kms->hw_mdp)) {
                rc = PTR_ERR(dpu_kms->hw_mdp);
@@ -1115,8 +1173,14 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
                dpu_kms->hw_vbif[vbif->id] = hw;
        }
 
-       rc = dpu_core_perf_init(&dpu_kms->perf, dev, dpu_kms->catalog,
-                       msm_clk_bulk_get_clock(dpu_kms->clocks, dpu_kms->num_clocks, "core"));
+       /* TODO: use the same max_freq as in dpu_kms_hw_init */
+       max_core_clk_rate = dpu_kms_get_clk_rate(dpu_kms, "core");
+       if (!max_core_clk_rate) {
+               DPU_DEBUG("max core clk rate not determined, using default\n");
+               max_core_clk_rate = DPU_PERF_DEFAULT_MAX_CORE_CLK_RATE;
+       }
+
+       rc = dpu_core_perf_init(&dpu_kms->perf, dpu_kms->catalog->perf, max_core_clk_rate);
        if (rc) {
                DPU_ERROR("failed to init perf %d\n", rc);
                goto perf_err;
@@ -1162,7 +1226,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
        return 0;
 
 drm_obj_init_err:
-       dpu_core_perf_destroy(&dpu_kms->perf);
 hw_intr_init_err:
 perf_err:
 power_error:
@@ -1303,6 +1366,7 @@ static const struct of_device_id dpu_dt_match[] = {
        { .compatible = "qcom,sc8180x-dpu", .data = &dpu_sc8180x_cfg, },
        { .compatible = "qcom,sc8280xp-dpu", .data = &dpu_sc8280xp_cfg, },
        { .compatible = "qcom,sm6115-dpu", .data = &dpu_sm6115_cfg, },
+       { .compatible = "qcom,sm6125-dpu", .data = &dpu_sm6125_cfg, },
        { .compatible = "qcom,sm6350-dpu", .data = &dpu_sm6350_cfg, },
        { .compatible = "qcom,sm6375-dpu", .data = &dpu_sm6375_cfg, },
        { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, },