From af365186ab305d2fa3e91145ac79d2569b9df2a5 Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Date: Thu, 26 May 2022 12:06:33 +0200
Subject: [PATCH] HACK: Power up the VIP Nano

---
 drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 48 +++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index 37018bc55810d..0b9e922d447c9 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -1519,9 +1519,53 @@ static irqreturn_t irq_handler(int irq, void *data)
 	return ret;
 }
 
+#define MAX_NANOQ_FREQ        800000000
+
+#define AO_RTI_BASE           0xff800000
+#define AO_RTI_GEN_PWR_SLEEP0 (AO_RTI_BASE + (0x3a<<2))
+#define AO_RTI_GEN_PWR_ISO0   (AO_RTI_BASE + (0x3b<<2))
+#define HHI_NANOQ_MEM_PD_REG0 0xff63c10c
+#define HHI_NANOQ_MEM_PD_REG1 0xff63c110
+#define RESET_LEVEL2 0xffd01088
+
 static int etnaviv_gpu_clk_enable(struct etnaviv_gpu *gpu)
 {
 	int ret;
+	unsigned val;
+	void __iomem *addr;
+
+	/* HACK: Move this power sequence to the power domain. See Getpower_88() in gc_hal_kernel_platform_amlogic.c */
+	addr = ioremap(AO_RTI_GEN_PWR_SLEEP0, 0x4);
+	val = readl(addr);
+	val = (val & 0xfffcffff);
+	writel(val, addr);
+	iounmap(addr);
+
+	addr = ioremap(HHI_NANOQ_MEM_PD_REG0, 0x4);
+	writel(0x0, addr);
+	iounmap(addr);
+
+	addr = ioremap(HHI_NANOQ_MEM_PD_REG1, 0x4);
+	writel(0x0, addr);
+	iounmap(addr);
+
+	addr = ioremap(RESET_LEVEL2, 0x4);
+	val = readl(addr);
+	val = (val & 0xffffefff);
+	writel(val, addr);
+	iounmap(addr);
+
+	addr = ioremap(AO_RTI_GEN_PWR_ISO0, 0x4);
+	val = readl(addr);
+	val = (val & 0xfffcffff);
+	writel(val, addr);
+	iounmap(addr);
+
+	addr = ioremap(RESET_LEVEL2, 0x4);
+	val = readl(addr);
+	val = (val | (0x1<<12));
+	writel(val, addr);
+	iounmap(addr);
 
 	ret = clk_prepare_enable(gpu->clk_reg);
 	if (ret)
@@ -1539,6 +1583,10 @@ static int etnaviv_gpu_clk_enable(struct etnaviv_gpu *gpu)
 	if (ret)
 		goto disable_clk_core;
 
+	clk_set_rate(gpu->clk_bus, MAX_NANOQ_FREQ);
+	clk_set_rate(gpu->clk_core, MAX_NANOQ_FREQ);
+	udelay(5000);
+
 	return 0;
 
 disable_clk_core:
-- 
GitLab