Skip to content

Commit

Permalink
drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection
Browse files Browse the repository at this point in the history
This patch adds support to detect ICL, slice, subslice and EU fuse
settings.

Add addresses for ICL 11 slice, subslice and EU fuses registers.
These register addresses are the same as previous platforms but the
format and / or the meaning of the information is different. Therefore
Gen11 defines for these registers are added.

Bspec: 9731
Bspec: 20643
Bspec: 20673

v2: Update fusing information storage after introducing the new query
    uAPI (Lionel)

Signed-off-by: Kelvin Gardiner <kelvin.gardiner@intel.com>
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
  • Loading branch information
kgardine authored and llandwerlin-intel committed Mar 9, 2018
1 parent c1bc9b7 commit ad46d70
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
9 changes: 9 additions & 0 deletions drivers/gpu/drm/i915/i915_reg.h
Expand Up @@ -2876,6 +2876,15 @@ enum i915_power_well_id {
#define GEN11_GT_VEBOX_DISABLE_SHIFT 16
#define GEN11_GT_VEBOX_DISABLE_MASK (0xff << GEN11_GT_VEBOX_DISABLE_SHIFT)

#define GEN11_EU_DISABLE _MMIO(0x9134)
#define GEN11_EU_DIS_MASK 0xFF

#define GEN11_GT_SLICE_ENABLE _MMIO(0x9138)
#define GEN11_GT_S_ENA_MASK 0xFF

#define GEN11_GT_SUBSLICE_DISABLE _MMIO(0x913C)
#define GEN11_GT_SS_DIS_MASK 0xFF

#define GEN6_BSD_SLEEP_PSMI_CONTROL _MMIO(0x12050)
#define GEN6_BSD_SLEEP_MSG_DISABLE (1 << 0)
#define GEN6_BSD_SLEEP_FLUSH_DISABLE (1 << 2)
Expand Down
42 changes: 41 additions & 1 deletion drivers/gpu/drm/i915/intel_device_info.c
Expand Up @@ -158,6 +158,44 @@ static u16 compute_eu_total(const struct sseu_dev_info *sseu)
return total;
}

static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)
{
struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
u8 subslices_enabled;
u8 eus_enabled;
int s, ss;

sseu->max_eus_per_subslice = 8;
sseu->max_slices = 8;
sseu->max_subslices = 8;

subslices_enabled = ~(I915_READ(GEN11_GT_SUBSLICE_DISABLE) &
GEN11_GT_SS_DIS_MASK);
eus_enabled = ~(I915_READ(GEN11_EU_DISABLE) & GEN11_GT_S_ENA_MASK);

sseu->eu_per_subslice = hweight8(eus_enabled);

sseu->slice_mask = I915_READ(GEN11_GT_SLICE_ENABLE) &
GEN11_GT_S_ENA_MASK;

for (s = 0; s < sseu->max_slices; s++) {
if ((sseu->slice_mask & BIT(s)) == 0)
continue;
sseu->subslice_mask[s] = subslices_enabled;

for (ss = 0; ss < sseu->max_subslices; ss++) {
if (sseu->subslice_mask[s] & BIT(ss))
sseu_set_eus(sseu, s, ss, eus_enabled);
}
}
sseu->eu_total = compute_eu_total(sseu);

/* ICL has no power gating restrictions. */
sseu->has_slice_pg = 1;
sseu->has_subslice_pg = 1;
sseu->has_eu_pg = 1;
}

static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)
{
struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
Expand Down Expand Up @@ -768,8 +806,10 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
broadwell_sseu_info_init(dev_priv);
else if (INTEL_GEN(dev_priv) == 9)
gen9_sseu_info_init(dev_priv);
else if (INTEL_GEN(dev_priv) >= 10)
else if (INTEL_GEN(dev_priv) == 10)
gen10_sseu_info_init(dev_priv);
else if (INTEL_INFO(dev_priv)->gen >= 11)
gen11_sseu_info_init(dev_priv);

/* Initialize command stream timestamp frequency */
info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);
Expand Down

0 comments on commit ad46d70

Please sign in to comment.