Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2020-2025 Intel Corporation
4 */
5
6#ifndef __IVPU_HW_H__
7#define __IVPU_HW_H__
8
9#include "ivpu_drv.h"
10#include "ivpu_hw_btrs.h"
11#include "ivpu_hw_ip.h"
12
13struct ivpu_addr_range {
14 resource_size_t start;
15 resource_size_t end;
16};
17
18struct ivpu_hw_info {
19 struct {
20 bool (*btrs_irq_handler)(struct ivpu_device *vdev, int irq);
21 bool (*ip_irq_handler)(struct ivpu_device *vdev, int irq);
22 } irq;
23 struct {
24 struct ivpu_addr_range runtime;
25 struct ivpu_addr_range global;
26 struct ivpu_addr_range user;
27 struct ivpu_addr_range shave;
28 struct ivpu_addr_range dma;
29 } ranges;
30 struct {
31 u8 min_ratio;
32 u8 max_ratio;
33 /*
34 * Pll ratio for the efficiency frequency. The VPU has optimum
35 * performance to power ratio at this frequency.
36 */
37 u8 pn_ratio;
38 u32 profiling_freq;
39 } pll;
40 struct {
41 u32 grace_period[VPU_HWS_NUM_PRIORITY_BANDS];
42 u32 process_quantum[VPU_HWS_NUM_PRIORITY_BANDS];
43 u32 process_grace_period[VPU_HWS_NUM_PRIORITY_BANDS];
44 } hws;
45 u32 tile_fuse;
46 u32 sku;
47 u16 config;
48 int dma_bits;
49 ktime_t d0i3_entry_host_ts;
50 u64 d0i3_entry_vpu_ts;
51 atomic_t firewall_irq_counter;
52};
53
54int ivpu_hw_init(struct ivpu_device *vdev);
55int ivpu_hw_range_init(struct ivpu_device *vdev, struct ivpu_addr_range *range, u64 start,
56 u64 size);
57int ivpu_hw_power_up(struct ivpu_device *vdev);
58int ivpu_hw_power_down(struct ivpu_device *vdev);
59int ivpu_hw_reset(struct ivpu_device *vdev);
60int ivpu_hw_boot_fw(struct ivpu_device *vdev);
61void ivpu_hw_profiling_freq_drive(struct ivpu_device *vdev, bool enable);
62void ivpu_irq_handlers_init(struct ivpu_device *vdev);
63void ivpu_hw_irq_enable(struct ivpu_device *vdev);
64void ivpu_hw_irq_disable(struct ivpu_device *vdev);
65irqreturn_t ivpu_hw_irq_handler(int irq, void *ptr);
66bool ivpu_hw_uses_ecc_mca_signal(struct ivpu_device *vdev);
67
68static inline u32 ivpu_hw_btrs_irq_handler(struct ivpu_device *vdev, int irq)
69{
70 return vdev->hw->irq.btrs_irq_handler(vdev, irq);
71}
72
73static inline u32 ivpu_hw_ip_irq_handler(struct ivpu_device *vdev, int irq)
74{
75 return vdev->hw->irq.ip_irq_handler(vdev, irq);
76}
77
78static inline u64 ivpu_hw_range_size(const struct ivpu_addr_range *range)
79{
80 return range->end - range->start;
81}
82
83static inline u32 ivpu_hw_dpu_max_freq_get(struct ivpu_device *vdev)
84{
85 return ivpu_hw_btrs_dpu_max_freq_get(vdev);
86}
87
88static inline u32 ivpu_hw_dpu_freq_get(struct ivpu_device *vdev)
89{
90 return ivpu_hw_btrs_dpu_freq_get(vdev);
91}
92
93static inline void ivpu_hw_irq_clear(struct ivpu_device *vdev)
94{
95 ivpu_hw_ip_irq_clear(vdev);
96}
97
98static inline u32 ivpu_hw_profiling_freq_get(struct ivpu_device *vdev)
99{
100 return vdev->hw->pll.profiling_freq;
101}
102
103static inline void ivpu_hw_diagnose_failure(struct ivpu_device *vdev)
104{
105 ivpu_hw_ip_diagnose_failure(vdev);
106 ivpu_hw_btrs_diagnose_failure(vdev);
107}
108
109static inline u32 ivpu_hw_telemetry_offset_get(struct ivpu_device *vdev)
110{
111 return ivpu_hw_btrs_telemetry_offset_get(vdev);
112}
113
114static inline u32 ivpu_hw_telemetry_size_get(struct ivpu_device *vdev)
115{
116 return ivpu_hw_btrs_telemetry_size_get(vdev);
117}
118
119static inline u32 ivpu_hw_telemetry_enable_get(struct ivpu_device *vdev)
120{
121 return ivpu_hw_btrs_telemetry_enable_get(vdev);
122}
123
124static inline bool ivpu_hw_is_idle(struct ivpu_device *vdev)
125{
126 return ivpu_hw_btrs_is_idle(vdev);
127}
128
129static inline int ivpu_hw_wait_for_idle(struct ivpu_device *vdev)
130{
131 return ivpu_hw_btrs_wait_for_idle(vdev);
132}
133
134static inline void ivpu_hw_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
135{
136 ivpu_hw_ip_ipc_tx_set(vdev, vpu_addr);
137}
138
139static inline void ivpu_hw_db_set(struct ivpu_device *vdev, u32 db_id)
140{
141 ivpu_hw_ip_db_set(vdev, db_id);
142}
143
144static inline u32 ivpu_hw_ipc_rx_addr_get(struct ivpu_device *vdev)
145{
146 return ivpu_hw_ip_ipc_rx_addr_get(vdev);
147}
148
149static inline u32 ivpu_hw_ipc_rx_count_get(struct ivpu_device *vdev)
150{
151 return ivpu_hw_ip_ipc_rx_count_get(vdev);
152}
153
154#endif /* __IVPU_HW_H__ */