void intel_rc6_park(struct intel_rc6 *rc6)
 {
        struct intel_uncore *uncore = rc6_to_uncore(rc6);
+       unsigned int target;
 
        if (!rc6->enabled)
                return;
 
        /* Turn off the HW timers and go directly to rc6 */
        set(uncore, GEN6_RC_CONTROL, GEN6_RC_CTL_RC6_ENABLE);
-       set(uncore, GEN6_RC_STATE, 0x4 << RC_SW_TARGET_STATE_SHIFT);
+
+       if (HAS_RC6pp(rc6_to_i915(rc6)))
+               target = 0x6; /* deepest rc6 */
+       else if (HAS_RC6p(rc6_to_i915(rc6)))
+               target = 0x5; /* deep rc6 */
+       else
+               target = 0x4; /* normal rc6 */
+       set(uncore, GEN6_RC_STATE, target << RC_SW_TARGET_STATE_SHIFT);
 }
 
 void intel_rc6_disable(struct intel_rc6 *rc6)
 
 
 #include "selftests/i915_random.h"
 
+static u64 rc6_residency(struct intel_rc6 *rc6)
+{
+       u64 result;
+
+       /* XXX VLV_GT_MEDIA_RC6? */
+
+       result = intel_rc6_residency_ns(rc6, GEN6_GT_GFX_RC6);
+       if (HAS_RC6p(rc6_to_i915(rc6)))
+               result += intel_rc6_residency_ns(rc6, GEN6_GT_GFX_RC6p);
+       if (HAS_RC6pp(rc6_to_i915(rc6)))
+               result += intel_rc6_residency_ns(rc6, GEN6_GT_GFX_RC6pp);
+
+       return result;
+}
+
 int live_rc6_manual(void *arg)
 {
        struct intel_gt *gt = arg;
        __intel_rc6_disable(rc6);
        msleep(1); /* wakeup is not immediate, takes about 100us on icl */
 
-       res[0] = intel_rc6_residency_ns(rc6, GEN6_GT_GFX_RC6);
+       res[0] = rc6_residency(rc6);
        msleep(250);
-       res[1] = intel_rc6_residency_ns(rc6, GEN6_GT_GFX_RC6);
+       res[1] = rc6_residency(rc6);
        if ((res[1] - res[0]) >> 10) {
                pr_err("RC6 residency increased by %lldus while disabled for 250ms!\n",
                       (res[1] - res[0]) >> 10);
        /* Manually enter RC6 */
        intel_rc6_park(rc6);
 
-       res[0] = intel_rc6_residency_ns(rc6, GEN6_GT_GFX_RC6);
+       res[0] = rc6_residency(rc6);
        msleep(100);
-       res[1] = intel_rc6_residency_ns(rc6, GEN6_GT_GFX_RC6);
+       res[1] = rc6_residency(rc6);
 
        if (res[1] == res[0]) {
                pr_err("Did not enter RC6! RC6_STATE=%08x, RC6_CONTROL=%08x, residency=%lld\n",