* Rob Clark <robclark@freedesktop.org>
*/
+#include <sys/stat.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
+#ifdef USE_DRICONF
+#include "xmlconfig.h"
+#include "xmlpool.h"
+#endif
#endif
#ifdef HAVE_SYSFS
-#include <sys/stat.h>
#include <sys/types.h>
#endif
#include "loader.h"
}
pci_id = udev_device_get_property_value(parent, "PCI_ID");
- if (pci_id == NULL ||
- sscanf(pci_id, "%x:%x", vendor_id, chip_id) != 2) {
- log_(_LOADER_WARNING, "MESA-LOADER: malformed or no PCI ID\n");
+ if (pci_id == NULL) {
+ log_(_LOADER_INFO, "MESA-LOADER: no PCI ID\n");
+ *chip_id = -1;
+ goto out;
+ } else if (sscanf(pci_id, "%x:%x", vendor_id, chip_id) != 2) {
+ log_(_LOADER_WARNING, "MESA-LOADER: malformed PCI ID\n");
*chip_id = -1;
goto out;
}
return fd;
}
+#ifdef USE_DRICONF
+const char __driConfigOptionsLoader[] =
+DRI_CONF_BEGIN
+ DRI_CONF_SECTION_INITIALIZATION
+ DRI_CONF_DEVICE_ID_PATH_TAG()
+ DRI_CONF_SECTION_END
+DRI_CONF_END;
+#endif
+
int loader_get_user_preferred_fd(int default_fd, int *different_device)
{
struct udev *udev;
+#ifdef USE_DRICONF
+ driOptionCache defaultInitOptions;
+ driOptionCache userInitOptions;
+#endif
const char *dri_prime = getenv("DRI_PRIME");
char *prime = NULL;
int is_different_device = 0, fd = default_fd;
if (dri_prime)
prime = strdup(dri_prime);
+#ifdef USE_DRICONF
+ else {
+ driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader);
+ driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0, "loader");
+ if (driCheckOption(&userInitOptions, "device_id", DRI_STRING))
+ prime = strdup(driQueryOptionstr(&userInitOptions, "device_id"));
+ driDestroyOptionCache(&userInitOptions);
+ driDestroyOptionInfo(&defaultInitOptions);
+ }
+#endif
if (prime == NULL) {
*different_device = 0;
}
fd = drm_open_device(device_name);
- if (fd > 0) {
+ if (fd >= 0) {
close(default_fd);
} else {
fd = default_fd;
(struct udev_device *));
UDEV_SYMBOL(struct udev *, udev_unref, (struct udev *));
+ if (dlsym_failed)
+ return NULL;
+
udev = udev_new();
device = udev_device_new_from_fd(udev, fd);
if (device == NULL)