3333#include "gc/gc_12_0_0_offset.h"
3434#include "gc/gc_12_0_0_sh_mask.h"
3535#include "hdp/hdp_6_0_0_offset.h"
36- #include "ivsrcid/gfx/irqsrcs_gfx_11_0_0 .h"
36+ #include "ivsrcid/gfx/irqsrcs_gfx_12_0_0 .h"
3737
3838#include "soc15_common.h"
3939#include "soc15.h"
4343#include "sdma_v7_0.h"
4444#include "v12_structs.h"
4545#include "mes_userqueue.h"
46+ #include "amdgpu_userq_fence.h"
4647
4748MODULE_FIRMWARE ("amdgpu/sdma_7_0_0.bin" );
4849MODULE_FIRMWARE ("amdgpu/sdma_7_0_1.bin" );
@@ -910,6 +911,9 @@ static int sdma_v7_0_mqd_init(struct amdgpu_device *adev, void *mqd,
910911 m -> sdmax_rlcx_csa_addr_lo = lower_32_bits (prop -> csa_addr );
911912 m -> sdmax_rlcx_csa_addr_hi = upper_32_bits (prop -> csa_addr );
912913
914+ m -> sdmax_rlcx_mcu_dbg0 = lower_32_bits (prop -> fence_address );
915+ m -> sdmax_rlcx_mcu_dbg1 = upper_32_bits (prop -> fence_address );
916+
913917 return 0 ;
914918}
915919
@@ -1296,11 +1300,18 @@ static int sdma_v7_0_sw_init(struct amdgpu_ip_block *ip_block)
12961300
12971301 /* SDMA trap event */
12981302 r = amdgpu_irq_add_id (adev , SOC21_IH_CLIENTID_GFX ,
1299- GFX_11_0_0__SRCID__SDMA_TRAP ,
1303+ GFX_12_0_0__SRCID__SDMA_TRAP ,
13001304 & adev -> sdma .trap_irq );
13011305 if (r )
13021306 return r ;
13031307
1308+ /* SDMA user fence event */
1309+ r = amdgpu_irq_add_id (adev , SOC21_IH_CLIENTID_GFX ,
1310+ GFX_12_0_0__SRCID__SDMA_FENCE ,
1311+ & adev -> sdma .fence_irq );
1312+ if (r )
1313+ return r ;
1314+
13041315 for (i = 0 ; i < adev -> sdma .num_instances ; i ++ ) {
13051316 ring = & adev -> sdma .instance [i ].ring ;
13061317 ring -> ring_obj = NULL ;
@@ -1526,25 +1537,9 @@ static int sdma_v7_0_process_trap_irq(struct amdgpu_device *adev,
15261537 struct amdgpu_iv_entry * entry )
15271538{
15281539 int instances , queue ;
1529- uint32_t mes_queue_id = entry -> src_data [0 ];
15301540
15311541 DRM_DEBUG ("IH: SDMA trap\n" );
15321542
1533- if (adev -> enable_mes && (mes_queue_id & AMDGPU_FENCE_MES_QUEUE_FLAG )) {
1534- struct amdgpu_mes_queue * queue ;
1535-
1536- mes_queue_id &= AMDGPU_FENCE_MES_QUEUE_ID_MASK ;
1537-
1538- spin_lock (& adev -> mes .queue_id_lock );
1539- queue = idr_find (& adev -> mes .queue_id_idr , mes_queue_id );
1540- if (queue ) {
1541- DRM_DEBUG ("process smda queue id = %d\n" , mes_queue_id );
1542- amdgpu_fence_process (queue -> ring );
1543- }
1544- spin_unlock (& adev -> mes .queue_id_lock );
1545- return 0 ;
1546- }
1547-
15481543 queue = entry -> ring_id & 0xf ;
15491544 instances = (entry -> ring_id & 0xf0 ) >> 4 ;
15501545 if (instances > 1 ) {
@@ -1566,6 +1561,29 @@ static int sdma_v7_0_process_trap_irq(struct amdgpu_device *adev,
15661561 return 0 ;
15671562}
15681563
1564+ static int sdma_v7_0_process_fence_irq (struct amdgpu_device * adev ,
1565+ struct amdgpu_irq_src * source ,
1566+ struct amdgpu_iv_entry * entry )
1567+ {
1568+ u32 doorbell_offset = entry -> src_data [0 ];
1569+
1570+ if (adev -> enable_mes && doorbell_offset ) {
1571+ struct amdgpu_userq_fence_driver * fence_drv = NULL ;
1572+ struct xarray * xa = & adev -> userq_xa ;
1573+ unsigned long flags ;
1574+
1575+ doorbell_offset >>= SDMA0_QUEUE0_DOORBELL_OFFSET__OFFSET__SHIFT ;
1576+
1577+ xa_lock_irqsave (xa , flags );
1578+ fence_drv = xa_load (xa , doorbell_offset );
1579+ if (fence_drv )
1580+ amdgpu_userq_fence_driver_process (fence_drv );
1581+ xa_unlock_irqrestore (xa , flags );
1582+ }
1583+
1584+ return 0 ;
1585+ }
1586+
15691587static int sdma_v7_0_process_illegal_inst_irq (struct amdgpu_device * adev ,
15701588 struct amdgpu_irq_src * source ,
15711589 struct amdgpu_iv_entry * entry )
@@ -1703,6 +1721,10 @@ static const struct amdgpu_irq_src_funcs sdma_v7_0_trap_irq_funcs = {
17031721 .process = sdma_v7_0_process_trap_irq ,
17041722};
17051723
1724+ static const struct amdgpu_irq_src_funcs sdma_v7_0_fence_irq_funcs = {
1725+ .process = sdma_v7_0_process_fence_irq ,
1726+ };
1727+
17061728static const struct amdgpu_irq_src_funcs sdma_v7_0_illegal_inst_irq_funcs = {
17071729 .process = sdma_v7_0_process_illegal_inst_irq ,
17081730};
@@ -1712,6 +1734,7 @@ static void sdma_v7_0_set_irq_funcs(struct amdgpu_device *adev)
17121734 adev -> sdma .trap_irq .num_types = AMDGPU_SDMA_IRQ_INSTANCE0 +
17131735 adev -> sdma .num_instances ;
17141736 adev -> sdma .trap_irq .funcs = & sdma_v7_0_trap_irq_funcs ;
1737+ adev -> sdma .fence_irq .funcs = & sdma_v7_0_fence_irq_funcs ;
17151738 adev -> sdma .illegal_inst_irq .funcs = & sdma_v7_0_illegal_inst_irq_funcs ;
17161739}
17171740
0 commit comments