All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Huacai Chen <chenhuacai@gmail.com>
Cc: "David Airlie" <airlied@linux.ie>,
	linux-pci <linux-pci@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	"Maling list - DRI developers" <dri-devel@lists.freedesktop.org>,
	"Bruno Prémont" <bonbons@linux-vserver.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Xuefeng Li" <lixuefeng@loongson.cn>,
	"Huacai Chen" <chenhuacai@loongson.cn>
Subject: Re: [PATCH v8 04/10] vgaarb: Move framebuffer detection to ADD_DEVICE path
Date: Tue, 25 Jan 2022 09:38:58 -0600	[thread overview]
Message-ID: <20220125153858.GA1609157@bhelgaas> (raw)
In-Reply-To: <CAAhV-H4GAgKh4HBeWQ+LGf2x_uKy_T5MaMv0dNcYXFKVGAZEzw@mail.gmail.com>

[+cc Maarten, Maxime, Thomas; beginning of thread:
https://lore.kernel.org/r/20220106000658.243509-1-helgaas@kernel.org]

On Tue, Jan 25, 2022 at 10:51:15AM +0800, Huacai Chen wrote:
> Hi, Bjorn,
> 
> Why this series still missing in 5.17-rc1? :(

1) It was posted late in the cycle (Jan 6, when the merge window
opened Jan 9), so it was too late to expect a significant change like
this to be merged for v5.17.  Right now is a good time to consider it
again so it would some time in -next.

2) As of now, this code is still in drivers/gpu, and I don't maintain
that area.  It's up to the DRM folks, who are all cc'd here.

I would like to move this from drivers/gpu to drivers/pci, but that
requires a little more work to resolve the initcall ordering problem
with respect to vga_arb_device_init() and misc_init() [1].

Bjorn

[1] https://lore.kernel.org/linux-pci/CAAhV-H7FhAjM-Ha42Z1dLrE4PvC9frfyeU27KHWcyWKkMftEsA@mail.gmail.com/

> On Fri, Jan 7, 2022 at 12:21 AM Bjorn Helgaas <helgaas@kernel.org> wrote:
> >
> > On Thu, Jan 06, 2022 at 02:44:42PM +0800, Huacai Chen wrote:
> > > On Thu, Jan 6, 2022 at 8:07 AM Bjorn Helgaas <helgaas@kernel.org> wrote:
> > > > 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;
> > > > +       }
> > > Maybe it is better to rename vga_is_framebuffer_device() to
> > > vga_is_firmware_device() and rename is_framebuffer to
> > > is_fw_framebuffer?
> >
> > That's a great point, thanks!
> >
> > The "framebuffer" term is way too generic.  *All* VGA devices have a
> > framebuffer, so it adds no information.  This is really about finding
> > the device that was used by firmware.
> >
> > I renamed:
> >
> >   vga_is_framebuffer_device() -> vga_is_firmware_default()
> >   vga_device.is_framebuffer   -> vga_device.is_firmware_default
> >
> > I updated my local branch and pushed it to:
> > https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/log/?h=pci/vga
> > with head 0f4caffa1297 ("vgaarb: Replace full MIT license text with
> > SPDX identifier").
> >
> > I don't maintain drivers/gpu/vga/vgaarb.c, so this branch is just for
> > reference.  It'll ultimately be up to the DRM folks to handle this.
> >
> > I'll wait for any other comments or testing reports before reposting.
> >
> > > >         /*
> > > >          * 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: Huacai Chen <chenhuacai@gmail.com>
Cc: "David Airlie" <airlied@linux.ie>,
	linux-pci <linux-pci@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	"Maling list - DRI developers" <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>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>
Subject: Re: [PATCH v8 04/10] vgaarb: Move framebuffer detection to ADD_DEVICE path
Date: Tue, 25 Jan 2022 09:38:58 -0600	[thread overview]
Message-ID: <20220125153858.GA1609157@bhelgaas> (raw)
In-Reply-To: <CAAhV-H4GAgKh4HBeWQ+LGf2x_uKy_T5MaMv0dNcYXFKVGAZEzw@mail.gmail.com>

[+cc Maarten, Maxime, Thomas; beginning of thread:
https://lore.kernel.org/r/20220106000658.243509-1-helgaas@kernel.org]

On Tue, Jan 25, 2022 at 10:51:15AM +0800, Huacai Chen wrote:
> Hi, Bjorn,
> 
> Why this series still missing in 5.17-rc1? :(

1) It was posted late in the cycle (Jan 6, when the merge window
opened Jan 9), so it was too late to expect a significant change like
this to be merged for v5.17.  Right now is a good time to consider it
again so it would some time in -next.

2) As of now, this code is still in drivers/gpu, and I don't maintain
that area.  It's up to the DRM folks, who are all cc'd here.

I would like to move this from drivers/gpu to drivers/pci, but that
requires a little more work to resolve the initcall ordering problem
with respect to vga_arb_device_init() and misc_init() [1].

Bjorn

[1] https://lore.kernel.org/linux-pci/CAAhV-H7FhAjM-Ha42Z1dLrE4PvC9frfyeU27KHWcyWKkMftEsA@mail.gmail.com/

> On Fri, Jan 7, 2022 at 12:21 AM Bjorn Helgaas <helgaas@kernel.org> wrote:
> >
> > On Thu, Jan 06, 2022 at 02:44:42PM +0800, Huacai Chen wrote:
> > > On Thu, Jan 6, 2022 at 8:07 AM Bjorn Helgaas <helgaas@kernel.org> wrote:
> > > > 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;
> > > > +       }
> > > Maybe it is better to rename vga_is_framebuffer_device() to
> > > vga_is_firmware_device() and rename is_framebuffer to
> > > is_fw_framebuffer?
> >
> > That's a great point, thanks!
> >
> > The "framebuffer" term is way too generic.  *All* VGA devices have a
> > framebuffer, so it adds no information.  This is really about finding
> > the device that was used by firmware.
> >
> > I renamed:
> >
> >   vga_is_framebuffer_device() -> vga_is_firmware_default()
> >   vga_device.is_framebuffer   -> vga_device.is_firmware_default
> >
> > I updated my local branch and pushed it to:
> > https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/log/?h=pci/vga
> > with head 0f4caffa1297 ("vgaarb: Replace full MIT license text with
> > SPDX identifier").
> >
> > I don't maintain drivers/gpu/vga/vgaarb.c, so this branch is just for
> > reference.  It'll ultimately be up to the DRM folks to handle this.
> >
> > I'll wait for any other comments or testing reports before reposting.
> >
> > > >         /*
> > > >          * 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
> > > >

  reply	other threads:[~2022-01-25 15:39 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 ` [PATCH v8 04/10] vgaarb: Move framebuffer detection to ADD_DEVICE path Bjorn Helgaas
2022-01-06  0:06   ` 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 [this message]
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=20220125153858.GA1609157@bhelgaas \
    --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=dri-devel@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lixuefeng@loongson.cn \
    --cc=tzimmermann@suse.de \
    /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: link
Be 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.