#include "log.h"
#include "shl_dlist.h"
#include "uterm.h"
-#include "uterm_pci.h"
#include "uterm_systemd_internal.h"
#include "uterm_video_internal.h"
struct uterm_sd *sd;
struct ev_fd *sd_mon_fd;
- char *pci_primary_id;
-
struct udev *udev;
struct udev_monitor *umon;
struct ev_fd *umon_fd;
return flags;
}
-static bool is_drm_primary(struct uterm_monitor *mon, const char *node, int fd)
+static bool is_drm_primary(struct uterm_monitor *mon, struct udev_device *dev,
+ const char *node)
{
- char *id;
- bool res;
-
- if (!mon->pci_primary_id)
- return false;
-
- id = video_drm_get_id(fd);
- if (!id) {
- log_warning("cannot get bus-id for DRM device %s (%d): %m",
- node, errno);
- return false;
+ struct udev_device *pci;
+ const char *id;
+
+ pci = udev_device_get_parent_with_subsystem_devtype(dev, "pci", NULL);
+ if (pci) {
+ id = udev_device_get_sysattr_value(pci, "boot_vga");
+ if (id && !strcmp(id, "1")) {
+ log_debug("DRM device %s is primary PCI GPU", node);
+ return true;
+ }
}
- res = !strcmp(id, mon->pci_primary_id);
- video_drm_free_id(id);
-
- if (res)
- log_debug("DRM device %s is primary PCI GPU", node);
- return res;
+ return false;
}
static bool is_drm_usb(struct uterm_monitor *mon, const char *node, int fd)
return res;
}
-static unsigned int get_drm_flags(struct uterm_monitor *mon, const char *node)
+static unsigned int get_drm_flags(struct uterm_monitor *mon,
+ struct udev_device *dev, const char *node)
{
int fd;
unsigned int flags = 0;
return flags;
}
- if (is_drm_primary(mon, node, fd))
+ if (is_drm_primary(mon, dev, node))
flags |= UTERM_MONITOR_PRIMARY;
if (is_drm_usb(mon, node, fd))
flags |= UTERM_MONITOR_AUX;
}
sname = udev_device_get_property_value(dev, "ID_SEAT");
type = UTERM_MONITOR_DRM;
- flags = get_drm_flags(mon, node);
+ flags = get_drm_flags(mon, dev, node);
} else if (!strcmp(subs, "graphics")) {
if (mon->sd && udev_device_has_tag(dev, "seat") != 1) {
log_debug("adding non-seat'ed device %s", name);
mon->data = data;
shl_dlist_init(&mon->seats);
- ret = uterm_pci_get_primary_id(&mon->pci_primary_id);
- if (ret)
- log_warning("cannot get PCI primary ID");
-
ret = monitor_sd_init(mon);
if (ret)
goto err_free;
err_sd:
monitor_sd_deinit(mon);
err_free:
- free(mon->pci_primary_id);
free(mon);
return ret;
}
udev_unref(mon->udev);
monitor_sd_deinit(mon);
ev_eloop_unref(mon->eloop);
- free(mon->pci_primary_id);
free(mon);
}