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;
        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;