xref: /linux/drivers/soc/ti/knav_qmss.h (revision a36e9f5cfe9eb3a1dce8769c7058251c42705357)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Keystone Navigator QMSS driver internal header
4  *
5  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
6  * Author:	Sandeep Nair <sandeep_n@ti.com>
7  *		Cyril Chemparathy <cyril@ti.com>
8  *		Santosh Shilimkar <santosh.shilimkar@ti.com>
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 /* usecs */
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[];
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  * struct knav_queue_stats:	queue statistics
152  * pushes:			number of push operations
153  * pops:			number of pop operations
154  * push_errors:			number of push errors
155  * pop_errors:			number of pop errors
156  * notifies:			notifier counts
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  * struct knav_reg_queue:	queue registers
168  * @entry_count:		valid entries in the queue
169  * @byte_count:			total byte count in thhe queue
170  * @packet_size:		packet size for the queue
171  * @ptr_size_thresh:		packet pointer size threshold
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  * struct knav_region:		qmss region info
182  * @dma_start, dma_end:		start and end dma address
183  * @virt_start, virt_end:	start and end virtual address
184  * @desc_size:			descriptor size
185  * @used_desc:			consumed descriptors
186  * @id:				region number
187  * @num_desc:			total descriptors
188  * @link_index:			index of the first descriptor
189  * @name:			region name
190  * @list:			instance in the device's region list
191  * @pools:			list of descriptor pools in the region
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  * struct knav_pool:		qmss pools
208  * @dev:			device pointer
209  * @region:			qmss region info
210  * @queue:			queue registers
211  * @kdev:			qmss device pointer
212  * @region_offset:		offset from the base
213  * @num_desc:			total descriptors
214  * @desc_size:			descriptor size
215  * @region_id:			region number
216  * @name:			pool name
217  * @list:			list head
218  * @region_inst:		instance in the region's pool list
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  * struct knav_queue_inst:		qmss queue instance properties
236  * @descs:				descriptor pointer
237  * @desc_head, desc_tail, desc_count:	descriptor counters
238  * @acc:				accumulator channel pointer
239  * @kdev:				qmss device pointer
240  * @range:				range info
241  * @qmgr:				queue manager info
242  * @id:					queue instance id
243  * @irq_num:				irq line number
244  * @notify_needed:			notifier needed based on queue type
245  * @num_notifiers:			total notifiers
246  * @handles:				list head
247  * @name:				queue instance name
248  * @irq_name:				irq line name
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  * struct knav_queue:			qmss queue properties
268  * @reg_push, reg_pop, reg_peek:	push, pop queue registers
269  * @inst:				qmss queue instance properties
270  * @notifier_fn:			notifier function
271  * @notifier_fn_arg:			notifier function argument
272  * @notifier_enabled:			notier enabled for a give queue
273  * @rcu:				rcu head
274  * @flags:				queue flags
275  * @list:				list head
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 	const 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 /* __KNAV_QMSS_H__ */
388