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
parent
ce62b8e059
commit
cbb31f2d6e
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue