diff options
Diffstat (limited to 'include/drm/ttm/ttm_object.h')
| -rw-r--r-- | include/drm/ttm/ttm_object.h | 83 | 
1 files changed, 79 insertions, 4 deletions
diff --git a/include/drm/ttm/ttm_object.h b/include/drm/ttm/ttm_object.h index fc0cf064990..ed953f98f0e 100644 --- a/include/drm/ttm/ttm_object.h +++ b/include/drm/ttm/ttm_object.h @@ -41,6 +41,7 @@  #include <drm/drm_hashtab.h>  #include <linux/kref.h>  #include <linux/rcupdate.h> +#include <linux/dma-buf.h>  #include <ttm/ttm_memory.h>  /** @@ -77,6 +78,7 @@ enum ttm_object_type {  	ttm_fence_type,  	ttm_buffer_type,  	ttm_lock_type, +	ttm_prime_type,  	ttm_driver_type0 = 256,  	ttm_driver_type1,  	ttm_driver_type2, @@ -132,6 +134,30 @@ struct ttm_base_object {  				 enum ttm_ref_type ref_type);  }; + +/** + * struct ttm_prime_object - Modified base object that is prime-aware + * + * @base: struct ttm_base_object that we derive from + * @mutex: Mutex protecting the @dma_buf member. + * @size: Size of the dma_buf associated with this object + * @real_type: Type of the underlying object. Needed since we're setting + * the value of @base::object_type to ttm_prime_type + * @dma_buf: Non ref-coutned pointer to a struct dma_buf created from this + * object. + * @refcount_release: The underlying object's release method. Needed since + * we set @base::refcount_release to our own release method. + */ + +struct ttm_prime_object { +	struct ttm_base_object base; +	struct mutex mutex; +	size_t size; +	enum ttm_object_type real_type; +	struct dma_buf *dma_buf; +	void (*refcount_release) (struct ttm_base_object **); +}; +  /**   * ttm_base_object_init   * @@ -164,14 +190,26 @@ extern int ttm_base_object_init(struct ttm_object_file *tfile,   * @key: Hash key   *   * Looks up a struct ttm_base_object with the key @key. - * Also verifies that the object is visible to the application, by - * comparing the @tfile argument and checking the object shareable flag.   */  extern struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file  						      *tfile, uint32_t key);  /** + * ttm_base_object_lookup_for_ref + * + * @tdev: Pointer to a struct ttm_object_device. + * @key: Hash key + * + * Looks up a struct ttm_base_object with the key @key. + * This function should only be used when the struct tfile associated with the + * caller doesn't yet have a reference to the base object. + */ + +extern struct ttm_base_object * +ttm_base_object_lookup_for_ref(struct ttm_object_device *tdev, uint32_t key); + +/**   * ttm_base_object_unref   *   * @p_base: Pointer to a pointer referencing a struct ttm_base_object. @@ -192,6 +230,8 @@ extern void ttm_base_object_unref(struct ttm_base_object **p_base);   * @existed: Upon completion, indicates that an identical reference object   * already existed, and the refcount was upped on that object instead.   * + * Checks that the base object is shareable and adds a ref object to it. + *   * Adding a ref object to a base object is basically like referencing the   * base object, but a user-space application holds the reference. When the   * file corresponding to @tfile is closed, all its reference objects are @@ -204,6 +244,10 @@ extern void ttm_base_object_unref(struct ttm_base_object **p_base);  extern int ttm_ref_object_add(struct ttm_object_file *tfile,  			      struct ttm_base_object *base,  			      enum ttm_ref_type ref_type, bool *existed); + +extern bool ttm_ref_object_exists(struct ttm_object_file *tfile, +				  struct ttm_base_object *base); +  /**   * ttm_ref_object_base_unref   * @@ -248,14 +292,18 @@ extern void ttm_object_file_release(struct ttm_object_file **p_tfile);  /**   * ttm_object device init - initialize a struct ttm_object_device   * + * @mem_glob: struct ttm_mem_global for memory accounting.   * @hash_order: Order of hash table used to hash the base objects. + * @ops: DMA buf ops for prime objects of this device.   *   * This function is typically called on device initialization to prepare   * data structures needed for ttm base and ref objects.   */ -extern struct ttm_object_device *ttm_object_device_init -    (struct ttm_mem_global *mem_glob, unsigned int hash_order); +extern struct ttm_object_device * +ttm_object_device_init(struct ttm_mem_global *mem_glob, +		       unsigned int hash_order, +		       const struct dma_buf_ops *ops);  /**   * ttm_object_device_release - release data held by a ttm_object_device @@ -272,4 +320,31 @@ extern void ttm_object_device_release(struct ttm_object_device **p_tdev);  #define ttm_base_object_kfree(__object, __base)\  	kfree_rcu(__object, __base.rhead) + +extern int ttm_prime_object_init(struct ttm_object_file *tfile, +				 size_t size, +				 struct ttm_prime_object *prime, +				 bool shareable, +				 enum ttm_object_type type, +				 void (*refcount_release) +				 (struct ttm_base_object **), +				 void (*ref_obj_release) +				 (struct ttm_base_object *, +				  enum ttm_ref_type ref_type)); + +static inline enum ttm_object_type +ttm_base_object_type(struct ttm_base_object *base) +{ +	return (base->object_type == ttm_prime_type) ? +		container_of(base, struct ttm_prime_object, base)->real_type : +		base->object_type; +} +extern int ttm_prime_fd_to_handle(struct ttm_object_file *tfile, +				  int fd, u32 *handle); +extern int ttm_prime_handle_to_fd(struct ttm_object_file *tfile, +				  uint32_t handle, uint32_t flags, +				  int *prime_fd); + +#define ttm_prime_object_kfree(__obj, __prime)		\ +	kfree_rcu(__obj, __prime.base.rhead)  #endif  | 
