Skip to content

Commit 5ae9de5

Browse files
arunpravin24alexdeucher
authored andcommitted
drm/amdgpu: Add userq fence support to SDMAv6.0
Add userq fence support to SDMAv6.0 Signed-off-by: Arunpravin Paneer Selvam <[email protected]> Acked-by: Christian König <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 1091fba commit 5ae9de5

File tree

3 files changed

+41
-16
lines changed

3 files changed

+41
-16
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ struct amdgpu_sdma {
113113
struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
114114
struct amdgpu_irq_src trap_irq;
115115
struct amdgpu_irq_src illegal_inst_irq;
116+
struct amdgpu_irq_src fence_irq;
116117
struct amdgpu_irq_src ecc_irq;
117118
struct amdgpu_irq_src vm_hole_irq;
118119
struct amdgpu_irq_src doorbell_invalid_irq;

drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "sdma_v6_0.h"
4545
#include "v11_structs.h"
4646
#include "mes_userqueue.h"
47+
#include "amdgpu_userq_fence.h"
4748

4849
MODULE_FIRMWARE("amdgpu/sdma_6_0_0.bin");
4950
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,
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+
16181636
static 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+
17541776
static 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

drivers/gpu/drm/amd/include/ivsrcid/gfx/irqsrcs_gfx_11_0_0.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#define GFX_11_0_0__SRCID__SDMA_SRAM_ECC 64 // 0x40 SRAM ECC Error
4949
#define GFX_11_0_0__SRCID__SDMA_SEM_INCOMPLETE_TIMEOUT 65 // 0x41 GPF(Sem incomplete timeout)
5050
#define GFX_11_0_0__SRCID__SDMA_SEM_WAIT_FAIL_TIMEOUT 66 // 0x42 Semaphore wait fail timeout
51+
#define GFX_11_0_0__SRCID__SDMA_FENCE 67 // 0x43 User fence
5152

5253
#define GFX_11_0_0__SRCID__RLC_GC_FED_INTERRUPT 128 // 0x80 FED Interrupt (for data poisoning)
5354

0 commit comments

Comments
 (0)