this.fbinfo = new FBInfo(architecture);
final PCIHeaderType0 pciCfg = device.getConfig().asHeaderType0();
final PCIBaseAddress ioAddr = pciCfg.getBaseAddresses()[2];
final PCIBaseAddress fbAddr = pciCfg.getBaseAddresses()[0];
final PCIRomAddress romAddr = pciCfg.getRomAddress();
log.info("Found ATI " + model + ", chipset 0x" + NumberUtils.hex(pciCfg.getRevision()));
try {
final ResourceManager rm = InitialNaming.lookup(ResourceManager.NAME);
final int ioBase = (int) ioAddr.getMemoryBase();
final int ioSize = ioAddr.getSize();
final int fbBase = (int) fbAddr.getMemoryBase() /* & 0xFF800000 */;
// Map Memory Mapped IO
this.mmio =
rm.claimMemoryResource(device, Address.fromIntZeroExtend(ioBase), ioSize,
ResourceManager.MEMMODE_NORMAL);
this.vgaIO = new RadeonVgaIO(mmio);
final int memSize = readMemorySize();
log.info("Memory size " + NumberUtils.toBinaryByte(memSize));
this.accel = new RadeonAcceleration(vgaIO);
// Map Device RAM
this.deviceRam =
rm.claimMemoryResource(device, Address.fromIntZeroExtend(fbBase), memSize,
ResourceManager.MEMMODE_NORMAL);
vgaIO.setVideoRam(deviceRam);
// Find ROM
MemoryResource rom = null;
if (romAddr != null) {
romAddr.setEnabled(true);
if (romAddr.isEnabled()) {
rom =
rm.claimMemoryResource(device, Address.fromIntZeroExtend(romAddr
.getRomBase()), romAddr.getSize(),
ResourceManager.MEMMODE_NORMAL);
if (!verifyBiosSignature(rom)) {
log.info("Signature mismatch");
rom.release();
rom = null;