diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_device.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 7 |
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 | ||
| 1041 | void 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 | |||
| 1047 | void 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 | ||
| 284 | enum kfd_mempool { | 287 | enum kfd_mempool { |
| @@ -978,6 +981,10 @@ int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process *p); | |||
| 978 | 981 | ||
| 979 | bool kfd_is_locked(void); | 982 | bool kfd_is_locked(void); |
| 980 | 983 | ||
| 984 | /* Compute profile */ | ||
| 985 | void kfd_inc_compute_active(struct kfd_dev *dev); | ||
| 986 | void 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 | ||
