/**************************************************************************
*
* 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