Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: Add handler for SDMA context empty

Context empty interrupt is enabled for SDMA 4.4.2. Add a handler for
context empty interrupt so that it is disposed of fast, and not
propagated to KFD layer.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Suggested-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Lijo Lazar and committed by
Alex Deucher
b1df8050 9d63fbf7

+23
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
··· 107 107 struct amdgpu_irq_src doorbell_invalid_irq; 108 108 struct amdgpu_irq_src pool_timeout_irq; 109 109 struct amdgpu_irq_src srbm_write_irq; 110 + struct amdgpu_irq_src ctxt_empty_irq; 110 111 111 112 int num_instances; 112 113 uint32_t sdma_mask;
+22
drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
··· 1406 1406 &adev->sdma.srbm_write_irq); 1407 1407 if (r) 1408 1408 return r; 1409 + 1410 + r = amdgpu_irq_add_id(adev, sdma_v4_4_2_seq_to_irq_id(i), 1411 + SDMA0_4_0__SRCID__SDMA_CTXEMPTY, 1412 + &adev->sdma.ctxt_empty_irq); 1413 + if (r) 1414 + return r; 1409 1415 } 1410 1416 1411 1417 for (i = 0; i < adev->sdma.num_instances; i++) { ··· 1820 1814 return 0; 1821 1815 } 1822 1816 1817 + static int sdma_v4_4_2_process_ctxt_empty_irq(struct amdgpu_device *adev, 1818 + struct amdgpu_irq_src *source, 1819 + struct amdgpu_iv_entry *entry) 1820 + { 1821 + /* There is nothing useful to be done here, only kept for debug */ 1822 + dev_dbg_ratelimited(adev->dev, "SDMA context empty interrupt"); 1823 + sdma_v4_4_2_print_iv_entry(adev, entry); 1824 + return 0; 1825 + } 1826 + 1823 1827 static void sdma_v4_4_2_inst_update_medium_grain_light_sleep( 1824 1828 struct amdgpu_device *adev, bool enable, uint32_t inst_mask) 1825 1829 { ··· 2112 2096 .process = sdma_v4_4_2_process_srbm_write_irq, 2113 2097 }; 2114 2098 2099 + static const struct amdgpu_irq_src_funcs sdma_v4_4_2_ctxt_empty_irq_funcs = { 2100 + .process = sdma_v4_4_2_process_ctxt_empty_irq, 2101 + }; 2102 + 2115 2103 static void sdma_v4_4_2_set_irq_funcs(struct amdgpu_device *adev) 2116 2104 { 2117 2105 adev->sdma.trap_irq.num_types = adev->sdma.num_instances; ··· 2124 2104 adev->sdma.doorbell_invalid_irq.num_types = adev->sdma.num_instances; 2125 2105 adev->sdma.pool_timeout_irq.num_types = adev->sdma.num_instances; 2126 2106 adev->sdma.srbm_write_irq.num_types = adev->sdma.num_instances; 2107 + adev->sdma.ctxt_empty_irq.num_types = adev->sdma.num_instances; 2127 2108 2128 2109 adev->sdma.trap_irq.funcs = &sdma_v4_4_2_trap_irq_funcs; 2129 2110 adev->sdma.illegal_inst_irq.funcs = &sdma_v4_4_2_illegal_inst_irq_funcs; ··· 2133 2112 adev->sdma.doorbell_invalid_irq.funcs = &sdma_v4_4_2_doorbell_invalid_irq_funcs; 2134 2113 adev->sdma.pool_timeout_irq.funcs = &sdma_v4_4_2_pool_timeout_irq_funcs; 2135 2114 adev->sdma.srbm_write_irq.funcs = &sdma_v4_4_2_srbm_write_irq_funcs; 2115 + adev->sdma.ctxt_empty_irq.funcs = &sdma_v4_4_2_ctxt_empty_irq_funcs; 2136 2116 } 2137 2117 2138 2118 /**