drivers/gpu/drm/i915/gt/intel_sseu.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/gt/intel_sseu.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/i915/gt/intel_sseu.c- Extension
.c- Size
- 24755 bytes
- Lines
- 894
- Domain
- Driver Families
- Bucket
- drivers/gpu
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/string_helpers.hdrm/drm_print.hi915_drv.hi915_perf_types.hintel_engine_regs.hintel_gt_regs.hintel_sseu.h
Detected Declarations
function intel_sseu_set_infofunction intel_sseu_subslice_totalfunction intel_sseu_get_hsw_subslicesfunction sseu_get_eusfunction sseu_set_eusfunction compute_eu_totalfunction copy_to_userfunction copy_to_userfunction gen11_compute_sseu_infofunction xehp_compute_sseu_infofunction xehp_load_dss_maskfunction xehp_sseu_info_initfunction gen12_sseu_info_initfunction gen11_sseu_info_initfunction cherryview_sseu_info_initfunction gen9_sseu_info_initfunction bdw_sseu_info_initfunction hsw_sseu_info_initfunction intel_sseu_info_initfunction intel_sseu_make_rpcsfunction intel_sseu_dumpfunction sseu_print_hsw_topologyfunction sseu_print_xehp_topologyfunction intel_sseu_print_topologyfunction intel_sseu_print_ss_infofunction intel_slicemask_from_xehp_dssmask
Annotated Snippet
if (HAS_POOLED_EU(i915)) {
if (IS_SS_DISABLED(2) || IS_SS_DISABLED(0))
sseu->min_eu_in_pool = 3;
else if (IS_SS_DISABLED(1))
sseu->min_eu_in_pool = 6;
else
sseu->min_eu_in_pool = 9;
}
#undef IS_SS_DISABLED
}
}
static void bdw_sseu_info_init(struct intel_gt *gt)
{
struct sseu_dev_info *sseu = >->info.sseu;
struct intel_uncore *uncore = gt->uncore;
int s, ss;
u32 fuse2, subslice_mask, eu_disable[3]; /* s_max */
u32 eu_disable0, eu_disable1, eu_disable2;
fuse2 = intel_uncore_read(uncore, GEN8_FUSE2);
sseu->slice_mask = REG_FIELD_GET(GEN8_F2_S_ENA_MASK, fuse2);
intel_sseu_set_info(sseu, 3, 3, 8);
/*
* The subslice disable field is global, i.e. it applies
* to each of the enabled slices.
*/
subslice_mask = GENMASK(sseu->max_subslices - 1, 0);
subslice_mask &= ~REG_FIELD_GET(GEN8_F2_SS_DIS_MASK, fuse2);
eu_disable0 = intel_uncore_read(uncore, GEN8_EU_DISABLE0);
eu_disable1 = intel_uncore_read(uncore, GEN8_EU_DISABLE1);
eu_disable2 = intel_uncore_read(uncore, GEN8_EU_DISABLE2);
eu_disable[0] =
REG_FIELD_GET(GEN8_EU_DIS0_S0_MASK, eu_disable0);
eu_disable[1] =
REG_FIELD_GET(GEN8_EU_DIS0_S1_MASK, eu_disable0) |
REG_FIELD_GET(GEN8_EU_DIS1_S1_MASK, eu_disable1) << hweight32(GEN8_EU_DIS0_S1_MASK);
eu_disable[2] =
REG_FIELD_GET(GEN8_EU_DIS1_S2_MASK, eu_disable1) |
REG_FIELD_GET(GEN8_EU_DIS2_S2_MASK, eu_disable2) << hweight32(GEN8_EU_DIS1_S2_MASK);
/*
* Iterate through enabled slices and subslices to
* count the total enabled EU.
*/
for (s = 0; s < sseu->max_slices; s++) {
if (!(sseu->slice_mask & BIT(s)))
/* skip disabled slice */
continue;
sseu->subslice_mask.hsw[s] = subslice_mask;
for (ss = 0; ss < sseu->max_subslices; ss++) {
u8 eu_disabled_mask;
u32 n_disabled;
if (!intel_sseu_has_subslice(sseu, s, ss))
/* skip disabled subslice */
continue;
eu_disabled_mask =
eu_disable[s] >> (ss * sseu->max_eus_per_subslice);
sseu_set_eus(sseu, s, ss, ~eu_disabled_mask & 0xFF);
n_disabled = hweight8(eu_disabled_mask);
/*
* Record which subslices have 7 EUs.
*/
if (sseu->max_eus_per_subslice - n_disabled == 7)
sseu->subslice_7eu[s] |= 1 << ss;
}
}
sseu->eu_total = compute_eu_total(sseu);
/*
* BDW is expected to always have a uniform distribution of EU across
* subslices with the exception that any one EU in any one subslice may
* be fused off for die recovery.
*/
sseu->eu_per_subslice =
intel_sseu_subslice_total(sseu) ?
DIV_ROUND_UP(sseu->eu_total, intel_sseu_subslice_total(sseu)) :
0;
/*
* BDW supports slice power gating on devices with more than
Annotation
- Immediate include surface: `linux/string_helpers.h`, `drm/drm_print.h`, `i915_drv.h`, `i915_perf_types.h`, `intel_engine_regs.h`, `intel_gt_regs.h`, `intel_sseu.h`.
- Detected declarations: `function intel_sseu_set_info`, `function intel_sseu_subslice_total`, `function intel_sseu_get_hsw_subslices`, `function sseu_get_eus`, `function sseu_set_eus`, `function compute_eu_total`, `function copy_to_user`, `function copy_to_user`, `function gen11_compute_sseu_info`, `function xehp_compute_sseu_info`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.