From 113f2e95ecd3235d5082c289a6c38a3102ccf23a Mon Sep 17 00:00:00 2001 From: Philip Cox Date: Wed, 29 May 2019 15:55:35 -0400 Subject: [PATCH 2862/2940] drm/amdgpu: Add func's to get/set iq_wait_time Add functions to read the mmCP_IQ_WAIT_TIME1 and mmCP_IQ_WAIT_TIME2 register values, and a function to build a modified version to be used to update the grace period value. These are needed to support the grace period for amdkfd suspend queue functionality. Change-Id: If1352501182a22a28903225515374908cbf25765 Signed-off-by: Philip Cox --- .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 48 ++++++++++++++++++- .../gpu/drm/amd/include/kgd_kfd_interface.h | 12 +++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c index 1c8279d3832d..2b409085759c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c @@ -125,7 +125,8 @@ static uint32_t kgd_set_wave_launch_trap_override(struct kgd_dev *kgd, static uint32_t kgd_set_wave_launch_mode(struct kgd_dev *kgd, uint8_t wave_launch_mode, uint32_t vmid); - +static void kgd_get_iq_wait_times(struct kgd_dev *kgd, + uint32_t *wait_times); static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid); static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, @@ -137,6 +138,12 @@ static void set_scratch_backing_va(struct kgd_dev *kgd, static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid); static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid); +static void kgd_build_grace_period_packet_info(struct kgd_dev *kgd, + uint32_t wait_times, + uint32_t grace_period, + uint32_t *reg_offset, + uint32_t *reg_data); + /* Because of REG_GET_FIELD() being used, we put this function in the * asic specific file. */ @@ -189,7 +196,8 @@ static const struct kfd2kgd_calls kfd2kgd = { .set_debug_trap_data = kgd_set_debug_trap_data, .set_wave_launch_trap_override = kgd_set_wave_launch_trap_override, .set_wave_launch_mode = kgd_set_wave_launch_mode, - + .get_iq_wait_times = kgd_get_iq_wait_times, + .build_grace_period_packet_info = kgd_build_grace_period_packet_info, }; struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void) @@ -1080,6 +1088,26 @@ static uint32_t kgd_set_wave_launch_mode(struct kgd_dev *kgd, return 0; } +/* kgd_get_iq_wait_times: Returns the mmCP_IQ_WAIT_TIME1/2 values + * The values read are: + * ib_offload_wait_time -- Wait Count for Indirect Buffer Offloads. + * atomic_offload_wait_time -- Wait Count for L2 and GDS Atomics Offloads. + * wrm_offload_wait_time -- Wait Count for WAIT_REG_MEM Offloads. + * gws_wait_time -- Wait Count for Global Wave Syncs. + * que_sleep_wait_time -- Wait Count for Dequeue Retry. + * sch_wave_wait_time -- Wait Count for Scheduling Wave Message. + * sem_rearm_wait_time -- Wait Count for Semaphore re-arm. + * deq_retry_wait_time -- Wait Count for Global Wave Syncs. + */ +static void kgd_get_iq_wait_times(struct kgd_dev *kgd, + uint32_t *wait_times) + +{ + struct amdgpu_device *adev = get_amdgpu_device(kgd); + + *wait_times = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_IQ_WAIT_TIME2)); +} + static void set_scratch_backing_va(struct kgd_dev *kgd, uint64_t va, uint32_t vmid) { @@ -1108,3 +1136,19 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, gfxhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base); } + +static void kgd_build_grace_period_packet_info(struct kgd_dev *kgd, + uint32_t wait_times, + uint32_t grace_period, + uint32_t *reg_offset, + uint32_t *reg_data) +{ + *reg_data = wait_times; + + *reg_data = REG_SET_FIELD(*reg_data, + CP_IQ_WAIT_TIME2, + SCH_WAVE, + grace_period); + + *reg_offset = mmCP_IQ_WAIT_TIME2; +} diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index 66608a381400..db3f4b76d40f 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h @@ -239,6 +239,11 @@ struct tile_config { * * @get_hive_id: Returns hive id of current device, 0 if xgmi is not enabled * + * @get_iq_wait_times: Returns the mmCP_IQ_WAIT_TIME1/2 values + * + * @build_grace_period_packet_info: build a IQ_WAUT_TIME2 reg value with an + * updated grace period value. + * * This structure contains function pointers to services that the kgd driver * provides to amdkfd driver. * @@ -328,6 +333,13 @@ struct kfd2kgd_calls { uint32_t (*set_wave_launch_mode)(struct kgd_dev *kgd, uint8_t wave_launch_mode, uint32_t vmid); + void (*get_iq_wait_times)(struct kgd_dev *kgd, + uint32_t *wait_times); + void (*build_grace_period_packet_info)(struct kgd_dev *kgd, + uint32_t wait_times, + uint32_t grace_period, + uint32_t *reg_offset, + uint32_t *reg_data); }; #endif /* KGD_KFD_INTERFACE_H_INCLUDED */ -- 2.17.1