aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device.c16
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c11
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_priv.h7
3 files changed, 29 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 4dd8489144d0..765b58a17dc7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -463,6 +463,7 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd,
463 kfd->pdev = pdev; 463 kfd->pdev = pdev;
464 kfd->init_complete = false; 464 kfd->init_complete = false;
465 kfd->kfd2kgd = f2g; 465 kfd->kfd2kgd = f2g;
466 atomic_set(&kfd->compute_profile, 0);
466 467
467 mutex_init(&kfd->doorbell_mutex); 468 mutex_init(&kfd->doorbell_mutex);
468 memset(&kfd->doorbell_available_index, 0, 469 memset(&kfd->doorbell_available_index, 0,
@@ -1037,6 +1038,21 @@ void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd)
1037 atomic_inc(&kfd->sram_ecc_flag); 1038 atomic_inc(&kfd->sram_ecc_flag);
1038} 1039}
1039 1040
1041void kfd_inc_compute_active(struct kfd_dev *kfd)
1042{
1043 if (atomic_inc_return(&kfd->compute_profile) == 1)
1044 amdgpu_amdkfd_set_compute_idle(kfd->kgd, false);
1045}
1046
1047void kfd_dec_compute_active(struct kfd_dev *kfd)
1048{
1049 int count = atomic_dec_return(&kfd->compute_profile);
1050
1051 if (count == 0)
1052 amdgpu_amdkfd_set_compute_idle(kfd->kgd, true);
1053 WARN_ONCE(count < 0, "Compute profile ref. count error");
1054}
1055
1040#if defined(CONFIG_DEBUG_FS) 1056#if defined(CONFIG_DEBUG_FS)
1041 1057
1042/* This function will send a package to HIQ to hang the HWS 1058/* This function will send a package to HIQ to hang the HWS
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index c6c9530e704e..ae381450601c 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -811,8 +811,8 @@ static int register_process(struct device_queue_manager *dqm,
811 811
812 retval = dqm->asic_ops.update_qpd(dqm, qpd); 812 retval = dqm->asic_ops.update_qpd(dqm, qpd);
813 813
814 if (dqm->processes_count++ == 0) 814 dqm->processes_count++;
815 amdgpu_amdkfd_set_compute_idle(dqm->dev->kgd, false); 815 kfd_inc_compute_active(dqm->dev);
816 816
817 dqm_unlock(dqm); 817 dqm_unlock(dqm);
818 818
@@ -835,9 +835,8 @@ static int unregister_process(struct device_queue_manager *dqm,
835 if (qpd == cur->qpd) { 835 if (qpd == cur->qpd) {
836 list_del(&cur->list); 836 list_del(&cur->list);
837 kfree(cur); 837 kfree(cur);
838 if (--dqm->processes_count == 0) 838 dqm->processes_count--;
839 amdgpu_amdkfd_set_compute_idle( 839 kfd_dec_compute_active(dqm->dev);
840 dqm->dev->kgd, true);
841 goto out; 840 goto out;
842 } 841 }
843 } 842 }
@@ -1539,6 +1538,7 @@ static int process_termination_nocpsch(struct device_queue_manager *dqm,
1539 list_del(&cur->list); 1538 list_del(&cur->list);
1540 kfree(cur); 1539 kfree(cur);
1541 dqm->processes_count--; 1540 dqm->processes_count--;
1541 kfd_dec_compute_active(dqm->dev);
1542 break; 1542 break;
1543 } 1543 }
1544 } 1544 }
@@ -1626,6 +1626,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
1626 list_del(&cur->list); 1626 list_del(&cur->list);
1627 kfree(cur); 1627 kfree(cur);
1628 dqm->processes_count--; 1628 dqm->processes_count--;
1629 kfd_dec_compute_active(dqm->dev);
1629 break; 1630 break;
1630 } 1631 }
1631 } 1632 }
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 9e0230965675..487d5da337c1 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -279,6 +279,9 @@ struct kfd_dev {
279 279
280 /* SRAM ECC flag */ 280 /* SRAM ECC flag */
281 atomic_t sram_ecc_flag; 281 atomic_t sram_ecc_flag;
282
283 /* Compute Profile ref. count */
284 atomic_t compute_profile;
282}; 285};
283 286
284enum kfd_mempool { 287enum kfd_mempool {
@@ -978,6 +981,10 @@ int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process *p);
978 981
979bool kfd_is_locked(void); 982bool kfd_is_locked(void);
980 983
984/* Compute profile */
985void kfd_inc_compute_active(struct kfd_dev *dev);
986void kfd_dec_compute_active(struct kfd_dev *dev);
987
981/* Debugfs */ 988/* Debugfs */
982#if defined(CONFIG_DEBUG_FS) 989#if defined(CONFIG_DEBUG_FS)
983 990