All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection
@ 2021-09-16  8:29 Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 01/12] PCI/VGA: Prefer vga_default_device() Huacai Chen
                   ` (11 more replies)
  0 siblings, 12 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

My original work is at [1].

Current default VGA device selection fails in some cases:

  - On BMC system, the AST2500 bridge [1a03:1150] does not implement
    PCI_BRIDGE_CTL_VGA [1].  This is perfectly legal but means the
    legacy VGA resources won't reach downstream devices unless they're
    included in the usual bridge windows.

  - vga_arb_select_default_device() will set a device below such a
    bridge as the default VGA device as long as it has PCI_COMMAND_IO
    and PCI_COMMAND_MEMORY enabled.

  - vga_arbiter_add_pci_device() is called for every VGA device,
    either at boot-time or at hot-add time, and it will also set the
    device as the default VGA device, but ONLY if all bridges leading
    to it implement PCI_BRIDGE_CTL_VGA.

  - This difference between vga_arb_select_default_device() and
    vga_arbiter_add_pci_device() means that a device below an AST2500
    or similar bridge can only be set as the default if it is
    enumerated before vga_arb_device_init().

  - On ACPI-based systems, PCI devices are enumerated by acpi_init(),
    which runs before vga_arb_device_init().

  - On non-ACPI systems, like on MIPS system, they are enumerated by
    pcibios_init(), which typically runs *after*
    vga_arb_device_init().

So I made vga_arb_update_default_device() to replace the current vga_
arb_select_default_device(), which will be call from vga_arbiter_add_
pci_device(), set the default device even if it does not own the VGA
resources because an upstream bridge doesn't implement PCI_BRIDGE_CTL_
VGA. And the default VGA device is updated if a better one is found
(device with legacy resources enabled is better, device owns the
firmware framebuffer is even better).

Bjorn do some rework and extension in V2. It moves the VGA arbiter to
the PCI subsystem, fixes a few nits, and breaks a few pieces to make
the main patch a little smaller.

V3 rewrite the commit log of the last patch (which is also summarized
by Bjorn).

V4 split the last patch to two steps.

V5 split Patch-9 again and sort the patches.

V5 split Patch-5 again and sort the patches again.

All comments welcome!

[1] https://lore.kernel.org/dri-devel/20210705100503.1120643-1-chenhuacai@loongson.cn/

Huacai Chen (8):
  PCI/VGA: Prefer vga_default_device()
  PCI/VGA: Move vga_arb_integrated_gpu() earlier in file
  PCI/VGA: Split out vga_arb_update_default_device()
  PCI/VGA: Prefer VGA device with legacy I/O enabled
  PCI/VGA: Prefer VGA device belongs to integrated GPU
  PCI/VGA: Prefer VGA device owns the firmware framebuffer
  PCI/VGA: Remove vga_arb_select_default_device()
  PCI/VGA: Log bridge control messages when adding devices

Bjorn Helgaas (4):
  PCI/VGA: Remove empty vga_arb_device_card_gone()
  PCI/VGA: Use unsigned format string to print lock counts
  PCI/VGA: Replace full MIT license text with SPDX identifier
  PCI/VGA: Move vgaarb to drivers/pci

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> 
---
 drivers/gpu/vga/Kconfig           |  19 ---
 drivers/gpu/vga/Makefile          |   1 -
 drivers/pci/Kconfig               |  19 +++
 drivers/pci/Makefile              |   1 +
 drivers/{gpu/vga => pci}/vgaarb.c | 269 ++++++++++++------------------
 5 files changed, 126 insertions(+), 183 deletions(-)
 rename drivers/{gpu/vga => pci}/vgaarb.c (90%)
--
2.27.0


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V6 01/12] PCI/VGA: Prefer vga_default_device()
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 02/12] PCI/VGA: Move vga_arb_integrated_gpu() earlier in file Huacai Chen
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

Use the vga_default_device() interface consistently instead of directly
testing vga_default.  No functional change intended.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 569930552957..6a5169d8578f 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -193,7 +193,7 @@ int vga_remove_vgacon(struct pci_dev *pdev)
 {
 	int ret = 0;
 
-	if (pdev != vga_default)
+	if (pdev != vga_default_device())
 		return 0;
 	vgaarb_info(&pdev->dev, "deactivate vga console\n");
 
@@ -695,7 +695,7 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
 	/* Deal with VGA default device. Use first enabled one
 	 * by default if arch doesn't have it's own hook
 	 */
-	if (vga_default == NULL &&
+	if (!vga_default_device() &&
 	    ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
 		vgaarb_info(&pdev->dev, "setting as boot VGA device\n");
 		vga_set_default_device(pdev);
@@ -732,7 +732,7 @@ static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
 		goto bail;
 	}
 
-	if (vga_default == pdev)
+	if (vga_default_device() == pdev)
 		vga_set_default_device(NULL);
 
 	if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 02/12] PCI/VGA: Move vga_arb_integrated_gpu() earlier in file
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 01/12] PCI/VGA: Prefer vga_default_device() Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 03/12] PCI/VGA: Split out vga_arb_update_default_device() Huacai Chen
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

Move vga_arb_integrated_gpu() earlier in file to prepare for future patch.
No functional change intended.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 6a5169d8578f..29e725ebaa43 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -565,6 +565,20 @@ void vga_put(struct pci_dev *pdev, unsigned int rsrc)
 }
 EXPORT_SYMBOL(vga_put);
 
+#if defined(CONFIG_ACPI)
+static bool vga_arb_integrated_gpu(struct device *dev)
+{
+	struct acpi_device *adev = ACPI_COMPANION(dev);
+
+	return adev && !strcmp(acpi_device_hid(adev), ACPI_VIDEO_HID);
+}
+#else
+static bool vga_arb_integrated_gpu(struct device *dev)
+{
+	return false;
+}
+#endif
+
 /*
  * Rules for using a bridge to control a VGA descendant decoding: if a bridge
  * has only one VGA descendant then it can be used to control the VGA routing
@@ -1430,20 +1444,6 @@ static struct miscdevice vga_arb_device = {
 	MISC_DYNAMIC_MINOR, "vga_arbiter", &vga_arb_device_fops
 };
 
-#if defined(CONFIG_ACPI)
-static bool vga_arb_integrated_gpu(struct device *dev)
-{
-	struct acpi_device *adev = ACPI_COMPANION(dev);
-
-	return adev && !strcmp(acpi_device_hid(adev), ACPI_VIDEO_HID);
-}
-#else
-static bool vga_arb_integrated_gpu(struct device *dev)
-{
-	return false;
-}
-#endif
-
 static void __init vga_arb_select_default_device(void)
 {
 	struct pci_dev *pdev, *found = NULL;
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 03/12] PCI/VGA: Split out vga_arb_update_default_device()
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 01/12] PCI/VGA: Prefer vga_default_device() Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 02/12] PCI/VGA: Move vga_arb_integrated_gpu() earlier in file Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 04/12] PCI/VGA: Prefer VGA device with legacy I/O enabled Huacai Chen
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

This patch is the first step of the rework: If there's no default VGA
device, and we find a VGA device that owns the legacy VGA resources, we
make that device the default. Split this logic out from vga_arbiter_add_
pci_device() into a new function, vga_arb_update_default_device().

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 29e725ebaa43..f8f95244d499 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -579,6 +579,21 @@ static bool vga_arb_integrated_gpu(struct device *dev)
 }
 #endif
 
+static void vga_arb_update_default_device(struct vga_device *vgadev)
+{
+	struct pci_dev *pdev = vgadev->pdev;
+
+	/*
+	 * If we don't have a default VGA device yet, and this device owns
+	 * the legacy VGA resources, make it the default.
+	 */
+	if (!vga_default_device() &&
+	    ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
+		vgaarb_info(&pdev->dev, "setting as boot VGA device\n");
+		vga_set_default_device(pdev);
+	}
+}
+
 /*
  * Rules for using a bridge to control a VGA descendant decoding: if a bridge
  * has only one VGA descendant then it can be used to control the VGA routing
@@ -706,15 +721,7 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
 		bus = bus->parent;
 	}
 
-	/* Deal with VGA default device. Use first enabled one
-	 * by default if arch doesn't have it's own hook
-	 */
-	if (!vga_default_device() &&
-	    ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
-		vgaarb_info(&pdev->dev, "setting as boot VGA device\n");
-		vga_set_default_device(pdev);
-	}
-
+	vga_arb_update_default_device(vgadev);
 	vga_arbiter_check_bridge_sharing(vgadev);
 
 	/* Add to the list */
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 04/12] PCI/VGA: Prefer VGA device with legacy I/O enabled
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (2 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 03/12] PCI/VGA: Split out vga_arb_update_default_device() Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 05/12] PCI/VGA: Prefer VGA device belongs to integrated GPU Huacai Chen
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

This patch is the second step of the rework: A VGA device with legacy
I/O resources enabled is more preferred than those not enabled.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index f8f95244d499..1ffc3decc9cb 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -582,14 +582,27 @@ static bool vga_arb_integrated_gpu(struct device *dev)
 static void vga_arb_update_default_device(struct vga_device *vgadev)
 {
 	struct pci_dev *pdev = vgadev->pdev;
+	struct device *dev = &pdev->dev;
+	struct vga_device *vgadev_default;
 
 	/*
 	 * If we don't have a default VGA device yet, and this device owns
 	 * the legacy VGA resources, make it the default.
 	 */
-	if (!vga_default_device() &&
-	    ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
-		vgaarb_info(&pdev->dev, "setting as boot VGA device\n");
+	if (!vga_default_device()) {
+		if ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)
+			vgaarb_info(dev, "setting as boot VGA device\n");
+		else
+			vgaarb_info(dev, "setting as boot device (VGA legacy resources not available)\n");
+		vga_set_default_device(pdev);
+	}
+
+	vgadev_default = vgadev_find(vga_default);
+
+	/* Overridden by a better device */
+	if (vgadev_default && ((vgadev_default->owns & VGA_RSRC_LEGACY_MASK) == 0)
+		&& ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
+		vgaarb_info(dev, "overriding boot VGA device\n");
 		vga_set_default_device(pdev);
 	}
 }
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 05/12] PCI/VGA: Prefer VGA device belongs to integrated GPU
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (3 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 04/12] PCI/VGA: Prefer VGA device with legacy I/O enabled Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 06/12] PCI/VGA: Prefer VGA device owns the firmware framebuffer Huacai Chen
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

This patch is the third step of the rework: A VGA device belongs to
integrated GPU is more preferred than those not belong to.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 1ffc3decc9cb..1daf2a011f83 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -605,6 +605,11 @@ static void vga_arb_update_default_device(struct vga_device *vgadev)
 		vgaarb_info(dev, "overriding boot VGA device\n");
 		vga_set_default_device(pdev);
 	}
+
+	if (vga_arb_integrated_gpu(dev) && vgadev->pdev != vga_default_device()) {
+		vgaarb_info(dev, "overriding boot VGA device\n");
+		vga_set_default_device(pdev);
+	}
 }
 
 /*
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 06/12] PCI/VGA: Prefer VGA device owns the firmware framebuffer
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (4 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 05/12] PCI/VGA: Prefer VGA device belongs to integrated GPU Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 07/12] PCI/VGA: Remove vga_arb_select_default_device() Huacai Chen
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

This patch is the fourth step of the rework: On X86 and IA64 platform,
update default VGA device if the new found device owns the firmware
framebuffer because it is the most preferred.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 45 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 1daf2a011f83..042e1f1371fc 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -584,6 +584,14 @@ static void vga_arb_update_default_device(struct vga_device *vgadev)
 	struct pci_dev *pdev = vgadev->pdev;
 	struct device *dev = &pdev->dev;
 	struct vga_device *vgadev_default;
+#if defined(CONFIG_X86) || defined(CONFIG_IA64)
+	int i;
+	unsigned long flags;
+	u64 base = screen_info.lfb_base;
+	u64 size = screen_info.lfb_size;
+	u64 limit;
+	resource_size_t start, end;
+#endif
 
 	/*
 	 * If we don't have a default VGA device yet, and this device owns
@@ -610,6 +618,43 @@ static void vga_arb_update_default_device(struct vga_device *vgadev)
 		vgaarb_info(dev, "overriding boot VGA device\n");
 		vga_set_default_device(pdev);
 	}
+
+#if defined(CONFIG_X86) || defined(CONFIG_IA64)
+	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(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 (vgadev->pdev != vga_default_device())
+			vgaarb_info(dev, "overriding boot device\n");
+		vga_set_default_device(vgadev->pdev);
+	}
+#endif
 }
 
 /*
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 07/12] PCI/VGA: Remove vga_arb_select_default_device()
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (5 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 06/12] PCI/VGA: Prefer VGA device owns the firmware framebuffer Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 08/12] PCI/VGA: Remove empty vga_arb_device_card_gone() Huacai Chen
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

This patch is the last step of the rework: Since vga_arb_update_default_
device() is complete, we can remove vga_arb_select_default_device() and
its call-site.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 89 ----------------------------------------
 1 file changed, 89 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 042e1f1371fc..05174fd7e7ef 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -1514,92 +1514,6 @@ static struct miscdevice vga_arb_device = {
 	MISC_DYNAMIC_MINOR, "vga_arbiter", &vga_arb_device_fops
 };
 
-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);
-		}
-	}
-#endif
-
-	if (!vga_default_device()) {
-		list_for_each_entry_reverse(vgadev, &vga_list, list) {
-			struct device *dev = &vgadev->pdev->dev;
-			u16 cmd;
-
-			pdev = vgadev->pdev;
-			pci_read_config_word(pdev, PCI_COMMAND, &cmd);
-			if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
-				found = pdev;
-				if (vga_arb_integrated_gpu(dev))
-					break;
-			}
-		}
-	}
-
-	if (found) {
-		vgaarb_info(&found->dev, "setting as boot device (VGA legacy resources not available)\n");
-		vga_set_default_device(found);
-		return;
-	}
-
-	if (!vga_default_device()) {
-		vgadev = list_first_entry_or_null(&vga_list,
-						  struct vga_device, list);
-		if (vgadev) {
-			struct device *dev = &vgadev->pdev->dev;
-			vgaarb_info(dev, "setting as boot device (VGA legacy resources not available)\n");
-			vga_set_default_device(vgadev->pdev);
-		}
-	}
-}
-
 static int __init vga_arb_device_init(void)
 {
 	int rc;
@@ -1629,9 +1543,6 @@ static int __init vga_arb_device_init(void)
 			vgaarb_info(dev, "no bridge control possible\n");
 	}
 
-	vga_arb_select_default_device();
-
-	pr_info("loaded\n");
 	return rc;
 }
 subsys_initcall(vga_arb_device_init);
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 08/12] PCI/VGA: Remove empty vga_arb_device_card_gone()
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (6 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 07/12] PCI/VGA: Remove vga_arb_select_default_device() Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 09/12] PCI/VGA: Log bridge control messages when adding devices Huacai Chen
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

From: Bjorn Helgaas <bhelgaas@google.com>

vga_arb_device_card_gone() has always been empty.  Remove it.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
---
 drivers/gpu/vga/vgaarb.c | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 05174fd7e7ef..7cd989c5d03b 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -122,8 +122,6 @@ static int vga_str_to_iostate(char *buf, int str_size, int *io_state)
 /* this is only used a cookie - it should not be dereferenced */
 static struct pci_dev *vga_default;
 
-static void vga_arb_device_card_gone(struct pci_dev *pdev);
-
 /* Find somebody in our list */
 static struct vga_device *vgadev_find(struct pci_dev *pdev)
 {
@@ -825,10 +823,6 @@ static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
 	/* Remove entry from list */
 	list_del(&vgadev->list);
 	vga_count--;
-	/* Notify userland driver that the device is gone so it discards
-	 * it's copies of the pci_dev pointer
-	 */
-	vga_arb_device_card_gone(pdev);
 
 	/* Wake up all possible waiters */
 	wake_up_all(&vga_wait_queue);
@@ -1078,9 +1072,7 @@ static ssize_t vga_arb_read(struct file *file, char __user *buf,
 	if (lbuf == NULL)
 		return -ENOMEM;
 
-	/* Shields against vga_arb_device_card_gone (pci_dev going
-	 * away), and allows access to vga list
-	 */
+	/* Protects vga_list */
 	spin_lock_irqsave(&vga_lock, flags);
 
 	/* If we are targeting the default, use it */
@@ -1097,8 +1089,6 @@ static ssize_t vga_arb_read(struct file *file, char __user *buf,
 		/* Wow, it's not in the list, that shouldn't happen,
 		 * let's fix us up and return invalid card
 		 */
-		if (pdev == priv->target)
-			vga_arb_device_card_gone(pdev);
 		spin_unlock_irqrestore(&vga_lock, flags);
 		len = sprintf(lbuf, "invalid");
 		goto done;
@@ -1442,10 +1432,6 @@ static int vga_arb_release(struct inode *inode, struct file *file)
 	return 0;
 }
 
-static void vga_arb_device_card_gone(struct pci_dev *pdev)
-{
-}
-
 /*
  * callback any registered clients to let them know we have a
  * change in VGA cards
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 09/12] PCI/VGA: Log bridge control messages when adding devices
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (7 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 08/12] PCI/VGA: Remove empty vga_arb_device_card_gone() Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 10/12] PCI/VGA: Use unsigned format string to print lock counts Huacai Chen
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

Previously vga_arb_device_init() iterated through all VGA devices and
indicated whether legacy VGA routing to each could be controlled by an
upstream bridge.

But we determine that information in vga_arbiter_add_pci_device(), which we
call for every device, so we can log it there without iterating through the
VGA devices again.

Note that we call vga_arbiter_check_bridge_sharing() before adding the
device to vga_list, so we have to handle the very first device separately.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/gpu/vga/vgaarb.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 7cd989c5d03b..7f52db439c11 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -672,8 +672,10 @@ static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
 
 	vgadev->bridge_has_one_vga = true;
 
-	if (list_empty(&vga_list))
+	if (list_empty(&vga_list)) {
+		vgaarb_info(&vgadev->pdev->dev, "bridge control possible\n");
 		return;
+	}
 
 	/* okay iterate the new devices bridge hierarachy */
 	new_bus = vgadev->pdev->bus;
@@ -712,6 +714,11 @@ static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
 		}
 		new_bus = new_bus->parent;
 	}
+
+	if (vgadev->bridge_has_one_vga)
+		vgaarb_info(&vgadev->pdev->dev, "bridge control possible\n");
+	else
+		vgaarb_info(&vgadev->pdev->dev, "no bridge control possible\n");
 }
 
 /*
@@ -1504,7 +1511,6 @@ static int __init vga_arb_device_init(void)
 {
 	int rc;
 	struct pci_dev *pdev;
-	struct vga_device *vgadev;
 
 	rc = misc_register(&vga_arb_device);
 	if (rc < 0)
@@ -1520,15 +1526,6 @@ static int __init vga_arb_device_init(void)
 			       PCI_ANY_ID, pdev)) != NULL)
 		vga_arbiter_add_pci_device(pdev);
 
-	list_for_each_entry(vgadev, &vga_list, list) {
-		struct device *dev = &vgadev->pdev->dev;
-
-		if (vgadev->bridge_has_one_vga)
-			vgaarb_info(dev, "bridge control possible\n");
-		else
-			vgaarb_info(dev, "no bridge control possible\n");
-	}
-
 	return rc;
 }
 subsys_initcall(vga_arb_device_init);
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 10/12] PCI/VGA: Use unsigned format string to print lock counts
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (8 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 09/12] PCI/VGA: Log bridge control messages when adding devices Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 11/12] PCI/VGA: Replace full MIT license text with SPDX identifier Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 12/12] PCI/VGA: Move vgaarb to drivers/pci Huacai Chen
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

From: Bjorn Helgaas <bhelgaas@google.com>

In struct vga_device, io_lock_cnt and mem_lock_cnt are unsigned, but we
previously printed them with "%d", the signed decimal format.  Print them
with the unsigned format "%u" instead.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
---
 drivers/gpu/vga/vgaarb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 7f52db439c11..8d07279cb49d 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -1103,7 +1103,7 @@ static ssize_t vga_arb_read(struct file *file, char __user *buf,
 
 	/* Fill the buffer with infos */
 	len = snprintf(lbuf, 1024,
-		       "count:%d,PCI:%s,decodes=%s,owns=%s,locks=%s(%d:%d)\n",
+		       "count:%d,PCI:%s,decodes=%s,owns=%s,locks=%s(%u:%u)\n",
 		       vga_decode_count, pci_name(pdev),
 		       vga_iostate_to_str(vgadev->decodes),
 		       vga_iostate_to_str(vgadev->owns),
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 11/12] PCI/VGA: Replace full MIT license text with SPDX identifier
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (9 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 10/12] PCI/VGA: Use unsigned format string to print lock counts Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-16  8:29 ` [PATCH V6 12/12] PCI/VGA: Move vgaarb to drivers/pci Huacai Chen
  11 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

