[Intel-gfx] [PATCH 07/15] drm/i915: Add support for having pid output with OA report

2016-11-04 Thread sourab . gupta
From: Sourab Gupta 

This patch introduces flags and adds support for having pid output with
the OA reports generated through the RCS commands.

When the stream is opened with pid sample type, the pid information is also
captured through the command stream samples and forwarded along with the
OA reports.

Signed-off-by: Sourab Gupta 
---
 drivers/gpu/drm/i915/i915_drv.h  |  2 ++
 drivers/gpu/drm/i915/i915_perf.c | 48 +++-
 include/uapi/drm/i915_drm.h  |  7 ++
 3 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 853cc7db..f250e7b 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1872,6 +1872,7 @@ struct i915_perf_cs_data_node {
struct drm_i915_gem_request *request;
u32 offset;
u32 ctx_id;
+   u32 pid;
 };
 
 struct drm_i915_private {
@@ -2242,6 +2243,7 @@ struct drm_i915_private {
} command_stream_buf;
 
u32 last_ctx_id;
+   u32 last_pid;
struct list_head node_list;
spinlock_t node_list_lock;
} perf;
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 84457f8..894d7a6 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -254,6 +254,7 @@ static u32 i915_perf_stream_paranoid = true;
 struct oa_sample_data {
u32 source;
u32 ctx_id;
+   u32 pid;
const u8 *report;
 };
 
