From: "Wachowski, Karol" <karol.wachow...@intel.com>

Apply Hardware Architecture Specification compatible delays
for main island power delivery for 50xx and above.

Signed-off-by: Wachowski, Karol <karol.wachow...@intel.com>
Signed-off-by: Maciej Falkowski <maciej.falkow...@linux.intel.com>
---
 drivers/accel/ivpu/ivpu_hw_40xx_reg.h |  2 ++
 drivers/accel/ivpu/ivpu_hw_ip.c       | 49 +++++++++++++++++----------
 2 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/drivers/accel/ivpu/ivpu_hw_40xx_reg.h 
b/drivers/accel/ivpu/ivpu_hw_40xx_reg.h
index d0b795b344c7..fc0ee8d637f9 100644
--- a/drivers/accel/ivpu/ivpu_hw_40xx_reg.h
+++ b/drivers/accel/ivpu/ivpu_hw_40xx_reg.h
@@ -115,6 +115,8 @@
 
 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY                    
0x00030068u
 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST_DLY_MASK      
GENMASK(7, 0)
+#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST1_DLY_MASK     
GENMASK(15, 8)
+#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST2_DLY_MASK     
GENMASK(23, 16)
 
 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY                     
0x0003006cu
 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY_STATUS_DLY_MASK     
GENMASK(7, 0)
diff --git a/drivers/accel/ivpu/ivpu_hw_ip.c b/drivers/accel/ivpu/ivpu_hw_ip.c
index dfd2f4a5b526..d3fa044d017b 100644
--- a/drivers/accel/ivpu/ivpu_hw_ip.c
+++ b/drivers/accel/ivpu/ivpu_hw_ip.c
@@ -8,15 +8,12 @@
 #include "ivpu_hw.h"
 #include "ivpu_hw_37xx_reg.h"
 #include "ivpu_hw_40xx_reg.h"
+#include "ivpu_hw_btrs.h"
 #include "ivpu_hw_ip.h"
 #include "ivpu_hw_reg_io.h"
 #include "ivpu_mmu.h"
 #include "ivpu_pm.h"
 
-#define PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT 0
-#define PWR_ISLAND_EN_POST_DLY_FREQ_HIGH    18
-#define PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT  3
-#define PWR_ISLAND_STATUS_DLY_FREQ_HIGH            46
 #define PWR_ISLAND_STATUS_TIMEOUT_US        (5 * USEC_PER_MSEC)
 
 #define TIM_SAFE_ENABLE                            0xf1d0dead
@@ -268,20 +265,15 @@ void ivpu_hw_ip_idle_gen_disable(struct ivpu_device *vdev)
                idle_gen_drive_40xx(vdev, false);
 }
 
-static void pwr_island_delay_set_50xx(struct ivpu_device *vdev)
+static void
+pwr_island_delay_set_50xx(struct ivpu_device *vdev, u32 post, u32 post1, u32 
post2, u32 status)
 {
-       u32 val, post, status;
-
-       if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) {
-               post = PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT;
-               status = PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT;
-       } else {
-               post = PWR_ISLAND_EN_POST_DLY_FREQ_HIGH;
-               status = PWR_ISLAND_STATUS_DLY_FREQ_HIGH;
-       }
+       u32 val;
 
        val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY);
        val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, 
POST_DLY, post, val);
+       val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, 
POST1_DLY, post1, val);
+       val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, 
POST2_DLY, post2, val);
        REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, val);
 
        val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY);
@@ -686,13 +678,36 @@ static void dpu_active_drive_37xx(struct ivpu_device 
*vdev, bool enable)
        REGV_WR32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, val);
 }
 
+static void pwr_island_delay_set(struct ivpu_device *vdev)
+{
+       bool high = vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_HIGH;
+       u32 post, post1, post2, status;
+
+       if (ivpu_hw_ip_gen(vdev) < IVPU_HW_IP_50XX)
+               return;
+
+       switch (ivpu_device_id(vdev)) {
+       case PCI_DEVICE_ID_PTL_P:
+               post = high ? 18 : 0;
+               post1 = 0;
+               post2 = 0;
+               status = high ? 46 : 3;
+               break;
+
+       default:
+               dump_stack();
+               ivpu_err(vdev, "Unknown device ID\n");
+               return;
+       }
+
+       pwr_island_delay_set_50xx(vdev, post, post1, post2, status);
+}
+
 int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev)
 {
        int ret;
 
-       if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_50XX)
-               pwr_island_delay_set_50xx(vdev);
-
+       pwr_island_delay_set(vdev);
        pwr_island_enable(vdev);
 
        ret = wait_for_pwr_island_status(vdev, 0x1);
-- 
2.34.1

Reply via email to