mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
accel/ivpu: Update power island delays
Apply Hardware Architecture Specification compatible delays for main island power delivery for 50xx and above. Signed-off-by: Karol Wachowski <karol.wachowski@intel.com> Signed-off-by: Maciej Falkowski <maciej.falkowski@linux.intel.com> Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241004162505.1695605-3-maciej.falkowski@linux.intel.com Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
This commit is contained in:
committed by
Jacek Lawrynowicz
parent
c140244f0c
commit
88bdd1644c
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
@@ -682,13 +674,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);
|
||||
|
||||
Reference in New Issue
Block a user