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;