diff options
| -rw-r--r-- | linux-core/drmP.h | 369 | ||||
| -rw-r--r-- | linux-core/drm_ttm.h | 359 | 
2 files changed, 357 insertions, 371 deletions
| diff --git a/linux-core/drmP.h b/linux-core/drmP.h index e0afc508..c3607c3f 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -591,117 +591,9 @@ typedef struct ati_pcigart_info {  	drm_local_map_t mapping;  } drm_ati_pcigart_info; -/* - * User space objects and their references. - */ - -#define drm_user_object_entry(_ptr, _type, _member) container_of(_ptr, _type, _member) - -typedef enum { -		drm_fence_type, -		drm_buffer_type, -		drm_ttm_type - -		/* -		 * Add other user space object types here.  -		 */ - -} drm_object_type_t; - -/* - * A user object is a structure that helps the drm give out user handles - * to kernel internal objects and to keep track of these objects so that  - * they can be destroyed, for example when the user space process exits. - * Designed to be accessible using a user space 32-bit handle.  - */ - -typedef struct drm_user_object{ -	drm_hash_item_t hash; -	struct list_head list; -	drm_object_type_t type; -        atomic_t refcount; -        int shareable; -        drm_file_t *owner; -	void (*ref_struct_locked) (drm_file_t *priv, struct drm_user_object *obj,  -				   drm_ref_t ref_action);  -	void (*unref)(drm_file_t *priv, struct drm_user_object *obj,  -		      drm_ref_t unref_action); -	void (*remove)(drm_file_t *priv, struct drm_user_object *obj); -} drm_user_object_t; - -/* - * A ref object is a structure which is used to - * keep track of references to user objects and to keep track of these - * references so that they can be destroyed for example when the user space - * process exits. Designed to be accessible using a pointer to the _user_ object. - */ - - -typedef struct drm_ref_object { -	drm_hash_item_t hash; -	struct list_head list; -	atomic_t refcount; -	drm_ref_t unref_action; -} drm_ref_object_t; - -struct drm_buffer_object;  #include "drm_ttm.h" -#define _DRM_FLAG_MEMTYPE_FIXED     0x00000001   /* Fixed (on-card) PCI memory */ -#define _DRM_FLAG_MEMTYPE_MAPPABLE  0x00000002   /* Memory mappable */ -#define _DRM_FLAG_MEMTYPE_CACHED    0x00000004   /* Cached binding */ -#define _DRM_FLAG_NEEDS_IOREMAP     0x00000008   /* Fixed memory needs ioremap -						    before kernel access. */ -#define _DRM_FLAG_MEMTYPE_CMA       0x00000010   /* Can't map aperture */ -#define _DRM_FLAG_MEMTYPE_CSELECT   0x00000020   /* Select caching */ - - -typedef struct drm_mem_type_manager { -	int has_type; -	int use_type; -	drm_mm_t manager; -	struct list_head lru; -	struct list_head pinned; -	uint32_t flags; -        uint32_t drm_bus_maptype; -	unsigned long io_offset;                  -	unsigned long io_size; -	void *io_addr; -} drm_mem_type_manager_t; - -typedef struct drm_bo_mem_reg { -	drm_mm_node_t *mm_node; -	unsigned long size; -	unsigned long num_pages; -	uint32_t page_alignment; -	uint32_t mem_type; -	uint32_t flags; -	uint32_t mask; -} drm_bo_mem_reg_t; -	 -/* - * buffer object driver - */ - -typedef struct drm_bo_driver{ -        const uint32_t *mem_type_prio; -	const uint32_t *mem_busy_prio; -        uint32_t num_mem_type_prio; -	uint32_t num_mem_busy_prio; -	drm_ttm_backend_t *(*create_ttm_backend_entry)  -		(struct drm_device *dev); -	int (*fence_type)(uint32_t flags, uint32_t *class, uint32_t *type); -	int (*invalidate_caches)(struct drm_device *dev, uint32_t flags); -	int (*init_mem_type)(struct drm_device *dev, uint32_t type, -			     drm_mem_type_manager_t *man); -        uint32_t (*evict_flags) (struct drm_device *dev, uint32_t type); -	int (*move)(struct drm_buffer_object *bo, -		    int evict, int no_wait, -		    struct drm_bo_mem_reg *new_mem); -} drm_bo_driver_t; - -  /**   * DRM driver structure. This structure represent the common code for   * a family of cards. There will one drm_device for each card present @@ -787,61 +679,6 @@ typedef struct drm_head {  } drm_head_t; -typedef struct drm_fence_driver{ -	int no_types; -	uint32_t wrap_diff; -	uint32_t flush_diff; -        uint32_t sequence_mask; -        int lazy_capable; -	int (*has_irq) (struct drm_device *dev, uint32_t class, uint32_t flags); -	int (*emit) (struct drm_device *dev, uint32_t class, uint32_t flags, -		     uint32_t *breadcrumb, -		     uint32_t *native_type); -	void (*poke_flush) (struct drm_device *dev, uint32_t class); -} drm_fence_driver_t; - -#define _DRM_FENCE_TYPE_EXE 0x00 - -typedef struct drm_fence_manager{ -        int initialized; -	rwlock_t lock; - -	/* -	 * The list below should be maintained in sequence order and  -	 * access is protected by the above spinlock. -	 */ - -	struct list_head ring; -	struct list_head *fence_types[32]; -	volatile uint32_t pending_flush; -	wait_queue_head_t fence_queue; -	int pending_exe_flush; -	uint32_t last_exe_flush; -	uint32_t exe_flush_sequence; -        atomic_t count; -} drm_fence_manager_t; - -typedef struct drm_buffer_manager{ -	struct mutex init_mutex; -	struct mutex evict_mutex; -	int nice_mode; -	int initialized; -        drm_file_t *last_to_validate; -	drm_mem_type_manager_t man[DRM_BO_MEM_TYPES]; -	struct list_head unfenced; -	struct list_head ddestroy; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -        struct work_struct wq; -#else -        struct delayed_work wq; -#endif -        uint32_t fence_type; -        unsigned long cur_pages; -        atomic_t count; -} drm_buffer_manager_t; - - -  /**   * DRM device structure. This structure represent a complete card that   * may contain multiple heads. @@ -996,77 +833,6 @@ typedef struct drm_agp_ttm_priv {  } drm_agp_ttm_priv;  #endif -typedef struct drm_fence_object{ -	drm_user_object_t base; -        atomic_t usage; - -	/* -	 * The below three fields are protected by the fence manager spinlock. -	 */ - -	struct list_head ring; -        int class; -        uint32_t native_type; -	uint32_t type; -	uint32_t signaled; -	uint32_t sequence; -	uint32_t flush_mask; -	uint32_t submitted_flush; -} drm_fence_object_t; - - -typedef struct drm_buffer_object{ -	drm_device_t *dev; -	drm_user_object_t base; - -    /* -     * If there is a possibility that the usage variable is zero, -     * then dev->struct_mutext should be locked before incrementing it. -     */ - -	atomic_t usage; -        unsigned long buffer_start; -        drm_bo_type_t type; -        unsigned long offset; -	atomic_t mapped; -	drm_bo_mem_reg_t mem; - -        struct list_head lru; -	struct list_head ddestroy; - -	uint32_t fence_type; -        uint32_t fence_class; -	drm_fence_object_t *fence; -        uint32_t priv_flags; -	wait_queue_head_t event_queue; -        struct mutex mutex; - -	/* For pinned buffers */ -	drm_mm_node_t *pinned_node; -	uint32_t pinned_mem_type; -	struct list_head pinned_lru; - -	/* For vm */ - -        drm_ttm_t *ttm; -        drm_map_list_t map_list; -	uint32_t memory_type; -	unsigned long bus_offset; -	uint32_t vm_flags; -        void *iomap; -   -         -#ifdef DRM_ODD_MM_COMPAT -  /* dev->struct_mutex only protected. */ -	struct list_head vma_list; -	struct list_head p_mm_list; -#endif - -} drm_buffer_object_t; - -#define _DRM_BO_FLAG_UNFENCED 0x00000001 -#define _DRM_BO_FLAG_EVICTED  0x00000002 -  static __inline__ int drm_core_check_feature(struct drm_device *dev,  					     int feature) @@ -1408,144 +1174,9 @@ static inline drm_mm_t *drm_get_mm(drm_mm_node_t *block)  } -/* - * User space object bookkeeping (drm_object.c) - */ - -/* - * Must be called with the struct_mutex held. - */ - -extern int drm_add_user_object(drm_file_t *priv, drm_user_object_t *item,  - -/* - * Must be called with the struct_mutex held. - */ -			       int shareable); -extern drm_user_object_t *drm_lookup_user_object(drm_file_t *priv, uint32_t key); - -/* - * Must be called with the struct_mutex held. - * If "item" has been obtained by a call to drm_lookup_user_object. You may not - * release the struct_mutex before calling drm_remove_ref_object. - * This function may temporarily release the struct_mutex. - */ - -extern int drm_remove_user_object(drm_file_t *priv, drm_user_object_t *item); -/* - * Must be called with the struct_mutex held. May temporarily release it. - */ -extern int drm_add_ref_object(drm_file_t *priv, drm_user_object_t *referenced_object, -			      drm_ref_t ref_action); - -/* - * Must be called with the struct_mutex held. - */ - -drm_ref_object_t *drm_lookup_ref_object(drm_file_t *priv,  -					drm_user_object_t *referenced_object, -					drm_ref_t ref_action); -/* - * Must be called with the struct_mutex held. - * If "item" has been obtained by a call to drm_lookup_ref_object. You may not - * release the struct_mutex before calling drm_remove_ref_object. - * This function may temporarily release the struct_mutex. - */ - -extern void drm_remove_ref_object(drm_file_t *priv, drm_ref_object_t *item); -extern int drm_user_object_ref(drm_file_t *priv, uint32_t user_token, drm_object_type_t type, -			       drm_user_object_t **object); -extern int drm_user_object_unref(drm_file_t *priv, uint32_t user_token, drm_object_type_t type); - - - -/* - * fence objects (drm_fence.c) - */ - -extern void drm_fence_handler(drm_device_t *dev, uint32_t class, -			      uint32_t sequence, uint32_t type); -extern void drm_fence_manager_init(drm_device_t *dev); -extern void drm_fence_manager_takedown(drm_device_t *dev); -extern void drm_fence_flush_old(drm_device_t *dev, uint32_t sequence); -extern int drm_fence_object_flush(drm_device_t * dev, -				  volatile drm_fence_object_t * fence,  -				  uint32_t type); -extern int drm_fence_object_signaled(volatile drm_fence_object_t * fence,  -				     uint32_t type); -extern void drm_fence_usage_deref_locked(drm_device_t * dev, -					 drm_fence_object_t * fence); -extern void drm_fence_usage_deref_unlocked(drm_device_t * dev, -					 drm_fence_object_t * fence); -extern int drm_fence_object_wait(drm_device_t * dev,  -				 volatile drm_fence_object_t * fence, -				 int lazy, int ignore_signals, uint32_t mask); -extern int drm_fence_object_create(drm_device_t *dev, uint32_t type, -				   uint32_t fence_flags,  -				   drm_fence_object_t **c_fence); -extern int drm_fence_add_user_object(drm_file_t *priv,  -				     drm_fence_object_t *fence, -				     int shareable); - - - - - -extern int drm_fence_ioctl(DRM_IOCTL_ARGS); - -/* - * buffer objects (drm_bo.c) - */ - -extern int drm_bo_ioctl(DRM_IOCTL_ARGS); -extern int drm_mm_init_ioctl(DRM_IOCTL_ARGS); -extern int drm_bo_driver_finish(drm_device_t *dev); -extern int drm_bo_driver_init(drm_device_t *dev); -extern int drm_bo_pci_offset(drm_device_t *dev, -			     drm_bo_mem_reg_t *mem, -			     unsigned long *bus_base, -			     unsigned long *bus_offset, -			     unsigned long *bus_size); -extern int drm_mem_reg_is_pci(drm_device_t *dev, drm_bo_mem_reg_t *mem); - - -extern void drm_bo_usage_deref_locked(drm_buffer_object_t * bo); -extern int drm_fence_buffer_objects(drm_file_t * priv, -				    struct list_head *list,  -				    uint32_t fence_flags, -				    drm_fence_object_t *fence, -				    drm_fence_object_t **used_fence); -extern void drm_bo_add_to_lru(drm_buffer_object_t * bo); -extern int drm_bo_wait(drm_buffer_object_t * bo, int lazy, int ignore_signals, -		       int no_wait); -extern int drm_bo_mem_space(drm_buffer_object_t *bo, -			    drm_bo_mem_reg_t *mem, -			    int no_wait); -extern int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_mem_flags, -			      int no_wait, int move_unfenced); - - -/* - * Buffer object memory move helpers. - * drm_bo_move.c - */ -extern int drm_bo_move_ttm(drm_buffer_object_t *bo,  -			   int evict, -			   int no_wait, -			   drm_bo_mem_reg_t *new_mem); -extern int drm_bo_move_memcpy(drm_buffer_object_t *bo,  -			      int evict, -			      int no_wait, -			      drm_bo_mem_reg_t *new_mem); -extern int drm_bo_move_accel_cleanup(drm_buffer_object_t *bo, -				     int evict, -				     int no_wait, -				     uint32_t fence_type, -				     uint32_t fence_flags, -				     drm_bo_mem_reg_t *new_mem);  extern void drm_core_ioremap(struct drm_map *map, struct drm_device *dev);  extern void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev); diff --git a/linux-core/drm_ttm.h b/linux-core/drm_ttm.h index b96f5cee..04fb1707 100644 --- a/linux-core/drm_ttm.h +++ b/linux-core/drm_ttm.h @@ -32,11 +32,199 @@  #define _DRM_TTM_H  #define DRM_HAS_TTM +struct drm_device; + +/*************************************************** + * User space objects. (drm_object.c) + */ + +#define drm_user_object_entry(_ptr, _type, _member) container_of(_ptr, _type, _member) + +typedef enum { +	drm_fence_type, +	drm_buffer_type, +	drm_ttm_type +	    /* +	     * Add other user space object types here. +	     */ +} drm_object_type_t; + +/* + * A user object is a structure that helps the drm give out user handles + * to kernel internal objects and to keep track of these objects so that + * they can be destroyed, for example when the user space process exits. + * Designed to be accessible using a user space 32-bit handle. + */ + +typedef struct drm_user_object { +	drm_hash_item_t hash; +	struct list_head list; +	drm_object_type_t type; +	atomic_t refcount; +	int shareable; +	drm_file_t *owner; +	void (*ref_struct_locked) (drm_file_t * priv, +				   struct drm_user_object * obj, +				   drm_ref_t ref_action); +	void (*unref) (drm_file_t * priv, struct drm_user_object * obj, +		       drm_ref_t unref_action); +	void (*remove) (drm_file_t * priv, struct drm_user_object * obj); +} drm_user_object_t; + +/* + * A ref object is a structure which is used to + * keep track of references to user objects and to keep track of these + * references so that they can be destroyed for example when the user space + * process exits. Designed to be accessible using a pointer to the _user_ object. + */ + +typedef struct drm_ref_object { +	drm_hash_item_t hash; +	struct list_head list; +	atomic_t refcount; +	drm_ref_t unref_action; +} drm_ref_object_t; + +/** + * Must be called with the struct_mutex held. + */ + +extern int drm_add_user_object(drm_file_t * priv, drm_user_object_t * item, +			       int shareable); +/** + * Must be called with the struct_mutex held. + */ + +extern drm_user_object_t *drm_lookup_user_object(drm_file_t * priv, +						 uint32_t key); + +/* + * Must be called with the struct_mutex held. + * If "item" has been obtained by a call to drm_lookup_user_object. You may not + * release the struct_mutex before calling drm_remove_ref_object. + * This function may temporarily release the struct_mutex. + */ + +extern int drm_remove_user_object(drm_file_t * priv, drm_user_object_t * item); + +/* + * Must be called with the struct_mutex held. May temporarily release it. + */ + +extern int drm_add_ref_object(drm_file_t * priv, +			      drm_user_object_t * referenced_object, +			      drm_ref_t ref_action); +  /* - * The backend GART interface. (In our case AGP). Any similar type of device (PCIE?) + * Must be called with the struct_mutex held. + */ + +drm_ref_object_t *drm_lookup_ref_object(drm_file_t * priv, +					drm_user_object_t * referenced_object, +					drm_ref_t ref_action); +/* + * Must be called with the struct_mutex held. + * If "item" has been obtained by a call to drm_lookup_ref_object. You may not + * release the struct_mutex before calling drm_remove_ref_object. + * This function may temporarily release the struct_mutex. + */ + +extern void drm_remove_ref_object(drm_file_t * priv, drm_ref_object_t * item); +extern int drm_user_object_ref(drm_file_t * priv, uint32_t user_token, +			       drm_object_type_t type, +			       drm_user_object_t ** object); +extern int drm_user_object_unref(drm_file_t * priv, uint32_t user_token, +				 drm_object_type_t type); + +/*************************************************** + * Fence objects. (drm_fence.c) + */ + +typedef struct drm_fence_object { +	drm_user_object_t base; +	atomic_t usage; + +	/* +	 * The below three fields are protected by the fence manager spinlock. +	 */ + +	struct list_head ring; +	int class; +	uint32_t native_type; +	uint32_t type; +	uint32_t signaled; +	uint32_t sequence; +	uint32_t flush_mask; +	uint32_t submitted_flush; +} drm_fence_object_t; + +#define _DRM_FENCE_TYPE_EXE 0x00 + +typedef struct drm_fence_manager { +	int initialized; +	rwlock_t lock; + +	/* +	 * The list below should be maintained in sequence order and +	 * access is protected by the above spinlock. +	 */ + +	struct list_head ring; +	struct list_head *fence_types[32]; +	volatile uint32_t pending_flush; +	wait_queue_head_t fence_queue; +	int pending_exe_flush; +	uint32_t last_exe_flush; +	uint32_t exe_flush_sequence; +	atomic_t count; +} drm_fence_manager_t; + +typedef struct drm_fence_driver { +	int no_types; +	uint32_t wrap_diff; +	uint32_t flush_diff; +	uint32_t sequence_mask; +	int lazy_capable; +	int (*has_irq) (struct drm_device * dev, uint32_t class, +			uint32_t flags); +	int (*emit) (struct drm_device * dev, uint32_t class, uint32_t flags, +		     uint32_t * breadcrumb, uint32_t * native_type); +	void (*poke_flush) (struct drm_device * dev, uint32_t class); +} drm_fence_driver_t; + +extern void drm_fence_handler(struct drm_device *dev, uint32_t class, +			      uint32_t sequence, uint32_t type); +extern void drm_fence_manager_init(struct drm_device *dev); +extern void drm_fence_manager_takedown(struct drm_device *dev); +extern void drm_fence_flush_old(struct drm_device *dev, uint32_t sequence); +extern int drm_fence_object_flush(struct drm_device *dev, +				  drm_fence_object_t * fence, uint32_t type); +extern int drm_fence_object_signaled(drm_fence_object_t * fence, uint32_t type); +extern void drm_fence_usage_deref_locked(struct drm_device *dev, +					 drm_fence_object_t * fence); +extern void drm_fence_usage_deref_unlocked(struct drm_device *dev, +					   drm_fence_object_t * fence); +extern int drm_fence_object_wait(struct drm_device *dev, +				 drm_fence_object_t * fence, +				 int lazy, int ignore_signals, uint32_t mask); +extern int drm_fence_object_create(struct drm_device *dev, uint32_t type, +				   uint32_t fence_flags, +				   drm_fence_object_t ** c_fence); +extern int drm_fence_add_user_object(drm_file_t * priv, +				     drm_fence_object_t * fence, int shareable); +extern int drm_fence_ioctl(DRM_IOCTL_ARGS); + +/************************************************** + *TTMs + */ + +/* + * The ttm backend GTT interface. (In our case AGP). + * Any similar type of device (PCIE?)   * needs only to implement these functions to be usable with the "TTM" interface.   * The AGP backend implementation lives in drm_agpsupport.c  - * basically maps these calls to available functions in agpgart. Each drm device driver gets an + * basically maps these calls to available functions in agpgart. + * Each drm device driver gets an   * additional function pointer that creates these types,    * so that the device can choose the correct aperture.   * (Multiple AGP apertures, etc.)  @@ -111,4 +299,171 @@ extern int drm_destroy_ttm(drm_ttm_t * ttm);  #define DRM_TTM_PAGE_PRESENT  0x08  #define DRM_TTM_PAGE_VMALLOC  0x10 +/*************************************************** + * Buffer objects. (drm_bo.c, drm_bo_move.c) + */ + +typedef struct drm_bo_mem_reg { +	drm_mm_node_t *mm_node; +	unsigned long size; +	unsigned long num_pages; +	uint32_t page_alignment; +	uint32_t mem_type; +	uint32_t flags; +	uint32_t mask; +} drm_bo_mem_reg_t; + +typedef struct drm_buffer_object { +	struct drm_device *dev; +	drm_user_object_t base; + +	/* +	 * If there is a possibility that the usage variable is zero, +	 * then dev->struct_mutext should be locked before incrementing it. +	 */ + +	atomic_t usage; +	unsigned long buffer_start; +	drm_bo_type_t type; +	unsigned long offset; +	atomic_t mapped; +	drm_bo_mem_reg_t mem; + +	struct list_head lru; +	struct list_head ddestroy; + +	uint32_t fence_type; +	uint32_t fence_class; +	drm_fence_object_t *fence; +	uint32_t priv_flags; +	wait_queue_head_t event_queue; +	struct mutex mutex; + +	/* For pinned buffers */ +	drm_mm_node_t *pinned_node; +	uint32_t pinned_mem_type; +	struct list_head pinned_lru; + +	/* For vm */ + +	drm_ttm_t *ttm; +	drm_map_list_t map_list; +	uint32_t memory_type; +	unsigned long bus_offset; +	uint32_t vm_flags; +	void *iomap; + +#ifdef DRM_ODD_MM_COMPAT +	/* dev->struct_mutex only protected. */ +	struct list_head vma_list; +	struct list_head p_mm_list; +#endif + +} drm_buffer_object_t; + +#define _DRM_BO_FLAG_UNFENCED 0x00000001 +#define _DRM_BO_FLAG_EVICTED  0x00000002 + +typedef struct drm_mem_type_manager { +	int has_type; +	int use_type; +	drm_mm_t manager; +	struct list_head lru; +	struct list_head pinned; +	uint32_t flags; +	uint32_t drm_bus_maptype; +	unsigned long io_offset; +	unsigned long io_size; +	void *io_addr; +} drm_mem_type_manager_t; + +#define _DRM_FLAG_MEMTYPE_FIXED     0x00000001	/* Fixed (on-card) PCI memory */ +#define _DRM_FLAG_MEMTYPE_MAPPABLE  0x00000002	/* Memory mappable */ +#define _DRM_FLAG_MEMTYPE_CACHED    0x00000004	/* Cached binding */ +#define _DRM_FLAG_NEEDS_IOREMAP     0x00000008	/* Fixed memory needs ioremap +						   before kernel access. */ +#define _DRM_FLAG_MEMTYPE_CMA       0x00000010	/* Can't map aperture */ +#define _DRM_FLAG_MEMTYPE_CSELECT   0x00000020	/* Select caching */ + +typedef struct drm_buffer_manager { +	struct mutex init_mutex; +	struct mutex evict_mutex; +	int nice_mode; +	int initialized; +	drm_file_t *last_to_validate; +	drm_mem_type_manager_t man[DRM_BO_MEM_TYPES]; +	struct list_head unfenced; +	struct list_head ddestroy; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +	struct work_struct wq; +#else +	struct delayed_work wq; +#endif +	uint32_t fence_type; +	unsigned long cur_pages; +	atomic_t count; +} drm_buffer_manager_t; + +typedef struct drm_bo_driver { +	const uint32_t *mem_type_prio; +	const uint32_t *mem_busy_prio; +	uint32_t num_mem_type_prio; +	uint32_t num_mem_busy_prio; +	drm_ttm_backend_t *(*create_ttm_backend_entry) +	 (struct drm_device * dev); +	int (*fence_type) (uint32_t flags, uint32_t * class, uint32_t * type); +	int (*invalidate_caches) (struct drm_device * dev, uint32_t flags); +	int (*init_mem_type) (struct drm_device * dev, uint32_t type, +			      drm_mem_type_manager_t * man); +	 uint32_t(*evict_flags) (struct drm_device * dev, uint32_t type); +	int (*move) (struct drm_buffer_object * bo, +		     int evict, int no_wait, struct drm_bo_mem_reg * new_mem); +} drm_bo_driver_t; + +/* + * buffer objects (drm_bo.c) + */ + +extern int drm_bo_ioctl(DRM_IOCTL_ARGS); +extern int drm_mm_init_ioctl(DRM_IOCTL_ARGS); +extern int drm_bo_driver_finish(struct drm_device *dev); +extern int drm_bo_driver_init(struct drm_device *dev); +extern int drm_bo_pci_offset(struct drm_device *dev, +			     drm_bo_mem_reg_t * mem, +			     unsigned long *bus_base, +			     unsigned long *bus_offset, +			     unsigned long *bus_size); +extern int drm_mem_reg_is_pci(struct drm_device *dev, drm_bo_mem_reg_t * mem); + +extern void drm_bo_usage_deref_locked(drm_buffer_object_t * bo); +extern int drm_fence_buffer_objects(drm_file_t * priv, +				    struct list_head *list, +				    uint32_t fence_flags, +				    drm_fence_object_t * fence, +				    drm_fence_object_t ** used_fence); +extern void drm_bo_add_to_lru(drm_buffer_object_t * bo); +extern int drm_bo_wait(drm_buffer_object_t * bo, int lazy, int ignore_signals, +		       int no_wait); +extern int drm_bo_mem_space(drm_buffer_object_t * bo, +			    drm_bo_mem_reg_t * mem, int no_wait); +extern int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_mem_flags, +			      int no_wait, int move_unfenced); + +/* + * Buffer object memory move helpers. + * drm_bo_move.c + */ + +extern int drm_bo_move_ttm(drm_buffer_object_t * bo, +			   int evict, int no_wait, drm_bo_mem_reg_t * new_mem); +extern int drm_bo_move_memcpy(drm_buffer_object_t * bo, +			      int evict, +			      int no_wait, drm_bo_mem_reg_t * new_mem); +extern int drm_bo_move_accel_cleanup(drm_buffer_object_t * bo, +				     int evict, +				     int no_wait, +				     uint32_t fence_type, +				     uint32_t fence_flags, +				     drm_bo_mem_reg_t * new_mem); +  #endif | 
