Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba4420c2 authored by Dave Airlie's avatar Dave Airlie
Browse files

drm: move ttm global code to core drm



I wrote this for the prime sharing work, but I also noticed other external
non-upstream drivers from a large company carrying a similiar patch, so I
may as well ship it in master.

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 2581afcc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \
		drm_platform.o drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \
		drm_crtc.o drm_modes.o drm_edid.o \
		drm_info.o drm_debugfs.o drm_encoder_slave.o \
		drm_trace_points.o
		drm_trace_points.o drm_global.o

drm-$(CONFIG_COMPAT) += drm_ioc32.o

+1 −0
Original line number Diff line number Diff line
@@ -288,6 +288,7 @@ static int __init drm_core_init(void)
{
	int ret = -ENOMEM;

	drm_global_init();
	idr_init(&drm_minors_idr);

	if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))
+15 −15
Original line number Diff line number Diff line
@@ -28,45 +28,45 @@
 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
 */

#include "ttm/ttm_module.h"
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/module.h>
#include "drm_global.h"

struct ttm_global_item {
struct drm_global_item {
	struct mutex mutex;
	void *object;
	int refcount;
};

static struct ttm_global_item glob[TTM_GLOBAL_NUM];
static struct drm_global_item glob[DRM_GLOBAL_NUM];

void ttm_global_init(void)
void drm_global_init(void)
{
	int i;

	for (i = 0; i < TTM_GLOBAL_NUM; ++i) {
		struct ttm_global_item *item = &glob[i];
	for (i = 0; i < DRM_GLOBAL_NUM; ++i) {
		struct drm_global_item *item = &glob[i];
		mutex_init(&item->mutex);
		item->object = NULL;
		item->refcount = 0;
	}
}

void ttm_global_release(void)
void drm_global_release(void)
{
	int i;
	for (i = 0; i < TTM_GLOBAL_NUM; ++i) {
		struct ttm_global_item *item = &glob[i];
	for (i = 0; i < DRM_GLOBAL_NUM; ++i) {
		struct drm_global_item *item = &glob[i];
		BUG_ON(item->object != NULL);
		BUG_ON(item->refcount != 0);
	}
}

int ttm_global_item_ref(struct ttm_global_reference *ref)
int drm_global_item_ref(struct drm_global_reference *ref)
{
	int ret;
	struct ttm_global_item *item = &glob[ref->global_type];
	struct drm_global_item *item = &glob[ref->global_type];
	void *object;

	mutex_lock(&item->mutex);
@@ -93,11 +93,11 @@ int ttm_global_item_ref(struct ttm_global_reference *ref)
	item->object = NULL;
	return ret;
}
EXPORT_SYMBOL(ttm_global_item_ref);
EXPORT_SYMBOL(drm_global_item_ref);

void ttm_global_item_unref(struct ttm_global_reference *ref)
void drm_global_item_unref(struct drm_global_reference *ref)
{
	struct ttm_global_item *item = &glob[ref->global_type];
	struct drm_global_item *item = &glob[ref->global_type];

	mutex_lock(&item->mutex);
	BUG_ON(item->refcount == 0);
@@ -108,5 +108,5 @@ void ttm_global_item_unref(struct ttm_global_reference *ref)
	}
	mutex_unlock(&item->mutex);
}
EXPORT_SYMBOL(ttm_global_item_unref);
EXPORT_SYMBOL(drm_global_item_unref);
+1 −1
Original line number Diff line number Diff line
@@ -533,7 +533,7 @@ struct drm_nouveau_private {
	struct list_head vbl_waiting;

	struct {
		struct ttm_global_reference mem_global_ref;
		struct drm_global_reference mem_global_ref;
		struct ttm_bo_global_ref bo_global_ref;
		struct ttm_bo_device bdev;
		spinlock_t bo_list_lock;
+10 −10
Original line number Diff line number Diff line
@@ -42,13 +42,13 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
}

static int
nouveau_ttm_mem_global_init(struct ttm_global_reference *ref)
nouveau_ttm_mem_global_init(struct drm_global_reference *ref)
{
	return ttm_mem_global_init(ref->object);
}

static void
nouveau_ttm_mem_global_release(struct ttm_global_reference *ref)
nouveau_ttm_mem_global_release(struct drm_global_reference *ref)
{
	ttm_mem_global_release(ref->object);
}
@@ -56,16 +56,16 @@ nouveau_ttm_mem_global_release(struct ttm_global_reference *ref)
int
nouveau_ttm_global_init(struct drm_nouveau_private *dev_priv)
{
	struct ttm_global_reference *global_ref;
	struct drm_global_reference *global_ref;
	int ret;

	global_ref = &dev_priv->ttm.mem_global_ref;
	global_ref->global_type = TTM_GLOBAL_TTM_MEM;
	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
	global_ref->size = sizeof(struct ttm_mem_global);
	global_ref->init = &nouveau_ttm_mem_global_init;
	global_ref->release = &nouveau_ttm_mem_global_release;

	ret = ttm_global_item_ref(global_ref);
	ret = drm_global_item_ref(global_ref);
	if (unlikely(ret != 0)) {
		DRM_ERROR("Failed setting up TTM memory accounting\n");
		dev_priv->ttm.mem_global_ref.release = NULL;
@@ -74,15 +74,15 @@ nouveau_ttm_global_init(struct drm_nouveau_private *dev_priv)

	dev_priv->ttm.bo_global_ref.mem_glob = global_ref->object;
	global_ref = &dev_priv->ttm.bo_global_ref.ref;
	global_ref->global_type = TTM_GLOBAL_TTM_BO;
	global_ref->global_type = DRM_GLOBAL_TTM_BO;
	global_ref->size = sizeof(struct ttm_bo_global);
	global_ref->init = &ttm_bo_global_init;
	global_ref->release = &ttm_bo_global_release;

	ret = ttm_global_item_ref(global_ref);
	ret = drm_global_item_ref(global_ref);
	if (unlikely(ret != 0)) {
		DRM_ERROR("Failed setting up TTM BO subsystem\n");
		ttm_global_item_unref(&dev_priv->ttm.mem_global_ref);
		drm_global_item_unref(&dev_priv->ttm.mem_global_ref);
		dev_priv->ttm.mem_global_ref.release = NULL;
		return ret;
	}
@@ -96,8 +96,8 @@ nouveau_ttm_global_release(struct drm_nouveau_private *dev_priv)
	if (dev_priv->ttm.mem_global_ref.release == NULL)
		return;

	ttm_global_item_unref(&dev_priv->ttm.bo_global_ref.ref);
	ttm_global_item_unref(&dev_priv->ttm.mem_global_ref);
	drm_global_item_unref(&dev_priv->ttm.bo_global_ref.ref);
	drm_global_item_unref(&dev_priv->ttm.mem_global_ref);
	dev_priv->ttm.mem_global_ref.release = NULL;
}
Loading