From: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
To: Rob Clark <robin.clark@oss.qualcomm.com>,
Dmitry Baryshkov <lumag@kernel.org>,
Abhinav Kumar <abhinav.kumar@linux.dev>,
Jessica Zhang <jesszhan0024@gmail.com>,
Sean Paul <sean@poorly.run>,
Marijn Suijten <marijn.suijten@somainline.org>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
Akhil P Oommen <akhilpo@oss.qualcomm.com>
Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org,
freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: [PATCH v3 01/27] drm/msm/mdss: correct UBWC programming sequences
Date: Thu, 12 Mar 2026 15:29:22 +0200 [thread overview]
Message-ID: <20260312-ubwc-rework-v3-1-b7e8f800176a@oss.qualcomm.com> (raw)
In-Reply-To: <20260312-ubwc-rework-v3-0-b7e8f800176a@oss.qualcomm.com>
The UBWC registers in the MDSS region are not dependent on the UBWC
version (it is an invalid assumption we inherited from the vendor SDE
driver). Instead they are dependent only on the MDSS core revision.
Rework UBWC programming to follow MDSS revision and to use required (aka
encoder) UBWC version instead of the ubwc_dec_version.
Fixes: d68db6069a8e ("drm/msm/mdss: convert UBWC setup to use match data")
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/msm/msm_mdss.c | 115 +++++++++++++++--------------------------
1 file changed, 41 insertions(+), 74 deletions(-)
diff --git a/drivers/gpu/drm/msm/msm_mdss.c b/drivers/gpu/drm/msm/msm_mdss.c
index 9047e8d9ee89..7cb8aeaa7ecf 100644
--- a/drivers/gpu/drm/msm/msm_mdss.c
+++ b/drivers/gpu/drm/msm/msm_mdss.c
@@ -166,22 +166,19 @@ static int _msm_mdss_irq_domain_add(struct msm_mdss *msm_mdss)
return 0;
}
-static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss)
+static void msm_mdss_4x_setup_ubwc(struct msm_mdss *msm_mdss)
{
const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
- u32 value = MDSS_UBWC_STATIC_UBWC_SWIZZLE(data->ubwc_swizzle) |
+ u32 value = MDSS_UBWC_STATIC_UBWC_SWIZZLE(data->ubwc_swizzle & 0x1) |
MDSS_UBWC_STATIC_HIGHEST_BANK_BIT(data->highest_bank_bit - 13);
- if (data->ubwc_bank_spread)
- value |= MDSS_UBWC_STATIC_UBWC_BANK_SPREAD;
-
if (data->ubwc_enc_version == UBWC_1_0)
value |= MDSS_UBWC_STATIC_UBWC_MIN_ACC_LEN(1);
writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
}
-static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss)
+static void msm_mdss_5x_setup_ubwc(struct msm_mdss *msm_mdss)
{
const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
u32 value = MDSS_UBWC_STATIC_UBWC_SWIZZLE(data->ubwc_swizzle & 0x1) |
@@ -199,11 +196,12 @@ static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss)
writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
}
-static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss)
+static void msm_mdss_6x_setup_ubwc(struct msm_mdss *msm_mdss)
{
const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
u32 value = MDSS_UBWC_STATIC_UBWC_SWIZZLE(data->ubwc_swizzle) |
MDSS_UBWC_STATIC_HIGHEST_BANK_BIT(data->highest_bank_bit - 13);
+ u32 ver, prediction_mode;
if (data->ubwc_bank_spread)
value |= MDSS_UBWC_STATIC_UBWC_BANK_SPREAD;
@@ -211,45 +209,42 @@ static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss)
if (data->macrotile_mode)
value |= MDSS_UBWC_STATIC_MACROTILE_MODE;
- writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
-
- if (data->ubwc_enc_version == UBWC_3_0) {
- writel_relaxed(1, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
- writel_relaxed(0, msm_mdss->mmio + REG_MDSS_UBWC_PREDICTION_MODE);
- } else {
- if (data->ubwc_dec_version == UBWC_4_3)
- writel_relaxed(3, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
- else
- writel_relaxed(2, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
- writel_relaxed(1, msm_mdss->mmio + REG_MDSS_UBWC_PREDICTION_MODE);
- }
-}
-
-static void msm_mdss_setup_ubwc_dec_50(struct msm_mdss *msm_mdss)
-{
- const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
- u32 value = MDSS_UBWC_STATIC_UBWC_SWIZZLE(data->ubwc_swizzle) |
- MDSS_UBWC_STATIC_HIGHEST_BANK_BIT(data->highest_bank_bit - 13);
-
- if (data->ubwc_bank_spread)
- value |= MDSS_UBWC_STATIC_UBWC_BANK_SPREAD;
-
- if (data->macrotile_mode)
- value |= MDSS_UBWC_STATIC_MACROTILE_MODE;
+ if (data->ubwc_enc_version == UBWC_1_0)
+ value |= MDSS_UBWC_STATIC_UBWC_MIN_ACC_LEN(1);
writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
- if (data->ubwc_dec_version == UBWC_6_0)
- writel_relaxed(5, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
+ if (data->ubwc_enc_version < UBWC_4_0)
+ prediction_mode = 0;
else
- writel_relaxed(4, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
-
- writel_relaxed(1, msm_mdss->mmio + REG_MDSS_UBWC_PREDICTION_MODE);
+ prediction_mode = 1;
+
+ if (data->ubwc_enc_version >= UBWC_6_0)
+ ver = 5;
+ else if (data->ubwc_enc_version >= UBWC_5_0)
+ ver = 4;
+ else if (data->ubwc_enc_version >= UBWC_4_3)
+ ver = 3;
+ else if (data->ubwc_enc_version >= UBWC_4_0)
+ ver = 2;
+ else if (data->ubwc_enc_version >= UBWC_3_0)
+ ver = 1;
+ else /* UBWC 1.0 and 2.0 */
+ ver = 0;
+
+ writel_relaxed(ver, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
+ writel_relaxed(prediction_mode, msm_mdss->mmio + REG_MDSS_UBWC_PREDICTION_MODE);
}
+#define MDSS_HW_VER(major, minor, step) \
+ ((((major) & 0xf) << 28) | \
+ (((minor) & 0xfff) << 16) | \
+ ((step) & 0xffff))
+
static int msm_mdss_enable(struct msm_mdss *msm_mdss)
{
int ret, i;
+ u32 hw_rev;
/*
* Several components have AXI clocks that can only be turned on if
@@ -275,43 +270,15 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)
if (msm_mdss->is_mdp5 || !msm_mdss->mdss_data)
return 0;
- /*
- * ubwc config is part of the "mdss" region which is not accessible
- * from the rest of the driver. hardcode known configurations here
- *
- * Decoder version can be read from the UBWC_DEC_HW_VERSION reg,
- * UBWC_n and the rest of params comes from hw data.
- */
- switch (msm_mdss->mdss_data->ubwc_dec_version) {
- case 0: /* no UBWC */
- case UBWC_1_0:
- /* do nothing */
- break;
- case UBWC_2_0:
- msm_mdss_setup_ubwc_dec_20(msm_mdss);
- break;
- case UBWC_3_0:
- msm_mdss_setup_ubwc_dec_30(msm_mdss);
- break;
- case UBWC_4_0:
- case UBWC_4_3:
- msm_mdss_setup_ubwc_dec_40(msm_mdss);
- break;
- case UBWC_5_0:
- msm_mdss_setup_ubwc_dec_50(msm_mdss);
- break;
- case UBWC_6_0:
- msm_mdss_setup_ubwc_dec_50(msm_mdss);
- break;
- default:
- dev_err(msm_mdss->dev, "Unsupported UBWC decoder version %x\n",
- msm_mdss->mdss_data->ubwc_dec_version);
- dev_err(msm_mdss->dev, "HW_REV: 0x%x\n",
- readl_relaxed(msm_mdss->mmio + REG_MDSS_HW_VERSION));
- dev_err(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n",
- readl_relaxed(msm_mdss->mmio + REG_MDSS_UBWC_DEC_HW_VERSION));
- break;
- }
+ hw_rev = readl_relaxed(msm_mdss->mmio + REG_MDSS_HW_VERSION);
+
+ if (hw_rev >= MDSS_HW_VER(6, 0, 0))
+ msm_mdss_6x_setup_ubwc(msm_mdss);
+ else if (hw_rev >= MDSS_HW_VER(5, 0, 0))
+ msm_mdss_5x_setup_ubwc(msm_mdss);
+ else if (hw_rev >= MDSS_HW_VER(4, 0, 0))
+ msm_mdss_4x_setup_ubwc(msm_mdss);
+ /* else UBWC 1.0 or none, no params to program */
return ret;
}
--
2.47.3
next prev parent reply other threads:[~2026-03-12 13:29 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-12 13:29 [PATCH v3 00/27] soc/qcom/ubwc: rework UBWC configuration database Dmitry Baryshkov
2026-03-12 13:29 ` Dmitry Baryshkov [this message]
2026-03-13 4:12 ` Claude review: drm/msm/mdss: correct UBWC programming sequences Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 02/27] soc: qcom: ubwc: define UBWC 3.1 Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 03/27] soc: qcom: ubwc: define helper for MDSS and Adreno drivers Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 04/27] soc: qcom: ubwc: add helper controlling AMSBC enablement Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 05/27] drm/msm/adreno: Trust the SSoT UBWC config Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 06/27] drm/msm/adreno: use qcom_ubwc_version_tag() helper Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 07/27] drm/msm/mdss: " Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 08/27] drm/msm/adreno: use new helper to set min_acc length Dmitry Baryshkov
2026-03-12 13:29 ` [PATCH v3 09/27] drm/msm/mdss: " Dmitry Baryshkov
2026-03-12 13:29 ` [PATCH v3 10/27] drm/msm/adreno: use new helper to set macrotile_mode Dmitry Baryshkov
2026-03-12 13:29 ` [PATCH v3 11/27] drm/msm/mdss: " Dmitry Baryshkov
2026-03-12 13:29 ` [PATCH v3 12/27] drm/msm/mdss: use new helper to set UBWC bank spreading Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 13/27] drm/msm/adreno: use new helper to set ubwc_swizzle Dmitry Baryshkov
2026-03-12 13:29 ` [PATCH v3 14/27] drm/msm/dpu: " Dmitry Baryshkov
2026-03-12 13:29 ` [PATCH v3 15/27] drm/msm/mdss: " Dmitry Baryshkov
2026-03-12 13:29 ` [PATCH v3 16/27] drm/msm/adreno: use new helper to set amsbc Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 17/27] drm/msm/mdss: " Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 18/27] drm/msm/dpu: drop ubwc_dec_version Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 19/27] drm/msm/dpu: invert the order of UBWC checks Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 20/27] drm/msm/adreno: adapt for UBWC 3.1 support Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 21/27] soc: qcom: ubwc: set min_acc length to 64 for all UBWC 1.0 targets Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 22/27] soc: qcom: ubwc: drop ubwc_dec_version Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 23/27] soc: qcom: ubwc: drop ubwc_bank_spread Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 24/27] soc: qcom: ubwc: drop macrotile_mode from the database Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 25/27] soc: qcom: ubwc: use fixed values for UBWC swizzle for UBWC < 4.0 Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 26/27] soc: qcom: ubwc: sort out the rest of the UBWC swizzle settings Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-12 13:29 ` [PATCH v3 27/27] soc: qcom: ubwc: deduplicate UBWC configuration data Dmitry Baryshkov
2026-03-13 4:12 ` Claude review: " Claude Code Review Bot
2026-03-13 4:12 ` Claude review: soc/qcom/ubwc: rework UBWC configuration database Claude Code Review Bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260312-ubwc-rework-v3-1-b7e8f800176a@oss.qualcomm.com \
--to=dmitry.baryshkov@oss.qualcomm.com \
--cc=abhinav.kumar@linux.dev \
--cc=airlied@gmail.com \
--cc=akhilpo@oss.qualcomm.com \
--cc=andersson@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=jesszhan0024@gmail.com \
--cc=konradybcio@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lumag@kernel.org \
--cc=marijn.suijten@somainline.org \
--cc=robin.clark@oss.qualcomm.com \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox