Skip to content

Commit 34c36a7

Browse files
Jack Xiaoalexdeucher
authored andcommitted
drm/amdgpu/mes: add mes mapping legacy queue switch
For mes11 old firmware has issue to map legacy queue, add a flag to switch mes to map legacy queue. Fixes: f9d8c5c ("drm/amdgpu/gfx: enable mes to map legacy queue support") Reported-by: Andrew Worsley <[email protected]> Link: https://lists.freedesktop.org/archives/amd-gfx/2024-August/112773.html Signed-off-by: Jack Xiao <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]> (cherry picked from commit 52491d9)
1 parent 6544458 commit 34c36a7

File tree

4 files changed

+43
-20
lines changed

4 files changed

+43
-20
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev, int xcc_id)
657657
uint64_t queue_mask = 0;
658658
int r, i, j;
659659

660-
if (adev->enable_mes)
660+
if (adev->mes.enable_legacy_queue_map)
661661
return amdgpu_gfx_mes_enable_kcq(adev, xcc_id);
662662

663663
if (!kiq->pmf || !kiq->pmf->kiq_map_queues || !kiq->pmf->kiq_set_resources)
@@ -719,7 +719,7 @@ int amdgpu_gfx_enable_kgq(struct amdgpu_device *adev, int xcc_id)
719719

720720
amdgpu_device_flush_hdp(adev, NULL);
721721

722-
if (adev->enable_mes) {
722+
if (adev->mes.enable_legacy_queue_map) {
723723
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
724724
j = i + xcc_id * adev->gfx.num_gfx_rings;
725725
r = amdgpu_mes_map_legacy_queue(adev,

drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ struct amdgpu_mes {
7575

7676
uint32_t sched_version;
7777
uint32_t kiq_version;
78+
bool enable_legacy_queue_map;
7879

7980
uint32_t total_max_queue;
8081
uint32_t max_doorbell_slices;

drivers/gpu/drm/amd/amdgpu/mes_v11_0.c

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,28 @@ static void mes_v11_0_free_ucode_buffers(struct amdgpu_device *adev,
693693
(void **)&adev->mes.ucode_fw_ptr[pipe]);
694694
}
695695

696+
static void mes_v11_0_get_fw_version(struct amdgpu_device *adev)
697+
{
698+
int pipe;
699+
700+
/* get MES scheduler/KIQ versions */
701+
mutex_lock(&adev->srbm_mutex);
702+
703+
for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) {
704+
soc21_grbm_select(adev, 3, pipe, 0, 0);
705+
706+
if (pipe == AMDGPU_MES_SCHED_PIPE)
707+
adev->mes.sched_version =
708+
RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
709+
else if (pipe == AMDGPU_MES_KIQ_PIPE && adev->enable_mes_kiq)
710+
adev->mes.kiq_version =
711+
RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
712+
}
713+
714+
soc21_grbm_select(adev, 0, 0, 0, 0);
715+
mutex_unlock(&adev->srbm_mutex);
716+
}
717+
696718
static void mes_v11_0_enable(struct amdgpu_device *adev, bool enable)
697719
{
698720
uint64_t ucode_addr;
@@ -1062,18 +1084,6 @@ static int mes_v11_0_queue_init(struct amdgpu_device *adev,
10621084
mes_v11_0_queue_init_register(ring);
10631085
}
10641086

1065-
/* get MES scheduler/KIQ versions */
1066-
mutex_lock(&adev->srbm_mutex);
1067-
soc21_grbm_select(adev, 3, pipe, 0, 0);
1068-
1069-
if (pipe == AMDGPU_MES_SCHED_PIPE)
1070-
adev->mes.sched_version = RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
1071-
else if (pipe == AMDGPU_MES_KIQ_PIPE && adev->enable_mes_kiq)
1072-
adev->mes.kiq_version = RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
1073-
1074-
soc21_grbm_select(adev, 0, 0, 0, 0);
1075-
mutex_unlock(&adev->srbm_mutex);
1076-
10771087
return 0;
10781088
}
10791089

@@ -1320,15 +1330,24 @@ static int mes_v11_0_kiq_hw_init(struct amdgpu_device *adev)
13201330

13211331
mes_v11_0_enable(adev, true);
13221332

1333+
mes_v11_0_get_fw_version(adev);
1334+
13231335
mes_v11_0_kiq_setting(&adev->gfx.kiq[0].ring);
13241336

13251337
r = mes_v11_0_queue_init(adev, AMDGPU_MES_KIQ_PIPE);
13261338
if (r)
13271339
goto failure;
13281340

1329-
r = mes_v11_0_hw_init(adev);
1330-
if (r)
1331-
goto failure;
1341+
if ((adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) >= 0x47)
1342+
adev->mes.enable_legacy_queue_map = true;
1343+
else
1344+
adev->mes.enable_legacy_queue_map = false;
1345+
1346+
if (adev->mes.enable_legacy_queue_map) {
1347+
r = mes_v11_0_hw_init(adev);
1348+
if (r)
1349+
goto failure;
1350+
}
13321351

13331352
return r;
13341353

drivers/gpu/drm/amd/amdgpu/mes_v12_0.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,7 @@ static int mes_v12_0_sw_init(void *handle)
12661266
adev->mes.funcs = &mes_v12_0_funcs;
12671267
adev->mes.kiq_hw_init = &mes_v12_0_kiq_hw_init;
12681268
adev->mes.kiq_hw_fini = &mes_v12_0_kiq_hw_fini;
1269+
adev->mes.enable_legacy_queue_map = true;
12691270

12701271
adev->mes.event_log_size = AMDGPU_MES_LOG_BUFFER_SIZE;
12711272

@@ -1422,9 +1423,11 @@ static int mes_v12_0_kiq_hw_init(struct amdgpu_device *adev)
14221423
mes_v12_0_set_hw_resources_1(&adev->mes, AMDGPU_MES_KIQ_PIPE);
14231424
}
14241425

1425-
r = mes_v12_0_hw_init(adev);
1426-
if (r)
1427-
goto failure;
1426+
if (adev->mes.enable_legacy_queue_map) {
1427+
r = mes_v12_0_hw_init(adev);
1428+
if (r)
1429+
goto failure;
1430+
}
14281431

14291432
return r;
14301433

0 commit comments

Comments
 (0)