From: Bjorn Helgaas <bhelgaas@google.com>

Per Documentation/process/license-rules.rst, the SPDX MIT identifier is
equivalent to including the entire MIT license text from
LICENSES/preferred/MIT.

Replace the MIT license text with the equivalent SPDX identifier.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
---
 drivers/gpu/vga/vgaarb.c | 23 +----------------------
 1 file changed, 1 insertion(+), 22 deletions(-)

diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 8d07279cb49d..ee9e4dab6b35 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -1,32 +1,11 @@
+// SPDX-License-Identifier: MIT
 /*
  * vgaarb.c: Implements the VGA arbitration. For details refer to
  * Documentation/gpu/vgaarbiter.rst
  *
- *
  * (C) Copyright 2005 Benjamin Herrenschmidt <benh@kernel.crashing.org>
  * (C) Copyright 2007 Paulo R. Zanoni <przanoni@gmail.com>
  * (C) Copyright 2007, 2009 Tiago Vignatti <vignatti@freedesktop.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS
- * IN THE SOFTWARE.
- *
  */
 
 #define pr_fmt(fmt) "vgaarb: " fmt
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH V6 12/12] PCI/VGA: Move vgaarb to drivers/pci
  2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
                   ` (10 preceding siblings ...)
  2021-09-16  8:29 ` [PATCH V6 11/12] PCI/VGA: Replace full MIT license text with SPDX identifier Huacai Chen
