Re: [PATCH] PCI/sysfs: add write attribute for boot_vga

From: Kai-Heng Feng
Date: Sun Sep 26 2021 - 23:57:49 EST


On Mon, Sep 27, 2021 at 11:46 AM 李真能 <lizhenneng@xxxxxxxxxx> wrote:
>
>
> 在 2021/9/27 上午4:20, Bjorn Helgaas 写道:
> > On Sun, Sep 26, 2021 at 03:15:39PM +0800, Zhenneng Li wrote:
> >> Add writing attribute for boot_vga sys node,
> >> so we can config default video display
> >> output dynamically when there are two video
> >> cards on a machine.
> >>
> >> Xorg server will determine running on which
> >> video card based on boot_vga node's value.
> > When you repost this, please take a look at the git commit log history
> > and make yours similar. Specifically, the subject should start with a
> > capital letter, and the body should be rewrapped to fill 75
> > characters.
> >
> > Please contrast this with the existing VGA arbiter. See
> > Documentation/gpu/vgaarbiter.rst. It sounds like this may overlap
> > with the VGA arbiter functionality, so this should explain why we need
> > both and how they interact.
>
> "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. ", this is
> the explain of config VGA_ARB, that is to say, some legacy vga devices
> need use the same pci bus address, if user app(such as xorg) want access
> card A, but card A and card B have same bus address, then VGA
> agaarbiter will determine will card to be accessed.
>
> And xorg will read boot_vga to determine which graphics card is the
> primary graphics output device.
>
> That is the difference about boot_vga and vgaarbiter.

So does kernel select the wrong card for boot VGA?
Or is this a feature that to switch Xorg's graphics renderer?
>From what you described, it seems to be the latter one, and I think it
should be implemented in Xorg.

Kai-Heng

>
>
>
> >
> >> Signed-off-by: Zhenneng Li <lizhenneng@xxxxxxxxxx>
> >> ---
> >> drivers/pci/pci-sysfs.c | 24 +++++++++++++++++++++++-
> >> 1 file changed, 23 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
> >> index 7bbf2673c7f2..a6ba19ce7adb 100644
> >> --- a/drivers/pci/pci-sysfs.c
> >> +++ b/drivers/pci/pci-sysfs.c
> >> @@ -664,7 +664,29 @@ static ssize_t boot_vga_show(struct device *dev, struct device_attribute *attr,
> >> !!(pdev->resource[PCI_ROM_RESOURCE].flags &
> >> IORESOURCE_ROM_SHADOW));
> >> }
> >> -static DEVICE_ATTR_RO(boot_vga);
> >> +
> >> +static ssize_t boot_vga_store(struct device *dev, struct device_attribute *attr,
> >> + const char *buf, size_t count)
> >> +{
> >> + unsigned long val;
> >> + struct pci_dev *pdev = to_pci_dev(dev);
> >> + struct pci_dev *vga_dev = vga_default_device();
> >> +
> >> + if (kstrtoul(buf, 0, &val) < 0)
> >> + return -EINVAL;
> >> +
> >> + if (val != 1)
> >> + return -EINVAL;
> >> +
> >> + if (!capable(CAP_SYS_ADMIN))
> >> + return -EPERM;
> >> +
> >> + if (pdev != vga_dev)
> >> + vga_set_default_device(pdev);
> >> +
> >> + return count;
> >> +}
> >> +static DEVICE_ATTR_RW(boot_vga);
> >>
> >> static ssize_t pci_read_config(struct file *filp, struct kobject *kobj,
> >> struct bin_attribute *bin_attr, char *buf,
> >> --
> >> 2.25.1
> >>
> >>
> >> No virus found
> >> Checked by Hillstone Network AntiVirus