/* * 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 #include #if !defined(__KERNEL__) #define __user #endif #define NVHOST_AS_IOCTL_MAGIC 'A' /* * /dev/nvhost-as-* devices * * Opening a '/dev/nvhost-as-' 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