[Intel-gfx] [PATCH 06/15] drm/i915: Debugfs interface to read GuC load status

2015-07-03 Thread Dave Gordon
From: Alex Dai yu@intel.com

The new node provides access to the status of the common uC loader
code and the GuC-specific loader; also the scratch registers used
for communication between the i915 driver and the GuC firmware.

v2:
Changes to output formats per Chris Wilson's suggestions

Issue: VIZ-4884
Signed-off-by: Alex Dai yu@intel.com
Signed-off-by: Dave Gordon david.s.gor...@intel.com
---
 drivers/gpu/drm/i915/i915_debugfs.c | 45 +
 1 file changed, 45 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 71ba519..65d40f1 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2359,6 +2359,50 @@ static int i915_llc(struct seq_file *m, void *data)
return 0;
 }
 
+static void i915_uc_load_status_info(struct seq_file *m, struct intel_uc_fw 
*uc_fw)
+{
+   seq_printf(m, %s firmware status:\n,
+   uc_fw-uc_name);
+   seq_printf(m, \tpath: %s\n,
+   uc_fw-uc_fw_path);
+   seq_printf(m, \tfetch: %s\n,
+   intel_uc_fw_status_repr(uc_fw-uc_fw_fetch_status));
+   seq_printf(m, \tload: %s\n,
+   intel_uc_fw_status_repr(uc_fw-uc_fw_load_status));
+}
+
+static int i915_guc_load_status_info(struct seq_file *m, void *data)
+{
+   struct drm_info_node *node = m-private;
+   struct drm_i915_private *dev_priv = node-minor-dev-dev_private;
+   u32 tmp, i;
+
+   if (!HAS_GUC_UCODE(dev_priv-dev))
+   return 0;
+
+   i915_uc_load_status_info(m, dev_priv-guc.guc_fw);
+
+   seq_printf(m, \tversion wanted: %d.%d\n,
+   dev_priv-guc.fw_major_wanted, dev_priv-guc.fw_minor_wanted);
+   seq_printf(m, \tversion found: %d.%d\n,
+   dev_priv-guc.fw_major_found, dev_priv-guc.fw_minor_found);
+
+   tmp = I915_READ(GUC_STATUS);
+
+   seq_printf(m, \nGuC status 0x%08x:\n, tmp);
+   seq_printf(m, \tBootrom status = 0x%x\n,
+   (tmp  GS_BOOTROM_MASK)  GS_BOOTROM_SHIFT);
+   seq_printf(m, \tuKernel status = 0x%x\n,
+   (tmp  GS_UKERNEL_MASK)  GS_UKERNEL_SHIFT);
+   seq_printf(m, \tMIA Core status = 0x%x\n,
+   (tmp  GS_MIA_MASK)  GS_MIA_SHIFT);
+   seq_puts(m, \nScratch registers:\n);
+   for (i = 0; i  16; i++)
+   seq_printf(m, \t%2d: \t0x%x\n, i, I915_READ(SOFT_SCRATCH(i)));
+
+   return 0;
+}
+
 static int i915_edp_psr_status(struct seq_file *m, void *data)
 {
struct drm_info_node *node = m-private;
@@ -5073,6 +5117,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
{i915_gem_hws_bsd, i915_hws_info, 0, (void *)VCS},
{i915_gem_hws_vebox, i915_hws_info, 0, (void *)VECS},
{i915_gem_batch_pool, i915_gem_batch_pool_info, 0},
+   {i915_guc_load_status, i915_guc_load_status_info, 0},
{i915_frequency_info, i915_frequency_info, 0},
{i915_hangcheck_info, i915_hangcheck_info, 0},
{i915_drpc_info, i915_drpc_info, 0},
-- 
1.9.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 06/15] drm/i915: Debugfs interface to read GuC load status

2015-06-19 Thread Dave Gordon
On 16/06/15 10:40, Chris Wilson wrote:
 On Mon, Jun 15, 2015 at 07:36:24PM +0100, Dave Gordon wrote:
 From: Alex Dai yu@intel.com

 The new node provides access to the status of the common uC loader
 code and the GuC-specific loader; also the scratch registers used
 for communicatio between the i915 driver and the GuC firmware.

 Issue: VIZ-4884
 Signed-off-by: Alex Dai yu@intel.com
 Signed-off-by: Dave Gordon david.s.gor...@intel.com
 ---
  drivers/gpu/drm/i915/i915_debugfs.c |   37 
 +++
  1 file changed, 37 insertions(+)

 diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
 b/drivers/gpu/drm/i915/i915_debugfs.c
 index 47636f3..c52a745 100644
 --- a/drivers/gpu/drm/i915/i915_debugfs.c
 +++ b/drivers/gpu/drm/i915/i915_debugfs.c
 @@ -2352,6 +2352,42 @@ static int i915_llc(struct seq_file *m, void *data)
  return 0;
  }
  
 +static void i915_uc_load_status_info(struct seq_file *m, struct intel_uc_fw 
 *uc_fw)
 +{
 +seq_printf(m, %s firmware status:\n\tpath: %s\n\tfetch: %d\n\tload: 
 %d\n,
 +uc_fw-uc_name,
 +uc_fw-uc_fw_path,
 +uc_fw-uc_fw_fetch_status,
 +uc_fw-uc_fw_load_status);
 
 If you made this one seq_printf() per line visualing the resulting
 format would have been easier - and easier to modify.

Done.

 Don't use %s, that's just visual noise to make cutting and pasting
 harder.

My terminal doesn't include  in word selections (but DOES include /
and .) so selecting a pathname just works :) But I've removed the
angle.brackets anyway.

 If you can decode numeric status values, do so.

