diff --git a/src/devices/Config.lb b/src/devices/Config.lb index da621e7962..8de8d4af32 100644 --- a/src/devices/Config.lb +++ b/src/devices/Config.lb @@ -1,3 +1,4 @@ +uses CONFIG_PCI_ROM_RUN object device.o object root_device.o object device_util.o @@ -7,5 +8,7 @@ object hypertransport.o object pci_ops.o object smbus_ops.o -object pci_rom.o -dir emulator +if CONFIG_PCI_ROM_RUN + object pci_rom.o + dir emulator +end diff --git a/src/devices/device.c b/src/devices/device.c index 8279a652b1..40d3f5cf2d 100644 --- a/src/devices/device.c +++ b/src/devices/device.c @@ -364,6 +364,7 @@ void compute_allocate_resource( } +#if CONFIG_CONSOLE_VGA == 1 static void allocate_vga_resource(void) { #warning "FIXME modify allocate_vga_resource so it is less pci centric!" @@ -401,7 +402,7 @@ static void allocate_vga_resource(void) bus = (bus == bus->dev->bus)? 0 : bus->dev->bus; } } - +#endif /** * @brief Assign the computed resources to the devices on the bus. @@ -556,8 +557,10 @@ void dev_configure(void) mem->flags |= IORESOURCE_ASSIGNED; mem->flags &= ~IORESOURCE_STORED; +#if CONFIG_CONSOLE_VGA == 1 /* Allocate the VGA I/O resource.. */ allocate_vga_resource(); +#endif /* Store the computed resource allocations into device registers ... */ printk_info("Setting resources...\n"); diff --git a/src/devices/pci_device.c b/src/devices/pci_device.c index 8bd6ec846e..4aef2229b3 100644 --- a/src/devices/pci_device.c +++ b/src/devices/pci_device.c @@ -551,10 +551,12 @@ void pci_bus_enable_resources(struct device *dev) { uint16_t ctrl; +#if CONFIG_CONSOLE_VGA == 1 /* enable IO in command register if there is VGA card * connected with (even it does not claim IO resource) */ if (dev->link[0].bridge_ctrl & PCI_BRIDGE_CTL_VGA) dev->command |= PCI_COMMAND_IO; +#endif ctrl = pci_read_config16(dev, PCI_BRIDGE_CONTROL); ctrl |= dev->link[0].bridge_ctrl; @@ -573,6 +575,7 @@ void pci_dev_set_subsystem(device_t dev, unsigned vendor, unsigned device) ((device & 0xffff) << 16) | (vendor & 0xffff)); } +#if CONFIG_PCI_ROM_RUN == 1 void pci_dev_init(struct device *dev) { struct rom_header *rom, *ram; @@ -581,9 +584,12 @@ void pci_dev_init(struct device *dev) if (rom == NULL) return; ram = pci_rom_load(dev, rom); + if (ram == NULL) + return; run_bios(dev, ram); } +#endif /** Default device operation for PCI devices */ static struct pci_operations pci_dev_ops_pci = { @@ -594,7 +600,11 @@ struct device_operations default_pci_ops_dev = { .read_resources = pci_dev_read_resources, .set_resources = pci_dev_set_resources, .enable_resources = pci_dev_enable_resources, +#if CONFIG_PCI_ROM_RUN == 1 .init = pci_dev_init, +#else + .init = 0, +#endif .scan_bus = 0, .enable = 0, .ops_pci = &pci_dev_ops_pci, diff --git a/src/devices/pci_rom.c b/src/devices/pci_rom.c index 614fbd55b9..310c00f00c 100644 --- a/src/devices/pci_rom.c +++ b/src/devices/pci_rom.c @@ -11,11 +11,12 @@ struct rom_header * pci_rom_probe(struct device *dev) struct pci_data *rom_data; rom_address = pci_read_config32(dev, PCI_ROM_ADDRESS); + if (rom_address == 0x00000000 || rom_address == 0xffffffff) { return NULL; } - printk_spew("%s, rom address for %s = %x\n", + printk_debug("%s, rom address for %s = %x\n", __func__, dev_path(dev), rom_address); /* enable expansion ROM address decoding */ @@ -53,6 +54,11 @@ struct rom_header * pci_rom_probe(struct device *dev) } static void *pci_ram_image_start = PCI_RAM_IMAGE_START; + +#if CONFIG_CONSOLE_VGA == 1 +int vga_inited = 0; // it will be used by vga_console +#endif + struct rom_header *pci_rom_load(struct device *dev, struct rom_header *rom_header) { struct pci_data * rom_data; @@ -64,10 +70,14 @@ struct rom_header *pci_rom_load(struct device *dev, struct rom_header *rom_heade rom_size = rom_header->size*512; if (PCI_CLASS_DISPLAY_VGA == (rom_data->class_hi << 16 | rom_data->class_lo)) { +#if CONFIG_CONSOLE_VGA == 1 + if(vga_inited) return NULL; // only one VGA supported printk_spew("%s, copying VGA ROM Image from %x to %x, %x bytes\n", __func__, rom_header, PCI_VGA_RAM_IMAGE_START, rom_size); memcpy(PCI_VGA_RAM_IMAGE_START, rom_header, rom_size); + vga_inited = 1; return (struct rom_header *) (PCI_VGA_RAM_IMAGE_START); +#endif } else { printk_spew("%s, copying non-VGA ROM Image from %x to %x, %x bytes\n", __func__, rom_header, pci_ram_image_start, rom_size); @@ -77,4 +87,6 @@ struct rom_header *pci_rom_load(struct device *dev, struct rom_header *rom_heade } /* disable expansion ROM address decoding */ pci_write_config32(dev, PCI_ROM_ADDRESS, rom_address & ~PCI_ROM_ADDRESS_ENABLE); + + return NULL; } diff --git a/src/mainboard/tyan/s2850/Options.lb b/src/mainboard/tyan/s2850/Options.lb index d161e165c1..b9f488f194 100644 --- a/src/mainboard/tyan/s2850/Options.lb +++ b/src/mainboard/tyan/s2850/Options.lb @@ -51,6 +51,8 @@ uses CC uses HOSTCC uses OBJCOPY uses CONFIG_CHIP_NAME +uses CONFIG_CONSOLE_VGA +uses CONFIG_PCI_ROM_RUN ### ### Build options @@ -115,7 +117,11 @@ default CONFIG_SMP=1 default CONFIG_MAX_CPUS=1 #BTEXT CONSOLE -default CONFIG_CONSOLE_BTEXT=1 +#default CONFIG_CONSOLE_BTEXT=1 + +#VGA +default CONFIG_CONSOLE_VGA=1 +default CONFIG_PCI_ROM_RUN=1 ## ## Build code to setup a generic IOAPIC