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

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c
Extension
.c
Size
77108 bytes
Lines
2422
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(tmo))) {
		int ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetMetricsTable, NULL);
		if (ret) {
			dev_info(adev->dev,
				 "Failed to export SMU metrics table!\n");
			mutex_unlock(&smu_table->metrics_lock);
			return ret;
		}

		amdgpu_device_invalidate_hdp(smu->adev, NULL);
		ret = smu_cmn_vram_cpy(smu, smu_table->metrics_table,
				       table->cpu_addr, table_size);
		if (ret) {
			mutex_unlock(&smu_table->metrics_lock);
			return ret;
		}

		smu_table->metrics_time = jiffies;
	}

	if (data)
		memcpy(data, smu_table->metrics_table, table_size);
	mutex_unlock(&smu_table->metrics_lock);
	return 0;
}

static int smu_v15_0_8_get_smu_metrics_data(struct smu_context *smu,
					    MetricsMember_t member, uint32_t *value)
{
	struct smu_table_context *smu_table = &smu->smu_table;
	MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table;
	struct amdgpu_device *adev = smu->adev;
	int ret, xcc_id;

	ret = smu_v15_0_8_get_metrics_table_internal(smu, 10, NULL);
	if (ret)
		return ret;

	switch (member) {
	case METRICS_CURR_GFXCLK:
	case METRICS_AVERAGE_GFXCLK:
			xcc_id = GET_INST(GC, 0);
			*value = SMUQ10_ROUND(metrics->GfxclkFrequency[xcc_id]);
		break;
	case METRICS_CURR_SOCCLK:
	case METRICS_AVERAGE_SOCCLK:
		*value = SMUQ10_ROUND(metrics->SocclkFrequency[0]);
		break;
	case METRICS_CURR_UCLK:
	case METRICS_AVERAGE_UCLK:
		*value = SMUQ10_ROUND(metrics->UclkFrequency[0]);
		break;
	case METRICS_CURR_VCLK:
		*value = SMUQ10_ROUND(metrics->VclkFrequency[0]);
		break;
	case METRICS_CURR_DCLK:
		*value = SMUQ10_ROUND(metrics->DclkFrequency[0]);
		break;
	case METRICS_CURR_FCLK:
		*value = SMUQ10_ROUND(metrics->FclkFrequency[0]);
		break;
	case METRICS_AVERAGE_GFXACTIVITY:
		*value = SMUQ10_ROUND(metrics->SocketGfxBusy);
		break;
	case METRICS_AVERAGE_MEMACTIVITY:
		*value = SMUQ10_ROUND(metrics->DramBandwidthUtilization);
		break;
	case METRICS_CURR_SOCKETPOWER:
		*value = SMUQ10_ROUND(metrics->SocketPower) << 8;
		break;
	case METRICS_TEMPERATURE_HOTSPOT:
		*value = SMUQ10_ROUND(metrics->MaxSocketTemperature) *
			 SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
		break;
	case METRICS_TEMPERATURE_MEM:
	{
		struct amdgpu_device *adev = smu->adev;
		u32 max_hbm_temp = 0;

		/* Find max temperature across all HBM stacks */
		if (adev->umc.active_mask) {
			u64 mask = adev->umc.active_mask;
			int stack_idx;

			for_each_hbm_stack(stack_idx, mask) {
				u32 temp;

				if (!hbm_stack_mask_valid(mask))
					continue;

Annotation

Implementation Notes