drm: Implement drmCheckModesettingSupported() for FreeBSD

Add the missing implementation of drmCheckModesettingSupported()
to detect KMS support on FreeBSD (and GNU/kFreeBSD).

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=72847
Signed-off-by: Konstantin Belousov <kib@freebsd.org>
Signed-off-by: Robert Millan <rmh@freebsd.org>
main
Robert Millan 2014-01-23 14:46:05 +00:00 committed by Alex Deucher
parent ce62b8e059
commit cbb31f2d6e
2 changed files with 36 additions and 1 deletions

View File

@ -185,6 +185,8 @@ AC_CANONICAL_HOST
if test "x$LIBKMS" = xauto ; then if test "x$LIBKMS" = xauto ; then
case $host_os in case $host_os in
linux*) LIBKMS="yes" ;; linux*) LIBKMS="yes" ;;
freebsd* | kfreebsd*-gnu)
LIBKMS="yes" ;;
*) LIBKMS="no" ;; *) LIBKMS="no" ;;
esac esac
fi fi

View File

@ -723,7 +723,7 @@ int drmModeConnectorSetProperty(int fd, uint32_t connector_id, uint32_t property
*/ */
int drmCheckModesettingSupported(const char *busid) int drmCheckModesettingSupported(const char *busid)
{ {
#ifdef __linux__ #if defined (__linux__)
char pci_dev_dir[1024]; char pci_dev_dir[1024];
int domain, bus, dev, func; int domain, bus, dev, func;
DIR *sysdir; DIR *sysdir;
@ -773,6 +773,39 @@ int drmCheckModesettingSupported(const char *busid)
closedir(sysdir); closedir(sysdir);
if (found) if (found)
return 0; return 0;
#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
char kbusid[1024], sbusid[1024];
char oid[128];
int domain, bus, dev, func;
int i, modesetting, ret;
size_t len;
ret = sscanf(busid, "pci:%04x:%02x:%02x.%d", &domain, &bus, &dev,
&func);
if (ret != 4)
return -EINVAL;
snprintf(kbusid, sizeof(kbusid), "pci:%04x:%02x:%02x.%d", domain, bus,
dev, func);
/* How many GPUs do we expect in the machine ? */
for (i = 0; i < 16; i++) {
snprintf(oid, sizeof(oid), "hw.dri.%d.busid", i);
len = sizeof(sbusid);
ret = sysctlbyname(oid, sbusid, &len, NULL, 0);
if (ret == -1) {
if (errno == ENOENT)
continue;
return -EINVAL;
}
if (strcmp(sbusid, kbusid) != 0)
continue;
snprintf(oid, sizeof(oid), "hw.dri.%d.modesetting", i);
len = sizeof(modesetting);
ret = sysctlbyname(oid, &modesetting, &len, NULL, 0);
if (ret == -1 || len != sizeof(modesetting))
return -EINVAL;
return (modesetting ? 0 : -ENOSYS);
}
#endif #endif
return -ENOSYS; return -ENOSYS;