[Intel-gfx] [PATCH 05/14] drm/i915/perf: expose sseu configuration to userspace on perf fd
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Wed May 17 10:59:02 UTC 2017
Enables userspace to determine the number of slices & subslices
enabled and also know what specific slices & subslices are enabled.
This information is required, for example, to be able to analyse some
OA counter reports where the counter configuration depends on the HW
slice configuration.
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 12 ++++++++++++
drivers/gpu/drm/i915/i915_perf.c | 14 ++++++++++++++
include/uapi/drm/i915_drm.h | 15 +++++++++++++++
3 files changed, 41 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 10ffbfec3b2e..18e12e61949b 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2966,6 +2966,18 @@ extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
#endif
extern const struct dev_pm_ops i915_pm_ops;
+static inline u64 i915_pack_sseu_to_user(struct sseu_dev_info *sseu)
+{
+ union drm_i915_gem_param_sseu user;
+
+ user.packed.slice_mask = sseu->slice_mask;
+ user.packed.subslice_mask = sseu->subslice_mask;
+ user.packed.min_eu_per_subslice = sseu->min_eu_per_subslice;
+ user.packed.max_eu_per_subslice = sseu->max_eu_per_subslice;
+
+ return user.value;
+}
+
extern int i915_driver_load(struct pci_dev *pdev,
const struct pci_device_id *ent);
extern void i915_driver_unload(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 5f4eccaa06d6..d20cceef93d0 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1618,6 +1618,18 @@ static void i915_perf_disable_locked(struct i915_perf_stream *stream)
stream->ops->disable(stream);
}
+static int i915_perf_get_sseu_locked(struct i915_perf_stream *stream,
+ unsigned long arg)
+{
+ struct drm_i915_private *dev_priv = stream->dev_priv;
+ u64 sseu = i915_pack_sseu_to_user(&dev_priv->perf.oa.sseu);
+
+ if (copy_to_user((void __user *)arg, &sseu, sizeof(sseu)) != 0)
+ return -EFAULT;
+
+ return 0;
+}
+
/**
* i915_perf_ioctl - support ioctl() usage with i915 perf stream FDs
* @stream: An i915 perf stream
@@ -1641,6 +1653,8 @@ static long i915_perf_ioctl_locked(struct i915_perf_stream *stream,
case I915_PERF_IOCTL_DISABLE:
i915_perf_disable_locked(stream);
return 0;
+ case I915_PERF_IOCTL_GET_SSEU:
+ return i915_perf_get_sseu_locked(stream, arg);
}
return -EINVAL;
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index ba722fb343a4..8871c526205b 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -350,6 +350,16 @@ typedef struct drm_i915_irq_wait {
int irq_seq;
} drm_i915_irq_wait_t;
+union drm_i915_gem_param_sseu {
+ struct {
+ u8 slice_mask;
+ u8 subslice_mask;
+ u8 min_eu_per_subslice;
+ u8 max_eu_per_subslice;
+ } packed;
+ __u64 value;
+};
+
/* Ioctl to query kernel params:
*/
#define I915_PARAM_IRQ_ACTIVE 1
@@ -1399,6 +1409,11 @@ struct drm_i915_perf_open_param {
#define I915_PERF_IOCTL_DISABLE _IO('i', 0x1)
/**
+ * Query sseu configuration for a stream.
+ */
+#define I915_PERF_IOCTL_GET_SSEU _IOW('i', 0x2, union drm_i915_gem_param_sseu)
+
+/**
* Common to all i915 perf records
*/
struct drm_i915_perf_record_header {
--
2.11.0
More information about the Intel-gfx
mailing list