diff options
author | 2013-11-27 20:13:30 +0000 | |
---|---|---|
committer | 2013-11-27 20:13:30 +0000 | |
commit | 8a2d84923a2b8b64b88bb1d4b20c2b67a08414ef (patch) | |
tree | 186a6e572b61abd8beb59dff8300d3d290e9cea1 | |
parent | unsigned char for ctype (diff) | |
download | wireguard-openbsd-8a2d84923a2b8b64b88bb1d4b20c2b67a08414ef.tar.xz wireguard-openbsd-8a2d84923a2b8b64b88bb1d4b20c2b67a08414ef.zip |
Add 'struct drm_i915_gem_objects_ops' and use it; reduces diffs with Linux.
-rw-r--r-- | sys/dev/pci/drm/i915/i915_drv.h | 29 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915/i915_gem.c | 26 |
2 files changed, 36 insertions, 19 deletions
diff --git a/sys/dev/pci/drm/i915/i915_drv.h b/sys/dev/pci/drm/i915/i915_drv.h index 85d32f649c2..3b66eeddf0b 100644 --- a/sys/dev/pci/drm/i915/i915_drv.h +++ b/sys/dev/pci/drm/i915/i915_drv.h @@ -1,4 +1,4 @@ -/* $OpenBSD: i915_drv.h,v 1.37 2013/11/20 02:03:52 jsg Exp $ */ +/* $OpenBSD: i915_drv.h,v 1.38 2013/11/27 20:13:30 kettenis Exp $ */ /* i915_drv.h -- Private header for the I915 driver -*- linux-c -*- */ /* @@ -852,6 +852,24 @@ enum i915_cache_level { I915_CACHE_LLC_MLC, /* gen6+ */ }; +struct drm_i915_gem_object_ops { + /* Interface between the GEM object and its backing storage. + * get_pages() is called once prior to the use of the associated set + * of pages before to binding them into the GTT, and put_pages() is + * called after we no longer need them. As we expect there to be + * associated cost with migrating pages between the backing storage + * and making them available for the GPU (e.g. clflush), we may hold + * onto the pages after they are no longer referenced by the GPU + * in case they may be used again shortly (for example migrating the + * pages to a different memory domain within the GTT). put_pages() + * will therefore most likely be called when the object itself is + * being released or under memory pressure (where we attempt to + * reap pages for the shrinker). + */ + int (*get_pages)(struct drm_i915_gem_object *); + void (*put_pages)(struct drm_i915_gem_object *); +}; + struct inteldrm_file { struct drm_file file_priv; struct { @@ -896,6 +914,8 @@ struct inteldrm_file { struct drm_i915_gem_object { struct drm_obj base; + const struct drm_i915_gem_object_ops *ops; + /** Current space allocated to this object in the GTT, if any. */ struct drm_mm_node *gtt_space; struct list_head gtt_list; @@ -1126,7 +1146,6 @@ int i915_gem_set_caching_ioctl(struct drm_device *, void *, /* GEM memory manager functions */ int i915_gem_init_object(struct drm_obj *); -void i915_gem_object_init(struct drm_i915_gem_object *); void i915_gem_free_object(struct drm_obj *); int i915_gem_object_pin(struct drm_i915_gem_object *, uint32_t, bool, bool); void i915_gem_object_unpin(struct drm_i915_gem_object *); @@ -1258,8 +1277,10 @@ static inline bool intel_gmbus_is_forced_bit(struct i2c_controller *i2c) /* i915_gem.c */ int i915_gem_fault(struct drm_obj *, struct uvm_faultinfo *, off_t, vaddr_t, vm_page_t *, int, int, vm_prot_t, int ); -struct drm_i915_gem_object * - i915_gem_alloc_object(struct drm_device *, size_t); +void i915_gem_object_init(struct drm_i915_gem_object *obj, + const struct drm_i915_gem_object_ops *ops); +struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, + size_t size); int i915_gpu_idle(struct drm_device *); void i915_gem_object_move_to_flushing(struct drm_i915_gem_object *); int i915_gem_object_get_fence(struct drm_i915_gem_object *); diff --git a/sys/dev/pci/drm/i915/i915_gem.c b/sys/dev/pci/drm/i915/i915_gem.c index 794b9db8f9c..cc130b42a4f 100644 --- a/sys/dev/pci/drm/i915/i915_gem.c +++ b/sys/dev/pci/drm/i915/i915_gem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: i915_gem.c,v 1.46 2013/11/20 02:03:52 jsg Exp $ */ +/* $OpenBSD: i915_gem.c,v 1.47 2013/11/27 20:13:30 kettenis Exp $ */ /* * Copyright (c) 2008-2009 Owain G. Ainsworth <oga@openbsd.org> * @@ -1719,9 +1719,7 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) static int i915_gem_object_put_pages(struct drm_i915_gem_object *obj) { -#if 0 const struct drm_i915_gem_object_ops *ops = obj->ops; -#endif if (obj->pages == NULL) return 0; @@ -1736,11 +1734,7 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj) * lists early. */ list_del(&obj->gtt_list); -#if 0 ops->put_pages(obj); -#else - i915_gem_object_put_pages_gtt(obj); -#endif obj->pages = NULL; if (i915_gem_object_is_purgeable(obj)) @@ -1924,9 +1918,7 @@ int i915_gem_object_get_pages(struct drm_i915_gem_object *obj) { struct drm_i915_private *dev_priv = obj->base.dev->dev_private; -#if 0 const struct drm_i915_gem_object_ops *ops = obj->ops; -#endif int ret; if (obj->pages) @@ -1934,11 +1926,7 @@ i915_gem_object_get_pages(struct drm_i915_gem_object *obj) BUG_ON(obj->pages_pin_count); -#if 0 ret = ops->get_pages(obj); -#else - ret = i915_gem_object_get_pages_gtt(obj); -#endif if (ret) return ret; @@ -3763,13 +3751,16 @@ unlock: return ret; } -void i915_gem_object_init(struct drm_i915_gem_object *obj) +void i915_gem_object_init(struct drm_i915_gem_object *obj, + const struct drm_i915_gem_object_ops *ops) { INIT_LIST_HEAD(&obj->mm_list); INIT_LIST_HEAD(&obj->gtt_list); INIT_LIST_HEAD(&obj->ring_list); INIT_LIST_HEAD(&obj->exec_list); + obj->ops = ops; + obj->fence_reg = I915_FENCE_REG_NONE; obj->madv = I915_MADV_WILLNEED; /* Avoid an unnecessary call to unbind on the first bind. */ @@ -3778,6 +3769,11 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj) i915_gem_info_add_obj(obj->base.dev->dev_private, obj->base.size); } +static const struct drm_i915_gem_object_ops i915_gem_object_ops = { + .get_pages = i915_gem_object_get_pages_gtt, + .put_pages = i915_gem_object_put_pages_gtt, +}; + struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, size_t size) { @@ -3792,7 +3788,7 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, return NULL; } - i915_gem_object_init(obj); + i915_gem_object_init(obj, &i915_gem_object_ops); obj->base.write_domain = I915_GEM_DOMAIN_CPU; obj->base.read_domains = I915_GEM_DOMAIN_CPU; |