@ 2021-09-16  8:29 ` Huacai Chen
  2021-09-26  3:07     ` Huacai Chen
  11 siblings, 1 reply; 15+ messages in thread
From: Huacai Chen @ 2021-09-16  8:29 UTC (permalink / raw)
  To: David Airlie, Daniel Vetter, Bjorn Helgaas
  Cc: linux-pci, dri-devel, Xuefeng Li, Huacai Chen, Huacai Chen

From: Bjorn Helgaas <bhelgaas@google.com>

The VGA arbiter is really PCI-specific and doesn't depend on any GPU
things.  Move it to the PCI subsystem.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
---
 drivers/gpu/vga/Kconfig           | 19 -------------------
 drivers/gpu/vga/Makefile          |  1 -
 drivers/pci/Kconfig               | 19 +++++++++++++++++++
 drivers/pci/Makefile              |  1 +
 drivers/{gpu/vga => pci}/vgaarb.c |  0
 5 files changed, 20 insertions(+), 20 deletions(-)
 rename drivers/{gpu/vga => pci}/vgaarb.c (100%)

diff --git a/drivers/gpu/vga/Kconfig b/drivers/gpu/vga/Kconfig
index 1ad4c4ef0b5e..eb8b14ab22c3 100644
--- a/drivers/gpu/vga/Kconfig
+++ b/drivers/gpu/vga/Kconfig
@@ -1,23 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
-config VGA_ARB
-	bool "VGA Arbitration" if EXPERT
-	default y
-	depends on (PCI && !S390)
-	help
-	  Some "legacy" VGA devices implemented on PCI typically have the same
-	  hard-decoded addresses as they did on ISA. When multiple PCI devices
-	  are accessed at same time they need some kind of coordination. Please
-	  see Documentation/gpu/vgaarbiter.rst for more details. Select this to
-	  enable VGA arbiter.
-
-config VGA_ARB_MAX_GPUS
-	int "Maximum number of GPUs"
-	default 16
-	depends on VGA_ARB
-	help
-	  Reserves space in the kernel to maintain resource locking for
-	  multiple GPUS.  The overhead for each GPU is very small.
-
 config VGA_SWITCHEROO
 	bool "Laptop Hybrid Graphics - GPU switching support"
 	depends on X86
