Older GC300 revisions have their power registers at an offset of 0x200 rather than 0x100. Signed-off-by: Doug Brown <doug@xxxxxxxxxxxxx> --- drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h index 85eddd492774..b375612df862 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h @@ -10,6 +10,8 @@ #include "etnaviv_gem.h" #include "etnaviv_mmu.h" #include "etnaviv_drv.h" +#include "common.xml.h" +#include "state_hi.xml.h" struct etnaviv_gem_submit; struct etnaviv_vram_mapping; @@ -149,14 +151,24 @@ struct etnaviv_gpu { unsigned long base_rate_shader; }; +static inline u32 gpu_fix_reg_address(struct etnaviv_gpu *gpu, u32 reg) +{ + /* Power registers in GC300 < 2.0 are offset by 0x100 */ + if (reg >= VIVS_PM_POWER_CONTROLS && reg <= VIVS_PM_PULSE_EATER && + gpu->identity.model == chipModel_GC300 && + gpu->identity.revision < 0x2000) + reg += 0x100; + return reg; +} + static inline void gpu_write(struct etnaviv_gpu *gpu, u32 reg, u32 data) { - writel(data, gpu->mmio + reg); + writel(data, gpu->mmio + gpu_fix_reg_address(gpu, reg)); } static inline u32 gpu_read(struct etnaviv_gpu *gpu, u32 reg) { - return readl(gpu->mmio + reg); + return readl(gpu->mmio + gpu_fix_reg_address(gpu, reg)); } int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value); -- 2.25.1