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.