/************************************************************************** * * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA * All Rights Reserved. * Copyright (c) 2009 VMware, Inc., Palo Alto, CA., USA * 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. * **************************************************************************/ /* * Authors * Thomas Hellström <thomas-at-tungstengraphics-dot-com> */ #ifndef _TTM_PLACEMENT_USER_H_ #define _TTM_PLACEMENT_USER_H_ #if !defined(__KERNEL__) && !defined(_KERNEL) #include <stdint.h> #else #include <linux/kernel.h> #endif #include "ttm/ttm_placement.h" #define TTM_PLACEMENT_MAJOR 0 #define TTM_PLACEMENT_MINOR 1 #define TTM_PLACEMENT_PL 0 #define TTM_PLACEMENT_DATE "080819" /** * struct ttm_pl_create_req * * @size: The buffer object size. * @placement: Flags that indicate initial acceptable * placement. * @page_alignment: Required alignment in pages. * * Input to the TTM_BO_CREATE ioctl. */ struct ttm_pl_create_req { uint64_t size; uint32_t placement; uint32_t page_alignment; }; /** * struct ttm_pl_create_ub_req * * @size: The buffer object size. * @user_address: User-space address of the memory area that * should be used to back the buffer object cast to 64-bit. * @placement: Flags that indicate initial acceptable * placement. * @page_alignment: Required alignment in pages. * * Input to the TTM_BO_CREATE_UB ioctl. */ struct ttm_pl_create_ub_req { uint64_t size; uint64_t user_address; uint32_t placement; uint32_t page_alignment; }; /** * struct ttm_pl_rep * * @gpu_offset: The current offset into the memory region used. * This can be used directly by the GPU if there are no * additional GPU mapping procedures used by the driver. * * @bo_size: Actual buffer object size. * * @map_handle: Offset into the device address space. * Used for map, seek, read, write. This will never change * during the lifetime of an object. * * @placement: Flag indicating the placement status of * the buffer object using the TTM_PL flags above. * * @sync_object_arg: Used for user-space synchronization and * depends on the synchronization model used. If fences are * used, this is the buffer_object::fence_type_mask * * Output from the TTM_PL_CREATE and TTM_PL_REFERENCE, and * TTM_PL_SETSTATUS ioctls. */ struct ttm_pl_rep { uint64_t gpu_offset; uint64_t bo_size; uint64_t map_handle; uint32_t placement; uint32_t handle; uint32_t sync_object_arg; uint32_t pad64; }; /** * struct ttm_pl_setstatus_req * * @set_placement: Placement flags to set. * * @clr_placement: Placement flags to clear. * * @handle: The object handle * * Input to the TTM_PL_SETSTATUS ioctl. */ struct ttm_pl_setstatus_req { uint32_t set_placement; uint32_t clr_placement; uint32_t handle; uint32_t pad64; }; /** * struct ttm_pl_reference_req * * @handle: The object to put a reference on. * * Input to the TTM_PL_REFERENCE and the TTM_PL_UNREFERENCE ioctls. */ struct ttm_pl_reference_req { uint32_t handle; uint32_t pad64; }; /* * ACCESS mode flags for SYNCCPU. * * TTM_SYNCCPU_MODE_READ will guarantee that the GPU is not * writing to the buffer. * * TTM_SYNCCPU_MODE_WRITE will guarantee that the GPU is not * accessing the buffer. * * TTM_SYNCCPU_MODE_NO_BLOCK makes sure the call does not wait * for GPU accesses to finish but return -EBUSY. * * TTM_SYNCCPU_MODE_TRYCACHED Try to place the buffer in cacheable * memory while synchronized for CPU. */ #define TTM_PL_SYNCCPU_MODE_READ TTM_ACCESS_READ #define TTM_PL_SYNCCPU_MODE_WRITE TTM_ACCESS_WRITE #define TTM_PL_SYNCCPU_MODE_NO_BLOCK (1 << 2) #define TTM_PL_SYNCCPU_MODE_TRYCACHED (1 << 3) /** * struct ttm_pl_synccpu_arg * * @handle: The object to synchronize. * * @access_mode: access mode indicated by the * TTM_SYNCCPU_MODE flags. * * @op: indicates whether to grab or release the * buffer for cpu usage. * * Input to the TTM_PL_SYNCCPU ioctl. */ struct ttm_pl_synccpu_arg { uint32_t handle; uint32_t access_mode; enum { TTM_PL_SYNCCPU_OP_GRAB, TTM_PL_SYNCCPU_OP_RELEASE } op; uint32_t pad64; }; /* * Waiting mode flags for the TTM_BO_WAITIDLE ioctl. * * TTM_WAITIDLE_MODE_LAZY: Allow for sleeps during polling * wait. * * TTM_WAITIDLE_MODE_NO_BLOCK: Don't block waiting for GPU, * but return -EBUSY if the buffer is busy. */ #define TTM_PL_WAITIDLE_MODE_LAZY (1 << 0) #define TTM_PL_WAITIDLE_MODE_NO_BLOCK (1 << 1) /** * struct ttm_waitidle_arg * * @handle: The object to synchronize. * * @mode: wait mode indicated by the * TTM_SYNCCPU_MODE flags. * * Argument to the TTM_BO_WAITIDLE ioctl. */ struct ttm_pl_waitidle_arg { uint32_t handle; uint32_t mode; }; union ttm_pl_create_arg { struct ttm_pl_create_req req; struct ttm_pl_rep rep; }; union ttm_pl_reference_arg { struct ttm_pl_reference_req req; struct ttm_pl_rep rep; }; union ttm_pl_setstatus_arg { struct ttm_pl_setstatus_req req; struct ttm_pl_rep rep; }; union ttm_pl_create_ub_arg { struct ttm_pl_create_ub_req req; struct ttm_pl_rep rep; }; /* * Ioctl offsets. */ #define TTM_PL_CREATE 0x00 #define TTM_PL_REFERENCE 0x01 #define TTM_PL_UNREF 0x02 #define TTM_PL_SYNCCPU 0x03 #define TTM_PL_WAITIDLE 0x04 #define TTM_PL_SETSTATUS 0x05 #define TTM_PL_CREATE_UB 0x06 #endif