diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 4c6adae23e18..ee082addd328 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -77,6 +77,7 @@ i915-y += i915_cmd_parser.o \
 	  i915_request.o \
 	  i915_timeline.o \
 	  i915_trace_points.o \
+	  i915_tracing.o \
 	  i915_vma.o \
 	  intel_breadcrumbs.o \
 	  intel_engine_cs.o \
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 8a3ea18d8416..c634583baf57 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1271,6 +1271,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
 	INIT_LIST_HEAD(&dev_priv->driver_list_link);
 	mutex_lock(&i915_driver_list_lock);
 	list_add_tail(&dev_priv->driver_list_link, &i915_driver_list);
+	i915_tracing_register(dev_priv);
 	mutex_unlock(&i915_driver_list_lock);
 }
 
@@ -1285,6 +1286,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
 
 	mutex_lock(&i915_driver_list_lock);
 	list_del(&dev_priv->driver_list_link);
+	i915_tracing_unregister(dev_priv);
 	mutex_unlock(&i915_driver_list_lock);
 
 	/*
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 685bfdca3a72..4e3230713491 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2144,6 +2144,8 @@ struct drm_i915_private {
 
 	struct list_head driver_list_link;
 
+	bool engine_notify_tracepoint;
+
 	/*
 	 * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
 	 * will be rejected. Instead look for a better place.
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h
index c0352a1b036c..12555d2388fd 100644
--- a/drivers/gpu/drm/i915/i915_trace.h
+++ b/drivers/gpu/drm/i915/i915_trace.h
@@ -8,6 +8,7 @@
 
 #include <drm/drmP.h>
 #include "i915_drv.h"
+#include "i915_tracing.h"
 #include "intel_drv.h"
 #include "intel_ringbuffer.h"
 
@@ -750,29 +751,32 @@ TRACE_EVENT(i915_request_out,
 			      __entry->global_seqno, __entry->completed)
 );
 
-TRACE_EVENT(intel_engine_notify,
-	    TP_PROTO(struct intel_engine_cs *engine, bool waiters),
-	    TP_ARGS(engine, waiters),
-
-	    TP_STRUCT__entry(
-			     __field(u32, dev)
-			     __field(u16, class)
-			     __field(u16, instance)
-			     __field(u32, seqno)
-			     __field(bool, waiters)
-			     ),
-
-	    TP_fast_assign(
-			   __entry->dev = engine->i915->drm.primary->index;
-			   __entry->class = engine->uabi_class;
-			   __entry->instance = engine->instance;
-			   __entry->seqno = intel_engine_get_seqno(engine);
-			   __entry->waiters = waiters;
-			   ),
-
-	    TP_printk("dev=%u, engine=%u:%u, seqno=%u, waiters=%u",
-		      __entry->dev, __entry->class, __entry->instance,
-		      __entry->seqno, __entry->waiters)
+TRACE_EVENT_FN(intel_engine_notify,
+	       TP_PROTO(struct intel_engine_cs *engine, bool waiters),
+	       TP_ARGS(engine, waiters),
+
+	       TP_STRUCT__entry(
+			        __field(u32, dev)
+			        __field(u16, class)
+			        __field(u16, instance)
+			        __field(u32, seqno)
+			        __field(bool, waiters)
+			        ),
+
+	       TP_fast_assign(
+			      __entry->dev = engine->i915->drm.primary->index;
+			      __entry->class = engine->uabi_class;
+			      __entry->instance = engine->instance;
+			      __entry->seqno = intel_engine_get_seqno(engine);
+			      __entry->waiters = waiters;
+			      ),
+
+	       TP_printk("dev=%u, engine=%u:%u, seqno=%u, waiters=%u",
+			 __entry->dev, __entry->class, __entry->instance,
+			 __entry->seqno, __entry->waiters),
+
+	       intel_engine_notify_tracepoint_register,
+	       intel_engine_notify_tracepoint_unregister
 );
 
 DEFINE_EVENT(i915_request, i915_request_retire,
diff --git a/drivers/gpu/drm/i915/i915_tracing.c b/drivers/gpu/drm/i915/i915_tracing.c
new file mode 100644
index 000000000000..a9f486278109
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_tracing.c
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright © 2018 Intel Corporation
+ *
+ */
+
+#include "i915_tracing.h"
+
+#include "i915_drv.h"
+#include "intel_ringbuffer.h"
+
+void i915_tracing_register(struct drm_i915_private *i915)
+{
+	struct intel_engine_cs *engine;
+	struct drm_i915_private *p;
+	enum intel_engine_id id;
+	bool enable = false;
+
+	lockdep_assert_held(&i915_driver_list_lock);
+
+	list_for_each_entry(p, &i915_driver_list, driver_list_link) {
+		enable = p->engine_notify_tracepoint;
+		if (enable)
+			break;
+	}
+
+	if (!enable)
+		return;
+
+	for_each_engine(engine, i915, id)
+		intel_engine_pin_breadcrumbs_irq(engine);
+
+	i915->engine_notify_tracepoint = true;
+}
+
+void i915_tracing_unregister(struct drm_i915_private *i915)
+{
+	struct intel_engine_cs *engine;
+	enum intel_engine_id id;
+
+	lockdep_assert_held(&i915_driver_list_lock);
+
+	if (!i915->engine_notify_tracepoint)
+		return;
+
+	for_each_engine(engine, i915, id)
+		intel_engine_unpin_breadcrumbs_irq(engine);
+
+	i915->engine_notify_tracepoint = false;
+}
+
+int intel_engine_notify_tracepoint_register(void)
+{
+	struct drm_i915_private *i915;
+
+	mutex_lock(&i915_driver_list_lock);
+	list_for_each_entry(i915, &i915_driver_list, driver_list_link) {
+		struct intel_engine_cs *engine;
+		enum intel_engine_id id;
+
+		intel_runtime_pm_get(i915);
+
+		for_each_engine(engine, i915, id)
+			intel_engine_pin_breadcrumbs_irq(engine);
+
+		intel_runtime_pm_put(i915);
+
+		GEM_BUG_ON(i915->engine_notify_tracepoint);
+		i915->engine_notify_tracepoint = true;
+	}
+	mutex_unlock(&i915_driver_list_lock);
+
+	return 0;
+}
+
+void intel_engine_notify_tracepoint_unregister(void)
+{
+	struct drm_i915_private *i915;
+
+	mutex_lock(&i915_driver_list_lock);
+	list_for_each_entry(i915, &i915_driver_list, driver_list_link) {
+		struct intel_engine_cs *engine;
+		enum intel_engine_id id;
+
+		intel_runtime_pm_get(i915);
+
+		for_each_engine(engine, i915, id)
+			intel_engine_unpin_breadcrumbs_irq(engine);
+
+		intel_runtime_pm_put(i915);
+
+		GEM_BUG_ON(!i915->engine_notify_tracepoint);
+		i915->engine_notify_tracepoint = false;
+	}
+	mutex_unlock(&i915_driver_list_lock);
+}
diff --git a/drivers/gpu/drm/i915/i915_tracing.h b/drivers/gpu/drm/i915/i915_tracing.h
new file mode 100644
index 000000000000..f5ed92428ff1
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_tracing.h
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright © 2018 Intel Corporation
+ *
+ */
+
+#include "i915_drv.h"
+
+void i915_tracing_register(struct drm_i915_private *i915);
+void i915_tracing_unregister(struct drm_i915_private *i915);
+
+int intel_engine_notify_tracepoint_register(void);
+void intel_engine_notify_tracepoint_unregister(void);
