diff options
Diffstat (limited to 'handle-efi-roms.patch')
-rw-r--r-- | handle-efi-roms.patch | 388 |
1 files changed, 0 insertions, 388 deletions
diff --git a/handle-efi-roms.patch b/handle-efi-roms.patch deleted file mode 100644 index bc080542b..000000000 --- a/handle-efi-roms.patch +++ /dev/null @@ -1,388 +0,0 @@ -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/boot/compressed/eboot.c ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/boot/compressed/eboot.c ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/boot/compressed/eboot.c 2012-08-22 15:26:32.485522068 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/boot/compressed/eboot.c 2012-08-22 15:25:40.529244868 -0400 -@@ -8,6 +8,7 @@ - * ----------------------------------------------------------------------- */ - - #include <linux/efi.h> -+#include <linux/pci.h> - #include <asm/efi.h> - #include <asm/setup.h> - #include <asm/desc.h> -@@ -243,6 +244,121 @@ - *size = len; - } - -+static efi_status_t setup_efi_pci(struct boot_params *params) -+{ -+ efi_pci_io_protocol *pci; -+ efi_status_t status; -+ void **pci_handle; -+ efi_guid_t pci_proto = EFI_PCI_IO_PROTOCOL_GUID; -+ unsigned long nr_pci, size = 0; -+ int i; -+ struct setup_data *data; -+ -+ data = (struct setup_data *)params->hdr.setup_data; -+ -+ while (data && data->next) -+ data = (struct setup_data *)data->next; -+ -+ status = efi_call_phys5(sys_table->boottime->locate_handle, -+ EFI_LOCATE_BY_PROTOCOL, &pci_proto, -+ NULL, &size, pci_handle); -+ -+ if (status == EFI_BUFFER_TOO_SMALL) { -+ status = efi_call_phys3(sys_table->boottime->allocate_pool, -+ EFI_LOADER_DATA, size, &pci_handle); -+ -+ if (status != EFI_SUCCESS) -+ return status; -+ -+ status = efi_call_phys5(sys_table->boottime->locate_handle, -+ EFI_LOCATE_BY_PROTOCOL, &pci_proto, -+ NULL, &size, pci_handle); -+ } -+ -+ if (status != EFI_SUCCESS) -+ goto free_handle; -+ -+ nr_pci = size / sizeof(void *); -+ for (i = 0; i < nr_pci; i++) { -+ void *h = pci_handle[i]; -+ uint64_t attributes; -+ struct pci_setup_rom *rom; -+ -+ status = efi_call_phys3(sys_table->boottime->handle_protocol, -+ h, &pci_proto, &pci); -+ -+ if (status != EFI_SUCCESS) -+ continue; -+ -+ if (!pci) -+ continue; -+ -+ status = efi_call_phys4(pci->attributes, pci, -+ EfiPciIoAttributeOperationGet, 0, -+ &attributes); -+ -+ if (status != EFI_SUCCESS) -+ continue; -+ -+ if (!attributes & EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM) -+ continue; -+ -+ if (!pci->romimage || !pci->romsize) -+ continue; -+ -+ size = pci->romsize + sizeof(*rom); -+ -+ status = efi_call_phys3(sys_table->boottime->allocate_pool, -+ EFI_LOADER_DATA, size, &rom); -+ -+ if (status != EFI_SUCCESS) -+ continue; -+ -+ rom->data.type = SETUP_PCI; -+ rom->data.len = size - sizeof(struct setup_data); -+ rom->data.next = NULL; -+ rom->pcilen = pci->romsize; -+ -+ status = efi_call_phys5(pci->pci.read, pci, -+ EfiPciIoWidthUint16, PCI_VENDOR_ID, -+ 1, &(rom->vendor)); -+ -+ if (status != EFI_SUCCESS) -+ goto free_struct; -+ -+ status = efi_call_phys5(pci->pci.read, pci, -+ EfiPciIoWidthUint16, PCI_DEVICE_ID, -+ 1, &(rom->devid)); -+ -+ if (status != EFI_SUCCESS) -+ goto free_struct; -+ -+ status = efi_call_phys5(pci->get_location, pci, -+ &(rom->segment), &(rom->bus), -+ &(rom->device), &(rom->function)); -+ -+ if (status != EFI_SUCCESS) -+ goto free_struct; -+ -+ memcpy(rom->romdata, pci->romimage, pci->romsize); -+ -+ if (data) -+ data->next = (uint64_t)rom; -+ else -+ params->hdr.setup_data = (uint64_t)rom; -+ -+ data = (struct setup_data *)rom; -+ -+ continue; -+ free_struct: -+ efi_call_phys1(sys_table->boottime->free_pool, rom); -+ } -+ -+free_handle: -+ efi_call_phys1(sys_table->boottime->free_pool, pci_handle); -+ return status; -+} -+ - /* - * See if we have Graphics Output Protocol - */ -@@ -1052,6 +1171,8 @@ - - setup_graphics(boot_params); - -+ setup_efi_pci(boot_params); -+ - status = efi_call_phys3(sys_table->boottime->allocate_pool, - EFI_LOADER_DATA, sizeof(*gdt), - (void **)&gdt); -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/bootparam.h ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/bootparam.h ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/bootparam.h 2012-08-22 15:26:32.485522068 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/bootparam.h 2012-08-22 15:25:40.530244882 -0400 -@@ -13,6 +13,7 @@ - #define SETUP_NONE 0 - #define SETUP_E820_EXT 1 - #define SETUP_DTB 2 -+#define SETUP_PCI 3 - - /* extensible setup data list node */ - struct setup_data { -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/pci.h ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/pci.h ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/pci.h 2012-07-21 16:58:29.000000000 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/include/asm/pci.h 2012-08-22 15:25:40.530244882 -0400 -@@ -171,4 +171,16 @@ - } - #endif - -+struct pci_setup_rom { -+ struct setup_data data; -+ uint16_t vendor; -+ uint16_t devid; -+ uint64_t pcilen; -+ unsigned long segment; -+ unsigned long bus; -+ unsigned long device; -+ unsigned long function; -+ uint8_t romdata[0]; -+}; -+ - #endif /* _ASM_X86_PCI_H */ -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/pci/common.c ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/pci/common.c ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/pci/common.c 2012-08-22 15:24:45.477951182 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/arch/x86/pci/common.c 2012-08-22 15:25:40.530244882 -0400 -@@ -17,6 +17,7 @@ - #include <asm/io.h> - #include <asm/smp.h> - #include <asm/pci_x86.h> -+#include <asm/setup.h> - - unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | - PCI_PROBE_MMCONF; -@@ -608,6 +609,38 @@ - return (pci_probe & PCI_ASSIGN_ALL_BUSSES) ? 1 : 0; - } - -+int pcibios_add_device(struct pci_dev *dev) -+{ -+ struct setup_data *data; -+ struct pci_setup_rom *rom; -+ u64 pa_data; -+ -+ if (boot_params.hdr.version < 0x0209) -+ return 0; -+ -+ pa_data = boot_params.hdr.setup_data; -+ while (pa_data) { -+ data = phys_to_virt(pa_data); -+ -+ if (data->type == SETUP_PCI) { -+ rom = (struct pci_setup_rom *)data; -+ -+ if ((pci_domain_nr(dev->bus) == rom->segment) && -+ (dev->bus->number == rom->bus) && -+ (PCI_SLOT(dev->devfn) == rom->device) && -+ (PCI_FUNC(dev->devfn) == rom->function) && -+ (dev->vendor == rom->vendor) && -+ (dev->device == rom->devid)) { -+ dev->rom = (void *)(pa_data + -+ offsetof(struct pci_setup_rom, romdata)); -+ dev->romlen = rom->pcilen; -+ } -+ } -+ pa_data = data->next; -+ } -+ return 0; -+} -+ - int pcibios_enable_device(struct pci_dev *dev, int mask) - { - int err; -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/bus.c ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/bus.c ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/bus.c 2012-08-22 15:24:47.425961575 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/bus.c 2012-08-22 15:26:20.147456241 -0400 -@@ -166,6 +166,11 @@ - int retval; - - pci_fixup_device(pci_fixup_final, dev); -+ -+ retval = pcibios_add_device(dev); -+ if (retval) -+ return retval; -+ - retval = device_add(&dev->dev); - if (retval) - return retval; -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/pci.c ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/pci.c ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/pci.c 2012-08-22 15:24:47.432961612 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/pci.c 2012-08-22 15:25:40.531244893 -0400 -@@ -1385,6 +1385,19 @@ - dr->pinned = 1; - } - -+/* -+ * pcibios_add_device - provide arch specific hooks when adding device dev -+ * @dev: the PCI device being added -+ * -+ * Permits the platform to provide architecture specific functionality when -+ * devices are added. This is the default implementation. Architecture -+ * implementations can override this. -+ */ -+int __attribute__ ((weak)) pcibios_add_device (struct pci_dev *dev) -+{ -+ return 0; -+} -+ - /** - * pcibios_disable_device - disable arch specific PCI resources for device dev - * @dev: the PCI device to disable -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/rom.c ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/rom.c ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/rom.c 2012-07-21 16:58:29.000000000 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/drivers/pci/rom.c 2012-08-22 15:25:40.531244893 -0400 -@@ -126,6 +126,12 @@ - /* primary video rom always starts here */ - start = (loff_t)0xC0000; - *size = 0x20000; /* cover C000:0 through E000:0 */ -+ /* -+ * Some devices may provide ROMs via a source other than the BAR -+ */ -+ } else if (pdev->rom && pdev->romlen) { -+ *size = pdev->romlen; -+ return phys_to_virt(pdev->rom); - } else { - if (res->flags & - (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) { -@@ -219,7 +225,8 @@ - if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) - return; - -- iounmap(rom); -+ if (!pdev->rom || !pdev->romlen) -+ iounmap(rom); - - /* Disable again before continuing, leave enabled if pci=rom */ - if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW))) -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/efi.h ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/efi.h ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/efi.h 2012-08-22 15:24:49.550972911 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/efi.h 2012-08-22 15:25:40.533244906 -0400 -@@ -196,6 +196,77 @@ - void *create_event_ex; - } efi_boot_services_t; - -+typedef enum { -+ EfiPciIoWidthUint8, -+ EfiPciIoWidthUint16, -+ EfiPciIoWidthUint32, -+ EfiPciIoWidthUint64, -+ EfiPciIoWidthFifoUint8, -+ EfiPciIoWidthFifoUint16, -+ EfiPciIoWidthFifoUint32, -+ EfiPciIoWidthFifoUint64, -+ EfiPciIoWidthFillUint8, -+ EfiPciIoWidthFillUint16, -+ EfiPciIoWidthFillUint32, -+ EfiPciIoWidthFillUint64, -+ EfiPciIoWidthMaximum -+} EFI_PCI_IO_PROTOCOL_WIDTH; -+ -+typedef enum { -+ EfiPciIoAttributeOperationGet, -+ EfiPciIoAttributeOperationSet, -+ EfiPciIoAttributeOperationEnable, -+ EfiPciIoAttributeOperationDisable, -+ EfiPciIoAttributeOperationSupported, -+ EfiPciIoAttributeOperationMaximum -+} EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION; -+ -+ -+typedef struct { -+ void *read; -+ void *write; -+} efi_pci_io_protocol_access_t; -+ -+typedef struct { -+ void *poll_mem; -+ void *poll_io; -+ efi_pci_io_protocol_access_t mem; -+ efi_pci_io_protocol_access_t io; -+ efi_pci_io_protocol_access_t pci; -+ void *copy_mem; -+ void *map; -+ void *unmap; -+ void *allocate_buffer; -+ void *free_buffer; -+ void *flush; -+ void *get_location; -+ void *attributes; -+ void *get_bar_attributes; -+ void *set_bar_attributes; -+ uint64_t romsize; -+ void *romimage; -+} efi_pci_io_protocol; -+ -+#define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001 -+#define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002 -+#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004 -+#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008 -+#define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010 -+#define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020 -+#define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040 -+#define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080 -+#define EFI_PCI_IO_ATTRIBUTE_IO 0x0100 -+#define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200 -+#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400 -+#define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800 -+#define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000 -+#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000 -+#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000 -+#define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 -+#define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000 -+#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 -+#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000 -+ - /* - * Types and defines for EFI ResetSystem - */ -diff -ur linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/pci.h ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/pci.h ---- linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/pci.h 2012-08-22 15:24:48.703968392 -0400 -+++ ../kernel-3.5.fc18.bak/linux-3.6.0-0.rc2.git2.1.fc18.x86_64/include/linux/pci.h 2012-08-22 15:25:40.534244910 -0400 -@@ -355,6 +355,8 @@ - }; - struct pci_ats *ats; /* Address Translation Service */ - #endif -+ void *rom; /* Physical pointer to ROM if it's not from the BAR */ -+ size_t romlen; /* Length of ROM if it's not from the BAR */ - }; - - static inline struct pci_dev *pci_physfn(struct pci_dev *dev) -@@ -1582,6 +1584,7 @@ - void pcibios_set_master(struct pci_dev *dev); - int pcibios_set_pcie_reset_state(struct pci_dev *dev, - enum pcie_reset_state state); -+int pcibios_add_device(struct pci_dev *dev); - - #ifdef CONFIG_PCI_MMCONFIG - extern void __init pci_mmcfg_early_init(void); |