diff options
Diffstat (limited to 'include/drm/drmP.h')
| -rw-r--r-- | include/drm/drmP.h | 151 | 
1 files changed, 151 insertions, 0 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index e79ce0781f0..1469a1bd882 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -104,6 +104,7 @@ struct drm_device;  #define DRIVER_DMA_QUEUE   0x200  #define DRIVER_FB_DMA      0x400  #define DRIVER_IRQ_VBL2    0x800 +#define DRIVER_GEM         0x1000  /***********************************************************************/  /** \name Begin the DRM... */ @@ -387,6 +388,10 @@ struct drm_file {  	struct drm_minor *minor;  	int remove_auth_on_close;  	unsigned long lock_count; +	/** Mapping of mm object handles to object pointers. */ +	struct idr object_idr; +	/** Lock for synchronization of access to object_idr. */ +	spinlock_t table_lock;  	struct file *filp;  	void *driver_priv;  }; @@ -558,6 +563,56 @@ struct drm_ati_pcigart_info {  };  /** + * This structure defines the drm_mm memory object, which will be used by the + * DRM for its buffer objects. + */ +struct drm_gem_object { +	/** Reference count of this object */ +	struct kref refcount; + +	/** Handle count of this object. Each handle also holds a reference */ +	struct kref handlecount; + +	/** Related drm device */ +	struct drm_device *dev; + +	/** File representing the shmem storage */ +	struct file *filp; + +	/** +	 * Size of the object, in bytes.  Immutable over the object's +	 * lifetime. +	 */ +	size_t size; + +	/** +	 * Global name for this object, starts at 1. 0 means unnamed. +	 * Access is covered by the object_name_lock in the related drm_device +	 */ +	int name; + +	/** +	 * Memory domains. These monitor which caches contain read/write data +	 * related to the object. When transitioning from one set of domains +	 * to another, the driver is called to ensure that caches are suitably +	 * flushed and invalidated +	 */ +	uint32_t read_domains; +	uint32_t write_domain; + +	/** +	 * While validating an exec operation, the +	 * new read/write domain values are computed here. +	 * They will be transferred to the above values +	 * at the point that any cache flushing occurs +	 */ +	uint32_t pending_read_domains; +	uint32_t pending_write_domain; + +	void *driver_private; +}; + +/**   * DRM driver structure. This structure represent the common code for   * a family of cards. There will one drm_device for each card present   * in this family @@ -657,6 +712,18 @@ struct drm_driver {  	void (*set_version) (struct drm_device *dev,  			     struct drm_set_version *sv); +	int (*proc_init)(struct drm_minor *minor); +	void (*proc_cleanup)(struct drm_minor *minor); + +	/** +	 * Driver-specific constructor for drm_gem_objects, to set up +	 * obj->driver_private. +	 * +	 * Returns 0 on success. +	 */ +	int (*gem_init_object) (struct drm_gem_object *obj); +	void (*gem_free_object) (struct drm_gem_object *obj); +  	int major;  	int minor;  	int patchlevel; @@ -830,6 +897,22 @@ struct drm_device {  	spinlock_t drw_lock;  	struct idr drw_idr;  	/*@} */ + +	/** \name GEM information */ +	/*@{ */ +	spinlock_t object_name_lock; +	struct idr object_name_idr; +	atomic_t object_count; +	atomic_t object_memory; +	atomic_t pin_count; +	atomic_t pin_memory; +	atomic_t gtt_count; +	atomic_t gtt_memory; +	uint32_t gtt_total; +	uint32_t invalidate_domains;    /* domains pending invalidation */ +	uint32_t flush_domains;         /* domains pending flush */ +	/*@} */ +  };  static __inline__ int drm_core_check_feature(struct drm_device *dev, @@ -926,6 +1009,10 @@ extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area);  extern DRM_AGP_MEM *drm_alloc_agp(struct drm_device *dev, int pages, u32 type);  extern int drm_free_agp(DRM_AGP_MEM * handle, int pages);  extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start); +extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev, +				       struct page **pages, +				       unsigned long num_pages, +				       uint32_t gtt_offset);  extern int drm_unbind_agp(DRM_AGP_MEM * handle);  				/* Misc. IOCTL support (drm_ioctl.h) */ @@ -988,6 +1075,9 @@ extern int drm_getmagic(struct drm_device *dev, void *data,  extern int drm_authmagic(struct drm_device *dev, void *data,  			 struct drm_file *file_priv); +/* Cache management (drm_cache.c) */ +void drm_clflush_pages(struct page *pages[], unsigned long num_pages); +  				/* Locking IOCTL support (drm_lock.h) */  extern int drm_lock(struct drm_device *dev, void *data,  		    struct drm_file *file_priv); @@ -1094,6 +1184,7 @@ extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size  extern int drm_agp_free_memory(DRM_AGP_MEM * handle);  extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);  extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle); +extern void drm_agp_chipset_flush(struct drm_device *dev);  				/* Stub support (drm_stub.h) */  extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, @@ -1156,6 +1247,66 @@ extern unsigned long drm_mm_tail_space(struct drm_mm *mm);  extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, unsigned long size);  extern int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size); +/* Graphics Execution Manager library functions (drm_gem.c) */ +int drm_gem_init(struct drm_device *dev); +void drm_gem_object_free(struct kref *kref); +struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, +					    size_t size); +void drm_gem_object_handle_free(struct kref *kref); + +static inline void +drm_gem_object_reference(struct drm_gem_object *obj) +{ +	kref_get(&obj->refcount); +} + +static inline void +drm_gem_object_unreference(struct drm_gem_object *obj) +{ +	if (obj == NULL) +		return; + +	kref_put(&obj->refcount, drm_gem_object_free); +} + +int drm_gem_handle_create(struct drm_file *file_priv, +			  struct drm_gem_object *obj, +			  int *handlep); + +static inline void +drm_gem_object_handle_reference(struct drm_gem_object *obj) +{ +	drm_gem_object_reference(obj); +	kref_get(&obj->handlecount); +} + +static inline void +drm_gem_object_handle_unreference(struct drm_gem_object *obj) +{ +	if (obj == NULL) +		return; + +	/* +	 * Must bump handle count first as this may be the last +	 * ref, in which case the object would disappear before we +	 * checked for a name +	 */ +	kref_put(&obj->handlecount, drm_gem_object_handle_free); +	drm_gem_object_unreference(obj); +} + +struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev, +					     struct drm_file *filp, +					     int handle); +int drm_gem_close_ioctl(struct drm_device *dev, void *data, +			struct drm_file *file_priv); +int drm_gem_flink_ioctl(struct drm_device *dev, void *data, +			struct drm_file *file_priv); +int drm_gem_open_ioctl(struct drm_device *dev, void *data, +		       struct drm_file *file_priv); +void drm_gem_open(struct drm_device *dev, struct drm_file *file_private); +void drm_gem_release(struct drm_device *dev, struct drm_file *file_private); +  extern void drm_core_ioremap(struct drm_map *map, struct drm_device *dev);  extern void drm_core_ioremap_wc(struct drm_map *map, struct drm_device *dev);  extern void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev);  |