Skip to content

Commit 3accaf7

Browse files
committed
drm/i915: Store and use edram capabilities
Store the edram capabilities instead of only the size of edram. This is preparatory patch to allow edram size calculation based on edram capability bits for gen9+. With gen9 the edram is behind llc and is a separate entity. With hsw/bdw it was more of a victim cache for LLC so the name 'eLLC' might be warranted. Regardless, rename all mentions of eLLC to EDRAM to clear the confusion. v2: return bytes for edram size (Chris) s/eLLC/eDRAM in output if we are gen > 8 v3: rebase, INTEL_GEN (Chris) Signed-off-by: Mika Kuoppala <[email protected]> Reviewed-by: Chris Wilson <[email protected]>
1 parent 666fbcf commit 3accaf7

File tree

6 files changed

+39
-19
lines changed

6 files changed

+39
-19
lines changed

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,10 +2404,11 @@ static int i915_llc(struct seq_file *m, void *data)
24042404
struct drm_info_node *node = m->private;
24052405
struct drm_device *dev = node->minor->dev;
24062406
struct drm_i915_private *dev_priv = dev->dev_private;
2407+
const bool edram = INTEL_GEN(dev_priv) > 8;
24072408

2408-
/* Size calculation for LLC is a bit of a pain. Ignore for now. */
24092409
seq_printf(m, "LLC: %s\n", yesno(HAS_LLC(dev)));
2410-
seq_printf(m, "eLLC: %zuMB\n", dev_priv->ellc_size);
2410+
seq_printf(m, "%s: %lluMB\n", edram ? "eDRAM" : "eLLC",
2411+
intel_uncore_edram_size(dev_priv)/1024/1024);
24112412

24122413
return 0;
24132414
}

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,7 +1873,7 @@ struct drm_i915_private {
18731873
struct intel_l3_parity l3_parity;
18741874

18751875
/* Cannot be determined by PCIID. You must always read a register. */
1876-
size_t ellc_size;
1876+
u32 edram_cap;
18771877

18781878
/* gen6+ rps state */
18791879
struct intel_gen6_power_mgmt rps;
@@ -2624,8 +2624,9 @@ struct drm_i915_cmd_table {
26242624
#define HAS_VEBOX(dev) (INTEL_INFO(dev)->ring_mask & VEBOX_RING)
26252625
#define HAS_LLC(dev) (INTEL_INFO(dev)->has_llc)
26262626
#define HAS_SNOOP(dev) (INTEL_INFO(dev)->has_snoop)
2627+
#define HAS_EDRAM(dev) (__I915__(dev)->edram_cap & EDRAM_ENABLED)
26272628
#define HAS_WT(dev) ((IS_HASWELL(dev) || IS_BROADWELL(dev)) && \
2628-
__I915__(dev)->ellc_size)
2629+
HAS_EDRAM(dev))
26292630
#define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws)
26302631

26312632
#define HAS_HW_CONTEXTS(dev) (INTEL_INFO(dev)->gen >= 6)
@@ -2803,6 +2804,8 @@ void intel_uncore_forcewake_get__locked(struct drm_i915_private *dev_priv,
28032804
enum forcewake_domains domains);
28042805
void intel_uncore_forcewake_put__locked(struct drm_i915_private *dev_priv,
28052806
enum forcewake_domains domains);
2807+
u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv);
2808+
28062809
void assert_forcewakes_inactive(struct drm_i915_private *dev_priv);
28072810
static inline bool intel_vgpu_active(struct drm_device *dev)
28082811
{

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4892,7 +4892,7 @@ i915_gem_init_hw(struct drm_device *dev)
48924892
/* Double layer security blanket, see i915_gem_init() */
48934893
intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
48944894

4895-
if (dev_priv->ellc_size && INTEL_GEN(dev_priv) < 9)
4895+
if (HAS_EDRAM(dev) && INTEL_GEN(dev_priv) < 9)
48964896
I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf));
48974897

48984898
if (IS_HASWELL(dev))

drivers/gpu/drm/i915/i915_gem_gtt.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3172,7 +3172,8 @@ int i915_ggtt_init_hw(struct drm_device *dev)
31723172
} else if (INTEL_INFO(dev)->gen < 8) {
31733173
ggtt->probe = gen6_gmch_probe;
31743174
ggtt->base.cleanup = gen6_gmch_remove;
3175-
if (IS_HASWELL(dev) && dev_priv->ellc_size)
3175+
3176+
if (HAS_EDRAM(dev))
31763177
ggtt->base.pte_encode = iris_pte_encode;
31773178
else if (IS_HASWELL(dev))
31783179
ggtt->base.pte_encode = hsw_pte_encode;

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6882,7 +6882,7 @@ enum skl_disp_power_wells {
68826882

68836883
#define HSW_IDICR _MMIO(0x9008)
68846884
#define IDIHASHMSK(x) (((x) & 0x3f) << 16)
6885-
#define HSW_EDRAM_PRESENT _MMIO(0x120010)
6885+
#define HSW_EDRAM_CAP _MMIO(0x120010)
68866886
#define EDRAM_ENABLED 0x1
68876887

68886888
#define GEN6_UCGCTL1 _MMIO(0x9400)

drivers/gpu/drm/i915/intel_uncore.c

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -315,21 +315,36 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
315315
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
316316
}
317317

318-
static void intel_uncore_ellc_detect(struct drm_device *dev)
318+
u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv)
319319
{
320-
struct drm_i915_private *dev_priv = dev->dev_private;
320+
if (!HAS_EDRAM(dev_priv))
321+
return 0;
322+
323+
/* The docs do not explain exactly how the calculation can be
324+
* made. It is somewhat guessable, but for now, it's always
325+
* 128MB.
326+
*/
327+
328+
return 128 * 1024 * 1024;
329+
}
330+
331+
static void intel_uncore_edram_detect(struct drm_i915_private *dev_priv)
332+
{
333+
if (IS_HASWELL(dev_priv) ||
334+
IS_BROADWELL(dev_priv) ||
335+
INTEL_GEN(dev_priv) >= 9) {
336+
dev_priv->edram_cap = __raw_i915_read32(dev_priv,
337+
HSW_EDRAM_CAP);
321338

322-
if ((IS_HASWELL(dev) || IS_BROADWELL(dev) ||
323-
INTEL_INFO(dev)->gen >= 9) &&
324-
(__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) & EDRAM_ENABLED)) {
325-
/* The docs do not explain exactly how the calculation can be
326-
* made. It is somewhat guessable, but for now, it's always
327-
* 128MB.
328-
* NB: We can't write IDICR yet because we do not have gt funcs
339+
/* NB: We can't write IDICR yet because we do not have gt funcs
329340
* set up */
330-
dev_priv->ellc_size = 128;
331-
DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
341+
} else {
342+
dev_priv->edram_cap = 0;
332343
}
344+
345+
if (HAS_EDRAM(dev_priv))
346+
DRM_INFO("Found %lluMB of eDRAM\n",
347+
intel_uncore_edram_size(dev_priv) / (1024 * 1024));
333348
}
334349

335350
static bool
@@ -1301,7 +1316,7 @@ void intel_uncore_init(struct drm_device *dev)
13011316

13021317
i915_check_vgpu(dev);
13031318

1304-
intel_uncore_ellc_detect(dev);
1319+
intel_uncore_edram_detect(dev_priv);
13051320
intel_uncore_fw_domains_init(dev);
13061321
__intel_uncore_early_sanitize(dev, false);
13071322

0 commit comments

Comments
 (0)