Done. I've added a _repr function for decoding the enum and used it
everywhere.

 +}
 +
 +static int i915_guc_load_status_info(struct seq_file *m, void *data)
 +{
 +struct drm_info_node *node = m-private;
 +struct drm_i915_private *dev_priv = node-minor-dev-dev_private;
 +u32 tmp, i;
 +
 +if (!HAS_GUC_UCODE(dev_priv-dev))
 
 Here and elsewhere it should be return -ENODEV;

There's only one other use of HAS_GUC_UCODE (in intel_guc_ucode_init())
and that one doesn't and mustn't trigger an error if false. I don't see
why it should be an *error* here either; the caller hasn't done anything
wrong, and there's no h/w or s/w failure. An empty result (EOF) is a
nice way of saying that there's nothing to say, without making the user
think something broke.

In fact it may be perfectly meaningful to continue rather than
returning; consider the case of a future GuC that comes with firmware
preloaded, so HAS_GUC() is true but HAS_GUC_UCODE() is FALSE. We could
still read and decode the GUC_STATUS even though we haven't loaded any
firmware.

 +return 0;
 +
 +i915_uc_load_status_info(m, dev_priv-guc.guc_fw);
 +
 +tmp = I915_READ(GUC_STATUS);
 +
 +seq_printf(m, \nGuC status 0x%08x:\n, tmp);
 +seq_printf(m, \tBootrom status = 0x%x\n,
 +(tmp  GS_BOOTROM_MASK)  GS_BOOTROM_SHIFT);
 +seq_printf(m, \tuKernel status = 0x%x\n,
 +(tmp  GS_UKERNEL_MASK)  GS_UKERNEL_SHIFT);
 +seq_printf(m, \tMIA Core status = 0x%x\n,
 +(tmp  GS_MIA_MASK)  GS_MIA_SHIFT);
 +seq_puts(m, \nScratch registers value:\n);
 +for (i = 0; i  16; i++)
 +seq_printf(m, \t%2d: \t0x%x\n, i, I915_READ(SOFT_SCRATCH(i)));
 
 I have a feeling these probably don't want to be upstreamed.
 -Chris

It's just a register dump; nothing secret there. You could read them
with IGT's register dumper anyway.

.Dave.
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 06/15] drm/i915: Debugfs interface to read GuC load status

