Message ID | 20230411-topic-straitlagoon_mdss-v2-7-5def73f50980@linaro.org |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp659257vqo; Thu, 20 Apr 2023 15:33:06 -0700 (PDT) X-Google-Smtp-Source: AKy350ZqbBXLpA/Z/fLDwuWg0VAMsAqhGjjF8lGOp2h1rtfuUa1zjYgMkOb74c0X66q+d0DRtBPt X-Received: by 2002:a05:6a21:6da0:b0:ed:1d7a:3339 with SMTP id wl32-20020a056a216da000b000ed1d7a3339mr4348835pzb.57.1682029986425; Thu, 20 Apr 2023 15:33:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682029986; cv=none; d=google.com; s=arc-20160816; b=erbrdqZ78oJQgJptjOP1RqmT729+MEIExPgu0iZEnh4xp3xcFkIszU4YPbTg8vGu/I UNaaEca5QwcTuVU0/e/5pMRIB0BWKyl1BVokj1UaBmEAB7+dhyB9n+XXKtyDNrDD2rSb KHecu9cwMoWdFqLBmMTZGacgEGS4F0QdqVKZUqfJAQF69hOeMqzhjthJL+BPq3zZflAQ wu5LqvFTgFi57ErnKjFNtB88SKoW788u3XCmJ6FCu6cRnAws4LlSfV2ZodF+ewvCx2oC YVJICX8DJ2SL1PeKqk5O+bTJYJUv3BbKfg95Kb89ng3fSlDZ1cS5E3WX78N9EJvPU+tP qt8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=Z59+lHYhgd6quDpgSFrXet2iI9JWyF7gPKPFeKFG1Vo=; b=pggnMBgnhTtV2DPuz5utih59tt048OQBm18ntPtXBhl1W2zRyj95BQoQoBGZmkhXPh LH8QjxeQ68TfPNbrZOVQmVZuByU0OXW2cvsKwbEshV1TAgvgJ2Jmhu0Hpu/aJEDZ/cBB bTDa/yfg2AOt00MhKeeljVR+uNjPjWSQ4XWD3x1EWsoMafh+7aZstONjVjLBhz383nPk otg9qsyVvjMjxsRtxzhw05lJItTSm1m0Hu5jMBpDTnYWj3XQAFuCPhHnc2VBr3WSayq3 ff0z30YGXLnscv7GGj/jM5uOvSgJVH3yVNt5JkA0qt24BVd+jyRbSrg5SetqbngLLVSu acBQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Sa64avKK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 14-20020a630a0e000000b004ce5301edd5si2664239pgk.711.2023.04.20.15.32.54; Thu, 20 Apr 2023 15:33:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Sa64avKK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229887AbjDTWcD (ORCPT <rfc822;cjcooper78@gmail.com> + 99 others); Thu, 20 Apr 2023 18:32:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50250 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233034AbjDTWbn (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 20 Apr 2023 18:31:43 -0400 Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 60A4C6E8B for <linux-kernel@vger.kernel.org>; Thu, 20 Apr 2023 15:31:35 -0700 (PDT) Received: by mail-lf1-x12a.google.com with SMTP id 2adb3069b0e04-4ec8da7aaf8so952175e87.2 for <linux-kernel@vger.kernel.org>; Thu, 20 Apr 2023 15:31:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1682029893; x=1684621893; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Z59+lHYhgd6quDpgSFrXet2iI9JWyF7gPKPFeKFG1Vo=; b=Sa64avKKJqaIko6ztpF1/K0y5spRS/9wbGwKLPlJ7DhOeJ++sSVR3dchoj3GL309r2 qUOb0/mQfhbnlPJyyxvGKqI5d3iOAAZ8YT339tcQQQ1P/DRFrle7iz5Dl/8ri36/87hz PJreKb38vwm2epAX98aNG68t/WS2Xti6jYMYI84Whmrh9yLK7hRGiKq0NS3Csc+IjnWe urjrqCa7zMoYf/A2HpvM1DXQiyBDf1Qp3w2GqwGN7ZpYpoEKWCk/o6qLqTfqEUBU0DeX 2DGv60aPsI4WhxOIl4BQ6elV4zd8qe2iWeG9SdYpARec+2dR7jMpPvLulAPpyPInQnWl 4aqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682029893; x=1684621893; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z59+lHYhgd6quDpgSFrXet2iI9JWyF7gPKPFeKFG1Vo=; b=PB5wziRKLBwAPgmrymgr3yGMRMgB/xtOSafF3lJLnYEVpIh/SkMh915ICqJSqwZARo zfeY90+NfsnRHFj4pNZdpdqpuSeILdS5APE/l9oBG2cJ15UuP+ekpvmvMM/dTbeR4lrb gY8JW17I+UQWjjzdGC44tUzgKEY9nyYAMkkfyTC776auFI9B+QbX0evPur5HUjyVvaSA cRBQWeW14HVanlgCBTmqPD3y/X54PpvtluI+n5pyIx91JBznoTZ+0YQ3k7r8mZDun7Ja 1Oxu4F4NN1FAlGCDGzbF7lNlwSnXFmFPpUXZVzyAT8u2l9shgIPkQeRasgSwXttEXmlz DNKg== X-Gm-Message-State: AAQBX9du2jOb/W34BiUw7oBl87V7JUpoGhGUV2Ounwzc4tUl/rxYrEqb EXETqfJgtw4MdIlmgDebxvJyAw== X-Received: by 2002:ac2:4c93:0:b0:4ed:b4f9:28c7 with SMTP id d19-20020ac24c93000000b004edb4f928c7mr660274lfl.6.1682029893354; Thu, 20 Apr 2023 15:31:33 -0700 (PDT) Received: from [192.168.1.101] (abyj144.neoplus.adsl.tpnet.pl. [83.9.29.144]) by smtp.gmail.com with ESMTPSA id w8-20020ac25d48000000b004eedb66983csm324256lfd.273.2023.04.20.15.31.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Apr 2023 15:31:32 -0700 (PDT) From: Konrad Dybcio <konrad.dybcio@linaro.org> Date: Fri, 21 Apr 2023 00:31:16 +0200 Subject: [PATCH v2 07/13] drm/msm/dpu: Add SM6350 support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20230411-topic-straitlagoon_mdss-v2-7-5def73f50980@linaro.org> References: <20230411-topic-straitlagoon_mdss-v2-0-5def73f50980@linaro.org> In-Reply-To: <20230411-topic-straitlagoon_mdss-v2-0-5def73f50980@linaro.org> To: Rob Clark <robdclark@gmail.com>, Abhinav Kumar <quic_abhinavk@quicinc.com>, Dmitry Baryshkov <dmitry.baryshkov@linaro.org>, Sean Paul <sean@poorly.run>, David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>, Rob Herring <robh+dt@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Krishna Manikandan <quic_mkrishn@quicinc.com>, Will Deacon <will@kernel.org>, Robin Murphy <robin.murphy@arm.com>, Joerg Roedel <joro@8bytes.org> Cc: Marijn Suijten <marijn.suijten@somainline.org>, linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev, Konrad Dybcio <konrad.dybcio@linaro.org>, Konrad Dybcio <konrad.dybcio@somainline.org> X-Mailer: b4 0.12.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1682029879; l=9316; i=konrad.dybcio@linaro.org; s=20230215; h=from:subject:message-id; bh=gT9L4u1VuFTOmRCaxRkDtWh/c76LBas//ACGhlx1A/I=; b=QI3PSCwscxeEAcVw6rnNKDerDN2L6/iHAuZLCciK+BLr0MdnWONP5CgvjUdR24nONcn1dCRf+m5d vHxLHvypBecZqEFObnNHN9dTIyTji31FqG/3WiInbC/b0iWYCkA7 X-Developer-Key: i=konrad.dybcio@linaro.org; a=ed25519; pk=iclgkYvtl2w05SSXO5EjjSYlhFKsJ+5OSZBjOkQuEms= X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763736275122729544?= X-GMAIL-MSGID: =?utf-8?q?1763736275122729544?= |
Series |
SM63(50|75) DPU support
|
|
Commit Message
Konrad Dybcio
April 20, 2023, 10:31 p.m. UTC
Add SM6350 support to the DPU1 driver to enable display output. Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> --- .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 191 +++++++++++++++++++++ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 1 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 3 + drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + 4 files changed, 196 insertions(+)
Comments
On 21/04/2023 01:31, Konrad Dybcio wrote: > Add SM6350 support to the DPU1 driver to enable display output. > > Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> > Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> > --- > .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 191 +++++++++++++++++++++ > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 1 + > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 3 + > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + > 4 files changed, 196 insertions(+) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h > new file mode 100644 > index 000000000000..687a508cbaa6 > --- /dev/null > +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h > @@ -0,0 +1,191 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. > + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. > + * Copyright (c) 2023, Linaro Limited > + */ > + > +#ifndef _DPU_6_4_SM6350_H > +#define _DPU_6_4_SM6350_H > + > +static const struct dpu_caps sm6350_dpu_caps = { > + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, > + .max_mixer_blendstages = 0x7, > + .qseed_type = DPU_SSPP_SCALER_QSEED4, > + .has_src_split = true, > + .has_dim_layer = true, > + .has_idle_pc = true, > + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, > + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, > +}; > + > +static const struct dpu_ubwc_cfg sm6350_ubwc_cfg = { > + .ubwc_version = DPU_HW_UBWC_VER_20, > + .ubwc_swizzle = 6, > + .highest_bank_bit = 1, > +}; > + > +static const struct dpu_mdp_cfg sm6350_mdp[] = { > + { > + .name = "top_0", .id = MDP_TOP, > + .base = 0x0, .len = 0x494, > + .features = 0, > + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, > + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, > + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, > + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, > + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, > + }, > +}; > + > +static const struct dpu_ctl_cfg sm6350_ctl[] = { > + { > + .name = "ctl_0", .id = CTL_0, > + .base = 0x1000, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), > + }, > + { > + .name = "ctl_1", .id = CTL_1, > + .base = 0x1200, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), > + }, > + { > + .name = "ctl_2", .id = CTL_2, > + .base = 0x1400, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), > + }, > + { > + .name = "ctl_3", .id = CTL_3, > + .base = 0x1600, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), > + }, > +}; > + > +static const struct dpu_sspp_cfg sm6350_sspp[] = { > + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, > + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), > + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, > + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), > + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, > + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), DPU_CLK_CTRL_DMA0 > + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, > + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), DPU_CLK_CTRL_DMA2 > +}; > + > +static const struct dpu_lm_cfg sm6350_lm[] = { > + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, > + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), > + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, > + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), > +}; > + > +static const struct dpu_dspp_cfg sm6350_dspp[] = { > + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, > + &sm8150_dspp_sblk), > +}; > + > +static struct dpu_pingpong_cfg sm6350_pp[] = { > + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), > + -1), > + PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), > + -1), > +}; > + > +static const struct dpu_intf_cfg sm6350_intf[] = { > + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x2c0, INTF_DP, 0, 35, INTF_SC7180_MASK, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24), > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)), > + INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 35, INTF_SC7180_MASK, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26), > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27), > + DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)), > +}; > + > +static const struct dpu_vbif_cfg sm6350_vbif[] = { > + { > + .name = "vbif_0", .id = VBIF_RT, > + .base = 0, .len = 0x1044, > + .features = BIT(DPU_VBIF_QOS_REMAP), > + .xin_halt_timeout = 0x4000, > + .qos_rt_tbl = { > + .npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl), > + .priority_lvl = sdm845_rt_pri_lvl, > + }, > + .qos_nrt_tbl = { > + .npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl), > + .priority_lvl = sdm845_nrt_pri_lvl, > + }, > + .memtype_count = 14, > + .memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, > + }, > +}; > + > +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { > + {.fl = 0, .lut = 0x0011223344556677 }, > + {.fl = 0, .lut = 0x0011223445566777 }, Do we need two equal entries here? Also please push the qos to the dpu_hw_catalog.c, I want to take another look at these structures and it is easier if all of them are beneath one's eyes. > +}; > + > +static const struct dpu_perf_cfg sm6350_perf_data = { > + .max_bw_low = 4200000, > + .max_bw_high = 5100000, > + .min_core_ib = 2500000, > + .min_llcc_ib = 0, > + .min_dram_ib = 1600000, > + .min_prefill_lines = 35, > + /* TODO: confirm danger_lut_tbl */ > + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, > + .qos_lut_tbl = { > + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), > + .entries = sm6350_qos_linear_macrotile > + }, > + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), > + .entries = sm6350_qos_linear_macrotile > + }, > + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), > + .entries = sc7180_qos_nrt > + }, > + }, > + .cdp_cfg = { > + {.rd_enable = 1, .wr_enable = 1}, > + {.rd_enable = 1, .wr_enable = 0} > + }, > + .clk_inefficiency_factor = 105, > + .bw_inefficiency_factor = 120, > +}; > + > +const struct dpu_mdss_cfg dpu_sm6350_cfg = { > + .caps = &sm6350_dpu_caps, > + .ubwc = &sm6350_ubwc_cfg, > + .mdp_count = ARRAY_SIZE(sm6350_mdp), > + .mdp = sm6350_mdp, > + .ctl_count = ARRAY_SIZE(sm6350_ctl), > + .ctl = sm6350_ctl, > + .sspp_count = ARRAY_SIZE(sm6350_sspp), > + .sspp = sm6350_sspp, > + .mixer_count = ARRAY_SIZE(sm6350_lm), > + .mixer = sm6350_lm, > + .dspp_count = ARRAY_SIZE(sm6350_dspp), > + .dspp = sm6350_dspp, > + .pingpong_count = ARRAY_SIZE(sm6350_pp), > + .pingpong = sm6350_pp, > + .intf_count = ARRAY_SIZE(sm6350_intf), > + .intf = sm6350_intf, > + .vbif_count = ARRAY_SIZE(sm6350_vbif), > + .vbif = sm6350_vbif, > + .reg_dma_count = 1, > + .dma_cfg = &sm8250_regdma, > + .perf = &sm6350_perf_data, > + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ > + BIT(MDP_SSPP_TOP0_INTR2) | \ > + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ > + BIT(MDP_INTF0_INTR) | \ > + BIT(MDP_INTF1_INTR) > +}; > + > +#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 db558a9ae36e..52750b592b36 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > @@ -806,6 +806,7 @@ static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = { > #include "catalog/dpu_6_0_sm8250.h" > #include "catalog/dpu_6_2_sc7180.h" > #include "catalog/dpu_6_3_sm6115.h" > +#include "catalog/dpu_6_4_sm6350.h" > #include "catalog/dpu_6_5_qcm2290.h" > > #include "catalog/dpu_7_0_sm8350.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 756bff1d2185..f9611bd75e02 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > @@ -320,6 +320,8 @@ enum dpu_qos_lut_usage { > DPU_QOS_LUT_USAGE_LINEAR, > DPU_QOS_LUT_USAGE_MACROTILE, > DPU_QOS_LUT_USAGE_NRT, > + DPU_QOS_LUT_USAGE_CWB, > + DPU_QOS_LUT_USAGE_MACROTILE_QSEED, This should probably be removed. It would be nice to clean these things up, but not as a part of sm6350. > DPU_QOS_LUT_USAGE_MAX, > }; > > @@ -880,6 +882,7 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; > extern const struct dpu_mdss_cfg dpu_sm8250_cfg; > extern const struct dpu_mdss_cfg dpu_sc7180_cfg; > extern const struct dpu_mdss_cfg dpu_sm6115_cfg; > +extern const struct dpu_mdss_cfg dpu_sm6350_cfg; > extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; > extern const struct dpu_mdss_cfg dpu_sm8350_cfg; > extern const struct dpu_mdss_cfg dpu_sc7280_cfg; > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index 0e7a68714e9e..46be7ad8d615 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -1286,6 +1286,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,sm6350-dpu", .data = &dpu_sm6350_cfg, }, > { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, > { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, > { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, >
On 21.04.2023 00:41, Dmitry Baryshkov wrote: > On 21/04/2023 01:31, Konrad Dybcio wrote: >> Add SM6350 support to the DPU1 driver to enable display output. >> >> Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> >> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> >> --- [...] >> + >> +static const struct dpu_sspp_cfg sm6350_sspp[] = { >> + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, >> + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), >> + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, >> + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), >> + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, >> + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), > > DPU_CLK_CTRL_DMA0 > >> + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, >> + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), > > DPU_CLK_CTRL_DMA2 _DMA1? > > >> +}; >> + >> +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { >> + {.fl = 0, .lut = 0x0011223344556677 }, >> + {.fl = 0, .lut = 0x0011223445566777 }, > > Do we need two equal entries here? Hmm.. looks like the SDE driver dropped the fill level logic in 4.19 times and that might have thrown me off when porting this Since the [0] entry has what looks like a lower LUT value, should I give it .fl=1? > > Also please push the qos to the dpu_hw_catalog.c, I want to take another look at these structures and it is easier if all of them are beneath one's eyes. Will do. > >> +}; >> + >> +static const struct dpu_perf_cfg sm6350_perf_data = { >> + .max_bw_low = 4200000, >> + .max_bw_high = 5100000, >> + .min_core_ib = 2500000, >> + .min_llcc_ib = 0, >> + .min_dram_ib = 1600000, >> + .min_prefill_lines = 35, >> + /* TODO: confirm danger_lut_tbl */ >> + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, [...] >> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >> @@ -320,6 +320,8 @@ enum dpu_qos_lut_usage { >> DPU_QOS_LUT_USAGE_LINEAR, >> DPU_QOS_LUT_USAGE_MACROTILE, >> DPU_QOS_LUT_USAGE_NRT, >> + DPU_QOS_LUT_USAGE_CWB, >> + DPU_QOS_LUT_USAGE_MACROTILE_QSEED, > > This should probably be removed. It would be nice to clean these things up, but not as a part of sm6350. Well, I won't be able to fill in the danger LUT table otherwise! Konrad > >> DPU_QOS_LUT_USAGE_MAX, >> }; >> @@ -880,6 +882,7 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; >> extern const struct dpu_mdss_cfg dpu_sm8250_cfg; >> extern const struct dpu_mdss_cfg dpu_sc7180_cfg; >> extern const struct dpu_mdss_cfg dpu_sm6115_cfg; >> +extern const struct dpu_mdss_cfg dpu_sm6350_cfg; >> extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; >> extern const struct dpu_mdss_cfg dpu_sm8350_cfg; >> extern const struct dpu_mdss_cfg dpu_sc7280_cfg; >> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >> index 0e7a68714e9e..46be7ad8d615 100644 >> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >> @@ -1286,6 +1286,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,sm6350-dpu", .data = &dpu_sm6350_cfg, }, >> { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, >> { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, >> { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, >> >
On 21/04/2023 02:05, Konrad Dybcio wrote: > > > On 21.04.2023 00:41, Dmitry Baryshkov wrote: >> On 21/04/2023 01:31, Konrad Dybcio wrote: >>> Add SM6350 support to the DPU1 driver to enable display output. >>> >>> Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> >>> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> >>> --- > [...] > >>> + >>> +static const struct dpu_sspp_cfg sm6350_sspp[] = { >>> + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, >>> + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), >>> + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, >>> + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), >>> + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, >>> + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), >> >> DPU_CLK_CTRL_DMA0 This is DPU_CLK_CTRL_DMA1, I made a typo >> >>> + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, >>> + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), >> >> DPU_CLK_CTRL_DMA2 > _DMA1? > And this is DMA2, I was correct. > >> >> >>> +}; >>> + > >>> +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { >>> + {.fl = 0, .lut = 0x0011223344556677 }, >>> + {.fl = 0, .lut = 0x0011223445566777 }, >> >> Do we need two equal entries here? > Hmm.. looks like the SDE driver dropped the fill level > logic in 4.19 times and that might have thrown me off > when porting this Since the [0] entry has what looks > like a lower LUT value, should I give it .fl=1? > > >> >> Also please push the qos to the dpu_hw_catalog.c, I want to take another look at these structures and it is easier if all of them are beneath one's eyes. > Will do. > >> >>> +}; >>> + >>> +static const struct dpu_perf_cfg sm6350_perf_data = { >>> + .max_bw_low = 4200000, >>> + .max_bw_high = 5100000, >>> + .min_core_ib = 2500000, >>> + .min_llcc_ib = 0, >>> + .min_dram_ib = 1600000, >>> + .min_prefill_lines = 35, >>> + /* TODO: confirm danger_lut_tbl */ >>> + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, > [...] > > >>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >>> @@ -320,6 +320,8 @@ enum dpu_qos_lut_usage { >>> DPU_QOS_LUT_USAGE_LINEAR, >>> DPU_QOS_LUT_USAGE_MACROTILE, >>> DPU_QOS_LUT_USAGE_NRT, >>> + DPU_QOS_LUT_USAGE_CWB, >>> + DPU_QOS_LUT_USAGE_MACROTILE_QSEED, >> >> This should probably be removed. It would be nice to clean these things up, but not as a part of sm6350. > Well, I won't be able to fill in the danger LUT table otherwise! > > Konrad >> >>> DPU_QOS_LUT_USAGE_MAX, >>> }; >>> @@ -880,6 +882,7 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; >>> extern const struct dpu_mdss_cfg dpu_sm8250_cfg; >>> extern const struct dpu_mdss_cfg dpu_sc7180_cfg; >>> extern const struct dpu_mdss_cfg dpu_sm6115_cfg; >>> +extern const struct dpu_mdss_cfg dpu_sm6350_cfg; >>> extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; >>> extern const struct dpu_mdss_cfg dpu_sm8350_cfg; >>> extern const struct dpu_mdss_cfg dpu_sc7280_cfg; >>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >>> index 0e7a68714e9e..46be7ad8d615 100644 >>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >>> @@ -1286,6 +1286,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,sm6350-dpu", .data = &dpu_sm6350_cfg, }, >>> { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, >>> { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, >>> { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, >>> >>
On 2023-04-21 00:31:16, Konrad Dybcio wrote: > Add SM6350 support to the DPU1 driver to enable display output. > > Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> > Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> After addressing the comments from Dmitry (CURSOR0->DMA1 and CURSOR1->DMA2), this is: Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org> See below for some nits. > --- > .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 191 +++++++++++++++++++++ > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 1 + > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 3 + > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + > 4 files changed, 196 insertions(+) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h > new file mode 100644 > index 000000000000..687a508cbaa6 > --- /dev/null > +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h > @@ -0,0 +1,191 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. > + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. > + * Copyright (c) 2023, Linaro Limited > + */ > + > +#ifndef _DPU_6_4_SM6350_H > +#define _DPU_6_4_SM6350_H > + > +static const struct dpu_caps sm6350_dpu_caps = { > + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, > + .max_mixer_blendstages = 0x7, > + .qseed_type = DPU_SSPP_SCALER_QSEED4, I thought it was QSEED3LITE, but doesn't really matter as both are handled similarly. It'll anyway change when I resubmit: https://lore.kernel.org/linux-arm-msm/20230215-sspp-scaler-version-v1-0-416b1500b85b@somainline.org/T/#u which should hardcode the register value directly, making this field superfluous. > + .has_src_split = true, > + .has_dim_layer = true, > + .has_idle_pc = true, > + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, > + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, > +}; > + > +static const struct dpu_ubwc_cfg sm6350_ubwc_cfg = { > + .ubwc_version = DPU_HW_UBWC_VER_20, > + .ubwc_swizzle = 6, > + .highest_bank_bit = 1, > +}; > + > +static const struct dpu_mdp_cfg sm6350_mdp[] = { > + { > + .name = "top_0", .id = MDP_TOP, > + .base = 0x0, .len = 0x494, > + .features = 0, > + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, > + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, > + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, > + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, > + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, > + }, > +}; > + > +static const struct dpu_ctl_cfg sm6350_ctl[] = { > + { > + .name = "ctl_0", .id = CTL_0, > + .base = 0x1000, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), > + }, > + { > + .name = "ctl_1", .id = CTL_1, > + .base = 0x1200, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), > + }, > + { > + .name = "ctl_2", .id = CTL_2, > + .base = 0x1400, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), > + }, > + { > + .name = "ctl_3", .id = CTL_3, > + .base = 0x1600, .len = 0x1dc, > + .features = BIT(DPU_CTL_ACTIVE_CFG), > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), > + }, > +}; > + > +static const struct dpu_sspp_cfg sm6350_sspp[] = { > + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, > + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), > + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, > + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), > + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, > + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), > + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, > + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), > +}; > + > +static const struct dpu_lm_cfg sm6350_lm[] = { > + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, > + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), > + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, > + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), These two entries are indented with two tabs and have one character too many to align with the opening parenthesis on the previous line. Can we please settle on a single style, as this commit mostly uses tabs+spaces to align with the opening parenthesis? Dmitry vouched for `cino=(0` (when in unclosed parenthesis, align next line with zero extra characters to the opening parenthesis), but I find double tabs more convenient as it doesn't require reindenting when changing the name of the macro (which happened too often in my INTF TE series). > +}; > + > +static const struct dpu_dspp_cfg sm6350_dspp[] = { > + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, > + &sm8150_dspp_sblk), > +}; > + > +static struct dpu_pingpong_cfg sm6350_pp[] = { > + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), > + -1), > + PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), > + -1), Glad to see no TE2 here, we just removed it from all of DPU >= 5.0.0 instead of >= 7.0.0 in [1] as downstream DTS turned out to be wrong. [1]: https://lore.kernel.org/linux-arm-msm/20230411-dpu-intf-te-v4-2-27ce1a5ab5c6@somainline.org/ - Marijn > +}; > + > +static const struct dpu_intf_cfg sm6350_intf[] = { > + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x2c0, INTF_DP, 0, 35, INTF_SC7180_MASK, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24), > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)), > + INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 35, INTF_SC7180_MASK, > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26), > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27), > + DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)), > +}; > + > +static const struct dpu_vbif_cfg sm6350_vbif[] = { > + { > + .name = "vbif_0", .id = VBIF_RT, > + .base = 0, .len = 0x1044, > + .features = BIT(DPU_VBIF_QOS_REMAP), > + .xin_halt_timeout = 0x4000, > + .qos_rt_tbl = { > + .npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl), > + .priority_lvl = sdm845_rt_pri_lvl, > + }, > + .qos_nrt_tbl = { > + .npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl), > + .priority_lvl = sdm845_nrt_pri_lvl, > + }, > + .memtype_count = 14, > + .memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, > + }, > +}; > + > +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { > + {.fl = 0, .lut = 0x0011223344556677 }, > + {.fl = 0, .lut = 0x0011223445566777 }, > +}; > + > +static const struct dpu_perf_cfg sm6350_perf_data = { > + .max_bw_low = 4200000, > + .max_bw_high = 5100000, > + .min_core_ib = 2500000, > + .min_llcc_ib = 0, > + .min_dram_ib = 1600000, > + .min_prefill_lines = 35, > + /* TODO: confirm danger_lut_tbl */ > + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, > + .qos_lut_tbl = { > + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), > + .entries = sm6350_qos_linear_macrotile > + }, > + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), > + .entries = sm6350_qos_linear_macrotile > + }, > + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), > + .entries = sc7180_qos_nrt > + }, > + }, > + .cdp_cfg = { > + {.rd_enable = 1, .wr_enable = 1}, > + {.rd_enable = 1, .wr_enable = 0} > + }, > + .clk_inefficiency_factor = 105, > + .bw_inefficiency_factor = 120, > +}; > + > +const struct dpu_mdss_cfg dpu_sm6350_cfg = { > + .caps = &sm6350_dpu_caps, > + .ubwc = &sm6350_ubwc_cfg, > + .mdp_count = ARRAY_SIZE(sm6350_mdp), > + .mdp = sm6350_mdp, > + .ctl_count = ARRAY_SIZE(sm6350_ctl), > + .ctl = sm6350_ctl, > + .sspp_count = ARRAY_SIZE(sm6350_sspp), > + .sspp = sm6350_sspp, > + .mixer_count = ARRAY_SIZE(sm6350_lm), > + .mixer = sm6350_lm, > + .dspp_count = ARRAY_SIZE(sm6350_dspp), > + .dspp = sm6350_dspp, > + .pingpong_count = ARRAY_SIZE(sm6350_pp), > + .pingpong = sm6350_pp, > + .intf_count = ARRAY_SIZE(sm6350_intf), > + .intf = sm6350_intf, > + .vbif_count = ARRAY_SIZE(sm6350_vbif), > + .vbif = sm6350_vbif, > + .reg_dma_count = 1, > + .dma_cfg = &sm8250_regdma, > + .perf = &sm6350_perf_data, > + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ > + BIT(MDP_SSPP_TOP0_INTR2) | \ > + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ > + BIT(MDP_INTF0_INTR) | \ > + BIT(MDP_INTF1_INTR) > +}; > + > +#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 db558a9ae36e..52750b592b36 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > @@ -806,6 +806,7 @@ static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = { > #include "catalog/dpu_6_0_sm8250.h" > #include "catalog/dpu_6_2_sc7180.h" > #include "catalog/dpu_6_3_sm6115.h" > +#include "catalog/dpu_6_4_sm6350.h" > #include "catalog/dpu_6_5_qcm2290.h" > > #include "catalog/dpu_7_0_sm8350.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 756bff1d2185..f9611bd75e02 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > @@ -320,6 +320,8 @@ enum dpu_qos_lut_usage { > DPU_QOS_LUT_USAGE_LINEAR, > DPU_QOS_LUT_USAGE_MACROTILE, > DPU_QOS_LUT_USAGE_NRT, > + DPU_QOS_LUT_USAGE_CWB, > + DPU_QOS_LUT_USAGE_MACROTILE_QSEED, > DPU_QOS_LUT_USAGE_MAX, > }; > > @@ -880,6 +882,7 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; > extern const struct dpu_mdss_cfg dpu_sm8250_cfg; > extern const struct dpu_mdss_cfg dpu_sc7180_cfg; > extern const struct dpu_mdss_cfg dpu_sm6115_cfg; > +extern const struct dpu_mdss_cfg dpu_sm6350_cfg; > extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; > extern const struct dpu_mdss_cfg dpu_sm8350_cfg; > extern const struct dpu_mdss_cfg dpu_sc7280_cfg; > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index 0e7a68714e9e..46be7ad8d615 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -1286,6 +1286,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,sm6350-dpu", .data = &dpu_sm6350_cfg, }, > { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, > { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, > { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, > > -- > 2.40.0 >
On 2023-04-27 17:37:42, Marijn Suijten wrote: > On 2023-04-21 00:31:16, Konrad Dybcio wrote: > > Add SM6350 support to the DPU1 driver to enable display output. > > > > Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> > > Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> > > After addressing the comments from Dmitry (CURSOR0->DMA1 and > CURSOR1->DMA2), this is: > > Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org> > > See below for some nits. Actually found one glaring issue that might explain why INTF TE wasn't working for you the other day! > > --- > > .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 191 +++++++++++++++++++++ > > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 1 + > > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 3 + > > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + > > 4 files changed, 196 insertions(+) > > > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h > > new file mode 100644 > > index 000000000000..687a508cbaa6 > > --- /dev/null > > +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h > > @@ -0,0 +1,191 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. > > + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. > > + * Copyright (c) 2023, Linaro Limited > > + */ > > + > > +#ifndef _DPU_6_4_SM6350_H > > +#define _DPU_6_4_SM6350_H > > + > > +static const struct dpu_caps sm6350_dpu_caps = { > > + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, > > + .max_mixer_blendstages = 0x7, > > + .qseed_type = DPU_SSPP_SCALER_QSEED4, > > I thought it was QSEED3LITE, but doesn't really matter as both are > handled similarly. It'll anyway change when I resubmit: > > https://lore.kernel.org/linux-arm-msm/20230215-sspp-scaler-version-v1-0-416b1500b85b@somainline.org/T/#u > > which should hardcode the register value directly, making this field > superfluous. > > > + .has_src_split = true, > > + .has_dim_layer = true, > > + .has_idle_pc = true, > > + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, > > + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, > > +}; > > + > > +static const struct dpu_ubwc_cfg sm6350_ubwc_cfg = { > > + .ubwc_version = DPU_HW_UBWC_VER_20, > > + .ubwc_swizzle = 6, > > + .highest_bank_bit = 1, > > +}; > > + > > +static const struct dpu_mdp_cfg sm6350_mdp[] = { > > + { > > + .name = "top_0", .id = MDP_TOP, > > + .base = 0x0, .len = 0x494, > > + .features = 0, > > + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, > > + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, > > + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, > > + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, > > + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, > > + }, > > +}; > > + > > +static const struct dpu_ctl_cfg sm6350_ctl[] = { > > + { > > + .name = "ctl_0", .id = CTL_0, > > + .base = 0x1000, .len = 0x1dc, > > + .features = BIT(DPU_CTL_ACTIVE_CFG), > > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), > > + }, > > + { > > + .name = "ctl_1", .id = CTL_1, > > + .base = 0x1200, .len = 0x1dc, > > + .features = BIT(DPU_CTL_ACTIVE_CFG), > > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), > > + }, > > + { > > + .name = "ctl_2", .id = CTL_2, > > + .base = 0x1400, .len = 0x1dc, > > + .features = BIT(DPU_CTL_ACTIVE_CFG), > > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), > > + }, > > + { > > + .name = "ctl_3", .id = CTL_3, > > + .base = 0x1600, .len = 0x1dc, > > + .features = BIT(DPU_CTL_ACTIVE_CFG), > > + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), > > + }, > > +}; > > + > > +static const struct dpu_sspp_cfg sm6350_sspp[] = { > > + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, > > + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), > > + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, > > + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), > > + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, > > + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), > > + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, > > + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), > > +}; > > + > > +static const struct dpu_lm_cfg sm6350_lm[] = { > > + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, > > + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), > > + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, > > + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), > > These two entries are indented with two tabs and have one character too > many to align with the opening parenthesis on the previous line. Can we > please settle on a single style, as this commit mostly uses tabs+spaces > to align with the opening parenthesis? > > Dmitry vouched for `cino=(0` (when in unclosed parenthesis, align next > line with zero extra characters to the opening parenthesis), but I find > double tabs more convenient as it doesn't require reindenting when > changing the name of the macro (which happened too often in my INTF TE > series). > > > +}; > > + > > +static const struct dpu_dspp_cfg sm6350_dspp[] = { > > + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, > > + &sm8150_dspp_sblk), > > +}; > > + > > +static struct dpu_pingpong_cfg sm6350_pp[] = { > > + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, > > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), > > + -1), > > + PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, > > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), > > + -1), > > Glad to see no TE2 here, we just removed it from all of DPU >= 5.0.0 > instead of >= 7.0.0 in [1] as downstream DTS turned out to be wrong. > > [1]: https://lore.kernel.org/linux-arm-msm/20230411-dpu-intf-te-v4-2-27ce1a5ab5c6@somainline.org/ > > - Marijn > > > +}; > > + > > +static const struct dpu_intf_cfg sm6350_intf[] = { > > + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x2c0, INTF_DP, 0, 35, INTF_SC7180_MASK, > > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24), > > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)), > > + INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 35, INTF_SC7180_MASK, > > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26), > > + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27), > > + DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)), > > +}; > > + > > +static const struct dpu_vbif_cfg sm6350_vbif[] = { > > + { > > + .name = "vbif_0", .id = VBIF_RT, > > + .base = 0, .len = 0x1044, > > + .features = BIT(DPU_VBIF_QOS_REMAP), > > + .xin_halt_timeout = 0x4000, > > + .qos_rt_tbl = { > > + .npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl), > > + .priority_lvl = sdm845_rt_pri_lvl, > > + }, > > + .qos_nrt_tbl = { > > + .npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl), > > + .priority_lvl = sdm845_nrt_pri_lvl, > > + }, > > + .memtype_count = 14, > > + .memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, > > + }, > > +}; > > + > > +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { > > + {.fl = 0, .lut = 0x0011223344556677 }, > > + {.fl = 0, .lut = 0x0011223445566777 }, > > +}; > > + > > +static const struct dpu_perf_cfg sm6350_perf_data = { > > + .max_bw_low = 4200000, > > + .max_bw_high = 5100000, > > + .min_core_ib = 2500000, > > + .min_llcc_ib = 0, > > + .min_dram_ib = 1600000, > > + .min_prefill_lines = 35, > > + /* TODO: confirm danger_lut_tbl */ > > + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, > > + .qos_lut_tbl = { > > + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), > > + .entries = sm6350_qos_linear_macrotile > > + }, > > + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), > > + .entries = sm6350_qos_linear_macrotile > > + }, > > + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), > > + .entries = sc7180_qos_nrt > > + }, > > + }, > > + .cdp_cfg = { > > + {.rd_enable = 1, .wr_enable = 1}, > > + {.rd_enable = 1, .wr_enable = 0} > > + }, > > + .clk_inefficiency_factor = 105, > > + .bw_inefficiency_factor = 120, > > +}; > > + > > +const struct dpu_mdss_cfg dpu_sm6350_cfg = { > > + .caps = &sm6350_dpu_caps, > > + .ubwc = &sm6350_ubwc_cfg, > > + .mdp_count = ARRAY_SIZE(sm6350_mdp), > > + .mdp = sm6350_mdp, > > + .ctl_count = ARRAY_SIZE(sm6350_ctl), > > + .ctl = sm6350_ctl, > > + .sspp_count = ARRAY_SIZE(sm6350_sspp), > > + .sspp = sm6350_sspp, > > + .mixer_count = ARRAY_SIZE(sm6350_lm), > > + .mixer = sm6350_lm, > > + .dspp_count = ARRAY_SIZE(sm6350_dspp), > > + .dspp = sm6350_dspp, > > + .pingpong_count = ARRAY_SIZE(sm6350_pp), > > + .pingpong = sm6350_pp, > > + .intf_count = ARRAY_SIZE(sm6350_intf), > > + .intf = sm6350_intf, > > + .vbif_count = ARRAY_SIZE(sm6350_vbif), > > + .vbif = sm6350_vbif, > > + .reg_dma_count = 1, > > + .dma_cfg = &sm8250_regdma, > > + .perf = &sm6350_perf_data, > > + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ > > + BIT(MDP_SSPP_TOP0_INTR2) | \ > > + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ > > + BIT(MDP_INTF0_INTR) | \ > > + BIT(MDP_INTF1_INTR) For completeness I should've pointed out that you're missing MDP_INTF1_TEAR_INTR here, likely resulting in INTF TE not working. - Marijn <snip>
[...] >> + >> +static const struct dpu_caps sm6350_dpu_caps = { >> + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, >> + .max_mixer_blendstages = 0x7, >> + .qseed_type = DPU_SSPP_SCALER_QSEED4, > I thought it was QSEED3LITE, but doesn't really matter as both are > handled similarly. It'll anyway change when I resubmit: > > https://lore.kernel.org/linux-arm-msm/20230215-sspp-scaler-version-v1-0-416b1500b85b@somainline.org/T/#u > > which should hardcode the register value directly, making this field > superfluous. Okay, so I'll just resubmit as-is, I suppose? [...] >> +static const struct dpu_lm_cfg sm6350_lm[] = { >> + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, >> + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), >> + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, >> + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), > These two entries are indented with two tabs and have one character too > many to align with the opening parenthesis on the previous line. Can we > please settle on a single style, as this commit mostly uses tabs+spaces > to align with the opening parenthesis? > > Dmitry vouched for `cino=(0` (when in unclosed parenthesis, align next > line with zero extra characters to the opening parenthesis), but I find > double tabs more convenient as it doesn't require reindenting when > changing the name of the macro (which happened too often in my INTF TE > series). sure, let's go with that Dmitry suggested! Konrad > >> +}; >> + >> +static const struct dpu_dspp_cfg sm6350_dspp[] = { >> + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, >> + &sm8150_dspp_sblk), >> +}; >> + >> +static struct dpu_pingpong_cfg sm6350_pp[] = { >> + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), >> + -1), >> + PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), >> + -1), > Glad to see no TE2 here, we just removed it from all of DPU >= 5.0.0 > instead of >= 7.0.0 in [1] as downstream DTS turned out to be wrong. > > [1]: https://lore.kernel.org/linux-arm-msm/20230411-dpu-intf-te-v4-2-27ce1a5ab5c6@somainline.org/ > > - Marijn > >> +}; >> + >> +static const struct dpu_intf_cfg sm6350_intf[] = { >> + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x2c0, INTF_DP, 0, 35, INTF_SC7180_MASK, >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24), >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)), >> + INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 35, INTF_SC7180_MASK, >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26), >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27), >> + DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)), >> +}; >> + >> +static const struct dpu_vbif_cfg sm6350_vbif[] = { >> + { >> + .name = "vbif_0", .id = VBIF_RT, >> + .base = 0, .len = 0x1044, >> + .features = BIT(DPU_VBIF_QOS_REMAP), >> + .xin_halt_timeout = 0x4000, >> + .qos_rt_tbl = { >> + .npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl), >> + .priority_lvl = sdm845_rt_pri_lvl, >> + }, >> + .qos_nrt_tbl = { >> + .npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl), >> + .priority_lvl = sdm845_nrt_pri_lvl, >> + }, >> + .memtype_count = 14, >> + .memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, >> + }, >> +}; >> + >> +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { >> + {.fl = 0, .lut = 0x0011223344556677 }, >> + {.fl = 0, .lut = 0x0011223445566777 }, >> +}; >> + >> +static const struct dpu_perf_cfg sm6350_perf_data = { >> + .max_bw_low = 4200000, >> + .max_bw_high = 5100000, >> + .min_core_ib = 2500000, >> + .min_llcc_ib = 0, >> + .min_dram_ib = 1600000, >> + .min_prefill_lines = 35, >> + /* TODO: confirm danger_lut_tbl */ >> + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, >> + .qos_lut_tbl = { >> + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), >> + .entries = sm6350_qos_linear_macrotile >> + }, >> + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), >> + .entries = sm6350_qos_linear_macrotile >> + }, >> + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), >> + .entries = sc7180_qos_nrt >> + }, >> + }, >> + .cdp_cfg = { >> + {.rd_enable = 1, .wr_enable = 1}, >> + {.rd_enable = 1, .wr_enable = 0} >> + }, >> + .clk_inefficiency_factor = 105, >> + .bw_inefficiency_factor = 120, >> +}; >> + >> +const struct dpu_mdss_cfg dpu_sm6350_cfg = { >> + .caps = &sm6350_dpu_caps, >> + .ubwc = &sm6350_ubwc_cfg, >> + .mdp_count = ARRAY_SIZE(sm6350_mdp), >> + .mdp = sm6350_mdp, >> + .ctl_count = ARRAY_SIZE(sm6350_ctl), >> + .ctl = sm6350_ctl, >> + .sspp_count = ARRAY_SIZE(sm6350_sspp), >> + .sspp = sm6350_sspp, >> + .mixer_count = ARRAY_SIZE(sm6350_lm), >> + .mixer = sm6350_lm, >> + .dspp_count = ARRAY_SIZE(sm6350_dspp), >> + .dspp = sm6350_dspp, >> + .pingpong_count = ARRAY_SIZE(sm6350_pp), >> + .pingpong = sm6350_pp, >> + .intf_count = ARRAY_SIZE(sm6350_intf), >> + .intf = sm6350_intf, >> + .vbif_count = ARRAY_SIZE(sm6350_vbif), >> + .vbif = sm6350_vbif, >> + .reg_dma_count = 1, >> + .dma_cfg = &sm8250_regdma, >> + .perf = &sm6350_perf_data, >> + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ >> + BIT(MDP_SSPP_TOP0_INTR2) | \ >> + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ >> + BIT(MDP_INTF0_INTR) | \ >> + BIT(MDP_INTF1_INTR) >> +}; >> + >> +#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 db558a9ae36e..52750b592b36 100644 >> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c >> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c >> @@ -806,6 +806,7 @@ static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = { >> #include "catalog/dpu_6_0_sm8250.h" >> #include "catalog/dpu_6_2_sc7180.h" >> #include "catalog/dpu_6_3_sm6115.h" >> +#include "catalog/dpu_6_4_sm6350.h" >> #include "catalog/dpu_6_5_qcm2290.h" >> >> #include "catalog/dpu_7_0_sm8350.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 756bff1d2185..f9611bd75e02 100644 >> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >> @@ -320,6 +320,8 @@ enum dpu_qos_lut_usage { >> DPU_QOS_LUT_USAGE_LINEAR, >> DPU_QOS_LUT_USAGE_MACROTILE, >> DPU_QOS_LUT_USAGE_NRT, >> + DPU_QOS_LUT_USAGE_CWB, >> + DPU_QOS_LUT_USAGE_MACROTILE_QSEED, >> DPU_QOS_LUT_USAGE_MAX, >> }; >> >> @@ -880,6 +882,7 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; >> extern const struct dpu_mdss_cfg dpu_sm8250_cfg; >> extern const struct dpu_mdss_cfg dpu_sc7180_cfg; >> extern const struct dpu_mdss_cfg dpu_sm6115_cfg; >> +extern const struct dpu_mdss_cfg dpu_sm6350_cfg; >> extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; >> extern const struct dpu_mdss_cfg dpu_sm8350_cfg; >> extern const struct dpu_mdss_cfg dpu_sc7280_cfg; >> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >> index 0e7a68714e9e..46be7ad8d615 100644 >> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >> @@ -1286,6 +1286,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,sm6350-dpu", .data = &dpu_sm6350_cfg, }, >> { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, >> { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, >> { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, >> >> -- >> 2.40.0 >>
On 4/27/23 16:48, Marijn Suijten wrote: > On 2023-04-27 17:37:42, Marijn Suijten wrote: >> On 2023-04-21 00:31:16, Konrad Dybcio wrote: >>> Add SM6350 support to the DPU1 driver to enable display output. >>> >>> Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> >>> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> >> After addressing the comments from Dmitry (CURSOR0->DMA1 and >> CURSOR1->DMA2), this is: >> >> Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org> >> >> See below for some nits. > Actually found one glaring issue that might explain why INTF TE wasn't > working for you the other day! [...] >>> + .vbif = sm6350_vbif, >>> + .reg_dma_count = 1, >>> + .dma_cfg = &sm8250_regdma, >>> + .perf = &sm6350_perf_data, >>> + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ >>> + BIT(MDP_SSPP_TOP0_INTR2) | \ >>> + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ >>> + BIT(MDP_INTF0_INTR) | \ >>> + BIT(MDP_INTF1_INTR) > For completeness I should've pointed out that you're missing > MDP_INTF1_TEAR_INTR here, likely resulting in INTF TE not working. > > - Marijn <annoyed noises> so it might have been this.. I'll retest, thanks! Konrad > > <snip>
On 27/04/2023 18:37, Marijn Suijten wrote: > On 2023-04-21 00:31:16, Konrad Dybcio wrote: >> Add SM6350 support to the DPU1 driver to enable display output. >> >> Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> >> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> > > After addressing the comments from Dmitry (CURSOR0->DMA1 and > CURSOR1->DMA2), this is: > > Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org> > > See below for some nits. > >> --- >> .../gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h | 191 +++++++++++++++++++++ >> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 1 + >> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 3 + >> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + >> 4 files changed, 196 insertions(+) >> >> diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h >> new file mode 100644 >> index 000000000000..687a508cbaa6 >> --- /dev/null >> +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h >> @@ -0,0 +1,191 @@ >> +/* SPDX-License-Identifier: GPL-2.0-only */ >> +/* >> + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. >> + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. >> + * Copyright (c) 2023, Linaro Limited >> + */ >> + >> +#ifndef _DPU_6_4_SM6350_H >> +#define _DPU_6_4_SM6350_H >> + >> +static const struct dpu_caps sm6350_dpu_caps = { >> + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, >> + .max_mixer_blendstages = 0x7, >> + .qseed_type = DPU_SSPP_SCALER_QSEED4, > > I thought it was QSEED3LITE, but doesn't really matter as both are > handled similarly. It'll anyway change when I resubmit: If I understood correctly, we mixed two things: hw stuff and the userspace library. QSEEDv2 was a hardware scaler. "qseedv3/v3lite/v4" are software library names that are used with the scalers newer than QSEED2. From the driver point we can ignore that and use scaler's hw version (which mostly but not always corresponds to the 3/3lite/4). > > https://lore.kernel.org/linux-arm-msm/20230215-sspp-scaler-version-v1-0-416b1500b85b@somainline.org/T/#u > > which should hardcode the register value directly, making this field > superfluous. > >> + .has_src_split = true, >> + .has_dim_layer = true, >> + .has_idle_pc = true, >> + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, >> + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, >> +};
On 27/04/2023 18:37, Marijn Suijten wrote: > On 2023-04-21 00:31:16, Konrad Dybcio wrote: >> Add SM6350 support to the DPU1 driver to enable display output. >> >> Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> >> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> > > After addressing the comments from Dmitry (CURSOR0->DMA1 and > CURSOR1->DMA2), this is: > > Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org> > > See below for some nits. [...] >> +static const struct dpu_mdp_cfg sm6350_mdp[] = { >> + { >> + .name = "top_0", .id = MDP_TOP, >> + .base = 0x0, .len = 0x494, >> + .features = 0, >> + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, >> + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, >> + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, >> + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, >> + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, >> + }, >> +}; >> + >> +static const struct dpu_ctl_cfg sm6350_ctl[] = { >> + { >> + .name = "ctl_0", .id = CTL_0, >> + .base = 0x1000, .len = 0x1dc, >> + .features = BIT(DPU_CTL_ACTIVE_CFG), >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), >> + }, >> + { >> + .name = "ctl_1", .id = CTL_1, >> + .base = 0x1200, .len = 0x1dc, >> + .features = BIT(DPU_CTL_ACTIVE_CFG), >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), >> + }, >> + { >> + .name = "ctl_2", .id = CTL_2, >> + .base = 0x1400, .len = 0x1dc, >> + .features = BIT(DPU_CTL_ACTIVE_CFG), >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), >> + }, >> + { >> + .name = "ctl_3", .id = CTL_3, >> + .base = 0x1600, .len = 0x1dc, >> + .features = BIT(DPU_CTL_ACTIVE_CFG), >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), >> + }, >> +}; >> + >> +static const struct dpu_sspp_cfg sm6350_sspp[] = { >> + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, >> + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), >> + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, >> + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), >> + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, >> + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), >> + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, >> + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), >> +}; >> + >> +static const struct dpu_lm_cfg sm6350_lm[] = { >> + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, >> + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), >> + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, >> + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), > > These two entries are indented with two tabs and have one character too > many to align with the opening parenthesis on the previous line. Can we > please settle on a single style, as this commit mostly uses tabs+spaces > to align with the opening parenthesis? > > Dmitry vouched for `cino=(0` (when in unclosed parenthesis, align next > line with zero extra characters to the opening parenthesis), but I find > double tabs more convenient as it doesn't require reindenting when > changing the name of the macro (which happened too often in my INTF TE > series). I mainly vote for 'cino=(0' for indenting conditions (where double tab is confusing) and for function calls. I do not have a strong opinion about macros expansions. We have been using double-tab there, which is fine with me. Another option (which I personally find more appealing, but it doesn't play well with the current guidelines) is to have all macro arguments in a single line. It makes it easier to compare things. And another option would be to expand these macros up to some point. Previous experience with clock and interconnect drivers showed that expanding such multi-arg acros makes it _easier_ to handle the data. Counterintuitive, but true. > >> +}; >> + >> +static const struct dpu_dspp_cfg sm6350_dspp[] = { >> + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, >> + &sm8150_dspp_sblk), >> +}; >> + >> +static struct dpu_pingpong_cfg sm6350_pp[] = { >> + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), >> + -1), >> + PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, >> + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), >> + -1), [skipped the rest]
On 2023-04-28 16:03:54, Dmitry Baryshkov wrote: <snip> > >> + .qseed_type = DPU_SSPP_SCALER_QSEED4, > > > > I thought it was QSEED3LITE, but doesn't really matter as both are > > handled similarly. It'll anyway change when I resubmit: > > If I understood correctly, we mixed two things: hw stuff and the > userspace library. QSEEDv2 was a hardware scaler. "qseedv3/v3lite/v4" > are software library names that are used with the scalers newer than > QSEED2. From the driver point we can ignore that and use scaler's hw > version (which mostly but not always corresponds to the 3/3lite/4). If I remember correctly, that matches the register changes we intended to do in the patch below. This was only available starting at qseedv3. One of the replies in that thread clarifies which register value is used on what hardware, and that is what downstream switches on. I'll try and respin it once we're through the DSC series. - Marijn > > https://lore.kernel.org/linux-arm-msm/20230215-sspp-scaler-version-v1-0-416b1500b85b@somainline.org/T/#u > > > > which should hardcode the register value directly, making this field > > superfluous. <snip>
On 2023-05-05 15:11:44, Dmitry Baryshkov wrote: > On 27/04/2023 18:37, Marijn Suijten wrote: > > On 2023-04-21 00:31:16, Konrad Dybcio wrote: > >> Add SM6350 support to the DPU1 driver to enable display output. > >> > >> Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> > >> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> > > > > After addressing the comments from Dmitry (CURSOR0->DMA1 and > > CURSOR1->DMA2), this is: > > > > Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org> > > > > See below for some nits. > > [...] > > >> +static const struct dpu_mdp_cfg sm6350_mdp[] = { > >> + { > >> + .name = "top_0", .id = MDP_TOP, > >> + .base = 0x0, .len = 0x494, > >> + .features = 0, > >> + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, > >> + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, > >> + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, > >> + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, > >> + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, > >> + }, > >> +}; > >> + > >> +static const struct dpu_ctl_cfg sm6350_ctl[] = { > >> + { > >> + .name = "ctl_0", .id = CTL_0, > >> + .base = 0x1000, .len = 0x1dc, > >> + .features = BIT(DPU_CTL_ACTIVE_CFG), > >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), > >> + }, > >> + { > >> + .name = "ctl_1", .id = CTL_1, > >> + .base = 0x1200, .len = 0x1dc, > >> + .features = BIT(DPU_CTL_ACTIVE_CFG), > >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), > >> + }, > >> + { > >> + .name = "ctl_2", .id = CTL_2, > >> + .base = 0x1400, .len = 0x1dc, > >> + .features = BIT(DPU_CTL_ACTIVE_CFG), > >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), > >> + }, > >> + { > >> + .name = "ctl_3", .id = CTL_3, > >> + .base = 0x1600, .len = 0x1dc, > >> + .features = BIT(DPU_CTL_ACTIVE_CFG), > >> + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), > >> + }, > >> +}; > >> + > >> +static const struct dpu_sspp_cfg sm6350_sspp[] = { > >> + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, > >> + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), > >> + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, > >> + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), > >> + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, > >> + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), > >> + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, > >> + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), > >> +}; > >> + > >> +static const struct dpu_lm_cfg sm6350_lm[] = { > >> + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, > >> + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), > >> + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, > >> + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), > > > > These two entries are indented with two tabs and have one character too > > many to align with the opening parenthesis on the previous line. Can we > > please settle on a single style, as this commit mostly uses tabs+spaces > > to align with the opening parenthesis? > > > > Dmitry vouched for `cino=(0` (when in unclosed parenthesis, align next > > line with zero extra characters to the opening parenthesis), but I find > > double tabs more convenient as it doesn't require reindenting when > > changing the name of the macro (which happened too often in my INTF TE > > series). > > I mainly vote for 'cino=(0' for indenting conditions (where double tab > is confusing) and for function calls. I do not have a strong opinion > about macros expansions. We have been using double-tab there, which is > fine with me. Agreed on both. `cino=(0` looks nice but double-tab in the catalog has been easier to work with. > Another option (which I personally find more appealing, but it doesn't > play well with the current guidelines) is to have all macro arguments in > a single line. It makes it easier to compare things. Single line would be superb especially for current array tables. > > And another option would be to expand these macros up to some point. > Previous experience with clock and interconnect drivers showed that > expanding such multi-arg acros makes it _easier_ to handle the data. > Counterintuitive, but true. Fully agree, as well as inlining some flag constants. <snip> - Marijn
On 21/04/2023 02:05, Konrad Dybcio wrote: > > > On 21.04.2023 00:41, Dmitry Baryshkov wrote: >> On 21/04/2023 01:31, Konrad Dybcio wrote: >>> Add SM6350 support to the DPU1 driver to enable display output. >>> >>> Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org> >>> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> >>> --- > [...] > >>> + >>> +static const struct dpu_sspp_cfg sm6350_sspp[] = { >>> + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, >>> + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), >>> + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, >>> + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), >>> + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, >>> + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), >> >> DPU_CLK_CTRL_DMA0 >> >>> + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, >>> + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), >> >> DPU_CLK_CTRL_DMA2 > _DMA1? > > >> >> >>> +}; >>> + > >>> +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { >>> + {.fl = 0, .lut = 0x0011223344556677 }, >>> + {.fl = 0, .lut = 0x0011223445566777 }, >> >> Do we need two equal entries here? > Hmm.. looks like the SDE driver dropped the fill level > logic in 4.19 times and that might have thrown me off > when porting this Since the [0] entry has what looks > like a lower LUT value, should I give it .fl=1? > > >> >> Also please push the qos to the dpu_hw_catalog.c, I want to take another look at these structures and it is easier if all of them are beneath one's eyes. > Will do. > >> >>> +}; >>> + >>> +static const struct dpu_perf_cfg sm6350_perf_data = { >>> + .max_bw_low = 4200000, >>> + .max_bw_high = 5100000, >>> + .min_core_ib = 2500000, >>> + .min_llcc_ib = 0, >>> + .min_dram_ib = 1600000, >>> + .min_prefill_lines = 35, >>> + /* TODO: confirm danger_lut_tbl */ >>> + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, > [...] > > >>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h >>> @@ -320,6 +320,8 @@ enum dpu_qos_lut_usage { >>> DPU_QOS_LUT_USAGE_LINEAR, >>> DPU_QOS_LUT_USAGE_MACROTILE, >>> DPU_QOS_LUT_USAGE_NRT, >>> + DPU_QOS_LUT_USAGE_CWB, >>> + DPU_QOS_LUT_USAGE_MACROTILE_QSEED, >> >> This should probably be removed. It would be nice to clean these things up, but not as a part of sm6350. > Well, I won't be able to fill in the danger LUT table otherwise! danger/safe LUT tables have two entries for portrait/landscape (which we do not support). Please choose either of them for now. These two entries should be dropped for now (it was known for some time that MACROTILE_QSEED != MACROTILE. And CWB is not supported yet). > > Konrad >> >>> DPU_QOS_LUT_USAGE_MAX, >>> }; >>> @@ -880,6 +882,7 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; >>> extern const struct dpu_mdss_cfg dpu_sm8250_cfg; >>> extern const struct dpu_mdss_cfg dpu_sc7180_cfg; >>> extern const struct dpu_mdss_cfg dpu_sm6115_cfg; >>> +extern const struct dpu_mdss_cfg dpu_sm6350_cfg; >>> extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; >>> extern const struct dpu_mdss_cfg dpu_sm8350_cfg; >>> extern const struct dpu_mdss_cfg dpu_sc7280_cfg; >>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >>> index 0e7a68714e9e..46be7ad8d615 100644 >>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >>> @@ -1286,6 +1286,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,sm6350-dpu", .data = &dpu_sm6350_cfg, }, >>> { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, >>> { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, >>> { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, >>> >>
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h new file mode 100644 index 000000000000..687a508cbaa6 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h @@ -0,0 +1,191 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2023, Linaro Limited + */ + +#ifndef _DPU_6_4_SM6350_H +#define _DPU_6_4_SM6350_H + +static const struct dpu_caps sm6350_dpu_caps = { + .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, + .max_mixer_blendstages = 0x7, + .qseed_type = DPU_SSPP_SCALER_QSEED4, + .has_src_split = true, + .has_dim_layer = true, + .has_idle_pc = true, + .max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, + .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sm6350_ubwc_cfg = { + .ubwc_version = DPU_HW_UBWC_VER_20, + .ubwc_swizzle = 6, + .highest_bank_bit = 1, +}; + +static const struct dpu_mdp_cfg sm6350_mdp[] = { + { + .name = "top_0", .id = MDP_TOP, + .base = 0x0, .len = 0x494, + .features = 0, + .clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, + .clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, + .clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, + .clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, + .clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, + }, +}; + +static const struct dpu_ctl_cfg sm6350_ctl[] = { + { + .name = "ctl_0", .id = CTL_0, + .base = 0x1000, .len = 0x1dc, + .features = BIT(DPU_CTL_ACTIVE_CFG), + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), + }, + { + .name = "ctl_1", .id = CTL_1, + .base = 0x1200, .len = 0x1dc, + .features = BIT(DPU_CTL_ACTIVE_CFG), + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), + }, + { + .name = "ctl_2", .id = CTL_2, + .base = 0x1400, .len = 0x1dc, + .features = BIT(DPU_CTL_ACTIVE_CFG), + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), + }, + { + .name = "ctl_3", .id = CTL_3, + .base = 0x1600, .len = 0x1dc, + .features = BIT(DPU_CTL_ACTIVE_CFG), + .intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), + }, +}; + +static const struct dpu_sspp_cfg sm6350_sspp[] = { + SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, + sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), + SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, + sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), + SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, + sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), + SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, + sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), +}; + +static const struct dpu_lm_cfg sm6350_lm[] = { + LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, + &sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), + LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, + &sc7180_lm_sblk, PINGPONG_1, LM_0, 0), +}; + +static const struct dpu_dspp_cfg sm6350_dspp[] = { + DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, + &sm8150_dspp_sblk), +}; + +static struct dpu_pingpong_cfg sm6350_pp[] = { + PP_BLK("pingpong_0", PINGPONG_0, 0x70000, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), + -1), + PP_BLK("pingpong_1", PINGPONG_1, 0x70800, PINGPONG_SM8150_MASK, 0, sdm845_pp_sblk, + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), + -1), +}; + +static const struct dpu_intf_cfg sm6350_intf[] = { + INTF_BLK("intf_0", INTF_0, 0x6a000, 0x2c0, INTF_DP, 0, 35, INTF_SC7180_MASK, + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 24), + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 25)), + INTF_BLK_DSI_TE("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 35, INTF_SC7180_MASK, + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 26), + DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 27), + DPU_IRQ_IDX(MDP_INTF1_TEAR_INTR, 2)), +}; + +static const struct dpu_vbif_cfg sm6350_vbif[] = { + { + .name = "vbif_0", .id = VBIF_RT, + .base = 0, .len = 0x1044, + .features = BIT(DPU_VBIF_QOS_REMAP), + .xin_halt_timeout = 0x4000, + .qos_rt_tbl = { + .npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl), + .priority_lvl = sdm845_rt_pri_lvl, + }, + .qos_nrt_tbl = { + .npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl), + .priority_lvl = sdm845_nrt_pri_lvl, + }, + .memtype_count = 14, + .memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + }, +}; + +static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = { + {.fl = 0, .lut = 0x0011223344556677 }, + {.fl = 0, .lut = 0x0011223445566777 }, +}; + +static const struct dpu_perf_cfg sm6350_perf_data = { + .max_bw_low = 4200000, + .max_bw_high = 5100000, + .min_core_ib = 2500000, + .min_llcc_ib = 0, + .min_dram_ib = 1600000, + .min_prefill_lines = 35, + /* TODO: confirm danger_lut_tbl */ + .danger_lut_tbl = {0xffff, 0xffff, 0x0, 0x0, 0xffff}, + .qos_lut_tbl = { + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), + .entries = sm6350_qos_linear_macrotile + }, + {.nentry = ARRAY_SIZE(sm6350_qos_linear_macrotile), + .entries = sm6350_qos_linear_macrotile + }, + {.nentry = ARRAY_SIZE(sc7180_qos_nrt), + .entries = sc7180_qos_nrt + }, + }, + .cdp_cfg = { + {.rd_enable = 1, .wr_enable = 1}, + {.rd_enable = 1, .wr_enable = 0} + }, + .clk_inefficiency_factor = 105, + .bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sm6350_cfg = { + .caps = &sm6350_dpu_caps, + .ubwc = &sm6350_ubwc_cfg, + .mdp_count = ARRAY_SIZE(sm6350_mdp), + .mdp = sm6350_mdp, + .ctl_count = ARRAY_SIZE(sm6350_ctl), + .ctl = sm6350_ctl, + .sspp_count = ARRAY_SIZE(sm6350_sspp), + .sspp = sm6350_sspp, + .mixer_count = ARRAY_SIZE(sm6350_lm), + .mixer = sm6350_lm, + .dspp_count = ARRAY_SIZE(sm6350_dspp), + .dspp = sm6350_dspp, + .pingpong_count = ARRAY_SIZE(sm6350_pp), + .pingpong = sm6350_pp, + .intf_count = ARRAY_SIZE(sm6350_intf), + .intf = sm6350_intf, + .vbif_count = ARRAY_SIZE(sm6350_vbif), + .vbif = sm6350_vbif, + .reg_dma_count = 1, + .dma_cfg = &sm8250_regdma, + .perf = &sm6350_perf_data, + .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ + BIT(MDP_SSPP_TOP0_INTR2) | \ + BIT(MDP_SSPP_TOP0_HIST_INTR) | \ + BIT(MDP_INTF0_INTR) | \ + BIT(MDP_INTF1_INTR) +}; + +#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 db558a9ae36e..52750b592b36 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c @@ -806,6 +806,7 @@ static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = { #include "catalog/dpu_6_0_sm8250.h" #include "catalog/dpu_6_2_sc7180.h" #include "catalog/dpu_6_3_sm6115.h" +#include "catalog/dpu_6_4_sm6350.h" #include "catalog/dpu_6_5_qcm2290.h" #include "catalog/dpu_7_0_sm8350.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 756bff1d2185..f9611bd75e02 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h @@ -320,6 +320,8 @@ enum dpu_qos_lut_usage { DPU_QOS_LUT_USAGE_LINEAR, DPU_QOS_LUT_USAGE_MACROTILE, DPU_QOS_LUT_USAGE_NRT, + DPU_QOS_LUT_USAGE_CWB, + DPU_QOS_LUT_USAGE_MACROTILE_QSEED, DPU_QOS_LUT_USAGE_MAX, }; @@ -880,6 +882,7 @@ extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; extern const struct dpu_mdss_cfg dpu_sm8250_cfg; extern const struct dpu_mdss_cfg dpu_sc7180_cfg; extern const struct dpu_mdss_cfg dpu_sm6115_cfg; +extern const struct dpu_mdss_cfg dpu_sm6350_cfg; extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; extern const struct dpu_mdss_cfg dpu_sm8350_cfg; extern const struct dpu_mdss_cfg dpu_sc7280_cfg; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index 0e7a68714e9e..46be7ad8d615 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -1286,6 +1286,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,sm6350-dpu", .data = &dpu_sm6350_cfg, }, { .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, { .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, { .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, },