4444#include "sdma_v6_0.h"
4545#include "v11_structs.h"
4646#include "mes_userqueue.h"
47+ #include "amdgpu_userq_fence.h"
4748
4849MODULE_FIRMWARE ("amdgpu/sdma_6_0_0.bin" );
4950MODULE_FIRMWARE ("amdgpu/sdma_6_0_1.bin" );
@@ -893,6 +894,9 @@ static int sdma_v6_0_mqd_init(struct amdgpu_device *adev, void *mqd,
893894 m -> sdmax_rlcx_csa_addr_lo = lower_32_bits (prop -> csa_addr );
894895 m -> sdmax_rlcx_csa_addr_hi = upper_32_bits (prop -> csa_addr );
895896
897+ m -> sdmax_rlcx_f32_dbg0 = lower_32_bits (prop -> fence_address );
898+ m -> sdmax_rlcx_f32_dbg1 = upper_32_bits (prop -> fence_address );
899+
896900 return 0 ;
897901}
898902
@@ -1315,6 +1319,13 @@ static int sdma_v6_0_sw_init(struct amdgpu_ip_block *ip_block)
13151319 if (r )
13161320 return r ;
13171321
1322+ /* SDMA user fence event */
1323+ r = amdgpu_irq_add_id (adev , SOC21_IH_CLIENTID_GFX ,
1324+ GFX_11_0_0__SRCID__SDMA_FENCE ,
1325+ & adev -> sdma .fence_irq );
1326+ if (r )
1327+ return r ;
1328+
13181329 for (i = 0 ; i < adev -> sdma .num_instances ; i ++ ) {
13191330 ring = & adev -> sdma .instance [i ].ring ;
13201331 ring -> ring_obj = NULL ;
@@ -1575,25 +1586,9 @@ static int sdma_v6_0_process_trap_irq(struct amdgpu_device *adev,
15751586 struct amdgpu_iv_entry * entry )
15761587{
15771588 int instances , queue ;
1578- uint32_t mes_queue_id = entry -> src_data [0 ];
15791589
15801590 DRM_DEBUG ("IH: SDMA trap\n" );
15811591
1582- if (adev -> enable_mes && (mes_queue_id & AMDGPU_FENCE_MES_QUEUE_FLAG )) {
1583- struct amdgpu_mes_queue * queue ;
1584-
1585- mes_queue_id &= AMDGPU_FENCE_MES_QUEUE_ID_MASK ;
1586-
1587- spin_lock (& adev -> mes .queue_id_lock );
1588- queue = idr_find (& adev -> mes .queue_id_idr , mes_queue_id );
1589- if (queue ) {
1590- DRM_DEBUG ("process smda queue id = %d\n" , mes_queue_id );
1591- amdgpu_fence_process (queue -> ring );
1592- }
1593- spin_unlock (& adev -> mes .queue_id_lock );
1594- return 0 ;
1595- }
1596-
15971592 queue = entry -> ring_id & 0xf ;
15981593 instances = (entry -> ring_id & 0xf0 ) >> 4 ;
15991594 if (instances > 1 ) {
@@ -1615,6 +1610,29 @@ static int sdma_v6_0_process_trap_irq(struct amdgpu_device *adev,
16151610 return 0 ;
16161611}
16171612
1613+ static int sdma_v6_0_process_fence_irq (struct amdgpu_device * adev ,
1614+ struct amdgpu_irq_src * source ,
1615+ struct amdgpu_iv_entry * entry )
1616+ {
1617+ u32 doorbell_offset = entry -> src_data [0 ];
1618+
1619+ if (adev -> enable_mes && doorbell_offset ) {
1620+ struct amdgpu_userq_fence_driver * fence_drv = NULL ;
1621+ struct xarray * xa = & adev -> userq_xa ;
1622+ unsigned long flags ;
1623+
1624+ doorbell_offset >>= SDMA0_QUEUE0_DOORBELL_OFFSET__OFFSET__SHIFT ;
1625+
1626+ xa_lock_irqsave (xa , flags );
1627+ fence_drv = xa_load (xa , doorbell_offset );
1628+ if (fence_drv )
1629+ amdgpu_userq_fence_driver_process (fence_drv );
1630+ xa_unlock_irqrestore (xa , flags );
1631+ }
1632+
1633+ return 0 ;
1634+ }
1635+
16181636static int sdma_v6_0_process_illegal_inst_irq (struct amdgpu_device * adev ,
16191637 struct amdgpu_irq_src * source ,
16201638 struct amdgpu_iv_entry * entry )
@@ -1751,6 +1769,10 @@ static const struct amdgpu_irq_src_funcs sdma_v6_0_trap_irq_funcs = {
17511769 .process = sdma_v6_0_process_trap_irq ,
17521770};
17531771
1772+ static const struct amdgpu_irq_src_funcs sdma_v6_0_fence_irq_funcs = {
1773+ .process = sdma_v6_0_process_fence_irq ,
1774+ };
1775+
17541776static const struct amdgpu_irq_src_funcs sdma_v6_0_illegal_inst_irq_funcs = {
17551777 .process = sdma_v6_0_process_illegal_inst_irq ,
17561778};
@@ -1760,6 +1782,7 @@ static void sdma_v6_0_set_irq_funcs(struct amdgpu_device *adev)
17601782 adev -> sdma .trap_irq .num_types = AMDGPU_SDMA_IRQ_INSTANCE0 +
17611783 adev -> sdma .num_instances ;
17621784 adev -> sdma .trap_irq .funcs = & sdma_v6_0_trap_irq_funcs ;
1785+ adev -> sdma .fence_irq .funcs = & sdma_v6_0_fence_irq_funcs ;
17631786 adev -> sdma .illegal_inst_irq .funcs = & sdma_v6_0_illegal_inst_irq_funcs ;
17641787}
17651788
0 commit comments