diff --git a/drivers/gpu/vga/Makefile b/drivers/gpu/vga/Makefile
index e92064442d60..9800620deda3 100644
--- a/drivers/gpu/vga/Makefile
+++ b/drivers/gpu/vga/Makefile
@@ -1,3 +1,2 @@
 # SPDX-License-Identifier: GPL-2.0-only
-obj-$(CONFIG_VGA_ARB)  += vgaarb.o
 obj-$(CONFIG_VGA_SWITCHEROO) += vga_switcheroo.o
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index 0c473d75e625..7c9e56d7b857 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -252,6 +252,25 @@ config PCIE_BUS_PEER2PEER
 
 endchoice
 
+config VGA_ARB
+	bool "VGA Arbitration" if EXPERT
+	default y
+	depends on (PCI && !S390)
+	help
+	  Some "legacy" VGA devices implemented on PCI typically have the same
+	  hard-decoded addresses as they did on ISA. When multiple PCI devices
+	  are accessed at same time they need some kind of coordination. Please
+	  see Documentation/gpu/vgaarbiter.rst for more details. Select this to
+	  enable VGA arbiter.
+
+config VGA_ARB_MAX_GPUS
+	int "Maximum number of GPUs"
+	default 16
+	depends on VGA_ARB
+	help
+	  Reserves space in the kernel to maintain resource locking for
+	  multiple GPUS.  The overhead for each GPU is very small.
+
 source "drivers/pci/hotplug/Kconfig"
 source "drivers/pci/controller/Kconfig"
 source "drivers/pci/endpoint/Kconfig"
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
index d62c4ac4ae1b..ebe720f69b15 100644
--- a/drivers/pci/Makefile
+++ b/drivers/pci/Makefile
@@ -29,6 +29,7 @@ obj-$(CONFIG_PCI_PF_STUB)	+= pci-pf-stub.o
 obj-$(CONFIG_PCI_ECAM)		+= ecam.o
 obj-$(CONFIG_PCI_P2PDMA)	+= p2pdma.o
 obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += xen-pcifront.o
