[PATCH 1/2] drm/msm/dpu: Add MSM8996 support
Icenowy Zheng
uwu at icenowy.me
Sun Aug 18 07:16:52 UTC 2024
在 2024-06-28星期五的 16:39 +0200,Barnabás Czémán写道:
> From: Konrad Dybcio <konrad.dybcio at linaro.org>
>
> Add support for MSM8996, which - fun fact - was the SoC that this
> driver
> (or rather SDE, its downstream origin) was meant for and first tested
> on.
>
> It has some hardware that differs from the modern SoCs, so not a lot
> of
> current structs could have been reused. It's also seemingly the only
> SoC
> supported by DPU that uses RGB pipes.
>
> Note, by default this platform is still handled by the MDP5 driver
> unless the `msm.prefer_mdp5=false' parameter is provided.
For curiosity, will this driver makes DSC possible on MSM8996?
I think the Google Pixel device uses a panel that needs DSC, which
makes mainlining it currently impossible.
>
> Signed-off-by: Konrad Dybcio <konrad.dybcio at somainline.org>
> Signed-off-by: Konrad Dybcio <konrad.dybcio at linaro.org>
> [DB: rebased on top of sblk changes, add dpu_rgb_sblk]
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
> [Removed intr_start from CTLs config]
> Signed-off-by: Barnabás Czémán <barnabas.czeman at mainlining.org>
> ---
> .../drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h | 348
> +++++++++++++++++++++
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 94 ++++++
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 1 +
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 +
> drivers/gpu/drm/msm/msm_drv.c | 1 +
> 5 files changed, 445 insertions(+)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h
> b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h
> new file mode 100644
> index 000000000000..29d0cfacf7a9
> --- /dev/null
> +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h
> @@ -0,0 +1,348 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (c) 2023, Linaro Limited
> + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights
> reserved.
> + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights
> reserved.
> + */
> +
> +#ifndef _DPU_1_7_MSM8996_H
> +#define _DPU_1_7_MSM8996_H
> +
> +static const struct dpu_caps msm8996_dpu_caps = {
> + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
> + .max_mixer_blendstages = 0x7,
> + .has_src_split = true,
> + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
> + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
> + .max_hdeci_exp = MAX_HORZ_DECIMATION,
> + .max_vdeci_exp = MAX_VERT_DECIMATION,
> +};
> +
> +static const struct dpu_mdp_cfg msm8996_mdp[] = {
> + {
> + .name = "top_0",
> + .base = 0x0, .len = 0x454,
> + .features = BIT(DPU_MDP_VSYNC_SEL),
> + .clk_ctrls = {
> + [DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac,
> .bit_off = 0 },
> + [DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4,
> .bit_off = 0 },
> + [DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc,
> .bit_off = 0 },
> + [DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4,
> .bit_off = 0 },
> + [DPU_CLK_CTRL_RGB0] = { .reg_off = 0x2ac,
> .bit_off = 4 },
> + [DPU_CLK_CTRL_RGB1] = { .reg_off = 0x2b4,
> .bit_off = 4 },
> + [DPU_CLK_CTRL_RGB2] = { .reg_off = 0x2bc,
> .bit_off = 4 },
> + [DPU_CLK_CTRL_RGB3] = { .reg_off = 0x2c4,
> .bit_off = 4 },
> + [DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac,
> .bit_off = 8 },
> + [DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4,
> .bit_off = 8 },
> + [DPU_CLK_CTRL_CURSOR0] = { .reg_off = 0x3a8,
> .bit_off = 16 },
> + [DPU_CLK_CTRL_CURSOR1] = { .reg_off = 0x3b0,
> .bit_off = 16 },
> + },
> + },
> +};
> +
> +static const struct dpu_ctl_cfg msm8996_ctl[] = {
> + {
> + .name = "ctl_0", .id = CTL_0,
> + .base = 0x1000, .len = 0x64,
> + }, {
> + .name = "ctl_1", .id = CTL_1,
> + .base = 0x1200, .len = 0x64,
> + }, {
> + .name = "ctl_2", .id = CTL_2,
> + .base = 0x1400, .len = 0x64,
> + }, {
> + .name = "ctl_3", .id = CTL_3,
> + .base = 0x1600, .len = 0x64,
> + }, {
> + .name = "ctl_4", .id = CTL_4,
> + .base = 0x1800, .len = 0x64,
> + },
> +};
> +
> +static const struct dpu_sspp_cfg msm8996_sspp[] = {
> + {
> + .name = "sspp_0", .id = SSPP_VIG0,
> + .base = 0x4000, .len = 0x150,
> + .features = VIG_MSM8996_MASK,
> + .sblk = &dpu_vig_sblk_qseed2,
> + .xin_id = 0,
> + .type = SSPP_TYPE_VIG,
> + .clk_ctrl = DPU_CLK_CTRL_VIG0,
> + }, {
> + .name = "sspp_1", .id = SSPP_VIG1,
> + .base = 0x6000, .len = 0x150,
> + .features = VIG_MSM8996_MASK,
> + .sblk = &dpu_vig_sblk_qseed2,
> + .xin_id = 4,
> + .type = SSPP_TYPE_VIG,
> + .clk_ctrl = DPU_CLK_CTRL_VIG1,
> + }, {
> + .name = "sspp_2", .id = SSPP_VIG2,
> + .base = 0x8000, .len = 0x150,
> + .features = VIG_MSM8996_MASK,
> + .sblk = &dpu_vig_sblk_qseed2,
> + .xin_id = 8,
> + .type = SSPP_TYPE_VIG,
> + .clk_ctrl = DPU_CLK_CTRL_VIG2,
> + }, {
> + .name = "sspp_3", .id = SSPP_VIG3,
> + .base = 0xa000, .len = 0x150,
> + .features = VIG_MSM8996_MASK,
> + .sblk = &dpu_vig_sblk_qseed2,
> + .xin_id = 12,
> + .type = SSPP_TYPE_VIG,
> + .clk_ctrl = DPU_CLK_CTRL_VIG3,
> + }, {
> + .name = "sspp_4", .id = SSPP_RGB0,
> + .base = 0x14000, .len = 0x150,
> + .features = RGB_MSM8996_MASK,
> + .sblk = &dpu_rgb_sblk,
> + .xin_id = 1,
> + .type = SSPP_TYPE_RGB,
> + .clk_ctrl = DPU_CLK_CTRL_RGB0,
> + }, {
> + .name = "sspp_5", .id = SSPP_RGB1,
> + .base = 0x16000, .len = 0x150,
> + .features = RGB_MSM8996_MASK,
> + .sblk = &dpu_rgb_sblk,
> + .xin_id = 5,
> + .type = SSPP_TYPE_RGB,
> + .clk_ctrl = DPU_CLK_CTRL_RGB1,
> + }, {
> + .name = "sspp_6", .id = SSPP_RGB2,
> + .base = 0x18000, .len = 0x150,
> + .features = RGB_MSM8996_MASK,
> + .sblk = &dpu_rgb_sblk,
> + .xin_id = 9,
> + .type = SSPP_TYPE_RGB,
> + .clk_ctrl = DPU_CLK_CTRL_RGB2,
> + }, {
> + .name = "sspp_7", .id = SSPP_RGB3,
> + .base = 0x1a000, .len = 0x150,
> + .features = RGB_MSM8996_MASK,
> + .sblk = &dpu_rgb_sblk,
> + .xin_id = 13,
> + .type = SSPP_TYPE_RGB,
> + .clk_ctrl = DPU_CLK_CTRL_RGB3,
> + }, {
> + .name = "sspp_8", .id = SSPP_DMA0,
> + .base = 0x24000, .len = 0x150,
> + .features = DMA_MSM8996_MASK,
> + .sblk = &dpu_dma_sblk,
> + .xin_id = 2,
> + .type = SSPP_TYPE_DMA,
> + .clk_ctrl = DPU_CLK_CTRL_DMA0,
> + }, {
> + .name = "sspp_9", .id = SSPP_DMA1,
> + .base = 0x26000, .len = 0x150,
> + .features = DMA_MSM8996_MASK,
> + .sblk = &dpu_dma_sblk,
> + .xin_id = 10,
> + .type = SSPP_TYPE_DMA,
> + .clk_ctrl = DPU_CLK_CTRL_DMA1,
> + },
> +};
> +
> +static const struct dpu_lm_cfg msm8996_lm[] = {
> + {
> + .name = "lm_0", .id = LM_0,
> + .base = 0x44000, .len = 0x320,
> + .features = MIXER_MSM8998_MASK,
> + .sblk = &msm8998_lm_sblk,
> + .lm_pair = LM_1,
> + .pingpong = PINGPONG_0,
> + .dspp = DSPP_0,
> + }, {
> + .name = "lm_1", .id = LM_1,
> + .base = 0x45000, .len = 0x320,
> + .features = MIXER_MSM8998_MASK,
> + .sblk = &msm8998_lm_sblk,
> + .lm_pair = LM_0,
> + .pingpong = PINGPONG_1,
> + .dspp = DSPP_1,
> + }, {
> + .name = "lm_2", .id = LM_2,
> + .base = 0x46000, .len = 0x320,
> + .features = MIXER_MSM8998_MASK,
> + .sblk = &msm8998_lm_sblk,
> + .lm_pair = LM_5,
> + .pingpong = PINGPONG_2,
> + }, {
> + .name = "lm_3", .id = LM_3,
> + .base = 0x47000, .len = 0x320,
> + .features = MIXER_MSM8998_MASK,
> + .sblk = &msm8998_lm_sblk,
> + }, {
> + .name = "lm_4", .id = LM_4,
> + .base = 0x48000, .len = 0x320,
> + .features = MIXER_MSM8998_MASK,
> + .sblk = &msm8998_lm_sblk,
> + }, {
> + .name = "lm_5", .id = LM_5,
> + .base = 0x49000, .len = 0x320,
> + .features = MIXER_MSM8998_MASK,
> + .sblk = &msm8998_lm_sblk,
> + .lm_pair = LM_2,
> + .pingpong = PINGPONG_3,
> + },
> +};
> +
> +static const struct dpu_pingpong_cfg msm8996_pp[] = {
> + {
> + .name = "pingpong_0", .id = PINGPONG_0,
> + .base = 0x70000, .len = 0xd4,
> + .features = PINGPONG_MSM8996_TE2_MASK,
> + .sblk = &msm8996_pp_sblk_te,
> + .intr_done = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
> + .intr_rdptr = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12),
> + }, {
> + .name = "pingpong_1", .id = PINGPONG_1,
> + .base = 0x70800, .len = 0xd4,
> + .features = PINGPONG_MSM8996_TE2_MASK,
> + .sblk = &msm8996_pp_sblk_te,
> + .intr_done = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
> + .intr_rdptr = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13),
> + }, {
> + .name = "pingpong_2", .id = PINGPONG_2,
> + .base = 0x71000, .len = 0xd4,
> + .features = PINGPONG_MSM8996_MASK,
> + .sblk = &msm8996_pp_sblk,
> + .intr_done = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
> + .intr_rdptr = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14),
> + }, {
> + .name = "pingpong_3", .id = PINGPONG_3,
> + .base = 0x71800, .len = 0xd4,
> + .features = PINGPONG_MSM8996_MASK,
> + .sblk = &msm8996_pp_sblk,
> + .intr_done = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
> + .intr_rdptr = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15),
> + },
> +};
> +
> +static const struct dpu_dsc_cfg msm8996_dsc[] = {
> + {
> + .name = "dsc_0", .id = DSC_0,
> + .base = 0x80000, .len = 0x140,
> + }, {
> + .name = "dsc_1", .id = DSC_1,
> + .base = 0x80400, .len = 0x140,
> + },
> +};
> +
> +static const struct dpu_dspp_cfg msm8996_dspp[] = {
> + {
> + .name = "dspp_0", .id = DSPP_0,
> + .base = 0x54000, .len = 0x1800,
> + .features = DSPP_SC7180_MASK,
> + .sblk = &msm8998_dspp_sblk,
> + }, {
> + .name = "dspp_1", .id = DSPP_1,
> + .base = 0x56000, .len = 0x1800,
> + .features = DSPP_SC7180_MASK,
> + .sblk = &msm8998_dspp_sblk,
> + },
> +};
> +
> +static const struct dpu_intf_cfg msm8996_intf[] = {
> + {
> + .name = "intf_0", .id = INTF_0,
> + .base = 0x6a000, .len = 0x268,
> + .type = INTF_NONE,
> + .prog_fetch_lines_worst_case = 25,
> + .intr_underrun = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24),
> + .intr_vsync = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25),
> + .intr_tear_rd_ptr = -1,
> + }, {
> + .name = "intf_1", .id = INTF_1,
> + .base = 0x6a800, .len = 0x268,
> + .type = INTF_DSI,
> + .controller_id = MSM_DSI_CONTROLLER_0,
> + .prog_fetch_lines_worst_case = 25,
> + .intr_underrun = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26),
> + .intr_vsync = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27),
> + .intr_tear_rd_ptr = -1,
> + }, {
> + .name = "intf_2", .id = INTF_2,
> + .base = 0x6b000, .len = 0x268,
> + .type = INTF_DSI,
> + .controller_id = MSM_DSI_CONTROLLER_1,
> + .prog_fetch_lines_worst_case = 25,
> + .intr_underrun = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 28),
> + .intr_vsync = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 29),
> + .intr_tear_rd_ptr = -1,
> + }, {
> + .name = "intf_3", .id = INTF_3,
> + .base = 0x6b800, .len = 0x268,
> + .type = INTF_HDMI,
> + .prog_fetch_lines_worst_case = 25,
> + .intr_underrun = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 30),
> + .intr_vsync = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 31),
> + .intr_tear_rd_ptr = -1,
> + },
> +};
> +
> +static const struct dpu_perf_cfg msm8996_perf_data = {
> + .max_bw_low = 9600000,
> + .max_bw_high = 9600000,
> + .min_core_ib = 2400000,
> + .min_llcc_ib = 0, /* No LLCC on this SoC */
> + .min_dram_ib = 800000,
> + .undersized_prefill_lines = 2,
> + .xtra_prefill_lines = 2,
> + .dest_scale_prefill_lines = 3,
> + .macrotile_prefill_lines = 4,
> + .yuv_nv12_prefill_lines = 8,
> + .linear_prefill_lines = 1,
> + .downscaling_prefill_lines = 1,
> + .amortizable_threshold = 25,
> + .min_prefill_lines = 21,
> + .danger_lut_tbl = {0xf, 0xffff, 0x0},
> + .safe_lut_tbl = {0xfffc, 0xff00, 0xffff},
> + .qos_lut_tbl = {
> + {.nentry = ARRAY_SIZE(msm8998_qos_linear),
> + .entries = msm8998_qos_linear
> + },
> + {.nentry = ARRAY_SIZE(msm8998_qos_macrotile),
> + .entries = msm8998_qos_macrotile
> + },
> + {.nentry = ARRAY_SIZE(msm8998_qos_nrt),
> + .entries = msm8998_qos_nrt
> + },
> + },
> + .cdp_cfg = {
> + {.rd_enable = 1, .wr_enable = 1},
> + {.rd_enable = 1, .wr_enable = 0}
> + },
> + .clk_inefficiency_factor = 105,
> + .bw_inefficiency_factor = 120,
> +};
> +
> +static const struct dpu_mdss_version msm8996_mdss_ver = {
> + .core_major_ver = 1,
> + .core_minor_ver = 7,
> +};
> +
> +const struct dpu_mdss_cfg dpu_msm8996_cfg = {
> + .mdss_ver = &msm8996_mdss_ver,
> + .caps = &msm8996_dpu_caps,
> + .mdp = msm8996_mdp,
> + .ctl_count = ARRAY_SIZE(msm8996_ctl),
> + .ctl = msm8996_ctl,
> + .sspp_count = ARRAY_SIZE(msm8996_sspp),
> + .sspp = msm8996_sspp,
> + .mixer_count = ARRAY_SIZE(msm8996_lm),
> + .mixer = msm8996_lm,
> + .dspp_count = ARRAY_SIZE(msm8996_dspp),
> + .dspp = msm8996_dspp,
> + .pingpong_count = ARRAY_SIZE(msm8996_pp),
> + .pingpong = msm8996_pp,
> + .dsc_count = ARRAY_SIZE(msm8996_dsc),
> + .dsc = msm8996_dsc,
> + .intf_count = ARRAY_SIZE(msm8996_intf),
> + .intf = msm8996_intf,
> + .vbif_count = ARRAY_SIZE(msm8996_vbif),
> + .vbif = msm8996_vbif,
> + .perf = &msm8996_perf_data,
> +};
> +
> +#endif
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
> index fc178ec73907..da7b75e09251 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
> @@ -21,6 +21,11 @@
> (VIG_BASE_MASK | \
> BIT(DPU_SSPP_CSC_10BIT))
>
> +#define VIG_MSM8996_MASK \
> + (BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_CDP) |\
> + BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_SCALER_QSEED2) |\
> + BIT(DPU_SSPP_CSC))
> +
> #define VIG_MSM8998_MASK \
> (VIG_MASK | BIT(DPU_SSPP_SCALER_QSEED3_COMPATIBLE))
>
> @@ -32,6 +37,9 @@
>
> #define VIG_QCM2290_MASK (VIG_BASE_MASK | BIT(DPU_SSPP_QOS_8LVL))
>
> +#define DMA_MSM8996_MASK \
> + (BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_TS_PREFILL) |
> BIT(DPU_SSPP_CDP))
> +
> #define DMA_MSM8998_MASK \
> (BIT(DPU_SSPP_QOS) |\
> BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
> @@ -57,9 +65,16 @@
> #define DMA_CURSOR_SDM845_MASK_SDMA \
> (DMA_CURSOR_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
>
> +#define DMA_CURSOR_MSM8996_MASK \
> + (DMA_MSM8996_MASK | BIT(DPU_SSPP_CURSOR))
> +
> #define DMA_CURSOR_MSM8998_MASK \
> (DMA_MSM8998_MASK | BIT(DPU_SSPP_CURSOR))
>
> +#define RGB_MSM8996_MASK \
> + (BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_CDP) |\
> + BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_SCALER_RGB))
> +
> #define MIXER_MSM8998_MASK \
> (BIT(DPU_MIXER_SOURCESPLIT))
>
> @@ -69,6 +84,12 @@
> #define MIXER_QCM2290_MASK \
> (BIT(DPU_DIM_LAYER) | BIT(DPU_MIXER_COMBINED_ALPHA))
>
> +#define PINGPONG_MSM8996_MASK \
> + (BIT(DPU_PINGPONG_DSC))
> +
> +#define PINGPONG_MSM8996_TE2_MASK \
> + (PINGPONG_MSM8996_MASK | BIT(DPU_PINGPONG_TE2))
> +
> #define PINGPONG_SDM845_MASK \
> (BIT(DPU_PINGPONG_DITHER) | BIT(DPU_PINGPONG_DSC))
>
> @@ -314,6 +335,35 @@ static const u32 wb2_formats_rgb_yuv[] = {
> .virt_num_formats = ARRAY_SIZE(plane_formats), \
> }
>
> +/* qseed2 is not supported, so disabled scaling */
> +#define _VIG_SBLK_QSEED2() \
> + { \
> + .maxdwnscale = SSPP_UNITY_SCALE, \
> + .maxupscale = SSPP_UNITY_SCALE, \
> + .scaler_blk = {.name = "scaler", \
> + /* no version for qseed2 */ \
> + .base = 0x200, .len = 0xa0,}, \
> + .csc_blk = {.name = "csc", \
> + .base = 0x320, .len = 0x100,}, \
> + .format_list = plane_formats_yuv, \
> + .num_formats = ARRAY_SIZE(plane_formats_yuv), \
> + .virt_format_list = plane_formats, \
> + .virt_num_formats = ARRAY_SIZE(plane_formats), \
> + .rotation_cfg = NULL, \
> + }
> +
> +#define _RGB_SBLK() \
> + { \
> + .maxdwnscale = SSPP_UNITY_SCALE, \
> + .maxupscale = SSPP_UNITY_SCALE, \
> + .scaler_blk = {.name = "scaler", \
> + .base = 0x200, .len = 0x28,}, \
> + .format_list = plane_formats, \
> + .num_formats = ARRAY_SIZE(plane_formats), \
> + .virt_format_list = plane_formats, \
> + .virt_num_formats = ARRAY_SIZE(plane_formats), \
> + }
> +
> #define _DMA_SBLK() \
> { \
> .maxdwnscale = SSPP_UNITY_SCALE, \
> @@ -330,6 +380,9 @@ static const struct dpu_rotation_cfg
> dpu_rot_sc7280_cfg_v2 = {
> .rot_format_list = rotation_v2_formats,
> };
>
> +static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed2 =
> + _VIG_SBLK_QSEED2();
> +
> static const struct dpu_sspp_sub_blks dpu_vig_sblk_noscale =
> _VIG_SBLK_NOSCALE();
>
> @@ -361,6 +414,8 @@ static const struct dpu_sspp_sub_blks
> dpu_vig_sblk_qseed3_3_2 =
> static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_3_3 =
> _VIG_SBLK(SSPP_SCALER_VER(3, 3));
>
> +static const struct dpu_sspp_sub_blks dpu_rgb_sblk = _RGB_SBLK();
> +
> static const struct dpu_sspp_sub_blks dpu_dma_sblk = _DMA_SBLK();
>
> /*************************************************************
> @@ -425,6 +480,15 @@ static const struct dpu_dspp_sub_blks
> sdm845_dspp_sblk = {
> /*************************************************************
> * PINGPONG sub blocks config
> *************************************************************/
> +static const struct dpu_pingpong_sub_blks msm8996_pp_sblk_te = {
> + .te2 = {.name = "te2", .base = 0x2000, .len = 0x0,
> + .version = 0x1},
> +};
> +
> +static const struct dpu_pingpong_sub_blks msm8996_pp_sblk = {
> + /* No dither block */
> +};
> +
> static const struct dpu_pingpong_sub_blks sdm845_pp_sblk_te = {
> .te2 = {.name = "te2", .base = 0x2000, .len = 0x0,
> .version = 0x1},
> @@ -490,6 +554,34 @@ static const struct dpu_vbif_dynamic_ot_cfg
> msm8998_ot_rdwr_cfg[] = {
> },
> };
>
> +static const struct dpu_vbif_cfg msm8996_vbif[] = {
> + {
> + .name = "vbif_rt", .id = VBIF_RT,
> + .base = 0, .len = 0x1040,
> + .default_ot_rd_limit = 32,
> + .default_ot_wr_limit = 16,
> + .features = BIT(DPU_VBIF_QOS_REMAP) |
> BIT(DPU_VBIF_QOS_OTLIM),
> + .xin_halt_timeout = 0x4000,
> + .qos_rp_remap_size = 0x20,
> + .dynamic_ot_rd_tbl = {
> + .count = ARRAY_SIZE(msm8998_ot_rdwr_cfg),
> + .cfg = msm8998_ot_rdwr_cfg,
> + },
> + .dynamic_ot_wr_tbl = {
> + .count = ARRAY_SIZE(msm8998_ot_rdwr_cfg),
> + .cfg = msm8998_ot_rdwr_cfg,
> + },
> + .qos_rt_tbl = {
> + .npriority_lvl = ARRAY_SIZE(msm8998_rt_pri_lvl),
> + .priority_lvl = msm8998_rt_pri_lvl,
> + },
> + .qos_nrt_tbl = {
> + .npriority_lvl = ARRAY_SIZE(msm8998_nrt_pri_lvl),
> + .priority_lvl = msm8998_nrt_pri_lvl,
> + },
> + },
> +};
> +
> static const struct dpu_vbif_cfg msm8998_vbif[] = {
> {
> .name = "vbif_rt", .id = VBIF_RT,
> @@ -673,6 +765,8 @@ static const struct dpu_qos_lut_entry
> sc7180_qos_nrt[] = {
> * Hardware catalog
> *************************************************************/
>
> +#include "catalog/dpu_1_7_msm8996.h"
> +
> #include "catalog/dpu_3_0_msm8998.h"
> #include "catalog/dpu_3_2_sdm660.h"
> #include "catalog/dpu_3_3_sdm630.h"
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
> index 37e18e820a20..69f089431901 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
> @@ -831,6 +831,7 @@ struct dpu_mdss_cfg {
> const struct dpu_format_extended *vig_formats;
> };
>
> +extern const struct dpu_mdss_cfg dpu_msm8996_cfg;
> extern const struct dpu_mdss_cfg dpu_msm8998_cfg;
> extern const struct dpu_mdss_cfg dpu_sdm630_cfg;
> extern const struct dpu_mdss_cfg dpu_sdm660_cfg;
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index d1e2143110f2..58933d66bace 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -1435,6 +1435,7 @@ static const struct dev_pm_ops dpu_pm_ops = {
> };
>
> static const struct of_device_id dpu_dt_match[] = {
> + { .compatible = "qcom,msm8996-mdp5", .data =
> &dpu_msm8996_cfg, },
> { .compatible = "qcom,msm8998-dpu", .data = &dpu_msm8998_cfg,
> },
> { .compatible = "qcom,qcm2290-dpu", .data = &dpu_qcm2290_cfg,
> },
> { .compatible = "qcom,sdm630-mdp5", .data = &dpu_sdm630_cfg,
> },
> diff --git a/drivers/gpu/drm/msm/msm_drv.c
> b/drivers/gpu/drm/msm/msm_drv.c
> index 9c33f4e3f822..df1ad00541f5 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -984,6 +984,7 @@ module_param(prefer_mdp5, bool, 0444);
>
> /* list all platforms supported by both mdp5 and dpu drivers */
> static const char *const msm_mdp5_dpu_migration[] = {
> + "qcom,msm8996-mdp5",
> "qcom,sdm630-mdp5",
> "qcom,sdm660-mdp5",
> NULL,
>
More information about the Freedreno
mailing list