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
51enum 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
62struct 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
73struct knav_reg_region {
74	u32		base;
75	u32		start_index;
76	u32		size_count;
77	u32		__pad;
78};
79
80struct knav_reg_pdsp_regs {
81	u32		control;
82	u32		status;
83	u32		cycle_count;
84	u32		stall_count;
85};
86
87struct 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
95struct knav_link_ram_block {
96	dma_addr_t	 dma;
97	void		*virt;
98	size_t		 size;
99};
100
101struct 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
112struct 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
122struct 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
138struct 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 */
158struct 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 */
173struct 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 */
193struct 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 */
220struct 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 */
250struct 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 */
277struct 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
289enum qmss_version {
290	QMSS,
291	QMSS_66AK2G,
292};
293
294struct 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
310struct 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
323struct knav_irq_info {
324	int		irq;
325	struct cpumask	*cpu_mask;
326};
327
328struct 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
371static inline struct knav_pdsp_info *
372knav_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
382extern int knav_init_acc_range(struct knav_device *kdev,
383					struct device_node *node,
384					struct knav_range_info *range);
385extern void knav_queue_notify(struct knav_queue_inst *inst);
386
387#endif /* __KNAV_QMSS_H__ */
388