diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index bedce95aa0461c1ee693b992cf7d6b869379e3d4..d0a1928870ead44eb64488543ab88b5bcf93d715 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -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) diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c index 89cda6342ce20c5bff31ceed451c230484b971fd..4db21ef36b16e002f0874873b2c2068e44b2bca5 100644 --- a/drivers/gpu/drm/i915/intel_uncore.c +++ b/drivers/gpu/drm/i915/intel_uncore.c @@ -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)