drm/i915: Calculate edram size
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Wed, 13 Apr 2016 14:26:44 +0000 (17:26 +0300)
committerMika Kuoppala <mika.kuoppala@intel.com>
Thu, 14 Apr 2016 09:27:37 +0000 (12:27 +0300)
With gen9+ the edram capabilities are defined so
that we can calculate the edram (ellc) size accordingly.

Note that there are undefined combinations for some subset of
edram capability bits. Return the closest size for undefined indexes.
Even if we get it wrong with beginning of future gen enabling, the size
information is currently only used for boot message and in debugfs entry.

v2: Use function instead of hard to read macro (Daniel)
v3: s/INTEL_INFO/INTEL_GEN (Matthew)

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1460557604-7126-2-git-send-email-mika.kuoppala@intel.com
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_uncore.c

index bedce95aa0461c1ee693b992cf7d6b869379e3d4..d0a1928870ead44eb64488543ab88b5bcf93d715 100644 (file)
@@ -6884,6 +6884,9 @@ enum skl_disp_power_wells {
 #define    IDIHASHMSK(x)                       (((x) & 0x3f) << 16)
 #define  HSW_EDRAM_CAP                         _MMIO(0x120010)
 #define    EDRAM_ENABLED                       0x1
+#define    EDRAM_NUM_BANKS(cap)                        (((cap) >> 1) & 0xf)
+#define    EDRAM_WAYS_IDX(cap)                 (((cap) >> 5) & 0x7)
+#define    EDRAM_SETS_IDX(cap)                 (((cap) >> 8) & 0x3)
 
 #define GEN6_UCGCTL1                           _MMIO(0x9400)
 # define GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE             (1 << 16)
index 89cda6342ce20c5bff31ceed451c230484b971fd..4db21ef36b16e002f0874873b2c2068e44b2bca5 100644 (file)
@@ -315,17 +315,30 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
        spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
+static u64 gen9_edram_size(struct drm_i915_private *dev_priv)
+{
+       const unsigned int ways[8] = { 4, 8, 12, 16, 16, 16, 16, 16 };
+       const unsigned int sets[4] = { 1, 1, 2, 2 };
+       const u32 cap = dev_priv->edram_cap;
+
+       return EDRAM_NUM_BANKS(cap) *
+               ways[EDRAM_WAYS_IDX(cap)] *
+               sets[EDRAM_SETS_IDX(cap)] *
+               1024 * 1024;
+}
+
 u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv)
 {
        if (!HAS_EDRAM(dev_priv))
                return 0;
 
-       /* The docs do not explain exactly how the calculation can be
-        * made. It is somewhat guessable, but for now, it's always
-        * 128MB.
+       /* The needed capability bits for size calculation
+        * are not there with pre gen9 so return 128MB always.
         */
+       if (INTEL_GEN(dev_priv) < 9)
+               return 128 * 1024 * 1024;
 
-       return 128 * 1024 * 1024;
+       return gen9_edram_size(dev_priv);
 }
 
 static void intel_uncore_edram_detect(struct drm_i915_private *dev_priv)