Commit 60a9bac8 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

PCI/VGA: Factor out vga_select_framebuffer_device()

On x86 and ia64, if a VGA device BARs include a framebuffer reported by
platform firmware, we select the device as the default VGA device.  Factor
this code to a separate function.  No functional change intended.

Link: https://lore.kernel.org/r/20220224224753.297579-4-helgaas@kernel.org


Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Cc: Bruno Prémont <bonbons@linux-vserver.org>
parent c1593ddd
Loading
Loading
Loading
Loading
+53 −46
Original line number Diff line number Diff line
@@ -565,6 +565,58 @@ void vga_put(struct pci_dev *pdev, unsigned int rsrc)
}
EXPORT_SYMBOL(vga_put);

static void __init vga_select_framebuffer_device(struct pci_dev *pdev)
{
#if defined(CONFIG_X86) || defined(CONFIG_IA64)
	struct device *dev = &pdev->dev;
	u64 base = screen_info.lfb_base;
	u64 size = screen_info.lfb_size;
	u64 limit;
	resource_size_t start, end;
	unsigned long flags;
	int i;

	/* Select the device owning the boot framebuffer if there is one */

	if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
		base |= (u64)screen_info.ext_lfb_base << 32;

	limit = base + size;

	/*
	 * Override vga_arbiter_add_pci_device()'s I/O based detection
	 * as it may take the wrong device (e.g. on Apple system under
	 * EFI).
	 *
	 * Select the device owning the boot framebuffer if there is
	 * one.
	 */

	/* Does firmware framebuffer belong to us? */
	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
		flags = pci_resource_flags(pdev, i);

		if ((flags & IORESOURCE_MEM) == 0)
			continue;

		start = pci_resource_start(pdev, i);
		end  = pci_resource_end(pdev, i);

		if (!start || !end)
			continue;

		if (base < start || limit >= end)
			continue;

		if (!vga_default_device())
			vgaarb_info(dev, "setting as boot device\n");
		else if (pdev != vga_default_device())
			vgaarb_info(dev, "overriding boot device\n");
		vga_set_default_device(pdev);
	}
#endif
}

static bool vga_arb_integrated_gpu(struct device *dev)
{
#if defined(CONFIG_ACPI)
@@ -1446,54 +1498,9 @@ static void __init vga_arb_select_default_device(void)
	struct pci_dev *pdev, *found = NULL;
	struct vga_device *vgadev;

#if defined(CONFIG_X86) || defined(CONFIG_IA64)
	u64 base = screen_info.lfb_base;
	u64 size = screen_info.lfb_size;
	u64 limit;
	resource_size_t start, end;
	unsigned long flags;
	int i;

	if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
		base |= (u64)screen_info.ext_lfb_base << 32;

	limit = base + size;

	list_for_each_entry(vgadev, &vga_list, list) {
		struct device *dev = &vgadev->pdev->dev;
		/*
		 * Override vga_arbiter_add_pci_device()'s I/O based detection
		 * as it may take the wrong device (e.g. on Apple system under
		 * EFI).
		 *
		 * Select the device owning the boot framebuffer if there is
		 * one.
		 */

		/* Does firmware framebuffer belong to us? */
		for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
			flags = pci_resource_flags(vgadev->pdev, i);

			if ((flags & IORESOURCE_MEM) == 0)
				continue;

			start = pci_resource_start(vgadev->pdev, i);
			end  = pci_resource_end(vgadev->pdev, i);

			if (!start || !end)
				continue;

			if (base < start || limit >= end)
				continue;

			if (!vga_default_device())
				vgaarb_info(dev, "setting as boot device\n");
			else if (vgadev->pdev != vga_default_device())
				vgaarb_info(dev, "overriding boot device\n");
			vga_set_default_device(vgadev->pdev);
		vga_select_framebuffer_device(vgadev->pdev);
	}
	}
#endif

	if (!vga_default_device()) {
		list_for_each_entry_reverse(vgadev, &vga_list, list) {