From 3adefc2dd944d013f3997ee664087c7ee10020c0 Mon Sep 17 00:00:00 2001 From: Matthew Poremba Date: Fri, 28 May 2021 18:58:11 -0500 Subject: [PATCH] dev-amdgpu: Handle framebuffer counter accesses There are special counters in the framebuffer that are tested during driver initialization. The expected behavior of the counters is to return the previously read value + 1. There is one (known) counter used in driver initialization at a fixed BAR address offset. Change-Id: Id2dbb5fa9365b0a0453b15013c45aa67a2eec190 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/46163 Tested-by: kokoro Reviewed-by: Jason Lowe-Power Reviewed-by: Matt Sinclair Maintainer: Matt Sinclair --- src/dev/amdgpu/amdgpu_device.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/dev/amdgpu/amdgpu_device.cc b/src/dev/amdgpu/amdgpu_device.cc index 08e6987fdc..23d22bb2d4 100644 --- a/src/dev/amdgpu/amdgpu_device.cc +++ b/src/dev/amdgpu/amdgpu_device.cc @@ -148,7 +148,20 @@ void AMDGPUDevice::readFrame(PacketPtr pkt, Addr offset) { DPRINTF(AMDGPUDevice, "Read framebuffer address %#lx\n", offset); + mmioReader.readFromTrace(pkt, FRAMEBUFFER_BAR, offset); + + /* Handle special counter addresses in framebuffer. */ + if (offset == 0xa28000) { + /* Counter addresses expect the read to return previous value + 1. */ + if (regs.find(pkt->getAddr()) == regs.end()) { + regs[pkt->getAddr()] = 1; + } else { + regs[pkt->getAddr()]++; + } + + pkt->setUintX(regs[pkt->getAddr()], ByteOrder::little); + } } void