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