* [PATCH 01/15] drm/msm/a6xx: Honor perfmode_bw threshold on A8x
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 11:18 ` Konrad Dybcio
2026-09-23 12:11 ` Dmitry Baryshkov
2026-09-23 10:25 ` [PATCH 02/15] drm/msm/a6xx: Fix secondary rail vote in ARC votes Akhil P Oommen
` (14 subsequent siblings)
15 siblings, 2 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree
Instead of voting ACV for all bw corners for A8x GPU, restrict it to BW
votes above the perfmode_bw threshold, similar to the A7x GPUs.
Fixes: 288a93200892 ("drm/msm/adreno: Introduce A8x GPU Support")
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 8 ++++++--
drivers/gpu/drm/msm/adreno/adreno_gpu.h | 5 +++++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 6d49c51df1a2..baf77a620572 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1656,8 +1656,12 @@ static int a6xx_gmu_rpmh_bw_votes_init(struct adreno_gpu *adreno_gpu,
if (bcm->fixed) {
u32 perfmode = 0;
- /* GMU on A6xx votes perfmode on all valid bandwidth */
- if (!adreno_is_a7xx(adreno_gpu) ||
+ /*
+ * GMU on A6xx votes perfmode on all valid
+ * bandwidth. A7xx and A8xx only vote perfmode
+ * above the perfmode_bw threshold.
+ */
+ if (adreno_is_a6xx(adreno_gpu) ||
(bcm->perfmode_bw && bw >= bcm->perfmode_bw))
perfmode = bcm->perfmode;
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
index 114a40f79ef3..bd5c440f1753 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
@@ -580,6 +580,11 @@ static inline int adreno_is_a750_family(struct adreno_gpu *gpu)
return gpu->info->family == ADRENO_7XX_GEN3;
}
+static inline int adreno_is_a6xx(struct adreno_gpu *gpu)
+{
+ return (gpu->info->family >= ADRENO_6XX_GEN1) && (gpu->info->family < ADRENO_7XX_GEN1);
+}
+
static inline int adreno_is_a7xx(struct adreno_gpu *gpu)
{
/* Update with non-fake (i.e. non-A702) Gen 7 GPUs */
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 01/15] drm/msm/a6xx: Honor perfmode_bw threshold on A8x
2026-09-23 10:25 ` [PATCH 01/15] drm/msm/a6xx: Honor perfmode_bw threshold on A8x Akhil P Oommen
@ 2026-09-23 11:18 ` Konrad Dybcio
2026-09-23 12:11 ` Dmitry Baryshkov
1 sibling, 0 replies; 22+ messages in thread
From: Konrad Dybcio @ 2026-09-23 11:18 UTC (permalink / raw)
To: Akhil P Oommen, Rob Clark, Sean Paul, Konrad Dybcio,
Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Marijn Suijten,
David Airlie, Simona Vetter, Jordan Crouse, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, devicetree
On 9/23/26 12:25 PM, Akhil P Oommen wrote:
> Instead of voting ACV for all bw corners for A8x GPU, restrict it to BW
> votes above the perfmode_bw threshold, similar to the A7x GPUs.
>
> Fixes: 288a93200892 ("drm/msm/adreno: Introduce A8x GPU Support")
> Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 01/15] drm/msm/a6xx: Honor perfmode_bw threshold on A8x
2026-09-23 10:25 ` [PATCH 01/15] drm/msm/a6xx: Honor perfmode_bw threshold on A8x Akhil P Oommen
2026-09-23 11:18 ` Konrad Dybcio
@ 2026-09-23 12:11 ` Dmitry Baryshkov
1 sibling, 0 replies; 22+ messages in thread
From: Dmitry Baryshkov @ 2026-09-23 12:11 UTC (permalink / raw)
To: Akhil P Oommen
Cc: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, linux-arm-msm, dri-devel,
freedreno, linux-kernel, devicetree
On Wed, Sep 23, 2026 at 03:55:41PM +0530, Akhil P Oommen wrote:
> Instead of voting ACV for all bw corners for A8x GPU, restrict it to BW
> votes above the perfmode_bw threshold, similar to the A7x GPUs.
>
> Fixes: 288a93200892 ("drm/msm/adreno: Introduce A8x GPU Support")
> Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
> ---
> drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 8 ++++++--
> drivers/gpu/drm/msm/adreno/adreno_gpu.h | 5 +++++
> 2 files changed, 11 insertions(+), 2 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 02/15] drm/msm/a6xx: Fix secondary rail vote in ARC votes
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
2026-09-23 10:25 ` [PATCH 01/15] drm/msm/a6xx: Honor perfmode_bw threshold on A8x Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 03/15] drm/msm/a6xx: Fix RPMH dependency votes Akhil P Oommen
` (13 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Konrad Dybcio
Using the requested level can pick a secondary corner lower than the one
required to support the chosen primary corner, under-voting the
dependent rail. To fix this, match against the selected primary voltage
instead.
Fixes: 4b565ca5a2cb ("drm/msm: Add A6XX device support")
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index baf77a620572..d072646093a1 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1765,10 +1765,14 @@ static int a6xx_gmu_rpmh_arc_votes_init(struct device *dev, u32 *votes,
/*
* Look for a level in in the secondary list that matches. If
* nothing fits, use the maximum non zero vote
+ *
+ * The secondary rail depends on the primary rail, so match it
+ * against the quantized primary voltage (which is >= the
+ * requested level), not the requested level itself.
*/
for (j = 0; j < sec_count; j++) {
- if (sec[j] >= level) {
+ if (sec[j] >= pri[pindex]) {
sindex = j;
break;
} else if (sec[j]) {
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 03/15] drm/msm/a6xx: Fix RPMH dependency votes
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
2026-09-23 10:25 ` [PATCH 01/15] drm/msm/a6xx: Honor perfmode_bw threshold on A8x Akhil P Oommen
2026-09-23 10:25 ` [PATCH 02/15] drm/msm/a6xx: Fix secondary rail vote in ARC votes Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 12:12 ` Dmitry Baryshkov
2026-09-23 10:25 ` [PATCH 04/15] drm/msm/a6xx: Factor out RPMh arc-vote helpers Akhil P Oommen
` (12 subsequent siblings)
15 siblings, 1 reply; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Konrad Dybcio
a6xx_gmu_rpmh_dep_votes_init() iterates the GPU frequency list
(gmu->gpu_freqs) but was passed gmu->dev to resolve each frequency to an
arc level. This results in generation of incorrect dependency votes
table. To fix this, pass gpu->pdev->dev, which owns the GPU OPP table.
Also, reorder the dependency vote init to improve clarity.
Fixes: 06cfbca0e1c6 ("drm/msm/a6xx: Share dependency vote table with GMU")
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index d072646093a1..161b360bf3eb 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1868,13 +1868,13 @@ static int a6xx_gmu_rpmh_votes_init(struct a6xx_gmu *gmu)
ret = a6xx_gmu_rpmh_arc_votes_init(&gpu->pdev->dev, gmu->gx_arc_votes,
gmu->gpu_freqs, gmu->nr_gpu_freqs, "gfx.lvl", sec_id);
+ ret |= a6xx_gmu_rpmh_dep_votes_init(&gpu->pdev->dev, gmu->dep_arc_votes,
+ gmu->gpu_freqs, gmu->nr_gpu_freqs);
+
/* Build the CX votes */
ret |= a6xx_gmu_rpmh_arc_votes_init(gmu->dev, gmu->cx_arc_votes,
gmu->gmu_freqs, gmu->nr_gmu_freqs, "cx.lvl", "mx.lvl");
- ret |= a6xx_gmu_rpmh_dep_votes_init(gmu->dev, gmu->dep_arc_votes,
- gmu->gpu_freqs, gmu->nr_gpu_freqs);
-
/* Build the interconnect votes */
if (info->bcms && gmu->nr_gpu_bws > 1)
ret |= a6xx_gmu_rpmh_bw_votes_init(adreno_gpu, info, gmu);
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 03/15] drm/msm/a6xx: Fix RPMH dependency votes
2026-09-23 10:25 ` [PATCH 03/15] drm/msm/a6xx: Fix RPMH dependency votes Akhil P Oommen
@ 2026-09-23 12:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 22+ messages in thread
From: Dmitry Baryshkov @ 2026-09-23 12:12 UTC (permalink / raw)
To: Akhil P Oommen
Cc: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, linux-arm-msm, dri-devel,
freedreno, linux-kernel, devicetree, Konrad Dybcio
On Wed, Sep 23, 2026 at 03:55:43PM +0530, Akhil P Oommen wrote:
> a6xx_gmu_rpmh_dep_votes_init() iterates the GPU frequency list
> (gmu->gpu_freqs) but was passed gmu->dev to resolve each frequency to an
> arc level. This results in generation of incorrect dependency votes
> table. To fix this, pass gpu->pdev->dev, which owns the GPU OPP table.
>
> Also, reorder the dependency vote init to improve clarity.
>
> Fixes: 06cfbca0e1c6 ("drm/msm/a6xx: Share dependency vote table with GMU")
> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
> ---
> drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 04/15] drm/msm/a6xx: Factor out RPMh arc-vote helpers
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (2 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 03/15] drm/msm/a6xx: Fix RPMH dependency votes Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 05/15] drm/msm/a6xx: Add BX rail support to GMU dependency votes Akhil P Oommen
` (11 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree
The GMU RPMh vote construction repeats two patterns across
a6xx_gmu_rpmh_arc_votes_init() and a6xx_gmu_rpmh_dep_votes_init():
reading a cmd-db aux-data resource (with the same "halve the byte count
and reject empty" handling), and scanning an arc level array for the
first corner that satisfies a target level.
Refactor out a6xx_gmu_rpmh_read_arc() and a6xx_gmu_rpmh_arc_index() to
reduce code duplication and improve code readability.
Assisted-by: LLM
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 138 ++++++++++++++++------------------
1 file changed, 63 insertions(+), 75 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 161b360bf3eb..0ed01ce1c5c5 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1711,74 +1711,85 @@ static unsigned int a6xx_gmu_get_arc_level(struct device *dev,
return val;
}
+static const u16 *a6xx_gmu_rpmh_read_arc(const char *id, size_t *count)
+{
+ const u16 *vals;
+
+ vals = cmd_db_read_aux_data(id, count);
+ if (IS_ERR(vals))
+ return vals;
+
+ *count >>= 1;
+ /* Exclude the trailing zero paddings if there are any */
+ while (*count && !vals[*count - 1])
+ (*count)--;
+
+ if (!*count)
+ return ERR_PTR(-EINVAL);
+
+ return vals;
+}
+
+/*
+ * Find the first index in an arc level array whose level is greater than or
+ * equal to the target. If no level is high enough, either clamp to the
+ * highest available level (@clamp) or fail, dumping the list.
+ */
+static int a6xx_gmu_rpmh_arc_index(struct device *dev, const u16 *arc,
+ size_t arc_count, unsigned int level, bool clamp)
+{
+ int j;
+
+ for (j = 0; j < arc_count; j++) {
+ if (arc[j] >= level)
+ return j;
+ }
+
+ if (clamp)
+ return arc_count - 1;
+
+ DRM_DEV_ERROR(dev, "Level %u not found in the RPMh list\n", level);
+ DRM_DEV_ERROR(dev, "Available levels:\n");
+ for (j = 0; j < arc_count; j++)
+ DRM_DEV_ERROR(dev, " %u\n", arc[j]);
+
+ return -EINVAL;
+}
+
static int a6xx_gmu_rpmh_arc_votes_init(struct device *dev, u32 *votes,
unsigned long *freqs, int freqs_count,
const char *pri_id, const char *sec_id)
{
- int i, j;
+ int i;
const u16 *pri, *sec;
size_t pri_count, sec_count;
- pri = cmd_db_read_aux_data(pri_id, &pri_count);
+ pri = a6xx_gmu_rpmh_read_arc(pri_id, &pri_count);
if (IS_ERR(pri))
return PTR_ERR(pri);
- /*
- * The data comes back as an array of unsigned shorts so adjust the
- * count accordingly
- */
- pri_count >>= 1;
- if (!pri_count)
- return -EINVAL;
- sec = cmd_db_read_aux_data(sec_id, &sec_count);
+ sec = a6xx_gmu_rpmh_read_arc(sec_id, &sec_count);
if (IS_ERR(sec))
return PTR_ERR(sec);
- sec_count >>= 1;
- if (!sec_count)
- return -EINVAL;
-
/* Construct a vote for each frequency */
for (i = 0; i < freqs_count; i++) {
- u8 pindex = 0, sindex = 0;
unsigned int level = a6xx_gmu_get_arc_level(dev, freqs[i]);
+ int pindex, sindex;
- /* Get the primary index that matches the arc level */
- for (j = 0; j < pri_count; j++) {
- if (pri[j] >= level) {
- pindex = j;
- break;
- }
- }
-
- if (j == pri_count) {
- DRM_DEV_ERROR(dev,
- "Level %u not found in the RPMh list\n",
- level);
- DRM_DEV_ERROR(dev, "Available levels:\n");
- for (j = 0; j < pri_count; j++)
- DRM_DEV_ERROR(dev, " %u\n", pri[j]);
-
- return -EINVAL;
- }
+ pindex = a6xx_gmu_rpmh_arc_index(dev, pri, pri_count, level, false);
+ if (pindex < 0)
+ return pindex;
/*
- * Look for a level in in the secondary list that matches. If
- * nothing fits, use the maximum non zero vote
- *
- * The secondary rail depends on the primary rail, so match it
- * against the quantized primary voltage (which is >= the
- * requested level), not the requested level itself.
+ * Look for a matching level in the secondary list; if nothing
+ * fits, clamp to the highest available vote. The secondary rail
+ * depends on the primary rail, so match it against the selected
+ * primary voltage (which is >= the requested level), not the
+ * requested level itself.
*/
-
- for (j = 0; j < sec_count; j++) {
- if (sec[j] >= pri[pindex]) {
- sindex = j;
- break;
- } else if (sec[j]) {
- sindex = j;
- }
- }
+ sindex = a6xx_gmu_rpmh_arc_index(dev, sec, sec_count,
+ pri[pindex], true);
/* Construct the vote */
votes[i] = ((pri[pindex] & 0xffff) << 16) |
@@ -1794,16 +1805,9 @@ static int a6xx_gmu_rpmh_dep_votes_init(struct device *dev, u32 *votes,
const u16 *mx;
size_t count;
- mx = cmd_db_read_aux_data("mx.lvl", &count);
+ mx = a6xx_gmu_rpmh_read_arc("mx.lvl", &count);
if (IS_ERR(mx))
return PTR_ERR(mx);
- /*
- * The data comes back as an array of unsigned shorts so adjust the
- * count accordingly
- */
- count >>= 1;
- if (!count)
- return -EINVAL;
/* Fix the vote for zero frequency */
votes[0] = 0xffffffff;
@@ -1811,26 +1815,10 @@ static int a6xx_gmu_rpmh_dep_votes_init(struct device *dev, u32 *votes,
/* Construct a vote for rest of the corners */
for (int i = 1; i < freqs_count; i++) {
unsigned int level = a6xx_gmu_get_arc_level(dev, freqs[i]);
- u8 j, index = 0;
+ int index = a6xx_gmu_rpmh_arc_index(dev, mx, count, level, false);
- /* Get the primary index that matches the arc level */
- for (j = 0; j < count; j++) {
- if (mx[j] >= level) {
- index = j;
- break;
- }
- }
-
- if (j == count) {
- DRM_DEV_ERROR(dev,
- "Mx Level %u not found in the RPMh list\n",
- level);
- DRM_DEV_ERROR(dev, "Available levels:\n");
- for (j = 0; j < count; j++)
- DRM_DEV_ERROR(dev, " %u\n", mx[j]);
-
- return -EINVAL;
- }
+ if (index < 0)
+ return index;
/* Construct the vote */
votes[i] = (0x3fff << 14) | (index << 8) | (0xff);
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 05/15] drm/msm/a6xx: Add BX rail support to GMU dependency votes
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (3 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 04/15] drm/msm/a6xx: Factor out RPMh arc-vote helpers Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 06/15] drm/msm/a6xx: Clamp MX dependency vote Akhil P Oommen
` (10 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree
Some A8x targets have a third memory rail (BX) in addition to GX and MX.
On these targets the GMU dependency vote carries a per-corner BX vote in
bits 25:20, which otherwise default to all-ones (no BX constraint).
Prepare BX vote field to pass this new voltage recommendation to GMU.
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 37 +++++++++++++++++++++++++++++++++--
1 file changed, 35 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 0ed01ce1c5c5..2b66d6c7fd19 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1799,16 +1799,34 @@ static int a6xx_gmu_rpmh_arc_votes_init(struct device *dev, u32 *votes,
return 0;
}
+#define GMU_BX_MASK GENMASK(25, 20)
+
static int a6xx_gmu_rpmh_dep_votes_init(struct device *dev, u32 *votes,
unsigned long *freqs, int freqs_count)
{
- const u16 *mx;
- size_t count;
+ const u16 *mx, *gx = NULL, *gbx;
+ size_t count, gx_count = 0, gbx_count = 0;
mx = a6xx_gmu_rpmh_read_arc("mx.lvl", &count);
if (IS_ERR(mx))
return PTR_ERR(mx);
+ /*
+ * Targets with a third memory rail (BX), in addition to GX and MX,
+ * expect a per-corner BX vote packed into the dependency vote. Detect
+ * such targets by the presence of the "gbx.lvl" RPMh resource. The BX
+ * corner is matched against the Gx rail level, so the "gfx.lvl" corners
+ * are needed as well.
+ */
+ gbx = a6xx_gmu_rpmh_read_arc("gbx.lvl", &gbx_count);
+ if (IS_ERR(gbx)) {
+ gbx = NULL;
+ } else {
+ gx = a6xx_gmu_rpmh_read_arc("gfx.lvl", &gx_count);
+ if (IS_ERR(gx))
+ return PTR_ERR(gx);
+ }
+
/* Fix the vote for zero frequency */
votes[0] = 0xffffffff;
@@ -1816,12 +1834,27 @@ static int a6xx_gmu_rpmh_dep_votes_init(struct device *dev, u32 *votes,
for (int i = 1; i < freqs_count; i++) {
unsigned int level = a6xx_gmu_get_arc_level(dev, freqs[i]);
int index = a6xx_gmu_rpmh_arc_index(dev, mx, count, level, false);
+ int bx;
if (index < 0)
return index;
/* Construct the vote */
votes[i] = (0x3fff << 14) | (index << 8) | (0xff);
+
+ if (!gbx)
+ continue;
+
+ index = a6xx_gmu_rpmh_arc_index(dev, gx, gx_count, level, false);
+ if (index < 0)
+ return index;
+
+ /*
+ * Find the BX corner that satisfies that Gx level, falling
+ * back to the highest BX corner if none is high enough.
+ */
+ bx = a6xx_gmu_rpmh_arc_index(dev, gbx, gbx_count, gx[index], true);
+ FIELD_MODIFY(GMU_BX_MASK, &votes[i], bx);
}
return 0;
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 06/15] drm/msm/a6xx: Clamp MX dependency vote
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (4 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 05/15] drm/msm/a6xx: Add BX rail support to GMU dependency votes Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 11:19 ` Konrad Dybcio
2026-09-23 10:25 ` [PATCH 07/15] drm/msm/a8xx: Add Adreno 850 support Akhil P Oommen
` (9 subsequent siblings)
15 siblings, 1 reply; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree
In some chipsets like Hawi, the GPU arc level can exceed the highest
available MX corner. In that case, use the highest non-zero MX vote instead
of failing GMU initialization.
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 2b66d6c7fd19..14d422d7ab95 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1833,7 +1833,7 @@ static int a6xx_gmu_rpmh_dep_votes_init(struct device *dev, u32 *votes,
/* Construct a vote for rest of the corners */
for (int i = 1; i < freqs_count; i++) {
unsigned int level = a6xx_gmu_get_arc_level(dev, freqs[i]);
- int index = a6xx_gmu_rpmh_arc_index(dev, mx, count, level, false);
+ int index = a6xx_gmu_rpmh_arc_index(dev, mx, count, level, true);
int bx;
if (index < 0)
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 06/15] drm/msm/a6xx: Clamp MX dependency vote
2026-09-23 10:25 ` [PATCH 06/15] drm/msm/a6xx: Clamp MX dependency vote Akhil P Oommen
@ 2026-09-23 11:19 ` Konrad Dybcio
0 siblings, 0 replies; 22+ messages in thread
From: Konrad Dybcio @ 2026-09-23 11:19 UTC (permalink / raw)
To: Akhil P Oommen, Rob Clark, Sean Paul, Konrad Dybcio,
Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Marijn Suijten,
David Airlie, Simona Vetter, Jordan Crouse, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, devicetree
On 9/23/26 12:25 PM, Akhil P Oommen wrote:
> In some chipsets like Hawi, the GPU arc level can exceed the highest
> available MX corner. In that case, use the highest non-zero MX vote instead
> of failing GMU initialization.
>
> Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 07/15] drm/msm/a8xx: Add Adreno 850 support
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (5 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 06/15] drm/msm/a6xx: Clamp MX dependency vote Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 08/15] drm/msm/a6xx: Send THINMEM config to GMU for A850 Akhil P Oommen
` (8 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree
Adreno 850 is the next generation of A8x GPU present in Hawi SoC. It shares
the ADRENO_8XX_GEN2 family and slice architecture with A840, but has many
architectural improvements. There is a new block Matrix ALU (MALU) which
helps to accelerate certain compute workloads. Also, there is a new Bx rail
that powers a part of the GPU IP. GMU is now powered by a dedicated GDSC
powered by MxG rail.
Add a new catalog entry along with the necessary register lists and
additional changes to support the aforementioned new features.
Hawi SoC support UBWC v7.0, but GPU is unaffected by this upgrade.
Assisted-by: LLM
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 343 ++++++++++++++++++++++++++
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 50 +++-
drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 1 +
drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 16 +-
drivers/gpu/drm/msm/adreno/adreno_gpu.h | 5 +
drivers/gpu/drm/msm/registers/adreno/a6xx.xml | 8 +
6 files changed, 414 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
index 90a0c7ffb3c8..de576816ec7c 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
@@ -2397,6 +2397,307 @@ static const struct adreno_reglist_pipe a840_dyn_pwrup_reglist_regs[] = {
};
DECLARE_ADRENO_REGLIST_PIPE_LIST(a840_dyn_pwrup_reglist);
+static const struct adreno_reglist_pipe a850_nonctxt_regs[] = {
+ { REG_A8XX_CP_SMMU_STREAM_ID_LPAC, 0x00000101, BIT(PIPE_NONE) },
+ { REG_A8XX_CP_MULTIDRAW_CNTL, 0x00000001, BIT(PIPE_NONE) },
+ { REG_A8XX_GRAS_DBG_ECO_CNTL, 0x01000800, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_GRAS_TSEFE_DBG_ECO_CNTL, 0x00200000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A6XX_PC_AUTO_VERTEX_STRIDE, 0x00000001, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_VIS_STREAM_CNTL, 0x10010000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CONTEXT_SWITCH_STABILIZE_CNTL_1, 0x00000002, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_1, 0x00000003, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_2, 0x00000200, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_3, 0x00400000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_4, 0x00500050, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_5, BIT(28), BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A7XX_RB_CCU_CNTL, 0x00000068, BIT(PIPE_BR) },
+ { REG_A7XX_RB_CCU_DBG_ECO_CNTL, BIT(10) | BIT(9), BIT(PIPE_BR) },
+ { REG_A6XX_RB_DBG_ECO_CNTL, BIT(17), BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_RB_GC_GMEM_PROTECT, 0x12000000, BIT(PIPE_BR) },
+ { REG_A6XX_RB_RBP_CNTL, BIT(5) | BIT(6), BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_RB_RESOLVE_PREFETCH_CNTL, 0x00000007, BIT(PIPE_BR) },
+ { REG_A8XX_RB_CMP_DBG_ECO_CNTL, 0x00004000, BIT(PIPE_BR) },
+ { REG_A8XX_RBBM_NC_MODE_CNTL, 0x00000001, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_SLICE_NC_MODE_CNTL, 0x00000001, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_SLICE_PERFCTR_CNTL, BIT(0), BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_POWER_UP_RESET_SW_OVERRIDE, 0x70809060, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_POWER_UP_RESET_SW_BV_OVERRIDE, 0x30000000, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_WAIT_IDLE_CLOCKS_CNTL, 0x00000030, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_WAIT_IDLE_CLOCKS_CNTL2, 0x00000030, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_GBIF_CLIENT_QOS_CNTL, 0x22122212, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_CGC_P2S_CNTL, 0x00000040, BIT(PIPE_NONE) },
+ { REG_A6XX_SP_CHICKEN_BITS, BIT(24), BIT(PIPE_NONE) },
+ { REG_A7XX_SP_CHICKEN_BITS_2, 0x00820800, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_CHICKEN_BITS_3, 0x00300000, BIT(PIPE_NONE) },
+ { REG_A8XX_SP_CHICKEN_BITS_5, BIT(3), BIT(PIPE_NONE) },
+ { REG_A6XX_SP_PERFCTR_SHADER_MASK, 0x0000003f, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_HLSQ_DBG_ECO_CNTL, 0x04000000, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_HLSQ_DBG_ECO_CNTL_1, BIT(17), BIT(PIPE_NONE) },
+ { REG_A8XX_SP_HLSQ_DBG_ECO_CNTL_3, BIT(1), BIT(PIPE_NONE) },
+ { REG_A7XX_SP_HLSQ_TIMEOUT_THRESHOLD_DP, 0x00000080, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_READ_SEL, 0x0001ff00, BIT(PIPE_NONE) },
+ { REG_A8XX_SP_L0_PERF_TUNE, 0x00000024, BIT(PIPE_NONE) },
+ { REG_A6XX_TPL1_DBG_ECO_CNTL, 0x10100000, BIT(PIPE_NONE) },
+ { REG_A6XX_TPL1_DBG_ECO_CNTL1, 0x00000720, BIT(PIPE_NONE) },
+ { REG_A6XX_UCHE_MODE_CNTL, 0x80080000, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_CCHE_MODE_CNTL, 0x00001000, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_DBG_ECO_CNTL_0, BIT(31), BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_HW_DBG_CNTL, 0x01410000, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_CCHE_CACHE_WAYS, 0x00000800, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_GBIF_GX_CONFIG, 0x010240e0, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_VARB_IDLE_TIMEOUT, 0x00000020, BIT(PIPE_NONE) },
+ { REG_A7XX_VFD_DBG_ECO_CNTL, 0x00008000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BV_THRESHOLD, 0x00500050, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BR_THRESHOLD, 0x00600060, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BUSY_REQ_CNT, 0x00200020, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_LP_REQ_CNT, 0x00080020, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VPC_FLATSHADE_MODE_CNTL, 0x00000001, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VSC_VISIBILITY_FLUSH_CNTL, 0x00080004, BIT(PIPE_NONE) },
+ { },
+};
+
+static const u32 a850_protect_regs[] = {
+ A6XX_PROTECT_RDONLY(0x00008, 0x039b),
+ A6XX_PROTECT_RDONLY(0x003b4, 0x008b),
+ A6XX_PROTECT_NORDWR(0x00440, 0x001f),
+ A6XX_PROTECT_RDONLY(0x00580, 0x005f),
+ A6XX_PROTECT_NORDWR(0x005e0, 0x011f),
+ A6XX_PROTECT_RDONLY(0x0074a, 0x0005),
+ A6XX_PROTECT_RDONLY(0x00759, 0x001b),
+ A6XX_PROTECT_NORDWR(0x00775, 0x000a),
+ A6XX_PROTECT_RDONLY(0x00789, 0x0000),
+ A6XX_PROTECT_RDONLY(0x0078c, 0x0013),
+ A6XX_PROTECT_NORDWR(0x00800, 0x0029),
+ A6XX_PROTECT_NORDWR(0x00837, 0x00af),
+ A6XX_PROTECT_RDONLY(0x008e7, 0x00c9),
+ A6XX_PROTECT_NORDWR(0x008ec, 0x00c3),
+ A6XX_PROTECT_NORDWR(0x009b1, 0x0250),
+ A6XX_PROTECT_NORDWR(0x00c07, 0x0008),
+ A6XX_PROTECT_RDONLY(0x00ce0, 0x0001),
+ A6XX_PROTECT_RDONLY(0x00df0, 0x0000),
+ A6XX_PROTECT_NORDWR(0x00df1, 0x0000),
+ A6XX_PROTECT_NORDWR(0x00df5, 0x0003),
+ A6XX_PROTECT_RDONLY(0x00df9, 0x0007),
+ A6XX_PROTECT_NORDWR(0x00e01, 0x0000),
+ A6XX_PROTECT_NORDWR(0x00e03, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x03c00, 0x00c5),
+ A6XX_PROTECT_RDONLY(0x03cc6, 0x0039),
+ A6XX_PROTECT_NORDWR(0x03d00, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x08600, 0x01ff),
+ A6XX_PROTECT_NORDWR(0x08e00, 0x00ff),
+ A6XX_PROTECT_RDONLY(0x08f00, 0x0000),
+ A6XX_PROTECT_NORDWR(0x08f01, 0x01be),
+ A6XX_PROTECT_NORDWR(0x09600, 0x01ff),
+ A6XX_PROTECT_RDONLY(0x0981a, 0x02e5),
+ A6XX_PROTECT_NORDWR(0x09e00, 0x01ff),
+ A6XX_PROTECT_NORDWR(0x0a600, 0x01ff),
+ A6XX_PROTECT_NORDWR(0x0a82e, 0x0000),
+ A6XX_PROTECT_NORDWR(0x0ae00, 0x0000),
+ A6XX_PROTECT_NORDWR(0x0ae02, 0x0004),
+ A6XX_PROTECT_NORDWR(0x0ae08, 0x0006),
+ A6XX_PROTECT_NORDWR(0x0ae10, 0x00bf),
+ A6XX_PROTECT_RDONLY(0x0aed0, 0x002f),
+ A6XX_PROTECT_NORDWR(0x0af00, 0x027f),
+ A6XX_PROTECT_NORDWR(0x0b600, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x0dc00, 0x1fff),
+ A6XX_PROTECT_RDONLY(0x0fc00, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x18400, 0x003f),
+ A6XX_PROTECT_RDONLY(0x18440, 0x013f),
+ A6XX_PROTECT_NORDWR(0x18580, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x1ac00, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x1cc00, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x1f400, 0x0477),
+ A6XX_PROTECT_RDONLY(0x1f878, 0x0507),
+ A6XX_PROTECT_NORDWR(0x1f930, 0x0329),
+ A6XX_PROTECT_NORDWR(0x1fd80, 0x1fff),
+ A6XX_PROTECT_NORDWR(0x27800, 0x007f),
+ A6XX_PROTECT_RDONLY(0x27880, 0x0385),
+ A6XX_PROTECT_NORDWR(0x27882, 0x0035),
+ A6XX_PROTECT_NORDWR(0x27c06, 0x0000),
+};
+DECLARE_ADRENO_PROTECT(a850_protect, 15);
+
+static const u32 a850_pwrup_reglist_regs[] = {
+ REG_A8XX_RB_CMP_NC_MODE_CNTL,
+ REG_A8XX_SP_HLSQ_GC_GMEM_RANGE_MIN,
+ REG_A8XX_SP_HLSQ_GC_GMEM_RANGE_MIN + 1,
+ REG_A7XX_SP_HLSQ_TIMEOUT_THRESHOLD_DP,
+ REG_A7XX_SP_READ_SEL,
+ REG_A8XX_CP_MULTIDRAW_CNTL,
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(0),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(1),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(2),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(3),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(4),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(5),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(6),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(7),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(8),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(9),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(10),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(11),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(12),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(13),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(14),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(15),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(16),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(17),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(18),
+ REG_A8XX_TPL1_BICUBIC_WEIGHTS_TABLE(19),
+ REG_A6XX_TPL1_DBG_ECO_CNTL,
+ REG_A6XX_TPL1_DBG_ECO_CNTL1,
+ REG_A6XX_TPL1_NC_MODE_CNTL,
+ REG_A6XX_UCHE_MODE_CNTL,
+ REG_A8XX_UCHE_CCHE_MODE_CNTL,
+ REG_A8XX_UCHE_HW_DBG_CNTL,
+ REG_A8XX_UCHE_CCHE_CACHE_WAYS,
+ REG_A8XX_UCHE_CCHE_GC_GMEM_RANGE_MIN,
+ REG_A8XX_UCHE_CCHE_GC_GMEM_RANGE_MIN + 1,
+ REG_A8XX_UCHE_CCHE_LPAC_GMEM_RANGE_MIN,
+ REG_A8XX_UCHE_CCHE_LPAC_GMEM_RANGE_MIN + 1,
+ REG_A8XX_UCHE_CCHE_TRAP_BASE,
+ REG_A8XX_UCHE_CCHE_TRAP_BASE + 1,
+ REG_A8XX_UCHE_CCHE_WRITE_THRU_BASE,
+ REG_A8XX_UCHE_CCHE_WRITE_THRU_BASE + 1,
+ REG_A8XX_UCHE_CLIENT_PF,
+ REG_A8XX_UCHE_DBG_ECO_CNTL_0,
+ REG_A8XX_UCHE_GBIF_GX_CONFIG,
+ REG_A8XX_UCHE_TRAP_BASE,
+ REG_A8XX_UCHE_TRAP_BASE + 1,
+ REG_A8XX_UCHE_VARB_IDLE_TIMEOUT,
+ REG_A8XX_UCHE_WRITE_THRU_BASE,
+ REG_A8XX_UCHE_WRITE_THRU_BASE + 1,
+ REG_A8XX_VSC_VISIBILITY_FLUSH_CNTL,
+};
+DECLARE_ADRENO_REGLIST_LIST(a850_pwrup_reglist);
+
+static const u32 a850_ifpc_reglist_regs[] = {
+ REG_A8XX_CP_INTERRUPT_STATUS_MASK_GLOBAL,
+ REG_A8XX_RBBM_NC_MODE_CNTL,
+ REG_A8XX_RBBM_SLICE_INTERFACE_HANG_INT_CNTL,
+ REG_A8XX_RBBM_SLICE_NC_MODE_CNTL,
+ REG_A8XX_RBBM_SLICE_PERFCTR_CNTL,
+ REG_A6XX_SP_CHICKEN_BITS,
+ REG_A7XX_SP_CHICKEN_BITS_2,
+ REG_A7XX_SP_CHICKEN_BITS_3,
+ REG_A8XX_SP_CHICKEN_BITS_5,
+ REG_A7XX_SP_HLSQ_DBG_ECO_CNTL,
+ REG_A7XX_SP_HLSQ_DBG_ECO_CNTL_1,
+ REG_A8XX_SP_HLSQ_DBG_ECO_CNTL_3,
+ REG_A8XX_SP_HLSQ_LPAC_GMEM_RANGE_MIN,
+ REG_A8XX_SP_HLSQ_LPAC_GMEM_RANGE_MIN + 1,
+ REG_A6XX_SP_NC_MODE_CNTL,
+ REG_A6XX_SP_PERFCTR_SHADER_MASK,
+ REG_A8XX_SP_L0_PERF_TUNE,
+ REG_A8XX_CP_PROTECT_GLOBAL(0),
+ REG_A8XX_CP_PROTECT_GLOBAL(1),
+ REG_A8XX_CP_PROTECT_GLOBAL(2),
+ REG_A8XX_CP_PROTECT_GLOBAL(3),
+ REG_A8XX_CP_PROTECT_GLOBAL(4),
+ REG_A8XX_CP_PROTECT_GLOBAL(5),
+ REG_A8XX_CP_PROTECT_GLOBAL(6),
+ REG_A8XX_CP_PROTECT_GLOBAL(7),
+ REG_A8XX_CP_PROTECT_GLOBAL(8),
+ REG_A8XX_CP_PROTECT_GLOBAL(9),
+ REG_A8XX_CP_PROTECT_GLOBAL(10),
+ REG_A8XX_CP_PROTECT_GLOBAL(11),
+ REG_A8XX_CP_PROTECT_GLOBAL(12),
+ REG_A8XX_CP_PROTECT_GLOBAL(13),
+ REG_A8XX_CP_PROTECT_GLOBAL(14),
+ REG_A8XX_CP_PROTECT_GLOBAL(15),
+ REG_A8XX_CP_PROTECT_GLOBAL(16),
+ REG_A8XX_CP_PROTECT_GLOBAL(17),
+ REG_A8XX_CP_PROTECT_GLOBAL(18),
+ REG_A8XX_CP_PROTECT_GLOBAL(19),
+ REG_A8XX_CP_PROTECT_GLOBAL(20),
+ REG_A8XX_CP_PROTECT_GLOBAL(21),
+ REG_A8XX_CP_PROTECT_GLOBAL(22),
+ REG_A8XX_CP_PROTECT_GLOBAL(23),
+ REG_A8XX_CP_PROTECT_GLOBAL(24),
+ REG_A8XX_CP_PROTECT_GLOBAL(25),
+ REG_A8XX_CP_PROTECT_GLOBAL(26),
+ REG_A8XX_CP_PROTECT_GLOBAL(27),
+ REG_A8XX_CP_PROTECT_GLOBAL(28),
+ REG_A8XX_CP_PROTECT_GLOBAL(29),
+ REG_A8XX_CP_PROTECT_GLOBAL(30),
+ REG_A8XX_CP_PROTECT_GLOBAL(31),
+ REG_A8XX_CP_PROTECT_GLOBAL(32),
+ REG_A8XX_CP_PROTECT_GLOBAL(33),
+ REG_A8XX_CP_PROTECT_GLOBAL(34),
+ REG_A8XX_CP_PROTECT_GLOBAL(35),
+ REG_A8XX_CP_PROTECT_GLOBAL(36),
+ REG_A8XX_CP_PROTECT_GLOBAL(37),
+ REG_A8XX_CP_PROTECT_GLOBAL(38),
+ REG_A8XX_CP_PROTECT_GLOBAL(39),
+ REG_A8XX_CP_PROTECT_GLOBAL(40),
+ REG_A8XX_CP_PROTECT_GLOBAL(41),
+ REG_A8XX_CP_PROTECT_GLOBAL(42),
+ REG_A8XX_CP_PROTECT_GLOBAL(43),
+ REG_A8XX_CP_PROTECT_GLOBAL(44),
+ REG_A8XX_CP_PROTECT_GLOBAL(45),
+ REG_A8XX_CP_PROTECT_GLOBAL(46),
+ REG_A8XX_CP_PROTECT_GLOBAL(47),
+ REG_A8XX_CP_PROTECT_GLOBAL(48),
+ REG_A8XX_CP_PROTECT_GLOBAL(49),
+ REG_A8XX_CP_PROTECT_GLOBAL(50),
+ REG_A8XX_CP_PROTECT_GLOBAL(51),
+ REG_A8XX_CP_PROTECT_GLOBAL(52),
+ REG_A8XX_CP_PROTECT_GLOBAL(53),
+ REG_A8XX_CP_PROTECT_GLOBAL(54),
+ REG_A8XX_CP_PROTECT_GLOBAL(55),
+ REG_A8XX_CP_PROTECT_GLOBAL(63),
+};
+DECLARE_ADRENO_REGLIST_LIST(a850_ifpc_reglist);
+
+static const struct adreno_reglist a850_gbif[] = {
+ { REG_A6XX_GBIF_QSB_SIDE0, 0x00071e20 },
+ { REG_A6XX_GBIF_QSB_SIDE1, 0x00071e20 },
+ { REG_A6XX_GBIF_QSB_SIDE2, 0x00071e20 },
+ { REG_A6XX_GBIF_QSB_SIDE3, 0x00071e20 },
+ { REG_A6XX_GBIF_CX_CONFIG, 0x20023020 },
+ { },
+};
+
+static const struct adreno_reglist_pipe a850_dyn_pwrup_reglist_regs[] = {
+ { REG_A8XX_GRAS_TSEFE_DBG_ECO_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_GRAS_NC_MODE_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_GRAS_DBG_ECO_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A6XX_PC_AUTO_VERTEX_STRIDE, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_1, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_2, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_3, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_4, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_5, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CONTEXT_SWITCH_STABILIZE_CNTL_1, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_VIS_STREAM_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A7XX_RB_CCU_CNTL, 0, BIT(PIPE_BR) },
+ { REG_A7XX_RB_CCU_DBG_ECO_CNTL, 0, BIT(PIPE_BR)},
+ { REG_A8XX_RB_CCU_NC_MODE_CNTL, 0, BIT(PIPE_BR) },
+ { REG_A8XX_RB_CMP_NC_MODE_CNTL, 0, BIT(PIPE_BR) },
+ { REG_A6XX_RB_RBP_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_RB_RESOLVE_PREFETCH_CNTL, 0, BIT(PIPE_BR) },
+ { REG_A6XX_RB_DBG_ECO_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_RB_CMP_DBG_ECO_CNTL, 0, BIT(PIPE_BR) },
+ { REG_A7XX_VFD_DBG_ECO_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BV_THRESHOLD, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BR_THRESHOLD, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BUSY_REQ_CNT, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_LP_REQ_CNT, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VPC_FLATSHADE_MODE_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_CP_HW_FAULT_STATUS_MASK_PIPE, 0, BIT(PIPE_BR) |
+ BIT(PIPE_BV) | BIT(PIPE_LPAC) | BIT(PIPE_AQE0) |
+ BIT(PIPE_AQE1) | BIT(PIPE_DDE_BR) | BIT(PIPE_DDE_BV) },
+ { REG_A8XX_CP_INTERRUPT_STATUS_MASK_PIPE, 0, BIT(PIPE_BR) |
+ BIT(PIPE_BV) | BIT(PIPE_LPAC) | BIT(PIPE_AQE0) |
+ BIT(PIPE_AQE1) | BIT(PIPE_DDE_BR) | BIT(PIPE_DDE_BV) },
+ { REG_A8XX_CP_PROTECT_CNTL_PIPE, 0, BIT(PIPE_BR) | BIT(PIPE_BV) | BIT(PIPE_LPAC) },
+ { REG_A8XX_CP_PROTECT_PIPE(15), 0, BIT(PIPE_BR) | BIT(PIPE_BV) | BIT(PIPE_LPAC) },
+ { REG_A8XX_RB_GC_GMEM_PROTECT, 0, BIT(PIPE_BR) },
+ { REG_A8XX_RB_LPAC_GMEM_PROTECT, 0, BIT(PIPE_BR) },
+ { REG_A6XX_RB_CONTEXT_SWITCH_GMEM_SAVE_RESTORE_ENABLE, 0, BIT(PIPE_BR) },
+};
+DECLARE_ADRENO_REGLIST_PIPE_LIST(a850_dyn_pwrup_reglist);
+
static const struct adreno_info a8xx_gpus[] = {
{
.chip_ids = ADRENO_CHIP_IDS(0x44070001),
@@ -2524,6 +2825,48 @@ static const struct adreno_info a8xx_gpus[] = {
{ 242, 1 },
{ 221, 2 },
),
+ }, {
+ .chip_ids = ADRENO_CHIP_IDS(0x44051401),
+ .family = ADRENO_8XX_GEN2,
+ .fw = {
+ [ADRENO_FW_SQE] = "gen81100_sqe.fw",
+ [ADRENO_FW_GMU] = "gen81100_gmu.bin",
+ [ADRENO_FW_AQE] = "gen81100_aqe.fw",
+ },
+ .gmem = 18 * SZ_1M,
+ .inactive_period = DRM_MSM_INACTIVE_PERIOD,
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
+ ADRENO_QUIRK_HAS_HW_APRIV |
+ ADRENO_QUIRK_PREEMPTION |
+ ADRENO_QUIRK_IFPC,
+ .funcs = &a8xx_gpu_funcs,
+ .a6xx = &(const struct a6xx_info) {
+ .protect = &a850_protect,
+ .nonctxt_reglist = a850_nonctxt_regs,
+ .pwrup_reglist = &a850_pwrup_reglist,
+ .dyn_pwrup_reglist = &a850_dyn_pwrup_reglist,
+ .ifpc_reglist = &a850_ifpc_reglist,
+ .gbif_cx = a850_gbif,
+ .max_slices = 3,
+ .gmu_chipid = 0x80b0100,
+ .bcms = (const struct a6xx_bcm[]) {
+ { .name = "SH0", .buswidth = 32 },
+ { .name = "MC0", .buswidth = 4 },
+ {
+ .name = "ACV",
+ .fixed = true,
+ .perfmode = BIT(2),
+ .perfmode_bw = 16500000,
+ },
+ { /* sentinel */ },
+ },
+ },
+ .preempt_record_size = 19708 * SZ_1K,
+ .speedbins = ADRENO_SPEEDBINS(
+ { 0, 0 },
+ { 284, 2 },
+ { 216, 3 },
+ ),
}
};
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 14d422d7ab95..f766e5e4c7b5 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -145,6 +145,19 @@ bool a8xx_gmu_gx_is_on(struct adreno_gpu *adreno_gpu)
if (!gmu->initialized)
return false;
+ /*
+ * Use the CX_MISC_GFX_PWR_CLK_STATUS register instead of the GMUCX
+ * register to ensure correct GDSC and clock status reporting even
+ * when the GMU MX domain is powered off
+ */
+ if (adreno_is_a850(adreno_gpu)) {
+ val = a6xx_cx_misc_read(a6xx_gpu, REG_A8XX_CX_MISC_GFX_PWR_CLK_STATUS);
+
+ return !(val &
+ (A8XX_CX_MISC_GFX_PWR_CLK_STATUS_GX_GDSC_POWER_OFF |
+ A8XX_CX_MISC_GFX_PWR_CLK_STATUS_GX_CLK_OFF));
+ }
+
val = gmu_read(gmu, REG_A8XX_GMU_PWR_CLK_STATUS);
return !(val &
@@ -645,7 +658,7 @@ static void a6xx_rpmh_stop(struct a6xx_gmu *gmu)
if (!test_and_clear_bit(GMU_STATUS_FW_START, &gmu->status))
return;
- if (adreno_is_a840(adreno_gpu))
+ if (adreno_is_a840(adreno_gpu) || adreno_is_a850(adreno_gpu))
bitmask = BIT(30);
gmu_write(gmu, REG_A6XX_GMU_RSCC_CONTROL_REQ, 1);
@@ -2170,6 +2183,9 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu)
dev_pm_domain_detach(gmu->gxpd, false);
}
+ if (!IS_ERR_OR_NULL(gmu->gmu_mxpd))
+ dev_pm_domain_detach(gmu->gmu_mxpd, false);
+
if (!IS_ERR_OR_NULL(gmu->qmp))
qmp_put(gmu->qmp);
@@ -2314,7 +2330,8 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)
struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
struct msm_gpu *gpu = &adreno_gpu->base;
struct a6xx_gmu *gmu = &a6xx_gpu->gmu;
- struct device_link *link;
+ struct device_link *gmu_mx_link = NULL;
+ struct device_link *cx_link;
resource_size_t start;
struct resource *res;
int ret;
@@ -2461,12 +2478,27 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)
goto err_mmio;
}
- link = device_link_add(gmu->dev, gmu->cxpd, DL_FLAG_PM_RUNTIME);
- if (!link) {
+ cx_link = device_link_add(gmu->dev, gmu->cxpd, DL_FLAG_PM_RUNTIME);
+ if (!cx_link) {
ret = -ENODEV;
goto detach_cxpd;
}
+ /* Optionally attach the GMU MX power domain */
+ gmu->gmu_mxpd = dev_pm_domain_attach_by_name(gmu->dev, "gmu_mx");
+ if (IS_ERR(gmu->gmu_mxpd)) {
+ ret = PTR_ERR(gmu->gmu_mxpd);
+ goto detach_cxpd_link;
+ }
+
+ if (gmu->gmu_mxpd) {
+ gmu_mx_link = device_link_add(gmu->dev, gmu->gmu_mxpd, DL_FLAG_PM_RUNTIME);
+ if (!gmu_mx_link) {
+ ret = -ENODEV;
+ goto detach_gmu_mxpd;
+ }
+ }
+
/* Other errors are handled during GPU ACD probe */
gmu->qmp = qmp_get(gmu->dev);
if (PTR_ERR_OR_ZERO(gmu->qmp) == -EPROBE_DEFER) {
@@ -2508,7 +2540,15 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)
if (!IS_ERR_OR_NULL(gmu->qmp))
qmp_put(gmu->qmp);
- device_link_del(link);
+ if (!IS_ERR_OR_NULL(gmu_mx_link))
+ device_link_del(gmu_mx_link);
+
+detach_gmu_mxpd:
+ if (gmu->gmu_mxpd)
+ dev_pm_domain_detach(gmu->gmu_mxpd, false);
+
+detach_cxpd_link:
+ device_link_del(cx_link);
detach_cxpd:
dev_pm_domain_detach(gmu->cxpd, false);
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h
index 3f96b10b5f61..d3f6cd8b9741 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h
@@ -77,6 +77,7 @@ struct a6xx_gmu {
struct device *gxpd;
struct device *cxpd;
+ struct device *gmu_mxpd;
int idle_level;
diff --git a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
index add93c1fa039..a5b5e4286e4e 100644
--- a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
@@ -286,10 +286,11 @@ static void a8xx_set_ubwc_config(struct msm_gpu *gpu)
u32 hbb, hbb_hi, hbb_lo, mode;
u8 uavflagprd_inv = 2;
- if (ubwc_version > UBWC_6_0)
+ if (ubwc_version > UBWC_7_0)
dev_err(&gpu->pdev->dev, "Unknown UBWC version: 0x%x\n", ubwc_version);
- if (ubwc_version == UBWC_6_0)
+ if (ubwc_version == UBWC_6_0 ||
+ ubwc_version == UBWC_7_0)
yuvnotcomptofc = true;
if (ubwc_version < UBWC_5_0 &&
@@ -726,6 +727,7 @@ static int hw_init(struct msm_gpu *gpu)
for (pipe_id = PIPE_BR; pipe_id <= PIPE_DDE_BV; pipe_id++) {
u32 apriv_mask = A8XX_APRIV_MASK;
+ u32 int_mask = A8XX_CP_INTERRUPT_STATUS_MASK_PIPE;
unsigned long flags;
if (pipe_id == PIPE_LPAC)
@@ -734,10 +736,16 @@ static int hw_init(struct msm_gpu *gpu)
if (pipe_id == PIPE_BR)
apriv_mask = A8XX_BR_APRIV_MASK;
+ /*
+ * A850's BV pipe raises a spurious RTWROVF fault interrupt;
+ * mask it off to avoid false fault recovery.
+ */
+ if (adreno_is_a850(adreno_gpu) && pipe_id == PIPE_BV)
+ int_mask &= ~A8XX_CP_INTERRUPT_STATUS_MASK_PIPE_RTWROVF;
+
a8xx_aperture_acquire(gpu, pipe_id, &flags);
gpu_write(gpu, REG_A8XX_CP_APRIV_CNTL_PIPE, apriv_mask);
- gpu_write(gpu, REG_A8XX_CP_INTERRUPT_STATUS_MASK_PIPE,
- A8XX_CP_INTERRUPT_STATUS_MASK_PIPE);
+ gpu_write(gpu, REG_A8XX_CP_INTERRUPT_STATUS_MASK_PIPE, int_mask);
gpu_write(gpu, REG_A8XX_CP_HW_FAULT_STATUS_MASK_PIPE,
A8XX_CP_HW_FAULT_STATUS_MASK_PIPE);
a8xx_aperture_release(gpu, flags);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
index bd5c440f1753..f99cf5962344 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
@@ -612,6 +612,11 @@ static inline int adreno_is_a840(struct adreno_gpu *gpu)
return gpu->info->chip_ids[0] == 0x44050a01;
}
+static inline int adreno_is_a850(struct adreno_gpu *gpu)
+{
+ return gpu->info->chip_ids[0] == 0x44051401;
+}
+
/* Put vm_start above 32b to catch issues with not setting xyz_BASE_HI */
#define ADRENO_VM_START 0x100000000ULL
u64 adreno_private_vm_size(struct msm_gpu *gpu);
diff --git a/drivers/gpu/drm/msm/registers/adreno/a6xx.xml b/drivers/gpu/drm/msm/registers/adreno/a6xx.xml
index 69dd0446f8d2..e6e56969a9b8 100644
--- a/drivers/gpu/drm/msm/registers/adreno/a6xx.xml
+++ b/drivers/gpu/drm/msm/registers/adreno/a6xx.xml
@@ -269,6 +269,7 @@ by a particular renderpass/blit.
<reg32 offset="0x08b2" name="CP_CHICKEN_DBG_PIPE" variants="A8XX-"/>
<reg32 offset="0x0842" name="CP_ADDR_MODE_CNTL" type="a5xx_address_mode" variants="A6XX"/>
<reg32 offset="0x0843" name="CP_DBG_ECO_CNTL" variants="A6XX-A7XX"/>
+ <reg32 offset="0x084a" name="CP_MULTIDRAW_CNTL" variants="A8XX-"/>
<reg32 offset="0x084b" name="CP_DBG_ECO_CNTL" variants="A8XX-"/>
<bitset name="a6xx_cp_protect_cntl" inline="yes">
@@ -1326,6 +1327,7 @@ by a particular renderpass/blit.
<reg32 offset="0x0c00" name="VSC_DBG_ECO_CNTL"/>
<reg32 offset="0x0df0" name="VSC_KMD_DBG_ECO_CNTL" variants="A8XX-"/>
+ <reg32 offset="0x0df8" name="VSC_VISIBILITY_FLUSH_CNTL" variants="A8XX-"/>
<reg32 offset="0x0c02" name="VSC_BIN_SIZE" usage="cmd" variants="A6XX-A7XX">
<bitfield name="BINW" low="0" high="7" shr="5" type="uint"/>
<bitfield name="BINH" low="8" high="16" shr="4" type="uint"/>
@@ -4352,6 +4354,7 @@ by a particular renderpass/blit.
<reg32 offset="0xae0a" name="SP_CHICKEN_BITS_3" variants="A7XX-" usage="init"/>
<reg32 offset="0xae0b" name="SP_CHICKEN_BITS_4" variants="A8XX-"/>
<reg32 offset="0xae0c" name="SP_STATUS"/>
+ <reg32 offset="0xae0e" name="SP_L0_PERF_TUNE" variants="A8XX-"/>
<reg32 offset="0xae0f" name="SP_PERFCTR_SHADER_MASK" usage="init">
<!-- some perfcntrs are affected by a per-stage enable bit
@@ -4389,6 +4392,7 @@ by a particular renderpass/blit.
<reg64 offset="0xae10" name="SP_HLSQ_GC_GMEM_RANGE_MIN" variants="A8XX-"/>
<reg64 offset="0xae12" name="SP_HLSQ_LPAC_GMEM_RANGE_MIN" variants="A8XX-"/>
+ <reg32 offset="0xae14" name="SP_CHICKEN_BITS_5" variants="A8XX-"/>
<reg32 offset="0xae15" name="SP_LPAC_CPI_STATUS" variants="A8XX-"/>
<reg32 offset="0xae16" name="SP_LPAC_DBG_STATUS" variants="A8XX-"/>
<reg32 offset="0xae17" name="SP_LPAC_ISDB_BATCH_COUNT" variants="A8XX-"/>
@@ -5094,6 +5098,10 @@ by a particular renderpass/blit.
<reg32 offset="0x0001" name="SYSTEM_CACHE_CNTL_0"/>
<reg32 offset="0x0002" name="SYSTEM_CACHE_CNTL_1"/>
<reg32 offset="0x0039" name="CX_MISC_TCM_RET_CNTL" variants="A7XX-"/>
+ <reg32 offset="0x0083" name="CX_MISC_GFX_PWR_CLK_STATUS" variants="A8XX-">
+ <bitfield name="GX_GDSC_POWER_OFF" pos="3" type="boolean"/>
+ <bitfield name="GX_CLK_OFF" pos="4" type="boolean"/>
+ </reg32>
<reg32 offset="0x0087" name="CX_MISC_SLICE_ENABLE_FINAL" variants="A8XX"/>
<reg32 offset="0x0400" name="CX_MISC_SW_FUSE_VALUE" variants="A7XX-">
<bitfield pos="0" name="FASTBLEND" type="boolean"/>
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 08/15] drm/msm/a6xx: Send THINMEM config to GMU for A850
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (6 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 07/15] drm/msm/a8xx: Add Adreno 850 support Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 09/15] drm/msm/a8xx: Add Adreno 845 support Akhil P Oommen
` (7 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree
Add HFI support for the GMU THINMEM_CFG feature and provide the
configuration value used by the Adreno 850 GPU in the catalog.
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 1 +
drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 2 ++
drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 25 +++++++++++++++++++++++++
drivers/gpu/drm/msm/adreno/a6xx_hfi.h | 1 +
4 files changed, 29 insertions(+)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
index de576816ec7c..83c6f257f478 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
@@ -2849,6 +2849,7 @@ static const struct adreno_info a8xx_gpus[] = {
.gbif_cx = a850_gbif,
.max_slices = 3,
.gmu_chipid = 0x80b0100,
+ .thinmem_config = 14,
.bcms = (const struct a6xx_bcm[]) {
{ .name = "SH0", .buswidth = 32 },
{ .name = "MC0", .buswidth = 4 },
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h
index b50c57f427b4..43273e5f8b5b 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h
@@ -42,6 +42,7 @@ struct cpu_gpu_lock {
* @hwcg: hw clock gating register sequence
* @protect: CP_PROTECT settings
* @pwrup_reglist pwrup reglist for preemption
+ * @thinmem_config: GMU thinmem configuration
*/
struct a6xx_info {
const struct adreno_reglist *hwcg;
@@ -56,6 +57,7 @@ struct a6xx_info {
u32 gmu_cgc_mode;
u32 prim_fifo_threshold;
const struct a6xx_bcm *bcms;
+ u32 thinmem_config;
};
struct a6xx_gpu {
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c b/drivers/gpu/drm/msm/adreno/a6xx_hfi.c
index 186a73c0b99c..e33a2258e0f9 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_hfi.c
@@ -888,6 +888,27 @@ static int a6xx_hfi_enable_acd(struct a6xx_gmu *gmu)
return 0;
}
+static int a6xx_hfi_send_thinmem_config(struct a6xx_gmu *gmu)
+{
+ struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);
+ struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
+ const struct a6xx_info *info = adreno_gpu->info->a6xx;
+ u32 data;
+ int ret;
+
+ if (!info->thinmem_config)
+ return 0;
+
+ /* Bits [7:4] contain the thinmem_cfg data. */
+ data = FIELD_PREP(GENMASK(7, 4), info->thinmem_config);
+
+ ret = a6xx_hfi_feature_ctrl_msg(gmu, HFI_FEATURE_THINMEM_CFG, 1, data);
+ if (ret)
+ DRM_DEV_ERROR(gmu->dev, "Unable to send THINMEM_CFG (%d)\n", ret);
+
+ return ret;
+}
+
static int a6xx_hfi_send_test(struct a6xx_gmu *gmu)
{
struct a6xx_hfi_msg_test msg = { 0 };
@@ -993,6 +1014,10 @@ int a6xx_hfi_start(struct a6xx_gmu *gmu, int boot_state)
if (ret)
return ret;
+ ret = a6xx_hfi_send_thinmem_config(gmu);
+ if (ret)
+ return ret;
+
ret = a6xx_hfi_send_core_fw_start(gmu);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_hfi.h b/drivers/gpu/drm/msm/adreno/a6xx_hfi.h
index e10d32ce93e0..5123349a3de6 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_hfi.h
+++ b/drivers/gpu/drm/msm/adreno/a6xx_hfi.h
@@ -244,6 +244,7 @@ struct a6xx_hfi_msg_feature_ctrl {
#define HFI_FEATURE_TDCVS 30
#define HFI_FEATURE_DCE 31
#define HFI_FEATURE_IFF_PCLX 32
+#define HFI_FEATURE_THINMEM_CFG 38
#define HFI_FEATURE_SOFT_RESET 0x10000001
#define HFI_FEATURE_DCVS_PROFILE 0x10000002
#define HFI_FEATURE_FAST_CTX_DESTROY 0x10000003
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 09/15] drm/msm/a8xx: Add Adreno 845 support
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (7 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 08/15] drm/msm/a6xx: Send THINMEM config to GMU for A850 Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 10/15] dt-bindings: display/msm: Document A850 GPU and GMU Akhil P Oommen
` (6 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Bhaskar Reddy Valluru
From: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Adreno 845 GPU is present in the Maili SoC. It is very similar to Hawi GPU
(A850), except that it doesn't have a MALU unit. Add the necessary
register lists and a catalog entry to support this GPU.
Signed-off-by: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 102 ++++++++++++++++++++++++++++++
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 4 +-
drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 4 +-
drivers/gpu/drm/msm/adreno/adreno_gpu.h | 11 ++++
4 files changed, 117 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
index 83c6f257f478..ed77cd40ca5e 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
@@ -2397,6 +2397,65 @@ static const struct adreno_reglist_pipe a840_dyn_pwrup_reglist_regs[] = {
};
DECLARE_ADRENO_REGLIST_PIPE_LIST(a840_dyn_pwrup_reglist);
+static const struct adreno_reglist_pipe a845_nonctxt_regs[] = {
+ { REG_A8XX_CP_SMMU_STREAM_ID_LPAC, 0x00000101, BIT(PIPE_NONE) },
+ { REG_A8XX_CP_MULTIDRAW_CNTL, 0x00000001, BIT(PIPE_NONE) },
+ { REG_A8XX_GRAS_DBG_ECO_CNTL, 0x01000800, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_GRAS_TSEFE_DBG_ECO_CNTL, 0x00200000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A6XX_PC_AUTO_VERTEX_STRIDE, 0x00000001, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_VIS_STREAM_CNTL, 0x10010000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CONTEXT_SWITCH_STABILIZE_CNTL_1, 0x00000002, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_1, 0x00000803, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_2, 0x00000200, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_3, 0x00400000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_4, 0x00500050, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_PC_CHICKEN_BITS_5, BIT(28) | BIT(30), BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A7XX_RB_CCU_CNTL, 0x00000068, BIT(PIPE_BR) },
+ { REG_A7XX_RB_CCU_DBG_ECO_CNTL, BIT(10) | BIT(9), BIT(PIPE_BR) },
+ { REG_A6XX_RB_DBG_ECO_CNTL, BIT(17), BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_RB_GC_GMEM_PROTECT, 0x0C000000, BIT(PIPE_BR) },
+ { REG_A6XX_RB_RBP_CNTL, BIT(5) | BIT(6), BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_RB_RESOLVE_PREFETCH_CNTL, 0x00000007, BIT(PIPE_BR) },
+ { REG_A8XX_RB_CMP_DBG_ECO_CNTL, 0x00004000, BIT(PIPE_BR) },
+ { REG_A8XX_RBBM_NC_MODE_CNTL, 0x00000001, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_SLICE_NC_MODE_CNTL, 0x00000001, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_SLICE_PERFCTR_CNTL, BIT(0), BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_POWER_UP_RESET_SW_OVERRIDE, 0x70809060, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_POWER_UP_RESET_SW_BV_OVERRIDE, 0x30000000, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_WAIT_IDLE_CLOCKS_CNTL, 0x00000030, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_WAIT_IDLE_CLOCKS_CNTL2, 0x00000030, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_GBIF_CLIENT_QOS_CNTL, 0x22122212, BIT(PIPE_NONE) },
+ { REG_A8XX_RBBM_CGC_P2S_CNTL, 0x00000040, BIT(PIPE_NONE) },
+ { REG_A6XX_SP_CHICKEN_BITS, BIT(24), BIT(PIPE_NONE) },
+ { REG_A7XX_SP_CHICKEN_BITS_2, 0x00820800, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_CHICKEN_BITS_3, 0x00300000, BIT(PIPE_NONE) },
+ { REG_A8XX_SP_CHICKEN_BITS_5, BIT(3), BIT(PIPE_NONE) },
+ { REG_A6XX_SP_PERFCTR_SHADER_MASK, 0x0000003f, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_HLSQ_DBG_ECO_CNTL, 0x04000000, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_HLSQ_DBG_ECO_CNTL_1, BIT(17), BIT(PIPE_NONE) },
+ { REG_A8XX_SP_HLSQ_DBG_ECO_CNTL_3, BIT(1), BIT(PIPE_NONE) },
+ { REG_A7XX_SP_HLSQ_TIMEOUT_THRESHOLD_DP, 0x00000080, BIT(PIPE_NONE) },
+ { REG_A7XX_SP_READ_SEL, 0x0001ff00, BIT(PIPE_NONE) },
+ { REG_A8XX_SP_L0_PERF_TUNE, 0x00000024, BIT(PIPE_NONE) },
+ { REG_A6XX_TPL1_DBG_ECO_CNTL, 0x10100000, BIT(PIPE_NONE) },
+ { REG_A6XX_TPL1_DBG_ECO_CNTL1, 0x00000720, BIT(PIPE_NONE) },
+ { REG_A6XX_UCHE_MODE_CNTL, 0x80080000, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_CCHE_MODE_CNTL, 0x00001000, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_DBG_ECO_CNTL_0, BIT(31), BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_HW_DBG_CNTL, 0x01410000, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_CCHE_CACHE_WAYS, 0x00000800, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_GBIF_GX_CONFIG, 0x010240e0, BIT(PIPE_NONE) },
+ { REG_A8XX_UCHE_VARB_IDLE_TIMEOUT, 0x00000020, BIT(PIPE_NONE) },
+ { REG_A7XX_VFD_DBG_ECO_CNTL, 0x00008000, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BV_THRESHOLD, 0x00500050, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BR_THRESHOLD, 0x00600060, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_BUSY_REQ_CNT, 0x00200020, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VFD_CB_LP_REQ_CNT, 0x00080020, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VPC_FLATSHADE_MODE_CNTL, 0x00000001, BIT(PIPE_BV) | BIT(PIPE_BR) },
+ { REG_A8XX_VSC_VISIBILITY_FLUSH_CNTL, 0x00080004, BIT(PIPE_NONE) },
+ { },
+};
+
static const struct adreno_reglist_pipe a850_nonctxt_regs[] = {
{ REG_A8XX_CP_SMMU_STREAM_ID_LPAC, 0x00000101, BIT(PIPE_NONE) },
{ REG_A8XX_CP_MULTIDRAW_CNTL, 0x00000001, BIT(PIPE_NONE) },
@@ -2825,6 +2884,49 @@ static const struct adreno_info a8xx_gpus[] = {
{ 242, 1 },
{ 221, 2 },
),
+ }, {
+ .chip_ids = ADRENO_CHIP_IDS(0x44041400),
+ .family = ADRENO_8XX_GEN2,
+ .fw = {
+ [ADRENO_FW_SQE] = "gen81100_sqe.fw",
+ [ADRENO_FW_GMU] = "gen81400_gmu.bin",
+ [ADRENO_FW_AQE] = "gen81100_aqe.fw",
+ },
+ .gmem = 12 * SZ_1M,
+ .inactive_period = DRM_MSM_INACTIVE_PERIOD,
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
+ ADRENO_QUIRK_HAS_HW_APRIV |
+ ADRENO_QUIRK_PREEMPTION |
+ ADRENO_QUIRK_IFPC,
+ .funcs = &a8xx_gpu_funcs,
+ .a6xx = &(const struct a6xx_info) {
+ .protect = &a850_protect,
+ .nonctxt_reglist = a845_nonctxt_regs,
+ .pwrup_reglist = &a850_pwrup_reglist,
+ .dyn_pwrup_reglist = &a850_dyn_pwrup_reglist,
+ .ifpc_reglist = &a850_ifpc_reglist,
+ .gbif_cx = a850_gbif,
+ .max_slices = 3,
+ .gmu_chipid = 0x80e0000,
+ .thinmem_config = 14,
+ .bcms = (const struct a6xx_bcm[]) {
+ { .name = "SH0", .buswidth = 32 },
+ { .name = "MC0", .buswidth = 4 },
+ {
+ .name = "ACV",
+ .fixed = true,
+ .perfmode = BIT(2),
+ .perfmode_bw = 16500000,
+ },
+ { /* sentinel */ },
+ },
+ },
+ .preempt_record_size = 13564 * SZ_1K,
+ .speedbins = ADRENO_SPEEDBINS(
+ { 0, 0 },
+ { 0xd8, 0 },
+ { 0x11c, 1 },
+ ),
}, {
.chip_ids = ADRENO_CHIP_IDS(0x44051401),
.family = ADRENO_8XX_GEN2,
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index f766e5e4c7b5..662f09bec9d5 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -150,7 +150,7 @@ bool a8xx_gmu_gx_is_on(struct adreno_gpu *adreno_gpu)
* register to ensure correct GDSC and clock status reporting even
* when the GMU MX domain is powered off
*/
- if (adreno_is_a850(adreno_gpu)) {
+ if (adreno_is_a850_family(adreno_gpu)) {
val = a6xx_cx_misc_read(a6xx_gpu, REG_A8XX_CX_MISC_GFX_PWR_CLK_STATUS);
return !(val &
@@ -658,7 +658,7 @@ static void a6xx_rpmh_stop(struct a6xx_gmu *gmu)
if (!test_and_clear_bit(GMU_STATUS_FW_START, &gmu->status))
return;
- if (adreno_is_a840(adreno_gpu) || adreno_is_a850(adreno_gpu))
+ if (adreno_is_a840(adreno_gpu) || adreno_is_a850_family(adreno_gpu))
bitmask = BIT(30);
gmu_write(gmu, REG_A6XX_GMU_RSCC_CONTROL_REQ, 1);
diff --git a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
index a5b5e4286e4e..3170ba6ef5a0 100644
--- a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
@@ -737,10 +737,10 @@ static int hw_init(struct msm_gpu *gpu)
apriv_mask = A8XX_BR_APRIV_MASK;
/*
- * A850's BV pipe raises a spurious RTWROVF fault interrupt;
+ * A845/A850's BV pipe raises a spurious RTWROVF fault interrupt;
* mask it off to avoid false fault recovery.
*/
- if (adreno_is_a850(adreno_gpu) && pipe_id == PIPE_BV)
+ if (adreno_is_a850_family(adreno_gpu) && pipe_id == PIPE_BV)
int_mask &= ~A8XX_CP_INTERRUPT_STATUS_MASK_PIPE_RTWROVF;
a8xx_aperture_acquire(gpu, pipe_id, &flags);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
index f99cf5962344..1b05a4760e02 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
@@ -612,11 +612,22 @@ static inline int adreno_is_a840(struct adreno_gpu *gpu)
return gpu->info->chip_ids[0] == 0x44050a01;
}
+static inline int adreno_is_a845(struct adreno_gpu *gpu)
+{
+ return gpu->info->chip_ids[0] == 0x44041400;
+}
+
static inline int adreno_is_a850(struct adreno_gpu *gpu)
{
return gpu->info->chip_ids[0] == 0x44051401;
}
+static inline int adreno_is_a850_family(struct adreno_gpu *gpu)
+{
+ return adreno_is_a845(gpu) ||
+ adreno_is_a850(gpu);
+}
+
/* Put vm_start above 32b to catch issues with not setting xyz_BASE_HI */
#define ADRENO_VM_START 0x100000000ULL
u64 adreno_private_vm_size(struct msm_gpu *gpu);
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 10/15] dt-bindings: display/msm: Document A850 GPU and GMU
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (8 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 09/15] drm/msm/a8xx: Add Adreno 845 support Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 13:00 ` Krzysztof Kozlowski
2026-09-23 10:25 ` [PATCH 11/15] dt-bindings: display/msm: Document A845 " Akhil P Oommen
` (5 subsequent siblings)
15 siblings, 1 reply; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree
Adreno A850 GPU found in Hawi SoC belongs to the A8x family and is
the successor to A840. Like A840, its clocks are described in the GMU
node and it has the following power related updates:
1. GMU is now powered via a dedicated GDSC connected to MxG rail
2. An additional power rail called Bx
Describe this GPU/GMU along with the new compatible strings.
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
.../devicetree/bindings/display/msm/gmu.yaml | 44 ++++++++++++++++++++++
.../devicetree/bindings/display/msm/gpu.yaml | 2 +
2 files changed, 46 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/msm/gmu.yaml b/Documentation/devicetree/bindings/display/msm/gmu.yaml
index 9e459f12ce3f..875fd1242528 100644
--- a/Documentation/devicetree/bindings/display/msm/gmu.yaml
+++ b/Documentation/devicetree/bindings/display/msm/gmu.yaml
@@ -55,14 +55,18 @@ properties:
- const: gmu
power-domains:
+ minItems: 2
items:
- description: CX power domain
- description: GX power domain
+ - description: GMU MX power domain
power-domain-names:
+ minItems: 2
items:
- const: cx
- const: gx
+ - const: gmu_mx
iommus:
maxItems: 1
@@ -359,6 +363,46 @@ allOf:
- const: memnoc
- const: hub
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: qcom,adreno-gmu-850.1
+ then:
+ properties:
+ reg:
+ items:
+ - description: Core GMU registers
+ reg-names:
+ items:
+ - const: gmu
+ clocks:
+ items:
+ - description: GMU clock
+ - description: GPU CX clock
+ - description: GPU MEMNOC clock
+ - description: GPU AHB clock
+ - description: GPU MXG AHB clock
+ - description: GMU HUB clock
+ clock-names:
+ items:
+ - const: gmu
+ - const: cxo
+ - const: memnoc
+ - const: ahb
+ - const: mxg_ahb
+ - const: hub
+ power-domains:
+ items:
+ - description: CX power domain
+ - description: GX power domain
+ - description: GMU MX power domain
+ power-domain-names:
+ items:
+ - const: cx
+ - const: gx
+ - const: gmu_mx
+
- if:
properties:
compatible:
diff --git a/Documentation/devicetree/bindings/display/msm/gpu.yaml b/Documentation/devicetree/bindings/display/msm/gpu.yaml
index e5efe2d35ddc..3438eebf2fa4 100644
--- a/Documentation/devicetree/bindings/display/msm/gpu.yaml
+++ b/Documentation/devicetree/bindings/display/msm/gpu.yaml
@@ -415,6 +415,7 @@ allOf:
enum:
- qcom,adreno-44010000
- qcom,adreno-44050a01
+ - qcom,adreno-44051401
- qcom,adreno-44070001
then:
properties:
@@ -452,6 +453,7 @@ allOf:
- qcom,adreno-43051401
- qcom,adreno-44010000
- qcom,adreno-44050a01
+ - qcom,adreno-44051401
- qcom,adreno-44070001
then: # Starting with A6xx, the clocks are usually defined in the GMU node
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 10/15] dt-bindings: display/msm: Document A850 GPU and GMU
2026-09-23 10:25 ` [PATCH 10/15] dt-bindings: display/msm: Document A850 GPU and GMU Akhil P Oommen
@ 2026-09-23 13:00 ` Krzysztof Kozlowski
0 siblings, 0 replies; 22+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-23 13:00 UTC (permalink / raw)
To: Akhil P Oommen, Rob Clark, Sean Paul, Konrad Dybcio,
Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Marijn Suijten,
David Airlie, Simona Vetter, Jordan Crouse, Maarten Lankhorst,
Maxime Ripard, Thomas Zimmermann, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson
Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, devicetree
On 23/09/2026 12:25, Akhil P Oommen wrote:
> Adreno A850 GPU found in Hawi SoC belongs to the A8x family and is
> the successor to A840. Like A840, its clocks are described in the GMU
> node and it has the following power related updates:
> 1. GMU is now powered via a dedicated GDSC connected to MxG rail
> 2. An additional power rail called Bx
I don't see the updated related to (2) above
>
> Describe this GPU/GMU along with the new compatible strings.
>
> Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
> ---
> .../devicetree/bindings/display/msm/gmu.yaml | 44 ++++++++++++++++++++++
> .../devicetree/bindings/display/msm/gpu.yaml | 2 +
> 2 files changed, 46 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/display/msm/gmu.yaml b/Documentation/devicetree/bindings/display/msm/gmu.yaml
> index 9e459f12ce3f..875fd1242528 100644
> --- a/Documentation/devicetree/bindings/display/msm/gmu.yaml
> +++ b/Documentation/devicetree/bindings/display/msm/gmu.yaml
> @@ -55,14 +55,18 @@ properties:
> - const: gmu
>
> power-domains:
> + minItems: 2
> items:
> - description: CX power domain
> - description: GX power domain
> + - description: GMU MX power domain
>
> power-domain-names:
> + minItems: 2
> items:
> - const: cx
> - const: gx
> + - const: gmu_mx
Your commit msg said mxg. Or mx, because this is GMU, so saying that
it's power domain is GMU is redundant.
>
> iommus:
> maxItems: 1
> @@ -359,6 +363,46 @@ allOf:
> - const: memnoc
> - const: hub
>
> + - if:
> + properties:
> + compatible:
> + contains:
> + const: qcom,adreno-gmu-850.1
> + then:
> + properties:
> + reg:
> + items:
> + - description: Core GMU registers
> + reg-names:
> + items:
> + - const: gmu
> + clocks:
> + items:
> + - description: GMU clock
> + - description: GPU CX clock
> + - description: GPU MEMNOC clock
> + - description: GPU AHB clock
> + - description: GPU MXG AHB clock
> + - description: GMU HUB clock
> + clock-names:
> + items:
> + - const: gmu
> + - const: cxo
> + - const: memnoc
> + - const: ahb
Keep existing order. ahb is first.
> + - const: mxg_ahb
> + - const: hub
> + power-domains:
Just minItems
> + items:
> + - description: CX power domain
> + - description: GX power domain
> + - description: GMU MX power domain
> + power-domain-names:
minItems
But OTOH you need to restrict power domains for every other variant
> + items:
> + - const: cx
> + - const: gx
> + - const: gmu_mx
> +
> - if:
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 11/15] dt-bindings: display/msm: Document A845 GPU and GMU
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (9 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 10/15] dt-bindings: display/msm: Document A850 GPU and GMU Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 12/15] arm64: dts: qcom: hawi: Add GPU support Akhil P Oommen
` (4 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Bhaskar Reddy Valluru
From: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Adreno 845 GPU is present in the Maili SoC which is very similar to the
A850 GPU, except the MALU block. It has different set of power
configurations and the GMU clock list. Document this GPU and its GMU.
Signed-off-by: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
.../devicetree/bindings/display/msm/gmu.yaml | 54 ++++++++++++++--------
.../devicetree/bindings/display/msm/gpu.yaml | 2 +
2 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/Documentation/devicetree/bindings/display/msm/gmu.yaml b/Documentation/devicetree/bindings/display/msm/gmu.yaml
index 875fd1242528..be4feb87f274 100644
--- a/Documentation/devicetree/bindings/display/msm/gmu.yaml
+++ b/Documentation/devicetree/bindings/display/msm/gmu.yaml
@@ -367,7 +367,7 @@ allOf:
properties:
compatible:
contains:
- const: qcom,adreno-gmu-850.1
+ const: qcom,adreno-gmu-845.0
then:
properties:
reg:
@@ -380,7 +380,7 @@ allOf:
items:
- description: GMU clock
- description: GPU CX clock
- - description: GPU MEMNOC clock
+ - description: GPU SMMU Vote clock
- description: GPU AHB clock
- description: GPU MXG AHB clock
- description: GMU HUB clock
@@ -388,7 +388,7 @@ allOf:
items:
- const: gmu
- const: cxo
- - const: memnoc
+ - const: smmu_vote
- const: ahb
- const: mxg_ahb
- const: hub
@@ -407,7 +407,7 @@ allOf:
properties:
compatible:
contains:
- const: qcom,adreno-gmu-x285.1
+ const: qcom,adreno-gmu-850.1
then:
properties:
reg:
@@ -418,42 +418,60 @@ allOf:
- const: gmu
clocks:
items:
- - description: GPU AHB clock
- description: GMU clock
- description: GPU CX clock
- description: GPU MEMNOC clock
+ - description: GPU AHB clock
+ - description: GPU MXG AHB clock
- description: GMU HUB clock
- - description: GMU RSCC HUB clock
clock-names:
items:
- - const: ahb
- const: gmu
- const: cxo
- const: memnoc
+ - const: ahb
+ - const: mxg_ahb
- const: hub
- - const: rscc
+ power-domains:
+ items:
+ - description: CX power domain
+ - description: GX power domain
+ - description: GMU MX power domain
+ power-domain-names:
+ items:
+ - const: cx
+ - const: gx
+ - const: gmu_mx
- if:
properties:
compatible:
contains:
- const: qcom,adreno-gmu-wrapper
+ const: qcom,adreno-gmu-x285.1
then:
properties:
reg:
items:
- - description: GMU wrapper register space
+ - description: Core GMU registers
reg-names:
items:
- const: gmu
- else:
- required:
- - clocks
- - clock-names
- - interrupts
- - interrupt-names
- - iommus
- - operating-points-v2
+ clocks:
+ items:
+ - description: GPU AHB clock
+ - description: GMU clock
+ - description: GPU CX clock
+ - description: GPU MEMNOC clock
+ - description: GMU HUB clock
+ - description: GMU RSCC HUB clock
+ clock-names:
+ items:
+ - const: ahb
+ - const: gmu
+ - const: cxo
+ - const: memnoc
+ - const: hub
+ - const: rscc
examples:
- |
diff --git a/Documentation/devicetree/bindings/display/msm/gpu.yaml b/Documentation/devicetree/bindings/display/msm/gpu.yaml
index 3438eebf2fa4..a11a4dba838d 100644
--- a/Documentation/devicetree/bindings/display/msm/gpu.yaml
+++ b/Documentation/devicetree/bindings/display/msm/gpu.yaml
@@ -415,6 +415,7 @@ allOf:
enum:
- qcom,adreno-44010000
- qcom,adreno-44050a01
+ - qcom,adreno-44041400
- qcom,adreno-44051401
- qcom,adreno-44070001
then:
@@ -453,6 +454,7 @@ allOf:
- qcom,adreno-43051401
- qcom,adreno-44010000
- qcom,adreno-44050a01
+ - qcom,adreno-44041400
- qcom,adreno-44051401
- qcom,adreno-44070001
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 12/15] arm64: dts: qcom: hawi: Add GPU support
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (10 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 11/15] dt-bindings: display/msm: Document A845 " Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 13/15] arm64: dts: qcom: hawi-mtp: Enable GPU Akhil P Oommen
` (3 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Konrad Dybcio
Adreno 850 is the next generation of A8x GPU present in Hawi SoC. It shares
the ADRENO_8XX_GEN2 family and slice architecture with A840, but has many
architectural improvements. There is a new block Matrix ALU (MALU) which
helps to accelerate certain compute workloads. Also, there is a new Bx rail
that powers a part of the GPU IP. GMU is now powered by a dedicated GDSC
powered by MxG rail.
Add the GPU and GMU nodes describing the register maps, interrupts, clocks,
power domains, IOMMU, interconnect paths and the OPP tables.
Assisted-by: LLM
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/hawi.dtsi | 336 +++++++++++++++++++++++++++++++++++++
1 file changed, 336 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/hawi.dtsi b/arch/arm64/boot/dts/qcom/hawi.dtsi
index c7ae8133b9cd..351909a34286 100644
--- a/arch/arm64/boot/dts/qcom/hawi.dtsi
+++ b/arch/arm64/boot/dts/qcom/hawi.dtsi
@@ -3612,6 +3612,277 @@ tcsrcc: clock-controller@3b13040 {
#reset-cells = <1>;
};
+ gpu: gpu@3d00000 {
+ compatible = "qcom,adreno-44051401", "qcom,adreno";
+ reg = <0x0 0x03d00000 0x0 0x6c000>,
+ <0x0 0x03d9e000 0x0 0x2000>;
+ reg-names = "kgsl_3d0_reg_memory",
+ "cx_mem";
+
+ interrupts = <GIC_ESPI 364 IRQ_TYPE_LEVEL_HIGH>;
+
+ iommus = <&adreno_smmu 0 0x0>,
+ <&adreno_smmu 1 0x0>;
+
+ operating-points-v2 = <&gpu_opp_table>;
+
+ qcom,gmu = <&gmu>;
+ #cooling-cells = <2>;
+
+ nvmem-cells = <&gpu_speed_bin>;
+ nvmem-cell-names = "speed_bin";
+
+ interconnects = <&gem_noc MASTER_GFX3D QCOM_ICC_TAG_ALWAYS
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>;
+ interconnect-names = "gfx-mem";
+
+ status = "disabled";
+
+ gpu_zap_shader: zap-shader {
+ memory-region = <&gpu_microcode_mem>;
+ };
+
+ gpu_opp_table: opp-table {
+ compatible = "operating-points-v2-adreno",
+ "operating-points-v2";
+
+ /* Only applicable for SKUs with 1500 MHz Fmax */
+ opp-1500000000 {
+ opp-hz = /bits/ 64 <1500000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L5>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x01>;
+ qcom,opp-acd-level = <0x802f5ffd>;
+ };
+
+ /* Only applicable for SKUs with 1500 MHz Fmax */
+ opp-1475000000 {
+ opp-hz = /bits/ 64 <1475000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L3_2>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x01>;
+ qcom,opp-acd-level = <0x802f5ffd>;
+ };
+
+ opp-1450000000 {
+ opp-hz = /bits/ 64 <1450000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L3_1>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x03>;
+ qcom,opp-acd-level = <0x88285ffd>;
+ };
+
+ opp-1400000000 {
+ opp-hz = /bits/ 64 <1400000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L3_0>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x03>;
+ qcom,opp-acd-level = <0x88285ffd>;
+ };
+
+ opp-1350000000 {
+ opp-hz = /bits/ 64 <1350000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L3>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x07>;
+ qcom,opp-acd-level = <0xa8295ffd>;
+ };
+
+ opp-1275000000 {
+ opp-hz = /bits/ 64 <1275000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1_1>;
+ opp-peak-kBps = <18671875>;
+ opp-supported-hw = <0x07>;
+ qcom,opp-acd-level = <0xa82a5ffd>;
+ };
+
+ opp-1201000000 {
+ opp-hz = /bits/ 64 <1201000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1_0>;
+ opp-peak-kBps = <18671875>;
+ opp-supported-hw = <0x07>;
+ qcom,opp-acd-level = <0x882b5ffd>;
+ };
+
+ opp-1126000000 {
+ opp-hz = /bits/ 64 <1126000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1>;
+ opp-peak-kBps = <16500000>;
+ opp-supported-hw = <0x07>;
+ qcom,opp-acd-level = <0xa82b5ffd>;
+ };
+
+ opp-1025000000-0 {
+ opp-hz = /bits/ 64 <1025000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO>;
+ opp-peak-kBps = <16500000>;
+ opp-supported-hw = <0x07>;
+ qcom,opp-acd-level = <0xa82b5ffd>;
+ };
+
+ /* Only applicable for SKUs with 1025 MHz Fmax */
+ opp-1025000000-1 {
+ opp-hz = /bits/ 64 <1025000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x08>;
+ qcom,opp-acd-level = <0xa82b5ffd>;
+ };
+
+ opp-951000000 {
+ opp-hz = /bits/ 64 <951000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_NOM_L1>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82c5ffd>;
+ };
+
+ opp-843000000 {
+ opp-hz = /bits/ 64 <843000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_NOM>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82c5ffd>;
+ };
+
+ opp-801000000 {
+ opp-hz = /bits/ 64 <801000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L2_0>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82c5ffd>;
+ };
+
+ opp-759000000 {
+ opp-hz = /bits/ 64 <759000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L2>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0x882d5ffd>;
+ };
+
+ opp-693000000 {
+ opp-hz = /bits/ 64 <693000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82f5ffd>;
+ };
+
+ opp-636000000 {
+ opp-hz = /bits/ 64 <636000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L0>;
+ opp-peak-kBps = <10687500>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe0285ffd>;
+ };
+
+ opp-578000000 {
+ opp-hz = /bits/ 64 <578000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe0285ffd>;
+ };
+
+ opp-539000000 {
+ opp-hz = /bits/ 64 <539000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_L2>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xc02c5ffd>;
+ };
+
+ opp-500000000 {
+ opp-hz = /bits/ 64 <500000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_L1>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xc02c5ffd>;
+ };
+
+ opp-461000000 {
+ opp-hz = /bits/ 64 <461000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_L0>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe02d5ffd>;
+ };
+
+ opp-422000000 {
+ opp-hz = /bits/ 64 <422000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS>;
+ opp-peak-kBps = <6074218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe02d5ffd>;
+ };
+
+ opp-390000000 {
+ opp-hz = /bits/ 64 <390000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D0>;
+ opp-peak-kBps = <6074218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe02d5ffd>;
+ };
+
+ opp-357000000 {
+ opp-hz = /bits/ 64 <357000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D0_0>;
+ opp-peak-kBps = <6074218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82a5ffd>;
+ };
+
+ opp-325000000 {
+ opp-hz = /bits/ 64 <325000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D1>;
+ opp-peak-kBps = <5285156>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82a5ffd>;
+ };
+
+ opp-274000000 {
+ opp-hz = /bits/ 64 <274000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D1_1>;
+ opp-peak-kBps = <5285156>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82a5ffd>;
+ };
+
+ opp-222000000 {
+ opp-hz = /bits/ 64 <222000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D2>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xaa2a5ffd>;
+ };
+
+ opp-190000000 {
+ opp-hz = /bits/ 64 <190000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D2_1>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0x8a2f5ffd>;
+ };
+
+ opp-157000000 {
+ opp-hz = /bits/ 64 <157000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D3>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe22d5ffd>;
+ };
+
+ opp-125000000 {
+ opp-hz = /bits/ 64 <125000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D3_0>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ /* ACD is disabled */
+ };
+ };
+ };
+
gxclkctl: clock-controller@3d64000 {
compatible = "qcom,hawi-gxclkctl",
"qcom,kaanapali-gxclkctl";
@@ -3624,6 +3895,71 @@ gxclkctl: clock-controller@3d64000 {
#power-domain-cells = <1>;
};
+ gmu: gmu@3d6c000 {
+ compatible = "qcom,adreno-gmu-850.1", "qcom,adreno-gmu";
+ reg = <0x0 0x03d6c000 0x0 0x32000>;
+ reg-names = "gmu";
+
+ interrupts = <GIC_ESPI 368 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_ESPI 369 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "hfi", "gmu";
+
+ clocks = <&gpucc GPU_CC_CX_GMU_CLK>,
+ <&gpucc GPU_CC_CXO_CLK>,
+ <&gcc GCC_GPU_GEMNOC_GFX_CLK>,
+ <&gpucc GPU_CC_AHB_CLK>,
+ <&gpucc GPU_CC_MXG_AHB_CLK>,
+ <&gpucc GPU_CC_HUB_CX_INT_CLK>;
+ clock-names = "gmu",
+ "cxo",
+ "memnoc",
+ "ahb",
+ "mxg_ahb",
+ "hub";
+
+ power-domains = <&gpucc GPU_CC_CX_GDSC>,
+ <&gxclkctl GX_CLKCTL_GX_GDSC>,
+ <&gpucc GPU_CC_MXG_GDSC>;
+ power-domain-names = "cx",
+ "gx",
+ "gmu_mx";
+
+ iommus = <&adreno_smmu 5 0x0>;
+
+ qcom,qmp = <&aoss_qmp>;
+
+ operating-points-v2 = <&gmu_opp_table>;
+
+ gmu_opp_table: opp-table {
+ compatible = "operating-points-v2";
+
+ opp-556000000 {
+ opp-hz = /bits/ 64 <556000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D3>;
+ };
+
+ opp-788000000 {
+ opp-hz = /bits/ 64 <788000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS>;
+ };
+
+ opp-825000000 {
+ opp-hz = /bits/ 64 <825000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>;
+ };
+
+ opp-880000000 {
+ opp-hz = /bits/ 64 <880000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO>;
+ };
+
+ opp-917000000 {
+ opp-hz = /bits/ 64 <917000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1>;
+ };
+ };
+ };
+
gpucc: clock-controller@3d90000 {
compatible = "qcom,hawi-gpucc";
reg = <0x0 0x03d90000 0x0 0x9800>;
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 13/15] arm64: dts: qcom: hawi-mtp: Enable GPU
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (11 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 12/15] arm64: dts: qcom: hawi: Add GPU support Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 14/15] arm64: dts: qcom: maili: Add GPU support Akhil P Oommen
` (2 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Konrad Dybcio
Add the secure firmware name property and enable GPU support on
Hawi MTP device.
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/hawi-mtp.dts | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/hawi-mtp.dts b/arch/arm64/boot/dts/qcom/hawi-mtp.dts
index 7709582491f9..ee4b36f2bbad 100644
--- a/arch/arm64/boot/dts/qcom/hawi-mtp.dts
+++ b/arch/arm64/boot/dts/qcom/hawi-mtp.dts
@@ -781,6 +781,14 @@ vreg_l7n_3p3: ldo7 {
};
};
+&gpu {
+ status = "okay";
+};
+
+&gpu_zap_shader {
+ firmware-name = "qcom/hawi/gen81100_zap.mbn";
+};
+
&pcie0 {
status = "okay";
};
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 14/15] arm64: dts: qcom: maili: Add GPU support
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (12 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 13/15] arm64: dts: qcom: hawi-mtp: Enable GPU Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 10:25 ` [PATCH 15/15] arm64: dts: qcom: maili-mtp: Enable GPU Akhil P Oommen
2026-09-23 19:24 ` [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Connor Abbott
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Bhaskar Reddy Valluru
From: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Add the GPU and GMU nodes describing the register maps, interrupts,
clocks, power domains, IOMMU, interconnect paths and the OPP tables.
The GPU node is left disabled here and is enabled by the board
devicetrees.
Signed-off-by: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/maili.dtsi | 309 ++++++++++++++++++++++++++++++++++++
1 file changed, 309 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/maili.dtsi b/arch/arm64/boot/dts/qcom/maili.dtsi
index 886d307e536b..27558fbc307f 100644
--- a/arch/arm64/boot/dts/qcom/maili.dtsi
+++ b/arch/arm64/boot/dts/qcom/maili.dtsi
@@ -3776,6 +3776,250 @@ tcsrcc: clock-controller@3b13040 {
#reset-cells = <1>;
};
+ gpu: gpu@3d00000 {
+ compatible = "qcom,adreno-44041400", "qcom,adreno";
+ reg = <0x0 0x03d00000 0x0 0x6c000>,
+ <0x0 0x03d9e000 0x0 0x2000>;
+ reg-names = "kgsl_3d0_reg_memory",
+ "cx_mem";
+
+ interrupts = <GIC_ESPI 364 IRQ_TYPE_LEVEL_HIGH>;
+
+ iommus = <&adreno_smmu 0 0x0>,
+ <&adreno_smmu 1 0x0>;
+
+ operating-points-v2 = <&gpu_opp_table>;
+
+ qcom,gmu = <&gmu>;
+ #cooling-cells = <2>;
+
+ nvmem-cells = <&gpu_speed_bin>;
+ nvmem-cell-names = "speed_bin";
+
+ interconnects = <&gem_noc MASTER_GFX3D QCOM_ICC_TAG_ALWAYS
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>;
+ interconnect-names = "gfx-mem";
+
+ status = "disabled";
+
+ gpu_zap_shader: zap-shader {
+ memory-region = <&gpu_microcode_mem>;
+ };
+
+ gpu_opp_table: opp-table {
+ compatible = "operating-points-v2-adreno",
+ "operating-points-v2";
+
+ opp-1450000000 {
+ opp-hz = /bits/ 64 <1450000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L3_1>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0x88295ffd>;
+ };
+
+ opp-1400000000 {
+ opp-hz = /bits/ 64 <1400000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L3_0>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0x88295ffd>;
+ };
+
+ opp-1350000000 {
+ opp-hz = /bits/ 64 <1350000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L3>;
+ opp-peak-kBps = <20832031>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa8295ffd>;
+ };
+
+ opp-1275000000 {
+ opp-hz = /bits/ 64 <1275000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1_1>;
+ opp-peak-kBps = <18671875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82a5ffd>;
+ };
+
+ opp-1201000000 {
+ opp-hz = /bits/ 64 <1201000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1_0>;
+ opp-peak-kBps = <18671875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82b5ffd>;
+ };
+
+ opp-1126000000 {
+ opp-hz = /bits/ 64 <1126000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1>;
+ opp-peak-kBps = <16500000>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82b5ffd>;
+ };
+
+ opp-1025000000 {
+ opp-hz = /bits/ 64 <1025000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO>;
+ opp-peak-kBps = <16500000>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82b5ffd>;
+ };
+
+ opp-951000000 {
+ opp-hz = /bits/ 64 <951000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_NOM_L1>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82b5ffd>;
+ };
+
+ opp-843000000 {
+ opp-hz = /bits/ 64 <843000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_NOM>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82c5ffd>;
+ };
+
+ opp-801000000 {
+ opp-hz = /bits/ 64 <801000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L2_0>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0x882d5ffd>;
+ };
+
+ opp-759000000 {
+ opp-hz = /bits/ 64 <759000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L2>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xa82d5ffd>;
+ };
+
+ opp-693000000 {
+ opp-hz = /bits/ 64 <693000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>;
+ opp-peak-kBps = <12449218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0x882e5ffd>;
+ };
+
+ opp-636000000 {
+ opp-hz = /bits/ 64 <636000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L0>;
+ opp-peak-kBps = <10687500>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0x882f5ffd>;
+ };
+
+ opp-578000000 {
+ opp-hz = /bits/ 64 <578000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe02a5ffd>;
+ };
+
+ opp-539000000 {
+ opp-hz = /bits/ 64 <539000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_L2>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xc02c5ffd>;
+ };
+
+ opp-500000000 {
+ opp-hz = /bits/ 64 <500000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_L1>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xc02d5ffd>;
+ };
+
+ opp-461000000 {
+ opp-hz = /bits/ 64 <461000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_L0>;
+ opp-peak-kBps = <8171875>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xc02e5ffd>;
+ };
+
+ opp-422000000 {
+ opp-hz = /bits/ 64 <422000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS>;
+ opp-peak-kBps = <6074218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-390000000 {
+ opp-hz = /bits/ 64 <390000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D0>;
+ opp-peak-kBps = <6074218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-357000000 {
+ opp-hz = /bits/ 64 <357000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D0_0>;
+ opp-peak-kBps = <6074218>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-325000000 {
+ opp-hz = /bits/ 64 <325000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D1>;
+ opp-peak-kBps = <5285156>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-274000000 {
+ opp-hz = /bits/ 64 <274000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D1_1>;
+ opp-peak-kBps = <5285156>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-222000000 {
+ opp-hz = /bits/ 64 <222000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D2>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-190000000 {
+ opp-hz = /bits/ 64 <190000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D2_1>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-157000000 {
+ opp-hz = /bits/ 64 <157000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D3>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+
+ opp-125000000 {
+ opp-hz = /bits/ 64 <125000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D3_0>;
+ opp-peak-kBps = <2136718>;
+ opp-supported-hw = <0x0f>;
+ qcom,opp-acd-level = <0xe82f5ffd>;
+ };
+ };
+ };
+
gxclkctl: clock-controller@3d64000 {
compatible = "qcom,maili-gxclkctl", "qcom,kaanapali-gxclkctl";
reg = <0x0 0x03d64000 0x0 0x6000>;
@@ -3787,6 +4031,71 @@ gxclkctl: clock-controller@3d64000 {
#power-domain-cells = <1>;
};
+ gmu: gmu@3d6c000 {
+ compatible = "qcom,adreno-gmu-845.0", "qcom,adreno-gmu";
+ reg = <0x0 0x03d6c000 0x0 0x32000>;
+ reg-names = "gmu";
+
+ interrupts = <GIC_ESPI 368 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_ESPI 369 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "hfi", "gmu";
+
+ clocks = <&gpucc GPU_CC_CX_GMU_CLK>,
+ <&gpucc GPU_CC_CXO_CLK>,
+ <&gpucc GPU_CC_GPU_SMMU_VOTE_CLK>,
+ <&gpucc GPU_CC_AHB_CLK>,
+ <&gpucc GPU_CC_MXG_AHB_CLK>,
+ <&gpucc GPU_CC_HUB_CX_INT_CLK>;
+ clock-names = "gmu",
+ "cxo",
+ "smmu_vote",
+ "ahb",
+ "mxg_ahb",
+ "hub";
+
+ power-domains = <&gpucc GPU_CC_CX_GDSC>,
+ <&gxclkctl GX_CLKCTL_GX_GDSC>,
+ <&gpucc GPU_CC_MXG_GDSC>;
+ power-domain-names = "cx",
+ "gx",
+ "gmu_mx";
+
+ iommus = <&adreno_smmu 5 0x0>;
+
+ qcom,qmp = <&aoss_qmp>;
+
+ operating-points-v2 = <&gmu_opp_table>;
+
+ gmu_opp_table: opp-table {
+ compatible = "operating-points-v2";
+
+ opp-556000000 {
+ opp-hz = /bits/ 64 <556000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS_D3>;
+ };
+
+ opp-788000000 {
+ opp-hz = /bits/ 64 <788000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS>;
+ };
+
+ opp-825000000 {
+ opp-hz = /bits/ 64 <825000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>;
+ };
+
+ opp-880000000 {
+ opp-hz = /bits/ 64 <880000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO>;
+ };
+
+ opp-917000000 {
+ opp-hz = /bits/ 64 <917000000>;
+ opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1>;
+ };
+ };
+ };
+
gpucc: clock-controller@3d90000 {
compatible = "qcom,maili-gpucc";
reg = <0x0 0x03d90000 0x0 0x9800>;
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 15/15] arm64: dts: qcom: maili-mtp: Enable GPU
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (13 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 14/15] arm64: dts: qcom: maili: Add GPU support Akhil P Oommen
@ 2026-09-23 10:25 ` Akhil P Oommen
2026-09-23 19:24 ` [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Connor Abbott
15 siblings, 0 replies; 22+ messages in thread
From: Akhil P Oommen @ 2026-09-23 10:25 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson
Cc: Akhil P Oommen, linux-arm-msm, dri-devel, freedreno,
linux-kernel, devicetree, Bhaskar Reddy Valluru
From: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Add the secure firmware name property and enable GPU support on
Maili MTP device.
Signed-off-by: Bhaskar Reddy Valluru <bvalluru@qti.qualcomm.com>
Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/maili-mtp.dts | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/maili-mtp.dts b/arch/arm64/boot/dts/qcom/maili-mtp.dts
index 1fdc91e03271..27facd4b2a13 100644
--- a/arch/arm64/boot/dts/qcom/maili-mtp.dts
+++ b/arch/arm64/boot/dts/qcom/maili-mtp.dts
@@ -908,6 +908,14 @@ &tlmm {
<211 1>; /* NFC Secure IO */
};
+&gpu {
+ status = "okay";
+};
+
+&gpu_zap_shader {
+ firmware-name = "qcom/maili/gen81100_zap.mbn";
+};
+
&uart7 {
status = "okay";
};
--
2.55.0
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU
2026-09-23 10:25 [PATCH 00/15] drm/msm: Support for Hawi & Maili GPU Akhil P Oommen
` (14 preceding siblings ...)
2026-09-23 10:25 ` [PATCH 15/15] arm64: dts: qcom: maili-mtp: Enable GPU Akhil P Oommen
@ 2026-09-23 19:24 ` Connor Abbott
15 siblings, 0 replies; 22+ messages in thread
From: Connor Abbott @ 2026-09-23 19:24 UTC (permalink / raw)
To: Akhil P Oommen
Cc: Rob Clark, Sean Paul, Konrad Dybcio, Dmitry Baryshkov,
Abhinav Kumar, Jessica Zhang, Marijn Suijten, David Airlie,
Simona Vetter, Jordan Crouse, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, linux-arm-msm, dri-devel,
freedreno, linux-kernel, devicetree, Konrad Dybcio,
Bhaskar Reddy Valluru
On Wed, Sep 23, 2026 at 6:26 AM Akhil P Oommen <akhilpo@oss.qualcomm.com> wrote:
>
> Adreno 850 is the next generation of A8x GPU present in Hawi SoC. It shares
> the ADRENO_8XX_GEN2 family and slice architecture with A840, but has many
> architectural improvements. There is a new block Matrix core (MALU) which
> helps to accelerate certain compute workloads. Also, there is a new Bx rail
> that powes a part of the GPU IP. GMU is now powered by a dedicated GDSC
> powered by MxG rail.
If there is a dedicated rail for GMU, then
VK_KHR_calibrated_timestamps is likely broken, assuming that the GMU
AO counter is on this rail. The AO offset logic in kgsl probably needs
to be ported here. Has this been tested?
Connor
>
> Maili GPU (Adreno 845) is very similar to A850, except that it doesn't
> have the MALU block.
>
> We will post the Mesa support and linux-firmware support soon. MALU support
> will be brought in separately along with its support in Mesa.
>
> As there is no display support available for Hawi/Maili, validated offscreen
> testcases that render basic triangles, glmark2-offscreen etc.
>
> The driver/dt-binding patches are for Rob to pickup and the DT patches
> are for Bjorn.
>
> Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
> ---
> To: Rob Clark <robin.clark@oss.qualcomm.com>
> To: Sean Paul <sean@poorly.run>
> To: Konrad Dybcio <konradybcio@kernel.org>
> To: Akhil P Oommen <akhilpo@oss.qualcomm.com>
> To: Dmitry Baryshkov <lumag@kernel.org>
> To: Abhinav Kumar <abhinav.kumar@linux.dev>
> To: Jessica Zhang <jesszhan0024@gmail.com>
> To: Marijn Suijten <marijn.suijten@somainline.org>
> To: David Airlie <airlied@gmail.com>
> To: Simona Vetter <simona@ffwll.ch>
> To: Jordan Crouse <jordan@cosmicpenguin.net>
> To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> To: Maxime Ripard <mripard@kernel.org>
> To: Thomas Zimmermann <tzimmermann@suse.de>
> To: Rob Herring <robh@kernel.org>
> To: Krzysztof Kozlowski <krzk+dt@kernel.org>
> To: Conor Dooley <conor+dt@kernel.org>
> To: Bjorn Andersson <andersson@kernel.org>
> Cc: linux-arm-msm@vger.kernel.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: freedreno@lists.freedesktop.org
> Cc: linux-kernel@vger.kernel.org
> Cc: devicetree@vger.kernel.org
>
> ---
> Akhil P Oommen (11):
> drm/msm/a6xx: Honor perfmode_bw threshold on A8x
> drm/msm/a6xx: Fix secondary rail vote in ARC votes
> drm/msm/a6xx: Fix RPMH dependency votes
> drm/msm/a6xx: Factor out RPMh arc-vote helpers
> drm/msm/a6xx: Add BX rail support to GMU dependency votes
> drm/msm/a6xx: Clamp MX dependency vote
> drm/msm/a8xx: Add Adreno 850 support
> drm/msm/a6xx: Send THINMEM config to GMU for A850
> dt-bindings: display/msm: Document A850 GPU and GMU
> arm64: dts: qcom: hawi: Add GPU support
> arm64: dts: qcom: hawi-mtp: Enable GPU
>
> Bhaskar Reddy Valluru (4):
> drm/msm/a8xx: Add Adreno 845 support
> dt-bindings: display/msm: Document A845 GPU and GMU
> arm64: dts: qcom: maili: Add GPU support
> arm64: dts: qcom: maili-mtp: Enable GPU
>
> .../devicetree/bindings/display/msm/gmu.yaml | 90 ++++-
> .../devicetree/bindings/display/msm/gpu.yaml | 4 +
> arch/arm64/boot/dts/qcom/hawi-mtp.dts | 8 +
> arch/arm64/boot/dts/qcom/hawi.dtsi | 336 ++++++++++++++++
> arch/arm64/boot/dts/qcom/maili-mtp.dts | 8 +
> arch/arm64/boot/dts/qcom/maili.dtsi | 309 ++++++++++++++
> drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 446 +++++++++++++++++++++
> drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 231 +++++++----
> drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 1 +
> drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 2 +
> drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 25 ++
> drivers/gpu/drm/msm/adreno/a6xx_hfi.h | 1 +
> drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 16 +-
> drivers/gpu/drm/msm/adreno/adreno_gpu.h | 21 +
> drivers/gpu/drm/msm/registers/adreno/a6xx.xml | 8 +
> 15 files changed, 1407 insertions(+), 99 deletions(-)
> ---
> base-commit: 1e9b8055458b92f9ebab6f39d97ade5265a0b012
> change-id: 20260811-hawi-gpu-05b4ecfc3c4c
> prerequisite-message-id: 20260923-hawi-dt-post-v1-0-e41473b6298b@oss.qualcomm.com
> prerequisite-patch-id: 239c169e15da44519b2dad09ecd92f0052757929
> prerequisite-patch-id: 6c586be864944bb1eed773e8c211b898bb1289fe
> prerequisite-patch-id: f3d8748ccdb6760563f3e07f701a18388a9408ed
> prerequisite-patch-id: b1639353868bed10fd3cbfcd01cfb88b7e737ead
> prerequisite-message-id: 20260922-maili-dts-v1-0-ac2b1b76bfd9@oss.qualcomm.com
> prerequisite-patch-id: 36f12c16bf9cb0411d8be2f396407c724162189d
> prerequisite-patch-id: 28ede1ab83d4b5b56423ebb09bae74b6599b3bac
> prerequisite-patch-id: 6b3e28c55c07bfcdca8bfa9219fa0c6c763c6f6e
> prerequisite-patch-id: a2007fdaaeaf2981860c54ae5514f5a6f06c6bb3
> prerequisite-patch-id: af8aa3c630647336bdaeffa9c88de3650f1e49e4
>
> Best regards,
> --
> Akhil P Oommen <akhilpo@oss.qualcomm.com>
>
^ permalink raw reply [flat|nested] 22+ messages in thread