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#ifndef __IVPU_HW_H__ 762306a36Sopenharmony_ci#define __IVPU_HW_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "ivpu_drv.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct ivpu_hw_ops { 1262306a36Sopenharmony_ci int (*info_init)(struct ivpu_device *vdev); 1362306a36Sopenharmony_ci int (*power_up)(struct ivpu_device *vdev); 1462306a36Sopenharmony_ci int (*boot_fw)(struct ivpu_device *vdev); 1562306a36Sopenharmony_ci int (*power_down)(struct ivpu_device *vdev); 1662306a36Sopenharmony_ci int (*reset)(struct ivpu_device *vdev); 1762306a36Sopenharmony_ci bool (*is_idle)(struct ivpu_device *vdev); 1862306a36Sopenharmony_ci void (*wdt_disable)(struct ivpu_device *vdev); 1962306a36Sopenharmony_ci void (*diagnose_failure)(struct ivpu_device *vdev); 2062306a36Sopenharmony_ci u32 (*reg_pll_freq_get)(struct ivpu_device *vdev); 2162306a36Sopenharmony_ci u32 (*reg_telemetry_offset_get)(struct ivpu_device *vdev); 2262306a36Sopenharmony_ci u32 (*reg_telemetry_size_get)(struct ivpu_device *vdev); 2362306a36Sopenharmony_ci u32 (*reg_telemetry_enable_get)(struct ivpu_device *vdev); 2462306a36Sopenharmony_ci void (*reg_db_set)(struct ivpu_device *vdev, u32 db_id); 2562306a36Sopenharmony_ci u32 (*reg_ipc_rx_addr_get)(struct ivpu_device *vdev); 2662306a36Sopenharmony_ci u32 (*reg_ipc_rx_count_get)(struct ivpu_device *vdev); 2762306a36Sopenharmony_ci void (*reg_ipc_tx_set)(struct ivpu_device *vdev, u32 vpu_addr); 2862306a36Sopenharmony_ci void (*irq_clear)(struct ivpu_device *vdev); 2962306a36Sopenharmony_ci void (*irq_enable)(struct ivpu_device *vdev); 3062306a36Sopenharmony_ci void (*irq_disable)(struct ivpu_device *vdev); 3162306a36Sopenharmony_ci irqreturn_t (*irq_handler)(int irq, void *ptr); 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct ivpu_addr_range { 3562306a36Sopenharmony_ci resource_size_t start; 3662306a36Sopenharmony_ci resource_size_t end; 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct ivpu_hw_info { 4062306a36Sopenharmony_ci const struct ivpu_hw_ops *ops; 4162306a36Sopenharmony_ci struct { 4262306a36Sopenharmony_ci struct ivpu_addr_range global; 4362306a36Sopenharmony_ci struct ivpu_addr_range user; 4462306a36Sopenharmony_ci struct ivpu_addr_range shave; 4562306a36Sopenharmony_ci struct ivpu_addr_range dma; 4662306a36Sopenharmony_ci } ranges; 4762306a36Sopenharmony_ci struct { 4862306a36Sopenharmony_ci u8 min_ratio; 4962306a36Sopenharmony_ci u8 max_ratio; 5062306a36Sopenharmony_ci /* 5162306a36Sopenharmony_ci * Pll ratio for the efficiency frequency. The VPU has optimum 5262306a36Sopenharmony_ci * performance to power ratio at this frequency. 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_ci u8 pn_ratio; 5562306a36Sopenharmony_ci u32 profiling_freq; 5662306a36Sopenharmony_ci } pll; 5762306a36Sopenharmony_ci u32 tile_fuse; 5862306a36Sopenharmony_ci u32 sku; 5962306a36Sopenharmony_ci u16 config; 6062306a36Sopenharmony_ci int dma_bits; 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciextern const struct ivpu_hw_ops ivpu_hw_37xx_ops; 6462306a36Sopenharmony_ciextern const struct ivpu_hw_ops ivpu_hw_40xx_ops; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic inline int ivpu_hw_info_init(struct ivpu_device *vdev) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci return vdev->hw->ops->info_init(vdev); 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic inline int ivpu_hw_power_up(struct ivpu_device *vdev) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci ivpu_dbg(vdev, PM, "HW power up\n"); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci return vdev->hw->ops->power_up(vdev); 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic inline int ivpu_hw_boot_fw(struct ivpu_device *vdev) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci return vdev->hw->ops->boot_fw(vdev); 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic inline bool ivpu_hw_is_idle(struct ivpu_device *vdev) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci return vdev->hw->ops->is_idle(vdev); 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic inline int ivpu_hw_power_down(struct ivpu_device *vdev) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci ivpu_dbg(vdev, PM, "HW power down\n"); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci return vdev->hw->ops->power_down(vdev); 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic inline int ivpu_hw_reset(struct ivpu_device *vdev) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci ivpu_dbg(vdev, PM, "HW reset\n"); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci return vdev->hw->ops->reset(vdev); 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistatic inline void ivpu_hw_wdt_disable(struct ivpu_device *vdev) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci vdev->hw->ops->wdt_disable(vdev); 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* Register indirect accesses */ 10862306a36Sopenharmony_cistatic inline u32 ivpu_hw_reg_pll_freq_get(struct ivpu_device *vdev) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci return vdev->hw->ops->reg_pll_freq_get(vdev); 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistatic inline u32 ivpu_hw_reg_telemetry_offset_get(struct ivpu_device *vdev) 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci return vdev->hw->ops->reg_telemetry_offset_get(vdev); 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic inline u32 ivpu_hw_reg_telemetry_size_get(struct ivpu_device *vdev) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci return vdev->hw->ops->reg_telemetry_size_get(vdev); 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistatic inline u32 ivpu_hw_reg_telemetry_enable_get(struct ivpu_device *vdev) 12462306a36Sopenharmony_ci{ 12562306a36Sopenharmony_ci return vdev->hw->ops->reg_telemetry_enable_get(vdev); 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic inline void ivpu_hw_reg_db_set(struct ivpu_device *vdev, u32 db_id) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci vdev->hw->ops->reg_db_set(vdev, db_id); 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic inline u32 ivpu_hw_reg_ipc_rx_addr_get(struct ivpu_device *vdev) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci return vdev->hw->ops->reg_ipc_rx_addr_get(vdev); 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cistatic inline u32 ivpu_hw_reg_ipc_rx_count_get(struct ivpu_device *vdev) 13962306a36Sopenharmony_ci{ 14062306a36Sopenharmony_ci return vdev->hw->ops->reg_ipc_rx_count_get(vdev); 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic inline void ivpu_hw_reg_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr) 14462306a36Sopenharmony_ci{ 14562306a36Sopenharmony_ci vdev->hw->ops->reg_ipc_tx_set(vdev, vpu_addr); 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic inline void ivpu_hw_irq_clear(struct ivpu_device *vdev) 14962306a36Sopenharmony_ci{ 15062306a36Sopenharmony_ci vdev->hw->ops->irq_clear(vdev); 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistatic inline void ivpu_hw_irq_enable(struct ivpu_device *vdev) 15462306a36Sopenharmony_ci{ 15562306a36Sopenharmony_ci vdev->hw->ops->irq_enable(vdev); 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistatic inline void ivpu_hw_irq_disable(struct ivpu_device *vdev) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci vdev->hw->ops->irq_disable(vdev); 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic inline void ivpu_hw_init_range(struct ivpu_addr_range *range, u64 start, u64 size) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci range->start = start; 16662306a36Sopenharmony_ci range->end = start + size; 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic inline u64 ivpu_hw_range_size(const struct ivpu_addr_range *range) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci return range->end - range->start; 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic inline void ivpu_hw_diagnose_failure(struct ivpu_device *vdev) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci vdev->hw->ops->diagnose_failure(vdev); 17762306a36Sopenharmony_ci} 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci#endif /* __IVPU_HW_H__ */ 180