drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c- Extension
.c- Size
- 66889 bytes
- Lines
- 1985
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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
drm/drm_atomic_helper.hdrm/drm_blend.hdrm/drm_framebuffer.hdrm/drm_gem_atomic_helper.hdrm/drm_plane_helper.hdrm/drm_gem_framebuffer_helper.hdrm/drm_fourcc.hamdgpu.hdal_asic_id.hamdgpu_display.hamdgpu_dm_trace.hamdgpu_dm_plane.hamdgpu_dm_colorop.hgc/gc_11_0_0_offset.hgc/gc_11_0_0_sh_mask.h
Detected Declarations
enum dm_micro_swizzlefunction amdgpu_dm_plane_fill_blending_from_plane_statefunction amdgpu_dm_plane_add_modifierfunction amdgpu_dm_plane_modifier_has_dccfunction amdgpu_dm_plane_modifier_gfx9_swizzle_modefunction amdgpu_dm_plane_fill_gfx8_tiling_info_from_flagsfunction amdgpu_dm_plane_fill_gfx9_tiling_info_from_devicefunction amdgpu_dm_plane_fill_gfx9_tiling_info_from_modifierfunction amdgpu_dm_plane_validate_dccfunction amdgpu_dm_plane_fill_gfx9_plane_attributes_from_modifiersfunction amdgpu_dm_plane_fill_gfx12_plane_attributes_from_modifiersfunction amdgpu_dm_plane_add_gfx10_1_modifiersfunction amdgpu_dm_plane_add_gfx9_modifiersfunction amdgpu_dm_plane_add_gfx10_3_modifiersfunction amdgpu_dm_plane_add_gfx11_modifiersfunction amdgpu_dm_plane_add_gfx12_modifiersfunction amdgpu_dm_plane_get_plane_modifiersfunction amdgpu_dm_plane_get_plane_formatsfunction amdgpu_dm_plane_fill_plane_buffer_attributesfunction amdgpu_dm_plane_helper_prepare_fbfunction amdgpu_dm_plane_helper_cleanup_fbfunction amdgpu_dm_plane_get_min_max_dc_plane_scalingfunction amdgpu_dm_plane_helper_check_statefunction amdgpu_dm_plane_fill_dc_scaling_infofunction amdgpu_dm_plane_atomic_checkfunction amdgpu_dm_plane_atomic_async_checkfunction amdgpu_dm_plane_get_cursor_positionfunction amdgpu_dm_plane_handle_cursor_updatefunction amdgpu_dm_plane_atomic_async_updatefunction amdgpu_dm_plane_panic_flushfunction amdgpu_dm_plane_drm_plane_resetfunction amdgpu_dm_plane_format_mod_supportedfunction amdgpu_dm_plane_drm_plane_destroy_statefunction dm_atomic_plane_attach_color_mgmt_propertiesfunction dm_atomic_plane_set_propertyfunction dm_atomic_plane_get_propertyfunction dm_plane_init_coloropsfunction amdgpu_dm_plane_initfunction amdgpu_dm_plane_is_video_format
Annotated Snippet
if (format == alpha_formats[i]) {
*per_pixel_alpha = true;
break;
}
}
if (*per_pixel_alpha && plane_state->pixel_blend_mode == DRM_MODE_BLEND_COVERAGE)
*pre_multiplied_alpha = false;
}
if (plane_state->alpha < 0xffff) {
*global_alpha = true;
*global_alpha_value = plane_state->alpha >> 8;
}
}
static void amdgpu_dm_plane_add_modifier(uint64_t **mods, uint64_t *size, uint64_t *cap, uint64_t mod)
{
if (!*mods)
return;
if (*cap - *size < 1) {
uint64_t new_cap = *cap * 2;
uint64_t *new_mods = kmalloc_array(new_cap, sizeof(uint64_t), GFP_KERNEL);
if (!new_mods) {
kfree(*mods);
*mods = NULL;
return;
}
memcpy(new_mods, *mods, sizeof(uint64_t) * *size);
kfree(*mods);
*mods = new_mods;
*cap = new_cap;
}
(*mods)[*size] = mod;
*size += 1;
}
static bool amdgpu_dm_plane_modifier_has_dcc(uint64_t modifier)
{
return IS_AMD_FMT_MOD(modifier) && AMD_FMT_MOD_GET(DCC, modifier);
}
static unsigned int amdgpu_dm_plane_modifier_gfx9_swizzle_mode(uint64_t modifier)
{
if (modifier == DRM_FORMAT_MOD_LINEAR)
return 0;
return AMD_FMT_MOD_GET(TILE, modifier);
}
static void amdgpu_dm_plane_fill_gfx8_tiling_info_from_flags(struct dc_tiling_info *tiling_info,
uint64_t tiling_flags)
{
/* Fill GFX8 params */
if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == DC_ARRAY_2D_TILED_THIN1) {
unsigned int bankw, bankh, mtaspect, tile_split, num_banks;
bankw = AMDGPU_TILING_GET(tiling_flags, BANK_WIDTH);
bankh = AMDGPU_TILING_GET(tiling_flags, BANK_HEIGHT);
mtaspect = AMDGPU_TILING_GET(tiling_flags, MACRO_TILE_ASPECT);
tile_split = AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT);
num_banks = AMDGPU_TILING_GET(tiling_flags, NUM_BANKS);
tiling_info->gfxversion = DcGfxVersion8;
/* XXX fix me for VI */
tiling_info->gfx8.num_banks = num_banks;
tiling_info->gfx8.array_mode =
DC_ARRAY_2D_TILED_THIN1;
tiling_info->gfx8.tile_split = tile_split;
tiling_info->gfx8.bank_width = bankw;
tiling_info->gfx8.bank_height = bankh;
tiling_info->gfx8.tile_aspect = mtaspect;
tiling_info->gfx8.tile_mode =
DC_ADDR_SURF_MICRO_TILING_DISPLAY;
} else if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE)
== DC_ARRAY_1D_TILED_THIN1) {
tiling_info->gfx8.array_mode = DC_ARRAY_1D_TILED_THIN1;
}
tiling_info->gfx8.pipe_config =
AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
}
static void amdgpu_dm_plane_fill_gfx9_tiling_info_from_device(const struct amdgpu_device *adev,
struct dc_tiling_info *tiling_info)
{
Annotation
- Immediate include surface: `drm/drm_atomic_helper.h`, `drm/drm_blend.h`, `drm/drm_framebuffer.h`, `drm/drm_gem_atomic_helper.h`, `drm/drm_plane_helper.h`, `drm/drm_gem_framebuffer_helper.h`, `drm/drm_fourcc.h`, `amdgpu.h`.
- Detected declarations: `enum dm_micro_swizzle`, `function amdgpu_dm_plane_fill_blending_from_plane_state`, `function amdgpu_dm_plane_add_modifier`, `function amdgpu_dm_plane_modifier_has_dcc`, `function amdgpu_dm_plane_modifier_gfx9_swizzle_mode`, `function amdgpu_dm_plane_fill_gfx8_tiling_info_from_flags`, `function amdgpu_dm_plane_fill_gfx9_tiling_info_from_device`, `function amdgpu_dm_plane_fill_gfx9_tiling_info_from_modifier`, `function amdgpu_dm_plane_validate_dcc`, `function amdgpu_dm_plane_fill_gfx9_plane_attributes_from_modifiers`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.