drm/amdgpu: Add kfd2kgd.set_compute_idle interface
authorFelix Kuehling <Felix.Kuehling@amd.com>
Mon, 16 Jul 2018 23:10:36 +0000 (19:10 -0400)
committerOded Gabbay <oded.gabbay@gmail.com>
Mon, 16 Jul 2018 23:10:36 +0000 (19:10 -0400)
This allows automatic switching to the compute power profile depending
on compute activity.

Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Eric Huang <JinHuiEric.Huang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
drivers/gpu/drm/amd/include/kgd_kfd_interface.h

index 454c22c..f8bbbb3 100644 (file)
@@ -488,6 +488,14 @@ err:
        return ret;
 }
 
+void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle)
+{
+       struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
+
+       amdgpu_dpm_switch_power_profile(adev,
+                                       PP_SMC_POWER_PROFILE_COMPUTE, !idle);
+}
+
 bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid)
 {
        if (adev->kfd) {
index 60207ea..2f379c1 100644 (file)
@@ -119,6 +119,7 @@ int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm);
 int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine,
                                uint32_t vmid, uint64_t gpu_addr,
                                uint32_t *ib_cmd, uint32_t ib_len);
+void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle);
 
 struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void);
 struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void);
index 98eac00..ea3f698 100644 (file)
@@ -219,7 +219,8 @@ static const struct kfd2kgd_calls kfd2kgd = {
        .submit_ib = amdgpu_amdkfd_submit_ib,
        .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
        .read_vmid_from_vmfault_reg = read_vmid_from_vmfault_reg,
-       .gpu_recover = amdgpu_amdkfd_gpu_reset
+       .gpu_recover = amdgpu_amdkfd_gpu_reset,
+       .set_compute_idle = amdgpu_amdkfd_set_compute_idle
 };
 
 struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void)
index ad563b1..f6e53e9 100644 (file)
@@ -177,7 +177,8 @@ static const struct kfd2kgd_calls kfd2kgd = {
        .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
        .submit_ib = amdgpu_amdkfd_submit_ib,
        .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
-       .gpu_recover = amdgpu_amdkfd_gpu_reset
+       .gpu_recover = amdgpu_amdkfd_gpu_reset,
+       .set_compute_idle = amdgpu_amdkfd_set_compute_idle
 };
 
 struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)
index 3b07d37..8efedfc 100644 (file)
@@ -213,7 +213,8 @@ static const struct kfd2kgd_calls kfd2kgd = {
        .invalidate_tlbs = invalidate_tlbs,
        .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
        .submit_ib = amdgpu_amdkfd_submit_ib,
-       .gpu_recover = amdgpu_amdkfd_gpu_reset
+       .gpu_recover = amdgpu_amdkfd_gpu_reset,
+       .set_compute_idle = amdgpu_amdkfd_set_compute_idle
 };
 
 struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void)
index 7df5e4a..14391b0 100644 (file)
@@ -282,6 +282,9 @@ struct tile_config {
  *
  * @gpu_recover: let kgd reset gpu after kfd detect CPC hang
  *
+ * @set_compute_idle: Indicates that compute is idle on a device. This
+ * can be used to change power profiles depending on compute activity.
+ *
  * This structure contains function pointers to services that the kgd driver
  * provides to amdkfd driver.
  *
@@ -403,6 +406,8 @@ struct kfd2kgd_calls {
        uint32_t (*read_vmid_from_vmfault_reg)(struct kgd_dev *kgd);
 
        void (*gpu_recover)(struct kgd_dev *kgd);
+
+       void (*set_compute_idle)(struct kgd_dev *kgd, bool idle);
 };
 
 /**