staging: nvshm: create new communication channel for RPC
[linux-3.10.git] / drivers / staging / nvshm / nvshm_priv.h
1 /*
2  * Copyright (C) 2012-2013 NVIDIA Corporation.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  */
14
15 #ifndef _NVSHM_PRIV_H
16 #define _NVSHM_PRIV_H
17
18 #include <linux/spinlock.h>
19 #include <linux/platform_device.h>
20 #include <linux/hrtimer.h>
21 #include <linux/module.h>
22 #include <linux/mm.h>
23 #include <linux/wakelock.h>
24 #include <asm/memory.h>
25 #include <asm/cacheflush.h>
26 #include <asm/outercache.h>
27 /*
28  * Test stub is used to implement nvshm on private memory for testing purpose.
29  * Data are allocated into this private memory but queues loop on themselves
30  */
31 #define NVSHM_TEST_STUB
32
33 /* Generate NVSHM_IPC MSG */
34 #define NVSHM_IPC_MESSAGE(id) (((~id & 0xFFFF) << 16) | (id & 0xFFFF))
35
36 /* Flags for descriptors */
37 #define NVSHM_DESC_AP    (0x01)  /* AP descriptor ownership */
38 #define NVSHM_DESC_BB    (0x02)  /* BB descriptor ownership */
39 #define NVSHM_DESC_OPEN  (0x04)  /* OOB channel open */
40 #define NVSHM_DESC_CLOSE (0x08)  /* OOB channel close */
41 #define NVSHM_DESC_XOFF  (0x10)  /* OOB channel Tx off */
42 #define NVSHM_DESC_XON   (0x20)  /* OOB channel Tx on */
43
44 #define FLUSH_CPU_DCACHE(va, size)      \
45         do {    \
46                 unsigned long _pa_ = page_to_phys(vmalloc_to_page((va))) \
47                         + ((unsigned long)va & ~PAGE_MASK);             \
48                 __cpuc_flush_dcache_area((void *)(va), (size_t)(size)); \
49                 outer_flush_range(_pa_, _pa_+(size_t)(size));           \
50         } while (0)
51
52 #define INV_CPU_DCACHE(va, size)                \
53         do {    \
54                 unsigned long _pa_ = page_to_phys(vmalloc_to_page((va))) \
55                         + ((unsigned long)va & ~PAGE_MASK);              \
56                 outer_inv_range(_pa_, _pa_+(size_t)(size));             \
57                 __cpuc_flush_dcache_area((void *)(va), (size_t)(size)); \
58         } while (0)
59
60 struct nvshm_handle {
61         spinlock_t lock;
62         spinlock_t qlock;
63         struct wake_lock ul_lock;
64         struct wake_lock dl_lock;
65         int instance;
66         int old_status;
67         int configured;
68         int bb_irq;
69         struct nvshm_config *conf;
70         void *ipc_base_virt;
71         void *mb_base_virt;
72         void *desc_base_virt; /* AP desc region */
73         void *data_base_virt; /* AP data region */
74         unsigned long ipc_size;
75         unsigned long mb_size;
76         unsigned long desc_size;
77         unsigned long data_size;
78         struct nvshm_iobuf *shared_queue_head; /* shared desc list */
79         struct nvshm_iobuf *shared_queue_tail; /* shared desc list */
80         struct nvshm_iobuf *free_pool_head;    /* free desc list */
81         struct nvshm_channel chan[NVSHM_MAX_CHANNELS];
82         struct work_struct nvshm_work;
83         struct workqueue_struct *nvshm_wq;
84         struct hrtimer wake_timer;
85         int timeout;
86         char wq_name[16];
87         struct device *dev;
88         void *ipc_data;
89         void (*generate_ipc)(void *ipc_data);
90         struct platform_device *tegra_bb;
91 };
92
93 extern inline struct nvshm_handle *nvshm_get_handle(void);
94
95 extern int nvshm_tty_init(struct nvshm_handle *handle);
96 extern void nvshm_tty_cleanup(void);
97
98 extern int nvshm_net_init(struct nvshm_handle *handle);
99 extern void nvshm_net_cleanup(void);
100
101 extern int nvshm_rpc_init(struct nvshm_handle *handle);
102 extern void nvshm_rpc_cleanup(void);
103
104 #endif /* _NVSHM_PRIV_H */