drivers/gpu/drm/i915/display/intel_dram.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/display/intel_dram.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/i915/display/intel_dram.c- Extension
.c- Size
- 19487 bytes
- Lines
- 856
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/string_helpers.hdrm/drm_managed.hdrm/drm_print.hdrm/intel/intel_pcode_regs.hintel_de.hintel_display_core.hintel_display_utils.hintel_display_regs.hintel_dram.hintel_mchbar.hintel_parent.hvlv_sideband.h
Detected Declarations
struct dram_dimm_infostruct dram_channel_infofunction pnv_dram_typefunction pnv_mem_freqfunction ilk_mem_freqfunction chv_mem_freqfunction vlv_mem_freqfunction intel_mem_freqfunction i9xx_fsb_freqfunction ilk_fsb_freqfunction intel_fsb_freqfunction i915_get_dram_infofunction intel_dimm_num_devicesfunction skl_get_dimm_s_sizefunction skl_get_dimm_l_sizefunction skl_get_dimm_s_widthfunction skl_get_dimm_l_widthfunction skl_get_dimm_s_ranksfunction skl_get_dimm_l_ranksfunction icl_get_dimm_s_sizefunction icl_get_dimm_l_sizefunction icl_get_dimm_s_widthfunction icl_get_dimm_l_widthfunction icl_get_dimm_s_ranksfunction icl_get_dimm_l_ranksfunction skl_is_16gb_dimmfunction skl_dram_print_dimm_infofunction skl_dram_get_dimm_l_infofunction skl_dram_get_dimm_s_infofunction skl_dram_get_channel_infofunction intel_is_dram_symmetricfunction skl_dram_get_channels_infofunction skl_get_dram_typefunction skl_get_dram_infofunction bxt_get_dimm_sizefunction bxt_get_dimm_widthfunction bxt_get_dimm_ranksfunction bxt_get_dimm_typefunction bxt_get_dimm_infofunction bxt_get_dram_infofunction icl_pcode_read_mem_global_infofunction gen11_get_dram_infofunction gen12_get_dram_infofunction xelpdp_get_dram_infofunction intel_dram_detect
Annotated Snippet
struct dram_dimm_info {
u16 size;
u8 width, ranks;
};
struct dram_channel_info {
struct dram_dimm_info dimm_l, dimm_s;
u8 ranks;
bool is_16gb_dimm;
};
#define DRAM_TYPE_STR(type) [INTEL_DRAM_ ## type] = #type
const char *intel_dram_type_str(enum intel_dram_type type)
{
static const char * const str[] = {
DRAM_TYPE_STR(UNKNOWN),
DRAM_TYPE_STR(DDR2),
DRAM_TYPE_STR(DDR3),
DRAM_TYPE_STR(DDR4),
DRAM_TYPE_STR(LPDDR3),
DRAM_TYPE_STR(LPDDR4),
DRAM_TYPE_STR(DDR5),
DRAM_TYPE_STR(LPDDR5),
DRAM_TYPE_STR(GDDR),
DRAM_TYPE_STR(GDDR_ECC),
};
BUILD_BUG_ON(ARRAY_SIZE(str) != __INTEL_DRAM_TYPE_MAX);
if (type >= ARRAY_SIZE(str))
type = INTEL_DRAM_UNKNOWN;
return str[type];
}
#undef DRAM_TYPE_STR
static enum intel_dram_type pnv_dram_type(struct intel_display *display)
{
return intel_mchbar_read(display, CSHRDDR3CTL) & CSHRDDR3CTL_DDR3 ?
INTEL_DRAM_DDR3 : INTEL_DRAM_DDR2;
}
static unsigned int pnv_mem_freq(struct intel_display *display)
{
u32 tmp;
tmp = intel_mchbar_read(display, CLKCFG);
switch (tmp & CLKCFG_MEM_MASK) {
case CLKCFG_MEM_533:
return 533333;
case CLKCFG_MEM_667:
return 666667;
case CLKCFG_MEM_800:
return 800000;
}
return 0;
}
static unsigned int ilk_mem_freq(struct intel_display *display)
{
u16 ddrpll;
ddrpll = intel_mchbar_read16(display, DDRMPLL1);
switch (ddrpll & 0xff) {
case 0xc:
return 800000;
case 0x10:
return 1066667;
case 0x14:
return 1333333;
case 0x18:
return 1600000;
default:
drm_dbg_kms(display->drm, "unknown memory frequency 0x%02x\n",
ddrpll & 0xff);
return 0;
}
}
static unsigned int chv_mem_freq(struct intel_display *display)
{
u32 val;
vlv_cck_get(display);
val = vlv_cck_read(display, CCK_FUSE_REG);
vlv_cck_put(display);
Annotation
- Immediate include surface: `linux/string_helpers.h`, `drm/drm_managed.h`, `drm/drm_print.h`, `drm/intel/intel_pcode_regs.h`, `intel_de.h`, `intel_display_core.h`, `intel_display_utils.h`, `intel_display_regs.h`.
- Detected declarations: `struct dram_dimm_info`, `struct dram_channel_info`, `function pnv_dram_type`, `function pnv_mem_freq`, `function ilk_mem_freq`, `function chv_mem_freq`, `function vlv_mem_freq`, `function intel_mem_freq`, `function i9xx_fsb_freq`, `function ilk_fsb_freq`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
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.