drivers/gpu/drm/amd/display/dc/dml2_0/dml21/src/dml2_pmo/dml2_pmo_dcn42.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/src/dml2_pmo/dml2_pmo_dcn42.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/dc/dml2_0/dml21/src/dml2_pmo/dml2_pmo_dcn42.c- Extension
.c- Size
- 15290 bytes
- Lines
- 392
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
dml2_pmo_dcn42.hlib_float_math.hdml2_debug.hdml2_pmo_dcn4_fams2.h
Detected Declarations
function is_bit_set_in_bitfieldfunction dcn42_set_bit_in_bitfieldfunction setup_planes_for_vactive_by_maskfunction reset_display_configurationfunction setup_display_configfunction pmo_dcn42_init_for_pstate_supportfunction pmo_dcn42_fams2_optimize_for_pstate_supportfunction pmo_dcn42_test_for_pstate_supportfunction pmo_dcn42_initialize
Annotated Snippet
if (is_bit_set_in_bitfield(plane_mask, plane_index)) {
plane = &display_config->display_config.plane_descriptors[plane_index];
plane->overrides.reserved_vblank_time_ns = (long)math_max2(pmo->soc_bb->power_management_parameters.dram_clk_change_blackout_us * 1000.0,
plane->overrides.reserved_vblank_time_ns);
display_config->stage3.pstate_switch_modes[plane_index] = dml2_pstate_method_vactive;
}
}
}
static void reset_display_configuration(struct display_configuation_with_meta *display_config)
{
unsigned int plane_index;
unsigned int stream_index;
struct dml2_plane_parameters *plane;
for (stream_index = 0; stream_index < display_config->display_config.num_streams; stream_index++) {
display_config->stage3.stream_svp_meta[stream_index].valid = false;
}
for (plane_index = 0; plane_index < display_config->display_config.num_planes; plane_index++) {
plane = &display_config->display_config.plane_descriptors[plane_index];
// Unset SubVP
plane->overrides.legacy_svp_config = dml2_svp_mode_override_auto;
// Remove reserve time
plane->overrides.reserved_vblank_time_ns = 0;
// Reset strategy to auto
plane->overrides.uclk_pstate_change_strategy = dml2_uclk_pstate_change_strategy_auto;
display_config->stage3.pstate_switch_modes[plane_index] = dml2_pstate_method_na;
}
}
static bool setup_display_config(struct display_configuation_with_meta *display_config, struct dml2_pmo_instance *pmo, int strategy_index)
{
struct dml2_pmo_scratch *scratch = &pmo->scratch;
bool success = true;
unsigned int stream_index;
reset_display_configuration(display_config);
for (stream_index = 0; stream_index < display_config->display_config.num_streams; stream_index++) {
if (pmo->scratch.pmo_dcn4.pstate_strategy_candidates[strategy_index].per_stream_pstate_method[stream_index] == dml2_pstate_method_na) {
success = false;
break;
} else if (scratch->pmo_dcn4.pstate_strategy_candidates[strategy_index].per_stream_pstate_method[stream_index] == dml2_pstate_method_vactive) {
setup_planes_for_vactive_by_mask(display_config, pmo, scratch->pmo_dcn4.stream_plane_mask[stream_index]);
}
}
return success;
}
bool pmo_dcn42_init_for_pstate_support(struct dml2_pmo_init_for_pstate_support_in_out *in_out)
{
struct dml2_pmo_instance *pmo = in_out->instance;
struct dml2_optimization_stage3_state *state = &in_out->base_display_config->stage3;
struct dml2_pmo_scratch *s = &pmo->scratch;
struct display_configuation_with_meta *display_config;
const struct dml2_plane_parameters *plane_descriptor;
const struct dml2_pmo_pstate_strategy *strategy_list = NULL;
struct dml2_pmo_pstate_strategy override_base_strategy = { 0 };
unsigned int strategy_list_size = 0;
unsigned int plane_index, stream_index, i;
bool build_override_strategy = true;
state->performed = true;
in_out->base_display_config->stage3.min_clk_index_for_latency = in_out->base_display_config->stage1.min_clk_index_for_latency;
display_config = in_out->base_display_config;
display_config->display_config.overrides.enable_subvp_implicit_pmo = true;
memset(s, 0, sizeof(struct dml2_pmo_scratch));
if (display_config->display_config.num_streams == 0)
return false;
pmo->scratch.pmo_dcn4.min_latency_index = in_out->base_display_config->stage1.min_clk_index_for_latency;
pmo->scratch.pmo_dcn4.max_latency_index = pmo->mcg_clock_table_size;
pmo->scratch.pmo_dcn4.cur_latency_index = in_out->base_display_config->stage1.min_clk_index_for_latency;
// First build the stream plane mask (array of bitfields indexed by stream, indicating plane mapping)
for (plane_index = 0; plane_index < display_config->display_config.num_planes; plane_index++) {
Annotation
- Immediate include surface: `dml2_pmo_dcn42.h`, `lib_float_math.h`, `dml2_debug.h`, `dml2_pmo_dcn4_fams2.h`.
- Detected declarations: `function is_bit_set_in_bitfield`, `function dcn42_set_bit_in_bitfield`, `function setup_planes_for_vactive_by_mask`, `function reset_display_configuration`, `function setup_display_config`, `function pmo_dcn42_init_for_pstate_support`, `function pmo_dcn42_fams2_optimize_for_pstate_support`, `function pmo_dcn42_test_for_pstate_support`, `function pmo_dcn42_initialize`.
- 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.