1 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
2 /*
3 * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
5 */
6
7 #ifndef ATH12K_HIF_H
8 #define ATH12K_HIF_H
9
10 #include "core.h"
11
12 struct ath12k_hif_ops {
13 u32 (*read32)(struct ath12k_base *ab, u32 address);
14 void (*write32)(struct ath12k_base *ab, u32 address, u32 data);
15 void (*irq_enable)(struct ath12k_base *ab);
16 void (*irq_disable)(struct ath12k_base *ab);
17 int (*start)(struct ath12k_base *ab);
18 void (*stop)(struct ath12k_base *ab);
19 int (*power_up)(struct ath12k_base *ab);
20 void (*power_down)(struct ath12k_base *ab, bool is_suspend);
21 int (*suspend)(struct ath12k_base *ab);
22 int (*resume)(struct ath12k_base *ab);
23 int (*map_service_to_pipe)(struct ath12k_base *ab, u16 service_id,
24 u8 *ul_pipe, u8 *dl_pipe);
25 int (*get_user_msi_vector)(struct ath12k_base *ab, char *user_name,
26 int *num_vectors, u32 *user_base_data,
27 u32 *base_vector);
28 void (*get_msi_address)(struct ath12k_base *ab, u32 *msi_addr_lo,
29 u32 *msi_addr_hi);
30 void (*ce_irq_enable)(struct ath12k_base *ab);
31 void (*ce_irq_disable)(struct ath12k_base *ab);
32 void (*get_ce_msi_idx)(struct ath12k_base *ab, u32 ce_id, u32 *msi_idx);
33 int (*panic_handler)(struct ath12k_base *ab);
34 void (*coredump_download)(struct ath12k_base *ab);
35 };
36
ath12k_hif_map_service_to_pipe(struct ath12k_base * ab,u16 service_id,u8 * ul_pipe,u8 * dl_pipe)37 static inline int ath12k_hif_map_service_to_pipe(struct ath12k_base *ab, u16 service_id,
38 u8 *ul_pipe, u8 *dl_pipe)
39 {
40 return ab->hif.ops->map_service_to_pipe(ab, service_id,
41 ul_pipe, dl_pipe);
42 }
43
ath12k_hif_get_user_msi_vector(struct ath12k_base * ab,char * user_name,int * num_vectors,u32 * user_base_data,u32 * base_vector)44 static inline int ath12k_hif_get_user_msi_vector(struct ath12k_base *ab,
45 char *user_name,
46 int *num_vectors,
47 u32 *user_base_data,
48 u32 *base_vector)
49 {
50 if (!ab->hif.ops->get_user_msi_vector)
51 return -EOPNOTSUPP;
52
53 return ab->hif.ops->get_user_msi_vector(ab, user_name, num_vectors,
54 user_base_data,
55 base_vector);
56 }
57
ath12k_hif_get_msi_address(struct ath12k_base * ab,u32 * msi_addr_lo,u32 * msi_addr_hi)58 static inline void ath12k_hif_get_msi_address(struct ath12k_base *ab,
59 u32 *msi_addr_lo,
60 u32 *msi_addr_hi)
61 {
62 if (!ab->hif.ops->get_msi_address)
63 return;
64
65 ab->hif.ops->get_msi_address(ab, msi_addr_lo, msi_addr_hi);
66 }
67
ath12k_hif_get_ce_msi_idx(struct ath12k_base * ab,u32 ce_id,u32 * msi_data_idx)68 static inline void ath12k_hif_get_ce_msi_idx(struct ath12k_base *ab, u32 ce_id,
69 u32 *msi_data_idx)
70 {
71 if (ab->hif.ops->get_ce_msi_idx)
72 ab->hif.ops->get_ce_msi_idx(ab, ce_id, msi_data_idx);
73 else
74 *msi_data_idx = ce_id;
75 }
76
ath12k_hif_ce_irq_enable(struct ath12k_base * ab)77 static inline void ath12k_hif_ce_irq_enable(struct ath12k_base *ab)
78 {
79 if (ab->hif.ops->ce_irq_enable)
80 ab->hif.ops->ce_irq_enable(ab);
81 }
82
ath12k_hif_ce_irq_disable(struct ath12k_base * ab)83 static inline void ath12k_hif_ce_irq_disable(struct ath12k_base *ab)
84 {
85 if (ab->hif.ops->ce_irq_disable)
86 ab->hif.ops->ce_irq_disable(ab);
87 }
88
ath12k_hif_irq_enable(struct ath12k_base * ab)89 static inline void ath12k_hif_irq_enable(struct ath12k_base *ab)
90 {
91 ab->hif.ops->irq_enable(ab);
92 }
93
ath12k_hif_irq_disable(struct ath12k_base * ab)94 static inline void ath12k_hif_irq_disable(struct ath12k_base *ab)
95 {
96 ab->hif.ops->irq_disable(ab);
97 }
98
ath12k_hif_suspend(struct ath12k_base * ab)99 static inline int ath12k_hif_suspend(struct ath12k_base *ab)
100 {
101 if (ab->hif.ops->suspend)
102 return ab->hif.ops->suspend(ab);
103
104 return 0;
105 }
106
ath12k_hif_resume(struct ath12k_base * ab)107 static inline int ath12k_hif_resume(struct ath12k_base *ab)
108 {
109 if (ab->hif.ops->resume)
110 return ab->hif.ops->resume(ab);
111
112 return 0;
113 }
114
ath12k_hif_start(struct ath12k_base * ab)115 static inline int ath12k_hif_start(struct ath12k_base *ab)
116 {
117 return ab->hif.ops->start(ab);
118 }
119
ath12k_hif_stop(struct ath12k_base * ab)120 static inline void ath12k_hif_stop(struct ath12k_base *ab)
121 {
122 ab->hif.ops->stop(ab);
123 }
124
ath12k_hif_read32(struct ath12k_base * ab,u32 address)125 static inline u32 ath12k_hif_read32(struct ath12k_base *ab, u32 address)
126 {
127 return ab->hif.ops->read32(ab, address);
128 }
129
ath12k_hif_write32(struct ath12k_base * ab,u32 address,u32 data)130 static inline void ath12k_hif_write32(struct ath12k_base *ab, u32 address,
131 u32 data)
132 {
133 ab->hif.ops->write32(ab, address, data);
134 }
135
ath12k_hif_power_up(struct ath12k_base * ab)136 static inline int ath12k_hif_power_up(struct ath12k_base *ab)
137 {
138 if (!ab->hif.ops->power_up)
139 return -EOPNOTSUPP;
140
141 return ab->hif.ops->power_up(ab);
142 }
143
ath12k_hif_power_down(struct ath12k_base * ab,bool is_suspend)144 static inline void ath12k_hif_power_down(struct ath12k_base *ab, bool is_suspend)
145 {
146 if (!ab->hif.ops->power_down)
147 return;
148
149 ab->hif.ops->power_down(ab, is_suspend);
150 }
151
ath12k_hif_panic_handler(struct ath12k_base * ab)152 static inline int ath12k_hif_panic_handler(struct ath12k_base *ab)
153 {
154 if (!ab->hif.ops->panic_handler)
155 return NOTIFY_DONE;
156
157 return ab->hif.ops->panic_handler(ab);
158 }
159
ath12k_hif_coredump_download(struct ath12k_base * ab)160 static inline void ath12k_hif_coredump_download(struct ath12k_base *ab)
161 {
162 if (ab->hif.ops->coredump_download)
163 ab->hif.ops->coredump_download(ab);
164 }
165 #endif /* ATH12K_HIF_H */
166