Skip to content

Commit fc6efed

Browse files
mukjoshialexdeucher
authored andcommitted
drm/amdkfd: Update CU masking for GFX 9.4.3
The CU mask passed from user-space will change based on different spatial partitioning mode. As a result, update CU masking code for GFX9.4.3 to work for all partitioning modes. Signed-off-by: Mukul Joshi <mukul.joshi@amd.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 0752e66 commit fc6efed

7 files changed

Lines changed: 56 additions & 28 deletions

File tree

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,16 @@ void free_mqd_hiq_sdma(struct mqd_manager *mm, void *mqd,
9797

9898
void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
9999
const uint32_t *cu_mask, uint32_t cu_mask_count,
100-
uint32_t *se_mask)
100+
uint32_t *se_mask, uint32_t inst)
101101
{
102102
struct kfd_cu_info cu_info;
103103
uint32_t cu_per_sh[KFD_MAX_NUM_SE][KFD_MAX_NUM_SH_PER_SE] = {0};
104104
bool wgp_mode_req = KFD_GC_VERSION(mm->dev) >= IP_VERSION(10, 0, 0);
105105
uint32_t en_mask = wgp_mode_req ? 0x3 : 0x1;
106-
int i, se, sh, cu, cu_bitmap_sh_mul, inc = wgp_mode_req ? 2 : 1;
106+
int i, se, sh, cu, cu_bitmap_sh_mul, cu_inc = wgp_mode_req ? 2 : 1;
107107
uint32_t cu_active_per_node;
108+
int inc = cu_inc * NUM_XCC(mm->dev->xcc_mask);
109+
int xcc_inst = inst + ffs(mm->dev->xcc_mask) - 1;
108110

109111
amdgpu_amdkfd_get_cu_info(mm->dev->adev, &cu_info);
110112

@@ -143,7 +145,8 @@ void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
143145
for (se = 0; se < cu_info.num_shader_engines; se++)
144146
for (sh = 0; sh < cu_info.num_shader_arrays_per_engine; sh++)
145147
cu_per_sh[se][sh] = hweight32(
146-
cu_info.cu_bitmap[0][se % 4][sh + (se / 4) * cu_bitmap_sh_mul]);
148+
cu_info.cu_bitmap[xcc_inst][se % 4][sh + (se / 4) *
149+
cu_bitmap_sh_mul]);
147150

148151
/* Symmetrically map cu_mask to all SEs & SHs:
149152
* se_mask programs up to 2 SH in the upper and lower 16 bits.
@@ -166,20 +169,33 @@ void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
166169
* cu_mask[0] bit8 -> se_mask[0] bit1 (SE0,SH0,CU1)
167170
* ...
168171
*
172+
* For GFX 9.4.3, the following code only looks at a
173+
* subset of the cu_mask corresponding to the inst parameter.
174+
* If we have n XCCs under one GPU node
175+
* cu_mask[0] bit0 -> XCC0 se_mask[0] bit0 (XCC0,SE0,SH0,CU0)
176+
* cu_mask[0] bit1 -> XCC1 se_mask[0] bit0 (XCC1,SE0,SH0,CU0)
177+
* ..
178+
* cu_mask[0] bitn -> XCCn se_mask[0] bit0 (XCCn,SE0,SH0,CU0)
179+
* cu_mask[0] bit n+1 -> XCC0 se_mask[1] bit0 (XCC0,SE1,SH0,CU0)
180+
*
181+
* For example, if there are 6 XCCs under 1 KFD node, this code
182+
* running for each inst, will look at the bits as:
183+
* inst, inst + 6, inst + 12...
184+
*
169185
* First ensure all CUs are disabled, then enable user specified CUs.
170186
*/
171187
for (i = 0; i < cu_info.num_shader_engines; i++)
172188
se_mask[i] = 0;
173189

174-
i = 0;
175-
for (cu = 0; cu < 16; cu += inc) {
190+
i = inst;
191+
for (cu = 0; cu < 16; cu += cu_inc) {
176192
for (sh = 0; sh < cu_info.num_shader_arrays_per_engine; sh++) {
177193
for (se = 0; se < cu_info.num_shader_engines; se++) {
178194
if (cu_per_sh[se][sh] > cu) {
179195
if (cu_mask[i / 32] & (en_mask << (i % 32)))
180196
se_mask[se] |= en_mask << (cu + sh * 16);
181197
i += inc;
182-
if (i == cu_mask_count)
198+
if (i >= cu_mask_count)
183199
return;
184200
}
185201
}

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void free_mqd_hiq_sdma(struct mqd_manager *mm, void *mqd,
138138

139139
void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
140140
const uint32_t *cu_mask, uint32_t cu_mask_count,
141-
uint32_t *se_mask);
141+
uint32_t *se_mask, uint32_t inst);
142142

143143
int kfd_hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,
144144
uint32_t pipe_id, uint32_t queue_id,

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
5252
return;
5353

5454
mqd_symmetrically_map_cu_mask(mm,
55-
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask);
55+
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask, 0);
5656

5757
m = get_mqd(mqd);
5858
m->compute_static_thread_mgmt_se0 = se_mask[0];

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
5252
return;
5353

5454
mqd_symmetrically_map_cu_mask(mm,
55-
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask);
55+
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask, 0);
5656

