]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
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 454c22c722c24be6d146a11d96dffed17c149cbd..f8bbbb3a95043ebee9d5d02471b83e98fb923a0c 100644 (file)
@@ -488,6 +488,14 @@ int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine,
        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 60207ea48bf5de53a3614be78a2f99e59ab05739..2f379c183ed20be8af61e839ebbd75b9890a8593 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 98eac00e5d32509a16983c2dcb76a5c0cda1f138..ea3f698aef5eaec1353492b636c81eb2d2f84b78 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 ad563b1ee547454603500467bdecdd3a3a3657ec..f6e53e9352bd83c23f6cfe1d230839a07c17dc20 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 3b07d37b6fd45aa93d2f5d32a7e087a8c253a6b5..8efedfcb9dfca50defdeec3a189968f3f425a287 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 7df5e4ab839f522a57f57688dcc322ad0a3d9334..14391b06080ce4566ebbae1d8fd1a8313ac36bc8 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);
 };
 
 /**