@@ -309,6 +310,7 @@ static const enum intel_engine_id 
user_ring_map[I915_USER_RINGS + 1] = {
 #define SAMPLE_OA_REPORT   (1<<0)
 #define SAMPLE_OA_SOURCE_INFO  (1<<1)
 #define SAMPLE_CTX_ID  (1<<2)
+#define SAMPLE_PID (1<<3)
 
 struct perf_open_properties {
u32 sample_flags;
@@ -484,6 +486,7 @@ static void i915_perf_command_stream_hook_oa(struct 
drm_i915_gem_request *req)
goto out;
 
entry->ctx_id = ctx->hw_id;
+   entry->pid = current->pid;
i915_gem_request_assign(&entry->request, req);
 
addr = dev_priv->perf.command_stream_buf.vma->node.start +
@@ -735,6 +738,12 @@ static int append_oa_sample(struct i915_perf_stream 
*stream,
buf += 4;
}
 
+   if (sample_flags & SAMPLE_PID) {
+   if (copy_to_user(buf, &data->pid, 4))
+   return -EFAULT;
+   buf += 4;
+   }
+
if (sample_flags & SAMPLE_OA_REPORT) {
if (copy_to_user(buf, data->report, report_size))
return -EFAULT;
@@ -777,6 +786,9 @@ static int append_oa_buffer_sample(struct i915_perf_stream 
*stream,
data.ctx_id = dev_priv->perf.oa.ops.oa_buffer_get_ctx_id(
stream, report);
 
+   if (sample_flags & SAMPLE_PID)
+   data.pid = dev_priv->perf.last_pid;
+
if (sample_flags & SAMPLE_OA_REPORT)
data.report = report;
 
@@ -1293,6 +1305,11 @@ static int append_oa_rcs_sample(struct i915_perf_stream 
*stream,
dev_priv->perf.last_ctx_id = node->ctx_id;
}
 
+   if (sample_flags & SAMPLE_PID) {
+   data.pid = node->pid;
+   dev_priv->perf.last_pid = node->pid;
+   }
+
if (sample_flags & SAMPLE_OA_REPORT)
data.report = report;
 
@@ -2127,6 +2144,7 @@ static int i915_oa_stream_init(struct i915_perf_stream 
*stream,
struct drm_i915_private *dev_priv = stream->dev_priv;
bool require_oa_unit = props->sample_flags & (SAMPLE_OA_REPORT |
  SAMPLE_OA_SOURCE_INFO);
+   bool require_cs_mode = props->sample_flags & SAMPLE_PID;
bool cs_sample_data = props->sample_flags & SAMPLE_OA_REPORT;
int ret;
 
@@ -2268,6 +2286,20 @@ static int i915_oa_stream_init(struct i915_perf_stream 
*stream,
if (props->sample_flags & SAMPLE_CTX_ID) {
stream->sample_flags |= SAMPLE_CTX_ID;
stream->sample_size += 4;
+
+   /*
+* NB: it's meaningful to request SAMPLE_CTX_ID with just CS
+* mode or periodic OA mode sampling but we don't allow
+* SAMPLE_CTX_ID without either mode
+*/
+   if (!require_oa_unit)
+   require_cs_mode = true;
+   }
+
+   if (require_cs_mode && !props->cs_mode) {
+   DRM_ERROR("PID sampling requires a ring to be specified");
+   ret = -EINVAL;
+   goto cs_error;
}
 
if (props->cs_mode) {
@@ -2278,7 +2310,13 @@ static int i915_oa_stream_init(struct i915_perf_stream 
*stream,
goto cs_error;
}
 
-   if (!(props->sample_flags & SAMPLE_CTX_ID)) {
+   /*
+* The only time we should allow enabling CS mode if it's not

[Intel-gfx] [PATCH 07/15] drm/i915: Add support for having pid output with OA report

2016-06-01 Thread sourab . gupta
From: Sourab Gupta 

This patch introduces flags and adds support for having pid output with
the OA reports generated through the RCS commands.

When the stream is opened with pid sample type, the pid information is also
captured through the command stream samples and forwarded along with the
OA reports.

Signed-off-by: Sourab Gupta 
---
 drivers/gpu/drm/i915/i915_drv.h  |  2 ++
 drivers/gpu/drm/i915/i915_perf.c | 48 +++-
 include/uapi/drm/i915_drm.h  |  7 ++
 3 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 9d23ca1..60e94e6 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1851,6 +1851,7 @@ struct i915_perf_cs_data_node {
struct drm_i915_gem_request *request;
u32 offset;
u32 ctx_id;
+   u32 pid;
 };
 
 struct drm_i915_private {
@@ -2197,6 +2198,7 @@ struct drm_i915_private {
} command_stream_buf;
 
u32 last_ctx_id;
+   u32 last_pid;
struct list_head node_list;
spinlock_t node_list_lock;
} perf;
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 2496a4b..bb5356f 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -88,6 +88,7 @@ static u32 i915_perf_stream_paranoid = true;
 struct oa_sample_data {
u32 source;
u32 ctx_id;
+   u32 pid;
const u8 *report;
 };
 
@@ -143,6 +144,7 @@ static const enum intel_engine_id 
user_ring_map[I915_USER_RINGS + 1] = {
 #define SAMPLE_OA_REPORT   (1<<0)
 #define SAMPLE_OA_SOURCE_INFO  (1<<1)
 #define SAMPLE_CTX_ID  (1<<2)
+#define SAMPLE_PID (1<<3)
 
 struct perf_open_properties {
u32 sample_flags;
@@ -322,6 +324,7 @@ static void i915_perf_command_stream_hook_oa(struct 
drm_i915_gem_request *req)
goto out;
 
entry->ctx_id = ctx->hw_id;
+   entry->pid = current->pid;
i915_gem_request_assign(&entry->request, req);
 
addr = dev_priv->perf.command_stream_buf.vma->node.start +
@@ -582,6 +585,12 @@ static int append_oa_sample(struct i915_perf_stream 
*stream,
buf += 4;
}
 
+   if (sample_flags & SAMPLE_PID) {
+   if (copy_to_user(buf, &data->pid, 4))
+   return -EFAULT;
+   buf += 4;
+   }
+
if (sample_flags & SAMPLE_OA_REPORT) {
if (copy_to_user(buf, data->report, report_size))
return -EFAULT;
@@ -624,6 +633,9 @@ static int append_oa_buffer_sample(struct i915_perf_stream 
*stream,
data.ctx_id = dev_priv->perf.oa.ops.oa_buffer_get_ctx_id(
stream, report);
 
+   if (sample_flags & SAMPLE_PID)
+   data.pid = dev_priv->perf.last_pid;
+
if (sample_flags & SAMPLE_OA_REPORT)
data.report = report;
 
@@ -1092,6 +1104,11 @@ static int append_oa_rcs_sample(struct i915_perf_stream 
*stream,
dev_priv->perf.last_ctx_id = node->ctx_id;
}
 
+   if (sample_flags & SAMPLE_PID) {
+   data.pid = node->pid;
+   dev_priv->perf.last_pid = node->pid;
+   }
+
if (sample_flags & SAMPLE_OA_REPORT)
data.report = report;
 
@@ -1873,6 +1890,7 @@ static int i915_oa_stream_init(struct i915_perf_stream 
*stream,
struct drm_i915_private *dev_priv = stream->dev_priv;
bool require_oa_unit = props->sample_flags & (SAMPLE_OA_REPORT |
  SAMPLE_OA_SOURCE_INFO);
+   bool require_cs_mode = props->sample_flags & SAMPLE_PID;
bool cs_sample_data = props->sample_flags & SAMPLE_OA_REPORT;
int ret;
 
@@ -2005,6 +2023,20 @@ static int i915_oa_stream_init(struct i915_perf_stream 
*stream,
if (props->sample_flags & SAMPLE_CTX_ID) {
stream->sample_flags |= SAMPLE_CTX_ID;
stream->sample_size += 4;
+
+   /*
+* NB: it's meaningful to request SAMPLE_CTX_ID with just CS
+* mode or periodic OA mode sampling but we don't allow
+* SAMPLE_CTX_ID without either mode
+*/
+   if (!require_oa_unit)
+   require_cs_mode = true;
+   }
+
+   if (require_cs_mode && !props->cs_mode) {
+   DRM_ERROR("PID sampling requires a ring to be specified");
+   ret = -EINVAL;
+   goto cs_error;
}
 
if (props->cs_mode) {
@@ -2015,7 +2047,13 @@ static int i915_oa_stream_init(struct i915_perf_stream 
*stream,
goto cs_error;
}
 
-   if (!(props->sample_flags & SAMPLE_CTX_ID)) {
+   /*
+* The only time we should allow enabling CS mode if it's not
+