From: Likun Gao <[email protected]>

Correct inst_id input from physical to logic for sdma v7_1.
V2: Show real instance number on logic xcc.

Signed-off-by: Likun Gao <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c | 50 +++++++++++++-------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
index 446b7527f5c62..e3963675bfac0 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
@@ -369,7 +369,7 @@ static void sdma_v7_1_inst_gfx_stop(struct amdgpu_device 
*adev,
        u32 rb_cntl, ib_cntl;
        int i;
 
-       for_each_inst(i, inst_mask) {
+       for (i = 0; i < NUM_XCC(inst_mask); i++) {
                rb_cntl = RREG32_SOC15_IP(GC, sdma_v7_1_get_reg_offset(adev, i, 
regSDMA0_SDMA_QUEUE0_RB_CNTL));
                rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_SDMA_QUEUE0_RB_CNTL, 
RB_ENABLE, 0);
                WREG32_SOC15_IP(GC, sdma_v7_1_get_reg_offset(adev, i, 
regSDMA0_SDMA_QUEUE0_RB_CNTL), rb_cntl);
@@ -436,7 +436,7 @@ static void sdma_v7_1_inst_enable(struct amdgpu_device 
*adev,
        if (amdgpu_sriov_vf(adev))
                return;
 
-       for_each_inst(i, inst_mask) {
+       for (i = 0; i < NUM_XCC(inst_mask); i++) {
                mcu_cntl = RREG32_SOC15_IP(GC, sdma_v7_1_get_reg_offset(adev, 
i, regSDMA0_SDMA_MCU_CNTL));
                mcu_cntl = REG_SET_FIELD(mcu_cntl, SDMA0_SDMA_MCU_CNTL, HALT, 
enable ? 0 : 1);
                WREG32_SOC15_IP(GC, sdma_v7_1_get_reg_offset(adev, i, 
regSDMA0_SDMA_MCU_CNTL), mcu_cntl);
@@ -617,7 +617,7 @@ static int sdma_v7_1_inst_gfx_resume(struct amdgpu_device 
*adev,
 {
        int i, r;
 
-       for_each_inst(i, inst_mask) {
+       for (i = 0; i < NUM_XCC(inst_mask); i++) {
                r = sdma_v7_1_gfx_resume_instance(adev, i, false);
                if (r)
                        return r;
@@ -647,7 +647,7 @@ static void sdma_v7_1_inst_free_ucode_buffer(struct 
amdgpu_device *adev,
 {
        int i;
 
-       for_each_inst(i, inst_mask) {
+       for (i = 0; i < NUM_XCC(inst_mask); i++) {
                amdgpu_bo_free_kernel(&adev->sdma.instance[i].sdma_fw_obj,
                                      &adev->sdma.instance[i].sdma_fw_gpu_addr,
                                      (void 
**)&adev->sdma.instance[i].sdma_fw_ptr);
@@ -686,7 +686,7 @@ static int sdma_v7_1_inst_load_microcode(struct 
amdgpu_device *adev,
                        le32_to_cpu(hdr->ucode_offset_bytes));
        fw_size = le32_to_cpu(hdr->ucode_size_bytes);
 
-       for_each_inst(i, inst_mask) {
+       for (i = 0; i < NUM_XCC(inst_mask); i++) {
                r = amdgpu_bo_create_reserved(adev, fw_size,
                                              PAGE_SIZE,
                                              AMDGPU_GEM_DOMAIN_VRAM,
@@ -744,10 +744,10 @@ static int sdma_v7_1_soft_reset(struct amdgpu_ip_block 
*ip_block)
        u32 tmp;
        int i;
 
-       inst_mask = GENMASK(adev->sdma.num_instances - 1, 0);
+       inst_mask = adev->sdma.sdma_mask;
        sdma_v7_1_inst_gfx_stop(adev, inst_mask);
 
-       for_each_inst(i, inst_mask) {
+       for (i = 0; i < NUM_XCC(inst_mask); i++) {
                //tmp = RREG32_SOC15_IP(GC, sdma_v7_1_get_reg_offset(adev, i, 
regSDMA0_SDMA_FREEZE));
                //tmp |= SDMA0_SDMA_FREEZE__FREEZE_MASK;
                //WREG32_SOC15_IP(GC, sdma_v7_1_get_reg_offset(adev, i, 
regSDMA0_SDMA_FREEZE), tmp);
@@ -1288,10 +1288,14 @@ static int sdma_v7_1_sw_init(struct amdgpu_ip_block 
*ip_block)
                ring->ring_obj = NULL;
                ring->use_doorbell = true;
                ring->me = i;
-               xcc_id = adev->sdma.instance[i].xcc_id;
+
+               for (xcc_id = 0; xcc_id < fls(adev->gfx.xcc_mask); xcc_id++) {
+                       if (adev->sdma.instance[i].xcc_id == GET_INST(GC, 
xcc_id))
+                               break;
+               }
 
                DRM_DEBUG("SDMA%d.%d use_doorbell being set to: [%s]\n",
-                               xcc_id, i % adev->sdma.num_inst_per_xcc,
+                               xcc_id, GET_INST(SDMA0, i) % 
adev->sdma.num_inst_per_xcc,
                                ring->use_doorbell?"true":"false");
 
                ring->doorbell_index =
@@ -1299,7 +1303,7 @@ static int sdma_v7_1_sw_init(struct amdgpu_ip_block 
*ip_block)
 
                ring->vm_hub = AMDGPU_GFXHUB(xcc_id);
                sprintf(ring->name, "sdma%d.%d", xcc_id,
-                               i % adev->sdma.num_inst_per_xcc);
+                               GET_INST(SDMA0, i) % 
adev->sdma.num_inst_per_xcc);
                r = amdgpu_ring_init(adev, ring, 1024,
                                     &adev->sdma.trap_irq,
                                     AMDGPU_SDMA_IRQ_INSTANCE0 + i,
@@ -1334,11 +1338,8 @@ static int sdma_v7_1_sw_init(struct amdgpu_ip_block 
*ip_block)
 static int sdma_v7_1_sw_fini(struct amdgpu_ip_block *ip_block)
 {
        struct amdgpu_device *adev = ip_block->adev;
-       uint32_t inst_mask;
        int i;
 
-       inst_mask = GENMASK(adev->sdma.num_instances - 1, 0);
-
        for (i = 0; i < adev->sdma.num_instances; i++)
                amdgpu_ring_fini(&adev->sdma.instance[i].ring);
 
@@ -1346,7 +1347,7 @@ static int sdma_v7_1_sw_fini(struct amdgpu_ip_block 
*ip_block)
        amdgpu_sdma_destroy_inst_ctx(adev, true);
 
        if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT)
-               sdma_v7_1_inst_free_ucode_buffer(adev, inst_mask);
+               sdma_v7_1_inst_free_ucode_buffer(adev, adev->sdma.sdma_mask);
 
        kfree(adev->sdma.ip_dump);
 
@@ -1356,24 +1357,19 @@ static int sdma_v7_1_sw_fini(struct amdgpu_ip_block 
*ip_block)
 static int sdma_v7_1_hw_init(struct amdgpu_ip_block *ip_block)
 {
        struct amdgpu_device *adev = ip_block->adev;
-       uint32_t inst_mask;
-
-       inst_mask = GENMASK(adev->sdma.num_instances - 1, 0);
 
-       return sdma_v7_1_inst_start(adev, inst_mask);
+       return sdma_v7_1_inst_start(adev, adev->sdma.sdma_mask);
 }
 
 static int sdma_v7_1_hw_fini(struct amdgpu_ip_block *ip_block)
 {
        struct amdgpu_device *adev = ip_block->adev;
-       uint32_t inst_mask;
 
        if (amdgpu_sriov_vf(adev))
                return 0;
 
-       inst_mask = GENMASK(adev->sdma.num_instances - 1, 0);
-       sdma_v7_1_inst_ctx_switch_enable(adev, false, inst_mask);
-       sdma_v7_1_inst_enable(adev, false, inst_mask);
+       sdma_v7_1_inst_ctx_switch_enable(adev, false, adev->sdma.sdma_mask);
+       sdma_v7_1_inst_enable(adev, false, adev->sdma.sdma_mask);
 
        return 0;
 }
@@ -1493,7 +1489,7 @@ static int sdma_v7_1_process_trap_irq(struct 
amdgpu_device *adev,
                                      struct amdgpu_irq_src *source,
                                      struct amdgpu_iv_entry *entry)
 {
-       int instances, queue, xcc_id = 0;
+       int inst, instances, queue, xcc_id = 0;
        uint32_t mes_queue_id = entry->src_data[0];
 
        DRM_DEBUG("IH: SDMA trap\n");
@@ -1518,8 +1514,12 @@ static int sdma_v7_1_process_trap_irq(struct 
amdgpu_device *adev,
                xcc_id = adev->gfx.funcs->ih_node_to_logical_xcc(adev, 
entry->node_id);
        else
                dev_warn(adev->dev, "IH: SDMA may get wrong xcc id as gfx 
function not available\n");
-       instances = ((entry->ring_id & 0xf0) >> 4) +
-               xcc_id * adev->sdma.num_inst_per_xcc;
+       inst = ((entry->ring_id & 0xf0) >> 4) +
+               GET_INST(GC, xcc_id) * adev->sdma.num_inst_per_xcc;
+       for (instances = 0; instances < adev->sdma.num_instances; instances++) {
+               if (inst == GET_INST(SDMA0, instances))
+                       break;
+       }
        if (instances > adev->sdma.num_instances - 1) {
                DRM_ERROR("IH: wrong ring_ID detected, as wrong sdma 
instance\n");
                return -EINVAL;
-- 
2.52.0

Reply via email to