Commit 7df7b728 authored by Mario Limonciello (AMD)'s avatar Mario Limonciello (AMD)
Browse files

DRM: Add a new 'boot_display' attribute



On systems with multiple GPUs there can be uncertainty which GPU is the
primary one used to drive the display at bootup. In some desktop
environments this can lead to increased power consumption because
secondary GPUs may be used for rendering and never go to a low power
state. In order to disambiguate this add a new sysfs attribute
'boot_display' that uses the output of video_is_primary_device() to
populate whether the PCI device was used for driving the display.

Suggested-by: default avatarManivannan Sadhasivam <mani@kernel.org>
Acked-by: default avatarManivannan Sadhasivam <mani@kernel.org>
Link: https://gitlab.freedesktop.org/xorg/lib/libpciaccess/-/issues/23


Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: https://lore.kernel.org/r/20250811162606.587759-5-superm1@kernel.org


Signed-off-by: default avatarMario Limonciello (AMD) <superm1@kernel.org>
parent ad90860b
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
What:		/sys/class/drm/.../boot_display
Date:		January 2026
Contact:	Linux DRI developers <dri-devel@vger.kernel.org>
Description:
		This file indicates that displays connected to the device were
		used to display the boot sequence.  If a display connected to
		the device was used to display the boot sequence the file will
		be present and contain "1".
+41 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/gfp.h>
#include <linux/i2c.h>
#include <linux/kdev_t.h>
#include <linux/pci.h>
#include <linux/property.h>
#include <linux/slab.h>

@@ -30,6 +31,8 @@
#include <drm/drm_property.h>
#include <drm/drm_sysfs.h>

#include <asm/video.h>

#include "drm_internal.h"
#include "drm_crtc_internal.h"

@@ -508,6 +511,43 @@ void drm_sysfs_connector_property_event(struct drm_connector *connector,
}
EXPORT_SYMBOL(drm_sysfs_connector_property_event);

static ssize_t boot_display_show(struct device *dev, struct device_attribute *attr,
				 char *buf)
{
	return sysfs_emit(buf, "1\n");
}
static DEVICE_ATTR_RO(boot_display);

static struct attribute *display_attrs[] = {
	&dev_attr_boot_display.attr,
	NULL
};

static umode_t boot_display_visible(struct kobject *kobj,
				    struct attribute *a, int n)
{
	struct device *dev = kobj_to_dev(kobj)->parent;

	if (dev_is_pci(dev)) {
		struct pci_dev *pdev = to_pci_dev(dev);

		if (video_is_primary_device(&pdev->dev))
			return a->mode;
	}

	return 0;
}

static const struct attribute_group display_attr_group = {
	.attrs = display_attrs,
	.is_visible = boot_display_visible,
};

static const struct attribute_group *card_dev_groups[] = {
	&display_attr_group,
	NULL
};

struct device *drm_sysfs_minor_alloc(struct drm_minor *minor)
{
	const char *minor_str;
@@ -531,6 +571,7 @@ struct device *drm_sysfs_minor_alloc(struct drm_minor *minor)

		kdev->devt = MKDEV(DRM_MAJOR, minor->index);
		kdev->class = drm_class;
		kdev->groups = card_dev_groups;
		kdev->type = &drm_sysfs_device_minor;
	}