aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-08-22 12:23:13 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-08-23 08:52:37 -0400
commite8016055335687b90e7cd5bbfa30e0c269417f34 (patch)
treefbad2cafac736d67fb86b00114409fc2b315557e
parent35d8f2eb259e2d32c4bb67e9733ba0cba031f64f (diff)
drm/i915: Fix context size calculation on SNB/IVB/VLV
All the different context sizes reported in the CXT_SIZE register aren't meant to be simply added together. While BSpec is somewhat unclear on the topic of the actual context size, empirical tests have now revealed the truth. So let's add a big fat comment to remind people how it all works. As a result of correctly interpreting CXT_SIZE, the IVB context size is reduced from three pages to two, while SNB context size remains at two pages. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Acked-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h23
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index c4c509895826..76d965c38d7e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1705,15 +1705,26 @@
1705 */ 1705 */
1706#define CCID 0x2180 1706#define CCID 0x2180
1707#define CCID_EN (1<<0) 1707#define CCID_EN (1<<0)
1708/*
1709 * Notes on SNB/IVB/VLV context size:
1710 * - Power context is saved elsewhere (LLC or stolen)
1711 * - Ring/execlist context is saved on SNB, not on IVB
1712 * - Extended context size already includes render context size
1713 * - We always need to follow the extended context size.
1714 * SNB BSpec has comments indicating that we should use the
1715 * render context size instead if execlists are disabled, but
1716 * based on empirical testing that's just nonsense.
1717 * - Pipelined/VF state is saved on SNB/IVB respectively
1718 * - GT1 size just indicates how much of render context
1719 * doesn't need saving on GT1
1720 */
1708#define CXT_SIZE 0x21a0 1721#define CXT_SIZE 0x21a0
1709#define GEN6_CXT_POWER_SIZE(cxt_reg) ((cxt_reg >> 24) & 0x3f) 1722#define GEN6_CXT_POWER_SIZE(cxt_reg) ((cxt_reg >> 24) & 0x3f)
1710#define GEN6_CXT_RING_SIZE(cxt_reg) ((cxt_reg >> 18) & 0x3f) 1723#define GEN6_CXT_RING_SIZE(cxt_reg) ((cxt_reg >> 18) & 0x3f)
1711#define GEN6_CXT_RENDER_SIZE(cxt_reg) ((cxt_reg >> 12) & 0x3f) 1724#define GEN6_CXT_RENDER_SIZE(cxt_reg) ((cxt_reg >> 12) & 0x3f)
1712#define GEN6_CXT_EXTENDED_SIZE(cxt_reg) ((cxt_reg >> 6) & 0x3f) 1725#define GEN6_CXT_EXTENDED_SIZE(cxt_reg) ((cxt_reg >> 6) & 0x3f)
1713#define GEN6_CXT_PIPELINE_SIZE(cxt_reg) ((cxt_reg >> 0) & 0x3f) 1726#define GEN6_CXT_PIPELINE_SIZE(cxt_reg) ((cxt_reg >> 0) & 0x3f)
1714#define GEN6_CXT_TOTAL_SIZE(cxt_reg) (GEN6_CXT_POWER_SIZE(cxt_reg) + \ 1727#define GEN6_CXT_TOTAL_SIZE(cxt_reg) (GEN6_CXT_RING_SIZE(cxt_reg) + \
1715 GEN6_CXT_RING_SIZE(cxt_reg) + \
1716 GEN6_CXT_RENDER_SIZE(cxt_reg) + \
1717 GEN6_CXT_EXTENDED_SIZE(cxt_reg) + \ 1728 GEN6_CXT_EXTENDED_SIZE(cxt_reg) + \
1718 GEN6_CXT_PIPELINE_SIZE(cxt_reg)) 1729 GEN6_CXT_PIPELINE_SIZE(cxt_reg))
1719#define GEN7_CXT_SIZE 0x21a8 1730#define GEN7_CXT_SIZE 0x21a8
@@ -1723,11 +1734,7 @@
1723#define GEN7_CXT_EXTENDED_SIZE(ctx_reg) ((ctx_reg >> 9) & 0x7f) 1734#define GEN7_CXT_EXTENDED_SIZE(ctx_reg) ((ctx_reg >> 9) & 0x7f)
1724#define GEN7_CXT_GT1_SIZE(ctx_reg) ((ctx_reg >> 6) & 0x7) 1735#define GEN7_CXT_GT1_SIZE(ctx_reg) ((ctx_reg >> 6) & 0x7)
1725#define GEN7_CXT_VFSTATE_SIZE(ctx_reg) ((ctx_reg >> 0) & 0x3f) 1736#define GEN7_CXT_VFSTATE_SIZE(ctx_reg) ((ctx_reg >> 0) & 0x3f)
1726#define GEN7_CXT_TOTAL_SIZE(ctx_reg) (GEN7_CXT_POWER_SIZE(ctx_reg) + \ 1737#define GEN7_CXT_TOTAL_SIZE(ctx_reg) (GEN7_CXT_EXTENDED_SIZE(ctx_reg) + \
1727 GEN7_CXT_RING_SIZE(ctx_reg) + \
1728 GEN7_CXT_RENDER_SIZE(ctx_reg) + \
1729 GEN7_CXT_EXTENDED_SIZE(ctx_reg) + \
1730 GEN7_CXT_GT1_SIZE(ctx_reg) + \
1731 GEN7_CXT_VFSTATE_SIZE(ctx_reg)) 1738 GEN7_CXT_VFSTATE_SIZE(ctx_reg))
1732/* Haswell does have the CXT_SIZE register however it does not appear to be 1739/* Haswell does have the CXT_SIZE register however it does not appear to be
1733 * valid. Now, docs explain in dwords what is in the context object. The full 1740 * valid. Now, docs explain in dwords what is in the context object. The full