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
|
||||
case $host_os in
|
||||
linux*) LIBKMS="yes" ;;
|
||||
freebsd* | kfreebsd*-gnu)
|
||||
LIBKMS="yes" ;;
|
||||
*) LIBKMS="no" ;;
|
||||
esac
|
||||
fi
|
||||
|
|
|
@ -723,7 +723,7 @@ int drmModeConnectorSetProperty(int fd, uint32_t connector_id, uint32_t property
|
|||
*/
|
||||
int drmCheckModesettingSupported(const char *busid)
|
||||
{
|
||||
#ifdef __linux__
|
||||
#if defined (__linux__)
|
||||
char pci_dev_dir[1024];
|
||||
int domain, bus, dev, func;
|
||||
DIR *sysdir;
|
||||
|
@ -773,6 +773,39 @@ int drmCheckModesettingSupported(const char *busid)
|
|||
closedir(sysdir);
|
||||
if (found)
|
||||
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
|
||||
return -ENOSYS;
|
||||
|
||||
|
|
Loading…
Reference in New Issue