video: tegra: host: Tegra12 updates to host
[linux-3.10.git] / include / linux / nvhost_as_ioctl.h
1 /*
2  * include/linux/nvhost_as_ioctl.h
3  *
4  * Tegra Host Address Space Driver
5  *
6  * Copyright (c) 2011-2012, NVIDIA CORPORATION.  All rights reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifndef __LINUX_NVHOST_AS_IOCTL_H
23 #define __LINUX_NVHOST_AS_IOCTL_H
24
25 #include <linux/ioctl.h>
26 #include <linux/types.h>
27
28 #if !defined(__KERNEL__)
29 #define __user
30 #endif
31
32 #define NVHOST_AS_IOCTL_MAGIC 'A'
33
34 /*
35  * /dev/nvhost-as-* devices
36  *
37  * Opening a '/dev/nvhost-as-<module_name>' device node creates a new address
38  * space.  nvhost channels (for the same module) can then be bound to such an
39  * address space to define the addresses it has access to.
40  *
41  * Once a nvhost channel has been bound to an address space it cannot be
42  * unbound.  There is no support for allowing an nvhost channel to change from
43  * one address space to another (or from one to none).
44  *
45  * As long as there is an open device file to the address space, or any bound
46  * nvhost channels it will be valid.  Once all references to the address space
47  * are removed the address space is deleted.
48  *
49  */
50
51
52 /*
53  * Allocating an address space range:
54  *
55  * Address ranges created with this ioctl are reserved for later use with
56  * fixed-address buffer mappings.
57  *
58  * If _FLAGS_FIXED_OFFSET is specified then the new range starts at the 'offset'
59  * given.  Otherwise the address returned is chosen to be a multiple of 'align.'
60  *
61  */
62 struct nvhost_as_alloc_space_args {
63         __u32 pages;     /* in, pages */
64         __u32 page_size; /* in, bytes */
65         __u32 flags;     /* in */
66 #define NVHOST_AS_ALLOC_SPACE_FLAGS_FIXED_OFFSET 0x1
67         union {
68                 __u64 offset; /* inout, byte address valid iff _FIXED_OFFSET */
69                 __u64 align;  /* in, alignment multiple (0:={1 or n/a}) */
70         } o_a;
71 };
72
73 /*
74  * Releasing an address space range:
75  *
76  * The previously allocated region starting at 'offset' is freed.  If there are
77  * any buffers currently mapped inside the region the ioctl will fail.
78  */
79 struct nvhost_as_free_space_args {
80         __u64 offset; /* in, byte address */
81 };
82
83 /*
84  * Binding a nvhost channel to an address space:
85  *
86  * A channel must be bound to an address space before allocating a gpfifo
87  * in nvhost.  The 'channel_fd' given here is the fd used to allocate the
88  * channel.  Once a channel has been bound to an address space it cannot
89  * be unbound (except for when the channel is destroyed).
90  */
91 struct nvhost_as_bind_channel_args {
92         __u32 channel_fd; /* in */
93 };
94
95 /*
96  * Mapping nvmap buffers into an address space:
97  *
98  * The start address is the 'offset' given if _FIXED_OFFSET is specified.
99  * Otherwise the address returned is a multiple of 'align.'
100  *
101  * If 'page_size' is set to 0 the nvmap buffer's allocation alignment/sizing
102  * will be used to determine the page size (largest possible).  The page size
103  * chosen will be returned back to the caller in the 'page_size' parameter in
104  * that case.
105  */
106 struct nvhost_as_map_buffer_args {
107         __u32 flags;          /* in/out */
108 #define NVHOST_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET 0x1
109         __u32 nvmap_fd;       /* in */
110         __u32 nvmap_handle;   /* in */
111         __u32 page_size;      /* inout, 0:= best fit to buffer */
112         union {
113                 __u64 offset; /* inout, byte address valid iff _FIXED_OFFSET */
114                 __u64 align;  /* in, alignment multiple (0:={1 or n/a})   */
115         } o_a;
116 };
117
118 /*
119  * Unmapping a buffer:
120  *
121  * To unmap a previously mapped buffer set 'offset' to the offset returned in
122  * the mapping call.  This includes where a buffer has been mapped into a fixed
123  * offset of a previously allocated address space range.
124  */
125 struct nvhost_as_unmap_buffer_args {
126         __u64 offset; /* in, byte address */
127 };
128
129 #define NVHOST_AS_IOCTL_BIND_CHANNEL \
130         _IOWR(NVHOST_AS_IOCTL_MAGIC, 1, struct nvhost_as_bind_channel_args)
131 #define NVHOST_AS_IOCTL_ALLOC_SPACE \
132         _IOWR(NVHOST_AS_IOCTL_MAGIC, 2, struct nvhost_as_alloc_space_args)
133 #define NVHOST_AS_IOCTL_FREE_SPACE \
134         _IOWR(NVHOST_AS_IOCTL_MAGIC, 3, struct nvhost_as_free_space_args)
135 #define NVHOST_AS_IOCTL_MAP_BUFFER \
136         _IOWR(NVHOST_AS_IOCTL_MAGIC, 4, struct nvhost_as_map_buffer_args)
137 #define NVHOST_AS_IOCTL_UNMAP_BUFFER \
138         _IOWR(NVHOST_AS_IOCTL_MAGIC, 5, struct nvhost_as_unmap_buffer_args)
139
140 #define NVHOST_AS_IOCTL_LAST            \
141         _IOC_NR(NVHOST_AS_IOCTL_UNMAP_BUFFER)
142 #define NVHOST_AS_IOCTL_MAX_ARG_SIZE    \
143         sizeof(struct nvhost_as_map_buffer_args)
144
145
146 #endif