2015-06-16 Thread Chris Wilson
On Mon, Jun 15, 2015 at 07:36:24PM +0100, Dave Gordon wrote:
 From: Alex Dai yu@intel.com
 
 The new node provides access to the status of the common uC loader
 code and the GuC-specific loader; also the scratch registers used
 for communicatio between the i915 driver and the GuC firmware.
 
 Issue: VIZ-4884
 Signed-off-by: Alex Dai yu@intel.com
 Signed-off-by: Dave Gordon david.s.gor...@intel.com
 ---
  drivers/gpu/drm/i915/i915_debugfs.c |   37 
 +++
  1 file changed, 37 insertions(+)
 
 diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
 b/drivers/gpu/drm/i915/i915_debugfs.c
 index 47636f3..c52a745 100644
 --- a/drivers/gpu/drm/i915/i915_debugfs.c
 +++ b/drivers/gpu/drm/i915/i915_debugfs.c
 @@ -2352,6 +2352,42 @@ static int i915_llc(struct seq_file *m, void *data)
   return 0;
  }
  
 +static void i915_uc_load_status_info(struct seq_file *m, struct intel_uc_fw 
 *uc_fw)
 +{
 + seq_printf(m, %s firmware status:\n\tpath: %s\n\tfetch: %d\n\tload: 
 %d\n,
 + uc_fw-uc_name,
 + uc_fw-uc_fw_path,
 + uc_fw-uc_fw_fetch_status,
 + uc_fw-uc_fw_load_status);

If you made this one seq_printf() per line visualing the resulting
format would have been easier - and easier to modify.

Don't use %s, that's just visual noise to make cutting and pasting
harder.

If you can decode numeric status values, do so.

 +}
 +
 +static int i915_guc_load_status_info(struct seq_file *m, void *data)
 +{
 + struct drm_info_node *node = m-private;
 + struct drm_i915_private *dev_priv = node-minor-dev-dev_private;
 + u32 tmp, i;
 +
 + if (!HAS_GUC_UCODE(dev_priv-dev))

Here and elsewhere it should be return -ENODEV;

 + return 0;
 +
 + i915_uc_load_status_info(m, dev_priv-guc.guc_fw);
 +
 + tmp = I915_READ(GUC_STATUS);
 +
 + seq_printf(m, \nGuC status 0x%08x:\n, tmp);
 + seq_printf(m, \tBootrom status = 0x%x\n,
 + (tmp  GS_BOOTROM_MASK)  GS_BOOTROM_SHIFT);
 + seq_printf(m, \tuKernel status = 0x%x\n,
 + (tmp  GS_UKERNEL_MASK)  GS_UKERNEL_SHIFT);
 + seq_printf(m, \tMIA Core status = 0x%x\n,
 + (tmp  GS_MIA_MASK)  GS_MIA_SHIFT);
 + seq_puts(m, \nScratch registers value:\n);
 + for (i = 0; i  16; i++)
 + seq_printf(m, \t%2d: \t0x%x\n, i, I915_READ(SOFT_SCRATCH(i)));

I have a feeling these probably don't want to be upstreamed.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 06/15] drm/i915: Debugfs interface to read GuC load status

2015-06-15 Thread Dave Gordon
From: Alex Dai yu@intel.com

The new node provides access to the status of the common uC loader
code and the GuC-specific loader; also the scratch registers used
for communicatio between the i915 driver and the GuC firmware.

Issue: VIZ-4884
Signed-off-by: Alex Dai yu@intel.com
Signed-off-by: Dave Gordon david.s.gor...@intel.com
---
 drivers/gpu/drm/i915/i915_debugfs.c |   37 +++
 1 file changed, 37 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 47636f3..c52a745 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2352,6 +2352,42 @@ static int i915_llc(struct seq_file *m, void *data)
return 0;
 }
 
+static void i915_uc_load_status_info(struct seq_file *m, struct intel_uc_fw 
*uc_fw)
+{
+   seq_printf(m, %s firmware status:\n\tpath: %s\n\tfetch: %d\n\tload: 
%d\n,
+   uc_fw-uc_name,
+   uc_fw-uc_fw_path,
+   uc_fw-uc_fw_fetch_status,
+   uc_fw-uc_fw_load_status);
+}
+
+static int i915_guc_load_status_info(struct seq_file *m, void *data)
+{
+   struct drm_info_node *node = m-private;
+   struct drm_i915_private *dev_priv = node-minor-dev-dev_private;
+   u32 tmp, i;
+
+   if (!HAS_GUC_UCODE(dev_priv-dev))
+   return 0;
+
+   i915_uc_load_status_info(m, dev_priv-guc.guc_fw);
+
+   tmp = I915_READ(GUC_STATUS);
+
+   seq_printf(m, \nGuC status 0x%08x:\n, tmp);
+   seq_printf(m, \tBootrom status = 0x%x\n,
+   (tmp  GS_BOOTROM_MASK)  GS_BOOTROM_SHIFT);
+   seq_printf(m, \tuKernel status = 0x%x\n,
+   (tmp  GS_UKERNEL_MASK)  GS_UKERNEL_SHIFT);
+   seq_printf(m, \tMIA Core status = 0x%x\n,
+   (tmp  GS_MIA_MASK)  GS_MIA_SHIFT);
+   seq_puts(m, \nScratch registers value:\n);
+   for (i = 0; i  16; i++)
+   seq_printf(m, \t%2d: \t0x%x\n, i, I915_READ(SOFT_SCRATCH(i)));
+
+   return 0;
+}
+
 static int i915_edp_psr_status(struct seq_file *m, void *data)
 {
struct drm_info_node *node = m-private;
@@ -5046,6 +5082,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
{i915_gem_hws_bsd, i915_hws_info, 0, (void *)VCS},
{i915_gem_hws_vebox, i915_hws_info, 0, (void *)VECS},
{i915_gem_batch_pool, i915_gem_batch_pool_info, 0},
+   {i915_guc_load_status, i915_guc_load_status_info, 0},
{i915_frequency_info, i915_frequency_info, 0},
{i915_hangcheck_info, i915_hangcheck_info, 0},
{i915_drpc_info, i915_drpc_info, 0},
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx