drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c- Extension
.c- Size
- 34135 bytes
- Lines
- 1158
- 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
smu_types.hamdgpu.hamdgpu_smu.hsmu_v13_0.hsmu13_driver_if_v13_0_4.hsmu_v13_0_4_ppt.hsmu_v13_0_4_ppsmc.hsmu_v13_0_4_pmfw.hsmu_cmn.h
Detected Declarations
function smu_v13_0_4_init_smc_tablesfunction smu_v13_0_4_fini_smc_tablesfunction smu_v13_0_4_is_dpm_runningfunction smu_v13_0_4_system_features_controlfunction smu_v13_0_4_get_gpu_metricsfunction smu_v13_0_4_get_smu_metrics_datafunction smu_v13_0_4_get_current_clk_freqfunction smu_v13_0_4_get_dpm_freq_by_indexfunction smu_v13_0_4_get_dpm_level_countfunction smu_v13_0_4_emit_clk_levelsfunction smu_v13_0_4_read_sensorfunction smu_v13_0_4_set_watermarks_tablefunction smu_v13_0_4_clk_dpm_is_enabledfunction smu_v13_0_4_get_dpm_ultimate_freqfunction smu_v13_0_4_set_soft_freq_limited_rangefunction smu_v13_0_4_force_clk_levelsfunction smu_v13_0_4_get_dpm_profile_freqfunction smu_v13_0_4_set_performance_levelfunction smu_v13_0_4_mode2_resetfunction smu_v13_0_4_set_fine_grain_gfx_freq_parametersfunction smu_v13_0_4_init_msg_ctlfunction smu_v13_0_4_set_ppt_funcs
Annotated Snippet
if (adev->in_s4) {
/* Adds a GFX reset as workaround just before sending the
* MP1_UNLOAD message to prevent GC/RLC/PMFW from entering
* an invalid state.
*/
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GfxDeviceDriverReset,
SMU_RESET_MODE_2, NULL);
if (ret)
return ret;
}
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_PrepareMp1ForUnload, NULL);
}
return ret;
}
static ssize_t smu_v13_0_4_get_gpu_metrics(struct smu_context *smu,
void **table)
{
struct gpu_metrics_v2_1 *gpu_metrics =
(struct gpu_metrics_v2_1 *)smu_driver_table_ptr(
smu, SMU_DRIVER_TABLE_GPU_METRICS);
SmuMetrics_t metrics;
int ret = 0;
ret = smu_cmn_get_metrics_table(smu, &metrics, true);
if (ret)
return ret;
smu_cmn_init_soft_gpu_metrics(gpu_metrics, 2, 1);
gpu_metrics->temperature_gfx = metrics.GfxTemperature;
gpu_metrics->temperature_soc = metrics.SocTemperature;
memcpy(&gpu_metrics->temperature_core[0],
&metrics.CoreTemperature[0],
sizeof(uint16_t) * 8);
gpu_metrics->temperature_l3[0] = metrics.L3Temperature;
gpu_metrics->average_gfx_activity = metrics.GfxActivity;
gpu_metrics->average_mm_activity = metrics.UvdActivity;
gpu_metrics->average_socket_power = metrics.AverageSocketPower;
gpu_metrics->average_gfx_power = metrics.Power[0];
gpu_metrics->average_soc_power = metrics.Power[1];
memcpy(&gpu_metrics->average_core_power[0],
&metrics.CorePower[0],
sizeof(uint16_t) * 8);
gpu_metrics->average_gfxclk_frequency = metrics.GfxclkFrequency;
gpu_metrics->average_socclk_frequency = metrics.SocclkFrequency;
gpu_metrics->average_uclk_frequency = metrics.MemclkFrequency;
gpu_metrics->average_fclk_frequency = metrics.MemclkFrequency;
gpu_metrics->average_vclk_frequency = metrics.VclkFrequency;
gpu_metrics->average_dclk_frequency = metrics.DclkFrequency;
memcpy(&gpu_metrics->current_coreclk[0],
&metrics.CoreFrequency[0],
sizeof(uint16_t) * 8);
gpu_metrics->current_l3clk[0] = metrics.L3Frequency;
gpu_metrics->throttle_status = metrics.ThrottlerStatus;
gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
*table = (void *)gpu_metrics;
smu_driver_table_update_cache_time(smu, SMU_DRIVER_TABLE_GPU_METRICS);
return sizeof(struct gpu_metrics_v2_1);
}
static int smu_v13_0_4_get_smu_metrics_data(struct smu_context *smu,
MetricsMember_t member,
uint32_t *value)
{
struct smu_table_context *smu_table = &smu->smu_table;
SmuMetrics_t *metrics = (SmuMetrics_t *)smu_table->metrics_table;
int ret = 0;
ret = smu_cmn_get_metrics_table(smu, NULL, false);
if (ret)
return ret;
switch (member) {
case METRICS_AVERAGE_GFXCLK:
*value = metrics->GfxclkFrequency;
break;
case METRICS_AVERAGE_SOCCLK:
Annotation
- Immediate include surface: `smu_types.h`, `amdgpu.h`, `amdgpu_smu.h`, `smu_v13_0.h`, `smu13_driver_if_v13_0_4.h`, `smu_v13_0_4_ppt.h`, `smu_v13_0_4_ppsmc.h`, `smu_v13_0_4_pmfw.h`.
- Detected declarations: `function smu_v13_0_4_init_smc_tables`, `function smu_v13_0_4_fini_smc_tables`, `function smu_v13_0_4_is_dpm_running`, `function smu_v13_0_4_system_features_control`, `function smu_v13_0_4_get_gpu_metrics`, `function smu_v13_0_4_get_smu_metrics_data`, `function smu_v13_0_4_get_current_clk_freq`, `function smu_v13_0_4_get_dpm_freq_by_index`, `function smu_v13_0_4_get_dpm_level_count`, `function smu_v13_0_4_emit_clk_levels`.
- 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.