Commit 97859213 authored by Asad Kamal's avatar Asad Kamal Committed by Alex Deucher
Browse files

drm/amd/pm: Optimize get gpu metrics data function



Optimize get gpu metrics data function for smu_v13_0_12 to
allocate metrics structure only once

v2: Free and alloc moved to same function(Kevin)

Signed-off-by: default avatarAsad Kamal <asad.kamal@amd.com>
Reviewed-by: default avatarYang Wang <kevinyang.wang@amd.com>
Reviewed-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4d2f6b4e
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -378,7 +378,7 @@ ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu, struct amdgpu_xcp
	return sizeof(*xcp_metrics);
}

ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table)
ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table, void *smu_metrics)
{
	struct smu_table_context *smu_table = &smu->smu_table;
	struct gpu_metrics_v1_8 *gpu_metrics =
@@ -390,8 +390,7 @@ ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table)
	struct amdgpu_xcp *xcp;
	u32 inst_mask;

	metrics = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);
	memcpy(metrics, smu_table->metrics_table, sizeof(MetricsTable_t));
	metrics = (MetricsTable_t *)smu_metrics;

	smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 8);

@@ -533,7 +532,6 @@ ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table)
	gpu_metrics->firmware_timestamp = metrics->Timestamp;

	*table = (void *)gpu_metrics;
	kfree(metrics);

	return sizeof(*gpu_metrics);
}
+6 −2
Original line number Diff line number Diff line
@@ -2669,6 +2669,7 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
	MetricsTableV2_t *metrics_v2;
	struct amdgpu_xcp *xcp;
	u16 link_width_level;
	ssize_t num_bytes;
	u8 num_jpeg_rings;
	u32 inst_mask;
	bool per_inst;
@@ -2681,8 +2682,11 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
	}

	if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 12) &&
	    smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS)))
		return smu_v13_0_12_get_gpu_metrics(smu, table);
	    smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS))) {
		num_bytes = smu_v13_0_12_get_gpu_metrics(smu, table, metrics_v0);
		kfree(metrics_v0);
		return num_bytes;
	}

	metrics_v1 = (MetricsTableV1_t *)metrics_v0;
	metrics_v2 = (MetricsTableV2_t *)metrics_v0;
+1 −1
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ int smu_v13_0_12_get_max_metrics_size(void);
int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu);
int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
				      MetricsMember_t member, uint32_t *value);
ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table);
ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table, void *smu_metrics);
ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu,
				     struct amdgpu_xcp *xcp, void *table,
				     void *smu_metrics);