1/*
2 * Keystone Navigator Queue Management Sub-System 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 as
11 * published by the Free Software Foundation version 2.
12 *
13 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
14 * kind, whether express or implied; without even the implied warranty
15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 */
18
19#ifndef __SOC_TI_KNAV_QMSS_H__
20#define __SOC_TI_KNAV_QMSS_H__
21
22#include <linux/err.h>
23#include <linux/time.h>
24#include <linux/atomic.h>
25#include <linux/device.h>
26#include <linux/fcntl.h>
27#include <linux/dma-mapping.h>
28
29/* queue types */
30#define KNAV_QUEUE_QPEND	((unsigned)-2) /* interruptible qpend queue */
31#define KNAV_QUEUE_ACC		((unsigned)-3) /* Accumulated queue */
32#define KNAV_QUEUE_GP		((unsigned)-4) /* General purpose queue */
33
34/* queue flags */
35#define KNAV_QUEUE_SHARED	0x0001		/* Queue can be shared */
36
37/**
38 * enum knav_queue_ctrl_cmd -	queue operations.
39 * @KNAV_QUEUE_GET_ID:		Get the ID number for an open queue
40 * @KNAV_QUEUE_FLUSH:		forcibly empty a queue if possible
41 * @KNAV_QUEUE_SET_NOTIFIER:	Set a notifier callback to a queue handle.
42 * @KNAV_QUEUE_ENABLE_NOTIFY:	Enable notifier callback for a queue handle.
43 * @KNAV_QUEUE_DISABLE_NOTIFY:	Disable notifier callback for a queue handle.
44 * @KNAV_QUEUE_GET_COUNT:	Get number of queues.
45 */
46enum knav_queue_ctrl_cmd {
47	KNAV_QUEUE_GET_ID,
48	KNAV_QUEUE_FLUSH,
49	KNAV_QUEUE_SET_NOTIFIER,
50	KNAV_QUEUE_ENABLE_NOTIFY,
51	KNAV_QUEUE_DISABLE_NOTIFY,
52	KNAV_QUEUE_GET_COUNT
53};
54
55/* Queue notifier callback prototype */
56typedef void (*knav_queue_notify_fn)(void *arg);
57
58/**
59 * struct knav_queue_notify_config:	Notifier configuration
60 * @fn:					Notifier function
61 * @fn_arg:				Notifier function arguments
62 */
63struct knav_queue_notify_config {
64	knav_queue_notify_fn fn;
65	void *fn_arg;
66};
67
68void *knav_queue_open(const char *name, unsigned id,
69					unsigned flags);
70void knav_queue_close(void *qhandle);
71int knav_queue_device_control(void *qhandle,
72				enum knav_queue_ctrl_cmd cmd,
73				unsigned long arg);
74dma_addr_t knav_queue_pop(void *qhandle, unsigned *size);
75int knav_queue_push(void *qhandle, dma_addr_t dma,
76				unsigned size, unsigned flags);
77
78void *knav_pool_create(const char *name,
79				int num_desc, int region_id);
80void knav_pool_destroy(void *ph);
81int knav_pool_count(void *ph);
82void *knav_pool_desc_get(void *ph);
83void knav_pool_desc_put(void *ph, void *desc);
84int knav_pool_desc_map(void *ph, void *desc, unsigned size,
85					dma_addr_t *dma, unsigned *dma_sz);
86void *knav_pool_desc_unmap(void *ph, dma_addr_t dma, unsigned dma_sz);
87dma_addr_t knav_pool_desc_virt_to_dma(void *ph, void *virt);
88void *knav_pool_desc_dma_to_virt(void *ph, dma_addr_t dma);
89
90#endif /* __SOC_TI_KNAV_QMSS_H__ */
91