From af4251f6ae64316f2d29c4592712fb9d6f924cd4 Mon Sep 17 00:00:00 2001 From: Matthew Poremba Date: Mon, 5 Sep 2022 10:11:03 -0700 Subject: [PATCH] dev-amdgpu: Rework SDMA RLC queue data structure There can only ever be two RLC queues maximum. Use this information for a simpler data structure to store doorbell information. The patch changes the std::unordered_map previously used to std::array. This will also be useful in avoiding erase-while-iterating issues needed to unregister all queues at once. Change-Id: I95600e40de51cb1a992a20bcebaf7580ea4d0be8 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/63172 Maintainer: Matt Sinclair Tested-by: kokoro Reviewed-by: Matt Sinclair --- src/dev/amdgpu/sdma_engine.cc | 26 +++++++++++--------------- src/dev/amdgpu/sdma_engine.hh | 2 +- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/dev/amdgpu/sdma_engine.cc b/src/dev/amdgpu/sdma_engine.cc index b925c854d2..27c93891bf 100644 --- a/src/dev/amdgpu/sdma_engine.cc +++ b/src/dev/amdgpu/sdma_engine.cc @@ -164,7 +164,7 @@ SDMAEngine::registerRLCQueue(Addr doorbell, Addr rb_base) // Get first free RLC if (!rlc0.valid()) { DPRINTF(SDMAEngine, "Doorbell %lx mapped to RLC0\n", doorbell); - rlcMap.insert(std::make_pair(doorbell, 0)); + rlcInfo[0] = doorbell; rlc0.valid(true); rlc0.base(rb_base); rlc0.rptr(0); @@ -174,7 +174,7 @@ SDMAEngine::registerRLCQueue(Addr doorbell, Addr rb_base) rlc0.size(1024*1024); } else if (!rlc1.valid()) { DPRINTF(SDMAEngine, "Doorbell %lx mapped to RLC1\n", doorbell); - rlcMap.insert(std::make_pair(doorbell, 1)); + rlcInfo[1] = doorbell; rlc1.valid(true); rlc1.base(rb_base); rlc1.rptr(1); @@ -190,16 +190,15 @@ SDMAEngine::registerRLCQueue(Addr doorbell, Addr rb_base) void SDMAEngine::unregisterRLCQueue(Addr doorbell) { - assert(rlcMap.find(doorbell) != rlcMap.end()); - - if (rlcMap[doorbell] == 0) { + DPRINTF(SDMAEngine, "Unregistering RLC queue at %#lx\n", doorbell); + if (rlcInfo[0] == doorbell) { rlc0.valid(false); - rlcMap.erase(doorbell); - } else if (rlcMap[doorbell] == 1) { + rlcInfo[0] = 0; + } else if (rlcInfo[1] == doorbell) { rlc1.valid(false); - rlcMap.erase(doorbell); + rlcInfo[1] = 0; } else { - panic("Cannot unregister unknown RLC queue: %d\n", rlcMap[doorbell]); + panic("Cannot unregister: no RLC queue at %#lx\n", doorbell); } } @@ -229,15 +228,12 @@ SDMAEngine::processPage(Addr wptrOffset) void SDMAEngine::processRLC(Addr doorbellOffset, Addr wptrOffset) { - assert(rlcMap.find(doorbellOffset) != rlcMap.end()); - - if (rlcMap[doorbellOffset] == 0) { + if (rlcInfo[0] == doorbellOffset) { processRLC0(wptrOffset); - } else if (rlcMap[doorbellOffset] == 1) { + } else if (rlcInfo[1] == doorbellOffset) { processRLC1(wptrOffset); } else { - panic("Cannot process unknown RLC queue: %d\n", - rlcMap[doorbellOffset]); + panic("Cannot process: no RLC queue at %#lx\n", doorbellOffset); } } diff --git a/src/dev/amdgpu/sdma_engine.hh b/src/dev/amdgpu/sdma_engine.hh index 157a5f5d09..064afb1c83 100644 --- a/src/dev/amdgpu/sdma_engine.hh +++ b/src/dev/amdgpu/sdma_engine.hh @@ -134,7 +134,7 @@ class SDMAEngine : public DmaVirtDevice VegaISA::Walker *walker; /* processRLC will select the correct queue for the doorbell */ - std::unordered_map rlcMap; + std::array rlcInfo{}; void processRLC0(Addr wptrOffset); void processRLC1(Addr wptrOffset);