drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c
Extension
.c
Size
43042 bytes
Lines
1467
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.

Dependency Surface

Detected Declarations

Annotated Snippet

time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
		ret = smu_v15_0_0_update_table(smu,
						SMU_TABLE_SMU_METRICS,
						0,
						smu_table->metrics_table,
						false);
		if (ret) {
			dev_info(smu->adev->dev, "Failed to export SMU15_0_0 metrics table!\n");
			return ret;
		}
		smu_table->metrics_time = jiffies;
	}

	if (metrics_table)
		memcpy(metrics_table, smu_table->metrics_table, table_size);

	return 0;
}

static int smu_v15_0_0_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_v15_0_0_get_metrics_table(smu, NULL, false);
	if (ret)
		return ret;

	switch (member) {
	case METRICS_AVERAGE_GFXCLK:
		*value = metrics->GfxclkFrequency;
		break;
	case METRICS_AVERAGE_SOCCLK:
		*value = metrics->SocclkFrequency;
		break;
	case METRICS_AVERAGE_VCLK:
		*value = metrics->VclkFrequency;
		break;
	case METRICS_AVERAGE_DCLK:
		*value = 0;
		break;
	case METRICS_AVERAGE_UCLK:
		*value = metrics->MemclkFrequency;
		break;
	case METRICS_AVERAGE_FCLK:
		*value = metrics->FclkFrequency;
		break;
	case METRICS_AVERAGE_VPECLK:
		*value = metrics->VpeclkFrequency;
		break;
	case METRICS_AVERAGE_NPUCLK:
		*value = metrics->NpuclkFrequency;
		break;
	case METRICS_AVERAGE_GFXACTIVITY:
		if ((smu->smc_fw_version > 0x5d4600))
			*value = metrics->GfxActivity;
		else
			*value = metrics->GfxActivity / 100;
		break;
	case METRICS_AVERAGE_VCNACTIVITY:
		*value = metrics->VcnActivity / 100;
		break;
	case METRICS_AVERAGE_SOCKETPOWER:
	case METRICS_CURR_SOCKETPOWER:
		*value = (metrics->SocketPower / 1000 << 8) +
		(metrics->SocketPower % 1000 / 10);
		break;
	case METRICS_TEMPERATURE_EDGE:
		*value = metrics->GfxTemperature / 100 *
		SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
		break;
	case METRICS_TEMPERATURE_HOTSPOT:
		*value = metrics->SocTemperature / 100 *
		SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
		break;
	case METRICS_THROTTLER_RESIDENCY_PROCHOT:
		*value = metrics->ThrottleResidency_PROCHOT;
		break;
	case METRICS_THROTTLER_RESIDENCY_SPL:
		*value = metrics->ThrottleResidency_SPL;
		break;
	case METRICS_THROTTLER_RESIDENCY_FPPT:
		*value = metrics->ThrottleResidency_FPPT;
		break;
	case METRICS_THROTTLER_RESIDENCY_SPPT:
		*value = metrics->ThrottleResidency_SPPT;

Annotation

Implementation Notes