mirror of
https://github.com/torvalds/linux.git
synced 2026-09-13 15:40:03 +02:00
drm/amdgpu: Save some cycles on the job submission path
Every job submission on the Steam Deck ends up walking the list of IP
blocks looking for AMD_IP_BLOCK_TYPE_SMC. Half of the call chain is like
the below, while the second half is from amdgpu_gfx_profile_ring_end_use:
amdgpu_gfx_profile_ring_begin_use
amdgpu_dpm_is_overdrive_enabled
is_support_sw_smu
amdgpu_device_ip_is_valid
On a game menu screen at 90Hz refresh rate we end up with ~840 calls per
second which sticks out when the submission worker is profiled with perf:
13.78% [kernel] [k] __lock_text_start
10.86% [kernel] [k] __lookup_object
8.76% [kernel] [k] __mod_timer
4.94% [kernel] [k] queued_spin_lock_slowpath
1.66% [kernel] [k] amdgpu_device_ip_is_valid
1.54% [kernel] [k] preempt_count_add
1.42% [kernel] [k] amdgpu_sync_peek_fence
1.18% [kernel] [k] amdgpu_vmid_grab
1.17% [kernel] [k] amdgpu_ib_schedule
1.14% [kernel] [k] kthread_worker_fn
Lets short-circuit this walk by simply caching the result of
is_support_sw_smu() in the device.
This is a micro-improvement but it is at least conceptually nicer to avoid
repeating the same walk so much.
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Timur Kristóf <timur.kristof@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
951d2a891e
commit
875a785373
|
|
@ -818,6 +818,7 @@ struct amdgpu_device {
|
|||
struct dev_pm_domain vga_pm_domain;
|
||||
bool have_disp_power_ref;
|
||||
bool have_atomics_support;
|
||||
bool is_sw_smu;
|
||||
|
||||
/* BIOS */
|
||||
bool is_atom_fw;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@
|
|||
#include "amdgpu_ras.h"
|
||||
#include "amdgpu_ras_mgr.h"
|
||||
#include "amdgpu_pmu.h"
|
||||
#include "amdgpu_smu.h"
|
||||
#include "amdgpu_fru_eeprom.h"
|
||||
#include "amdgpu_reset.h"
|
||||
#include "amdgpu_virt.h"
|
||||
|
|
@ -2130,6 +2131,8 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)
|
|||
adev->cg_flags &= amdgpu_cg_mask;
|
||||
adev->pg_flags &= amdgpu_pg_mask;
|
||||
|
||||
amdgpu_smu_early_init(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -591,17 +591,13 @@ static int smu_get_power_num_states(void *handle,
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool is_support_sw_smu(struct amdgpu_device *adev)
|
||||
void amdgpu_smu_early_init(struct amdgpu_device *adev)
|
||||
{
|
||||
/* vega20 is 11.0.2, but it's supported via the powerplay code */
|
||||
if (adev->asic_type == CHIP_VEGA20)
|
||||
return false;
|
||||
|
||||
if ((amdgpu_ip_version(adev, MP1_HWIP, 0) >= IP_VERSION(11, 0, 0)) &&
|
||||
amdgpu_device_ip_is_valid(adev, AMD_IP_BLOCK_TYPE_SMC))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
adev->is_sw_smu = adev->asic_type != CHIP_VEGA20 &&
|
||||
(amdgpu_ip_version(adev, MP1_HWIP, 0) >=
|
||||
IP_VERSION(11, 0, 0) &&
|
||||
amdgpu_device_ip_is_valid(adev, AMD_IP_BLOCK_TYPE_SMC));
|
||||
}
|
||||
|
||||
bool is_support_cclk_dpm(struct amdgpu_device *adev)
|
||||
|
|
|
|||
|
|
@ -1923,7 +1923,13 @@ int smu_link_reset(struct smu_context *smu);
|
|||
|
||||
extern const struct amd_ip_funcs smu_ip_funcs;
|
||||
|
||||
bool is_support_sw_smu(struct amdgpu_device *adev);
|
||||
void amdgpu_smu_early_init(struct amdgpu_device *adev);
|
||||
|
||||
static inline bool is_support_sw_smu(struct amdgpu_device *adev)
|
||||
{
|
||||
return adev->is_sw_smu;
|
||||
}
|
||||
|
||||
bool is_support_cclk_dpm(struct amdgpu_device *adev);
|
||||
int smu_write_watermarks_table(struct smu_context *smu);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user