From: Mario Limonciello <mario.limonciello@amd.com>
Knowing which device is the primary device can be useful for userspace
to make decisions on which device to start a display server.
Create a link to that device called 'primary_device'.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/video/fbdev/core/fbcon.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 2df48037688d1..46f21570723e5 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2934,7 +2934,7 @@ static void fbcon_select_primary(struct fb_info *info)
{
if (!map_override && primary_device == -1 &&
video_is_primary_device(info->device)) {
- int i;
+ int i, r;
printk(KERN_INFO "fbcon: %s (fb%i) is primary device\n",
info->fix.id, info->node);
@@ -2949,6 +2949,10 @@ static void fbcon_select_primary(struct fb_info *info)
first_fb_vc + 1, last_fb_vc + 1);
info_idx = primary_device;
}
+ r = sysfs_create_link(&fbcon_device->kobj, &info->device->kobj,
+ "primary_device");
+ if (r)
+ pr_err("fbcon: Failed to link to primary device: %d\n", r);
}
}
@@ -3376,6 +3380,10 @@ void __init fb_console_init(void)
void __exit fb_console_exit(void)
{
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
+ if (primary_device != -1)
+ sysfs_remove_link(&fbcon_device->kobj, "primary_device");
+#endif
#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
console_lock();
if (deferred_takeover)
--
2.43.0
Hi Am 20.06.25 um 04:49 schrieb Mario Limonciello: > From: Mario Limonciello <mario.limonciello@amd.com> > > Knowing which device is the primary device can be useful for userspace > to make decisions on which device to start a display server. > > Create a link to that device called 'primary_device'. > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > --- > drivers/video/fbdev/core/fbcon.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c > index 2df48037688d1..46f21570723e5 100644 > --- a/drivers/video/fbdev/core/fbcon.c > +++ b/drivers/video/fbdev/core/fbcon.c You cannot rely on this, as fbcon might be disabled entirely. Best regards Thomas > @@ -2934,7 +2934,7 @@ static void fbcon_select_primary(struct fb_info *info) > { > if (!map_override && primary_device == -1 && > video_is_primary_device(info->device)) { > - int i; > + int i, r; > > printk(KERN_INFO "fbcon: %s (fb%i) is primary device\n", > info->fix.id, info->node); > @@ -2949,6 +2949,10 @@ static void fbcon_select_primary(struct fb_info *info) > first_fb_vc + 1, last_fb_vc + 1); > info_idx = primary_device; > } > + r = sysfs_create_link(&fbcon_device->kobj, &info->device->kobj, > + "primary_device"); > + if (r) > + pr_err("fbcon: Failed to link to primary device: %d\n", r); > } > > } > @@ -3376,6 +3380,10 @@ void __init fb_console_init(void) > > void __exit fb_console_exit(void) > { > +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY > + if (primary_device != -1) > + sysfs_remove_link(&fbcon_device->kobj, "primary_device"); > +#endif > #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER > console_lock(); > if (deferred_takeover) -- -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg)
On 6/20/25 3:47 AM, Thomas Zimmermann wrote: > Hi > > Am 20.06.25 um 04:49 schrieb Mario Limonciello: >> From: Mario Limonciello <mario.limonciello@amd.com> >> >> Knowing which device is the primary device can be useful for userspace >> to make decisions on which device to start a display server. >> >> Create a link to that device called 'primary_device'. >> >> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >> --- >> drivers/video/fbdev/core/fbcon.c | 10 +++++++++- >> 1 file changed, 9 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/ >> core/fbcon.c >> index 2df48037688d1..46f21570723e5 100644 >> --- a/drivers/video/fbdev/core/fbcon.c >> +++ b/drivers/video/fbdev/core/fbcon.c > > You cannot rely on this, as fbcon might be disabled entirely. So the other idea I had was to have a new file boot_console. How would you feel about this instead (or even in addition to the symlink)? diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 268c69daa4d5..8535950b4c0f 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -30,6 +30,7 @@ #include <linux/msi.h> #include <linux/of.h> #include <linux/aperture.h> +#include <asm/video.h> #include "pci.h" #ifndef ARCH_PCI_DEV_GROUPS @@ -679,6 +680,13 @@ const struct attribute_group *pcibus_groups[] = { NULL, }; +static ssize_t boot_console_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%u\n", video_is_primary_device(dev)); +} +static DEVICE_ATTR_RO(boot_console); + static ssize_t boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -1698,6 +1706,7 @@ late_initcall(pci_sysfs_init); static struct attribute *pci_dev_dev_attrs[] = { &dev_attr_boot_vga.attr, + &dev_attr_boot_console.attr, NULL, }; @@ -1710,6 +1719,9 @@ static umode_t pci_dev_attrs_are_visible(struct kobject *kobj, if (a == &dev_attr_boot_vga.attr && pci_is_vga(pdev)) return a->mode; + if (a == &dev_attr_boot_console.attr && pci_is_display(pdev)) + return a->mode; + return 0; } > > Best regards > Thomas > >> @@ -2934,7 +2934,7 @@ static void fbcon_select_primary(struct fb_info >> *info) >> { >> if (!map_override && primary_device == -1 && >> video_is_primary_device(info->device)) { >> - int i; >> + int i, r; >> printk(KERN_INFO "fbcon: %s (fb%i) is primary device\n", >> info->fix.id, info->node); >> @@ -2949,6 +2949,10 @@ static void fbcon_select_primary(struct fb_info >> *info) >> first_fb_vc + 1, last_fb_vc + 1); >> info_idx = primary_device; >> } >> + r = sysfs_create_link(&fbcon_device->kobj, &info->device->kobj, >> + "primary_device"); >> + if (r) >> + pr_err("fbcon: Failed to link to primary device: %d\n", r); >> } >> } >> @@ -3376,6 +3380,10 @@ void __init fb_console_init(void) >> void __exit fb_console_exit(void) >> { >> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY >> + if (primary_device != -1) >> + sysfs_remove_link(&fbcon_device->kobj, "primary_device"); >> +#endif >> #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER >> console_lock(); >> if (deferred_takeover) >
Hi Am 20.06.25 um 17:56 schrieb Mario Limonciello: > On 6/20/25 3:47 AM, Thomas Zimmermann wrote: >> Hi >> >> Am 20.06.25 um 04:49 schrieb Mario Limonciello: >>> From: Mario Limonciello <mario.limonciello@amd.com> >>> >>> Knowing which device is the primary device can be useful for userspace >>> to make decisions on which device to start a display server. >>> >>> Create a link to that device called 'primary_device'. >>> >>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>> --- >>> drivers/video/fbdev/core/fbcon.c | 10 +++++++++- >>> 1 file changed, 9 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/ >>> core/fbcon.c >>> index 2df48037688d1..46f21570723e5 100644 >>> --- a/drivers/video/fbdev/core/fbcon.c >>> +++ b/drivers/video/fbdev/core/fbcon.c >> >> You cannot rely on this, as fbcon might be disabled entirely. > > So the other idea I had was to have a new file boot_console. 'console' already has a meaning, so I'd prefer boot_display. Apart from naming, this is a good idea. > > How would you feel about this instead (or even in addition to the > symlink)? We likely won't need the symlink then. Best regards Thomas > > diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c > index 268c69daa4d5..8535950b4c0f 100644 > --- a/drivers/pci/pci-sysfs.c > +++ b/drivers/pci/pci-sysfs.c > @@ -30,6 +30,7 @@ > #include <linux/msi.h> > #include <linux/of.h> > #include <linux/aperture.h> > +#include <asm/video.h> > #include "pci.h" > > #ifndef ARCH_PCI_DEV_GROUPS > @@ -679,6 +680,13 @@ const struct attribute_group *pcibus_groups[] = { > NULL, > }; > > +static ssize_t boot_console_show(struct device *dev, struct > device_attribute *attr, > + char *buf) > +{ > + return sysfs_emit(buf, "%u\n", video_is_primary_device(dev)); > +} > +static DEVICE_ATTR_RO(boot_console); > + > static ssize_t boot_vga_show(struct device *dev, struct > device_attribute *attr, > char *buf) > { > @@ -1698,6 +1706,7 @@ late_initcall(pci_sysfs_init); > > static struct attribute *pci_dev_dev_attrs[] = { > &dev_attr_boot_vga.attr, > + &dev_attr_boot_console.attr, > NULL, > }; > > @@ -1710,6 +1719,9 @@ static umode_t pci_dev_attrs_are_visible(struct > kobject *kobj, > if (a == &dev_attr_boot_vga.attr && pci_is_vga(pdev)) > return a->mode; > > + if (a == &dev_attr_boot_console.attr && pci_is_display(pdev)) > + return a->mode; > + > return 0; > } > > >> >> Best regards >> Thomas >> >>> @@ -2934,7 +2934,7 @@ static void fbcon_select_primary(struct >>> fb_info *info) >>> { >>> if (!map_override && primary_device == -1 && >>> video_is_primary_device(info->device)) { >>> - int i; >>> + int i, r; >>> printk(KERN_INFO "fbcon: %s (fb%i) is primary device\n", >>> info->fix.id, info->node); >>> @@ -2949,6 +2949,10 @@ static void fbcon_select_primary(struct >>> fb_info *info) >>> first_fb_vc + 1, last_fb_vc + 1); >>> info_idx = primary_device; >>> } >>> + r = sysfs_create_link(&fbcon_device->kobj, >>> &info->device->kobj, >>> + "primary_device"); >>> + if (r) >>> + pr_err("fbcon: Failed to link to primary device: %d\n", >>> r); >>> } >>> } >>> @@ -3376,6 +3380,10 @@ void __init fb_console_init(void) >>> void __exit fb_console_exit(void) >>> { >>> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY >>> + if (primary_device != -1) >>> + sysfs_remove_link(&fbcon_device->kobj, "primary_device"); >>> +#endif >>> #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER >>> console_lock(); >>> if (deferred_takeover) >> > -- -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg)
© 2016 - 2025 Red Hat, Inc.