Commit c2d43918 authored by Mukul Joshi's avatar Mukul Joshi Committed by Alex Deucher

drm/amdkfd: Setup current_logical_xcc_id in MQD

Setup rolling current_logical_xcc_id in MQD for GFX9.4.3
to ensure each queue starts at a different place and prevent
hotspotting issues. Also, remove updating current_logical_xcc_id
during queue update.
Suggested-by: default avatarJoseph Greathouse <Joseph.Greathouse@amd.com>
Signed-off-by: default avatarMukul Joshi <mukul.joshi@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a820d3ca
...@@ -256,6 +256,9 @@ struct device_queue_manager { ...@@ -256,6 +256,9 @@ struct device_queue_manager {
struct work_struct hw_exception_work; struct work_struct hw_exception_work;
struct kfd_mem_obj hiq_sdma_mqd; struct kfd_mem_obj hiq_sdma_mqd;
bool sched_running; bool sched_running;
/* used for GFX 9.4.3 only */
uint32_t current_logical_xcc_start;
}; };
void device_queue_manager_init_cik( void device_queue_manager_init_cik(
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "gc/gc_9_0_sh_mask.h" #include "gc/gc_9_0_sh_mask.h"
#include "sdma0/sdma0_4_0_sh_mask.h" #include "sdma0/sdma0_4_0_sh_mask.h"
#include "amdgpu_amdkfd.h" #include "amdgpu_amdkfd.h"
#include "kfd_device_queue_manager.h"
static void update_mqd(struct mqd_manager *mm, void *mqd, static void update_mqd(struct mqd_manager *mm, void *mqd,
struct queue_properties *q, struct queue_properties *q,
...@@ -569,6 +570,7 @@ static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, ...@@ -569,6 +570,7 @@ static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd,
uint64_t xcc_gart_addr = 0; uint64_t xcc_gart_addr = 0;
uint64_t xcc_ctx_save_restore_area_address; uint64_t xcc_ctx_save_restore_area_address;
uint64_t offset = mm->mqd_stride(mm, q); uint64_t offset = mm->mqd_stride(mm, q);
uint32_t local_xcc_start = mm->dev->dqm->current_logical_xcc_start++;
memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj));
for (xcc = 0; xcc < mm->dev->num_xcc_per_node; xcc++) { for (xcc = 0; xcc < mm->dev->num_xcc_per_node; xcc++) {
...@@ -596,18 +598,17 @@ static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, ...@@ -596,18 +598,17 @@ static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd,
if (q->format == KFD_QUEUE_FORMAT_AQL) { if (q->format == KFD_QUEUE_FORMAT_AQL) {
m->compute_tg_chunk_size = 1; m->compute_tg_chunk_size = 1;
m->compute_current_logic_xcc_id =
(local_xcc_start + xcc) %
mm->dev->num_xcc_per_node;
switch (xcc) { switch (xcc) {
case 0: case 0:
/* Master XCC */ /* Master XCC */
m->cp_hqd_pq_control &= m->cp_hqd_pq_control &=
~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK;
m->compute_current_logic_xcc_id =
mm->dev->num_xcc_per_node - 1;
break; break;
default: default:
m->compute_current_logic_xcc_id =
xcc - 1;
break; break;
} }
} else { } else {
...@@ -642,12 +643,8 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, ...@@ -642,12 +643,8 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
/* Master XCC */ /* Master XCC */
m->cp_hqd_pq_control &= m->cp_hqd_pq_control &=
~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK;
m->compute_current_logic_xcc_id =
mm->dev->num_xcc_per_node - 1;
break; break;
default: default:
m->compute_current_logic_xcc_id =
xcc - 1;
break; break;
} }
m->compute_tg_chunk_size = 1; m->compute_tg_chunk_size = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment