#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)
 
        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)