summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2013-11-27 20:13:30 +0000
committerkettenis <kettenis@openbsd.org>2013-11-27 20:13:30 +0000
commit8a2d84923a2b8b64b88bb1d4b20c2b67a08414ef (patch)
tree186a6e572b61abd8beb59dff8300d3d290e9cea1
parentunsigned char for ctype (diff)
downloadwireguard-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.h29
-rw-r--r--sys/dev/pci/drm/i915/i915_gem.c26
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;