VGA is "special".
This code:
src/devices/device.c:static void allocate_vga_resource(void)
is great.
This loop:
while(bus) {
bus->bridge_ctrl |= PCI_BRIDGE_CTL_VGA;
bus = (bus == bus->dev->bus)? 0 : bus->dev->bus;
}
is close, but as noted it is somewhat pci-centric. It works darned well
though: it sets up most bridges just fine.
But VGA is just so darned "SPECIAL".
I am thinking of adding a new device_operation just for good old vga.
void (*endable_vga)(dev, vga_dev)
The loop changes to this:
while(bus) {
if (bus->dev->ops && bus->dev->ops->enable_vga)
bus->dev->ops->enable_vga(bus->dev, vga);
else
bus->bridge_ctrl |= PCI_BRIDGE_CTL_VGA;
bus = (bus == bus->dev->bus)? 0 : bus->dev->bus;
}
I think this is all we need. Most of the devices would have this empty,
but the amdk8 would have an entry so it could:
- set the VGA_EN bit in the correct PCI I/O register
- set up an MMIO pair for the a0000-affff range
I realize this is a special case, but all of vga is a special case, and
VGA is *very* *important* to the embedded space. Our goal is to have a VGA
filo or etherboot prompt.
comments? Absent serious objections I want to put this in today.
ron