| From 0da26735bb0eadfe8905c5c59022f1ba36375f1f Mon Sep 17 00:00:00 2001 |
| From: Ben Widawsky <ben@bwidawsk.net> |
| Date: Thu, 4 Jul 2013 11:02:05 -0700 |
| Subject: drm/i915: store eLLC size |
| |
| The eLLC cannot be determined by PCIID because as far as we know, even |
| machines supporting eLLC may not have it enabled, or fused off or |
| whatever. It's possible this isn't actually true, and at that point we |
| can switch to a DEV_INFO flag instead. |
| |
| I've defined everything where the docs are clear, and left the rest as |
| magic. |
| |
| But we need it before we set the pte_encode function pointers, which |
| happens really early, in gtt_init. |
| |
| The problem with just doing the normal sequence earlier is we don't have |
| the ability to use forcewake until after the pte functions have been set |
| up. |
| |
| Since all solutions are somewhat ugly (barring rewriting all the init |
| ordering), I've opted to do the detection really early, and the enabling |
| later - since the register to detect doesn't require forcewake. |
| |
| Signed-off-by: Ben Widawsky <ben@bwidawsk.net> |
| [danvet: Move dev_priv->ellc_size away from the dri1 dungeon to a nice |
| place right next to the l3 parity stuff. Also squash in the follow-up |
| commit to read out the eLLC size a bit earlier.] |
| Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| (cherry picked from commit 59124506ba5297e48410e410c3bce83784fddf58) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_dma.c | 10 ++++++++++ |
| drivers/gpu/drm/i915/i915_drv.h | 3 +++ |
| drivers/gpu/drm/i915/i915_gem.c | 2 +- |
| 3 files changed, 14 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_dma.c |
| +++ b/drivers/gpu/drm/i915/i915_dma.c |
| @@ -1535,6 +1535,16 @@ int i915_driver_load(struct drm_device * |
| |
| intel_early_sanitize_regs(dev); |
| |
| + if (IS_HASWELL(dev) && (I915_READ(HSW_EDRAM_PRESENT) == 1)) { |
| + /* The docs do not explain exactly how the calculation can be |
| + * made. It is somewhat guessable, but for now, it's always |
| + * 128MB. |
| + * NB: We can't write IDICR yet because we do not have gt funcs |
| + * set up */ |
| + dev_priv->ellc_size = 128; |
| + DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); |
| + } |
| + |
| ret = i915_gem_gtt_init(dev); |
| if (ret) |
| goto put_bridge; |
| --- a/drivers/gpu/drm/i915/i915_drv.h |
| +++ b/drivers/gpu/drm/i915/i915_drv.h |
| @@ -1152,6 +1152,9 @@ typedef struct drm_i915_private { |
| |
| struct intel_l3_parity l3_parity; |
| |
| + /* Cannot be determined by PCIID. You must always read a register. */ |
| + size_t ellc_size; |
| + |
| /* gen6+ rps state */ |
| struct intel_gen6_power_mgmt rps; |
| |
| --- a/drivers/gpu/drm/i915/i915_gem.c |
| +++ b/drivers/gpu/drm/i915/i915_gem.c |
| @@ -4131,7 +4131,7 @@ i915_gem_init_hw(struct drm_device *dev) |
| if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt()) |
| return -EIO; |
| |
| - if (IS_HASWELL(dev) && (I915_READ(HSW_EDRAM_PRESENT) == 1)) |
| + if (dev_priv->ellc_size) |
| I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf)); |
| |
| if (HAS_PCH_NOP(dev)) { |