mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 11:01:06 -04:00
drm/amd/powerplay: add control method to bypass metrics cache on Navi10
As for the gpu metric export, metrics cache makes no sense. It's up to user to decide how often the metrics should be retrieved. Signed-off-by: Evan Quan <evan.quan@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -504,6 +504,34 @@ static int navi10_tables_init(struct smu_context *smu)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int navi10_get_metrics_table_locked(struct smu_context *smu,
|
||||
SmuMetrics_t *metrics_table,
|
||||
bool bypass_cache)
|
||||
{
|
||||
struct smu_table_context *smu_table= &smu->smu_table;
|
||||
int ret = 0;
|
||||
|
||||
if (bypass_cache ||
|
||||
!smu_table->metrics_time ||
|
||||
time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
|
||||
ret = smu_cmn_update_table(smu,
|
||||
SMU_TABLE_SMU_METRICS,
|
||||
0,
|
||||
smu_table->metrics_table,
|
||||
false);
|
||||
if (ret) {
|
||||
dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
|
||||
return ret;
|
||||
}
|
||||
smu_table->metrics_time = jiffies;
|
||||
}
|
||||
|
||||
if (metrics_table)
|
||||
memcpy(metrics_table, smu_table->metrics_table, sizeof(SmuMetrics_t));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int navi10_get_smu_metrics_data(struct smu_context *smu,
|
||||
MetricsMember_t member,
|
||||
uint32_t *value)
|
||||
@@ -518,19 +546,13 @@ static int navi10_get_smu_metrics_data(struct smu_context *smu,
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&smu->metrics_lock);
|
||||
if (!smu_table->metrics_time ||
|
||||
time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
|
||||
ret = smu_cmn_update_table(smu,
|
||||
SMU_TABLE_SMU_METRICS,
|
||||
0,
|
||||
smu_table->metrics_table,
|
||||
false);
|
||||
if (ret) {
|
||||
dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
|
||||
mutex_unlock(&smu->metrics_lock);
|
||||
return ret;
|
||||
}
|
||||
smu_table->metrics_time = jiffies;
|
||||
|
||||
ret = navi10_get_metrics_table_locked(smu,
|
||||
NULL,
|
||||
false);
|
||||
if (ret) {
|
||||
mutex_unlock(&smu->metrics_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
switch (member) {
|
||||
@@ -2512,19 +2534,13 @@ static ssize_t navi10_get_gpu_metrics(struct smu_context *smu,
|
||||
|
||||
mutex_lock(&smu->metrics_lock);
|
||||
|
||||
ret = smu_cmn_update_table(smu,
|
||||
SMU_TABLE_SMU_METRICS,
|
||||
0,
|
||||
smu_table->metrics_table,
|
||||
false);
|
||||
ret = navi10_get_metrics_table_locked(smu,
|
||||
&metrics,
|
||||
true);
|
||||
if (ret) {
|
||||
dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
|
||||
mutex_unlock(&smu->metrics_lock);
|
||||
return ret;
|
||||
}
|
||||
smu_table->metrics_time = jiffies;
|
||||
|
||||
memcpy(&metrics, smu_table->metrics_table, sizeof(SmuMetrics_t));
|
||||
|
||||
if (adev->asic_type == CHIP_NAVI12)
|
||||
memcpy(&nv12_metrics, smu_table->metrics_table, sizeof(SmuMetrics_NV12_t));
|
||||
|
||||
Reference in New Issue
Block a user