+obj-$(CONFIG_VGA_ARB)		+= vgaarb.o
 
 # Endpoint library must be initialized before its users
 obj-$(CONFIG_PCI_ENDPOINT)	+= endpoint/
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/pci/vgaarb.c
similarity index 100%
rename from drivers/gpu/vga/vgaarb.c
rename to drivers/pci/vgaarb.c
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH V6 12/12] PCI/VGA: Move vgaarb to drivers/pci
  2021-09-16  8:29 ` [PATCH V6 12/12] PCI/VGA: Move vgaarb to drivers/pci Huacai Chen
@ 2021-09-26  3:07     ` Huacai Chen
  0 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-26  3:07 UTC (permalink / raw)
  To: Huacai Chen
  Cc: David Airlie, Daniel Vetter, Bjorn Helgaas, linux-pci,
	Maling list - DRI developers, Xuefeng Li

Hi, Bjorn,

On Thu, Sep 16, 2021 at 4:39 PM Huacai Chen <chenhuacai@loongson.cn> wrote:
>
> From: Bjorn Helgaas <bhelgaas@google.com>
>
> The VGA arbiter is really PCI-specific and doesn't depend on any GPU
> things.  Move it to the PCI subsystem.
I found a new problem, after moving vgaarb.c to drivers/pci,
misc_register() in vga_arb_device_init() fails with -ENODEV, the root
cause is still initcall order. Both vga_arb_device_init() and
misc_init() are subsys_initcall(), and drivers/Makefile looks like
this:
obj-y                           += pci/
......
obj-y                           += char/
......
obj-y                           += gpu/

