drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c- Extension
.c- Size
- 22995 bytes
- Lines
- 754
- 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
linux/string.hlinux/acpi.hdrm/drm_probe_helper.hdrm/amdgpu_drm.hdm_services.hamdgpu.hamdgpu_dm.hamdgpu_dm_irq.hamdgpu_pm.hdm_pp_smu.h
Detected Declarations
function filesfunction get_default_clock_levelsfunction dc_to_pp_clock_typefunction pp_to_dc_clock_levelsfunction pp_to_dc_clock_levels_with_latencyfunction pp_to_dc_clock_levels_with_voltagefunction dm_pp_get_clock_levels_by_typefunction dm_pp_get_clock_levels_by_type_with_latencyfunction dm_pp_get_clock_levels_by_type_with_voltagefunction dm_pp_notify_wm_clock_changesfunction dm_pp_apply_clock_for_voltage_requestfunction pp_rv_set_wm_rangesfunction pp_rv_set_pme_wa_enablefunction pp_rv_set_active_display_countfunction pp_rv_set_min_deep_sleep_dcfclkfunction pp_rv_set_hard_min_dcefclk_by_freqfunction pp_rv_set_hard_min_fclk_by_freqfunction pp_nv_set_wm_rangesfunction pp_nv_set_display_countfunction pp_nv_set_min_deep_sleep_dcfclkfunction pp_nv_set_hard_min_dcefclk_by_freqfunction pp_nv_set_hard_min_uclk_by_freqfunction pp_nv_set_pstate_handshake_supportfunction pp_nv_set_voltage_by_freqfunction pp_nv_get_maximum_sustainable_clocksfunction pp_nv_get_uclk_dpm_statesfunction pp_rn_get_dpm_clock_tablefunction pp_rn_set_wm_rangesfunction dm_pp_get_funcs
Annotated Snippet
dc_to_pp_clock_type(clk_type), &pp_clks)) {
/* Error in pplib. Provide default values. */
get_default_clock_levels(clk_type, dc_clks);
return true;
}
pp_to_dc_clock_levels(&pp_clks, dc_clks, clk_type);
if (amdgpu_dpm_get_display_mode_validation_clks(adev, &validation_clks)) {
/* Error in pplib. Provide default values. */
DRM_INFO("DM_PPLIB: Warning: using default validation clocks!\n");
validation_clks.engine_max_clock = 72000;
validation_clks.memory_max_clock = 80000;
}
DRM_INFO("DM_PPLIB: Validation clocks:\n");
DRM_INFO("DM_PPLIB: engine_max_clock: %d\n",
validation_clks.engine_max_clock);
DRM_INFO("DM_PPLIB: memory_max_clock: %d\n",
validation_clks.memory_max_clock);
/* Translate 10 kHz to kHz. */
validation_clks.engine_max_clock *= 10;
validation_clks.memory_max_clock *= 10;
/* Determine the highest non-boosted level from the Validation Clocks */
if (clk_type == DM_PP_CLOCK_TYPE_ENGINE_CLK) {
for (i = 0; i < dc_clks->num_levels; i++) {
if (dc_clks->clocks_in_khz[i] > validation_clks.engine_max_clock) {
/* This clock is higher the validation clock.
* Than means the previous one is the highest
* non-boosted one.
*/
DRM_INFO("DM_PPLIB: reducing engine clock level from %d to %d\n",
dc_clks->num_levels, i);
dc_clks->num_levels = i > 0 ? i : 1;
break;
}
}
} else if (clk_type == DM_PP_CLOCK_TYPE_MEMORY_CLK) {
for (i = 0; i < dc_clks->num_levels; i++) {
if (dc_clks->clocks_in_khz[i] > validation_clks.memory_max_clock) {
DRM_INFO("DM_PPLIB: reducing memory clock level from %d to %d\n",
dc_clks->num_levels, i);
dc_clks->num_levels = i > 0 ? i : 1;
break;
}
}
}
return true;
}
bool dm_pp_get_clock_levels_by_type_with_latency(
const struct dc_context *ctx,
enum dm_pp_clock_type clk_type,
struct dm_pp_clock_levels_with_latency *clk_level_info)
{
struct amdgpu_device *adev = ctx->driver_context;
struct pp_clock_levels_with_latency pp_clks = { 0 };
int ret;
ret = amdgpu_dpm_get_clock_by_type_with_latency(adev,
dc_to_pp_clock_type(clk_type),
&pp_clks);
if (ret)
return false;
pp_to_dc_clock_levels_with_latency(&pp_clks, clk_level_info, clk_type);
return true;
}
bool dm_pp_get_clock_levels_by_type_with_voltage(
const struct dc_context *ctx,
enum dm_pp_clock_type clk_type,
struct dm_pp_clock_levels_with_voltage *clk_level_info)
{
struct amdgpu_device *adev = ctx->driver_context;
struct pp_clock_levels_with_voltage pp_clk_info = {0};
int ret;
ret = amdgpu_dpm_get_clock_by_type_with_voltage(adev,
dc_to_pp_clock_type(clk_type),
&pp_clk_info);
if (ret)
return false;
pp_to_dc_clock_levels_with_voltage(&pp_clk_info, clk_level_info, clk_type);
Annotation
- Immediate include surface: `linux/string.h`, `linux/acpi.h`, `drm/drm_probe_helper.h`, `drm/amdgpu_drm.h`, `dm_services.h`, `amdgpu.h`, `amdgpu_dm.h`, `amdgpu_dm_irq.h`.
- Detected declarations: `function files`, `function get_default_clock_levels`, `function dc_to_pp_clock_type`, `function pp_to_dc_clock_levels`, `function pp_to_dc_clock_levels_with_latency`, `function pp_to_dc_clock_levels_with_voltage`, `function dm_pp_get_clock_levels_by_type`, `function dm_pp_get_clock_levels_by_type_with_latency`, `function dm_pp_get_clock_levels_by_type_with_voltage`, `function dm_pp_notify_wm_clock_changes`.
- 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.