5757
m = get_mqd(mqd);
5858
m->compute_static_thread_mgmt_se0 = se_mask[0];

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
7171
}
7272

7373
mqd_symmetrically_map_cu_mask(mm,
74-
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask);
74+
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask, 0);
7575

7676
m->compute_static_thread_mgmt_se0 = se_mask[0];
7777
m->compute_static_thread_mgmt_se1 = se_mask[1];

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static inline struct v9_sdma_mqd *get_sdma_mqd(void *mqd)
6060
}
6161

6262
static void update_cu_mask(struct mqd_manager *mm, void *mqd,
63-
struct mqd_update_info *minfo)
63+
struct mqd_update_info *minfo, uint32_t inst)
6464
{
6565
struct v9_mqd *m;
6666
uint32_t se_mask[KFD_MAX_NUM_SE] = {0};
@@ -69,27 +69,36 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
6969
return;
7070

7171
mqd_symmetrically_map_cu_mask(mm,
72-
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask);
72+
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask, inst);
7373

7474
m = get_mqd(mqd);
75+
7576
m->compute_static_thread_mgmt_se0 = se_mask[0];
7677
m->compute_static_thread_mgmt_se1 = se_mask[1];
7778
m->compute_static_thread_mgmt_se2 = se_mask[2];
7879
m->compute_static_thread_mgmt_se3 = se_mask[3];
79-
m->compute_static_thread_mgmt_se4 = se_mask[4];
80-
m->compute_static_thread_mgmt_se5 = se_mask[5];
81-
m->compute_static_thread_mgmt_se6 = se_mask[6];
82-
m->compute_static_thread_mgmt_se7 = se_mask[7];
83-
84-
pr_debug("update cu mask to %#x %#x %#x %#x %#x %#x %#x %#x\n",
85-
m->compute_static_thread_mgmt_se0,
86-
m->compute_static_thread_mgmt_se1,
87-
m->compute_static_thread_mgmt_se2,
88-
m->compute_static_thread_mgmt_se3,
89-
m->compute_static_thread_mgmt_se4,
90-
m->compute_static_thread_mgmt_se5,
91-
m->compute_static_thread_mgmt_se6,
92-
m->compute_static_thread_mgmt_se7);
80+
if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3)) {
81+
m->compute_static_thread_mgmt_se4 = se_mask[4];
82+
m->compute_static_thread_mgmt_se5 = se_mask[5];
83+
m->compute_static_thread_mgmt_se6 = se_mask[6];
84+
m->compute_static_thread_mgmt_se7 = se_mask[7];
85+
86+
pr_debug("update cu mask to %#x %#x %#x %#x %#x %#x %#x %#x\n",
87+
m->compute_static_thread_mgmt_se0,
88+
m->compute_static_thread_mgmt_se1,
89+
m->compute_static_thread_mgmt_se2,
90+
m->compute_static_thread_mgmt_se3,
91+
m->compute_static_thread_mgmt_se4,
92+
m->compute_static_thread_mgmt_se5,
93+
m->compute_static_thread_mgmt_se6,
94+
m->compute_static_thread_mgmt_se7);
95+
} else {
96+
pr_debug("inst: %u, update cu mask to %#x %#x %#x %#x\n",
97+
inst, m->compute_static_thread_mgmt_se0,
98+
m->compute_static_thread_mgmt_se1,
99+
m->compute_static_thread_mgmt_se2,
100+
m->compute_static_thread_mgmt_se3);
101+
}
93102
}
94103

95104
static void set_priority(struct v9_mqd *m, struct queue_properties *q)
@@ -290,7 +299,8 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,
290299
if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address)
291300
m->cp_hqd_ctx_save_control = 0;
292301

293-
update_cu_mask(mm, mqd, minfo);
302+
if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3))
303+
update_cu_mask(mm, mqd, minfo, 0);
294304
set_priority(m, q);
295305

296306
q->is_active = QUEUE_IS_ACTIVE(*q);
@@ -676,6 +686,8 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
676686
m = get_mqd(mqd + size * xcc);
677687
update_mqd(mm, m, q, minfo);
678688

689+
update_cu_mask(mm, mqd, minfo, xcc);
690+
679691
if (q->format == KFD_QUEUE_FORMAT_AQL) {
680692
switch (xcc) {
681693
case 0:

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
5555
return;
5656

5757
mqd_symmetrically_map_cu_mask(mm,
58-
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask);
58+
minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask, 0);
5959

6060
m = get_mqd(mqd);
6161
m->compute_static_thread_mgmt_se0 = se_mask[0];

0 commit comments

Comments
 (0)