device: provide option to always load PCI option roms
Certain kernel drivers require the presence of option rom contents because the board's static configuration information is located within the blob. Therefore, allow a chipset/board to instruct the pci device handling code to always load but not necessarily run the option rom. BUG=chrome-os-partner:25885 BRANCH=baytrail TEST=Both enabling and not enabling this option shows expected behavior. Change-Id: Ib0f65ffaf1a861b543573a062c291f4ba491ffe0 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/188720 Reviewed-by: Duncan Laurie <dlaurie@chromium.org> Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/5594 Reviewed-by: Aaron Durbin <adurbin@google.com> Tested-by: build bot (Jenkins)
This commit is contained in:
parent
d540377390
commit
580e5642a8
|
@ -70,6 +70,18 @@ config S3_VGA_ROM_RUN
|
||||||
|
|
||||||
If unsure, say N when using SeaBIOS as payload, Y otherwise.
|
If unsure, say N when using SeaBIOS as payload, Y otherwise.
|
||||||
|
|
||||||
|
config ALWAYS_LOAD_OPROM
|
||||||
|
def_bool n
|
||||||
|
depends on VGA_ROM_RUN
|
||||||
|
help
|
||||||
|
Always load option roms if any are found. The decision to run
|
||||||
|
the rom is still determined at runtime, but the distinction
|
||||||
|
between loading and not running comes into play for CHROMEOS.
|
||||||
|
|
||||||
|
An example where this is required is that VBT (video bios tables)
|
||||||
|
are needed for the kernel's display driver to know how a piece of
|
||||||
|
hardware is configured to be used.
|
||||||
|
|
||||||
config ON_DEVICE_ROM_RUN
|
config ON_DEVICE_ROM_RUN
|
||||||
bool "Run Option ROMs on PCI devices"
|
bool "Run Option ROMs on PCI devices"
|
||||||
default n if PAYLOAD_SEABIOS
|
default n if PAYLOAD_SEABIOS
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
* Copyright 1997 -- 1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
|
* Copyright 1997 -- 1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <kconfig.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -663,6 +664,50 @@ void pci_dev_set_subsystem(struct device *dev, unsigned vendor, unsigned device)
|
||||||
int oprom_is_loaded = 0;
|
int oprom_is_loaded = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_VGA_ROM_RUN
|
||||||
|
static int should_run_oprom(struct device *dev)
|
||||||
|
{
|
||||||
|
static int should_run = -1;
|
||||||
|
|
||||||
|
if (should_run >= 0)
|
||||||
|
return should_run;
|
||||||
|
|
||||||
|
#if CONFIG_CHROMEOS
|
||||||
|
/* In ChromeOS we want to boot blazingly fast. Therefore
|
||||||
|
* we don't run (VGA) option ROMs, unless we have to print
|
||||||
|
* something on the screen before the kernel is loaded.
|
||||||
|
*/
|
||||||
|
if (!developer_mode_enabled() && !recovery_mode_enabled() &&
|
||||||
|
!vboot_wants_oprom()) {
|
||||||
|
printk(BIOS_DEBUG, "Not running VGA Option ROM\n");
|
||||||
|
should_run = 0;
|
||||||
|
return should_run;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
should_run = 1;
|
||||||
|
|
||||||
|
return should_run;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int should_load_oprom(struct device *dev)
|
||||||
|
{
|
||||||
|
#if CONFIG_HAVE_ACPI_RESUME && !CONFIG_S3_VGA_ROM_RUN
|
||||||
|
/* If S3_VGA_ROM_RUN is disabled, skip running VGA option
|
||||||
|
* ROMs when coming out of an S3 resume.
|
||||||
|
*/
|
||||||
|
if ((acpi_slp_type == 3) &&
|
||||||
|
((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
if (IS_ENABLED(CONFIG_ALWAYS_LOAD_OPROM))
|
||||||
|
return 1;
|
||||||
|
if (should_run_oprom(dev))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_VGA_ROM_RUN */
|
||||||
|
|
||||||
/** Default handler: only runs the relevant PCI BIOS. */
|
/** Default handler: only runs the relevant PCI BIOS. */
|
||||||
void pci_dev_init(struct device *dev)
|
void pci_dev_init(struct device *dev)
|
||||||
{
|
{
|
||||||
|
@ -673,26 +718,8 @@ void pci_dev_init(struct device *dev)
|
||||||
if (((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA))
|
if (((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if CONFIG_CHROMEOS
|
if (!should_load_oprom(dev))
|
||||||
/* In ChromeOS we want to boot blazingly fast. Therefore
|
|
||||||
* we don't run (VGA) option ROMs, unless we have to print
|
|
||||||
* something on the screen before the kernel is loaded.
|
|
||||||
*/
|
|
||||||
if (!developer_mode_enabled() && !recovery_mode_enabled() &&
|
|
||||||
!vboot_wants_oprom()) {
|
|
||||||
printk(BIOS_DEBUG, "Not loading VGA Option ROM\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_HAVE_ACPI_RESUME && !CONFIG_S3_VGA_ROM_RUN
|
|
||||||
/* If S3_VGA_ROM_RUN is disabled, skip running VGA option
|
|
||||||
* ROMs when coming out of an S3 resume.
|
|
||||||
*/
|
|
||||||
if ((acpi_slp_type == 3) &&
|
|
||||||
((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA))
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
rom = pci_rom_probe(dev);
|
rom = pci_rom_probe(dev);
|
||||||
if (rom == NULL)
|
if (rom == NULL)
|
||||||
|
@ -702,6 +729,9 @@ void pci_dev_init(struct device *dev)
|
||||||
if (ram == NULL)
|
if (ram == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!should_run_oprom(dev))
|
||||||
|
return;
|
||||||
|
|
||||||
run_bios(dev, (unsigned long)ram);
|
run_bios(dev, (unsigned long)ram);
|
||||||
#if CONFIG_CHROMEOS
|
#if CONFIG_CHROMEOS
|
||||||
oprom_is_loaded = 1;
|
oprom_is_loaded = 1;
|
||||||
|
|
Loading…
Reference in New Issue