Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84c1b80e authored by Matthew Garrett's avatar Matthew Garrett Committed by Bjorn Helgaas
Browse files

PCI: Add support for non-BAR ROMs



Platforms may provide their own mechanisms for obtaining ROMs. Add support
for using data provided by the platform in that case.

Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Tested-by: default avatarSeth Forshee <seth.forshee@canonical.com>
parent eca0d467
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -117,12 +117,18 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)
	loff_t start;
	void __iomem *rom;

	/*
	 * Some devices may provide ROMs via a source other than the BAR
	 */
	if (pdev->rom && pdev->romlen) {
		*size = pdev->romlen;
		return phys_to_virt((phys_addr_t)pdev->rom);
	/*
	 * IORESOURCE_ROM_SHADOW set on x86, x86_64 and IA64 supports legacy
	 * memory map if the VGA enable bit of the Bridge Control register is
	 * set for embedded VGA.
	 */
	if (res->flags & IORESOURCE_ROM_SHADOW) {
	} else if (res->flags & IORESOURCE_ROM_SHADOW) {
		/* primary video rom always starts here */
		start = (loff_t)0xC0000;
		*size = 0x20000; /* cover C000:0 through E000:0 */
@@ -181,6 +187,7 @@ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom)
	if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY))
		return;

	if (!pdev->rom || !pdev->romlen)
		iounmap(rom);

	/* Disable again before continuing, leave enabled if pci=rom */
+2 −0
Original line number Diff line number Diff line
@@ -333,6 +333,8 @@ struct pci_dev {
	};
	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)