[PATCH 1/2] drm/msm/dpu: Add MSM8996 support
barnabas.czeman at mainlining.org
barnabas.czeman at mainlining.org
Fri Sep 27 15:44:43 UTC 2024
On 2024-08-18 09:16, Icenowy Zheng wrote:
> 在 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?
As far as i know yes, but if i know correctly there are some DSC
support also in MDP5.
>
> 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 dri-devel
mailing list