This source file includes following definitions.
- knav_find_pdsp
1
2
3
4
5
6
7
8
9
10
11 #ifndef __KNAV_QMSS_H__
12 #define __KNAV_QMSS_H__
13
14 #include <linux/percpu.h>
15
16 #define THRESH_GTE BIT(7)
17 #define THRESH_LT 0
18
19 #define PDSP_CTRL_PC_MASK 0xffff0000
20 #define PDSP_CTRL_SOFT_RESET BIT(0)
21 #define PDSP_CTRL_ENABLE BIT(1)
22 #define PDSP_CTRL_RUNNING BIT(15)
23
24 #define ACC_MAX_CHANNEL 48
25 #define ACC_DEFAULT_PERIOD 25
26
27 #define ACC_CHANNEL_INT_BASE 2
28
29 #define ACC_LIST_ENTRY_TYPE 1
30 #define ACC_LIST_ENTRY_WORDS (1 << ACC_LIST_ENTRY_TYPE)
31 #define ACC_LIST_ENTRY_QUEUE_IDX 0
32 #define ACC_LIST_ENTRY_DESC_IDX (ACC_LIST_ENTRY_WORDS - 1)
33
34 #define ACC_CMD_DISABLE_CHANNEL 0x80
35 #define ACC_CMD_ENABLE_CHANNEL 0x81
36 #define ACC_CFG_MULTI_QUEUE BIT(21)
37
38 #define ACC_INTD_OFFSET_EOI (0x0010)
39 #define ACC_INTD_OFFSET_COUNT(ch) (0x0300 + 4 * (ch))
40 #define ACC_INTD_OFFSET_STATUS(ch) (0x0200 + 4 * ((ch) / 32))
41
42 #define RANGE_MAX_IRQS 64
43
44 #define ACC_DESCS_MAX SZ_1K
45 #define ACC_DESCS_MASK (ACC_DESCS_MAX - 1)
46 #define DESC_SIZE_MASK 0xful
47 #define DESC_PTR_MASK (~DESC_SIZE_MASK)
48
49 #define KNAV_NAME_SIZE 32
50
51 enum knav_acc_result {
52 ACC_RET_IDLE,
53 ACC_RET_SUCCESS,
54 ACC_RET_INVALID_COMMAND,
55 ACC_RET_INVALID_CHANNEL,
56 ACC_RET_INACTIVE_CHANNEL,
57 ACC_RET_ACTIVE_CHANNEL,
58 ACC_RET_INVALID_QUEUE,
59 ACC_RET_INVALID_RET,
60 };
61
62 struct knav_reg_config {
63 u32 revision;
64 u32 __pad1;
65 u32 divert;
66 u32 link_ram_base0;
67 u32 link_ram_size0;
68 u32 link_ram_base1;
69 u32 __pad2[2];
70 u32 starvation[0];
71 };
72
73 struct knav_reg_region {
74 u32 base;
75 u32 start_index;
76 u32 size_count;
77 u32 __pad;
78 };
79
80 struct knav_reg_pdsp_regs {
81 u32 control;
82 u32 status;
83 u32 cycle_count;
84 u32 stall_count;
85 };
86
87 struct knav_reg_acc_command {
88 u32 command;
89 u32 queue_mask;
90 u32 list_dma;
91 u32 queue_num;
92 u32 timer_config;
93 };
94
95 struct knav_link_ram_block {
96 dma_addr_t dma;
97 void *virt;
98 size_t size;
99 };
100
101 struct knav_acc_info {
102 u32 pdsp_id;
103 u32 start_channel;
104 u32 list_entries;
105 u32 pacing_mode;
106 u32 timer_count;
107 int mem_size;
108 int list_size;
109 struct knav_pdsp_info *pdsp;
110 };
111
112 struct knav_acc_channel {
113 u32 channel;
114 u32 list_index;
115 u32 open_mask;
116 u32 *list_cpu[2];
117 dma_addr_t list_dma[2];
118 char name[KNAV_NAME_SIZE];
119 atomic_t retrigger_count;
120 };
121
122 struct knav_pdsp_info {
123 const char *name;
124 struct knav_reg_pdsp_regs __iomem *regs;
125 union {
126 void __iomem *command;
127 struct knav_reg_acc_command __iomem *acc_command;
128 u32 __iomem *qos_command;
129 };
130 void __iomem *intd;
131 u32 __iomem *iram;
132 u32 id;
133 struct list_head list;
134 bool loaded;
135 bool started;
136 };
137
138 struct knav_qmgr_info {
139 unsigned start_queue;
140 unsigned num_queues;
141 struct knav_reg_config __iomem *reg_config;
142 struct knav_reg_region __iomem *reg_region;
143 struct knav_reg_queue __iomem *reg_push, *reg_pop, *reg_peek;
144 void __iomem *reg_status;
145 struct list_head list;
146 };
147
148 #define KNAV_NUM_LINKRAM 2
149
150
151
152
153
154
155
156
157
158 struct knav_queue_stats {
159 unsigned int pushes;
160 unsigned int pops;
161 unsigned int push_errors;
162 unsigned int pop_errors;
163 unsigned int notifies;
164 };
165
166
167
168
169
170
171
172
173 struct knav_reg_queue {
174 u32 entry_count;
175 u32 byte_count;
176 u32 packet_size;
177 u32 ptr_size_thresh;
178 };
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193 struct knav_region {
194 dma_addr_t dma_start, dma_end;
195 void *virt_start, *virt_end;
196 unsigned desc_size;
197 unsigned used_desc;
198 unsigned id;
199 unsigned num_desc;
200 unsigned link_index;
201 const char *name;
202 struct list_head list;
203 struct list_head pools;
204 };
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220 struct knav_pool {
221 struct device *dev;
222 struct knav_region *region;
223 struct knav_queue *queue;
224 struct knav_device *kdev;
225 int region_offset;
226 int num_desc;
227 int desc_size;
228 int region_id;
229 const char *name;
230 struct list_head list;
231 struct list_head region_inst;
232 };
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250 struct knav_queue_inst {
251 u32 *descs;
252 atomic_t desc_head, desc_tail, desc_count;
253 struct knav_acc_channel *acc;
254 struct knav_device *kdev;
255 struct knav_range_info *range;
256 struct knav_qmgr_info *qmgr;
257 u32 id;
258 int irq_num;
259 int notify_needed;
260 atomic_t num_notifiers;
261 struct list_head handles;
262 const char *name;
263 const char *irq_name;
264 };
265
266
267
268
269
270
271
272
273
274
275
276
277 struct knav_queue {
278 struct knav_reg_queue __iomem *reg_push, *reg_pop, *reg_peek;
279 struct knav_queue_inst *inst;
280 struct knav_queue_stats __percpu *stats;
281 knav_queue_notify_fn notifier_fn;
282 void *notifier_fn_arg;
283 atomic_t notifier_enabled;
284 struct rcu_head rcu;
285 unsigned flags;
286 struct list_head list;
287 };
288
289 enum qmss_version {
290 QMSS,
291 QMSS_66AK2G,
292 };
293
294 struct knav_device {
295 struct device *dev;
296 unsigned base_id;
297 unsigned num_queues;
298 unsigned num_queues_in_use;
299 unsigned inst_shift;
300 struct knav_link_ram_block link_rams[KNAV_NUM_LINKRAM];
301 void *instances;
302 struct list_head regions;
303 struct list_head queue_ranges;
304 struct list_head pools;
305 struct list_head pdsps;
306 struct list_head qmgrs;
307 enum qmss_version version;
308 };
309
310 struct knav_range_ops {
311 int (*init_range)(struct knav_range_info *range);
312 int (*free_range)(struct knav_range_info *range);
313 int (*init_queue)(struct knav_range_info *range,
314 struct knav_queue_inst *inst);
315 int (*open_queue)(struct knav_range_info *range,
316 struct knav_queue_inst *inst, unsigned flags);
317 int (*close_queue)(struct knav_range_info *range,
318 struct knav_queue_inst *inst);
319 int (*set_notify)(struct knav_range_info *range,
320 struct knav_queue_inst *inst, bool enabled);
321 };
322
323 struct knav_irq_info {
324 int irq;
325 struct cpumask *cpu_mask;
326 };
327
328 struct knav_range_info {
329 const char *name;
330 struct knav_device *kdev;
331 unsigned queue_base;
332 unsigned num_queues;
333 void *queue_base_inst;
334 unsigned flags;
335 struct list_head list;
336 struct knav_range_ops *ops;
337 struct knav_acc_info acc_info;
338 struct knav_acc_channel *acc;
339 unsigned num_irqs;
340 struct knav_irq_info irqs[RANGE_MAX_IRQS];
341 };
342
343 #define RANGE_RESERVED BIT(0)
344 #define RANGE_HAS_IRQ BIT(1)
345 #define RANGE_HAS_ACCUMULATOR BIT(2)
346 #define RANGE_MULTI_QUEUE BIT(3)
347
348 #define for_each_region(kdev, region) \
349 list_for_each_entry(region, &kdev->regions, list)
350
351 #define first_region(kdev) \
352 list_first_entry_or_null(&kdev->regions, \
353 struct knav_region, list)
354
355 #define for_each_queue_range(kdev, range) \
356 list_for_each_entry(range, &kdev->queue_ranges, list)
357
358 #define first_queue_range(kdev) \
359 list_first_entry_or_null(&kdev->queue_ranges, \
360 struct knav_range_info, list)
361
362 #define for_each_pool(kdev, pool) \
363 list_for_each_entry(pool, &kdev->pools, list)
364
365 #define for_each_pdsp(kdev, pdsp) \
366 list_for_each_entry(pdsp, &kdev->pdsps, list)
367
368 #define for_each_qmgr(kdev, qmgr) \
369 list_for_each_entry(qmgr, &kdev->qmgrs, list)
370
371 static inline struct knav_pdsp_info *
372 knav_find_pdsp(struct knav_device *kdev, unsigned pdsp_id)
373 {
374 struct knav_pdsp_info *pdsp;
375
376 for_each_pdsp(kdev, pdsp)
377 if (pdsp_id == pdsp->id)
378 return pdsp;
379 return NULL;
380 }
381
382 extern int knav_init_acc_range(struct knav_device *kdev,
383 struct device_node *node,
384 struct knav_range_info *range);
385 extern void knav_queue_notify(struct knav_queue_inst *inst);
386
387 #endif