44
44
#include "sdma_v6_0.h"
45
45
#include "v11_structs.h"
46
46
#include "mes_userqueue.h"
47
+ #include "amdgpu_userq_fence.h"
47
48
48
49
MODULE_FIRMWARE ("amdgpu/sdma_6_0_0.bin" );
49
50
MODULE_FIRMWARE ("amdgpu/sdma_6_0_1.bin" );
@@ -893,6 +894,9 @@ static int sdma_v6_0_mqd_init(struct amdgpu_device *adev, void *mqd,
893
894
m -> sdmax_rlcx_csa_addr_lo = lower_32_bits (prop -> csa_addr );
894
895
m -> sdmax_rlcx_csa_addr_hi = upper_32_bits (prop -> csa_addr );
895
896
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
+
896
900
return 0 ;
897
901
}
898
902
@@ -1315,6 +1319,13 @@ static int sdma_v6_0_sw_init(struct amdgpu_ip_block *ip_block)
1315
1319
if (r )
1316
1320
return r ;
1317
1321
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
+
1318
1329
for (i = 0 ; i < adev -> sdma .num_instances ; i ++ ) {
1319
1330
ring = & adev -> sdma .instance [i ].ring ;
1320
1331
ring -> ring_obj = NULL ;
@@ -1575,25 +1586,9 @@ static int sdma_v6_0_process_trap_irq(struct amdgpu_device *adev,
1575
1586
struct amdgpu_iv_entry * entry )
1576
1587
{
1577
1588
int instances , queue ;
1578
- uint32_t mes_queue_id = entry -> src_data [0 ];
1579
1589
1580
1590
DRM_DEBUG ("IH: SDMA trap\n" );
1581
1591
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
-
1597
1592
queue = entry -> ring_id & 0xf ;
1598
1593
instances = (entry -> ring_id & 0xf0 ) >> 4 ;
1599
1594
if (instances > 1 ) {
@@ -1615,6 +1610,29 @@ static int sdma_v6_0_process_trap_irq(struct amdgpu_device *adev,
1615
1610
return 0 ;
1616
1611
}
1617
1612
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
+
1618
1636
static int sdma_v6_0_process_illegal_inst_irq (struct amdgpu_device * adev ,
1619
1637
struct amdgpu_irq_src * source ,
1620
1638
struct amdgpu_iv_entry * entry )
@@ -1751,6 +1769,10 @@ static const struct amdgpu_irq_src_funcs sdma_v6_0_trap_irq_funcs = {
1751
1769
.process = sdma_v6_0_process_trap_irq ,
1752
1770
};
1753
1771
1772
+ static const struct amdgpu_irq_src_funcs sdma_v6_0_fence_irq_funcs = {
1773
+ .process = sdma_v6_0_process_fence_irq ,
1774
+ };
1775
+
1754
1776
static const struct amdgpu_irq_src_funcs sdma_v6_0_illegal_inst_irq_funcs = {
1755
1777
.process = sdma_v6_0_process_illegal_inst_irq ,
1756
1778
};
@@ -1760,6 +1782,7 @@ static void sdma_v6_0_set_irq_funcs(struct amdgpu_device *adev)
1760
1782
adev -> sdma .trap_irq .num_types = AMDGPU_SDMA_IRQ_INSTANCE0 +
1761
1783
adev -> sdma .num_instances ;
1762
1784
adev -> sdma .trap_irq .funcs = & sdma_v6_0_trap_irq_funcs ;
1785
+ adev -> sdma .fence_irq .funcs = & sdma_v6_0_fence_irq_funcs ;
1763
1786
adev -> sdma .illegal_inst_irq .funcs = & sdma_v6_0_illegal_inst_irq_funcs ;
1764
1787
}
1765
1788
0 commit comments