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