File linux-2.6.31-drm-mem-info.patch of Package kernel

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index fe23f29..d76f167 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -4,6 +4,10 @@
 
 ccflags-y := -Iinclude/drm
 
+ifeq ($(CONFIG_DRM_PSB),y)
+	ccflags-y += -Idrivers/gpu/drm/psb
+endif
+
 drm-y       :=	drm_auth.o drm_bufs.o drm_cache.o \
 		drm_context.o drm_dma.o drm_drawable.o \
 		drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
diff --git a/drivers/gpu/drm/drm_info.c b/drivers/gpu/drm/drm_info.c
index f0f6c6b..0ecc778 100644
--- a/drivers/gpu/drm/drm_info.c
+++ b/drivers/gpu/drm/drm_info.c
@@ -36,6 +36,10 @@
 #include <linux/seq_file.h>
 #include "drmP.h"
 
+#ifdef CONFIG_DRM_PSB
+#include "psb/psb_drv.h"
+#endif
+
 /**
  * Called when "/proc/dri/.../name" is read.
  *
@@ -211,6 +215,33 @@ int drm_vblank_info(struct seq_file *m, void *data)
 	return 0;
 }
 
+int drm_gem_object_mem_info(int id, void *ptr, void *data)
+{
+	struct drm_gem_object *obj = ptr;
+	struct seq_file *m = data;
+
+	seq_printf(m, "object 0x%p    name %2d    memory %8zd\n", 
+		   obj, obj->name, obj->size);
+
+	return 0;
+}
+
+int drm_gem_clients_info(struct seq_file *m, void *data)
+{
+	struct drm_info_node *node = (struct drm_info_node *) m->private;
+	struct drm_device *dev = node->minor->dev;
+	struct drm_file *priv;
+
+	mutex_lock(&dev->struct_mutex);
+	list_for_each_entry(priv, &dev->filelist, lhead) {
+		seq_printf(m, "pid %5d \n", priv->pid);
+		idr_for_each(&priv->object_idr, &drm_gem_object_mem_info, m);
+		seq_printf(m, "\n");
+	}
+	mutex_unlock(&dev->struct_mutex);
+	return 0;
+}
+
 /**
  * Called when "/proc/dri/.../clients" is read.
  *
@@ -273,6 +304,33 @@ int drm_gem_object_info(struct seq_file *m, void* data)
 	return 0;
 }
 
+#ifdef CONFIG_DRM_PSB
+int drm_ttm_mem_info(struct seq_file *m, void* data)
+{
+	struct drm_info_node *node = (struct drm_info_node *) m->private;
+	struct drm_device *dev = node->minor->dev;
+
+	if (!strncmp("psb", dev->devname, 3)) {
+		struct ttm_bo_device *bdev = &psb_priv(dev)->bdev;
+		struct ttm_mem_global *glob = bdev->mem_glob;
+
+		spin_lock(&glob->lock);
+		seq_printf(m, "used memory %llu \n", glob->used_memory);
+		seq_printf(m, "used total memory %llu \n", glob->used_total_memory);
+		spin_unlock(&glob->lock);
+	} else {
+		seq_printf(m, "This is not a PSB device, no ttm mem info available\n");
+	}
+	return 0;
+}
+#else
+int drm_ttm_mem_info(struct seq_file *m, void* data)
+{
+	seq_printf(m, "ttm is not used\n");
+	return 0;
+}
+#endif
+
 #if DRM_DEBUG_CODE
 
 int drm_vma_info(struct seq_file *m, void *data)
diff --git a/drivers/gpu/drm/drm_proc.c b/drivers/gpu/drm/drm_proc.c
index bbd4b3d..26e64ec 100644
--- a/drivers/gpu/drm/drm_proc.c
+++ b/drivers/gpu/drm/drm_proc.c
@@ -55,6 +55,8 @@ static struct drm_info_list drm_proc_list[] = {
 	{"bufs", drm_bufs_info, 0},
 	{"gem_names", drm_gem_name_info, DRIVER_GEM},
 	{"gem_objects", drm_gem_object_info, DRIVER_GEM},
+	{"gem_clients", drm_gem_clients_info, DRIVER_GEM},
+	{"ttm_meminfo", drm_ttm_mem_info, 0},
 #if DRM_DEBUG_CODE
 	{"vma", drm_vma_info, 0},
 #endif
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 45b67d9..a4470f4 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1354,6 +1354,8 @@ extern int drm_vblank_info(struct seq_file *m, void *data);
 extern int drm_clients_info(struct seq_file *m, void* data);
 extern int drm_gem_name_info(struct seq_file *m, void *data);
 extern int drm_gem_object_info(struct seq_file *m, void* data);
+extern int drm_gem_clients_info(struct seq_file *m, void *data);
+extern int drm_ttm_mem_info(struct seq_file *m, void* data);
 
 #if DRM_DEBUG_CODE
 extern int drm_vma_info(struct seq_file *m, void *data);
openSUSE Build Service is sponsored by