[RFC PATCH 05/18] drm/panthor: Move register base offsets to the HW description
From: Karunika Choo
Date: Thu May 28 2026 - 11:16:44 EST
Mali v15 reorders several register regions, including GPU_CONTROL,
MCU_CONTROL and PWR_CONTROL, so the driver can no longer assume a single
fixed base layout across all supported GPUs.
Add per-GPU register base offsets to the panthor hardware description
and switch the GPU, FW and PWR local iomem setup to use those stored
values. With the base addresses now owned by the hardware description,
drop the corresponding fixed base-offset definitions from the register
headers.
This prepares the driver for GPUs with different register layouts
without changing the existing behaviour on currently supported parts.
Signed-off-by: Karunika Choo <karunika.choo@xxxxxxx>
---
drivers/gpu/drm/panthor/panthor_fw.c | 2 +-
drivers/gpu/drm/panthor/panthor_fw_regs.h | 2 --
drivers/gpu/drm/panthor/panthor_gpu.c | 7 +++----
drivers/gpu/drm/panthor/panthor_gpu_regs.h | 2 --
drivers/gpu/drm/panthor/panthor_hw.c | 13 +++++++++++--
drivers/gpu/drm/panthor/panthor_hw.h | 19 +++++++++++++++++--
drivers/gpu/drm/panthor/panthor_pwr.c | 4 ++--
drivers/gpu/drm/panthor/panthor_pwr_regs.h | 3 ---
8 files changed, 34 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c
index 784d0a25beb2..f6381f5f236f 100644
--- a/drivers/gpu/drm/panthor/panthor_fw.c
+++ b/drivers/gpu/drm/panthor/panthor_fw.c
@@ -1467,7 +1467,7 @@ int panthor_fw_init(struct panthor_device *ptdev)
if (!fw)
return -ENOMEM;
- fw->iomem = ptdev->iomem + MCU_CONTROL_BASE;
+ fw->iomem = ptdev->iomem + ptdev->hw->map.mcu_control_base;
ptdev->fw = fw;
init_waitqueue_head(&fw->req_waitqueue);
INIT_LIST_HEAD(&fw->sections);
diff --git a/drivers/gpu/drm/panthor/panthor_fw_regs.h b/drivers/gpu/drm/panthor/panthor_fw_regs.h
index b2e59cfc22b0..a3492f7f913f 100644
--- a/drivers/gpu/drm/panthor/panthor_fw_regs.h
+++ b/drivers/gpu/drm/panthor/panthor_fw_regs.h
@@ -4,8 +4,6 @@
#ifndef __PANTHOR_FW_REGS_H__
#define __PANTHOR_FW_REGS_H__
-#define MCU_CONTROL_BASE 0x700
-
#define MCU_CONTROL 0x0
#define MCU_CONTROL_ENABLE 1
#define MCU_CONTROL_AUTO 2
diff --git a/drivers/gpu/drm/panthor/panthor_gpu.c b/drivers/gpu/drm/panthor/panthor_gpu.c
index bb5e64188a15..3c88a25287bf 100644
--- a/drivers/gpu/drm/panthor/panthor_gpu.c
+++ b/drivers/gpu/drm/panthor/panthor_gpu.c
@@ -154,7 +154,7 @@ int panthor_gpu_init(struct panthor_device *ptdev)
if (!gpu)
return -ENOMEM;
- gpu->iomem = ptdev->iomem + GPU_CONTROL_BASE;
+ gpu->iomem = ptdev->iomem + ptdev->hw->map.gpu_control_base;
spin_lock_init(&gpu->reqs_lock);
init_waitqueue_head(&gpu->reqs_acked);
mutex_init(&gpu->cache_flush_lock);
@@ -170,9 +170,8 @@ int panthor_gpu_init(struct panthor_device *ptdev)
if (irq < 0)
return irq;
- ret = panthor_request_gpu_irq(ptdev, &ptdev->gpu->irq, irq,
- GPU_INTERRUPTS_MASK,
- ptdev->iomem + GPU_INT_BASE);
+ ret = panthor_request_gpu_irq(ptdev, &ptdev->gpu->irq, irq, GPU_INTERRUPTS_MASK,
+ gpu->iomem + GPU_INT_BASE);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/panthor/panthor_gpu_regs.h b/drivers/gpu/drm/panthor/panthor_gpu_regs.h
index 4c5b953796e4..753df8700990 100644
--- a/drivers/gpu/drm/panthor/panthor_gpu_regs.h
+++ b/drivers/gpu/drm/panthor/panthor_gpu_regs.h
@@ -4,8 +4,6 @@
#ifndef __PANTHOR_GPU_REGS_H__
#define __PANTHOR_GPU_REGS_H__
-#define GPU_CONTROL_BASE 0x0
-
#define GPU_ID 0x0
#define GPU_ARCH_MAJOR(x) ((x) >> 28)
#define GPU_ARCH_MINOR(x) (((x) & GENMASK(27, 24)) >> 24)
diff --git a/drivers/gpu/drm/panthor/panthor_hw.c b/drivers/gpu/drm/panthor/panthor_hw.c
index 833d10cbb2d6..1f7fab4caf4d 100644
--- a/drivers/gpu/drm/panthor/panthor_hw.c
+++ b/drivers/gpu/drm/panthor/panthor_hw.c
@@ -38,6 +38,10 @@ static struct panthor_hw panthor_hw_arch_v10 = {
.power_changed_off = panthor_gpu_power_changed_off,
.power_changed_on = panthor_gpu_power_changed_on,
},
+ .map = {
+ .gpu_control_base = 0x0,
+ .mcu_control_base = 0x700,
+ },
};
static struct panthor_hw panthor_hw_arch_v14 = {
@@ -46,6 +50,11 @@ static struct panthor_hw panthor_hw_arch_v14 = {
.l2_power_off = panthor_pwr_l2_power_off,
.l2_power_on = panthor_pwr_l2_power_on,
},
+ .map = {
+ .gpu_control_base = 0x0,
+ .pwr_control_base = 0x800,
+ .mcu_control_base = 0x700,
+ },
};
static struct panthor_hw_entry panthor_hw_match[] = {
@@ -197,7 +206,7 @@ static int panthor_gpu_info_init(struct panthor_device *ptdev)
{
unsigned int i;
- void __iomem *gpu_iomem = ptdev->iomem + GPU_CONTROL_BASE;
+ void __iomem *gpu_iomem = ptdev->iomem + ptdev->hw->map.gpu_control_base;
ptdev->gpu_info.csf_id = gpu_read(gpu_iomem, GPU_CSF_ID);
ptdev->gpu_info.gpu_rev = gpu_read(gpu_iomem, GPU_REVID);
@@ -223,7 +232,7 @@ static int panthor_gpu_info_init(struct panthor_device *ptdev)
ptdev->gpu_info.gpu_features = gpu_read64(gpu_iomem, GPU_FEATURES);
if (panthor_hw_has_pwr_ctrl(ptdev)) {
- void __iomem *pwr_iomem = gpu_iomem + PWR_CONTROL_BASE;
+ void __iomem *pwr_iomem = ptdev->iomem + ptdev->hw->map.pwr_control_base;
/* Introduced in arch 14.x */
ptdev->gpu_info.l2_present = gpu_read64(pwr_iomem, PWR_L2_PRESENT);
diff --git a/drivers/gpu/drm/panthor/panthor_hw.h b/drivers/gpu/drm/panthor/panthor_hw.h
index 2a666d8cdb98..58673a427bc9 100644
--- a/drivers/gpu/drm/panthor/panthor_hw.h
+++ b/drivers/gpu/drm/panthor/panthor_hw.h
@@ -26,14 +26,29 @@ struct panthor_hw_ops {
void (*power_changed_off)(struct panthor_device *ptdev);
};
+/**
+ * struct panthor_hw_regmap - Register base addresses
+ */
+struct panthor_hw_regmap {
+ /** @gpu_control_base: GPU_CONTROL base address */
+ u32 gpu_control_base;
+
+ /** @pwr_control_base: PWR_CONTROL base address */
+ u32 pwr_control_base;
+
+ /** @mcu_control_base: MCU_CONTROL base address */
+ u32 mcu_control_base;
+};
+
/**
* struct panthor_hw - GPU specific register mapping and functions
*/
struct panthor_hw {
- /** @features: Bitmap containing panthor_hw_feature */
-
/** @ops: Panthor HW specific operations */
struct panthor_hw_ops ops;
+
+ /** @map: Panthor HW-specific register base addresses */
+ struct panthor_hw_regmap map;
};
int panthor_hw_init(struct panthor_device *ptdev);
diff --git a/drivers/gpu/drm/panthor/panthor_pwr.c b/drivers/gpu/drm/panthor/panthor_pwr.c
index 1cba093a2452..b833e4559e45 100644
--- a/drivers/gpu/drm/panthor/panthor_pwr.c
+++ b/drivers/gpu/drm/panthor/panthor_pwr.c
@@ -475,7 +475,7 @@ int panthor_pwr_init(struct panthor_device *ptdev)
if (!pwr)
return -ENOMEM;
- pwr->iomem = ptdev->iomem + PWR_CONTROL_BASE;
+ pwr->iomem = ptdev->iomem + ptdev->hw->map.pwr_control_base;
spin_lock_init(&pwr->reqs_lock);
init_waitqueue_head(&pwr->reqs_acked);
ptdev->pwr = pwr;
@@ -486,7 +486,7 @@ int panthor_pwr_init(struct panthor_device *ptdev)
err = panthor_request_pwr_irq(
ptdev, &pwr->irq, irq, PWR_INTERRUPTS_MASK,
- pwr->iomem + PWR_INT_BASE);
+ pwr->iomem);
if (err)
return err;
diff --git a/drivers/gpu/drm/panthor/panthor_pwr_regs.h b/drivers/gpu/drm/panthor/panthor_pwr_regs.h
index 9cf7a715066f..12939dcd7519 100644
--- a/drivers/gpu/drm/panthor/panthor_pwr_regs.h
+++ b/drivers/gpu/drm/panthor/panthor_pwr_regs.h
@@ -4,9 +4,6 @@
#ifndef __PANTHOR_PWR_REGS_H__
#define __PANTHOR_PWR_REGS_H__
-#define PWR_CONTROL_BASE 0x800
-
-#define PWR_INT_BASE 0x0
#define PWR_IRQ_POWER_CHANGED_SINGLE BIT(0)
#define PWR_IRQ_POWER_CHANGED_ALL BIT(1)
#define PWR_IRQ_DELEGATION_CHANGED BIT(2)
--
2.43.0