From c045c6854007dc6784105a3dcbd990e4d7b7d36d Mon Sep 17 00:00:00 2001 From: Matthew Poremba Date: Tue, 13 Feb 2024 16:39:50 -0600 Subject: [PATCH] dev-amdgpu: Add node_id to interrupt handler The ROCm 6.0 driver adds a node_id field to interrupts which must match before passing on the interrupt to be cleared by the cookie from gem5's interrupt handler implementation. Add this field and enable for gfx942. The usage of the field can be seen in event_interrupt_isr_v9_4_3 at https://github.com/ROCm/ROCK-Kernel-Driver/blob/roc-6.0.x/drivers/ gpu/drm/amd/amdkfd/kfd_int_process_v9.c#L449 Change-Id: Iae8b8f0386a5ad2852b4a3c69f2c161d965c4922 --- src/dev/amdgpu/interrupt_handler.cc | 4 +++- src/dev/amdgpu/interrupt_handler.hh | 5 +++-- src/dev/amdgpu/pm4_packet_processor.cc | 3 ++- src/dev/amdgpu/sdma_engine.cc | 10 +++++++--- src/dev/amdgpu/sdma_engine.hh | 2 +- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/dev/amdgpu/interrupt_handler.cc b/src/dev/amdgpu/interrupt_handler.cc index 6f277a1618..cb99ba7a39 100644 --- a/src/dev/amdgpu/interrupt_handler.cc +++ b/src/dev/amdgpu/interrupt_handler.cc @@ -75,7 +75,8 @@ void AMDGPUInterruptHandler::prepareInterruptCookie(ContextID cntxt_id, uint32_t ring_id, uint32_t client_id, - uint32_t source_id) + uint32_t source_id, + unsigned node_id) { assert(client_id == SOC15_IH_CLIENTID_RLC || client_id == SOC15_IH_CLIENTID_SDMA0 || @@ -112,6 +113,7 @@ AMDGPUInterruptHandler::prepareInterruptCookie(ContextID cntxt_id, cookie->clientId = client_id; cookie->sourceId = source_id; cookie->ringId = ring_id; + cookie->nodeId = node_id; cookie->source_data_dw1 = cntxt_id; interruptQueue.push(cookie); } diff --git a/src/dev/amdgpu/interrupt_handler.hh b/src/dev/amdgpu/interrupt_handler.hh index 9b80e081cc..a895eabafc 100644 --- a/src/dev/amdgpu/interrupt_handler.hh +++ b/src/dev/amdgpu/interrupt_handler.hh @@ -101,7 +101,8 @@ typedef struct uint32_t reserved2 : 15; uint32_t timestamp_src : 1; uint32_t pasid : 16; - uint32_t reserved3 : 15; + uint32_t nodeId : 8; + uint32_t reserved3 : 7; uint32_t pasid_src : 1; uint32_t source_data_dw1; uint32_t source_data_dw2; @@ -171,7 +172,7 @@ class AMDGPUInterruptHandler : public DmaDevice void setGPUDevice(AMDGPUDevice *gpu_device) { gpuDevice = gpu_device; } void prepareInterruptCookie(ContextID cntxtId, uint32_t ring_id, - uint32_t client_id, uint32_t source_id); + uint32_t client_id, uint32_t source_id, unsigned node_id); void submitInterruptCookie(); void submitWritePointer(); void intrPost(); diff --git a/src/dev/amdgpu/pm4_packet_processor.cc b/src/dev/amdgpu/pm4_packet_processor.cc index 5f270a0c70..b7952f0698 100644 --- a/src/dev/amdgpu/pm4_packet_processor.cc +++ b/src/dev/amdgpu/pm4_packet_processor.cc @@ -537,7 +537,8 @@ PM4PacketProcessor::releaseMemDone(PM4Queue *q, PM4ReleaseMem *pkt, Addr addr) ringId = (q->queue() << 4) | (q->me() << 2) | q->pipe(); } gpuDevice->getIH()->prepareInterruptCookie(pkt->intCtxId, ringId, - SOC15_IH_CLIENTID_GRBM_CP, CP_EOP); + SOC15_IH_CLIENTID_GRBM_CP, CP_EOP, + 2 * getIpId()); gpuDevice->getIH()->submitInterruptCookie(); } diff --git a/src/dev/amdgpu/sdma_engine.cc b/src/dev/amdgpu/sdma_engine.cc index 4015e83eaf..34ad027234 100644 --- a/src/dev/amdgpu/sdma_engine.cc +++ b/src/dev/amdgpu/sdma_engine.cc @@ -81,9 +81,9 @@ SDMAEngine::setGPUDevice(AMDGPUDevice *gpu_device) } int -SDMAEngine::getIHClientId() +SDMAEngine::getIHClientId(int _id) { - switch (id) { + switch (_id) { case 0: return SOC15_IH_CLIENTID_SDMA0; case 1: @@ -809,8 +809,12 @@ SDMAEngine::trap(SDMAQueue *q, sdmaTrap *pkt) uint32_t ring_id = (q->queueType() == SDMAPage) ? 3 : 0; + int node_id = 0; + int local_id = getId(); + gpuDevice->getIH()->prepareInterruptCookie(pkt->intrContext, ring_id, - getIHClientId(), TRAP_ID); + getIHClientId(local_id), + TRAP_ID, 2*node_id); gpuDevice->getIH()->submitInterruptCookie(); delete pkt; diff --git a/src/dev/amdgpu/sdma_engine.hh b/src/dev/amdgpu/sdma_engine.hh index d8ab31bbde..9407b97d73 100644 --- a/src/dev/amdgpu/sdma_engine.hh +++ b/src/dev/amdgpu/sdma_engine.hh @@ -172,7 +172,7 @@ class SDMAEngine : public DmaVirtDevice /** * Returns the client id for the Interrupt Handler. */ - int getIHClientId(); + int getIHClientId(int _id); /** * Methods for translation.