xref: /linux/drivers/accel/ivpu/ivpu_hw_ip.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
18a27ad81SWachowski, Karol // SPDX-License-Identifier: GPL-2.0-only
28a27ad81SWachowski, Karol /*
38a27ad81SWachowski, Karol  * Copyright (C) 2020-2024 Intel Corporation
48a27ad81SWachowski, Karol  */
58a27ad81SWachowski, Karol 
68a27ad81SWachowski, Karol #include "ivpu_drv.h"
78a27ad81SWachowski, Karol #include "ivpu_fw.h"
88a27ad81SWachowski, Karol #include "ivpu_hw.h"
98a27ad81SWachowski, Karol #include "ivpu_hw_37xx_reg.h"
108a27ad81SWachowski, Karol #include "ivpu_hw_40xx_reg.h"
118a27ad81SWachowski, Karol #include "ivpu_hw_ip.h"
128a27ad81SWachowski, Karol #include "ivpu_hw_reg_io.h"
138a27ad81SWachowski, Karol #include "ivpu_mmu.h"
148a27ad81SWachowski, Karol #include "ivpu_pm.h"
158a27ad81SWachowski, Karol 
168a27ad81SWachowski, Karol #define PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT 0
178a27ad81SWachowski, Karol #define PWR_ISLAND_EN_POST_DLY_FREQ_HIGH    18
188a27ad81SWachowski, Karol #define PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT  3
198a27ad81SWachowski, Karol #define PWR_ISLAND_STATUS_DLY_FREQ_HIGH	    46
208a27ad81SWachowski, Karol #define PWR_ISLAND_STATUS_TIMEOUT_US        (5 * USEC_PER_MSEC)
218a27ad81SWachowski, Karol 
228a27ad81SWachowski, Karol #define TIM_SAFE_ENABLE		            0xf1d0dead
238a27ad81SWachowski, Karol #define TIM_WATCHDOG_RESET_VALUE            0xffffffff
248a27ad81SWachowski, Karol 
258a27ad81SWachowski, Karol #define ICB_0_IRQ_MASK_37XX ((REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT)) | \
268a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT)) | \
278a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT)) | \
288a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT)) | \
298a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT)) | \
308a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT)) | \
318a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT)))
328a27ad81SWachowski, Karol 
338a27ad81SWachowski, Karol #define ICB_1_IRQ_MASK_37XX ((REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_2_INT)) | \
348a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_3_INT)) | \
358a27ad81SWachowski, Karol 			     (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_4_INT)))
368a27ad81SWachowski, Karol 
378a27ad81SWachowski, Karol #define ICB_0_1_IRQ_MASK_37XX ((((u64)ICB_1_IRQ_MASK_37XX) << 32) | ICB_0_IRQ_MASK_37XX)
388a27ad81SWachowski, Karol 
398a27ad81SWachowski, Karol #define ICB_0_IRQ_MASK_40XX ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT)) | \
408a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT)) | \
418a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT)) | \
428a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT)) | \
438a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT)) | \
448a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT)) | \
458a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT)))
468a27ad81SWachowski, Karol 
478a27ad81SWachowski, Karol #define ICB_1_IRQ_MASK_40XX ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_2_INT)) | \
488a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_3_INT)) | \
498a27ad81SWachowski, Karol 			     (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_4_INT)))
508a27ad81SWachowski, Karol 
518a27ad81SWachowski, Karol #define ICB_0_1_IRQ_MASK_40XX ((((u64)ICB_1_IRQ_MASK_40XX) << 32) | ICB_0_IRQ_MASK_40XX)
528a27ad81SWachowski, Karol 
538a27ad81SWachowski, Karol #define ITF_FIREWALL_VIOLATION_MASK_37XX ((REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_ROM_CMX)) | \
548a27ad81SWachowski, Karol 					  (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_DBG)) | \
558a27ad81SWachowski, Karol 					  (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_CTRL)) | \
568a27ad81SWachowski, Karol 					  (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, DEC400)) | \
578a27ad81SWachowski, Karol 					  (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_NCE)) | \
588a27ad81SWachowski, Karol 					  (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI)) | \
598a27ad81SWachowski, Karol 					  (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI_CMX)))
608a27ad81SWachowski, Karol 
618a27ad81SWachowski, Karol #define ITF_FIREWALL_VIOLATION_MASK_40XX ((REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_ROM_CMX)) | \
628a27ad81SWachowski, Karol 					  (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_DBG)) | \
638a27ad81SWachowski, Karol 					  (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_CTRL)) | \
648a27ad81SWachowski, Karol 					  (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, DEC400)) | \
658a27ad81SWachowski, Karol 					  (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_NCE)) | \
668a27ad81SWachowski, Karol 					  (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI)) | \
678a27ad81SWachowski, Karol 					  (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI_CMX)))
688a27ad81SWachowski, Karol 
wait_for_ip_bar(struct ivpu_device * vdev)698a27ad81SWachowski, Karol static int wait_for_ip_bar(struct ivpu_device *vdev)
708a27ad81SWachowski, Karol {
718a27ad81SWachowski, Karol 	return REGV_POLL_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, AON, 0, 100);
728a27ad81SWachowski, Karol }
738a27ad81SWachowski, Karol 
host_ss_rst_clr(struct ivpu_device * vdev)748a27ad81SWachowski, Karol static void host_ss_rst_clr(struct ivpu_device *vdev)
758a27ad81SWachowski, Karol {
768a27ad81SWachowski, Karol 	u32 val = 0;
778a27ad81SWachowski, Karol 
788a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, TOP_NOC, val);
798a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, DSS_MAS, val);
808a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, MSS_MAS, val);
818a27ad81SWachowski, Karol 
828a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_CPR_RST_CLR, val);
838a27ad81SWachowski, Karol }
848a27ad81SWachowski, Karol 
host_ss_noc_qreqn_check_37xx(struct ivpu_device * vdev,u32 exp_val)858a27ad81SWachowski, Karol static int host_ss_noc_qreqn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
868a27ad81SWachowski, Karol {
878a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QREQN);
888a27ad81SWachowski, Karol 
898a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, exp_val, val))
908a27ad81SWachowski, Karol 		return -EIO;
918a27ad81SWachowski, Karol 
928a27ad81SWachowski, Karol 	return 0;
938a27ad81SWachowski, Karol }
948a27ad81SWachowski, Karol 
host_ss_noc_qreqn_check_40xx(struct ivpu_device * vdev,u32 exp_val)958a27ad81SWachowski, Karol static int host_ss_noc_qreqn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
968a27ad81SWachowski, Karol {
978a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN);
988a27ad81SWachowski, Karol 
998a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, exp_val, val))
1008a27ad81SWachowski, Karol 		return -EIO;
1018a27ad81SWachowski, Karol 
1028a27ad81SWachowski, Karol 	return 0;
1038a27ad81SWachowski, Karol }
1048a27ad81SWachowski, Karol 
host_ss_noc_qreqn_check(struct ivpu_device * vdev,u32 exp_val)1058a27ad81SWachowski, Karol static int host_ss_noc_qreqn_check(struct ivpu_device *vdev, u32 exp_val)
1068a27ad81SWachowski, Karol {
1078a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1088a27ad81SWachowski, Karol 		return host_ss_noc_qreqn_check_37xx(vdev, exp_val);
1098a27ad81SWachowski, Karol 	else
1108a27ad81SWachowski, Karol 		return host_ss_noc_qreqn_check_40xx(vdev, exp_val);
1118a27ad81SWachowski, Karol }
1128a27ad81SWachowski, Karol 
host_ss_noc_qacceptn_check_37xx(struct ivpu_device * vdev,u32 exp_val)1138a27ad81SWachowski, Karol static int host_ss_noc_qacceptn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
1148a27ad81SWachowski, Karol {
1158a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QACCEPTN);
1168a27ad81SWachowski, Karol 
1178a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QACCEPTN, TOP_SOCMMIO, exp_val, val))
1188a27ad81SWachowski, Karol 		return -EIO;
1198a27ad81SWachowski, Karol 
1208a27ad81SWachowski, Karol 	return 0;
1218a27ad81SWachowski, Karol }
1228a27ad81SWachowski, Karol 
host_ss_noc_qacceptn_check_40xx(struct ivpu_device * vdev,u32 exp_val)1238a27ad81SWachowski, Karol static int host_ss_noc_qacceptn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
1248a27ad81SWachowski, Karol {
1258a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QACCEPTN);
1268a27ad81SWachowski, Karol 
1278a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QACCEPTN, TOP_SOCMMIO, exp_val, val))
1288a27ad81SWachowski, Karol 		return -EIO;
1298a27ad81SWachowski, Karol 
1308a27ad81SWachowski, Karol 	return 0;
1318a27ad81SWachowski, Karol }
1328a27ad81SWachowski, Karol 
host_ss_noc_qacceptn_check(struct ivpu_device * vdev,u32 exp_val)1338a27ad81SWachowski, Karol static int host_ss_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
1348a27ad81SWachowski, Karol {
1358a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1368a27ad81SWachowski, Karol 		return host_ss_noc_qacceptn_check_37xx(vdev, exp_val);
1378a27ad81SWachowski, Karol 	else
1388a27ad81SWachowski, Karol 		return host_ss_noc_qacceptn_check_40xx(vdev, exp_val);
1398a27ad81SWachowski, Karol }
1408a27ad81SWachowski, Karol 
host_ss_noc_qdeny_check_37xx(struct ivpu_device * vdev,u32 exp_val)1418a27ad81SWachowski, Karol static int host_ss_noc_qdeny_check_37xx(struct ivpu_device *vdev, u32 exp_val)
1428a27ad81SWachowski, Karol {
1438a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QDENY);
1448a27ad81SWachowski, Karol 
1458a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QDENY, TOP_SOCMMIO, exp_val, val))
1468a27ad81SWachowski, Karol 		return -EIO;
1478a27ad81SWachowski, Karol 
1488a27ad81SWachowski, Karol 	return 0;
1498a27ad81SWachowski, Karol }
1508a27ad81SWachowski, Karol 
host_ss_noc_qdeny_check_40xx(struct ivpu_device * vdev,u32 exp_val)1518a27ad81SWachowski, Karol static int host_ss_noc_qdeny_check_40xx(struct ivpu_device *vdev, u32 exp_val)
1528a27ad81SWachowski, Karol {
1538a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QDENY);
1548a27ad81SWachowski, Karol 
1558a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QDENY, TOP_SOCMMIO, exp_val, val))
1568a27ad81SWachowski, Karol 		return -EIO;
1578a27ad81SWachowski, Karol 
1588a27ad81SWachowski, Karol 	return 0;
1598a27ad81SWachowski, Karol }
1608a27ad81SWachowski, Karol 
host_ss_noc_qdeny_check(struct ivpu_device * vdev,u32 exp_val)1618a27ad81SWachowski, Karol static int host_ss_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
1628a27ad81SWachowski, Karol {
1638a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1648a27ad81SWachowski, Karol 		return host_ss_noc_qdeny_check_37xx(vdev, exp_val);
1658a27ad81SWachowski, Karol 	else
1668a27ad81SWachowski, Karol 		return host_ss_noc_qdeny_check_40xx(vdev, exp_val);
1678a27ad81SWachowski, Karol }
1688a27ad81SWachowski, Karol 
top_noc_qrenqn_check_37xx(struct ivpu_device * vdev,u32 exp_val)1698a27ad81SWachowski, Karol static int top_noc_qrenqn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
1708a27ad81SWachowski, Karol {
1718a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QREQN);
1728a27ad81SWachowski, Karol 
1738a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, exp_val, val) ||
1748a27ad81SWachowski, Karol 	    !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, exp_val, val))
1758a27ad81SWachowski, Karol 		return -EIO;
1768a27ad81SWachowski, Karol 
1778a27ad81SWachowski, Karol 	return 0;
1788a27ad81SWachowski, Karol }
1798a27ad81SWachowski, Karol 
top_noc_qrenqn_check_40xx(struct ivpu_device * vdev,u32 exp_val)1808a27ad81SWachowski, Karol static int top_noc_qrenqn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
1818a27ad81SWachowski, Karol {
1828a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN);
1838a27ad81SWachowski, Karol 
1848a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, exp_val, val) ||
1858a27ad81SWachowski, Karol 	    !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, exp_val, val))
1868a27ad81SWachowski, Karol 		return -EIO;
1878a27ad81SWachowski, Karol 
1888a27ad81SWachowski, Karol 	return 0;
1898a27ad81SWachowski, Karol }
1908a27ad81SWachowski, Karol 
top_noc_qreqn_check(struct ivpu_device * vdev,u32 exp_val)1918a27ad81SWachowski, Karol static int top_noc_qreqn_check(struct ivpu_device *vdev, u32 exp_val)
1928a27ad81SWachowski, Karol {
1938a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1948a27ad81SWachowski, Karol 		return top_noc_qrenqn_check_37xx(vdev, exp_val);
1958a27ad81SWachowski, Karol 	else
1968a27ad81SWachowski, Karol 		return top_noc_qrenqn_check_40xx(vdev, exp_val);
1978a27ad81SWachowski, Karol }
1988a27ad81SWachowski, Karol 
ivpu_hw_ip_host_ss_configure(struct ivpu_device * vdev)1998a27ad81SWachowski, Karol int ivpu_hw_ip_host_ss_configure(struct ivpu_device *vdev)
2008a27ad81SWachowski, Karol {
2018a27ad81SWachowski, Karol 	int ret;
2028a27ad81SWachowski, Karol 
2038a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
2048a27ad81SWachowski, Karol 		ret = wait_for_ip_bar(vdev);
2058a27ad81SWachowski, Karol 		if (ret) {
2068a27ad81SWachowski, Karol 			ivpu_err(vdev, "Timed out waiting for NPU IP bar\n");
2078a27ad81SWachowski, Karol 			return ret;
2088a27ad81SWachowski, Karol 		}
2098a27ad81SWachowski, Karol 		host_ss_rst_clr(vdev);
2108a27ad81SWachowski, Karol 	}
2118a27ad81SWachowski, Karol 
2128a27ad81SWachowski, Karol 	ret = host_ss_noc_qreqn_check(vdev, 0x0);
2138a27ad81SWachowski, Karol 	if (ret) {
2148a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed qreqn check: %d\n", ret);
2158a27ad81SWachowski, Karol 		return ret;
2168a27ad81SWachowski, Karol 	}
2178a27ad81SWachowski, Karol 
2188a27ad81SWachowski, Karol 	ret = host_ss_noc_qacceptn_check(vdev, 0x0);
2198a27ad81SWachowski, Karol 	if (ret) {
2208a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
2218a27ad81SWachowski, Karol 		return ret;
2228a27ad81SWachowski, Karol 	}
2238a27ad81SWachowski, Karol 
2248a27ad81SWachowski, Karol 	ret = host_ss_noc_qdeny_check(vdev, 0x0);
2258a27ad81SWachowski, Karol 	if (ret)
2268a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed qdeny check %d\n", ret);
2278a27ad81SWachowski, Karol 
2288a27ad81SWachowski, Karol 	return ret;
2298a27ad81SWachowski, Karol }
2308a27ad81SWachowski, Karol 
idle_gen_drive_37xx(struct ivpu_device * vdev,bool enable)2318a27ad81SWachowski, Karol static void idle_gen_drive_37xx(struct ivpu_device *vdev, bool enable)
2328a27ad81SWachowski, Karol {
2338a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN);
2348a27ad81SWachowski, Karol 
2358a27ad81SWachowski, Karol 	if (enable)
2368a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN, EN, val);
2378a27ad81SWachowski, Karol 	else
2388a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN, EN, val);
2398a27ad81SWachowski, Karol 
2408a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN, val);
2418a27ad81SWachowski, Karol }
2428a27ad81SWachowski, Karol 
idle_gen_drive_40xx(struct ivpu_device * vdev,bool enable)2438a27ad81SWachowski, Karol static void idle_gen_drive_40xx(struct ivpu_device *vdev, bool enable)
2448a27ad81SWachowski, Karol {
2458a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_IDLE_GEN);
2468a27ad81SWachowski, Karol 
2478a27ad81SWachowski, Karol 	if (enable)
2488a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val);
2498a27ad81SWachowski, Karol 	else
2508a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val);
2518a27ad81SWachowski, Karol 
2528a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_AON_IDLE_GEN, val);
2538a27ad81SWachowski, Karol }
2548a27ad81SWachowski, Karol 
ivpu_hw_ip_idle_gen_enable(struct ivpu_device * vdev)2558a27ad81SWachowski, Karol void ivpu_hw_ip_idle_gen_enable(struct ivpu_device *vdev)
2568a27ad81SWachowski, Karol {
2578a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
2588a27ad81SWachowski, Karol 		idle_gen_drive_37xx(vdev, true);
2598a27ad81SWachowski, Karol 	else
2608a27ad81SWachowski, Karol 		idle_gen_drive_40xx(vdev, true);
2618a27ad81SWachowski, Karol }
2628a27ad81SWachowski, Karol 
ivpu_hw_ip_idle_gen_disable(struct ivpu_device * vdev)2638a27ad81SWachowski, Karol void ivpu_hw_ip_idle_gen_disable(struct ivpu_device *vdev)
2648a27ad81SWachowski, Karol {
2658a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
2668a27ad81SWachowski, Karol 		idle_gen_drive_37xx(vdev, false);
2678a27ad81SWachowski, Karol 	else
2688a27ad81SWachowski, Karol 		idle_gen_drive_40xx(vdev, false);
2698a27ad81SWachowski, Karol }
2708a27ad81SWachowski, Karol 
pwr_island_delay_set_50xx(struct ivpu_device * vdev)2718a27ad81SWachowski, Karol static void pwr_island_delay_set_50xx(struct ivpu_device *vdev)
2728a27ad81SWachowski, Karol {
2738a27ad81SWachowski, Karol 	u32 val, post, status;
2748a27ad81SWachowski, Karol 
2758a27ad81SWachowski, Karol 	if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) {
2768a27ad81SWachowski, Karol 		post = PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT;
2778a27ad81SWachowski, Karol 		status = PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT;
2788a27ad81SWachowski, Karol 	} else {
2798a27ad81SWachowski, Karol 		post = PWR_ISLAND_EN_POST_DLY_FREQ_HIGH;
2808a27ad81SWachowski, Karol 		status = PWR_ISLAND_STATUS_DLY_FREQ_HIGH;
2818a27ad81SWachowski, Karol 	}
2828a27ad81SWachowski, Karol 
2838a27ad81SWachowski, Karol 	val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY);
2848a27ad81SWachowski, Karol 	val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST_DLY, post, val);
2858a27ad81SWachowski, Karol 	REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, val);
2868a27ad81SWachowski, Karol 
2878a27ad81SWachowski, Karol 	val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY);
2888a27ad81SWachowski, Karol 	val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY, STATUS_DLY, status, val);
2898a27ad81SWachowski, Karol 	REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY, val);
2908a27ad81SWachowski, Karol }
2918a27ad81SWachowski, Karol 
pwr_island_trickle_drive_37xx(struct ivpu_device * vdev,bool enable)2928a27ad81SWachowski, Karol static void pwr_island_trickle_drive_37xx(struct ivpu_device *vdev, bool enable)
2938a27ad81SWachowski, Karol {
2948a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0);
2958a27ad81SWachowski, Karol 
2968a27ad81SWachowski, Karol 	if (enable)
2978a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, MSS_CPU, val);
2988a27ad81SWachowski, Karol 	else
2998a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, MSS_CPU, val);
3008a27ad81SWachowski, Karol 
3018a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, val);
3028a27ad81SWachowski, Karol }
3038a27ad81SWachowski, Karol 
pwr_island_trickle_drive_40xx(struct ivpu_device * vdev,bool enable)3048a27ad81SWachowski, Karol static void pwr_island_trickle_drive_40xx(struct ivpu_device *vdev, bool enable)
3058a27ad81SWachowski, Karol {
3068a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0);
3078a27ad81SWachowski, Karol 
3088a27ad81SWachowski, Karol 	if (enable)
3098a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val);
3108a27ad81SWachowski, Karol 	else
3118a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val);
3128a27ad81SWachowski, Karol 
3138a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, val);
3148a27ad81SWachowski, Karol 
3158a27ad81SWachowski, Karol 	if (enable)
3168a27ad81SWachowski, Karol 		ndelay(500);
3178a27ad81SWachowski, Karol }
3188a27ad81SWachowski, Karol 
pwr_island_drive_37xx(struct ivpu_device * vdev,bool enable)3198a27ad81SWachowski, Karol static void pwr_island_drive_37xx(struct ivpu_device *vdev, bool enable)
3208a27ad81SWachowski, Karol {
3218a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0);
3228a27ad81SWachowski, Karol 
3238a27ad81SWachowski, Karol 	if (enable)
3248a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val);
3258a27ad81SWachowski, Karol 	else
3268a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val);
3278a27ad81SWachowski, Karol 
3288a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, val);
3298a27ad81SWachowski, Karol 
3308a27ad81SWachowski, Karol 	if (!enable)
3318a27ad81SWachowski, Karol 		ndelay(500);
3328a27ad81SWachowski, Karol }
3338a27ad81SWachowski, Karol 
pwr_island_drive_40xx(struct ivpu_device * vdev,bool enable)3348a27ad81SWachowski, Karol static void pwr_island_drive_40xx(struct ivpu_device *vdev, bool enable)
3358a27ad81SWachowski, Karol {
3368a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0);
3378a27ad81SWachowski, Karol 
3388a27ad81SWachowski, Karol 	if (enable)
3398a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, MSS_CPU, val);
3408a27ad81SWachowski, Karol 	else
3418a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, MSS_CPU, val);
3428a27ad81SWachowski, Karol 
3438a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, val);
3448a27ad81SWachowski, Karol }
3458a27ad81SWachowski, Karol 
pwr_island_enable(struct ivpu_device * vdev)3468a27ad81SWachowski, Karol static void pwr_island_enable(struct ivpu_device *vdev)
3478a27ad81SWachowski, Karol {
3488a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
3498a27ad81SWachowski, Karol 		pwr_island_trickle_drive_37xx(vdev, true);
3508a27ad81SWachowski, Karol 		pwr_island_drive_37xx(vdev, true);
3518a27ad81SWachowski, Karol 	} else {
3528a27ad81SWachowski, Karol 		pwr_island_trickle_drive_40xx(vdev, true);
3538a27ad81SWachowski, Karol 		pwr_island_drive_40xx(vdev, true);
3548a27ad81SWachowski, Karol 	}
3558a27ad81SWachowski, Karol }
3568a27ad81SWachowski, Karol 
wait_for_pwr_island_status(struct ivpu_device * vdev,u32 exp_val)3578a27ad81SWachowski, Karol static int wait_for_pwr_island_status(struct ivpu_device *vdev, u32 exp_val)
3588a27ad81SWachowski, Karol {
3598a27ad81SWachowski, Karol 	if (IVPU_WA(punit_disabled))
3608a27ad81SWachowski, Karol 		return 0;
3618a27ad81SWachowski, Karol 
3628a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
3638a27ad81SWachowski, Karol 		return REGV_POLL_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_STATUS0, MSS_CPU, exp_val,
3648a27ad81SWachowski, Karol 				     PWR_ISLAND_STATUS_TIMEOUT_US);
3658a27ad81SWachowski, Karol 	else
3668a27ad81SWachowski, Karol 		return REGV_POLL_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_STATUS0, CSS_CPU, exp_val,
3678a27ad81SWachowski, Karol 				     PWR_ISLAND_STATUS_TIMEOUT_US);
3688a27ad81SWachowski, Karol }
3698a27ad81SWachowski, Karol 
pwr_island_isolation_drive_37xx(struct ivpu_device * vdev,bool enable)3708a27ad81SWachowski, Karol static void pwr_island_isolation_drive_37xx(struct ivpu_device *vdev, bool enable)
3718a27ad81SWachowski, Karol {
3728a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0);
3738a27ad81SWachowski, Karol 
3748a27ad81SWachowski, Karol 	if (enable)
3758a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, MSS_CPU, val);
3768a27ad81SWachowski, Karol 	else
3778a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, MSS_CPU, val);
3788a27ad81SWachowski, Karol 
3798a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, val);
3808a27ad81SWachowski, Karol }
3818a27ad81SWachowski, Karol 
pwr_island_isolation_drive_40xx(struct ivpu_device * vdev,bool enable)3828a27ad81SWachowski, Karol static void pwr_island_isolation_drive_40xx(struct ivpu_device *vdev, bool enable)
3838a27ad81SWachowski, Karol {
3848a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0);
3858a27ad81SWachowski, Karol 
3868a27ad81SWachowski, Karol 	if (enable)
3878a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val);
3888a27ad81SWachowski, Karol 	else
3898a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val);
3908a27ad81SWachowski, Karol 
3918a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, val);
3928a27ad81SWachowski, Karol }
3938a27ad81SWachowski, Karol 
pwr_island_isolation_drive(struct ivpu_device * vdev,bool enable)3948a27ad81SWachowski, Karol static void pwr_island_isolation_drive(struct ivpu_device *vdev, bool enable)
3958a27ad81SWachowski, Karol {
3968a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
3978a27ad81SWachowski, Karol 		pwr_island_isolation_drive_37xx(vdev, enable);
3988a27ad81SWachowski, Karol 	else
3998a27ad81SWachowski, Karol 		pwr_island_isolation_drive_40xx(vdev, enable);
4008a27ad81SWachowski, Karol }
4018a27ad81SWachowski, Karol 
pwr_island_isolation_disable(struct ivpu_device * vdev)4028a27ad81SWachowski, Karol static void pwr_island_isolation_disable(struct ivpu_device *vdev)
4038a27ad81SWachowski, Karol {
4048a27ad81SWachowski, Karol 	pwr_island_isolation_drive(vdev, false);
4058a27ad81SWachowski, Karol }
4068a27ad81SWachowski, Karol 
host_ss_clk_drive_37xx(struct ivpu_device * vdev,bool enable)4078a27ad81SWachowski, Karol static void host_ss_clk_drive_37xx(struct ivpu_device *vdev, bool enable)
4088a27ad81SWachowski, Karol {
4098a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_CPR_CLK_SET);
4108a27ad81SWachowski, Karol 
4118a27ad81SWachowski, Karol 	if (enable) {
4128a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, TOP_NOC, val);
4138a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, DSS_MAS, val);
4148a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, MSS_MAS, val);
4158a27ad81SWachowski, Karol 	} else {
4168a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, TOP_NOC, val);
4178a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, DSS_MAS, val);
4188a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, MSS_MAS, val);
4198a27ad81SWachowski, Karol 	}
4208a27ad81SWachowski, Karol 
4218a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_CPR_CLK_SET, val);
4228a27ad81SWachowski, Karol }
4238a27ad81SWachowski, Karol 
host_ss_clk_drive_40xx(struct ivpu_device * vdev,bool enable)4248a27ad81SWachowski, Karol static void host_ss_clk_drive_40xx(struct ivpu_device *vdev, bool enable)
4258a27ad81SWachowski, Karol {
4268a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_CLK_EN);
4278a27ad81SWachowski, Karol 
4288a27ad81SWachowski, Karol 	if (enable) {
4298a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val);
4308a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val);
4318a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val);
4328a27ad81SWachowski, Karol 	} else {
4338a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val);
4348a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val);
4358a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val);
4368a27ad81SWachowski, Karol 	}
4378a27ad81SWachowski, Karol 
4388a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_CPR_CLK_EN, val);
4398a27ad81SWachowski, Karol }
4408a27ad81SWachowski, Karol 
host_ss_clk_drive(struct ivpu_device * vdev,bool enable)4418a27ad81SWachowski, Karol static void host_ss_clk_drive(struct ivpu_device *vdev, bool enable)
4428a27ad81SWachowski, Karol {
4438a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
4448a27ad81SWachowski, Karol 		host_ss_clk_drive_37xx(vdev, enable);
4458a27ad81SWachowski, Karol 	else
4468a27ad81SWachowski, Karol 		host_ss_clk_drive_40xx(vdev, enable);
4478a27ad81SWachowski, Karol }
4488a27ad81SWachowski, Karol 
host_ss_clk_enable(struct ivpu_device * vdev)4498a27ad81SWachowski, Karol static void host_ss_clk_enable(struct ivpu_device *vdev)
4508a27ad81SWachowski, Karol {
4518a27ad81SWachowski, Karol 	host_ss_clk_drive(vdev, true);
4528a27ad81SWachowski, Karol }
4538a27ad81SWachowski, Karol 
host_ss_rst_drive_37xx(struct ivpu_device * vdev,bool enable)4548a27ad81SWachowski, Karol static void host_ss_rst_drive_37xx(struct ivpu_device *vdev, bool enable)
4558a27ad81SWachowski, Karol {
4568a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_CPR_RST_SET);
4578a27ad81SWachowski, Karol 
4588a27ad81SWachowski, Karol 	if (enable) {
4598a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, TOP_NOC, val);
4608a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, DSS_MAS, val);
4618a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, MSS_MAS, val);
4628a27ad81SWachowski, Karol 	} else {
4638a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, TOP_NOC, val);
4648a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, DSS_MAS, val);
4658a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, MSS_MAS, val);
4668a27ad81SWachowski, Karol 	}
4678a27ad81SWachowski, Karol 
4688a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_CPR_RST_SET, val);
4698a27ad81SWachowski, Karol }
4708a27ad81SWachowski, Karol 
host_ss_rst_drive_40xx(struct ivpu_device * vdev,bool enable)4718a27ad81SWachowski, Karol static void host_ss_rst_drive_40xx(struct ivpu_device *vdev, bool enable)
4728a27ad81SWachowski, Karol {
4738a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_RST_EN);
4748a27ad81SWachowski, Karol 
4758a27ad81SWachowski, Karol 	if (enable) {
4768a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val);
4778a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val);
4788a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val);
4798a27ad81SWachowski, Karol 	} else {
4808a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val);
4818a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val);
4828a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val);
4838a27ad81SWachowski, Karol 	}
4848a27ad81SWachowski, Karol 
4858a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_CPR_RST_EN, val);
4868a27ad81SWachowski, Karol }
4878a27ad81SWachowski, Karol 
host_ss_rst_drive(struct ivpu_device * vdev,bool enable)4888a27ad81SWachowski, Karol static void host_ss_rst_drive(struct ivpu_device *vdev, bool enable)
4898a27ad81SWachowski, Karol {
4908a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
4918a27ad81SWachowski, Karol 		host_ss_rst_drive_37xx(vdev, enable);
4928a27ad81SWachowski, Karol 	else
4938a27ad81SWachowski, Karol 		host_ss_rst_drive_40xx(vdev, enable);
4948a27ad81SWachowski, Karol }
4958a27ad81SWachowski, Karol 
host_ss_rst_enable(struct ivpu_device * vdev)4968a27ad81SWachowski, Karol static void host_ss_rst_enable(struct ivpu_device *vdev)
4978a27ad81SWachowski, Karol {
4988a27ad81SWachowski, Karol 	host_ss_rst_drive(vdev, true);
4998a27ad81SWachowski, Karol }
5008a27ad81SWachowski, Karol 
host_ss_noc_qreqn_top_socmmio_drive_37xx(struct ivpu_device * vdev,bool enable)5018a27ad81SWachowski, Karol static void host_ss_noc_qreqn_top_socmmio_drive_37xx(struct ivpu_device *vdev, bool enable)
5028a27ad81SWachowski, Karol {
5038a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QREQN);
5048a27ad81SWachowski, Karol 
5058a27ad81SWachowski, Karol 	if (enable)
5068a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
5078a27ad81SWachowski, Karol 	else
5088a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
5098a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_NOC_QREQN, val);
5108a27ad81SWachowski, Karol }
5118a27ad81SWachowski, Karol 
host_ss_noc_qreqn_top_socmmio_drive_40xx(struct ivpu_device * vdev,bool enable)5128a27ad81SWachowski, Karol static void host_ss_noc_qreqn_top_socmmio_drive_40xx(struct ivpu_device *vdev, bool enable)
5138a27ad81SWachowski, Karol {
5148a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN);
5158a27ad81SWachowski, Karol 
5168a27ad81SWachowski, Karol 	if (enable)
5178a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
5188a27ad81SWachowski, Karol 	else
5198a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
5208a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_NOC_QREQN, val);
5218a27ad81SWachowski, Karol }
5228a27ad81SWachowski, Karol 
host_ss_noc_qreqn_top_socmmio_drive(struct ivpu_device * vdev,bool enable)5238a27ad81SWachowski, Karol static void host_ss_noc_qreqn_top_socmmio_drive(struct ivpu_device *vdev, bool enable)
5248a27ad81SWachowski, Karol {
5258a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
5268a27ad81SWachowski, Karol 		host_ss_noc_qreqn_top_socmmio_drive_37xx(vdev, enable);
5278a27ad81SWachowski, Karol 	else
5288a27ad81SWachowski, Karol 		host_ss_noc_qreqn_top_socmmio_drive_40xx(vdev, enable);
5298a27ad81SWachowski, Karol }
5308a27ad81SWachowski, Karol 
host_ss_axi_drive(struct ivpu_device * vdev,bool enable)5318a27ad81SWachowski, Karol static int host_ss_axi_drive(struct ivpu_device *vdev, bool enable)
5328a27ad81SWachowski, Karol {
5338a27ad81SWachowski, Karol 	int ret;
5348a27ad81SWachowski, Karol 
5358a27ad81SWachowski, Karol 	host_ss_noc_qreqn_top_socmmio_drive(vdev, enable);
5368a27ad81SWachowski, Karol 
5378a27ad81SWachowski, Karol 	ret = host_ss_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
5388a27ad81SWachowski, Karol 	if (ret) {
5398a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed HOST SS NOC QACCEPTN check: %d\n", ret);
5408a27ad81SWachowski, Karol 		return ret;
5418a27ad81SWachowski, Karol 	}
5428a27ad81SWachowski, Karol 
5438a27ad81SWachowski, Karol 	ret = host_ss_noc_qdeny_check(vdev, 0x0);
5448a27ad81SWachowski, Karol 	if (ret)
5458a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed HOST SS NOC QDENY check: %d\n", ret);
5468a27ad81SWachowski, Karol 
5478a27ad81SWachowski, Karol 	return ret;
5488a27ad81SWachowski, Karol }
5498a27ad81SWachowski, Karol 
top_noc_qreqn_drive_40xx(struct ivpu_device * vdev,bool enable)5508a27ad81SWachowski, Karol static void top_noc_qreqn_drive_40xx(struct ivpu_device *vdev, bool enable)
5518a27ad81SWachowski, Karol {
5528a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN);
5538a27ad81SWachowski, Karol 
5548a27ad81SWachowski, Karol 	if (enable) {
5558a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val);
5568a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
5578a27ad81SWachowski, Karol 	} else {
5588a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val);
5598a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
5608a27ad81SWachowski, Karol 	}
5618a27ad81SWachowski, Karol 
5628a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_TOP_NOC_QREQN, val);
5638a27ad81SWachowski, Karol }
5648a27ad81SWachowski, Karol 
top_noc_qreqn_drive_37xx(struct ivpu_device * vdev,bool enable)5658a27ad81SWachowski, Karol static void top_noc_qreqn_drive_37xx(struct ivpu_device *vdev, bool enable)
5668a27ad81SWachowski, Karol {
5678a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QREQN);
5688a27ad81SWachowski, Karol 
5698a27ad81SWachowski, Karol 	if (enable) {
5708a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, val);
5718a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
5728a27ad81SWachowski, Karol 	} else {
5738a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, val);
5748a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
5758a27ad81SWachowski, Karol 	}
5768a27ad81SWachowski, Karol 
5778a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_TOP_NOC_QREQN, val);
5788a27ad81SWachowski, Karol }
5798a27ad81SWachowski, Karol 
top_noc_qreqn_drive(struct ivpu_device * vdev,bool enable)5808a27ad81SWachowski, Karol static void top_noc_qreqn_drive(struct ivpu_device *vdev, bool enable)
5818a27ad81SWachowski, Karol {
5828a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
5838a27ad81SWachowski, Karol 		top_noc_qreqn_drive_37xx(vdev, enable);
5848a27ad81SWachowski, Karol 	else
5858a27ad81SWachowski, Karol 		top_noc_qreqn_drive_40xx(vdev, enable);
5868a27ad81SWachowski, Karol }
5878a27ad81SWachowski, Karol 
ivpu_hw_ip_host_ss_axi_enable(struct ivpu_device * vdev)5888a27ad81SWachowski, Karol int ivpu_hw_ip_host_ss_axi_enable(struct ivpu_device *vdev)
5898a27ad81SWachowski, Karol {
5908a27ad81SWachowski, Karol 	return host_ss_axi_drive(vdev, true);
5918a27ad81SWachowski, Karol }
5928a27ad81SWachowski, Karol 
top_noc_qacceptn_check_37xx(struct ivpu_device * vdev,u32 exp_val)5938a27ad81SWachowski, Karol static int top_noc_qacceptn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
5948a27ad81SWachowski, Karol {
5958a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QACCEPTN);
5968a27ad81SWachowski, Karol 
5978a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QACCEPTN, CPU_CTRL, exp_val, val) ||
5988a27ad81SWachowski, Karol 	    !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QACCEPTN, HOSTIF_L2CACHE, exp_val, val))
5998a27ad81SWachowski, Karol 		return -EIO;
6008a27ad81SWachowski, Karol 
6018a27ad81SWachowski, Karol 	return 0;
6028a27ad81SWachowski, Karol }
6038a27ad81SWachowski, Karol 
top_noc_qacceptn_check_40xx(struct ivpu_device * vdev,u32 exp_val)6048a27ad81SWachowski, Karol static int top_noc_qacceptn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
6058a27ad81SWachowski, Karol {
6068a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QACCEPTN);
6078a27ad81SWachowski, Karol 
6088a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, CPU_CTRL, exp_val, val) ||
6098a27ad81SWachowski, Karol 	    !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, HOSTIF_L2CACHE, exp_val, val))
6108a27ad81SWachowski, Karol 		return -EIO;
6118a27ad81SWachowski, Karol 
6128a27ad81SWachowski, Karol 	return 0;
6138a27ad81SWachowski, Karol }
6148a27ad81SWachowski, Karol 
top_noc_qacceptn_check(struct ivpu_device * vdev,u32 exp_val)6158a27ad81SWachowski, Karol static int top_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
6168a27ad81SWachowski, Karol {
6178a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
6188a27ad81SWachowski, Karol 		return top_noc_qacceptn_check_37xx(vdev, exp_val);
6198a27ad81SWachowski, Karol 	else
6208a27ad81SWachowski, Karol 		return top_noc_qacceptn_check_40xx(vdev, exp_val);
6218a27ad81SWachowski, Karol }
6228a27ad81SWachowski, Karol 
top_noc_qdeny_check_37xx(struct ivpu_device * vdev,u32 exp_val)6238a27ad81SWachowski, Karol static int top_noc_qdeny_check_37xx(struct ivpu_device *vdev, u32 exp_val)
6248a27ad81SWachowski, Karol {
6258a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QDENY);
6268a27ad81SWachowski, Karol 
6278a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QDENY, CPU_CTRL, exp_val, val) ||
6288a27ad81SWachowski, Karol 	    !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QDENY, HOSTIF_L2CACHE, exp_val, val))
6298a27ad81SWachowski, Karol 		return -EIO;
6308a27ad81SWachowski, Karol 
6318a27ad81SWachowski, Karol 	return 0;
6328a27ad81SWachowski, Karol }
6338a27ad81SWachowski, Karol 
top_noc_qdeny_check_40xx(struct ivpu_device * vdev,u32 exp_val)6348a27ad81SWachowski, Karol static int top_noc_qdeny_check_40xx(struct ivpu_device *vdev, u32 exp_val)
6358a27ad81SWachowski, Karol {
6368a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QDENY);
6378a27ad81SWachowski, Karol 
6388a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, CPU_CTRL, exp_val, val) ||
6398a27ad81SWachowski, Karol 	    !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, HOSTIF_L2CACHE, exp_val, val))
6408a27ad81SWachowski, Karol 		return -EIO;
6418a27ad81SWachowski, Karol 
6428a27ad81SWachowski, Karol 	return 0;
6438a27ad81SWachowski, Karol }
6448a27ad81SWachowski, Karol 
top_noc_qdeny_check(struct ivpu_device * vdev,u32 exp_val)6458a27ad81SWachowski, Karol static int top_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
6468a27ad81SWachowski, Karol {
6478a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
6488a27ad81SWachowski, Karol 		return top_noc_qdeny_check_37xx(vdev, exp_val);
6498a27ad81SWachowski, Karol 	else
6508a27ad81SWachowski, Karol 		return top_noc_qdeny_check_40xx(vdev, exp_val);
6518a27ad81SWachowski, Karol }
6528a27ad81SWachowski, Karol 
top_noc_drive(struct ivpu_device * vdev,bool enable)6538a27ad81SWachowski, Karol static int top_noc_drive(struct ivpu_device *vdev, bool enable)
6548a27ad81SWachowski, Karol {
6558a27ad81SWachowski, Karol 	int ret;
6568a27ad81SWachowski, Karol 
6578a27ad81SWachowski, Karol 	top_noc_qreqn_drive(vdev, enable);
6588a27ad81SWachowski, Karol 
6598a27ad81SWachowski, Karol 	ret = top_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
6608a27ad81SWachowski, Karol 	if (ret) {
6618a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed TOP NOC QACCEPTN check: %d\n", ret);
6628a27ad81SWachowski, Karol 		return ret;
6638a27ad81SWachowski, Karol 	}
6648a27ad81SWachowski, Karol 
6658a27ad81SWachowski, Karol 	ret = top_noc_qdeny_check(vdev, 0x0);
6668a27ad81SWachowski, Karol 	if (ret)
6678a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed TOP NOC QDENY check: %d\n", ret);
6688a27ad81SWachowski, Karol 
6698a27ad81SWachowski, Karol 	return ret;
6708a27ad81SWachowski, Karol }
6718a27ad81SWachowski, Karol 
ivpu_hw_ip_top_noc_enable(struct ivpu_device * vdev)6728a27ad81SWachowski, Karol int ivpu_hw_ip_top_noc_enable(struct ivpu_device *vdev)
6738a27ad81SWachowski, Karol {
6748a27ad81SWachowski, Karol 	return top_noc_drive(vdev, true);
6758a27ad81SWachowski, Karol }
6768a27ad81SWachowski, Karol 
dpu_active_drive_37xx(struct ivpu_device * vdev,bool enable)6778a27ad81SWachowski, Karol static void dpu_active_drive_37xx(struct ivpu_device *vdev, bool enable)
6788a27ad81SWachowski, Karol {
6798a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE);
6808a27ad81SWachowski, Karol 
6818a27ad81SWachowski, Karol 	if (enable)
6828a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, DPU_ACTIVE, val);
6838a27ad81SWachowski, Karol 	else
6848a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, DPU_ACTIVE, val);
6858a27ad81SWachowski, Karol 
6868a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, val);
6878a27ad81SWachowski, Karol }
6888a27ad81SWachowski, Karol 
ivpu_hw_ip_pwr_domain_enable(struct ivpu_device * vdev)6898a27ad81SWachowski, Karol int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev)
6908a27ad81SWachowski, Karol {
6918a27ad81SWachowski, Karol 	int ret;
6928a27ad81SWachowski, Karol 
6938a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_50XX)
6948a27ad81SWachowski, Karol 		pwr_island_delay_set_50xx(vdev);
6958a27ad81SWachowski, Karol 
6968a27ad81SWachowski, Karol 	pwr_island_enable(vdev);
6978a27ad81SWachowski, Karol 
6988a27ad81SWachowski, Karol 	ret = wait_for_pwr_island_status(vdev, 0x1);
6998a27ad81SWachowski, Karol 	if (ret) {
7008a27ad81SWachowski, Karol 		ivpu_err(vdev, "Timed out waiting for power island status\n");
7018a27ad81SWachowski, Karol 		return ret;
7028a27ad81SWachowski, Karol 	}
7038a27ad81SWachowski, Karol 
7048a27ad81SWachowski, Karol 	ret = top_noc_qreqn_check(vdev, 0x0);
7058a27ad81SWachowski, Karol 	if (ret) {
7068a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed TOP NOC QREQN check %d\n", ret);
7078a27ad81SWachowski, Karol 		return ret;
7088a27ad81SWachowski, Karol 	}
7098a27ad81SWachowski, Karol 
7108a27ad81SWachowski, Karol 	host_ss_clk_enable(vdev);
7118a27ad81SWachowski, Karol 	pwr_island_isolation_disable(vdev);
7128a27ad81SWachowski, Karol 	host_ss_rst_enable(vdev);
7138a27ad81SWachowski, Karol 
7148a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
7158a27ad81SWachowski, Karol 		dpu_active_drive_37xx(vdev, true);
7168a27ad81SWachowski, Karol 
7178a27ad81SWachowski, Karol 	return ret;
7188a27ad81SWachowski, Karol }
7198a27ad81SWachowski, Karol 
ivpu_hw_ip_read_perf_timer_counter(struct ivpu_device * vdev)7208a27ad81SWachowski, Karol u64 ivpu_hw_ip_read_perf_timer_counter(struct ivpu_device *vdev)
7218a27ad81SWachowski, Karol {
7228a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
7238a27ad81SWachowski, Karol 		return REGV_RD64(VPU_37XX_CPU_SS_TIM_PERF_FREE_CNT);
7248a27ad81SWachowski, Karol 	else
7258a27ad81SWachowski, Karol 		return REGV_RD64(VPU_40XX_CPU_SS_TIM_PERF_EXT_FREE_CNT);
7268a27ad81SWachowski, Karol }
7278a27ad81SWachowski, Karol 
ivpu_hw_ip_snoop_disable_37xx(struct ivpu_device * vdev)7288a27ad81SWachowski, Karol static void ivpu_hw_ip_snoop_disable_37xx(struct ivpu_device *vdev)
7298a27ad81SWachowski, Karol {
7308a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES);
7318a27ad81SWachowski, Karol 
7328a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, NOSNOOP_OVERRIDE_EN, val);
7338a27ad81SWachowski, Karol 	val = REG_CLR_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AW_NOSNOOP_OVERRIDE, val);
7348a27ad81SWachowski, Karol 
7358a27ad81SWachowski, Karol 	if (ivpu_is_force_snoop_enabled(vdev))
7368a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AR_NOSNOOP_OVERRIDE, val);
7378a27ad81SWachowski, Karol 	else
7388a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AR_NOSNOOP_OVERRIDE, val);
7398a27ad81SWachowski, Karol 
7408a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, val);
7418a27ad81SWachowski, Karol }
7428a27ad81SWachowski, Karol 
ivpu_hw_ip_snoop_disable_40xx(struct ivpu_device * vdev)7438a27ad81SWachowski, Karol static void ivpu_hw_ip_snoop_disable_40xx(struct ivpu_device *vdev)
7448a27ad81SWachowski, Karol {
7458a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES);
7468a27ad81SWachowski, Karol 
7478a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, SNOOP_OVERRIDE_EN, val);
7488a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AW_SNOOP_OVERRIDE, val);
7498a27ad81SWachowski, Karol 
7508a27ad81SWachowski, Karol 	if (ivpu_is_force_snoop_enabled(vdev))
7518a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AR_SNOOP_OVERRIDE, val);
7528a27ad81SWachowski, Karol 	else
7538a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AR_SNOOP_OVERRIDE, val);
7548a27ad81SWachowski, Karol 
7558a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, val);
7568a27ad81SWachowski, Karol }
7578a27ad81SWachowski, Karol 
ivpu_hw_ip_snoop_disable(struct ivpu_device * vdev)7588a27ad81SWachowski, Karol void ivpu_hw_ip_snoop_disable(struct ivpu_device *vdev)
7598a27ad81SWachowski, Karol {
7608a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
7618a27ad81SWachowski, Karol 		return ivpu_hw_ip_snoop_disable_37xx(vdev);
7628a27ad81SWachowski, Karol 	else
7638a27ad81SWachowski, Karol 		return ivpu_hw_ip_snoop_disable_40xx(vdev);
7648a27ad81SWachowski, Karol }
7658a27ad81SWachowski, Karol 
ivpu_hw_ip_tbu_mmu_enable_37xx(struct ivpu_device * vdev)7668a27ad81SWachowski, Karol static void ivpu_hw_ip_tbu_mmu_enable_37xx(struct ivpu_device *vdev)
7678a27ad81SWachowski, Karol {
7688a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_37XX_HOST_IF_TBU_MMUSSIDV);
7698a27ad81SWachowski, Karol 
7708a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU0_AWMMUSSIDV, val);
7718a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU0_ARMMUSSIDV, val);
7728a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU2_AWMMUSSIDV, val);
7738a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU2_ARMMUSSIDV, val);
7748a27ad81SWachowski, Karol 
7758a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_IF_TBU_MMUSSIDV, val);
7768a27ad81SWachowski, Karol }
7778a27ad81SWachowski, Karol 
ivpu_hw_ip_tbu_mmu_enable_40xx(struct ivpu_device * vdev)7788a27ad81SWachowski, Karol static void ivpu_hw_ip_tbu_mmu_enable_40xx(struct ivpu_device *vdev)
7798a27ad81SWachowski, Karol {
7808a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_HOST_IF_TBU_MMUSSIDV);
7818a27ad81SWachowski, Karol 
7828a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_AWMMUSSIDV, val);
7838a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_ARMMUSSIDV, val);
7848a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_AWMMUSSIDV, val);
7858a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_ARMMUSSIDV, val);
7868a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_AWMMUSSIDV, val);
7878a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_ARMMUSSIDV, val);
7888a27ad81SWachowski, Karol 
7898a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_IF_TBU_MMUSSIDV, val);
7908a27ad81SWachowski, Karol }
7918a27ad81SWachowski, Karol 
ivpu_hw_ip_tbu_mmu_enable(struct ivpu_device * vdev)7928a27ad81SWachowski, Karol void ivpu_hw_ip_tbu_mmu_enable(struct ivpu_device *vdev)
7938a27ad81SWachowski, Karol {
7948a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
7958a27ad81SWachowski, Karol 		return ivpu_hw_ip_tbu_mmu_enable_37xx(vdev);
7968a27ad81SWachowski, Karol 	else
7978a27ad81SWachowski, Karol 		return ivpu_hw_ip_tbu_mmu_enable_40xx(vdev);
7988a27ad81SWachowski, Karol }
7998a27ad81SWachowski, Karol 
soc_cpu_boot_37xx(struct ivpu_device * vdev)8008a27ad81SWachowski, Karol static int soc_cpu_boot_37xx(struct ivpu_device *vdev)
8018a27ad81SWachowski, Karol {
8028a27ad81SWachowski, Karol 	u32 val;
8038a27ad81SWachowski, Karol 
8048a27ad81SWachowski, Karol 	val = REGV_RD32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC);
8058a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RSTRUN0, val);
8068a27ad81SWachowski, Karol 
8078a27ad81SWachowski, Karol 	val = REG_CLR_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RSTVEC, val);
8088a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
8098a27ad81SWachowski, Karol 
8108a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RESUME0, val);
8118a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
8128a27ad81SWachowski, Karol 
8138a27ad81SWachowski, Karol 	val = REG_CLR_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RESUME0, val);
8148a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
8158a27ad81SWachowski, Karol 
8168a27ad81SWachowski, Karol 	val = vdev->fw->entry_point >> 9;
8178a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
8188a27ad81SWachowski, Karol 
8198a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, DONE, val);
8208a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
8218a27ad81SWachowski, Karol 
8228a27ad81SWachowski, Karol 	ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
8238a27ad81SWachowski, Karol 		 vdev->fw->entry_point == vdev->fw->cold_boot_entry_point ? "cold boot" : "resume");
8248a27ad81SWachowski, Karol 
8258a27ad81SWachowski, Karol 	return 0;
8268a27ad81SWachowski, Karol }
8278a27ad81SWachowski, Karol 
cpu_noc_qacceptn_check_40xx(struct ivpu_device * vdev,u32 exp_val)8288a27ad81SWachowski, Karol static int cpu_noc_qacceptn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
8298a27ad81SWachowski, Karol {
8308a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN);
8318a27ad81SWachowski, Karol 
8328a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN, TOP_MMIO, exp_val, val))
8338a27ad81SWachowski, Karol 		return -EIO;
8348a27ad81SWachowski, Karol 
8358a27ad81SWachowski, Karol 	return 0;
8368a27ad81SWachowski, Karol }
8378a27ad81SWachowski, Karol 
cpu_noc_qdeny_check_40xx(struct ivpu_device * vdev,u32 exp_val)8388a27ad81SWachowski, Karol static int cpu_noc_qdeny_check_40xx(struct ivpu_device *vdev, u32 exp_val)
8398a27ad81SWachowski, Karol {
8408a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QDENY);
8418a27ad81SWachowski, Karol 
8428a27ad81SWachowski, Karol 	if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QDENY, TOP_MMIO, exp_val, val))
8438a27ad81SWachowski, Karol 		return -EIO;
8448a27ad81SWachowski, Karol 
8458a27ad81SWachowski, Karol 	return 0;
8468a27ad81SWachowski, Karol }
8478a27ad81SWachowski, Karol 
cpu_noc_top_mmio_drive_40xx(struct ivpu_device * vdev,bool enable)8488a27ad81SWachowski, Karol static void cpu_noc_top_mmio_drive_40xx(struct ivpu_device *vdev, bool enable)
8498a27ad81SWachowski, Karol {
8508a27ad81SWachowski, Karol 	u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QREQN);
8518a27ad81SWachowski, Karol 
8528a27ad81SWachowski, Karol 	if (enable)
8538a27ad81SWachowski, Karol 		val = REG_SET_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val);
8548a27ad81SWachowski, Karol 	else
8558a27ad81SWachowski, Karol 		val = REG_CLR_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val);
8568a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_CPU_SS_CPR_NOC_QREQN, val);
8578a27ad81SWachowski, Karol }
8588a27ad81SWachowski, Karol 
soc_cpu_drive_40xx(struct ivpu_device * vdev,bool enable)8598a27ad81SWachowski, Karol static int soc_cpu_drive_40xx(struct ivpu_device *vdev, bool enable)
8608a27ad81SWachowski, Karol {
8618a27ad81SWachowski, Karol 	int ret;
8628a27ad81SWachowski, Karol 
8638a27ad81SWachowski, Karol 	cpu_noc_top_mmio_drive_40xx(vdev, enable);
8648a27ad81SWachowski, Karol 
8658a27ad81SWachowski, Karol 	ret = cpu_noc_qacceptn_check_40xx(vdev, enable ? 0x1 : 0x0);
8668a27ad81SWachowski, Karol 	if (ret) {
8678a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
8688a27ad81SWachowski, Karol 		return ret;
8698a27ad81SWachowski, Karol 	}
8708a27ad81SWachowski, Karol 
8718a27ad81SWachowski, Karol 	ret = cpu_noc_qdeny_check_40xx(vdev, 0x0);
8728a27ad81SWachowski, Karol 	if (ret)
8738a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed qdeny check: %d\n", ret);
8748a27ad81SWachowski, Karol 
8758a27ad81SWachowski, Karol 	return ret;
8768a27ad81SWachowski, Karol }
8778a27ad81SWachowski, Karol 
soc_cpu_enable(struct ivpu_device * vdev)8788a27ad81SWachowski, Karol static int soc_cpu_enable(struct ivpu_device *vdev)
8798a27ad81SWachowski, Karol {
8808a27ad81SWachowski, Karol 	return soc_cpu_drive_40xx(vdev, true);
8818a27ad81SWachowski, Karol }
8828a27ad81SWachowski, Karol 
soc_cpu_boot_40xx(struct ivpu_device * vdev)8838a27ad81SWachowski, Karol static int soc_cpu_boot_40xx(struct ivpu_device *vdev)
8848a27ad81SWachowski, Karol {
8858a27ad81SWachowski, Karol 	int ret;
8868a27ad81SWachowski, Karol 	u32 val;
8878a27ad81SWachowski, Karol 	u64 val64;
8888a27ad81SWachowski, Karol 
8898a27ad81SWachowski, Karol 	ret = soc_cpu_enable(vdev);
8908a27ad81SWachowski, Karol 	if (ret) {
8918a27ad81SWachowski, Karol 		ivpu_err(vdev, "Failed to enable SOC CPU: %d\n", ret);
8928a27ad81SWachowski, Karol 		return ret;
8938a27ad81SWachowski, Karol 	}
8948a27ad81SWachowski, Karol 
8958a27ad81SWachowski, Karol 	val64 = vdev->fw->entry_point;
8968a27ad81SWachowski, Karol 	val64 <<= ffs(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO_IMAGE_LOCATION_MASK) - 1;
8978a27ad81SWachowski, Karol 	REGV_WR64(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val64);
8988a27ad81SWachowski, Karol 
8998a27ad81SWachowski, Karol 	val = REGV_RD32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO);
9008a27ad81SWachowski, Karol 	val = REG_SET_FLD(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, DONE, val);
9018a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val);
9028a27ad81SWachowski, Karol 
9038a27ad81SWachowski, Karol 	ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
9048a27ad81SWachowski, Karol 		 ivpu_fw_is_cold_boot(vdev) ? "cold boot" : "resume");
9058a27ad81SWachowski, Karol 
9068a27ad81SWachowski, Karol 	return 0;
9078a27ad81SWachowski, Karol }
9088a27ad81SWachowski, Karol 
ivpu_hw_ip_soc_cpu_boot(struct ivpu_device * vdev)9098a27ad81SWachowski, Karol int ivpu_hw_ip_soc_cpu_boot(struct ivpu_device *vdev)
9108a27ad81SWachowski, Karol {
9118a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
9128a27ad81SWachowski, Karol 		return soc_cpu_boot_37xx(vdev);
9138a27ad81SWachowski, Karol 	else
9148a27ad81SWachowski, Karol 		return soc_cpu_boot_40xx(vdev);
9158a27ad81SWachowski, Karol }
9168a27ad81SWachowski, Karol 
wdt_disable_37xx(struct ivpu_device * vdev)9178a27ad81SWachowski, Karol static void wdt_disable_37xx(struct ivpu_device *vdev)
9188a27ad81SWachowski, Karol {
9198a27ad81SWachowski, Karol 	u32 val;
9208a27ad81SWachowski, Karol 
9218a27ad81SWachowski, Karol 	/* Enable writing and set non-zero WDT value */
9228a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
9238a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_TIM_WATCHDOG, TIM_WATCHDOG_RESET_VALUE);
9248a27ad81SWachowski, Karol 
9258a27ad81SWachowski, Karol 	/* Enable writing and disable watchdog timer */
9268a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
9278a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_TIM_WDOG_EN, 0);
9288a27ad81SWachowski, Karol 
9298a27ad81SWachowski, Karol 	/* Now clear the timeout interrupt */
9308a27ad81SWachowski, Karol 	val = REGV_RD32(VPU_37XX_CPU_SS_TIM_GEN_CONFIG);
9318a27ad81SWachowski, Karol 	val = REG_CLR_FLD(VPU_37XX_CPU_SS_TIM_GEN_CONFIG, WDOG_TO_INT_CLR, val);
9328a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_CPU_SS_TIM_GEN_CONFIG, val);
9338a27ad81SWachowski, Karol }
9348a27ad81SWachowski, Karol 
wdt_disable_40xx(struct ivpu_device * vdev)9358a27ad81SWachowski, Karol static void wdt_disable_40xx(struct ivpu_device *vdev)
9368a27ad81SWachowski, Karol {
9378a27ad81SWachowski, Karol 	u32 val;
9388a27ad81SWachowski, Karol 
9398a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
9408a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_CPU_SS_TIM_WATCHDOG, TIM_WATCHDOG_RESET_VALUE);
9418a27ad81SWachowski, Karol 
9428a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
9438a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_CPU_SS_TIM_WDOG_EN, 0);
9448a27ad81SWachowski, Karol 
9458a27ad81SWachowski, Karol 	val = REGV_RD32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG);
9468a27ad81SWachowski, Karol 	val = REG_CLR_FLD(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, WDOG_TO_INT_CLR, val);
9478a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, val);
9488a27ad81SWachowski, Karol }
9498a27ad81SWachowski, Karol 
ivpu_hw_ip_wdt_disable(struct ivpu_device * vdev)9508a27ad81SWachowski, Karol void ivpu_hw_ip_wdt_disable(struct ivpu_device *vdev)
9518a27ad81SWachowski, Karol {
9528a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
9538a27ad81SWachowski, Karol 		return wdt_disable_37xx(vdev);
9548a27ad81SWachowski, Karol 	else
9558a27ad81SWachowski, Karol 		return wdt_disable_40xx(vdev);
9568a27ad81SWachowski, Karol }
9578a27ad81SWachowski, Karol 
ipc_rx_count_get_37xx(struct ivpu_device * vdev)9588a27ad81SWachowski, Karol static u32 ipc_rx_count_get_37xx(struct ivpu_device *vdev)
9598a27ad81SWachowski, Karol {
9608a27ad81SWachowski, Karol 	u32 count = REGV_RD32_SILENT(VPU_37XX_HOST_SS_TIM_IPC_FIFO_STAT);
9618a27ad81SWachowski, Karol 
9628a27ad81SWachowski, Karol 	return REG_GET_FLD(VPU_37XX_HOST_SS_TIM_IPC_FIFO_STAT, FILL_LEVEL, count);
9638a27ad81SWachowski, Karol }
9648a27ad81SWachowski, Karol 
ipc_rx_count_get_40xx(struct ivpu_device * vdev)9658a27ad81SWachowski, Karol static u32 ipc_rx_count_get_40xx(struct ivpu_device *vdev)
9668a27ad81SWachowski, Karol {
9678a27ad81SWachowski, Karol 	u32 count = REGV_RD32_SILENT(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT);
9688a27ad81SWachowski, Karol 
9698a27ad81SWachowski, Karol 	return REG_GET_FLD(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT, FILL_LEVEL, count);
9708a27ad81SWachowski, Karol }
9718a27ad81SWachowski, Karol 
ivpu_hw_ip_ipc_rx_count_get(struct ivpu_device * vdev)9728a27ad81SWachowski, Karol u32 ivpu_hw_ip_ipc_rx_count_get(struct ivpu_device *vdev)
9738a27ad81SWachowski, Karol {
9748a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
9758a27ad81SWachowski, Karol 		return ipc_rx_count_get_37xx(vdev);
9768a27ad81SWachowski, Karol 	else
9778a27ad81SWachowski, Karol 		return ipc_rx_count_get_40xx(vdev);
9788a27ad81SWachowski, Karol }
9798a27ad81SWachowski, Karol 
ivpu_hw_ip_irq_enable(struct ivpu_device * vdev)9808a27ad81SWachowski, Karol void ivpu_hw_ip_irq_enable(struct ivpu_device *vdev)
9818a27ad81SWachowski, Karol {
9828a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
9838a27ad81SWachowski, Karol 		REGV_WR32(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, ITF_FIREWALL_VIOLATION_MASK_37XX);
9848a27ad81SWachowski, Karol 		REGV_WR64(VPU_37XX_HOST_SS_ICB_ENABLE_0, ICB_0_1_IRQ_MASK_37XX);
9858a27ad81SWachowski, Karol 	} else {
9868a27ad81SWachowski, Karol 		REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, ITF_FIREWALL_VIOLATION_MASK_40XX);
9878a27ad81SWachowski, Karol 		REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, ICB_0_1_IRQ_MASK_40XX);
9888a27ad81SWachowski, Karol 	}
9898a27ad81SWachowski, Karol }
9908a27ad81SWachowski, Karol 
ivpu_hw_ip_irq_disable(struct ivpu_device * vdev)9918a27ad81SWachowski, Karol void ivpu_hw_ip_irq_disable(struct ivpu_device *vdev)
9928a27ad81SWachowski, Karol {
9938a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
9948a27ad81SWachowski, Karol 		REGV_WR64(VPU_37XX_HOST_SS_ICB_ENABLE_0, 0x0ull);
9958a27ad81SWachowski, Karol 		REGV_WR32(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, 0x0);
9968a27ad81SWachowski, Karol 	} else {
9978a27ad81SWachowski, Karol 		REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, 0x0ull);
9988a27ad81SWachowski, Karol 		REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, 0x0ul);
9998a27ad81SWachowski, Karol 	}
10008a27ad81SWachowski, Karol }
10018a27ad81SWachowski, Karol 
diagnose_failure_37xx(struct ivpu_device * vdev)10028a27ad81SWachowski, Karol static void diagnose_failure_37xx(struct ivpu_device *vdev)
10038a27ad81SWachowski, Karol {
10048a27ad81SWachowski, Karol 	u32 reg = REGV_RD32(VPU_37XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_37XX;
10058a27ad81SWachowski, Karol 
10068a27ad81SWachowski, Karol 	if (ipc_rx_count_get_37xx(vdev))
10078a27ad81SWachowski, Karol 		ivpu_err(vdev, "IPC FIFO queue not empty, missed IPC IRQ");
10088a27ad81SWachowski, Karol 
10098a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, reg))
10108a27ad81SWachowski, Karol 		ivpu_err(vdev, "WDT MSS timeout detected\n");
10118a27ad81SWachowski, Karol 
10128a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, reg))
10138a27ad81SWachowski, Karol 		ivpu_err(vdev, "WDT NCE timeout detected\n");
10148a27ad81SWachowski, Karol 
10158a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, reg))
10168a27ad81SWachowski, Karol 		ivpu_err(vdev, "NOC Firewall irq detected\n");
10178a27ad81SWachowski, Karol }
10188a27ad81SWachowski, Karol 
diagnose_failure_40xx(struct ivpu_device * vdev)10198a27ad81SWachowski, Karol static void diagnose_failure_40xx(struct ivpu_device *vdev)
10208a27ad81SWachowski, Karol {
10218a27ad81SWachowski, Karol 	u32 reg = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_40XX;
10228a27ad81SWachowski, Karol 
10238a27ad81SWachowski, Karol 	if (ipc_rx_count_get_40xx(vdev))
10248a27ad81SWachowski, Karol 		ivpu_err(vdev, "IPC FIFO queue not empty, missed IPC IRQ");
10258a27ad81SWachowski, Karol 
10268a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, reg))
10278a27ad81SWachowski, Karol 		ivpu_err(vdev, "WDT MSS timeout detected\n");
10288a27ad81SWachowski, Karol 
10298a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, reg))
10308a27ad81SWachowski, Karol 		ivpu_err(vdev, "WDT NCE timeout detected\n");
10318a27ad81SWachowski, Karol 
10328a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, reg))
10338a27ad81SWachowski, Karol 		ivpu_err(vdev, "NOC Firewall irq detected\n");
10348a27ad81SWachowski, Karol }
10358a27ad81SWachowski, Karol 
ivpu_hw_ip_diagnose_failure(struct ivpu_device * vdev)10368a27ad81SWachowski, Karol void ivpu_hw_ip_diagnose_failure(struct ivpu_device *vdev)
10378a27ad81SWachowski, Karol {
10388a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
10398a27ad81SWachowski, Karol 		diagnose_failure_37xx(vdev);
10408a27ad81SWachowski, Karol 	else
10418a27ad81SWachowski, Karol 		diagnose_failure_40xx(vdev);
10428a27ad81SWachowski, Karol }
10438a27ad81SWachowski, Karol 
ivpu_hw_ip_irq_clear(struct ivpu_device * vdev)10448a27ad81SWachowski, Karol void ivpu_hw_ip_irq_clear(struct ivpu_device *vdev)
10458a27ad81SWachowski, Karol {
10468a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
10478a27ad81SWachowski, Karol 		REGV_WR64(VPU_37XX_HOST_SS_ICB_CLEAR_0, ICB_0_1_IRQ_MASK_37XX);
10488a27ad81SWachowski, Karol 	else
10498a27ad81SWachowski, Karol 		REGV_WR64(VPU_40XX_HOST_SS_ICB_CLEAR_0, ICB_0_1_IRQ_MASK_40XX);
10508a27ad81SWachowski, Karol }
10518a27ad81SWachowski, Karol 
irq_wdt_nce_handler(struct ivpu_device * vdev)10528a27ad81SWachowski, Karol static void irq_wdt_nce_handler(struct ivpu_device *vdev)
10538a27ad81SWachowski, Karol {
10548a27ad81SWachowski, Karol 	ivpu_pm_trigger_recovery(vdev, "WDT NCE IRQ");
10558a27ad81SWachowski, Karol }
10568a27ad81SWachowski, Karol 
irq_wdt_mss_handler(struct ivpu_device * vdev)10578a27ad81SWachowski, Karol static void irq_wdt_mss_handler(struct ivpu_device *vdev)
10588a27ad81SWachowski, Karol {
10598a27ad81SWachowski, Karol 	ivpu_hw_ip_wdt_disable(vdev);
10608a27ad81SWachowski, Karol 	ivpu_pm_trigger_recovery(vdev, "WDT MSS IRQ");
10618a27ad81SWachowski, Karol }
10628a27ad81SWachowski, Karol 
irq_noc_firewall_handler(struct ivpu_device * vdev)10638a27ad81SWachowski, Karol static void irq_noc_firewall_handler(struct ivpu_device *vdev)
10648a27ad81SWachowski, Karol {
10658a27ad81SWachowski, Karol 	ivpu_pm_trigger_recovery(vdev, "NOC Firewall IRQ");
10668a27ad81SWachowski, Karol }
10678a27ad81SWachowski, Karol 
10688a27ad81SWachowski, Karol /* Handler for IRQs from NPU core */
ivpu_hw_ip_irq_handler_37xx(struct ivpu_device * vdev,int irq)1069*2f7ffb06SJacek Lawrynowicz bool ivpu_hw_ip_irq_handler_37xx(struct ivpu_device *vdev, int irq)
10708a27ad81SWachowski, Karol {
10718a27ad81SWachowski, Karol 	u32 status = REGV_RD32(VPU_37XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_37XX;
10728a27ad81SWachowski, Karol 
10738a27ad81SWachowski, Karol 	if (!status)
10748a27ad81SWachowski, Karol 		return false;
10758a27ad81SWachowski, Karol 
10768a27ad81SWachowski, Karol 	REGV_WR32(VPU_37XX_HOST_SS_ICB_CLEAR_0, status);
10778a27ad81SWachowski, Karol 
10788a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT, status))
10798a27ad81SWachowski, Karol 		ivpu_mmu_irq_evtq_handler(vdev);
10808a27ad81SWachowski, Karol 
10818a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT, status))
1082*2f7ffb06SJacek Lawrynowicz 		ivpu_ipc_irq_handler(vdev);
10838a27ad81SWachowski, Karol 
10848a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT, status))
10858a27ad81SWachowski, Karol 		ivpu_dbg(vdev, IRQ, "MMU sync complete\n");
10868a27ad81SWachowski, Karol 
10878a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT, status))
10888a27ad81SWachowski, Karol 		ivpu_mmu_irq_gerr_handler(vdev);
10898a27ad81SWachowski, Karol 
10908a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, status))
10918a27ad81SWachowski, Karol 		irq_wdt_mss_handler(vdev);
10928a27ad81SWachowski, Karol 
10938a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, status))
10948a27ad81SWachowski, Karol 		irq_wdt_nce_handler(vdev);
10958a27ad81SWachowski, Karol 
10968a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, status))
10978a27ad81SWachowski, Karol 		irq_noc_firewall_handler(vdev);
10988a27ad81SWachowski, Karol 
10998a27ad81SWachowski, Karol 	return true;
11008a27ad81SWachowski, Karol }
11018a27ad81SWachowski, Karol 
11028a27ad81SWachowski, Karol /* Handler for IRQs from NPU core */
ivpu_hw_ip_irq_handler_40xx(struct ivpu_device * vdev,int irq)1103*2f7ffb06SJacek Lawrynowicz bool ivpu_hw_ip_irq_handler_40xx(struct ivpu_device *vdev, int irq)
11048a27ad81SWachowski, Karol {
11058a27ad81SWachowski, Karol 	u32 status = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_40XX;
11068a27ad81SWachowski, Karol 
11078a27ad81SWachowski, Karol 	if (!status)
11088a27ad81SWachowski, Karol 		return false;
11098a27ad81SWachowski, Karol 
11108a27ad81SWachowski, Karol 	REGV_WR32(VPU_40XX_HOST_SS_ICB_CLEAR_0, status);
11118a27ad81SWachowski, Karol 
11128a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT, status))
11138a27ad81SWachowski, Karol 		ivpu_mmu_irq_evtq_handler(vdev);
11148a27ad81SWachowski, Karol 
11158a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT, status))
1116*2f7ffb06SJacek Lawrynowicz 		ivpu_ipc_irq_handler(vdev);
11178a27ad81SWachowski, Karol 
11188a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT, status))
11198a27ad81SWachowski, Karol 		ivpu_dbg(vdev, IRQ, "MMU sync complete\n");
11208a27ad81SWachowski, Karol 
11218a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT, status))
11228a27ad81SWachowski, Karol 		ivpu_mmu_irq_gerr_handler(vdev);
11238a27ad81SWachowski, Karol 
11248a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, status))
11258a27ad81SWachowski, Karol 		irq_wdt_mss_handler(vdev);
11268a27ad81SWachowski, Karol 
11278a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, status))
11288a27ad81SWachowski, Karol 		irq_wdt_nce_handler(vdev);
11298a27ad81SWachowski, Karol 
11308a27ad81SWachowski, Karol 	if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, status))
11318a27ad81SWachowski, Karol 		irq_noc_firewall_handler(vdev);
11328a27ad81SWachowski, Karol 
11338a27ad81SWachowski, Karol 	return true;
11348a27ad81SWachowski, Karol }
11358a27ad81SWachowski, Karol 
db_set_37xx(struct ivpu_device * vdev,u32 db_id)11368a27ad81SWachowski, Karol static void db_set_37xx(struct ivpu_device *vdev, u32 db_id)
11378a27ad81SWachowski, Karol {
11388a27ad81SWachowski, Karol 	u32 reg_stride = VPU_37XX_CPU_SS_DOORBELL_1 - VPU_37XX_CPU_SS_DOORBELL_0;
11398a27ad81SWachowski, Karol 	u32 val = REG_FLD(VPU_37XX_CPU_SS_DOORBELL_0, SET);
11408a27ad81SWachowski, Karol 
11418a27ad81SWachowski, Karol 	REGV_WR32I(VPU_37XX_CPU_SS_DOORBELL_0, reg_stride, db_id, val);
11428a27ad81SWachowski, Karol }
11438a27ad81SWachowski, Karol 
db_set_40xx(struct ivpu_device * vdev,u32 db_id)11448a27ad81SWachowski, Karol static void db_set_40xx(struct ivpu_device *vdev, u32 db_id)
11458a27ad81SWachowski, Karol {
11468a27ad81SWachowski, Karol 	u32 reg_stride = VPU_40XX_CPU_SS_DOORBELL_1 - VPU_40XX_CPU_SS_DOORBELL_0;
11478a27ad81SWachowski, Karol 	u32 val = REG_FLD(VPU_40XX_CPU_SS_DOORBELL_0, SET);
11488a27ad81SWachowski, Karol 
11498a27ad81SWachowski, Karol 	REGV_WR32I(VPU_40XX_CPU_SS_DOORBELL_0, reg_stride, db_id, val);
11508a27ad81SWachowski, Karol }
11518a27ad81SWachowski, Karol 
ivpu_hw_ip_db_set(struct ivpu_device * vdev,u32 db_id)11528a27ad81SWachowski, Karol void ivpu_hw_ip_db_set(struct ivpu_device *vdev, u32 db_id)
11538a27ad81SWachowski, Karol {
11548a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
11558a27ad81SWachowski, Karol 		db_set_37xx(vdev, db_id);
11568a27ad81SWachowski, Karol 	else
11578a27ad81SWachowski, Karol 		db_set_40xx(vdev, db_id);
11588a27ad81SWachowski, Karol }
11598a27ad81SWachowski, Karol 
ivpu_hw_ip_ipc_rx_addr_get(struct ivpu_device * vdev)11608a27ad81SWachowski, Karol u32 ivpu_hw_ip_ipc_rx_addr_get(struct ivpu_device *vdev)
11618a27ad81SWachowski, Karol {
11628a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
11638a27ad81SWachowski, Karol 		return REGV_RD32(VPU_37XX_HOST_SS_TIM_IPC_FIFO_ATM);
11648a27ad81SWachowski, Karol 	else
11658a27ad81SWachowski, Karol 		return REGV_RD32(VPU_40XX_HOST_SS_TIM_IPC_FIFO_ATM);
11668a27ad81SWachowski, Karol }
11678a27ad81SWachowski, Karol 
ivpu_hw_ip_ipc_tx_set(struct ivpu_device * vdev,u32 vpu_addr)11688a27ad81SWachowski, Karol void ivpu_hw_ip_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
11698a27ad81SWachowski, Karol {
11708a27ad81SWachowski, Karol 	if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
11718a27ad81SWachowski, Karol 		REGV_WR32(VPU_37XX_CPU_SS_TIM_IPC_FIFO, vpu_addr);
11728a27ad81SWachowski, Karol 	else
11738a27ad81SWachowski, Karol 		REGV_WR32(VPU_40XX_CPU_SS_TIM_IPC_FIFO, vpu_addr);
11748a27ad81SWachowski, Karol }
1175