All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Zimmermann <tzimmermann-l3A5Bk7waGM@public.gmane.org>
To: christian.koenig-5C7GfCeVMHo@public.gmane.org,
	ray.huang-5C7GfCeVMHo@public.gmane.org,
	Jerry.Zhang-5C7GfCeVMHo@public.gmane.org,
	alexander.deucher-5C7GfCeVMHo@public.gmane.org,
	David1.Zhou-5C7GfCeVMHo@public.gmane.org,
	airlied-cv59FeDIM0c@public.gmane.org,
	kraxel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
	bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
	syeh-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org,
	z.liuxinliang-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org,
	zourongrong-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	kong.kongxinwei-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org,
	puck.chen-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org
Cc: Thomas Zimmermann <tzimmermann-l3A5Bk7waGM@public.gmane.org>,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: [PATCH 16/18] drm/ttm: Implement struct ttm_global_item and helpers
Date: Fri, 19 Oct 2018 10:54:21 +0200	[thread overview]
Message-ID: <20181019085423.28159-17-tzimmermann@suse.de> (raw)
In-Reply-To: <20181019085423.28159-1-tzimmermann-l3A5Bk7waGM@public.gmane.org>

The data structure struct ttm_global_item is a replacement for struct
drm_global_item. While struct drm_global_item depends on global data
instances, struct ttm_global_item allows drivers to use their own privat
instances.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/ttm/ttm_global.c | 98 ++++++++++++++++++++++++++++++++
 include/drm/ttm/ttm_global.h     | 22 +++++++
 2 files changed, 120 insertions(+)

diff --git a/drivers/gpu/drm/ttm/ttm_global.c b/drivers/gpu/drm/ttm/ttm_global.c
index ca9da0a46147..1e5c2f5eeca0 100644
--- a/drivers/gpu/drm/ttm/ttm_global.c
+++ b/drivers/gpu/drm/ttm/ttm_global.c
@@ -31,6 +31,104 @@
 #include <drm/ttm/ttm_memory.h>
 #include <linux/kernel.h>
 
