* [PATCH v3 1/4] dt-bindings: display: msm: Document Adreno 620 and its GMU
2026-10-23 9:53 [PATCH v3 0/4] drm/msm/adreno: Add Adreno 620 Ishu Brar via B4 Relay
@ 2026-10-23 9:53 ` Ishu Brar via B4 Relay
2026-10-23 21:09 ` Rob Herring
2026-10-23 9:53 ` [PATCH v3 2/4] drm/msm/a6xx: Program the PDC sequencer on Adreno 620 Ishu Brar via B4 Relay
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Ishu Brar via B4 Relay @ 2026-10-23 9:53 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio, Akhil P Oommen
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel, Ishu Brar
From: Ishu Brar <patches@brar.si>
Add the Adreno 620 found in the Qualcomm SM7250 and its GMU. The GMU
has the same registers, clocks, interrupts and power domains as the
650.2 one. As on the other A6xx parts, the GPU clocks are defined in
the GMU node, so the GPU node has none.
Signed-off-by: Ishu Brar <patches@brar.si>
---
Documentation/devicetree/bindings/display/msm/gmu.yaml | 2 ++
Documentation/devicetree/bindings/display/msm/gpu.yaml | 1 +
2 files changed, 3 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/msm/gmu.yaml b/Documentation/devicetree/bindings/display/msm/gmu.yaml
index 07f0e547b..3478adebd 100644
--- a/Documentation/devicetree/bindings/display/msm/gmu.yaml
+++ b/Documentation/devicetree/bindings/display/msm/gmu.yaml
@@ -217,6 +217,7 @@ allOf:
compatible:
contains:
enum:
+ - qcom,adreno-gmu-620.0
- qcom,adreno-gmu-650.2
then:
properties:
@@ -238,6 +239,7 @@ allOf:
compatible:
contains:
enum:
+ - qcom,adreno-gmu-620.0
- qcom,adreno-gmu-640.1
- qcom,adreno-gmu-650.2
then:
diff --git a/Documentation/devicetree/bindings/display/msm/gpu.yaml b/Documentation/devicetree/bindings/display/msm/gpu.yaml
index c30de7feb..cf015fdee 100644
--- a/Documentation/devicetree/bindings/display/msm/gpu.yaml
+++ b/Documentation/devicetree/bindings/display/msm/gpu.yaml
@@ -435,6 +435,7 @@ allOf:
- qcom,adreno-615.0
- qcom,adreno-618.0
- qcom,adreno-619.0
+ - qcom,adreno-620.0
- qcom,adreno-621.0
- qcom,adreno-623.0
- qcom,adreno-630.2
--
2.56.0
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v3 1/4] dt-bindings: display: msm: Document Adreno 620 and its GMU
2026-10-23 9:53 ` [PATCH v3 1/4] dt-bindings: display: msm: Document Adreno 620 and its GMU Ishu Brar via B4 Relay
@ 2026-10-23 21:09 ` Rob Herring
0 siblings, 0 replies; 6+ messages in thread
From: Rob Herring @ 2026-10-23 21:09 UTC (permalink / raw)
To: Ishu Brar
Cc: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio, Akhil P Oommen,
linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel
On Fri, Oct 23, 2026 at 03:23:31PM +0530, Ishu Brar wrote:
> Add the Adreno 620 found in the Qualcomm SM7250 and its GMU. The GMU
> has the same registers, clocks, interrupts and power domains as the
> 650.2 one. As on the other A6xx parts, the GPU clocks are defined in
> the GMU node, so the GPU node has none.
>
> Signed-off-by: Ishu Brar <patches@brar.si>
Missing Krzysztof's Reviewed-by.
Rob
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 2/4] drm/msm/a6xx: Program the PDC sequencer on Adreno 620
2026-10-23 9:53 [PATCH v3 0/4] drm/msm/adreno: Add Adreno 620 Ishu Brar via B4 Relay
2026-10-23 9:53 ` [PATCH v3 1/4] dt-bindings: display: msm: Document Adreno 620 and its GMU Ishu Brar via B4 Relay
@ 2026-10-23 9:53 ` Ishu Brar via B4 Relay
2026-10-23 9:53 ` [PATCH v3 3/4] drm/msm/a6xx: Factor out the common BCM list Ishu Brar via B4 Relay
2026-10-23 9:53 ` [PATCH v3 4/4] drm/msm/adreno: Add Adreno 620 Ishu Brar via B4 Relay
3 siblings, 0 replies; 6+ messages in thread
From: Ishu Brar via B4 Relay @ 2026-10-23 9:53 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio, Akhil P Oommen
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel, Ishu Brar
From: Ishu Brar <patches@brar.si>
Unlike the rest of the A650 family, the A620 does not get its PDC set up
by AOP (the downstream devicetree has no pdc_in_aop for it). Without the
sequence, the RSC never acks the second power-up ("Unable to power on
the GPU RSC") and the device hangs.
Program the sequence from the driver, taking the xo, mx and cx resource
addresses from cmd-db instead of the hardcoded ones. Like the downstream
driver, also program the VRM command when cmd-db has a vrm.soc resource.
Add adreno_is_a620() for the selection.
Assisted-by: Claude
Signed-off-by: Ishu Brar <patches@brar.si>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 35 +++++++++++++++++++++++++++------
drivers/gpu/drm/msm/adreno/adreno_gpu.h | 5 +++++
2 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 662f09bec..8d426f1f1 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -686,6 +686,7 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu)
u32 seqmem0_drv0_reg = REG_A6XX_RSCC_SEQ_MEM_0_DRV0;
void __iomem *seqptr = NULL;
uint32_t pdc_address_offset;
+ u32 mx_addr = 0x30010, cx_addr = 0x30000, vrm_addr = 0;
void __iomem *pdcptr;
bool pdc_in_aop = false;
@@ -697,8 +698,18 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu)
if (IS_ERR(pdcptr))
return;
- if (adreno_is_a650_family(adreno_gpu) ||
- adreno_is_a7xx(adreno_gpu))
+ /* Unlike the rest of the A650 family, A620 has no PDC setup from AOP */
+ if (adreno_is_a620(adreno_gpu)) {
+ pdc_address_offset = cmd_db_read_addr("xo.lvl");
+ mx_addr = cmd_db_read_addr("mx.lvl");
+ cx_addr = cmd_db_read_addr("cx.lvl");
+ vrm_addr = cmd_db_read_addr("vrm.soc");
+ if (!pdc_address_offset || !mx_addr || !cx_addr) {
+ DRM_DEV_ERROR(gmu->dev, "No PDC resource addresses in cmd-db\n");
+ return;
+ }
+ } else if (adreno_is_a650_family(adreno_gpu) ||
+ adreno_is_a7xx(adreno_gpu))
pdc_in_aop = true;
else if (adreno_is_a618(adreno_gpu) || adreno_is_a640_family(adreno_gpu))
pdc_address_offset = 0x30090;
@@ -766,25 +777,31 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu)
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD_WAIT_FOR_CMPL_BANK, 0);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CONTROL, 0);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_MSGID, 0x10108);
- pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_ADDR, 0x30010);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_ADDR, mx_addr);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_DATA, 1);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_MSGID + 4, 0x10108);
- pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_ADDR + 4, 0x30000);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_ADDR + 4, cx_addr);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_DATA + 4, 0x0);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_MSGID + 8, 0x10108);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_ADDR + 8, pdc_address_offset);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_DATA + 8, 0x0);
+ if (vrm_addr) {
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_MSGID + 12, 0x10108);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_ADDR + 12, vrm_addr + 0x4);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS1_CMD0_DATA + 12, 0x0);
+ }
+
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD_ENABLE_BANK, 7);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD_WAIT_FOR_CMPL_BANK, 0);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CONTROL, 0);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_MSGID, 0x10108);
- pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_ADDR, 0x30010);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_ADDR, mx_addr);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_DATA, 2);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_MSGID + 4, 0x10108);
- pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_ADDR + 4, 0x30000);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_ADDR + 4, cx_addr);
if (adreno_is_a618(adreno_gpu) || adreno_is_a619(adreno_gpu) ||
adreno_is_a650_family(adreno_gpu))
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_DATA + 4, 0x2);
@@ -794,6 +811,12 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu)
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_ADDR + 8, pdc_address_offset);
pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_DATA + 8, 0x3);
+ if (vrm_addr) {
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_MSGID + 12, 0x10108);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_ADDR + 12, vrm_addr + 0x4);
+ pdc_write(pdcptr, REG_A6XX_PDC_GPU_TCS3_CMD0_DATA + 12, 0x1);
+ }
+
/* Setup GPU PDC */
setup_pdc:
pdc_write(pdcptr, REG_A6XX_PDC_GPU_SEQ_START_ADDR, 0);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
index 4b2156825..b77502446 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
@@ -443,6 +443,11 @@ static inline int adreno_is_a619_holi(const struct adreno_gpu *gpu)
return adreno_is_a619(gpu) && adreno_has_gmu_wrapper(gpu);
}
+static inline int adreno_is_a620(const struct adreno_gpu *gpu)
+{
+ return gpu->info->chip_ids[0] == 0x06020000;
+}
+
static inline int adreno_is_a621(const struct adreno_gpu *gpu)
{
return gpu->info->chip_ids[0] == 0x06020100;
--
2.56.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v3 3/4] drm/msm/a6xx: Factor out the common BCM list
2026-10-23 9:53 [PATCH v3 0/4] drm/msm/adreno: Add Adreno 620 Ishu Brar via B4 Relay
2026-10-23 9:53 ` [PATCH v3 1/4] dt-bindings: display: msm: Document Adreno 620 and its GMU Ishu Brar via B4 Relay
2026-10-23 9:53 ` [PATCH v3 2/4] drm/msm/a6xx: Program the PDC sequencer on Adreno 620 Ishu Brar via B4 Relay
@ 2026-10-23 9:53 ` Ishu Brar via B4 Relay
2026-10-23 9:53 ` [PATCH v3 4/4] drm/msm/adreno: Add Adreno 620 Ishu Brar via B4 Relay
3 siblings, 0 replies; 6+ messages in thread
From: Ishu Brar via B4 Relay @ 2026-10-23 9:53 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio, Akhil P Oommen
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel, Ishu Brar
From: Ishu Brar <patches@brar.si>
The A690 entry carries a list of the Bus Clock Managers it votes for
(SH0, MC0 and ACV) which is the same for other A6xx GPUs. Move it to a
shared array so that more entries can refer to it instead of repeating
it.
No functional change.
Assisted-by: Claude
Signed-off-by: Ishu Brar <patches@brar.si>
---
drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
index 4ef2bd6e7..c4d332f48 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
@@ -736,6 +736,17 @@ static const struct adreno_reglist a702_hwcg[] = {
{}
};
+static const struct a6xx_bcm a6xx_bcms[] = {
+ { .name = "SH0", .buswidth = 16 },
+ { .name = "MC0", .buswidth = 4 },
+ {
+ .name = "ACV",
+ .fixed = true,
+ .perfmode = BIT(3),
+ },
+ { /* sentinel */ },
+};
+
static const struct adreno_info a6xx_gpus[] = {
{
.chip_ids = ADRENO_CHIP_IDS(0x06010000),
@@ -985,16 +996,7 @@ static const struct adreno_info a6xx_gpus[] = {
.gbif_cx = a640_gbif,
.gmu_cgc_mode = 0x00020200,
.prim_fifo_threshold = 0x00010000,
- .bcms = (const struct a6xx_bcm[]) {
- { .name = "SH0", .buswidth = 16 },
- { .name = "MC0", .buswidth = 4 },
- {
- .name = "ACV",
- .fixed = true,
- .perfmode = BIT(3),
- },
- { /* sentinel */ },
- },
+ .bcms = a6xx_bcms,
},
.speedbins = ADRENO_SPEEDBINS(
{ 0, 0 },
--
2.56.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v3 4/4] drm/msm/adreno: Add Adreno 620
2026-10-23 9:53 [PATCH v3 0/4] drm/msm/adreno: Add Adreno 620 Ishu Brar via B4 Relay
` (2 preceding siblings ...)
2026-10-23 9:53 ` [PATCH v3 3/4] drm/msm/a6xx: Factor out the common BCM list Ishu Brar via B4 Relay
@ 2026-10-23 9:53 ` Ishu Brar via B4 Relay
3 siblings, 0 replies; 6+ messages in thread
From: Ishu Brar via B4 Relay @ 2026-10-23 9:53 UTC (permalink / raw)
To: Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio, Akhil P Oommen
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel, Ishu Brar
From: Ishu Brar <patches@brar.si>
Add the catalog entry for the Adreno 620 (chip id 0x06020000) found in
the Snapdragon 765/765G/768G (SM7250). It is an A650 derivative and
uses its SQE and GMU firmware and protect table, together with the A620
zap shader.
The speed-bin fuse values map to the OPP bins as in the downstream
"lito" devicetree: fuse 0 is the default bin and fuse 132 and 115 are
the two alternate ones.
The GMU clock gating mode is 0x00020202, which is what the downstream
driver programs on every A6xx except the A612 and A615 family. Use the
shared list of Bus Clock Managers so that the GMU bandwidth table is
generated from the bandwidth levels of the GPU OPP table.
Signed-off-by: Ishu Brar <patches@brar.si>
---
drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
index c4d332f48..6cdc3f5a2 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
@@ -954,6 +954,32 @@ static const struct adreno_info a6xx_gpus[] = {
{ 169, 2 },
{ 180, 1 },
),
+ }, {
+ .chip_ids = ADRENO_CHIP_IDS(0x06020000),
+ .family = ADRENO_6XX_GEN3,
+ .fw = {
+ [ADRENO_FW_SQE] = "a650_sqe.fw",
+ [ADRENO_FW_GMU] = "a650_gmu.bin",
+ },
+ .gmem = SZ_512K,
+ .inactive_period = DRM_MSM_INACTIVE_PERIOD,
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
+ ADRENO_QUIRK_HAS_HW_APRIV,
+ .funcs = &a6xx_gpu_funcs,
+ .zapfw = "a620_zap.mbn",
+ .a6xx = &(const struct a6xx_info) {
+ .hwcg = a620_hwcg,
+ .protect = &a650_protect,
+ .gbif_cx = a640_gbif,
+ .gmu_cgc_mode = 0x00020202,
+ .prim_fifo_threshold = 0x00010000,
+ .bcms = a6xx_bcms,
+ },
+ .speedbins = ADRENO_SPEEDBINS(
+ { 0, 0 },
+ { 132, 1 },
+ { 115, 3 },
+ ),
}, {
.chip_ids = ADRENO_CHIP_IDS(0x06020100),
.family = ADRENO_6XX_GEN3,
--
2.56.0
^ permalink raw reply [flat|nested] 6+ messages in thread