|
@@ -1001,7 +1001,7 @@ static int i915_inttoext_table(struct seq_file *m, void *unused)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int i915_drpc_info(struct seq_file *m, void *unused)
|
|
|
+static int ironlake_drpc_info(struct seq_file *m)
|
|
|
{
|
|
|
struct drm_info_node *node = (struct drm_info_node *) m->private;
|
|
|
struct drm_device *dev = node->minor->dev;
|
|
@@ -1068,6 +1068,90 @@ static int i915_drpc_info(struct seq_file *m, void *unused)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int gen6_drpc_info(struct seq_file *m)
|
|
|
+{
|
|
|
+
|
|
|
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
|
|
|
+ struct drm_device *dev = node->minor->dev;
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ u32 rpmodectl1, gt_core_status, rcctl1;
|
|
|
+ int count=0, ret;
|
|
|
+
|
|
|
+
|
|
|
+ ret = mutex_lock_interruptible(&dev->struct_mutex);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (atomic_read(&dev_priv->forcewake_count)) {
|
|
|
+ seq_printf(m, "RC information inaccurate because userspace "
|
|
|
+ "holds a reference \n");
|
|
|
+ } else {
|
|
|
+ /* NB: we cannot use forcewake, else we read the wrong values */
|
|
|
+ while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1))
|
|
|
+ udelay(10);
|
|
|
+ seq_printf(m, "RC information accurate: %s\n", yesno(count < 51));
|
|
|
+ }
|
|
|
+
|
|
|
+ gt_core_status = readl(dev_priv->regs + GEN6_GT_CORE_STATUS);
|
|
|
+ trace_i915_reg_rw(false, GEN6_GT_CORE_STATUS, gt_core_status, 4);
|
|
|
+
|
|
|
+ rpmodectl1 = I915_READ(GEN6_RP_CONTROL);
|
|
|
+ rcctl1 = I915_READ(GEN6_RC_CONTROL);
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
+
|
|
|
+ seq_printf(m, "Video Turbo Mode: %s\n",
|
|
|
+ yesno(rpmodectl1 & GEN6_RP_MEDIA_TURBO));
|
|
|
+ seq_printf(m, "HW control enabled: %s\n",
|
|
|
+ yesno(rpmodectl1 & GEN6_RP_ENABLE));
|
|
|
+ seq_printf(m, "SW control enabled: %s\n",
|
|
|
+ yesno((rpmodectl1 & GEN6_RP_MEDIA_MODE_MASK) ==
|
|
|
+ GEN6_RP_MEDIA_SW_MODE));
|
|
|
+ seq_printf(m, "RC6 Enabled: %s\n",
|
|
|
+ yesno(rcctl1 & GEN6_RC_CTL_RC1e_ENABLE));
|
|
|
+ seq_printf(m, "RC6 Enabled: %s\n",
|
|
|
+ yesno(rcctl1 & GEN6_RC_CTL_RC6_ENABLE));
|
|
|
+ seq_printf(m, "Deep RC6 Enabled: %s\n",
|
|
|
+ yesno(rcctl1 & GEN6_RC_CTL_RC6p_ENABLE));
|
|
|
+ seq_printf(m, "Deepest RC6 Enabled: %s\n",
|
|
|
+ yesno(rcctl1 & GEN6_RC_CTL_RC6pp_ENABLE));
|
|
|
+ seq_printf(m, "Current RC state: ");
|
|
|
+ switch (gt_core_status & GEN6_RCn_MASK) {
|
|
|
+ case GEN6_RC0:
|
|
|
+ if (gt_core_status & GEN6_CORE_CPD_STATE_MASK)
|
|
|
+ seq_printf(m, "Core Power Down\n");
|
|
|
+ else
|
|
|
+ seq_printf(m, "on\n");
|
|
|
+ break;
|
|
|
+ case GEN6_RC3:
|
|
|
+ seq_printf(m, "RC3\n");
|
|
|
+ break;
|
|
|
+ case GEN6_RC6:
|
|
|
+ seq_printf(m, "RC6\n");
|
|
|
+ break;
|
|
|
+ case GEN6_RC7:
|
|
|
+ seq_printf(m, "RC7\n");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ seq_printf(m, "Unknown\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ seq_printf(m, "Core Power Down: %s\n",
|
|
|
+ yesno(gt_core_status & GEN6_CORE_CPD_STATE_MASK));
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int i915_drpc_info(struct seq_file *m, void *unused)
|
|
|
+{
|
|
|
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
|
|
|
+ struct drm_device *dev = node->minor->dev;
|
|
|
+
|
|
|
+ if (IS_GEN6(dev) || IS_GEN7(dev))
|
|
|
+ return gen6_drpc_info(m);
|
|
|
+ else
|
|
|
+ return ironlake_drpc_info(m);
|
|
|
+}
|
|
|
+
|
|
|
static int i915_fbc_status(struct seq_file *m, void *unused)
|
|
|
{
|
|
|
struct drm_info_node *node = (struct drm_info_node *) m->private;
|