From: Bjorn Helgaas <helgaas@kernel.org> To: David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch> Cc: "Xuefeng Li" <lixuefeng@loongson.cn>, "Huacai Chen" <chenhuacai@gmail.com>, "Huacai Chen" <chenhuacai@loongson.cn>, linux-pci@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, "Bjorn Helgaas" <bhelgaas@google.com>, "Bruno Prémont" <bonbons@linux-vserver.org> Subject: [PATCH v8 04/10] vgaarb: Move framebuffer detection to ADD_DEVICE path Date: Wed, 5 Jan 2022 18:06:52 -0600 [thread overview] Message-ID: <20220106000658.243509-5-helgaas@kernel.org> (raw) In-Reply-To: <20220106000658.243509-1-helgaas@kernel.org> From: Bjorn Helgaas <bhelgaas@google.com> Previously we selected a device that owns the boot framebuffer as the default device in vga_arb_select_default_device(). This was only done in the vga_arb_device_init() subsys_initcall, so devices enumerated later, e.g., by pcibios_init(), were not eligible. Fix this by moving the framebuffer device selection from vga_arb_select_default_device() to vga_arbiter_add_pci_device(), which is called after every PCI device is enumerated, either by the vga_arb_device_init() subsys_initcall or as an ADD_DEVICE notifier. Note that if vga_arb_select_default_device() found a device owning the boot framebuffer, it unconditionally set it to be the default VGA device, and no subsequent device could replace it. Link: https://lore.kernel.org/r/20211015061512.2941859-7-chenhuacai@loongson.cn Based-on-patch-by: Huacai Chen <chenhuacai@loongson.cn> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: Bruno Prémont <bonbons@linux-vserver.org> --- drivers/gpu/vga/vgaarb.c | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index b0ae0f177c6f..aefa4f406f7d 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c @@ -72,6 +72,7 @@ struct vga_device { unsigned int io_norm_cnt; /* normal IO count */ unsigned int mem_norm_cnt; /* normal MEM count */ bool bridge_has_one_vga; + bool is_framebuffer; /* BAR covers firmware framebuffer */ unsigned int (*set_decode)(struct pci_dev *pdev, bool decode); }; @@ -565,10 +566,9 @@ 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) +static bool vga_is_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; @@ -583,15 +583,6 @@ static void __init vga_select_framebuffer_device(struct pci_dev *pdev) 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); @@ -608,13 +599,10 @@ static void __init vga_select_framebuffer_device(struct pci_dev *pdev) 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); + return true; } #endif + return false; } static bool vga_arb_integrated_gpu(struct device *dev) @@ -635,6 +623,7 @@ static bool vga_arb_integrated_gpu(struct device *dev) static bool vga_is_boot_device(struct vga_device *vgadev) { struct vga_device *boot_vga = vgadev_find(vga_default_device()); + struct pci_dev *pdev = vgadev->pdev; /* * We select the default VGA device in this order: @@ -645,6 +634,18 @@ static bool vga_is_boot_device(struct vga_device *vgadev) * Other device (see vga_arb_select_default_device()) */ + /* + * We always prefer a firmware framebuffer, so if we've already + * found one, there's no need to consider vgadev. + */ + if (boot_vga && boot_vga->is_framebuffer) + return false; + + if (vga_is_framebuffer_device(pdev)) { + vgadev->is_framebuffer = true; + return true; + } + /* * A legacy VGA device has MEM and IO enabled and any bridges * leading to it have PCI_BRIDGE_CTL_VGA enabled so the legacy @@ -1531,10 +1532,6 @@ static void __init vga_arb_select_default_device(void) struct pci_dev *pdev, *found = NULL; struct vga_device *vgadev; - list_for_each_entry(vgadev, &vga_list, list) { - vga_select_framebuffer_device(vgadev->pdev); - } - if (!vga_default_device()) { list_for_each_entry_reverse(vgadev, &vga_list, list) { struct device *dev = &vgadev->pdev->dev; -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Helgaas <helgaas@kernel.org> To: David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch> Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, "Bruno Prémont" <bonbons@linux-vserver.org>, "Bjorn Helgaas" <bhelgaas@google.com>, "Xuefeng Li" <lixuefeng@loongson.cn>, "Huacai Chen" <chenhuacai@loongson.cn> Subject: [PATCH v8 04/10] vgaarb: Move framebuffer detection to ADD_DEVICE path Date: Wed, 5 Jan 2022 18:06:52 -0600 [thread overview] Message-ID: <20220106000658.243509-5-helgaas@kernel.org> (raw) In-Reply-To: <20220106000658.243509-1-helgaas@kernel.org> From: Bjorn Helgaas <bhelgaas@google.com> Previously we selected a device that owns the boot framebuffer as the default device in vga_arb_select_default_device(). This was only done in the vga_arb_device_init() subsys_initcall, so devices enumerated later, e.g., by pcibios_init(), were not eligible. Fix this by moving the framebuffer device selection from vga_arb_select_default_device() to vga_arbiter_add_pci_device(), which is called after every PCI device is enumerated, either by the vga_arb_device_init() subsys_initcall or as an ADD_DEVICE notifier. Note that if vga_arb_select_default_device() found a device owning the boot framebuffer, it unconditionally set it to be the default VGA device, and no subsequent device could replace it. Link: https://lore.kernel.org/r/20211015061512.2941859-7-chenhuacai@loongson.cn Based-on-patch-by: Huacai Chen <chenhuacai@loongson.cn> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: Bruno Prémont <bonbons@linux-vserver.org> --- drivers/gpu/vga/vgaarb.c | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index b0ae0f177c6f..aefa4f406f7d 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c @@ -72,6 +72,7 @@ struct vga_device { unsigned int io_norm_cnt; /* normal IO count */ unsigned int mem_norm_cnt; /* normal MEM count */ bool bridge_has_one_vga; + bool is_framebuffer; /* BAR covers firmware framebuffer */ unsigned int (*set_decode)(struct pci_dev *pdev, bool decode); }; @@ -565,10 +566,9 @@ 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) +static bool vga_is_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; @@ -583,15 +583,6 @@ static void __init vga_select_framebuffer_device(struct pci_dev *pdev) 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); @@ -608,13 +599,10 @@ static void __init vga_select_framebuffer_device(struct pci_dev *pdev) 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); + return true; } #endif + return false; } static bool vga_arb_integrated_gpu(struct device *dev) @@ -635,6 +623,7 @@ static bool vga_arb_integrated_gpu(struct device *dev) static bool vga_is_boot_device(struct vga_device *vgadev) { struct vga_device *boot_vga = vgadev_find(vga_default_device()); + struct pci_dev *pdev = vgadev->pdev; /* * We select the default VGA device in this order: @@ -645,6 +634,18 @@ static bool vga_is_boot_device(struct vga_device *vgadev) * Other device (see vga_arb_select_default_device()) */ + /* + * We always prefer a firmware framebuffer, so if we've already + * found one, there's no need to consider vgadev. + */ + if (boot_vga && boot_vga->is_framebuffer) + return false; + + if (vga_is_framebuffer_device(pdev)) { + vgadev->is_framebuffer = true; + return true; + } + /* * A legacy VGA device has MEM and IO enabled and any bridges * leading to it have PCI_BRIDGE_CTL_VGA enabled so the legacy @@ -1531,10 +1532,6 @@ static void __init vga_arb_select_default_device(void) struct pci_dev *pdev, *found = NULL; struct vga_device *vgadev; - list_for_each_entry(vgadev, &vga_list, list) { - vga_select_framebuffer_device(vgadev->pdev); - } - if (!vga_default_device()) { list_for_each_entry_reverse(vgadev, &vga_list, list) { struct device *dev = &vgadev->pdev->dev; -- 2.25.1
next prev parent reply other threads:[~2022-01-06 0:07 UTC|newest] Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-01-06 0:06 [PATCH v8 00/10] vgaarb: Rework default VGA device selection Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 01/10] vgaarb: Move vga_arb_integrated_gpu() earlier in file Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 02/10] vgaarb: Factor out vga_select_framebuffer_device() Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 03/10] vgaarb: Factor out default VGA device selection Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas [this message] 2022-01-06 0:06 ` [PATCH v8 04/10] vgaarb: Move framebuffer detection to ADD_DEVICE path Bjorn Helgaas 2022-01-06 6:44 ` Huacai Chen 2022-01-06 6:44 ` Huacai Chen 2022-01-06 16:20 ` Bjorn Helgaas 2022-01-06 16:20 ` Bjorn Helgaas 2022-01-25 2:51 ` Huacai Chen 2022-01-25 2:51 ` Huacai Chen 2022-01-25 15:38 ` Bjorn Helgaas 2022-01-25 15:38 ` Bjorn Helgaas 2022-01-26 2:25 ` Huacai Chen 2022-01-26 2:25 ` Huacai Chen 2022-01-06 0:06 ` [PATCH v8 05/10] vgaarb: Move non-legacy VGA " Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 06/10] vgaarb: Move disabled VGA device " Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 07/10] vgaarb: Remove empty vga_arb_device_card_gone() Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 08/10] vgaarb: Log bridge control messages when adding devices Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 09/10] vgaarb: Use unsigned format string to print lock counts Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 0:06 ` [PATCH v8 10/10] vgaarb: Replace full MIT license text with SPDX identifier Bjorn Helgaas 2022-01-06 0:06 ` Bjorn Helgaas 2022-01-06 16:30 ` [PATCH v8 00/10] vgaarb: Rework default VGA device selection Bjorn Helgaas 2022-01-06 16:30 ` Bjorn Helgaas 2022-01-08 3:26 ` Huacai Chen 2022-01-08 3:26 ` Huacai Chen 2022-01-31 22:23 ` Bjorn Helgaas 2022-02-01 15:46 ` Maarten Lankhorst 2022-02-07 17:59 ` Bjorn Helgaas 2022-02-07 17:59 ` Bjorn Helgaas 2022-02-08 2:14 ` Huacai Chen 2022-02-08 2:14 ` Huacai Chen 2022-02-14 16:19 ` Bjorn Helgaas 2022-02-14 16:19 ` Bjorn Helgaas
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220106000658.243509-5-helgaas@kernel.org \ --to=helgaas@kernel.org \ --cc=airlied@linux.ie \ --cc=bhelgaas@google.com \ --cc=bonbons@linux-vserver.org \ --cc=chenhuacai@gmail.com \ --cc=chenhuacai@loongson.cn \ --cc=daniel@ffwll.ch \ --cc=dri-devel@lists.freedesktop.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pci@vger.kernel.org \ --cc=lixuefeng@loongson.cn \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.