From c597361a6b9bb886d161e48b6f1605cc3903556e Mon Sep 17 00:00:00 2001 From: Matthew Poremba Date: Fri, 21 Apr 2023 13:57:51 -0500 Subject: [PATCH] dev-amdgpu: Add writeROM method For non-KVM CPUs the VBIOS memory falls into an I/O hole and therefore gets routed to the PIO bus in gem5. This gets routed to the GPU in the case of a ROM write. We write to the ROM as a way to "load" the VBIOS without creating holes in the KVM VM. This write method allows the same scripts as KVM to be used by writing to the ROM area and overwriting what might already be there from the --gpu-rom option. Change-Id: I8c2d2aa05a823569a774dfdd3bf2d2e773f38683 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70037 Reviewed-by: Matt Sinclair Tested-by: kokoro Maintainer: Matt Sinclair --- src/dev/amdgpu/amdgpu_device.cc | 22 ++++++++++++++++++++++ src/dev/amdgpu/amdgpu_device.hh | 1 + 2 files changed, 23 insertions(+) diff --git a/src/dev/amdgpu/amdgpu_device.cc b/src/dev/amdgpu/amdgpu_device.cc index cb180b6dc5..3605882b74 100644 --- a/src/dev/amdgpu/amdgpu_device.cc +++ b/src/dev/amdgpu/amdgpu_device.cc @@ -107,6 +107,20 @@ AMDGPUDevice::readROM(PacketPtr pkt) pkt->getAddr(), rom_offset, rom_data); } +void +AMDGPUDevice::writeROM(PacketPtr pkt) +{ + assert(isROM(pkt->getAddr())); + + Addr rom_offset = pkt->getAddr() - romRange.start(); + uint64_t rom_data = pkt->getUintX(ByteOrder::little); + + memcpy(rom.data() + rom_offset, &rom_data, pkt->getSize()); + + DPRINTF(AMDGPUDevice, "Write to addr %#x on ROM offset %#x data: %#x\n", + pkt->getAddr(), rom_offset, rom_data); +} + AddrRangeList AMDGPUDevice::getAddrRanges() const { @@ -386,6 +400,14 @@ AMDGPUDevice::read(PacketPtr pkt) Tick AMDGPUDevice::write(PacketPtr pkt) { + if (isROM(pkt->getAddr())) { + writeROM(pkt); + + dispatchAccess(pkt, false); + + return pioDelay; + } + int barnum = -1; Addr offset = 0; getBAR(pkt->getAddr(), barnum, offset); diff --git a/src/dev/amdgpu/amdgpu_device.hh b/src/dev/amdgpu/amdgpu_device.hh index ac31b95fd2..b64067a158 100644 --- a/src/dev/amdgpu/amdgpu_device.hh +++ b/src/dev/amdgpu/amdgpu_device.hh @@ -94,6 +94,7 @@ class AMDGPUDevice : public PciDevice AddrRange romRange; bool isROM(Addr addr) const { return romRange.contains(addr); } void readROM(PacketPtr pkt); + void writeROM(PacketPtr pkt); std::array rom;