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