Commit 8f8b1171 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915/perf: Wean ourselves off dev_priv



Use the local uncore accessors for the GT rather than using the [not-so]
magic global dev_priv mmio routines. In the process, we also teach the
perf stream to use backpointers to the i915_perf rather than digging it
out of dev_priv.

v2: Rebase onto i915_perf_types.h

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Cc: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> #v1
Link: https://patchwork.freedesktop.org/patch/msgid/20191007140812.10963-1-chris@chris-wilson.co.uk
Link: https://patchwork.freedesktop.org/patch/msgid/20191007210942.18145-1-chris@chris-wilson.co.uk
parent d30213e5
Loading
Loading
Loading
Loading
+1 −55
Original line number Diff line number Diff line
@@ -1332,61 +1332,7 @@ struct drm_i915_private {

	struct intel_runtime_pm runtime_pm;

	struct {
		bool initialized;

		struct kobject *metrics_kobj;
		struct ctl_table_header *sysctl_header;

		/*
		 * Lock associated with adding/modifying/removing OA configs
		 * in dev_priv->perf.metrics_idr.
		 */
		struct mutex metrics_lock;

		/*
		 * List of dynamic configurations, you need to hold
		 * dev_priv->perf.metrics_lock to access it.
		 */
		struct idr metrics_idr;

		/*
		 * Lock associated with anything below within this structure
		 * except exclusive_stream.
		 */
		struct mutex lock;
		struct list_head streams;

		/*
		 * The stream currently using the OA unit. If accessed
		 * outside a syscall associated to its file
		 * descriptor, you need to hold
		 * dev_priv->drm.struct_mutex.
		 */
		struct i915_perf_stream *exclusive_stream;

		/**
		 * For rate limiting any notifications of spurious
		 * invalid OA reports
		 */
		struct ratelimit_state spurious_report_rs;

		struct i915_oa_config test_config;

		u32 gen7_latched_oastatus1;
		u32 ctx_oactxctrl_offset;
		u32 ctx_flexeu0_offset;

		/**
		 * The RPT_ID/reason field for Gen8+ includes a bit
		 * to determine if the CTX ID in the report is valid
		 * but the specific bit differs between Gen 8 and 9
		 */
		u32 gen8_valid_ctx_bit;

		struct i915_oa_ops ops;
		const struct i915_oa_format *oa_formats;
	} perf;
	struct i915_perf perf;

	/* Abstract the submission mechanism (legacy ringbuffer or execlists) away */
	struct intel_gt gt;
+354 −367

File changed.

Preview size limit exceeded, changes collapsed.

+67 −6
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <linux/list.h>
#include <linux/poll.h>
#include <linux/sysfs.h>
#include <linux/types.h>
#include <linux/uuid.h>
#include <linux/wait.h>

@@ -124,9 +125,14 @@ struct i915_perf_stream_ops {
 */
struct i915_perf_stream {
	/**
	 * @dev_priv: i915 drm device
	 * @perf: i915_perf backpointer
	 */
	struct drm_i915_private *dev_priv;
	struct i915_perf *perf;

	/**
	 * @gt: intel_gt container
	 */
	struct intel_gt *gt;

	/**
	 * @link: Links the stream into ``&drm_i915_private->streams``
@@ -266,20 +272,19 @@ struct i915_oa_ops {
	 * @is_valid_b_counter_reg: Validates register's address for
	 * programming boolean counters for a particular platform.
	 */
	bool (*is_valid_b_counter_reg)(struct drm_i915_private *dev_priv,
				       u32 addr);
	bool (*is_valid_b_counter_reg)(struct i915_perf *perf, u32 addr);

	/**
	 * @is_valid_mux_reg: Validates register's address for programming mux
	 * for a particular platform.
	 */
	bool (*is_valid_mux_reg)(struct drm_i915_private *dev_priv, u32 addr);
	bool (*is_valid_mux_reg)(struct i915_perf *perf, u32 addr);

	/**
	 * @is_valid_flex_reg: Validates register's address for programming
	 * flex EU filtering for a particular platform.
	 */
	bool (*is_valid_flex_reg)(struct drm_i915_private *dev_priv, u32 addr);
	bool (*is_valid_flex_reg)(struct i915_perf *perf, u32 addr);

	/**
	 * @enable_metric_set: Selects and applies any MUX configuration to set
@@ -324,4 +329,60 @@ struct i915_oa_ops {
	u32 (*oa_hw_tail_read)(struct i915_perf_stream *stream);
};

struct i915_perf {
	struct drm_i915_private *i915;

	struct kobject *metrics_kobj;
	struct ctl_table_header *sysctl_header;

	/*
	 * Lock associated with adding/modifying/removing OA configs
	 * in dev_priv->perf.metrics_idr.
	 */
	struct mutex metrics_lock;

	/*
	 * List of dynamic configurations, you need to hold
	 * dev_priv->perf.metrics_lock to access it.
	 */
	struct idr metrics_idr;

	/*
	 * Lock associated with anything below within this structure
	 * except exclusive_stream.
	 */
	struct mutex lock;
	struct list_head streams;

	/*
	 * The stream currently using the OA unit. If accessed
	 * outside a syscall associated to its file
	 * descriptor, you need to hold
	 * dev_priv->drm.struct_mutex.
	 */
	struct i915_perf_stream *exclusive_stream;

	/**
	 * For rate limiting any notifications of spurious
	 * invalid OA reports
	 */
	struct ratelimit_state spurious_report_rs;

	struct i915_oa_config test_config;

	u32 gen7_latched_oastatus1;
	u32 ctx_oactxctrl_offset;
	u32 ctx_flexeu0_offset;

	/**
	 * The RPT_ID/reason field for Gen8+ includes a bit
	 * to determine if the CTX ID in the report is valid
	 * but the specific bit differs between Gen 8 and 9
	 */
	u32 gen8_valid_ctx_bit;

	struct i915_oa_ops ops;
	const struct i915_oa_format *oa_formats;
};

#endif /* _I915_PERF_TYPES_H_ */