blob: 56488c52976f5cbc6479060c54c2b0d34dadf354 [file] [log] [blame]
/*
* include/linux/nvhost_as_ioctl.h
*
* Tegra Host Address Space Driver
*
* Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef __LINUX_NVHOST_AS_IOCTL_H
#define __LINUX_NVHOST_AS_IOCTL_H
#include <linux/ioctl.h>
#include <linux/types.h>
#if !defined(__KERNEL__)
#define __user
#endif
#define NVHOST_AS_IOCTL_MAGIC 'A'
/*
* /dev/nvhost-as-* devices
*
* Opening a '/dev/nvhost-as-<module_name>' device node creates a new address
* space. nvhost channels (for the same module) can then be bound to such an
* address space to define the addresses it has access to.
*
* Once a nvhost channel has been bound to an address space it cannot be
* unbound. There is no support for allowing an nvhost channel to change from
* one address space to another (or from one to none).
*
* As long as there is an open device file to the address space, or any bound
* nvhost channels it will be valid. Once all references to the address space
* are removed the address space is deleted.
*
*/
/*
* Allocating an address space range:
*
* Address ranges created with this ioctl are reserved for later use with
* fixed-address buffer mappings.
*
* If _FLAGS_FIXED_OFFSET is specified then the new range starts at the 'offset'
* given. Otherwise the address returned is chosen to be a multiple of 'align.'
*
*/
struct nvhost32_as_alloc_space_args {
__u32 pages; /* in, pages */
__u32 page_size; /* in, bytes */
__u32 flags; /* in */
#define NVHOST_AS_ALLOC_SPACE_FLAGS_FIXED_OFFSET 0x1
#define NVHOST_AS_ALLOC_SPACE_FLAGS_SPARSE 0x2
union {
__u64 offset; /* inout, byte address valid iff _FIXED_OFFSET */
__u64 align; /* in, alignment multiple (0:={1 or n/a}) */
} o_a;
};
struct nvhost_as_alloc_space_args {
__u32 pages; /* in, pages */
__u32 page_size; /* in, bytes */
__u32 flags; /* in */
__u32 padding; /* in */
union {
__u64 offset; /* inout, byte address valid iff _FIXED_OFFSET */
__u64 align; /* in, alignment multiple (0:={1 or n/a}) */
} o_a;
};
/*
* Releasing an address space range:
*
* The previously allocated region starting at 'offset' is freed. If there are
* any buffers currently mapped inside the region the ioctl will fail.
*/
struct nvhost_as_free_space_args {
__u64 offset; /* in, byte address */
__u32 pages; /* in, pages */
__u32 page_size; /* in, bytes */
};
/*
* Binding a nvhost channel to an address space:
*
* A channel must be bound to an address space before allocating a gpfifo
* in nvhost. The 'channel_fd' given here is the fd used to allocate the
* channel. Once a channel has been bound to an address space it cannot
* be unbound (except for when the channel is destroyed).
*/
struct nvhost_as_bind_channel_args {
__u32 channel_fd; /* in */
} __packed;
/*
* Mapping nvmap buffers into an address space:
*
* The start address is the 'offset' given if _FIXED_OFFSET is specified.
* Otherwise the address returned is a multiple of 'align.'
*
* If 'page_size' is set to 0 the nvmap buffer's allocation alignment/sizing
* will be used to determine the page size (largest possible). The page size
* chosen will be returned back to the caller in the 'page_size' parameter in
* that case.
*/
struct nvhost_as_map_buffer_args {
__u32 flags; /* in/out */
#define NVHOST_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET BIT(0)
#define NVHOST_AS_MAP_BUFFER_FLAGS_CACHEABLE BIT(2)
__u32 nvmap_fd; /* in */
__u32 nvmap_handle; /* in */
__u32 page_size; /* inout, 0:= best fit to buffer */
union {
__u64 offset; /* inout, byte address valid iff _FIXED_OFFSET */
__u64 align; /* in, alignment multiple (0:={1 or n/a}) */
} o_a;
};
/*
* Mapping dmabuf fds into an address space:
*
* The caller requests a mapping to a particular page 'kind'.
*
* If 'page_size' is set to 0 the dmabuf's alignment/sizing will be used to
* determine the page size (largest possible). The page size chosen will be
* returned back to the caller in the 'page_size' parameter in that case.
*/
struct nvhost_as_map_buffer_ex_args {
__u32 flags; /* in/out */
#define NV_KIND_DEFAULT -1
__s32 kind; /* in (-1 represents default) */
__u32 dmabuf_fd; /* in */
__u32 page_size; /* inout, 0:= best fit to buffer */
__u64 buffer_offset; /* in, offset of mapped buffer region */
__u64 mapping_size; /* in, size of mapped buffer region */
__u64 as_offset; /* in/out, we use this address if flag
* FIXED_OFFSET is set. This will fail
* if space is not properly allocated. The
* actual virtual address to which we mapped
* the buffer is returned in this field. */
};
/*
* Unmapping a buffer:
*
* To unmap a previously mapped buffer set 'offset' to the offset returned in
* the mapping call. This includes where a buffer has been mapped into a fixed
* offset of a previously allocated address space range.
*/
struct nvhost_as_unmap_buffer_args {
__u64 offset; /* in, byte address */
};
#define NVHOST_AS_IOCTL_BIND_CHANNEL \
_IOWR(NVHOST_AS_IOCTL_MAGIC, 1, struct nvhost_as_bind_channel_args)
#define NVHOST32_AS_IOCTL_ALLOC_SPACE \
_IOWR(NVHOST_AS_IOCTL_MAGIC, 2, struct nvhost32_as_alloc_space_args)
#define NVHOST_AS_IOCTL_FREE_SPACE \
_IOWR(NVHOST_AS_IOCTL_MAGIC, 3, struct nvhost_as_free_space_args)
#define NVHOST_AS_IOCTL_MAP_BUFFER \
_IOWR(NVHOST_AS_IOCTL_MAGIC, 4, struct nvhost_as_map_buffer_args)
#define NVHOST_AS_IOCTL_UNMAP_BUFFER \
_IOWR(NVHOST_AS_IOCTL_MAGIC, 5, struct nvhost_as_unmap_buffer_args)
#define NVHOST_AS_IOCTL_ALLOC_SPACE \
_IOWR(NVHOST_AS_IOCTL_MAGIC, 6, struct nvhost_as_alloc_space_args)
#define NVHOST_AS_IOCTL_MAP_BUFFER_EX \
_IOWR(NVHOST_AS_IOCTL_MAGIC, 7, struct nvhost_as_map_buffer_ex_args)
#define NVHOST_AS_IOCTL_LAST \
_IOC_NR(NVHOST_AS_IOCTL_MAP_BUFFER_EX)
#define NVHOST_AS_IOCTL_MAX_ARG_SIZE \
sizeof(struct nvhost_as_map_buffer_ex_args)
#endif