Skip to content

Commit 0c0dd10

Browse files
Lijo Lazaralexdeucher
authored andcommitted
drm/amd/pm: Use driver table for board temperature
GPU board and Baseboard temperatures come from system metrics table. Driver keeps separate metrics table for both. Use the new driver table structure to represent them. Signed-off-by: Lijo Lazar <lijo.lazar@amd.com> Reviewed-by: Asad Kamal <asad.kamal@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 34d6599 commit 0c0dd10

3 files changed

Lines changed: 43 additions & 40 deletions

File tree

drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3864,8 +3864,9 @@ static ssize_t smu_sys_get_temp_metrics(void *handle, enum smu_temp_metric_type
38643864
{
38653865
struct smu_context *smu = handle;
38663866
struct smu_table_context *smu_table = &smu->smu_table;
3867-
struct smu_table *tables = smu_table->tables;
3868-
enum smu_table_id table_id;
3867+
struct smu_driver_table *driver_tables = smu_table->driver_tables;
3868+
enum smu_driver_table_id table_id;
3869+
struct smu_driver_table *temp_table;
38693870

38703871
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
38713872
return -EOPNOTSUPP;
@@ -3875,17 +3876,18 @@ static ssize_t smu_sys_get_temp_metrics(void *handle, enum smu_temp_metric_type
38753876

38763877
table_id = smu_metrics_get_temp_table_id(type);
38773878

3878-
if (table_id == SMU_TABLE_COUNT)
3879+
if (table_id == SMU_DRIVER_TABLE_COUNT)
38793880
return -EINVAL;
38803881

3882+
temp_table = &driver_tables[table_id];
3883+
38813884
/* If the request is to get size alone, return the cached table size */
3882-
if (!table && tables[table_id].cache.size)
3883-
return tables[table_id].cache.size;
3885+
if (!table && temp_table->cache.size)
3886+
return temp_table->cache.size;
38843887

3885-
if (smu_table_cache_is_valid(&tables[table_id])) {
3886-
memcpy(table, tables[table_id].cache.buffer,
3887-
tables[table_id].cache.size);
3888-
return tables[table_id].cache.size;
3888+
if (smu_driver_table_is_valid(temp_table)) {
3889+
memcpy(table, temp_table->cache.buffer, temp_table->cache.size);
3890+
return temp_table->cache.size;
38893891
}
38903892

38913893
return smu->smu_temp.temp_funcs->get_temp_metrics(smu, type, table);

drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ struct smu_table {
273273

274274
enum smu_driver_table_id {
275275
SMU_DRIVER_TABLE_GPU_METRICS = 0,
276+
SMU_DRIVER_TABLE_GPUBOARD_TEMP_METRICS,
277+
SMU_DRIVER_TABLE_BASEBOARD_TEMP_METRICS,
276278
SMU_DRIVER_TABLE_COUNT,
277279
};
278280

@@ -375,8 +377,6 @@ enum smu_table_id {
375377
SMU_TABLE_ECCINFO,
376378
SMU_TABLE_COMBO_PPTABLE,
377379
SMU_TABLE_WIFIBAND,
378-
SMU_TABLE_GPUBOARD_TEMP_METRICS,
379-
SMU_TABLE_BASEBOARD_TEMP_METRICS,
380380
SMU_TABLE_PMFW_SYSTEM_METRICS,
381381
SMU_TABLE_COUNT,
382382
};
@@ -1722,19 +1722,19 @@ typedef struct {
17221722
struct smu_dpm_policy *smu_get_pm_policy(struct smu_context *smu,
17231723
enum pp_pm_policy p_type);
17241724

1725-
static inline enum smu_table_id
1725+
static inline enum smu_driver_table_id
17261726
smu_metrics_get_temp_table_id(enum smu_temp_metric_type type)
17271727
{
17281728
switch (type) {
17291729
case SMU_TEMP_METRIC_BASEBOARD:
1730-
return SMU_TABLE_BASEBOARD_TEMP_METRICS;
1730+
return SMU_DRIVER_TABLE_BASEBOARD_TEMP_METRICS;
17311731
case SMU_TEMP_METRIC_GPUBOARD:
1732-
return SMU_TABLE_GPUBOARD_TEMP_METRICS;
1732+
return SMU_DRIVER_TABLE_GPUBOARD_TEMP_METRICS;
17331733
default:
1734-
return SMU_TABLE_COUNT;
1734+
return SMU_DRIVER_TABLE_COUNT;
17351735
}
17361736

1737-
return SMU_TABLE_COUNT;
1737+
return SMU_DRIVER_TABLE_COUNT;
17381738
}
17391739

17401740
static inline void smu_table_cache_update_time(struct smu_table *table,

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,6 @@ int smu_v13_0_12_tables_init(struct smu_context *smu)
156156
{
157157
struct amdgpu_baseboard_temp_metrics_v1_0 *baseboard_temp_metrics;
158158
struct amdgpu_gpuboard_temp_metrics_v1_0 *gpuboard_temp_metrics;
159-
struct smu_table_context *smu_table = &smu->smu_table;
160-
struct smu_table *tables = smu_table->tables;
161-
struct smu_table_cache *cache;
162159
int ret;
163160

164161
ret = smu_table_cache_init(smu, SMU_TABLE_PMFW_SYSTEM_METRICS,
@@ -167,34 +164,37 @@ int smu_v13_0_12_tables_init(struct smu_context *smu)
167164
if (ret)
168165
return ret;
169166

170-
ret = smu_table_cache_init(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS,
171-
sizeof(*baseboard_temp_metrics), 50);
167+
ret = smu_driver_table_init(smu,
168+
SMU_DRIVER_TABLE_BASEBOARD_TEMP_METRICS,
169+
sizeof(*baseboard_temp_metrics), 50);
172170
if (ret)
173171
return ret;
174172
/* Initialize base board temperature metrics */
175-
cache = &(tables[SMU_TABLE_BASEBOARD_TEMP_METRICS].cache);
176-
baseboard_temp_metrics =
177-
(struct amdgpu_baseboard_temp_metrics_v1_0 *) cache->buffer;
173+
baseboard_temp_metrics = (struct amdgpu_baseboard_temp_metrics_v1_0 *)
174+
smu_driver_table_ptr(smu,
175+
SMU_DRIVER_TABLE_BASEBOARD_TEMP_METRICS);
178176
smu_cmn_init_baseboard_temp_metrics(baseboard_temp_metrics, 1, 0);
179177
/* Initialize GPU board temperature metrics */
180-
ret = smu_table_cache_init(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS,
181-
sizeof(*gpuboard_temp_metrics), 50);
178+
ret = smu_driver_table_init(smu, SMU_DRIVER_TABLE_GPUBOARD_TEMP_METRICS,
179+
sizeof(*gpuboard_temp_metrics), 50);
182180
if (ret) {
183181
smu_table_cache_fini(smu, SMU_TABLE_PMFW_SYSTEM_METRICS);
184-
smu_table_cache_fini(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS);
182+
smu_driver_table_fini(smu,
183+
SMU_DRIVER_TABLE_BASEBOARD_TEMP_METRICS);
185184
return ret;
186185
}
187-
cache = &(tables[SMU_TABLE_GPUBOARD_TEMP_METRICS].cache);
188-
gpuboard_temp_metrics = (struct amdgpu_gpuboard_temp_metrics_v1_0 *)cache->buffer;
186+
gpuboard_temp_metrics = (struct amdgpu_gpuboard_temp_metrics_v1_0 *)
187+
smu_driver_table_ptr(smu,
188+
SMU_DRIVER_TABLE_GPUBOARD_TEMP_METRICS);
189189
smu_cmn_init_gpuboard_temp_metrics(gpuboard_temp_metrics, 1, 0);
190190

191191
return 0;
192192
}
193193

194194
void smu_v13_0_12_tables_fini(struct smu_context *smu)
195195
{
196-
smu_table_cache_fini(smu, SMU_TABLE_BASEBOARD_TEMP_METRICS);
197-
smu_table_cache_fini(smu, SMU_TABLE_GPUBOARD_TEMP_METRICS);
196+
smu_driver_table_fini(smu, SMU_DRIVER_TABLE_BASEBOARD_TEMP_METRICS);
197+
smu_driver_table_fini(smu, SMU_DRIVER_TABLE_GPUBOARD_TEMP_METRICS);
198198
smu_table_cache_fini(smu, SMU_TABLE_PMFW_SYSTEM_METRICS);
199199
}
200200

@@ -686,27 +686,25 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
686686
struct amdgpu_gpuboard_temp_metrics_v1_0 *gpuboard_temp_metrics;
687687
struct smu_table_context *smu_table = &smu->smu_table;
688688
struct smu_table *tables = smu_table->tables;
689+
enum smu_driver_table_id table_id;
689690
SystemMetricsTable_t *metrics;
690-
struct smu_table *data_table;
691691
struct smu_table *sys_table;
692692
int ret, sensor_type;
693693
u32 idx, sensors;
694694
ssize_t size;
695695

696696
if (type == SMU_TEMP_METRIC_BASEBOARD) {
697697
/* Initialize base board temperature metrics */
698-
data_table =
699-
&smu->smu_table.tables[SMU_TABLE_BASEBOARD_TEMP_METRICS];
698+
table_id = SMU_DRIVER_TABLE_BASEBOARD_TEMP_METRICS;
700699
baseboard_temp_metrics =
701700
(struct amdgpu_baseboard_temp_metrics_v1_0 *)
702-
data_table->cache.buffer;
701+
smu_driver_table_ptr(smu, table_id);
703702
size = sizeof(*baseboard_temp_metrics);
704703
} else {
705-
data_table =
706-
&smu->smu_table.tables[SMU_TABLE_GPUBOARD_TEMP_METRICS];
704+
table_id = SMU_DRIVER_TABLE_GPUBOARD_TEMP_METRICS;
707705
gpuboard_temp_metrics =
708706
(struct amdgpu_gpuboard_temp_metrics_v1_0 *)
709-
data_table->cache.buffer;
707+
smu_driver_table_ptr(smu, table_id);
710708
size = sizeof(*baseboard_temp_metrics);
711709
}
712710

@@ -716,7 +714,7 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
716714

717715
sys_table = &tables[SMU_TABLE_PMFW_SYSTEM_METRICS];
718716
metrics = (SystemMetricsTable_t *)sys_table->cache.buffer;
719-
smu_table_cache_update_time(data_table, jiffies);
717+
smu_driver_table_update_cache_time(smu, table_id);
720718

721719
if (type == SMU_TEMP_METRIC_GPUBOARD) {
722720
gpuboard_temp_metrics->accumulation_counter = metrics->AccumulationCounter;
@@ -762,7 +760,10 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
762760
}
763761
}
764762

765-
memcpy(table, data_table->cache.buffer, size);
763+
if (type == SMU_TEMP_METRIC_BASEBOARD)
764+
memcpy(table, baseboard_temp_metrics, size);
765+
else
766+
memcpy(table, gpuboard_temp_metrics, size);
766767

767768
return size;
768769
}

0 commit comments

Comments
 (0)