diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2902-drm-amdgpu-reorganize-sdma-v4-code-to-support-more-i.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2902-drm-amdgpu-reorganize-sdma-v4-code-to-support-more-i.patch | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2902-drm-amdgpu-reorganize-sdma-v4-code-to-support-more-i.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2902-drm-amdgpu-reorganize-sdma-v4-code-to-support-more-i.patch new file mode 100644 index 00000000..7bbb8cce --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2902-drm-amdgpu-reorganize-sdma-v4-code-to-support-more-i.patch @@ -0,0 +1,254 @@ +From e367ba094e61d3f280fe90119d9f9bfe431b852b Mon Sep 17 00:00:00 2001 +From: Le Ma <le.ma@amd.com> +Date: Wed, 5 Sep 2018 16:21:20 +0800 +Subject: [PATCH 2902/2940] drm/amdgpu: reorganize sdma v4 code to support more + instances + +This change is needed for Arcturus which has 8 sdma instances. +The CG/PG part is not covered for now. + +Signed-off-by: Le Ma <le.ma@amd.com> +Acked-by: Snow Zhang < Snow.Zhang@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 8 +- + drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 144 ++++++++++++++++------- + 2 files changed, 107 insertions(+), 45 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +index 35dd152f9d5c..a9ae0d8a0589 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +@@ -25,11 +25,17 @@ + #define __AMDGPU_SDMA_H__ + + /* max number of IP instances */ +-#define AMDGPU_MAX_SDMA_INSTANCES 2 ++#define AMDGPU_MAX_SDMA_INSTANCES 8 + + enum amdgpu_sdma_irq { + AMDGPU_SDMA_IRQ_INSTANCE0 = 0, + AMDGPU_SDMA_IRQ_INSTANCE1, ++ AMDGPU_SDMA_IRQ_INSTANCE2, ++ AMDGPU_SDMA_IRQ_INSTANCE3, ++ AMDGPU_SDMA_IRQ_INSTANCE4, ++ AMDGPU_SDMA_IRQ_INSTANCE5, ++ AMDGPU_SDMA_IRQ_INSTANCE6, ++ AMDGPU_SDMA_IRQ_INSTANCE7, + AMDGPU_SDMA_IRQ_LAST + }; + +diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +index d962afb6d632..57c09b748288 100644 +--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +@@ -202,8 +202,77 @@ static const struct soc15_reg_golden golden_settings_sdma_rv2[] = + static u32 sdma_v4_0_get_reg_offset(struct amdgpu_device *adev, + u32 instance, u32 offset) + { +- return ( 0 == instance ? (adev->reg_offset[SDMA0_HWIP][0][0] + offset) : +- (adev->reg_offset[SDMA1_HWIP][0][0] + offset)); ++ switch (instance) { ++ case 0: ++ return (adev->reg_offset[SDMA0_HWIP][0][0] + offset); ++ case 1: ++ return (adev->reg_offset[SDMA1_HWIP][0][0] + offset); ++ case 2: ++ return (adev->reg_offset[SDMA2_HWIP][0][0] + offset); ++ case 3: ++ return (adev->reg_offset[SDMA3_HWIP][0][0] + offset); ++ case 4: ++ return (adev->reg_offset[SDMA4_HWIP][0][0] + offset); ++ case 5: ++ return (adev->reg_offset[SDMA5_HWIP][0][0] + offset); ++ case 6: ++ return (adev->reg_offset[SDMA6_HWIP][0][0] + offset); ++ case 7: ++ return (adev->reg_offset[SDMA7_HWIP][0][0] + offset); ++ default: ++ break; ++ } ++ return 0; ++} ++ ++static unsigned sdma_v4_0_seq_to_irq_id(int seq_num) ++{ ++ switch (seq_num) { ++ case 0: ++ return SOC15_IH_CLIENTID_SDMA0; ++ case 1: ++ return SOC15_IH_CLIENTID_SDMA1; ++ case 2: ++ return SOC15_IH_CLIENTID_SDMA2; ++ case 3: ++ return SOC15_IH_CLIENTID_SDMA3; ++ case 4: ++ return SOC15_IH_CLIENTID_SDMA4; ++ case 5: ++ return SOC15_IH_CLIENTID_SDMA5; ++ case 6: ++ return SOC15_IH_CLIENTID_SDMA6; ++ case 7: ++ return SOC15_IH_CLIENTID_SDMA7; ++ default: ++ break; ++ } ++ return 0; ++} ++ ++static int sdma_v4_0_irq_id_to_seq(unsigned client_id) ++{ ++ switch (client_id) { ++ case SOC15_IH_CLIENTID_SDMA0: ++ return 0; ++ case SOC15_IH_CLIENTID_SDMA1: ++ return 1; ++ case SOC15_IH_CLIENTID_SDMA2: ++ return 2; ++ case SOC15_IH_CLIENTID_SDMA3: ++ return 3; ++ case SOC15_IH_CLIENTID_SDMA4: ++ return 4; ++ case SOC15_IH_CLIENTID_SDMA5: ++ return 5; ++ case SOC15_IH_CLIENTID_SDMA6: ++ return 6; ++ case SOC15_IH_CLIENTID_SDMA7: ++ return 7; ++ default: ++ break; ++ } ++ return 0; + } + + static void sdma_v4_0_init_golden_registers(struct amdgpu_device *adev) +@@ -305,7 +374,7 @@ static int sdma_v4_0_init_microcode(struct amdgpu_device *adev) + if (i == 0) + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); + else +- snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); ++ snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma%d.bin", chip_name, i); + err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev); + if (err) + goto out; +@@ -617,26 +686,27 @@ static void sdma_v4_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 se + */ + static void sdma_v4_0_gfx_stop(struct amdgpu_device *adev) + { +- struct amdgpu_ring *sdma0 = &adev->sdma.instance[0].ring; +- struct amdgpu_ring *sdma1 = &adev->sdma.instance[1].ring; ++ struct amdgpu_ring *sdma[AMDGPU_MAX_SDMA_INSTANCES]; + u32 rb_cntl, ib_cntl; +- int i; ++ int i, unset = 0; + +- if ((adev->mman.buffer_funcs_ring == sdma0) || +- (adev->mman.buffer_funcs_ring == sdma1)) ++ for (i = 0; i < adev->sdma.num_instances; i++) { ++ sdma[i] = &adev->sdma.instance[i].ring; ++ ++ if ((adev->mman.buffer_funcs_ring == sdma[i]) && unset != 1) { + amdgpu_ttm_set_buffer_funcs_status(adev, false); ++ unset = 1; ++ } + +- for (i = 0; i < adev->sdma.num_instances; i++) { + rb_cntl = RREG32_SDMA(i, mmSDMA0_GFX_RB_CNTL); + rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0); + WREG32_SDMA(i, mmSDMA0_GFX_RB_CNTL, rb_cntl); + ib_cntl = RREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL); + ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0); + WREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL, ib_cntl); +- } + +- sdma0->sched.ready = false; +- sdma1->sched.ready = false; ++ sdma[i]->sched.ready = false; ++ } + } + + /** +@@ -1605,16 +1675,13 @@ static int sdma_v4_0_sw_init(void *handle) + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + + /* SDMA trap event */ +- r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_SDMA0, SDMA0_4_0__SRCID__SDMA_TRAP, +- &adev->sdma.trap_irq); +- if (r) +- return r; +- +- /* SDMA trap event */ +- r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_SDMA1, SDMA1_4_0__SRCID__SDMA_TRAP, +- &adev->sdma.trap_irq); +- if (r) +- return r; ++ for (i = 0; i < adev->sdma.num_instances; i++) { ++ r = amdgpu_irq_add_id(adev, sdma_v4_0_seq_to_irq_id(i), ++ SDMA0_4_0__SRCID__SDMA_TRAP, ++ &adev->sdma.trap_irq); ++ if (r) ++ return r; ++ } + + /* SDMA SRAM ECC event */ + r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_SDMA0, SDMA0_4_0__SRCID__SDMA_SRAM_ECC, +@@ -1640,11 +1707,8 @@ static int sdma_v4_0_sw_init(void *handle) + ring->doorbell_index = adev->doorbell_index.sdma_engine[i] << 1; + + sprintf(ring->name, "sdma%d", i); +- r = amdgpu_ring_init(adev, ring, 1024, +- &adev->sdma.trap_irq, +- (i == 0) ? +- AMDGPU_SDMA_IRQ_INSTANCE0 : +- AMDGPU_SDMA_IRQ_INSTANCE1); ++ r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq, ++ AMDGPU_SDMA_IRQ_INSTANCE0 + i); + if (r) + return r; + +@@ -1775,15 +1839,17 @@ static bool sdma_v4_0_is_idle(void *handle) + + static int sdma_v4_0_wait_for_idle(void *handle) + { +- unsigned i; +- u32 sdma0, sdma1; ++ unsigned i, j; ++ u32 sdma[AMDGPU_MAX_SDMA_INSTANCES]; + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + + for (i = 0; i < adev->usec_timeout; i++) { +- sdma0 = RREG32_SDMA(0, mmSDMA0_STATUS_REG); +- sdma1 = RREG32_SDMA(1, mmSDMA0_STATUS_REG); +- +- if (sdma0 & sdma1 & SDMA0_STATUS_REG__IDLE_MASK) ++ for (j = 0; j < adev->sdma.num_instances; j++) { ++ sdma[j] = RREG32_SDMA(j, mmSDMA0_STATUS_REG); ++ if (!(sdma[j] & SDMA0_STATUS_REG__IDLE_MASK)) ++ break; ++ } ++ if (j == adev->sdma.num_instances) + return 0; + udelay(1); + } +@@ -1819,17 +1885,7 @@ static int sdma_v4_0_process_trap_irq(struct amdgpu_device *adev, + uint32_t instance; + + DRM_DEBUG("IH: SDMA trap\n"); +- switch (entry->client_id) { +- case SOC15_IH_CLIENTID_SDMA0: +- instance = 0; +- break; +- case SOC15_IH_CLIENTID_SDMA1: +- instance = 1; +- break; +- default: +- return 0; +- } +- ++ instance = sdma_v4_0_irq_id_to_seq(entry->client_id); + switch (entry->ring_id) { + case 0: + amdgpu_fence_process(&adev->sdma.instance[instance].ring); +-- +2.17.1 + |