return round_up(GEN6_CXT_TOTAL_SIZE(cxt_size) * 64,
                                        PAGE_SIZE);
                case 5:
+                       /*
+                        * There is a discrepancy here between the size reported
+                        * by the register and the size of the context layout
+                        * in the docs. Both are described as authorative!
+                        *
+                        * The discrepancy is on the order of a few cachelines,
+                        * but the total is under one page (4k), which is our
+                        * minimum allocation anyway so it should all come
+                        * out in the wash.
+                        */
+                       cxt_size = I915_READ(CXT_SIZE) + 1;
+                       DRM_DEBUG_DRIVER("gen%d CXT_SIZE = %d bytes [0x%08x]\n",
+                                        INTEL_GEN(dev_priv),
+                                        cxt_size * 64,
+                                        cxt_size - 1);
+                       return round_up(cxt_size * 64, PAGE_SIZE);
                case 4:
                case 3:
                case 2:
 
                /* These flags are for resource streamer on HSW+ */
                flags |= HSW_MI_RS_SAVE_STATE_EN | HSW_MI_RS_RESTORE_STATE_EN;
        else
+               /* We need to save the extended state for powersaving modes */
                flags |= MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN;
 
        len = 4;
        if (IS_GEN(i915, 7))
                len += 2 + (num_engines ? 4 * num_engines + 6 : 0);
+       else if (IS_GEN(i915, 5))
+               len += 2;
        if (flags & MI_FORCE_RESTORE) {
                GEM_BUG_ON(flags & MI_RESTORE_INHIBIT);
                flags &= ~MI_FORCE_RESTORE;
                                                GEN6_PSMI_SLEEP_MSG_DISABLE);
                        }
                }
+       } else if (IS_GEN(i915, 5)) {
+               /*
+                * This w/a is only listed for pre-production ilk a/b steppings,
+                * but is also mentioned for programming the powerctx. To be
+                * safe, just apply the workaround; we do not use SyncFlush so
+                * this should never take effect and so be a no-op!
+                */
+               *cs++ = MI_SUSPEND_FLUSH | MI_SUSPEND_FLUSH_EN;
        }
 
        if (force_restore) {
                        *cs++ = MI_NOOP;
                }
                *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
+       } else if (IS_GEN(i915, 5)) {
+               *cs++ = MI_SUSPEND_FLUSH;
        }
 
        intel_ring_advance(rq, cs);