aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5699-drm-amdkfd-Call-kfd2kgd.set_compute_idle.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5699-drm-amdkfd-Call-kfd2kgd.set_compute_idle.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5699-drm-amdkfd-Call-kfd2kgd.set_compute_idle.patch153
1 files changed, 153 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5699-drm-amdkfd-Call-kfd2kgd.set_compute_idle.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5699-drm-amdkfd-Call-kfd2kgd.set_compute_idle.patch
new file mode 100644
index 00000000..aa84f48b
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5699-drm-amdkfd-Call-kfd2kgd.set_compute_idle.patch
@@ -0,0 +1,153 @@
+From cde4316001fa528d4c9dd7d5a3d79a2ac696ac16 Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Mon, 16 Jul 2018 19:10:37 -0400
+Subject: [PATCH 5699/5725] drm/amdkfd: Call kfd2kgd.set_compute_idle
+
+User mode queue submissions don't go through KFD. Therefore we don't
+know exactly when compute is idle or not idle. We use the existence
+of user mode queues on a device as an approximation.
+
+register_process is called when the first queue of a process is
+created. Conversely unregister_process is called when the last queue
+is destroyed. The first process that is registered takes compute
+out of idle. The last process that is unregisters sets compute back
+to idle.
+
+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 | 8 ++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 3 ++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 3 ++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 3 ++-
+ drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 7 +++++--
+ drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 5 +++++
+ 7 files changed, 25 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+index 9ff80a5..f27bcd0 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+@@ -583,6 +583,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)
+ {
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index 23ac8a6..f9d21a6 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -117,6 +117,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);
+ struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+index d2702b0..ef482bc 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+@@ -229,7 +229,8 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
+ .copy_mem_to_mem = amdgpu_amdkfd_copy_mem_to_mem,
+ .get_vram_usage = amdgpu_amdkfd_get_vram_usage,
+- .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()
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+index 69ac7be..e6cfa22 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+@@ -202,7 +202,8 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
+ .copy_mem_to_mem = amdgpu_amdkfd_copy_mem_to_mem,
+ .get_vram_usage = amdgpu_amdkfd_get_vram_usage,
+- .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()
+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 c47a75d..eee3a3e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+@@ -252,7 +252,8 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
+ .copy_mem_to_mem = amdgpu_amdkfd_copy_mem_to_mem,
+ .get_vram_usage = amdgpu_amdkfd_get_vram_usage,
+- .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()
+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 d976f1c..147dc01 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+@@ -782,7 +782,8 @@ static int register_process(struct device_queue_manager *dqm,
+
+ retval = dqm->asic_ops.update_qpd(dqm, qpd);
+
+- dqm->processes_count++;
++ if (dqm->processes_count++ == 0)
++ dqm->dev->kfd2kgd->set_compute_idle(dqm->dev->kgd, false);
+
+ mutex_unlock(&dqm->lock);
+
+@@ -805,7 +806,9 @@ static int unregister_process(struct device_queue_manager *dqm,
+ if (qpd == cur->qpd) {
+ list_del(&cur->list);
+ kfree(cur);
+- dqm->processes_count--;
++ if (--dqm->processes_count == 0)
++ dqm->dev->kfd2kgd->set_compute_idle(
++ dqm->dev->kgd, true);
+ goto out;
+ }
+ }
+diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+index ad6ee1b..88dbade 100755
+--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+@@ -250,6 +250,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.
+ *
+@@ -402,6 +405,8 @@ struct kfd2kgd_calls {
+ uint64_t (*get_vram_usage)(struct kgd_dev *kgd);
+
+ void (*gpu_recover)(struct kgd_dev *kgd);
++
++ void (*set_compute_idle)(struct kgd_dev *kgd, bool idle);
+ };
+
+ /**
+--
+2.7.4
+
href='#n405'>405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565