So vga_arb_device_init() in the pci directory runs before misc_init()
in the char directory, and misc_register() fails.

There are two methods to resolve: 1, keep vgaarb.c in drivers/gpu; 2,
make vga_arb_device_init() to be subsys_initcall_sync(). I prefer the
first one, but it seems you don't like both of them.

Huacai

>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> ---
>  drivers/gpu/vga/Kconfig           | 19 -------------------
>  drivers/gpu/vga/Makefile          |  1 -
>  drivers/pci/Kconfig               | 19 +++++++++++++++++++
>  drivers/pci/Makefile              |  1 +
>  drivers/{gpu/vga => pci}/vgaarb.c |  0
>  5 files changed, 20 insertions(+), 20 deletions(-)
>  rename drivers/{gpu/vga => pci}/vgaarb.c (100%)
>
> diff --git a/drivers/gpu/vga/Kconfig b/drivers/gpu/vga/Kconfig
> index 1ad4c4ef0b5e..eb8b14ab22c3 100644
> --- a/drivers/gpu/vga/Kconfig
> +++ b/drivers/gpu/vga/Kconfig
> @@ -1,23 +1,4 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> -config VGA_ARB
> -       bool "VGA Arbitration" if EXPERT
> -       default y
> -       depends on (PCI && !S390)
> -       help
> -         Some "legacy" VGA devices implemented on PCI typically have the same
> -         hard-decoded addresses as they did on ISA. When multiple PCI devices
> -         are accessed at same time they need some kind of coordination. Please
> -         see Documentation/gpu/vgaarbiter.rst for more details. Select this to
> -         enable VGA arbiter.
> -
> -config VGA_ARB_MAX_GPUS
> -       int "Maximum number of GPUs"
> -       default 16
> -       depends on VGA_ARB
> -       help
> -         Reserves space in the kernel to maintain resource locking for
> -         multiple GPUS.  The overhead for each GPU is very small.
> -
>  config VGA_SWITCHEROO
>         bool "Laptop Hybrid Graphics - GPU switching support"
>         depends on X86
> diff --git a/drivers/gpu/vga/Makefile b/drivers/gpu/vga/Makefile
> index e92064442d60..9800620deda3 100644
> --- a/drivers/gpu/vga/Makefile
> +++ b/drivers/gpu/vga/Makefile
> @@ -1,3 +1,2 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> -obj-$(CONFIG_VGA_ARB)  += vgaarb.o
>  obj-$(CONFIG_VGA_SWITCHEROO) += vga_switcheroo.o
> diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
> index 0c473d75e625..7c9e56d7b857 100644
> --- a/drivers/pci/Kconfig
> +++ b/drivers/pci/Kconfig
> @@ -252,6 +252,25 @@ config PCIE_BUS_PEER2PEER
>
>  endchoice
>
> +config VGA_ARB
> +       bool "VGA Arbitration" if EXPERT
> +       default y
> +       depends on (PCI && !S390)
> +       help
> +         Some "legacy" VGA devices implemented on PCI typically have the same
> +         hard-decoded addresses as they did on ISA. When multiple PCI devices
> +         are accessed at same time they need some kind of coordination. Please
> +         see Documentation/gpu/vgaarbiter.rst for more details. Select this to
> +         enable VGA arbiter.
> +
> +config VGA_ARB_MAX_GPUS
> +       int "Maximum number of GPUs"
> +       default 16
> +       depends on VGA_ARB
> +       help
> +         Reserves space in the kernel to maintain resource locking for
> +         multiple GPUS.  The overhead for each GPU is very small.
> +
>  source "drivers/pci/hotplug/Kconfig"
>  source "drivers/pci/controller/Kconfig"
>  source "drivers/pci/endpoint/Kconfig"
> diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
> index d62c4ac4ae1b..ebe720f69b15 100644
> --- a/drivers/pci/Makefile
> +++ b/drivers/pci/Makefile
> @@ -29,6 +29,7 @@ obj-$(CONFIG_PCI_PF_STUB)     += pci-pf-stub.o
>  obj-$(CONFIG_PCI_ECAM)         += ecam.o
>  obj-$(CONFIG_PCI_P2PDMA)       += p2pdma.o
>  obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += xen-pcifront.o
> +obj-$(CONFIG_VGA_ARB)          += vgaarb.o
>
>  # Endpoint library must be initialized before its users
>  obj-$(CONFIG_PCI_ENDPOINT)     += endpoint/
> diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/pci/vgaarb.c
> similarity index 100%
> rename from drivers/gpu/vga/vgaarb.c
> rename to drivers/pci/vgaarb.c
> --
> 2.27.0
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH V6 12/12] PCI/VGA: Move vgaarb to drivers/pci
@ 2021-09-26  3:07     ` Huacai Chen
  0 siblings, 0 replies; 15+ messages in thread
From: Huacai Chen @ 2021-09-26  3:07 UTC (permalink / raw)
  To: Huacai Chen
  Cc: David Airlie, Daniel Vetter, Bjorn Helgaas, linux-pci,
	Maling list - DRI developers, Xuefeng Li

Hi, Bjorn,

On Thu, Sep 16, 2021 at 4:39 PM Huacai Chen <chenhuacai@loongson.cn> wrote:
>
> From: Bjorn Helgaas <bhelgaas@google.com>
>
> The VGA arbiter is really PCI-specific and doesn't depend on any GPU
> things.  Move it to the PCI subsystem.
I found a new problem, after moving vgaarb.c to drivers/pci,
misc_register() in vga_arb_device_init() fails with -ENODEV, the root
cause is still initcall order. Both vga_arb_device_init() and
misc_init() are subsys_initcall(), and drivers/Makefile looks like
this:
obj-y                           += pci/
......
obj-y                           += char/
......
obj-y                           += gpu/

So vga_arb_device_init() in the pci directory runs before misc_init()
in the char directory, and misc_register() fails.

There are two methods to resolve: 1, keep vgaarb.c in drivers/gpu; 2,
make vga_arb_device_init() to be subsys_initcall_sync(). I prefer the
first one, but it seems you don't like both of them.

Huacai

>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> ---
>  drivers/gpu/vga/Kconfig           | 19 -------------------
>  drivers/gpu/vga/Makefile          |  1 -
>  drivers/pci/Kconfig               | 19 +++++++++++++++++++
>  drivers/pci/Makefile              |  1 +
>  drivers/{gpu/vga => pci}/vgaarb.c |  0
>  5 files changed, 20 insertions(+), 20 deletions(-)
>  rename drivers/{gpu/vga => pci}/vgaarb.c (100%)
>
> diff --git a/drivers/gpu/vga/Kconfig b/drivers/gpu/vga/Kconfig
> index 1ad4c4ef0b5e..eb8b14ab22c3 100644
> --- a/drivers/gpu/vga/Kconfig
> +++ b/drivers/gpu/vga/Kconfig
> @@ -1,23 +1,4 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> -config VGA_ARB
> -       bool "VGA Arbitration" if EXPERT
> -       default y
> -       depends on (PCI && !S390)
> -       help
> -         Some "legacy" VGA devices implemented on PCI typically have the same
> -         hard-decoded addresses as they did on ISA. When multiple PCI devices
> -         are accessed at same time they need some kind of coordination. Please
> -         see Documentation/gpu/vgaarbiter.rst for more details. Select this to
> -         enable VGA arbiter.
> -
> -config VGA_ARB_MAX_GPUS
> -       int "Maximum number of GPUs"
> -       default 16
> -       depends on VGA_ARB
> -       help
> -         Reserves space in the kernel to maintain resource locking for
> -         multiple GPUS.  The overhead for each GPU is very small.
> -
>  config VGA_SWITCHEROO
>         bool "Laptop Hybrid Graphics - GPU switching support"
>         depends on X86
> diff --git a/drivers/gpu/vga/Makefile b/drivers/gpu/vga/Makefile
> index e92064442d60..9800620deda3 100644
> --- a/drivers/gpu/vga/Makefile
> +++ b/drivers/gpu/vga/Makefile
> @@ -1,3 +1,2 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> -obj-$(CONFIG_VGA_ARB)  += vgaarb.o
>  obj-$(CONFIG_VGA_SWITCHEROO) += vga_switcheroo.o
> diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
> index 0c473d75e625..7c9e56d7b857 100644
> --- a/drivers/pci/Kconfig
> +++ b/drivers/pci/Kconfig
> @@ -252,6 +252,25 @@ config PCIE_BUS_PEER2PEER
>
>  endchoice
>
> +config VGA_ARB
> +       bool "VGA Arbitration" if EXPERT
> +       default y
> +       depends on (PCI && !S390)
> +       help
> +         Some "legacy" VGA devices implemented on PCI typically have the same
> +         hard-decoded addresses as they did on ISA. When multiple PCI devices
> +         are accessed at same time they need some kind of coordination. Please
> +         see Documentation/gpu/vgaarbiter.rst for more details. Select this to
> +         enable VGA arbiter.
> +
> +config VGA_ARB_MAX_GPUS
> +       int "Maximum number of GPUs"
> +       default 16
> +       depends on VGA_ARB
> +       help
> +         Reserves space in the kernel to maintain resource locking for
> +         multiple GPUS.  The overhead for each GPU is very small.
> +
>  source "drivers/pci/hotplug/Kconfig"
>  source "drivers/pci/controller/Kconfig"
>  source "drivers/pci/endpoint/Kconfig"
> diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
> index d62c4ac4ae1b..ebe720f69b15 100644
> --- a/drivers/pci/Makefile
> +++ b/drivers/pci/Makefile
> @@ -29,6 +29,7 @@ obj-$(CONFIG_PCI_PF_STUB)     += pci-pf-stub.o
>  obj-$(CONFIG_PCI_ECAM)         += ecam.o
>  obj-$(CONFIG_PCI_P2PDMA)       += p2pdma.o
>  obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += xen-pcifront.o
> +obj-$(CONFIG_VGA_ARB)          += vgaarb.o
>
>  # Endpoint library must be initialized before its users
>  obj-$(CONFIG_PCI_ENDPOINT)     += endpoint/
> diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/pci/vgaarb.c
> similarity index 100%
> rename from drivers/gpu/vga/vgaarb.c
> rename to drivers/pci/vgaarb.c
> --
> 2.27.0
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2021-09-26  3:08 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-16  8:29 [PATCH V6 00/12] PCI/VGA: Rework default VGA device selection Huacai Chen
2021-09-16  8:29 ` [PATCH V6 01/12] PCI/VGA: Prefer vga_default_device() Huacai Chen
2021-09-16  8:29 ` [PATCH V6 02/12] PCI/VGA: Move vga_arb_integrated_gpu() earlier in file Huacai Chen
2021-09-16  8:29 ` [PATCH V6 03/12] PCI/VGA: Split out vga_arb_update_default_device() Huacai Chen
2021-09-16  8:29 ` [PATCH V6 04/12] PCI/VGA: Prefer VGA device with legacy I/O enabled Huacai Chen
2021-09-16  8:29 ` [PATCH V6 05/12] PCI/VGA: Prefer VGA device belongs to integrated GPU Huacai Chen
2021-09-16  8:29 ` [PATCH V6 06/12] PCI/VGA: Prefer VGA device owns the firmware framebuffer Huacai Chen
2021-09-16  8:29 ` [PATCH V6 07/12] PCI/VGA: Remove vga_arb_select_default_device() Huacai Chen
2021-09-16  8:29 ` [PATCH V6 08/12] PCI/VGA: Remove empty vga_arb_device_card_gone() Huacai Chen
2021-09-16  8:29 ` [PATCH V6 09/12] PCI/VGA: Log bridge control messages when adding devices Huacai Chen
2021-09-16  8:29 ` [PATCH V6 10/12] PCI/VGA: Use unsigned format string to print lock counts Huacai Chen
2021-09-16  8:29 ` [PATCH V6 11/12] PCI/VGA: Replace full MIT license text with SPDX identifier Huacai Chen
2021-09-16  8:29 ` [PATCH V6 12/12] PCI/VGA: Move vgaarb to drivers/pci Huacai Chen
2021-09-26  3:07   ` Huacai Chen
2021-09-26  3:07     ` Huacai Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.