GeodeLX freeze with General Software BIOS saga continues
Bart Trojanowski
bart at jukie.net
Fri Jan 11 14:48:04 PST 2008
* Bart Trojanowski <bart at jukie.net> [080111 15:39]:
> The real value of BAR 1 is 0xf000, which is the value that we get in
> ddcprobe (see previous email) when it calls the io ports directly.
>
> The emulator returns 0xE1000000, which is not validated by the BIOS as a
> being too high to be an IO port and it messes up the BIOS.
>
> I don't have any more answers yet.
The emulator uses this code to emulate PCI port access:
static int
pciCfg1in(CARD16 addr, CARD32 *val)
{
if (addr == 0xCF8) {
*val = PciCfg1Addr;
return 1;
}
if (addr == 0xCFC) {
*val = pciReadLong(Int10Current->Tag, OFFSET(PciCfg1Addr));
return 1;
}
return 0;
}
In this case pciReadLong() takes a 'tag' which is the bus:dev:fn and a
configuration space offset for that device.
However, we pass in Int10Current->Tag which contains the bus:dev:fn of
the graphics card. The 0xE1000000 seen before is actually the BAR 1
value of the video device. The BIOS was asking about the bridge device.
The fix for this is be to replace the Int10Current->Tag with
(PciCfg1Addr & 0x00FFFF00), which gets the "tag" from the argument sent
to the 0xCFC register.
Patch is in the works.
-Bart
--
WebSig: http://www.jukie.net/~bart/sig/
More information about the xorg
mailing list