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