Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Karol Wachowski and committed by
Jacek Lawrynowicz
88bdd164 c140244f

+34 -17
+2
drivers/accel/ivpu/ivpu_hw_40xx_reg.h
··· 115 115 116 116 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY 0x00030068u 117 117 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST_DLY_MASK GENMASK(7, 0) 118 + #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST1_DLY_MASK GENMASK(15, 8) 119 + #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST2_DLY_MASK GENMASK(23, 16) 118 120 119 121 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY 0x0003006cu 120 122 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY_STATUS_DLY_MASK GENMASK(7, 0)
+32 -17
drivers/accel/ivpu/ivpu_hw_ip.c
··· 8 8 #include "ivpu_hw.h" 9 9 #include "ivpu_hw_37xx_reg.h" 10 10 #include "ivpu_hw_40xx_reg.h" 11 + #include "ivpu_hw_btrs.h" 11 12 #include "ivpu_hw_ip.h" 12 13 #include "ivpu_hw_reg_io.h" 13 14 #include "ivpu_mmu.h" 14 15 #include "ivpu_pm.h" 15 16 16 - #define PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT 0 17 - #define PWR_ISLAND_EN_POST_DLY_FREQ_HIGH 18 18 - #define PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT 3 19 - #define PWR_ISLAND_STATUS_DLY_FREQ_HIGH 46 20 17 #define PWR_ISLAND_STATUS_TIMEOUT_US (5 * USEC_PER_MSEC) 21 18 22 19 #define TIM_SAFE_ENABLE 0xf1d0dead ··· 265 268 idle_gen_drive_40xx(vdev, false); 266 269 } 267 270 268 - static void pwr_island_delay_set_50xx(struct ivpu_device *vdev) 271 + static void 272 + pwr_island_delay_set_50xx(struct ivpu_device *vdev, u32 post, u32 post1, u32 post2, u32 status) 269 273 { 270 - u32 val, post, status; 271 - 272 - if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) { 273 - post = PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT; 274 - status = PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT; 275 - } else { 276 - post = PWR_ISLAND_EN_POST_DLY_FREQ_HIGH; 277 - status = PWR_ISLAND_STATUS_DLY_FREQ_HIGH; 278 - } 274 + u32 val; 279 275 280 276 val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY); 281 277 val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST_DLY, post, val); 278 + val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST1_DLY, post1, val); 279 + val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST2_DLY, post2, val); 282 280 REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, val); 283 281 284 282 val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY); ··· 674 682 REGV_WR32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, val); 675 683 } 676 684 685 + static void pwr_island_delay_set(struct ivpu_device *vdev) 686 + { 687 + bool high = vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_HIGH; 688 + u32 post, post1, post2, status; 689 + 690 + if (ivpu_hw_ip_gen(vdev) < IVPU_HW_IP_50XX) 691 + return; 692 + 693 + switch (ivpu_device_id(vdev)) { 694 + case PCI_DEVICE_ID_PTL_P: 695 + post = high ? 18 : 0; 696 + post1 = 0; 697 + post2 = 0; 698 + status = high ? 46 : 3; 699 + break; 700 + 701 + default: 702 + dump_stack(); 703 + ivpu_err(vdev, "Unknown device ID\n"); 704 + return; 705 + } 706 + 707 + pwr_island_delay_set_50xx(vdev, post, post1, post2, status); 708 + } 709 + 677 710 int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev) 678 711 { 679 712 int ret; 680 713 681 - if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_50XX) 682 - pwr_island_delay_set_50xx(vdev); 683 - 714 + pwr_island_delay_set(vdev); 684 715 pwr_island_enable(vdev); 685 716 686 717 ret = wait_for_pwr_island_status(vdev, 0x1);