diff options
author | Dave Airlie <airlied@redhat.com> | 2010-07-07 04:38:44 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-07-07 04:38:44 -0400 |
commit | 102e73463e1bb921b3a829a1392a29dba16bbabd (patch) | |
tree | 8c569c1a6a7fd3ffc21cf1780bd8fa62be5b23b2 | |
parent | 5c8d7171cc4984351af802a525675d50ae555a7b (diff) | |
parent | e5510fac98a706c424034950f55bb5e819c46f51 (diff) |
Merge branch 'drm-tracepoints' into drm-testing
-rw-r--r-- | drivers/gpu/drm/Makefile | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_trace.h | 66 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_trace_points.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_trace.h | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 5 | ||||
-rw-r--r-- | include/drm/drmP.h | 2 |
7 files changed, 128 insertions, 1 deletions
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index b4b2b480d0c..df8f9232286 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile | |||
@@ -11,7 +11,8 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \ | |||
11 | drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \ | 11 | drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \ |
12 | drm_platform.o drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \ | 12 | drm_platform.o drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \ |
13 | drm_crtc.o drm_modes.o drm_edid.o \ | 13 | drm_crtc.o drm_modes.o drm_edid.o \ |
14 | drm_info.o drm_debugfs.o drm_encoder_slave.o | 14 | drm_info.o drm_debugfs.o drm_encoder_slave.o \ |
15 | drm_trace_points.o | ||
15 | 16 | ||
16 | drm-$(CONFIG_COMPAT) += drm_ioc32.o | 17 | drm-$(CONFIG_COMPAT) += drm_ioc32.o |
17 | 18 | ||
@@ -19,6 +20,8 @@ drm_kms_helper-y := drm_fb_helper.o drm_crtc_helper.o drm_dp_i2c_helper.o | |||
19 | 20 | ||
20 | obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o | 21 | obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o |
21 | 22 | ||
23 | CFLAGS_drm_trace_points.o := -I$(src) | ||
24 | |||
22 | obj-$(CONFIG_DRM) += drm.o | 25 | obj-$(CONFIG_DRM) += drm.o |
23 | obj-$(CONFIG_DRM_TTM) += ttm/ | 26 | obj-$(CONFIG_DRM_TTM) += ttm/ |
24 | obj-$(CONFIG_DRM_TDFX) += tdfx/ | 27 | obj-$(CONFIG_DRM_TDFX) += tdfx/ |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 6353b625e09..9d3a5030b6e 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -34,6 +34,7 @@ | |||
34 | */ | 34 | */ |
35 | 35 | ||
36 | #include "drmP.h" | 36 | #include "drmP.h" |
37 | #include "drm_trace.h" | ||
37 | 38 | ||
38 | #include <linux/interrupt.h> /* For task queue support */ | 39 | #include <linux/interrupt.h> /* For task queue support */ |
39 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
@@ -590,6 +591,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
590 | return -ENOMEM; | 591 | return -ENOMEM; |
591 | 592 | ||
592 | e->pipe = pipe; | 593 | e->pipe = pipe; |
594 | e->base.pid = current->pid; | ||
593 | e->event.base.type = DRM_EVENT_VBLANK; | 595 | e->event.base.type = DRM_EVENT_VBLANK; |
594 | e->event.base.length = sizeof e->event; | 596 | e->event.base.length = sizeof e->event; |
595 | e->event.user_data = vblwait->request.signal; | 597 | e->event.user_data = vblwait->request.signal; |
@@ -617,6 +619,9 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
617 | DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n", | 619 | DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n", |
618 | vblwait->request.sequence, seq, pipe); | 620 | vblwait->request.sequence, seq, pipe); |
619 | 621 | ||
622 | trace_drm_vblank_event_queued(current->pid, pipe, | ||
623 | vblwait->request.sequence); | ||
624 | |||
620 | e->event.sequence = vblwait->request.sequence; | 625 | e->event.sequence = vblwait->request.sequence; |
621 | if ((seq - vblwait->request.sequence) <= (1 << 23)) { | 626 | if ((seq - vblwait->request.sequence) <= (1 << 23)) { |
622 | e->event.tv_sec = now.tv_sec; | 627 | e->event.tv_sec = now.tv_sec; |
@@ -624,6 +629,8 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
624 | drm_vblank_put(dev, e->pipe); | 629 | drm_vblank_put(dev, e->pipe); |
625 | list_add_tail(&e->base.link, &e->base.file_priv->event_list); | 630 | list_add_tail(&e->base.link, &e->base.file_priv->event_list); |
626 | wake_up_interruptible(&e->base.file_priv->event_wait); | 631 | wake_up_interruptible(&e->base.file_priv->event_wait); |
632 | trace_drm_vblank_event_delivered(current->pid, pipe, | ||
633 | vblwait->request.sequence); | ||
627 | } else { | 634 | } else { |
628 | list_add_tail(&e->base.link, &dev->vblank_event_list); | 635 | list_add_tail(&e->base.link, &dev->vblank_event_list); |
629 | } | 636 | } |
@@ -754,9 +761,13 @@ void drm_handle_vblank_events(struct drm_device *dev, int crtc) | |||
754 | drm_vblank_put(dev, e->pipe); | 761 | drm_vblank_put(dev, e->pipe); |
755 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | 762 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); |
756 | wake_up_interruptible(&e->base.file_priv->event_wait); | 763 | wake_up_interruptible(&e->base.file_priv->event_wait); |
764 | trace_drm_vblank_event_delivered(e->base.pid, e->pipe, | ||
765 | e->event.sequence); | ||
757 | } | 766 | } |
758 | 767 | ||
759 | spin_unlock_irqrestore(&dev->event_lock, flags); | 768 | spin_unlock_irqrestore(&dev->event_lock, flags); |
769 | |||
770 | trace_drm_vblank_event(crtc, seq); | ||
760 | } | 771 | } |
761 | 772 | ||
762 | /** | 773 | /** |
diff --git a/drivers/gpu/drm/drm_trace.h b/drivers/gpu/drm/drm_trace.h new file mode 100644 index 00000000000..03ea964aa60 --- /dev/null +++ b/drivers/gpu/drm/drm_trace.h | |||
@@ -0,0 +1,66 @@ | |||
1 | #if !defined(_DRM_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) | ||
2 | #define _DRM_TRACE_H_ | ||
3 | |||
4 | #include <linux/stringify.h> | ||
5 | #include <linux/types.h> | ||
6 | #include <linux/tracepoint.h> | ||
7 | |||
8 | #undef TRACE_SYSTEM | ||
9 | #define TRACE_SYSTEM drm | ||
10 | #define TRACE_SYSTEM_STRING __stringify(TRACE_SYSTEM) | ||
11 | #define TRACE_INCLUDE_FILE drm_trace | ||
12 | |||
13 | TRACE_EVENT(drm_vblank_event, | ||
14 | TP_PROTO(int crtc, unsigned int seq), | ||
15 | TP_ARGS(crtc, seq), | ||
16 | TP_STRUCT__entry( | ||
17 | __field(int, crtc) | ||
18 | __field(unsigned int, seq) | ||
19 | ), | ||
20 | TP_fast_assign( | ||
21 | __entry->crtc = crtc; | ||
22 | __entry->seq = seq; | ||
23 | ), | ||
24 | TP_printk("crtc=%d, seq=%d", __entry->crtc, __entry->seq) | ||
25 | ); | ||
26 | |||
27 | TRACE_EVENT(drm_vblank_event_queued, | ||
28 | TP_PROTO(pid_t pid, int crtc, unsigned int seq), | ||
29 | TP_ARGS(pid, crtc, seq), | ||
30 | TP_STRUCT__entry( | ||
31 | __field(pid_t, pid) | ||
32 | __field(int, crtc) | ||
33 | __field(unsigned int, seq) | ||
34 | ), | ||
35 | TP_fast_assign( | ||
36 | __entry->pid = pid; | ||
37 | __entry->crtc = crtc; | ||
38 | __entry->seq = seq; | ||
39 | ), | ||
40 | TP_printk("pid=%d, crtc=%d, seq=%d", __entry->pid, __entry->crtc, \ | ||
41 | __entry->seq) | ||
42 | ); | ||
43 | |||
44 | TRACE_EVENT(drm_vblank_event_delivered, | ||
45 | TP_PROTO(pid_t pid, int crtc, unsigned int seq), | ||
46 | TP_ARGS(pid, crtc, seq), | ||
47 | TP_STRUCT__entry( | ||
48 | __field(pid_t, pid) | ||
49 | __field(int, crtc) | ||
50 | __field(unsigned int, seq) | ||
51 | ), | ||
52 | TP_fast_assign( | ||
53 | __entry->pid = pid; | ||
54 | __entry->crtc = crtc; | ||
55 | __entry->seq = seq; | ||
56 | ), | ||
57 | TP_printk("pid=%d, crtc=%d, seq=%d", __entry->pid, __entry->crtc, \ | ||
58 | __entry->seq) | ||
59 | ); | ||
60 | |||
61 | #endif /* _DRM_TRACE_H_ */ | ||
62 | |||
63 | /* This part must be outside protection */ | ||
64 | #undef TRACE_INCLUDE_PATH | ||
65 | #define TRACE_INCLUDE_PATH . | ||
66 | #include <trace/define_trace.h> | ||
diff --git a/drivers/gpu/drm/drm_trace_points.c b/drivers/gpu/drm/drm_trace_points.c new file mode 100644 index 00000000000..0d0eb90864a --- /dev/null +++ b/drivers/gpu/drm/drm_trace_points.c | |||
@@ -0,0 +1,4 @@ | |||
1 | #include "drmP.h" | ||
2 | |||
3 | #define CREATE_TRACE_POINTS | ||
4 | #include "drm_trace.h" | ||
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index fab21760dd5..fea97a21cc1 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h | |||
@@ -262,6 +262,42 @@ DEFINE_EVENT(i915_ring, i915_ring_wait_end, | |||
262 | TP_ARGS(dev) | 262 | TP_ARGS(dev) |
263 | ); | 263 | ); |
264 | 264 | ||
265 | TRACE_EVENT(i915_flip_request, | ||
266 | TP_PROTO(int plane, struct drm_gem_object *obj), | ||
267 | |||
268 | TP_ARGS(plane, obj), | ||
269 | |||
270 | TP_STRUCT__entry( | ||
271 | __field(int, plane) | ||
272 | __field(struct drm_gem_object *, obj) | ||
273 | ), | ||
274 | |||
275 | TP_fast_assign( | ||
276 | __entry->plane = plane; | ||
277 | __entry->obj = obj; | ||
278 | ), | ||
279 | |||
280 | TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj) | ||
281 | ); | ||
282 | |||
283 | TRACE_EVENT(i915_flip_complete, | ||
284 | TP_PROTO(int plane, struct drm_gem_object *obj), | ||
285 | |||
286 | TP_ARGS(plane, obj), | ||
287 | |||
288 | TP_STRUCT__entry( | ||
289 | __field(int, plane) | ||
290 | __field(struct drm_gem_object *, obj) | ||
291 | ), | ||
292 | |||
293 | TP_fast_assign( | ||
294 | __entry->plane = plane; | ||
295 | __entry->obj = obj; | ||
296 | ), | ||
297 | |||
298 | TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj) | ||
299 | ); | ||
300 | |||
265 | #endif /* _I915_TRACE_H_ */ | 301 | #endif /* _I915_TRACE_H_ */ |
266 | 302 | ||
267 | /* This part must be outside protection */ | 303 | /* This part must be outside protection */ |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 68dcf36e279..f879589bead 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include "intel_drv.h" | 33 | #include "intel_drv.h" |
34 | #include "i915_drm.h" | 34 | #include "i915_drm.h" |
35 | #include "i915_drv.h" | 35 | #include "i915_drv.h" |
36 | #include "i915_trace.h" | ||
36 | #include "drm_dp_helper.h" | 37 | #include "drm_dp_helper.h" |
37 | 38 | ||
38 | #include "drm_crtc_helper.h" | 39 | #include "drm_crtc_helper.h" |
@@ -4650,6 +4651,8 @@ static void do_intel_finish_page_flip(struct drm_device *dev, | |||
4650 | atomic_dec_and_test(&obj_priv->pending_flip)) | 4651 | atomic_dec_and_test(&obj_priv->pending_flip)) |
4651 | DRM_WAKEUP(&dev_priv->pending_flip_queue); | 4652 | DRM_WAKEUP(&dev_priv->pending_flip_queue); |
4652 | schedule_work(&work->work); | 4653 | schedule_work(&work->work); |
4654 | |||
4655 | trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); | ||
4653 | } | 4656 | } |
4654 | 4657 | ||
4655 | void intel_finish_page_flip(struct drm_device *dev, int pipe) | 4658 | void intel_finish_page_flip(struct drm_device *dev, int pipe) |
@@ -4781,6 +4784,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
4781 | 4784 | ||
4782 | mutex_unlock(&dev->struct_mutex); | 4785 | mutex_unlock(&dev->struct_mutex); |
4783 | 4786 | ||
4787 | trace_i915_flip_request(intel_crtc->plane, obj); | ||
4788 | |||
4784 | return 0; | 4789 | return 0; |
4785 | } | 4790 | } |
4786 | 4791 | ||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 6235169d595..04b564bfc4a 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -406,6 +406,8 @@ struct drm_pending_event { | |||
406 | struct drm_event *event; | 406 | struct drm_event *event; |
407 | struct list_head link; | 407 | struct list_head link; |
408 | struct drm_file *file_priv; | 408 | struct drm_file *file_priv; |
409 | pid_t pid; /* pid of requester, no guarantee it's valid by the time | ||
410 | we deliver the event, for tracing only */ | ||
409 | void (*destroy)(struct drm_pending_event *event); | 411 | void (*destroy)(struct drm_pending_event *event); |
410 | }; | 412 | }; |
411 | 413 | ||