diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/Makefile.kernel | 2 | ||||
| -rw-r--r-- | linux-core/i915_gem.c | 257 | ||||
| -rw-r--r-- | linux-core/i915_gem_proc.c | 290 | 
3 files changed, 291 insertions, 258 deletions
diff --git a/linux-core/Makefile.kernel b/linux-core/Makefile.kernel index abfad0a1..dcac5f1b 100644 --- a/linux-core/Makefile.kernel +++ b/linux-core/Makefile.kernel @@ -21,7 +21,7 @@ mga-objs    := mga_drv.o mga_dma.o mga_state.o mga_warp.o mga_irq.o  i810-objs   := i810_drv.o i810_dma.o  i915-objs   := i915_drv.o i915_dma.o i915_irq.o i915_mem.o i915_fence.o \  		i915_buffer.o i915_compat.o i915_execbuf.o \ -		i915_gem.o i915_gem_tiling.o +		i915_gem.o i915_gem_proc.o i915_gem_tiling.o  nouveau-objs := nouveau_drv.o nouveau_state.o nouveau_fifo.o nouveau_mem.o \  		nouveau_object.o nouveau_irq.o nouveau_notifier.o nouveau_swmthd.o \  		nouveau_sgdma.o nouveau_dma.o nouveau_bo.o nouveau_fence.o \ diff --git a/linux-core/i915_gem.c b/linux-core/i915_gem.c index b4c478f5..c5c68af9 100644 --- a/linux-core/i915_gem.c +++ b/linux-core/i915_gem.c @@ -2492,263 +2492,6 @@ i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,  	return 0;  } -static int i915_gem_active_info(char *buf, char **start, off_t offset, -				int request, int *eof, void *data) -{ -	struct drm_minor *minor = (struct drm_minor *) data;  -	struct drm_device *dev = minor->dev; -	drm_i915_private_t *dev_priv = dev->dev_private; -	struct drm_i915_gem_object *obj_priv; -	int len = 0; - -	if (offset > DRM_PROC_LIMIT) { -		*eof = 1; -		return 0; -	} - -	*start = &buf[offset]; -	*eof = 0; -	DRM_PROC_PRINT("Active:\n"); -	list_for_each_entry(obj_priv, &dev_priv->mm.active_list, -			    list) -	{ -		struct drm_gem_object *obj = obj_priv->obj; -		if (obj->name) { -			DRM_PROC_PRINT("    %p(%d): %08x %08x %d\n", -				       obj, obj->name, -				       obj->read_domains, obj->write_domain, -				       obj_priv->last_rendering_seqno); -		} else { -			DRM_PROC_PRINT("       %p: %08x %08x %d\n", -				       obj, -				       obj->read_domains, obj->write_domain, -				       obj_priv->last_rendering_seqno); -		} -	} -	if (len > request + offset) -		return request; -	*eof = 1; -	return len - offset; -} - -static int i915_gem_flushing_info(char *buf, char **start, off_t offset, -				  int request, int *eof, void *data) -{ -	struct drm_minor *minor = (struct drm_minor *) data;  -	struct drm_device *dev = minor->dev; -	drm_i915_private_t *dev_priv = dev->dev_private; -	struct drm_i915_gem_object *obj_priv; -	int len = 0; - -	if (offset > DRM_PROC_LIMIT) { -		*eof = 1; -		return 0; -	} - -	*start = &buf[offset]; -	*eof = 0; -	DRM_PROC_PRINT("Flushing:\n"); -	list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list, -			    list) -	{ -		struct drm_gem_object *obj = obj_priv->obj; -		if (obj->name) { -			DRM_PROC_PRINT("    %p(%d): %08x %08x %d\n", -				       obj, obj->name, -				       obj->read_domains, obj->write_domain, -				       obj_priv->last_rendering_seqno); -		} else { -			DRM_PROC_PRINT("       %p: %08x %08x %d\n", obj, -				       obj->read_domains, obj->write_domain, -				       obj_priv->last_rendering_seqno); -		} -	} -	if (len > request + offset) -		return request; -	*eof = 1; -	return len - offset; -} - -static int i915_gem_inactive_info(char *buf, char **start, off_t offset, -				  int request, int *eof, void *data) -{ -	struct drm_minor *minor = (struct drm_minor *) data;  -	struct drm_device *dev = minor->dev; -	drm_i915_private_t *dev_priv = dev->dev_private; -	struct drm_i915_gem_object *obj_priv; -	int len = 0; - -	if (offset > DRM_PROC_LIMIT) { -		*eof = 1; -		return 0; -	} - -	*start = &buf[offset]; -	*eof = 0; -	DRM_PROC_PRINT("Inactive:\n"); -	list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, -			    list) -	{ -		struct drm_gem_object *obj = obj_priv->obj; -		if (obj->name) { -			DRM_PROC_PRINT("    %p(%d): %08x %08x %d\n", -				       obj, obj->name, -				       obj->read_domains, obj->write_domain, -				       obj_priv->last_rendering_seqno); -		} else { -			DRM_PROC_PRINT("       %p: %08x %08x %d\n", obj, -				       obj->read_domains, obj->write_domain, -				       obj_priv->last_rendering_seqno); -		} -	} -	if (len > request + offset) -		return request; -	*eof = 1; -	return len - offset; -} - -static int i915_gem_request_info(char *buf, char **start, off_t offset, -				 int request, int *eof, void *data) -{ -	struct drm_minor *minor = (struct drm_minor *) data;  -	struct drm_device *dev = minor->dev; -	drm_i915_private_t *dev_priv = dev->dev_private; -	struct drm_i915_gem_request *gem_request; -	int len = 0; - -	if (offset > DRM_PROC_LIMIT) { -		*eof = 1; -		return 0; -	} - -	*start = &buf[offset]; -	*eof = 0; -	DRM_PROC_PRINT("Request:\n"); -	list_for_each_entry(gem_request, &dev_priv->mm.request_list, -			    list) -	{ -		DRM_PROC_PRINT ("    %d @ %d %08x\n", -				gem_request->seqno, -				(int) (jiffies - gem_request->emitted_jiffies), -				gem_request->flush_domains); -	} -	if (len > request + offset) -		return request; -	*eof = 1; -	return len - offset; -} - -static int i915_gem_seqno_info(char *buf, char **start, off_t offset, -			       int request, int *eof, void *data) -{ -	struct drm_minor *minor = (struct drm_minor *) data;  -	struct drm_device *dev = minor->dev; -	drm_i915_private_t *dev_priv = dev->dev_private; -	int len = 0; - -	if (offset > DRM_PROC_LIMIT) { -		*eof = 1; -		return 0; -	} - -	*start = &buf[offset]; -	*eof = 0; -	DRM_PROC_PRINT("Current sequence: %d\n", i915_get_gem_seqno(dev)); -	DRM_PROC_PRINT("Waiter sequence:  %d\n", dev_priv->mm.waiting_gem_seqno); -	DRM_PROC_PRINT("IRQ sequence:     %d\n", dev_priv->mm.irq_gem_seqno); -	if (len > request + offset) -		return request; -	*eof = 1; -	return len - offset; -} - - -static int i915_interrupt_info(char *buf, char **start, off_t offset, -			       int request, int *eof, void *data) -{ -	struct drm_minor *minor = (struct drm_minor *) data;  -	struct drm_device *dev = minor->dev; -	drm_i915_private_t *dev_priv = dev->dev_private; -	int len = 0; - -	if (offset > DRM_PROC_LIMIT) { -		*eof = 1; -		return 0; -	} - -	*start = &buf[offset]; -	*eof = 0; -	DRM_PROC_PRINT("Interrupt enable:    %08x\n", -		       I915_READ(I915REG_INT_ENABLE_R)); -	DRM_PROC_PRINT("Interrupt identity:  %08x\n", -		       I915_READ(I915REG_INT_IDENTITY_R)); -	DRM_PROC_PRINT("Interrupt mask:      %08x\n", -		       I915_READ(I915REG_INT_MASK_R)); -	DRM_PROC_PRINT("Pipe A stat:         %08x\n", -		       I915_READ(I915REG_PIPEASTAT)); -	DRM_PROC_PRINT("Pipe B stat:         %08x\n", -		       I915_READ(I915REG_PIPEBSTAT)); -	DRM_PROC_PRINT("Interrupts received: %d\n", -		       atomic_read(&dev_priv->irq_received)); -	DRM_PROC_PRINT("Current sequence:    %d\n", -		       i915_get_gem_seqno(dev)); -	DRM_PROC_PRINT("Waiter sequence:     %d\n", -		       dev_priv->mm.waiting_gem_seqno); -	DRM_PROC_PRINT("IRQ sequence:        %d\n", -		       dev_priv->mm.irq_gem_seqno); -	if (len > request + offset) -		return request; -	*eof = 1; -	return len - offset; -} - -static struct drm_proc_list { -	const char *name;	/**< file name */ -	int (*f) (char *, char **, off_t, int, int *, void *);		/**< proc callback*/ -} i915_gem_proc_list[] = { -	{"i915_gem_active", i915_gem_active_info}, -	{"i915_gem_flushing", i915_gem_flushing_info}, -	{"i915_gem_inactive", i915_gem_inactive_info}, -	{"i915_gem_request", i915_gem_request_info}, -	{"i915_gem_seqno", i915_gem_seqno_info}, -	{"i915_gem_interrupt", i915_interrupt_info}, -}; - -#define I915_GEM_PROC_ENTRIES ARRAY_SIZE(i915_gem_proc_list) - -int i915_gem_proc_init(struct drm_minor *minor) -{ -	struct proc_dir_entry *ent; -	int i, j; - -	for (i = 0; i < I915_GEM_PROC_ENTRIES; i++) { -		ent = create_proc_entry(i915_gem_proc_list[i].name, -					S_IFREG | S_IRUGO, minor->dev_root); -		if (!ent) { -			DRM_ERROR("Cannot create /proc/dri/.../%s\n", -				  i915_gem_proc_list[i].name); -			for (j = 0; j < i; j++) -				remove_proc_entry(i915_gem_proc_list[i].name, -						  minor->dev_root); -			return -1; -		} -		ent->read_proc = i915_gem_proc_list[i].f; -		ent->data = minor; -	} -	return 0; -} - -void i915_gem_proc_cleanup(struct drm_minor *minor) -{ -	int i; - -	if (!minor->dev_root) -		return; - -	for (i = 0; i < I915_GEM_PROC_ENTRIES; i++) -		remove_proc_entry(i915_gem_proc_list[i].name, minor->dev_root); -} -  void  i915_gem_lastclose(struct drm_device *dev)  { diff --git a/linux-core/i915_gem_proc.c b/linux-core/i915_gem_proc.c new file mode 100644 index 00000000..41060a4b --- /dev/null +++ b/linux-core/i915_gem_proc.c @@ -0,0 +1,290 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + *    Keith Packard <keithp@keithp.com> + * + */ + +#include "drmP.h" +#include "drm.h" +#include "drm_compat.h" +#include "i915_drm.h" +#include "i915_drv.h" + +static int i915_gem_active_info(char *buf, char **start, off_t offset, +				int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data;  +	struct drm_device *dev = minor->dev; +	drm_i915_private_t *dev_priv = dev->dev_private; +	struct drm_i915_gem_object *obj_priv; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("Active:\n"); +	list_for_each_entry(obj_priv, &dev_priv->mm.active_list, +			    list) +	{ +		struct drm_gem_object *obj = obj_priv->obj; +		if (obj->name) { +			DRM_PROC_PRINT("    %p(%d): %08x %08x %d\n", +				       obj, obj->name, +				       obj->read_domains, obj->write_domain, +				       obj_priv->last_rendering_seqno); +		} else { +			DRM_PROC_PRINT("       %p: %08x %08x %d\n", +				       obj, +				       obj->read_domains, obj->write_domain, +				       obj_priv->last_rendering_seqno); +		} +	} +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + +static int i915_gem_flushing_info(char *buf, char **start, off_t offset, +				  int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data;  +	struct drm_device *dev = minor->dev; +	drm_i915_private_t *dev_priv = dev->dev_private; +	struct drm_i915_gem_object *obj_priv; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("Flushing:\n"); +	list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list, +			    list) +	{ +		struct drm_gem_object *obj = obj_priv->obj; +		if (obj->name) { +			DRM_PROC_PRINT("    %p(%d): %08x %08x %d\n", +				       obj, obj->name, +				       obj->read_domains, obj->write_domain, +				       obj_priv->last_rendering_seqno); +		} else { +			DRM_PROC_PRINT("       %p: %08x %08x %d\n", obj, +				       obj->read_domains, obj->write_domain, +				       obj_priv->last_rendering_seqno); +		} +	} +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + +static int i915_gem_inactive_info(char *buf, char **start, off_t offset, +				  int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data;  +	struct drm_device *dev = minor->dev; +	drm_i915_private_t *dev_priv = dev->dev_private; +	struct drm_i915_gem_object *obj_priv; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("Inactive:\n"); +	list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, +			    list) +	{ +		struct drm_gem_object *obj = obj_priv->obj; +		if (obj->name) { +			DRM_PROC_PRINT("    %p(%d): %08x %08x %d\n", +				       obj, obj->name, +				       obj->read_domains, obj->write_domain, +				       obj_priv->last_rendering_seqno); +		} else { +			DRM_PROC_PRINT("       %p: %08x %08x %d\n", obj, +				       obj->read_domains, obj->write_domain, +				       obj_priv->last_rendering_seqno); +		} +	} +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + +static int i915_gem_request_info(char *buf, char **start, off_t offset, +				 int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data;  +	struct drm_device *dev = minor->dev; +	drm_i915_private_t *dev_priv = dev->dev_private; +	struct drm_i915_gem_request *gem_request; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("Request:\n"); +	list_for_each_entry(gem_request, &dev_priv->mm.request_list, +			    list) +	{ +		DRM_PROC_PRINT ("    %d @ %d %08x\n", +				gem_request->seqno, +				(int) (jiffies - gem_request->emitted_jiffies), +				gem_request->flush_domains); +	} +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + +static int i915_gem_seqno_info(char *buf, char **start, off_t offset, +			       int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data;  +	struct drm_device *dev = minor->dev; +	drm_i915_private_t *dev_priv = dev->dev_private; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("Current sequence: %d\n", i915_get_gem_seqno(dev)); +	DRM_PROC_PRINT("Waiter sequence:  %d\n", dev_priv->mm.waiting_gem_seqno); +	DRM_PROC_PRINT("IRQ sequence:     %d\n", dev_priv->mm.irq_gem_seqno); +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + + +static int i915_interrupt_info(char *buf, char **start, off_t offset, +			       int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data;  +	struct drm_device *dev = minor->dev; +	drm_i915_private_t *dev_priv = dev->dev_private; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("Interrupt enable:    %08x\n", +		       I915_READ(I915REG_INT_ENABLE_R)); +	DRM_PROC_PRINT("Interrupt identity:  %08x\n", +		       I915_READ(I915REG_INT_IDENTITY_R)); +	DRM_PROC_PRINT("Interrupt mask:      %08x\n", +		       I915_READ(I915REG_INT_MASK_R)); +	DRM_PROC_PRINT("Pipe A stat:         %08x\n", +		       I915_READ(I915REG_PIPEASTAT)); +	DRM_PROC_PRINT("Pipe B stat:         %08x\n", +		       I915_READ(I915REG_PIPEBSTAT)); +	DRM_PROC_PRINT("Interrupts received: %d\n", +		       atomic_read(&dev_priv->irq_received)); +	DRM_PROC_PRINT("Current sequence:    %d\n", +		       i915_get_gem_seqno(dev)); +	DRM_PROC_PRINT("Waiter sequence:     %d\n", +		       dev_priv->mm.waiting_gem_seqno); +	DRM_PROC_PRINT("IRQ sequence:        %d\n", +		       dev_priv->mm.irq_gem_seqno); +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + +static struct drm_proc_list { +	const char *name;	/**< file name */ +	int (*f) (char *, char **, off_t, int, int *, void *);		/**< proc callback*/ +} i915_gem_proc_list[] = { +	{"i915_gem_active", i915_gem_active_info}, +	{"i915_gem_flushing", i915_gem_flushing_info}, +	{"i915_gem_inactive", i915_gem_inactive_info}, +	{"i915_gem_request", i915_gem_request_info}, +	{"i915_gem_seqno", i915_gem_seqno_info}, +	{"i915_gem_interrupt", i915_interrupt_info}, +}; + +#define I915_GEM_PROC_ENTRIES ARRAY_SIZE(i915_gem_proc_list) + +int i915_gem_proc_init(struct drm_minor *minor) +{ +	struct proc_dir_entry *ent; +	int i, j; + +	for (i = 0; i < I915_GEM_PROC_ENTRIES; i++) { +		ent = create_proc_entry(i915_gem_proc_list[i].name, +					S_IFREG | S_IRUGO, minor->dev_root); +		if (!ent) { +			DRM_ERROR("Cannot create /proc/dri/.../%s\n", +				  i915_gem_proc_list[i].name); +			for (j = 0; j < i; j++) +				remove_proc_entry(i915_gem_proc_list[i].name, +						  minor->dev_root); +			return -1; +		} +		ent->read_proc = i915_gem_proc_list[i].f; +		ent->data = minor; +	} +	return 0; +} + +void i915_gem_proc_cleanup(struct drm_minor *minor) +{ +	int i; + +	if (!minor->dev_root) +		return; + +	for (i = 0; i < I915_GEM_PROC_ENTRIES; i++) +		remove_proc_entry(i915_gem_proc_list[i].name, minor->dev_root); +}  | 