+/*
+ * struct ttm_global_item
+ */
+
+struct ttm_global_item {
+	struct mutex mutex;
+	void *object;
+	int refcount;
+};
+
+#define TTM_GLOBAL_ITEM_INIT(name_) { \
+	.mutex = __MUTEX_INITIALIZER(name_.mutex), \
+	.object = NULL, \
+	.refcount = 0 }
+
+#define DEFINE_TTM_GLOBAL_ITEM_ARRAY(name_) \
+	struct ttm_global_item name_[TTM_NUM_GLOBAL_TYPES] = { \
+		[0] = TTM_GLOBAL_ITEM_INIT(name_[0]), \
+		[1] = TTM_GLOBAL_ITEM_INIT(name_[0]) \
+	}
+
+/**
+ * ttm_global_item_ref - Initialize and acquire reference to a global TTM item
+ *
+ * @items: Array of global TTM items
+ * @ref: Object for initialization
+ * @return Zero on success, or a negative error code otherwise.
+ *
+ * This initializes a TTM item by allocating memory and calling the
+ * .init() hook. Further calls will increase the reference count for
+ * that item.
+ */
+static int ttm_global_item_ref(
+	struct ttm_global_item items[TTM_NUM_GLOBAL_TYPES],
+	struct ttm_global_ref *ref)
+{
+	struct ttm_global_item *item = &items[ref->global_type];
+	int ret = 0;
+
+	mutex_lock(&item->mutex);
+	if (item->refcount == 0) {
+		ref->object = kzalloc(ref->size, GFP_KERNEL);
+		if (unlikely(ref->object == NULL)) {
+			ret = -ENOMEM;
+			goto error_mutex_unlock;
+		}
+		ret = ref->init(ref);
+		if (unlikely(ret != 0))
+			goto error_kfree;
+
+		item->object = ref->object;
+	} else {
+		ref->object = item->object;
+	}
+
+	++item->refcount;
+	mutex_unlock(&item->mutex);
+
+	return 0;
+
+error_kfree:
+	kfree(ref->object);
+	ref->object = NULL;
+error_mutex_unlock:
+	mutex_unlock(&item->mutex);
+	return ret;
+}
+
+/**
+ * ttm_global_item_unref - Drop reference to global TTM item
+ *
+ * @items: Array of global TTM items
+ * @ref: Object being removed
+ *
+ * Drops a reference to the global TTM item and eventually call the
+ * release() hook. The allocated object should be dropped in the
+ * release() hook or before calling this function
+ */
+static void ttm_global_item_unref(
+	struct ttm_global_item items[TTM_NUM_GLOBAL_TYPES],
+	struct ttm_global_ref *ref)
+{
+	struct ttm_global_item *item = &items[ref->global_type];
+
+	mutex_lock(&item->mutex);
+	BUG_ON(item->refcount == 0);
+	BUG_ON(ref->object != item->object);
+	if (--item->refcount == 0) {
+		ref->release(ref);
+		item->object = NULL;
+	}
+	mutex_unlock(&item->mutex);
+}
+
+/*
+ * struct ttm_global
+ */
+
 static int ttm_global_init_mem(struct drm_global_reference *ref)
 {
 	BUG_ON(!ref->object);
diff --git a/include/drm/ttm/ttm_global.h b/include/drm/ttm/ttm_global.h
index 06e791499f87..9aa0ddbbe2ef 100644
--- a/include/drm/ttm/ttm_global.h
+++ b/include/drm/ttm/ttm_global.h
@@ -29,6 +29,28 @@
 #define _TTM_GLOBAL_H_
 
 #include <drm/drm_global.h>
+#include <linux/mutex.h>
+#include <linux/types.h>
+
+/**
+ * enum ttm_global_types - Enumerates types of global TTM state
+ */
+enum ttm_global_types {
+	TTM_GLOBAL_MEM = 0,
+	TTM_GLOBAL_BO,
+	TTM_NUM_GLOBAL_TYPES
+};
+
+/**
+ * struct ttm_global_ref - References global TTM item
+ */
+struct ttm_global_ref {
+	enum ttm_global_types global_type;
+	size_t size;
+	void *object;
+	int (*init) (struct ttm_global_ref *);
+	void (*release) (struct ttm_global_ref *);
+};
 
 struct ttm_bo_global;
 
-- 
2.19.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  parent reply	other threads:[~2018-10-19  8:54 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-19  8:54 [RFC][PATCH 00/18] Provide a nice interface for TTM global state Thomas Zimmermann
2018-10-19  8:54 ` [PATCH 01/18] drm/ttm: Provide struct ttm_global for referencing " Thomas Zimmermann
     [not found]   ` <20181019085423.28159-2-tzimmermann-l3A5Bk7waGM@public.gmane.org>
2018-10-19  9:30     ` Christian König
2018-10-19  9:41       ` Thomas Zimmermann
     [not found]         ` <616760d1-6598-9769-f058-54777e55b392-l3A5Bk7waGM@public.gmane.org>
2018-10-19  9:45           ` Koenig, Christian
2018-10-19  8:54 ` [PATCH 03/18] drm/radeon: Replace TTM initialization/release with ttm_global Thomas Zimmermann
2018-10-19  8:54 ` [PATCH 04/18] drm/ast: " Thomas Zimmermann
2018-10-19  8:54 ` [PATCH 07/18] drm/hisilicon: " Thomas Zimmermann
     [not found] ` <20181019085423.28159-1-tzimmermann-l3A5Bk7waGM@public.gmane.org>
2018-10-19  8:54   ` [PATCH 02/18] drm/amdgpu: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 05/18] drm/bochs: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 06/18] drm/cirrus: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 08/18] drm/mgag200: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 09/18] drm/nouveau: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 10/18] drm/qlx: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 11/18] drm/virtio: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 12/18] drm/vmwgfx: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 13/18] staging/vboxvideo: " Thomas Zimmermann
2018-10-19  8:54   ` [PATCH 15/18] drm: Remove DRM_GLOBAL_TTM_OBJECT Thomas Zimmermann
2018-10-19  8:54   ` Thomas Zimmermann [this message]
2018-10-19  8:54   ` [PATCH 18/18] drm: Remove drm_global.{c,h} Thomas Zimmermann
2018-10-19  8:54 ` [PATCH 14/18] drm/ttm: Remove struct ttm_bo_global_ref and helpers Thomas Zimmermann
2018-10-19  8:54 ` [PATCH 17/18] drm/ttm: Implement struct ttm_global with struct ttm_global_ref Thomas Zimmermann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181019085423.28159-17-tzimmermann@suse.de \
    --to=tzimmermann-l3a5bk7wagm@public.gmane.org \
    --cc=David1.Zhou-5C7GfCeVMHo@public.gmane.org \
    --cc=Jerry.Zhang-5C7GfCeVMHo@public.gmane.org \
    --cc=airlied-cv59FeDIM0c@public.gmane.org \
    --cc=alexander.deucher-5C7GfCeVMHo@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=christian.koenig-5C7GfCeVMHo@public.gmane.org \
    --cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=kong.kongxinwei-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org \
    --cc=kraxel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=puck.chen-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org \
    --cc=ray.huang-5C7GfCeVMHo@public.gmane.org \
    --cc=syeh-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org \
    --cc=z.liuxinliang-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org \
    --cc=zourongrong-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.