162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2020-2023 Intel Corporation 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include "ivpu_drv.h" 762306a36Sopenharmony_ci#include "ivpu_fw.h" 862306a36Sopenharmony_ci#include "ivpu_hw.h" 962306a36Sopenharmony_ci#include "ivpu_hw_40xx_reg.h" 1062306a36Sopenharmony_ci#include "ivpu_hw_reg_io.h" 1162306a36Sopenharmony_ci#include "ivpu_ipc.h" 1262306a36Sopenharmony_ci#include "ivpu_mmu.h" 1362306a36Sopenharmony_ci#include "ivpu_pm.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/dmi.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define TILE_MAX_NUM 6 1862306a36Sopenharmony_ci#define TILE_MAX_MASK 0x3f 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define LNL_HW_ID 0x4040 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define SKU_TILE_SHIFT 0u 2362306a36Sopenharmony_ci#define SKU_TILE_MASK 0x0000ffffu 2462306a36Sopenharmony_ci#define SKU_HW_ID_SHIFT 16u 2562306a36Sopenharmony_ci#define SKU_HW_ID_MASK 0xffff0000u 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define PLL_CONFIG_DEFAULT 0x0 2862306a36Sopenharmony_ci#define PLL_CDYN_DEFAULT 0x80 2962306a36Sopenharmony_ci#define PLL_EPP_DEFAULT 0x80 3062306a36Sopenharmony_ci#define PLL_REF_CLK_FREQ (50 * 1000000) 3162306a36Sopenharmony_ci#define PLL_RATIO_TO_FREQ(x) ((x) * PLL_REF_CLK_FREQ) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define PLL_PROFILING_FREQ_DEFAULT 38400000 3462306a36Sopenharmony_ci#define PLL_PROFILING_FREQ_HIGH 400000000 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define TIM_SAFE_ENABLE 0xf1d0dead 3762306a36Sopenharmony_ci#define TIM_WATCHDOG_RESET_VALUE 0xffffffff 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define TIMEOUT_US (150 * USEC_PER_MSEC) 4062306a36Sopenharmony_ci#define PWR_ISLAND_STATUS_TIMEOUT_US (5 * USEC_PER_MSEC) 4162306a36Sopenharmony_ci#define PLL_TIMEOUT_US (1500 * USEC_PER_MSEC) 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define WEIGHTS_DEFAULT 0xf711f711u 4462306a36Sopenharmony_ci#define WEIGHTS_ATS_DEFAULT 0x0000f711u 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define ICB_0_IRQ_MASK ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT)) | \ 4762306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT)) | \ 4862306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT)) | \ 4962306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT)) | \ 5062306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT)) | \ 5162306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT)) | \ 5262306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT))) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define ICB_1_IRQ_MASK ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_2_INT)) | \ 5562306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_3_INT)) | \ 5662306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_4_INT))) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define ICB_0_1_IRQ_MASK ((((u64)ICB_1_IRQ_MASK) << 32) | ICB_0_IRQ_MASK) 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define BUTTRESS_IRQ_MASK ((REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR)) | \ 6162306a36Sopenharmony_ci (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI0_ERR)) | \ 6262306a36Sopenharmony_ci (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI1_ERR)) | \ 6362306a36Sopenharmony_ci (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR0_ERR)) | \ 6462306a36Sopenharmony_ci (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR1_ERR)) | \ 6562306a36Sopenharmony_ci (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, SURV_ERR))) 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#define BUTTRESS_IRQ_ENABLE_MASK ((u32)~BUTTRESS_IRQ_MASK) 6862306a36Sopenharmony_ci#define BUTTRESS_IRQ_DISABLE_MASK ((u32)-1) 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define ITF_FIREWALL_VIOLATION_MASK ((REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_ROM_CMX)) | \ 7162306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_DBG)) | \ 7262306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_CTRL)) | \ 7362306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, DEC400)) | \ 7462306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_NCE)) | \ 7562306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI)) | \ 7662306a36Sopenharmony_ci (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI_CMX))) 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic char *ivpu_platform_to_str(u32 platform) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci switch (platform) { 8162306a36Sopenharmony_ci case IVPU_PLATFORM_SILICON: 8262306a36Sopenharmony_ci return "IVPU_PLATFORM_SILICON"; 8362306a36Sopenharmony_ci case IVPU_PLATFORM_SIMICS: 8462306a36Sopenharmony_ci return "IVPU_PLATFORM_SIMICS"; 8562306a36Sopenharmony_ci case IVPU_PLATFORM_FPGA: 8662306a36Sopenharmony_ci return "IVPU_PLATFORM_FPGA"; 8762306a36Sopenharmony_ci default: 8862306a36Sopenharmony_ci return "Invalid platform"; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic const struct dmi_system_id ivpu_dmi_platform_simulation[] = { 9362306a36Sopenharmony_ci { 9462306a36Sopenharmony_ci .ident = "Intel Simics", 9562306a36Sopenharmony_ci .matches = { 9662306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "lnlrvp"), 9762306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "1.0"), 9862306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_SERIAL, "123456789"), 9962306a36Sopenharmony_ci }, 10062306a36Sopenharmony_ci }, 10162306a36Sopenharmony_ci { 10262306a36Sopenharmony_ci .ident = "Intel Simics", 10362306a36Sopenharmony_ci .matches = { 10462306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "Simics"), 10562306a36Sopenharmony_ci }, 10662306a36Sopenharmony_ci }, 10762306a36Sopenharmony_ci { } 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistatic void ivpu_hw_read_platform(struct ivpu_device *vdev) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci if (dmi_check_system(ivpu_dmi_platform_simulation)) 11362306a36Sopenharmony_ci vdev->platform = IVPU_PLATFORM_SIMICS; 11462306a36Sopenharmony_ci else 11562306a36Sopenharmony_ci vdev->platform = IVPU_PLATFORM_SILICON; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci ivpu_dbg(vdev, MISC, "Platform type: %s (%d)\n", 11862306a36Sopenharmony_ci ivpu_platform_to_str(vdev->platform), vdev->platform); 11962306a36Sopenharmony_ci} 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistatic void ivpu_hw_wa_init(struct ivpu_device *vdev) 12262306a36Sopenharmony_ci{ 12362306a36Sopenharmony_ci vdev->wa.punit_disabled = ivpu_is_fpga(vdev); 12462306a36Sopenharmony_ci vdev->wa.clear_runtime_mem = false; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci if (ivpu_hw_gen(vdev) == IVPU_HW_40XX) 12762306a36Sopenharmony_ci vdev->wa.disable_clock_relinquish = true; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci IVPU_PRINT_WA(punit_disabled); 13062306a36Sopenharmony_ci IVPU_PRINT_WA(clear_runtime_mem); 13162306a36Sopenharmony_ci IVPU_PRINT_WA(disable_clock_relinquish); 13262306a36Sopenharmony_ci} 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistatic void ivpu_hw_timeouts_init(struct ivpu_device *vdev) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci if (ivpu_is_fpga(vdev)) { 13762306a36Sopenharmony_ci vdev->timeout.boot = 100000; 13862306a36Sopenharmony_ci vdev->timeout.jsm = 50000; 13962306a36Sopenharmony_ci vdev->timeout.tdr = 2000000; 14062306a36Sopenharmony_ci vdev->timeout.reschedule_suspend = 1000; 14162306a36Sopenharmony_ci } else if (ivpu_is_simics(vdev)) { 14262306a36Sopenharmony_ci vdev->timeout.boot = 50; 14362306a36Sopenharmony_ci vdev->timeout.jsm = 500; 14462306a36Sopenharmony_ci vdev->timeout.tdr = 10000; 14562306a36Sopenharmony_ci vdev->timeout.reschedule_suspend = 10; 14662306a36Sopenharmony_ci } else { 14762306a36Sopenharmony_ci vdev->timeout.boot = 1000; 14862306a36Sopenharmony_ci vdev->timeout.jsm = 500; 14962306a36Sopenharmony_ci vdev->timeout.tdr = 2000; 15062306a36Sopenharmony_ci vdev->timeout.reschedule_suspend = 10; 15162306a36Sopenharmony_ci } 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic int ivpu_pll_wait_for_cmd_send(struct ivpu_device *vdev) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci return REGB_POLL_FLD(VPU_40XX_BUTTRESS_WP_REQ_CMD, SEND, 0, PLL_TIMEOUT_US); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic int ivpu_pll_cmd_send(struct ivpu_device *vdev, u16 min_ratio, u16 max_ratio, 16062306a36Sopenharmony_ci u16 target_ratio, u16 epp, u16 config, u16 cdyn) 16162306a36Sopenharmony_ci{ 16262306a36Sopenharmony_ci int ret; 16362306a36Sopenharmony_ci u32 val; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci ret = ivpu_pll_wait_for_cmd_send(vdev); 16662306a36Sopenharmony_ci if (ret) { 16762306a36Sopenharmony_ci ivpu_err(vdev, "Failed to sync before WP request: %d\n", ret); 16862306a36Sopenharmony_ci return ret; 16962306a36Sopenharmony_ci } 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0); 17262306a36Sopenharmony_ci val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0, MIN_RATIO, min_ratio, val); 17362306a36Sopenharmony_ci val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0, MAX_RATIO, max_ratio, val); 17462306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0, val); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1); 17762306a36Sopenharmony_ci val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1, TARGET_RATIO, target_ratio, val); 17862306a36Sopenharmony_ci val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1, EPP, epp, val); 17962306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1, val); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2); 18262306a36Sopenharmony_ci val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2, CONFIG, config, val); 18362306a36Sopenharmony_ci val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2, CDYN, cdyn, val); 18462306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2, val); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_CMD); 18762306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_BUTTRESS_WP_REQ_CMD, SEND, val); 18862306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_CMD, val); 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci ret = ivpu_pll_wait_for_cmd_send(vdev); 19162306a36Sopenharmony_ci if (ret) 19262306a36Sopenharmony_ci ivpu_err(vdev, "Failed to sync after WP request: %d\n", ret); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci return ret; 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic int ivpu_pll_wait_for_status_ready(struct ivpu_device *vdev) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci return REGB_POLL_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, READY, 1, PLL_TIMEOUT_US); 20062306a36Sopenharmony_ci} 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cistatic int ivpu_wait_for_clock_own_resource_ack(struct ivpu_device *vdev) 20362306a36Sopenharmony_ci{ 20462306a36Sopenharmony_ci if (ivpu_is_simics(vdev)) 20562306a36Sopenharmony_ci return 0; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci return REGB_POLL_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, CLOCK_RESOURCE_OWN_ACK, 1, TIMEOUT_US); 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic void ivpu_pll_init_frequency_ratios(struct ivpu_device *vdev) 21162306a36Sopenharmony_ci{ 21262306a36Sopenharmony_ci struct ivpu_hw_info *hw = vdev->hw; 21362306a36Sopenharmony_ci u8 fuse_min_ratio, fuse_pn_ratio, fuse_max_ratio; 21462306a36Sopenharmony_ci u32 fmin_fuse, fmax_fuse; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci fmin_fuse = REGB_RD32(VPU_40XX_BUTTRESS_FMIN_FUSE); 21762306a36Sopenharmony_ci fuse_min_ratio = REG_GET_FLD(VPU_40XX_BUTTRESS_FMIN_FUSE, MIN_RATIO, fmin_fuse); 21862306a36Sopenharmony_ci fuse_pn_ratio = REG_GET_FLD(VPU_40XX_BUTTRESS_FMIN_FUSE, PN_RATIO, fmin_fuse); 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci fmax_fuse = REGB_RD32(VPU_40XX_BUTTRESS_FMAX_FUSE); 22162306a36Sopenharmony_ci fuse_max_ratio = REG_GET_FLD(VPU_40XX_BUTTRESS_FMAX_FUSE, MAX_RATIO, fmax_fuse); 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci hw->pll.min_ratio = clamp_t(u8, ivpu_pll_min_ratio, fuse_min_ratio, fuse_max_ratio); 22462306a36Sopenharmony_ci hw->pll.max_ratio = clamp_t(u8, ivpu_pll_max_ratio, hw->pll.min_ratio, fuse_max_ratio); 22562306a36Sopenharmony_ci hw->pll.pn_ratio = clamp_t(u8, fuse_pn_ratio, hw->pll.min_ratio, hw->pll.max_ratio); 22662306a36Sopenharmony_ci} 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic int ivpu_pll_drive(struct ivpu_device *vdev, bool enable) 22962306a36Sopenharmony_ci{ 23062306a36Sopenharmony_ci u16 config = enable ? PLL_CONFIG_DEFAULT : 0; 23162306a36Sopenharmony_ci u16 cdyn = enable ? PLL_CDYN_DEFAULT : 0; 23262306a36Sopenharmony_ci u16 epp = enable ? PLL_EPP_DEFAULT : 0; 23362306a36Sopenharmony_ci struct ivpu_hw_info *hw = vdev->hw; 23462306a36Sopenharmony_ci u16 target_ratio = hw->pll.pn_ratio; 23562306a36Sopenharmony_ci int ret; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci ivpu_dbg(vdev, PM, "PLL workpoint request: %u Hz, epp: 0x%x, config: 0x%x, cdyn: 0x%x\n", 23862306a36Sopenharmony_ci PLL_RATIO_TO_FREQ(target_ratio), epp, config, cdyn); 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci ret = ivpu_pll_cmd_send(vdev, hw->pll.min_ratio, hw->pll.max_ratio, 24162306a36Sopenharmony_ci target_ratio, epp, config, cdyn); 24262306a36Sopenharmony_ci if (ret) { 24362306a36Sopenharmony_ci ivpu_err(vdev, "Failed to send PLL workpoint request: %d\n", ret); 24462306a36Sopenharmony_ci return ret; 24562306a36Sopenharmony_ci } 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci if (enable) { 24862306a36Sopenharmony_ci ret = ivpu_pll_wait_for_status_ready(vdev); 24962306a36Sopenharmony_ci if (ret) { 25062306a36Sopenharmony_ci ivpu_err(vdev, "Timed out waiting for PLL ready status\n"); 25162306a36Sopenharmony_ci return ret; 25262306a36Sopenharmony_ci } 25362306a36Sopenharmony_ci } 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci return 0; 25662306a36Sopenharmony_ci} 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic int ivpu_pll_enable(struct ivpu_device *vdev) 25962306a36Sopenharmony_ci{ 26062306a36Sopenharmony_ci return ivpu_pll_drive(vdev, true); 26162306a36Sopenharmony_ci} 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistatic int ivpu_pll_disable(struct ivpu_device *vdev) 26462306a36Sopenharmony_ci{ 26562306a36Sopenharmony_ci return ivpu_pll_drive(vdev, false); 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic void ivpu_boot_host_ss_rst_drive(struct ivpu_device *vdev, bool enable) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_RST_EN); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci if (enable) { 27362306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val); 27462306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val); 27562306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val); 27662306a36Sopenharmony_ci } else { 27762306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val); 27862306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val); 27962306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val); 28062306a36Sopenharmony_ci } 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_CPR_RST_EN, val); 28362306a36Sopenharmony_ci} 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic void ivpu_boot_host_ss_clk_drive(struct ivpu_device *vdev, bool enable) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_CLK_EN); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci if (enable) { 29062306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val); 29162306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val); 29262306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val); 29362306a36Sopenharmony_ci } else { 29462306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val); 29562306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val); 29662306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val); 29762306a36Sopenharmony_ci } 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_CPR_CLK_EN, val); 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic int ivpu_boot_noc_qreqn_check(struct ivpu_device *vdev, u32 exp_val) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN); 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, exp_val, val)) 30762306a36Sopenharmony_ci return -EIO; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci return 0; 31062306a36Sopenharmony_ci} 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistatic int ivpu_boot_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QACCEPTN); 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QACCEPTN, TOP_SOCMMIO, exp_val, val)) 31762306a36Sopenharmony_ci return -EIO; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci return 0; 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cistatic int ivpu_boot_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val) 32362306a36Sopenharmony_ci{ 32462306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QDENY); 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QDENY, TOP_SOCMMIO, exp_val, val)) 32762306a36Sopenharmony_ci return -EIO; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci return 0; 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic int ivpu_boot_top_noc_qrenqn_check(struct ivpu_device *vdev, u32 exp_val) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN); 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, exp_val, val) || 33762306a36Sopenharmony_ci !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, exp_val, val)) 33862306a36Sopenharmony_ci return -EIO; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci return 0; 34162306a36Sopenharmony_ci} 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic int ivpu_boot_top_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val) 34462306a36Sopenharmony_ci{ 34562306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QACCEPTN); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, CPU_CTRL, exp_val, val) || 34862306a36Sopenharmony_ci !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, HOSTIF_L2CACHE, exp_val, val)) 34962306a36Sopenharmony_ci return -EIO; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci return 0; 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic int ivpu_boot_top_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QDENY); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, CPU_CTRL, exp_val, val) || 35962306a36Sopenharmony_ci !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, HOSTIF_L2CACHE, exp_val, val)) 36062306a36Sopenharmony_ci return -EIO; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci return 0; 36362306a36Sopenharmony_ci} 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic void ivpu_boot_idle_gen_drive(struct ivpu_device *vdev, bool enable) 36662306a36Sopenharmony_ci{ 36762306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_IDLE_GEN); 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci if (enable) 37062306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val); 37162306a36Sopenharmony_ci else 37262306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_AON_IDLE_GEN, val); 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic int ivpu_boot_host_ss_check(struct ivpu_device *vdev) 37862306a36Sopenharmony_ci{ 37962306a36Sopenharmony_ci int ret; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci ret = ivpu_boot_noc_qreqn_check(vdev, 0x0); 38262306a36Sopenharmony_ci if (ret) { 38362306a36Sopenharmony_ci ivpu_err(vdev, "Failed qreqn check: %d\n", ret); 38462306a36Sopenharmony_ci return ret; 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci ret = ivpu_boot_noc_qacceptn_check(vdev, 0x0); 38862306a36Sopenharmony_ci if (ret) { 38962306a36Sopenharmony_ci ivpu_err(vdev, "Failed qacceptn check: %d\n", ret); 39062306a36Sopenharmony_ci return ret; 39162306a36Sopenharmony_ci } 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci ret = ivpu_boot_noc_qdeny_check(vdev, 0x0); 39462306a36Sopenharmony_ci if (ret) 39562306a36Sopenharmony_ci ivpu_err(vdev, "Failed qdeny check %d\n", ret); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci return ret; 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cistatic int ivpu_boot_host_ss_axi_drive(struct ivpu_device *vdev, bool enable) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci int ret; 40362306a36Sopenharmony_ci u32 val; 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN); 40662306a36Sopenharmony_ci if (enable) 40762306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val); 40862306a36Sopenharmony_ci else 40962306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val); 41062306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_NOC_QREQN, val); 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci ret = ivpu_boot_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0); 41362306a36Sopenharmony_ci if (ret) { 41462306a36Sopenharmony_ci ivpu_err(vdev, "Failed qacceptn check: %d\n", ret); 41562306a36Sopenharmony_ci return ret; 41662306a36Sopenharmony_ci } 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci ret = ivpu_boot_noc_qdeny_check(vdev, 0x0); 41962306a36Sopenharmony_ci if (ret) { 42062306a36Sopenharmony_ci ivpu_err(vdev, "Failed qdeny check: %d\n", ret); 42162306a36Sopenharmony_ci return ret; 42262306a36Sopenharmony_ci } 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci if (enable) { 42562306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_PORT_ARBITRATION_WEIGHTS, WEIGHTS_DEFAULT); 42662306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_PORT_ARBITRATION_WEIGHTS_ATS, WEIGHTS_ATS_DEFAULT); 42762306a36Sopenharmony_ci } 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci return ret; 43062306a36Sopenharmony_ci} 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_cistatic int ivpu_boot_host_ss_axi_enable(struct ivpu_device *vdev) 43362306a36Sopenharmony_ci{ 43462306a36Sopenharmony_ci return ivpu_boot_host_ss_axi_drive(vdev, true); 43562306a36Sopenharmony_ci} 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistatic int ivpu_boot_host_ss_top_noc_drive(struct ivpu_device *vdev, bool enable) 43862306a36Sopenharmony_ci{ 43962306a36Sopenharmony_ci int ret; 44062306a36Sopenharmony_ci u32 val; 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN); 44362306a36Sopenharmony_ci if (enable) { 44462306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val); 44562306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val); 44662306a36Sopenharmony_ci } else { 44762306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val); 44862306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val); 44962306a36Sopenharmony_ci } 45062306a36Sopenharmony_ci REGV_WR32(VPU_40XX_TOP_NOC_QREQN, val); 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci ret = ivpu_boot_top_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0); 45362306a36Sopenharmony_ci if (ret) { 45462306a36Sopenharmony_ci ivpu_err(vdev, "Failed qacceptn check: %d\n", ret); 45562306a36Sopenharmony_ci return ret; 45662306a36Sopenharmony_ci } 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci ret = ivpu_boot_top_noc_qdeny_check(vdev, 0x0); 45962306a36Sopenharmony_ci if (ret) 46062306a36Sopenharmony_ci ivpu_err(vdev, "Failed qdeny check: %d\n", ret); 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci return ret; 46362306a36Sopenharmony_ci} 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistatic int ivpu_boot_host_ss_top_noc_enable(struct ivpu_device *vdev) 46662306a36Sopenharmony_ci{ 46762306a36Sopenharmony_ci return ivpu_boot_host_ss_top_noc_drive(vdev, true); 46862306a36Sopenharmony_ci} 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_cistatic void ivpu_boot_pwr_island_trickle_drive(struct ivpu_device *vdev, bool enable) 47162306a36Sopenharmony_ci{ 47262306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0); 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci if (enable) 47562306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val); 47662306a36Sopenharmony_ci else 47762306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val); 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, val); 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci if (enable) 48262306a36Sopenharmony_ci ndelay(500); 48362306a36Sopenharmony_ci} 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_cistatic void ivpu_boot_pwr_island_drive(struct ivpu_device *vdev, bool enable) 48662306a36Sopenharmony_ci{ 48762306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0); 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci if (enable) 49062306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val); 49162306a36Sopenharmony_ci else 49262306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val); 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, val); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci if (!enable) 49762306a36Sopenharmony_ci ndelay(500); 49862306a36Sopenharmony_ci} 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_cistatic int ivpu_boot_wait_for_pwr_island_status(struct ivpu_device *vdev, u32 exp_val) 50162306a36Sopenharmony_ci{ 50262306a36Sopenharmony_ci if (ivpu_is_fpga(vdev)) 50362306a36Sopenharmony_ci return 0; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci return REGV_POLL_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_STATUS0, CSS_CPU, 50662306a36Sopenharmony_ci exp_val, PWR_ISLAND_STATUS_TIMEOUT_US); 50762306a36Sopenharmony_ci} 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_cistatic void ivpu_boot_pwr_island_isolation_drive(struct ivpu_device *vdev, bool enable) 51062306a36Sopenharmony_ci{ 51162306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0); 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci if (enable) 51462306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val); 51562306a36Sopenharmony_ci else 51662306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val); 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, val); 51962306a36Sopenharmony_ci} 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_cistatic void ivpu_boot_no_snoop_enable(struct ivpu_device *vdev) 52262306a36Sopenharmony_ci{ 52362306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES); 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, SNOOP_OVERRIDE_EN, val); 52662306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AW_SNOOP_OVERRIDE, val); 52762306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AR_SNOOP_OVERRIDE, val); 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, val); 53062306a36Sopenharmony_ci} 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_cistatic void ivpu_boot_tbu_mmu_enable(struct ivpu_device *vdev) 53362306a36Sopenharmony_ci{ 53462306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_HOST_IF_TBU_MMUSSIDV); 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_AWMMUSSIDV, val); 53762306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_ARMMUSSIDV, val); 53862306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_AWMMUSSIDV, val); 53962306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_ARMMUSSIDV, val); 54062306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_AWMMUSSIDV, val); 54162306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_ARMMUSSIDV, val); 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_IF_TBU_MMUSSIDV, val); 54462306a36Sopenharmony_ci} 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistatic int ivpu_boot_cpu_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val) 54762306a36Sopenharmony_ci{ 54862306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN); 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN, TOP_MMIO, exp_val, val)) 55162306a36Sopenharmony_ci return -EIO; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci return 0; 55462306a36Sopenharmony_ci} 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistatic int ivpu_boot_cpu_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val) 55762306a36Sopenharmony_ci{ 55862306a36Sopenharmony_ci u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QDENY); 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QDENY, TOP_MMIO, exp_val, val)) 56162306a36Sopenharmony_ci return -EIO; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci return 0; 56462306a36Sopenharmony_ci} 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_cistatic int ivpu_boot_pwr_domain_enable(struct ivpu_device *vdev) 56762306a36Sopenharmony_ci{ 56862306a36Sopenharmony_ci int ret; 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci ret = ivpu_wait_for_clock_own_resource_ack(vdev); 57162306a36Sopenharmony_ci if (ret) { 57262306a36Sopenharmony_ci ivpu_err(vdev, "Timed out waiting for clock own resource ACK\n"); 57362306a36Sopenharmony_ci return ret; 57462306a36Sopenharmony_ci } 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci ivpu_boot_pwr_island_trickle_drive(vdev, true); 57762306a36Sopenharmony_ci ivpu_boot_pwr_island_drive(vdev, true); 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci ret = ivpu_boot_wait_for_pwr_island_status(vdev, 0x1); 58062306a36Sopenharmony_ci if (ret) { 58162306a36Sopenharmony_ci ivpu_err(vdev, "Timed out waiting for power island status\n"); 58262306a36Sopenharmony_ci return ret; 58362306a36Sopenharmony_ci } 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci ret = ivpu_boot_top_noc_qrenqn_check(vdev, 0x0); 58662306a36Sopenharmony_ci if (ret) { 58762306a36Sopenharmony_ci ivpu_err(vdev, "Failed qrenqn check %d\n", ret); 58862306a36Sopenharmony_ci return ret; 58962306a36Sopenharmony_ci } 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci ivpu_boot_host_ss_clk_drive(vdev, true); 59262306a36Sopenharmony_ci ivpu_boot_host_ss_rst_drive(vdev, true); 59362306a36Sopenharmony_ci ivpu_boot_pwr_island_isolation_drive(vdev, false); 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci return ret; 59662306a36Sopenharmony_ci} 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_cistatic int ivpu_boot_soc_cpu_drive(struct ivpu_device *vdev, bool enable) 59962306a36Sopenharmony_ci{ 60062306a36Sopenharmony_ci int ret; 60162306a36Sopenharmony_ci u32 val; 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QREQN); 60462306a36Sopenharmony_ci if (enable) 60562306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val); 60662306a36Sopenharmony_ci else 60762306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val); 60862306a36Sopenharmony_ci REGV_WR32(VPU_40XX_CPU_SS_CPR_NOC_QREQN, val); 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci ret = ivpu_boot_cpu_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0); 61162306a36Sopenharmony_ci if (ret) { 61262306a36Sopenharmony_ci ivpu_err(vdev, "Failed qacceptn check: %d\n", ret); 61362306a36Sopenharmony_ci return ret; 61462306a36Sopenharmony_ci } 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci ret = ivpu_boot_cpu_noc_qdeny_check(vdev, 0x0); 61762306a36Sopenharmony_ci if (ret) 61862306a36Sopenharmony_ci ivpu_err(vdev, "Failed qdeny check: %d\n", ret); 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci return ret; 62162306a36Sopenharmony_ci} 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_cistatic int ivpu_boot_soc_cpu_enable(struct ivpu_device *vdev) 62462306a36Sopenharmony_ci{ 62562306a36Sopenharmony_ci return ivpu_boot_soc_cpu_drive(vdev, true); 62662306a36Sopenharmony_ci} 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_cistatic int ivpu_boot_soc_cpu_boot(struct ivpu_device *vdev) 62962306a36Sopenharmony_ci{ 63062306a36Sopenharmony_ci int ret; 63162306a36Sopenharmony_ci u32 val; 63262306a36Sopenharmony_ci u64 val64; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci ret = ivpu_boot_soc_cpu_enable(vdev); 63562306a36Sopenharmony_ci if (ret) { 63662306a36Sopenharmony_ci ivpu_err(vdev, "Failed to enable SOC CPU: %d\n", ret); 63762306a36Sopenharmony_ci return ret; 63862306a36Sopenharmony_ci } 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci val64 = vdev->fw->entry_point; 64162306a36Sopenharmony_ci val64 <<= ffs(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO_IMAGE_LOCATION_MASK) - 1; 64262306a36Sopenharmony_ci REGV_WR64(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val64); 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci val = REGV_RD32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO); 64562306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, DONE, val); 64662306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val); 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n", 64962306a36Sopenharmony_ci ivpu_fw_is_cold_boot(vdev) ? "cold boot" : "resume"); 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci return 0; 65262306a36Sopenharmony_ci} 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_cistatic int ivpu_boot_d0i3_drive(struct ivpu_device *vdev, bool enable) 65562306a36Sopenharmony_ci{ 65662306a36Sopenharmony_ci int ret; 65762306a36Sopenharmony_ci u32 val; 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_ci ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US); 66062306a36Sopenharmony_ci if (ret) { 66162306a36Sopenharmony_ci ivpu_err(vdev, "Failed to sync before D0i3 transition: %d\n", ret); 66262306a36Sopenharmony_ci return ret; 66362306a36Sopenharmony_ci } 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci val = REGB_RD32(VPU_40XX_BUTTRESS_D0I3_CONTROL); 66662306a36Sopenharmony_ci if (enable) 66762306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, I3, val); 66862306a36Sopenharmony_ci else 66962306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, I3, val); 67062306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_D0I3_CONTROL, val); 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US); 67362306a36Sopenharmony_ci if (ret) { 67462306a36Sopenharmony_ci ivpu_err(vdev, "Failed to sync after D0i3 transition: %d\n", ret); 67562306a36Sopenharmony_ci return ret; 67662306a36Sopenharmony_ci } 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ci return 0; 67962306a36Sopenharmony_ci} 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_cistatic bool ivpu_tile_disable_check(u32 config) 68262306a36Sopenharmony_ci{ 68362306a36Sopenharmony_ci /* Allowed values: 0 or one bit from range 0-5 (6 tiles) */ 68462306a36Sopenharmony_ci if (config == 0) 68562306a36Sopenharmony_ci return true; 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ci if (config > BIT(TILE_MAX_NUM - 1)) 68862306a36Sopenharmony_ci return false; 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci if ((config & (config - 1)) == 0) 69162306a36Sopenharmony_ci return true; 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci return false; 69462306a36Sopenharmony_ci} 69562306a36Sopenharmony_ci 69662306a36Sopenharmony_cistatic int ivpu_hw_40xx_info_init(struct ivpu_device *vdev) 69762306a36Sopenharmony_ci{ 69862306a36Sopenharmony_ci struct ivpu_hw_info *hw = vdev->hw; 69962306a36Sopenharmony_ci u32 tile_disable; 70062306a36Sopenharmony_ci u32 fuse; 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_ci fuse = REGB_RD32(VPU_40XX_BUTTRESS_TILE_FUSE); 70362306a36Sopenharmony_ci if (!REG_TEST_FLD(VPU_40XX_BUTTRESS_TILE_FUSE, VALID, fuse)) { 70462306a36Sopenharmony_ci ivpu_err(vdev, "Fuse: invalid (0x%x)\n", fuse); 70562306a36Sopenharmony_ci return -EIO; 70662306a36Sopenharmony_ci } 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci tile_disable = REG_GET_FLD(VPU_40XX_BUTTRESS_TILE_FUSE, CONFIG, fuse); 70962306a36Sopenharmony_ci if (!ivpu_tile_disable_check(tile_disable)) { 71062306a36Sopenharmony_ci ivpu_err(vdev, "Fuse: Invalid tile disable config (0x%x)\n", tile_disable); 71162306a36Sopenharmony_ci return -EIO; 71262306a36Sopenharmony_ci } 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_ci if (tile_disable) 71562306a36Sopenharmony_ci ivpu_dbg(vdev, MISC, "Fuse: %d tiles enabled. Tile number %d disabled\n", 71662306a36Sopenharmony_ci TILE_MAX_NUM - 1, ffs(tile_disable) - 1); 71762306a36Sopenharmony_ci else 71862306a36Sopenharmony_ci ivpu_dbg(vdev, MISC, "Fuse: All %d tiles enabled\n", TILE_MAX_NUM); 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci hw->tile_fuse = tile_disable; 72162306a36Sopenharmony_ci hw->pll.profiling_freq = PLL_PROFILING_FREQ_DEFAULT; 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci ivpu_pll_init_frequency_ratios(vdev); 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci ivpu_hw_init_range(&vdev->hw->ranges.global, 0x80000000, SZ_512M); 72662306a36Sopenharmony_ci ivpu_hw_init_range(&vdev->hw->ranges.user, 0x80000000, SZ_256M); 72762306a36Sopenharmony_ci ivpu_hw_init_range(&vdev->hw->ranges.shave, 0x80000000 + SZ_256M, SZ_2G - SZ_256M); 72862306a36Sopenharmony_ci ivpu_hw_init_range(&vdev->hw->ranges.dma, 0x200000000, SZ_8G); 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_ci ivpu_hw_read_platform(vdev); 73162306a36Sopenharmony_ci ivpu_hw_wa_init(vdev); 73262306a36Sopenharmony_ci ivpu_hw_timeouts_init(vdev); 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci return 0; 73562306a36Sopenharmony_ci} 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_cistatic int ivpu_hw_40xx_reset(struct ivpu_device *vdev) 73862306a36Sopenharmony_ci{ 73962306a36Sopenharmony_ci int ret; 74062306a36Sopenharmony_ci u32 val; 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_ci ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_IP_RESET, TRIGGER, 0, TIMEOUT_US); 74362306a36Sopenharmony_ci if (ret) { 74462306a36Sopenharmony_ci ivpu_err(vdev, "Wait for *_TRIGGER timed out\n"); 74562306a36Sopenharmony_ci return ret; 74662306a36Sopenharmony_ci } 74762306a36Sopenharmony_ci 74862306a36Sopenharmony_ci val = REGB_RD32(VPU_40XX_BUTTRESS_IP_RESET); 74962306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_BUTTRESS_IP_RESET, TRIGGER, val); 75062306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_IP_RESET, val); 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_IP_RESET, TRIGGER, 0, TIMEOUT_US); 75362306a36Sopenharmony_ci if (ret) 75462306a36Sopenharmony_ci ivpu_err(vdev, "Timed out waiting for RESET completion\n"); 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci return ret; 75762306a36Sopenharmony_ci} 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_cistatic int ivpu_hw_40xx_d0i3_enable(struct ivpu_device *vdev) 76062306a36Sopenharmony_ci{ 76162306a36Sopenharmony_ci int ret; 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci if (IVPU_WA(punit_disabled)) 76462306a36Sopenharmony_ci return 0; 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci ret = ivpu_boot_d0i3_drive(vdev, true); 76762306a36Sopenharmony_ci if (ret) 76862306a36Sopenharmony_ci ivpu_err(vdev, "Failed to enable D0i3: %d\n", ret); 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci udelay(5); /* VPU requires 5 us to complete the transition */ 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci return ret; 77362306a36Sopenharmony_ci} 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_cistatic int ivpu_hw_40xx_d0i3_disable(struct ivpu_device *vdev) 77662306a36Sopenharmony_ci{ 77762306a36Sopenharmony_ci int ret; 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci if (IVPU_WA(punit_disabled)) 78062306a36Sopenharmony_ci return 0; 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci ret = ivpu_boot_d0i3_drive(vdev, false); 78362306a36Sopenharmony_ci if (ret) 78462306a36Sopenharmony_ci ivpu_err(vdev, "Failed to disable D0i3: %d\n", ret); 78562306a36Sopenharmony_ci 78662306a36Sopenharmony_ci return ret; 78762306a36Sopenharmony_ci} 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_cistatic void ivpu_hw_40xx_profiling_freq_reg_set(struct ivpu_device *vdev) 79062306a36Sopenharmony_ci{ 79162306a36Sopenharmony_ci u32 val = REGB_RD32(VPU_40XX_BUTTRESS_VPU_STATUS); 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_ci if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) 79462306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, PERF_CLK, val); 79562306a36Sopenharmony_ci else 79662306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, PERF_CLK, val); 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_VPU_STATUS, val); 79962306a36Sopenharmony_ci} 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_cistatic void ivpu_hw_40xx_ats_print(struct ivpu_device *vdev) 80262306a36Sopenharmony_ci{ 80362306a36Sopenharmony_ci ivpu_dbg(vdev, MISC, "Buttress ATS: %s\n", 80462306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_HM_ATS) ? "Enable" : "Disable"); 80562306a36Sopenharmony_ci} 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_cistatic void ivpu_hw_40xx_clock_relinquish_disable(struct ivpu_device *vdev) 80862306a36Sopenharmony_ci{ 80962306a36Sopenharmony_ci u32 val = REGB_RD32(VPU_40XX_BUTTRESS_VPU_STATUS); 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_ci val = REG_SET_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, DISABLE_CLK_RELINQUISH, val); 81262306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_VPU_STATUS, val); 81362306a36Sopenharmony_ci} 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_cistatic int ivpu_hw_40xx_power_up(struct ivpu_device *vdev) 81662306a36Sopenharmony_ci{ 81762306a36Sopenharmony_ci int ret; 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci ret = ivpu_hw_40xx_reset(vdev); 82062306a36Sopenharmony_ci if (ret) { 82162306a36Sopenharmony_ci ivpu_err(vdev, "Failed to reset HW: %d\n", ret); 82262306a36Sopenharmony_ci return ret; 82362306a36Sopenharmony_ci } 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci ret = ivpu_hw_40xx_d0i3_disable(vdev); 82662306a36Sopenharmony_ci if (ret) 82762306a36Sopenharmony_ci ivpu_warn(vdev, "Failed to disable D0I3: %d\n", ret); 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci ret = ivpu_pll_enable(vdev); 83062306a36Sopenharmony_ci if (ret) { 83162306a36Sopenharmony_ci ivpu_err(vdev, "Failed to enable PLL: %d\n", ret); 83262306a36Sopenharmony_ci return ret; 83362306a36Sopenharmony_ci } 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_ci if (IVPU_WA(disable_clock_relinquish)) 83662306a36Sopenharmony_ci ivpu_hw_40xx_clock_relinquish_disable(vdev); 83762306a36Sopenharmony_ci ivpu_hw_40xx_profiling_freq_reg_set(vdev); 83862306a36Sopenharmony_ci ivpu_hw_40xx_ats_print(vdev); 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci ret = ivpu_boot_host_ss_check(vdev); 84162306a36Sopenharmony_ci if (ret) { 84262306a36Sopenharmony_ci ivpu_err(vdev, "Failed to configure host SS: %d\n", ret); 84362306a36Sopenharmony_ci return ret; 84462306a36Sopenharmony_ci } 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci ivpu_boot_idle_gen_drive(vdev, false); 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci ret = ivpu_boot_pwr_domain_enable(vdev); 84962306a36Sopenharmony_ci if (ret) { 85062306a36Sopenharmony_ci ivpu_err(vdev, "Failed to enable power domain: %d\n", ret); 85162306a36Sopenharmony_ci return ret; 85262306a36Sopenharmony_ci } 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_ci ret = ivpu_boot_host_ss_axi_enable(vdev); 85562306a36Sopenharmony_ci if (ret) { 85662306a36Sopenharmony_ci ivpu_err(vdev, "Failed to enable AXI: %d\n", ret); 85762306a36Sopenharmony_ci return ret; 85862306a36Sopenharmony_ci } 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci ret = ivpu_boot_host_ss_top_noc_enable(vdev); 86162306a36Sopenharmony_ci if (ret) 86262306a36Sopenharmony_ci ivpu_err(vdev, "Failed to enable TOP NOC: %d\n", ret); 86362306a36Sopenharmony_ci 86462306a36Sopenharmony_ci return ret; 86562306a36Sopenharmony_ci} 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_cistatic int ivpu_hw_40xx_boot_fw(struct ivpu_device *vdev) 86862306a36Sopenharmony_ci{ 86962306a36Sopenharmony_ci int ret; 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_ci ivpu_boot_no_snoop_enable(vdev); 87262306a36Sopenharmony_ci ivpu_boot_tbu_mmu_enable(vdev); 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci ret = ivpu_boot_soc_cpu_boot(vdev); 87562306a36Sopenharmony_ci if (ret) 87662306a36Sopenharmony_ci ivpu_err(vdev, "Failed to boot SOC CPU: %d\n", ret); 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_ci return ret; 87962306a36Sopenharmony_ci} 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_cistatic bool ivpu_hw_40xx_is_idle(struct ivpu_device *vdev) 88262306a36Sopenharmony_ci{ 88362306a36Sopenharmony_ci u32 val; 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci if (IVPU_WA(punit_disabled)) 88662306a36Sopenharmony_ci return true; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_ci val = REGB_RD32(VPU_40XX_BUTTRESS_VPU_STATUS); 88962306a36Sopenharmony_ci return REG_TEST_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, READY, val) && 89062306a36Sopenharmony_ci REG_TEST_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, IDLE, val); 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_cistatic int ivpu_hw_40xx_power_down(struct ivpu_device *vdev) 89462306a36Sopenharmony_ci{ 89562306a36Sopenharmony_ci int ret = 0; 89662306a36Sopenharmony_ci 89762306a36Sopenharmony_ci if (!ivpu_hw_40xx_is_idle(vdev) && ivpu_hw_40xx_reset(vdev)) 89862306a36Sopenharmony_ci ivpu_warn(vdev, "Failed to reset the VPU\n"); 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci if (ivpu_pll_disable(vdev)) { 90162306a36Sopenharmony_ci ivpu_err(vdev, "Failed to disable PLL\n"); 90262306a36Sopenharmony_ci ret = -EIO; 90362306a36Sopenharmony_ci } 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci if (ivpu_hw_40xx_d0i3_enable(vdev)) { 90662306a36Sopenharmony_ci ivpu_err(vdev, "Failed to enter D0I3\n"); 90762306a36Sopenharmony_ci ret = -EIO; 90862306a36Sopenharmony_ci } 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_ci return ret; 91162306a36Sopenharmony_ci} 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_cistatic void ivpu_hw_40xx_wdt_disable(struct ivpu_device *vdev) 91462306a36Sopenharmony_ci{ 91562306a36Sopenharmony_ci u32 val; 91662306a36Sopenharmony_ci 91762306a36Sopenharmony_ci REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE); 91862306a36Sopenharmony_ci REGV_WR32(VPU_40XX_CPU_SS_TIM_WATCHDOG, TIM_WATCHDOG_RESET_VALUE); 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE); 92162306a36Sopenharmony_ci REGV_WR32(VPU_40XX_CPU_SS_TIM_WDOG_EN, 0); 92262306a36Sopenharmony_ci 92362306a36Sopenharmony_ci val = REGV_RD32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG); 92462306a36Sopenharmony_ci val = REG_CLR_FLD(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, WDOG_TO_INT_CLR, val); 92562306a36Sopenharmony_ci REGV_WR32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, val); 92662306a36Sopenharmony_ci} 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci/* Register indirect accesses */ 92962306a36Sopenharmony_cistatic u32 ivpu_hw_40xx_reg_pll_freq_get(struct ivpu_device *vdev) 93062306a36Sopenharmony_ci{ 93162306a36Sopenharmony_ci u32 pll_curr_ratio; 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_ci pll_curr_ratio = REGB_RD32(VPU_40XX_BUTTRESS_PLL_FREQ); 93462306a36Sopenharmony_ci pll_curr_ratio &= VPU_40XX_BUTTRESS_PLL_FREQ_RATIO_MASK; 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_ci return PLL_RATIO_TO_FREQ(pll_curr_ratio); 93762306a36Sopenharmony_ci} 93862306a36Sopenharmony_ci 93962306a36Sopenharmony_cistatic u32 ivpu_hw_40xx_reg_telemetry_offset_get(struct ivpu_device *vdev) 94062306a36Sopenharmony_ci{ 94162306a36Sopenharmony_ci return REGB_RD32(VPU_40XX_BUTTRESS_VPU_TELEMETRY_OFFSET); 94262306a36Sopenharmony_ci} 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_cistatic u32 ivpu_hw_40xx_reg_telemetry_size_get(struct ivpu_device *vdev) 94562306a36Sopenharmony_ci{ 94662306a36Sopenharmony_ci return REGB_RD32(VPU_40XX_BUTTRESS_VPU_TELEMETRY_SIZE); 94762306a36Sopenharmony_ci} 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_cistatic u32 ivpu_hw_40xx_reg_telemetry_enable_get(struct ivpu_device *vdev) 95062306a36Sopenharmony_ci{ 95162306a36Sopenharmony_ci return REGB_RD32(VPU_40XX_BUTTRESS_VPU_TELEMETRY_ENABLE); 95262306a36Sopenharmony_ci} 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_cistatic void ivpu_hw_40xx_reg_db_set(struct ivpu_device *vdev, u32 db_id) 95562306a36Sopenharmony_ci{ 95662306a36Sopenharmony_ci u32 reg_stride = VPU_40XX_CPU_SS_DOORBELL_1 - VPU_40XX_CPU_SS_DOORBELL_0; 95762306a36Sopenharmony_ci u32 val = REG_FLD(VPU_40XX_CPU_SS_DOORBELL_0, SET); 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_ci REGV_WR32I(VPU_40XX_CPU_SS_DOORBELL_0, reg_stride, db_id, val); 96062306a36Sopenharmony_ci} 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_cistatic u32 ivpu_hw_40xx_reg_ipc_rx_addr_get(struct ivpu_device *vdev) 96362306a36Sopenharmony_ci{ 96462306a36Sopenharmony_ci return REGV_RD32(VPU_40XX_HOST_SS_TIM_IPC_FIFO_ATM); 96562306a36Sopenharmony_ci} 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_cistatic u32 ivpu_hw_40xx_reg_ipc_rx_count_get(struct ivpu_device *vdev) 96862306a36Sopenharmony_ci{ 96962306a36Sopenharmony_ci u32 count = REGV_RD32_SILENT(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT); 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci return REG_GET_FLD(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT, FILL_LEVEL, count); 97262306a36Sopenharmony_ci} 97362306a36Sopenharmony_ci 97462306a36Sopenharmony_cistatic void ivpu_hw_40xx_reg_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr) 97562306a36Sopenharmony_ci{ 97662306a36Sopenharmony_ci REGV_WR32(VPU_40XX_CPU_SS_TIM_IPC_FIFO, vpu_addr); 97762306a36Sopenharmony_ci} 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_cistatic void ivpu_hw_40xx_irq_clear(struct ivpu_device *vdev) 98062306a36Sopenharmony_ci{ 98162306a36Sopenharmony_ci REGV_WR64(VPU_40XX_HOST_SS_ICB_CLEAR_0, ICB_0_1_IRQ_MASK); 98262306a36Sopenharmony_ci} 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_cistatic void ivpu_hw_40xx_irq_enable(struct ivpu_device *vdev) 98562306a36Sopenharmony_ci{ 98662306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, ITF_FIREWALL_VIOLATION_MASK); 98762306a36Sopenharmony_ci REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, ICB_0_1_IRQ_MASK); 98862306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_LOCAL_INT_MASK, BUTTRESS_IRQ_ENABLE_MASK); 98962306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x0); 99062306a36Sopenharmony_ci} 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_cistatic void ivpu_hw_40xx_irq_disable(struct ivpu_device *vdev) 99362306a36Sopenharmony_ci{ 99462306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x1); 99562306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_LOCAL_INT_MASK, BUTTRESS_IRQ_DISABLE_MASK); 99662306a36Sopenharmony_ci REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, 0x0ull); 99762306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, 0x0ul); 99862306a36Sopenharmony_ci} 99962306a36Sopenharmony_ci 100062306a36Sopenharmony_cistatic void ivpu_hw_40xx_irq_wdt_nce_handler(struct ivpu_device *vdev) 100162306a36Sopenharmony_ci{ 100262306a36Sopenharmony_ci /* TODO: For LNN hang consider engine reset instead of full recovery */ 100362306a36Sopenharmony_ci ivpu_pm_schedule_recovery(vdev); 100462306a36Sopenharmony_ci} 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_cistatic void ivpu_hw_40xx_irq_wdt_mss_handler(struct ivpu_device *vdev) 100762306a36Sopenharmony_ci{ 100862306a36Sopenharmony_ci ivpu_hw_wdt_disable(vdev); 100962306a36Sopenharmony_ci ivpu_pm_schedule_recovery(vdev); 101062306a36Sopenharmony_ci} 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_cistatic void ivpu_hw_40xx_irq_noc_firewall_handler(struct ivpu_device *vdev) 101362306a36Sopenharmony_ci{ 101462306a36Sopenharmony_ci ivpu_pm_schedule_recovery(vdev); 101562306a36Sopenharmony_ci} 101662306a36Sopenharmony_ci 101762306a36Sopenharmony_ci/* Handler for IRQs from VPU core (irqV) */ 101862306a36Sopenharmony_cistatic irqreturn_t ivpu_hw_40xx_irqv_handler(struct ivpu_device *vdev, int irq) 101962306a36Sopenharmony_ci{ 102062306a36Sopenharmony_ci u32 status = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK; 102162306a36Sopenharmony_ci irqreturn_t ret = IRQ_NONE; 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci if (!status) 102462306a36Sopenharmony_ci return IRQ_NONE; 102562306a36Sopenharmony_ci 102662306a36Sopenharmony_ci REGV_WR32(VPU_40XX_HOST_SS_ICB_CLEAR_0, status); 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT, status)) 102962306a36Sopenharmony_ci ivpu_mmu_irq_evtq_handler(vdev); 103062306a36Sopenharmony_ci 103162306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT, status)) 103262306a36Sopenharmony_ci ret |= ivpu_ipc_irq_handler(vdev); 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT, status)) 103562306a36Sopenharmony_ci ivpu_dbg(vdev, IRQ, "MMU sync complete\n"); 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT, status)) 103862306a36Sopenharmony_ci ivpu_mmu_irq_gerr_handler(vdev); 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, status)) 104162306a36Sopenharmony_ci ivpu_hw_40xx_irq_wdt_mss_handler(vdev); 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, status)) 104462306a36Sopenharmony_ci ivpu_hw_40xx_irq_wdt_nce_handler(vdev); 104562306a36Sopenharmony_ci 104662306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, status)) 104762306a36Sopenharmony_ci ivpu_hw_40xx_irq_noc_firewall_handler(vdev); 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_ci return ret; 105062306a36Sopenharmony_ci} 105162306a36Sopenharmony_ci 105262306a36Sopenharmony_ci/* Handler for IRQs from Buttress core (irqB) */ 105362306a36Sopenharmony_cistatic irqreturn_t ivpu_hw_40xx_irqb_handler(struct ivpu_device *vdev, int irq) 105462306a36Sopenharmony_ci{ 105562306a36Sopenharmony_ci bool schedule_recovery = false; 105662306a36Sopenharmony_ci u32 status = REGB_RD32(VPU_40XX_BUTTRESS_INTERRUPT_STAT) & BUTTRESS_IRQ_MASK; 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci if (status == 0) 105962306a36Sopenharmony_ci return IRQ_NONE; 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, FREQ_CHANGE, status)) 106262306a36Sopenharmony_ci ivpu_dbg(vdev, IRQ, "FREQ_CHANGE"); 106362306a36Sopenharmony_ci 106462306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR, status)) { 106562306a36Sopenharmony_ci ivpu_err(vdev, "ATS_ERR LOG1 0x%08x ATS_ERR_LOG2 0x%08x\n", 106662306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG1), 106762306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG2)); 106862306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_ATS_ERR_CLEAR, 0x1); 106962306a36Sopenharmony_ci schedule_recovery = true; 107062306a36Sopenharmony_ci } 107162306a36Sopenharmony_ci 107262306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI0_ERR, status)) { 107362306a36Sopenharmony_ci ivpu_err(vdev, "CFI0_ERR 0x%08x", REGB_RD32(VPU_40XX_BUTTRESS_CFI0_ERR_LOG)); 107462306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_CFI0_ERR_CLEAR, 0x1); 107562306a36Sopenharmony_ci schedule_recovery = true; 107662306a36Sopenharmony_ci } 107762306a36Sopenharmony_ci 107862306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI1_ERR, status)) { 107962306a36Sopenharmony_ci ivpu_err(vdev, "CFI1_ERR 0x%08x", REGB_RD32(VPU_40XX_BUTTRESS_CFI1_ERR_LOG)); 108062306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_CFI1_ERR_CLEAR, 0x1); 108162306a36Sopenharmony_ci schedule_recovery = true; 108262306a36Sopenharmony_ci } 108362306a36Sopenharmony_ci 108462306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR0_ERR, status)) { 108562306a36Sopenharmony_ci ivpu_err(vdev, "IMR_ERR_CFI0 LOW: 0x%08x HIGH: 0x%08x", 108662306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_LOW), 108762306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_HIGH)); 108862306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_CLEAR, 0x1); 108962306a36Sopenharmony_ci schedule_recovery = true; 109062306a36Sopenharmony_ci } 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR1_ERR, status)) { 109362306a36Sopenharmony_ci ivpu_err(vdev, "IMR_ERR_CFI1 LOW: 0x%08x HIGH: 0x%08x", 109462306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_LOW), 109562306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_HIGH)); 109662306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_CLEAR, 0x1); 109762306a36Sopenharmony_ci schedule_recovery = true; 109862306a36Sopenharmony_ci } 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, SURV_ERR, status)) { 110162306a36Sopenharmony_ci ivpu_err(vdev, "Survivability error detected\n"); 110262306a36Sopenharmony_ci schedule_recovery = true; 110362306a36Sopenharmony_ci } 110462306a36Sopenharmony_ci 110562306a36Sopenharmony_ci /* This must be done after interrupts are cleared at the source. */ 110662306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_INTERRUPT_STAT, status); 110762306a36Sopenharmony_ci 110862306a36Sopenharmony_ci if (schedule_recovery) 110962306a36Sopenharmony_ci ivpu_pm_schedule_recovery(vdev); 111062306a36Sopenharmony_ci 111162306a36Sopenharmony_ci return IRQ_HANDLED; 111262306a36Sopenharmony_ci} 111362306a36Sopenharmony_ci 111462306a36Sopenharmony_cistatic irqreturn_t ivpu_hw_40xx_irq_handler(int irq, void *ptr) 111562306a36Sopenharmony_ci{ 111662306a36Sopenharmony_ci struct ivpu_device *vdev = ptr; 111762306a36Sopenharmony_ci irqreturn_t ret = IRQ_NONE; 111862306a36Sopenharmony_ci 111962306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x1); 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_ci ret |= ivpu_hw_40xx_irqv_handler(vdev, irq); 112262306a36Sopenharmony_ci ret |= ivpu_hw_40xx_irqb_handler(vdev, irq); 112362306a36Sopenharmony_ci 112462306a36Sopenharmony_ci /* Re-enable global interrupts to re-trigger MSI for pending interrupts */ 112562306a36Sopenharmony_ci REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x0); 112662306a36Sopenharmony_ci 112762306a36Sopenharmony_ci if (ret & IRQ_WAKE_THREAD) 112862306a36Sopenharmony_ci return IRQ_WAKE_THREAD; 112962306a36Sopenharmony_ci 113062306a36Sopenharmony_ci return ret; 113162306a36Sopenharmony_ci} 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_cistatic void ivpu_hw_40xx_diagnose_failure(struct ivpu_device *vdev) 113462306a36Sopenharmony_ci{ 113562306a36Sopenharmony_ci u32 irqv = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK; 113662306a36Sopenharmony_ci u32 irqb = REGB_RD32(VPU_40XX_BUTTRESS_INTERRUPT_STAT) & BUTTRESS_IRQ_MASK; 113762306a36Sopenharmony_ci 113862306a36Sopenharmony_ci if (ivpu_hw_40xx_reg_ipc_rx_count_get(vdev)) 113962306a36Sopenharmony_ci ivpu_err(vdev, "IPC FIFO queue not empty, missed IPC IRQ"); 114062306a36Sopenharmony_ci 114162306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, irqv)) 114262306a36Sopenharmony_ci ivpu_err(vdev, "WDT MSS timeout detected\n"); 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, irqv)) 114562306a36Sopenharmony_ci ivpu_err(vdev, "WDT NCE timeout detected\n"); 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, irqv)) 114862306a36Sopenharmony_ci ivpu_err(vdev, "NOC Firewall irq detected\n"); 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR, irqb)) { 115162306a36Sopenharmony_ci ivpu_err(vdev, "ATS_ERR_LOG1 0x%08x ATS_ERR_LOG2 0x%08x\n", 115262306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG1), 115362306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG2)); 115462306a36Sopenharmony_ci } 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI0_ERR, irqb)) 115762306a36Sopenharmony_ci ivpu_err(vdev, "CFI0_ERR_LOG 0x%08x\n", REGB_RD32(VPU_40XX_BUTTRESS_CFI0_ERR_LOG)); 115862306a36Sopenharmony_ci 115962306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI1_ERR, irqb)) 116062306a36Sopenharmony_ci ivpu_err(vdev, "CFI1_ERR_LOG 0x%08x\n", REGB_RD32(VPU_40XX_BUTTRESS_CFI1_ERR_LOG)); 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR0_ERR, irqb)) 116362306a36Sopenharmony_ci ivpu_err(vdev, "IMR_ERR_CFI0 LOW: 0x%08x HIGH: 0x%08x\n", 116462306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_LOW), 116562306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_HIGH)); 116662306a36Sopenharmony_ci 116762306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR1_ERR, irqb)) 116862306a36Sopenharmony_ci ivpu_err(vdev, "IMR_ERR_CFI1 LOW: 0x%08x HIGH: 0x%08x\n", 116962306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_LOW), 117062306a36Sopenharmony_ci REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_HIGH)); 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, SURV_ERR, irqb)) 117362306a36Sopenharmony_ci ivpu_err(vdev, "Survivability error detected\n"); 117462306a36Sopenharmony_ci} 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ciconst struct ivpu_hw_ops ivpu_hw_40xx_ops = { 117762306a36Sopenharmony_ci .info_init = ivpu_hw_40xx_info_init, 117862306a36Sopenharmony_ci .power_up = ivpu_hw_40xx_power_up, 117962306a36Sopenharmony_ci .is_idle = ivpu_hw_40xx_is_idle, 118062306a36Sopenharmony_ci .power_down = ivpu_hw_40xx_power_down, 118162306a36Sopenharmony_ci .reset = ivpu_hw_40xx_reset, 118262306a36Sopenharmony_ci .boot_fw = ivpu_hw_40xx_boot_fw, 118362306a36Sopenharmony_ci .wdt_disable = ivpu_hw_40xx_wdt_disable, 118462306a36Sopenharmony_ci .diagnose_failure = ivpu_hw_40xx_diagnose_failure, 118562306a36Sopenharmony_ci .reg_pll_freq_get = ivpu_hw_40xx_reg_pll_freq_get, 118662306a36Sopenharmony_ci .reg_telemetry_offset_get = ivpu_hw_40xx_reg_telemetry_offset_get, 118762306a36Sopenharmony_ci .reg_telemetry_size_get = ivpu_hw_40xx_reg_telemetry_size_get, 118862306a36Sopenharmony_ci .reg_telemetry_enable_get = ivpu_hw_40xx_reg_telemetry_enable_get, 118962306a36Sopenharmony_ci .reg_db_set = ivpu_hw_40xx_reg_db_set, 119062306a36Sopenharmony_ci .reg_ipc_rx_addr_get = ivpu_hw_40xx_reg_ipc_rx_addr_get, 119162306a36Sopenharmony_ci .reg_ipc_rx_count_get = ivpu_hw_40xx_reg_ipc_rx_count_get, 119262306a36Sopenharmony_ci .reg_ipc_tx_set = ivpu_hw_40xx_reg_ipc_tx_set, 119362306a36Sopenharmony_ci .irq_clear = ivpu_hw_40xx_irq_clear, 119462306a36Sopenharmony_ci .irq_enable = ivpu_hw_40xx_irq_enable, 119562306a36Sopenharmony_ci .irq_disable = ivpu_hw_40xx_irq_disable, 119662306a36Sopenharmony_ci .irq_handler = ivpu_hw_40xx_irq_handler, 119762306a36Sopenharmony_ci}; 1198