00c0cd2c45
Write _ROM method and store PCI Option ROM in CBMEM. Allows an EFI compatible OS to retrieve the Option ROM without the need to access the PCI BAR. As the Option ROM is no longer present in the legacy VGA area it's required for mobile platforms. On hybrid devices, like Lenovo Thinkpads supporting NVIDIA Optimus it's the only way to retrieve the Option ROM, even with legacy BIOS, as there's no PCI BAR to map. Tested on: * Lenovo T530 * Linux Kernel 4.13.7 * nouveau Change-Id: I548b730fb64833083cc05af5b21dd6959804224b Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-on: https://review.coreboot.org/20548 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
50 lines
1 KiB
C
50 lines
1 KiB
C
#ifndef PCI_ROM_H
|
|
#define PCI_ROM_H
|
|
#include <endian.h>
|
|
#include <stddef.h>
|
|
#include <arch/acpi.h>
|
|
|
|
#define PCI_ROM_HDR 0xAA55
|
|
#define PCI_DATA_HDR ((uint32_t) (('R' << 24) | ('I' << 16) | ('C' << 8) | 'P'))
|
|
|
|
#define PCI_RAM_IMAGE_START 0xD0000
|
|
#define PCI_VGA_RAM_IMAGE_START 0xC0000
|
|
|
|
struct rom_header {
|
|
uint16_t signature;
|
|
uint8_t size;
|
|
uint8_t init[3];
|
|
uint8_t reserved[0x12];
|
|
uint16_t data;
|
|
};
|
|
|
|
struct pci_data {
|
|
uint32_t signature;
|
|
uint16_t vendor;
|
|
uint16_t device;
|
|
uint16_t reserved_1;
|
|
uint16_t dlen;
|
|
uint8_t drevision;
|
|
uint8_t class_lo;
|
|
uint16_t class_hi;
|
|
uint16_t ilen;
|
|
uint16_t irevision;
|
|
uint8_t type;
|
|
uint8_t indicator;
|
|
uint16_t reserved_2;
|
|
};
|
|
|
|
struct rom_header *pci_rom_probe(struct device *dev);
|
|
struct rom_header *pci_rom_load(struct device *dev,
|
|
struct rom_header *rom_header);
|
|
|
|
unsigned long
|
|
pci_rom_write_acpi_tables(struct device *device,
|
|
unsigned long current,
|
|
struct acpi_rsdp *rsdp);
|
|
|
|
void pci_rom_ssdt(struct device *device);
|
|
|
|
u32 map_oprom_vendev(u32 vendev);
|
|
|
|
#endif
|