Ravenports generated: 15 Jan 2020 17:51
[ravenports.git] / bucket_CD / libdrm
1 # Buildsheet autogenerated by ravenadm tool -- Do not edit.
2
3 NAMEBASE=               libdrm
4 VERSION=                2.4.100
5 KEYWORDS=               graphics x11
6 VARIANTS=               standard
7 SDESC[standard]=        Direct Rendering Module services kernel interface
8 HOMEPAGE=               https://dri.freedesktop.org
9 CONTACT=                nobody
10
11 DOWNLOAD_GROUPS=        main
12 SITES[main]=            http://dri.freedesktop.org/libdrm/
13 DISTFILE[1]=            libdrm-2.4.100.tar.bz2:main
14 DF_INDEX=               1
15 SPKGS[standard]=        single
16
17 OPTIONS_AVAILABLE=      ARM X86
18 OPTIONS_STANDARD=       ARM X86
19 OPT_ON[aarch64]=        ARM
20 OPT_ON[x86_64]=         X86
21 OPT_ON[i386]=           X86
22
23 BUILD_DEPENDS=          libpthread-stubs:single:standard
24                         docbook-xsl:primary:standard
25                         libxslt:single:standard
26                         libxml2:single:standard
27
28 USES=                   gmake libtool pkgconfig solaris-funcs
29 XORG_COMPONENTS=        pciaccess
30
31 LICENSE=                MIT:single
32 LICENSE_FILE=           MIT:{{WRKDIR}}/LICENSE_MIT
33 LICENSE_AWK=            MIT:"_XF86DRM_H_"
34 LICENSE_SOURCE=         MIT:{{WRKSRC}}/xf86drm.h
35 LICENSE_SCHEME=         solo
36
37 FPC_EQUIVALENT=         graphics/libdrm
38 SOL_FUNCTIONS=          getline:amdgpu/amdgpu_asic_id.c
39                         asprintf:tests/modetest/modetest.c
40                         strndup:tests/modetest/modetest.c
41
42 MUST_CONFIGURE=         gnu
43 CONFIGURE_ARGS=         --disable-cairo-tests
44                         --enable-install-test-programs
45                         --enable-manpages
46                         MISC_MAN_SUFFIX=7
47
48 INSTALL_TARGET=         install-strip
49 INSTALL_REQ_TOOLCHAIN=  yes
50
51 [X86].DESCRIPTION=                      DRM Drivers for amd64 and i386 architectures
52
53 [ARM].DESCRIPTION=                      DRM Drivers for AARCH64 architecture
54
55 post-patch:
56         ${REINPLACE_CMD} \
57                 -e '/^MANPAGES_STYLESHEET=/ s|".*"|"http://cdn.docbook.org/release/xsl/current/manpages/docbook.xsl"|' \
58                 ${WRKSRC}/configure
59
60 [FILE:70:descriptions/desc.single]
61 Userspace interface to kernel DRM (Direct Rendering Module) services.
62
63
64 [FILE:101:distinfo]
65 c77cc828186c9ceec3e56ae202b43ee99eb932b4a87255038a80e8a1060d0a5d       855793 libdrm-2.4.100.tar.bz2
66
67
68 [FILE:2195:manifests/plist.single]
69 %%ARM-ON%%include/freedreno/
70  freedreno_drmif.h
71  freedreno_ringbuffer.h
72 %%ARM-ON%%include/libdrm/
73  vc4_packet.h
74  vc4_qpu_defines.h
75 %%ARM-ON%%lib/
76  libdrm_freedreno.so
77  libdrm_freedreno.so.1
78  libdrm_freedreno.so.1.0.0
79 %%ARM-ON%%lib/pkgconfig/
80  libdrm_freedreno.pc
81  libdrm_vc4.pc
82 %%ONLY-DRAGONFLY%%bin/kmstest
83 %%ONLY-DRAGONFLY%%include/libkms/libkms.h
84 %%ONLY-DRAGONFLY%%lib/
85  libkms.so
86  libkms.so.1
87  libkms.so.1.0.0
88 %%ONLY-DRAGONFLY%%lib/pkgconfig/libkms.pc
89 %%ONLY-FREEBSD%%bin/kmstest
90 %%ONLY-FREEBSD%%include/libkms/libkms.h
91 %%ONLY-FREEBSD%%lib/
92  libkms.so
93  libkms.so.1
94  libkms.so.1.0.0
95 %%ONLY-FREEBSD%%lib/pkgconfig/libkms.pc
96 %%ONLY-LINUX%%bin/kmstest
97 %%ONLY-LINUX%%include/libkms/libkms.h
98 %%ONLY-LINUX%%lib/
99  libkms.so
100  libkms.so.1
101  libkms.so.1.0.0
102 %%ONLY-LINUX%%lib/pkgconfig/libkms.pc
103 %%X86-ON%%include/libdrm/
104  amdgpu.h
105  amdgpu_drm.h
106  intel_aub.h
107  intel_bufmgr.h
108  intel_debug.h
109  r600_pci_ids.h
110  radeon_bo.h
111  radeon_bo_gem.h
112  radeon_bo_int.h
113  radeon_cs.h
114  radeon_cs_gem.h
115  radeon_cs_int.h
116  radeon_surface.h
117 %%X86-ON%%include/libdrm/nouveau/nouveau.h
118 %%X86-ON%%include/libdrm/nouveau/nvif/
119  cl0080.h
120  cl9097.h
121  class.h
122  if0002.h
123  if0003.h
124  ioctl.h
125  unpack.h
126 %%X86-ON%%lib/
127  libdrm_amdgpu.so
128  libdrm_amdgpu.so.1
129  libdrm_amdgpu.so.1.0.0
130  libdrm_intel.so
131  libdrm_intel.so.1
132  libdrm_intel.so.1.0.0
133  libdrm_nouveau.so
134  libdrm_nouveau.so.2
135  libdrm_nouveau.so.2.0.0
136  libdrm_radeon.so
137  libdrm_radeon.so.1
138  libdrm_radeon.so.1.0.1
139 %%X86-ON%%lib/pkgconfig/
140  libdrm_amdgpu.pc
141  libdrm_intel.pc
142  libdrm_nouveau.pc
143  libdrm_radeon.pc
144 %%X86-ON%%share/libdrm/amdgpu.ids
145 bin/
146  drmdevice
147  kms-steal-crtc
148  kms-universal-planes
149  modeprint
150  modetest
151  proptest
152  vbltest
153 include/
154  libsync.h
155  xf86drm.h
156  xf86drmMode.h
157 include/libdrm/
158  drm.h
159  drm_fourcc.h
160  drm_mode.h
161  drm_sarea.h
162  i915_drm.h
163  mach64_drm.h
164  mga_drm.h
165  msm_drm.h
166  nouveau_drm.h
167  qxl_drm.h
168  r128_drm.h
169  radeon_drm.h
170  savage_drm.h
171  sis_drm.h
172  tegra_drm.h
173  vc4_drm.h
174  via_drm.h
175  virtgpu_drm.h
176  vmwgfx_drm.h
177 lib/
178  libdrm.so
179  libdrm.so.2
180  libdrm.so.2.4.0
181 lib/pkgconfig/libdrm.pc
182 share/man/man3/
183  drmAvailable.3.gz
184  drmHandleEvent.3.gz
185  drmModeGetResources.3.gz
186 share/man/man7/
187  drm-gem.7.gz
188  drm-kms.7.gz
189  drm-memory.7.gz
190  drm-mm.7.gz
191  drm-ttm.7.gz
192  drm.7.gz
193
194
195 [FILE:834:patches/patch-amdgpu_amdgpu__device.c]
196 --- amdgpu/amdgpu_device.c.orig 2019-10-16 21:36:48 UTC
197 +++ amdgpu/amdgpu_device.c
198 @@ -177,7 +177,12 @@ drm_public int amdgpu_device_initialize(
199                         return r;
200                 }
201                 if ((flag_auth) && (!flag_authexist)) {
202 +#ifdef F_DUPFD_CLOEXEC
203                         dev->flink_fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
204 +#else
205 +                       dev->flink_fd = fcntl(fd, F_DUPFD, 0);
206 +                       fcntl(dev->flink_fd, F_SETFD, FD_CLOEXEC);
207 +#endif
208                 }
209                 *major_version = dev->major_version;
210                 *minor_version = dev->minor_version;
211 @@ -211,7 +216,12 @@ drm_public int amdgpu_device_initialize(
212                 goto cleanup;
213         }
214  
215 +#ifdef F_DUPFD_CLOEXEC
216         dev->fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
217 +#else
218 +       dev->fd = fcntl(fd, F_DUPFD, 0);
219 +       fcntl(dev->fd, F_SETFD, FD_CLOEXEC);
220 +#endif
221         dev->flink_fd = dev->fd;
222         dev->major_version = version->version_major;
223         dev->minor_version = version->version_minor;
224
225
226 [FILE:283:patches/patch-include_drm_drm.h]
227 --- include/drm/drm.h.orig      2019-10-16 21:36:48 UTC
228 +++ include/drm/drm.h
229 @@ -699,7 +699,11 @@ struct drm_set_client_cap {
230  };
231  
232  #define DRM_RDWR O_RDWR
233 +#ifdef __sun__
234 +#define DRM_CLOEXEC 0
235 +#else
236  #define DRM_CLOEXEC O_CLOEXEC
237 +#endif
238  struct drm_prime_handle {
239         __u32 handle;
240  
241
242
243 [FILE:691:patches/patch-intel_intel__bufmgr__gem.c]
244 --- intel/intel_bufmgr_gem.c.orig       2019-10-16 21:36:48 UTC
245 +++ intel/intel_bufmgr_gem.c
246 @@ -1005,6 +1005,27 @@ drm_intel_gem_bo_alloc_userptr(drm_intel
247         return &bo_gem->bo;
248  }
249  
250 +#ifdef __sun__
251 +#define posix_memalign illumos_memalign
252 +static int
253 +posix_memalign(void **memptr, size_t alignment, size_t size)
254 +{
255 +       void *ptr = NULL;
256 +       int error = 0;
257 +
258 +       if (alignment == 0 ||
259 +           (alignment & (sizeof (void *) - 1)) != 0 ||
260 +           (alignment & (alignment - 1)) != 0)
261 +               error = EINVAL;
262 +       else if (size != 0 &&
263 +           (ptr = memalign(alignment, size)) == NULL)
264 +               error = ENOMEM;
265 +
266 +       *memptr = ptr;
267 +       return (error);
268 +}
269 +#endif
270 +
271  static bool
272  has_userptr(drm_intel_bufmgr_gem *bufmgr_gem)
273  {
274
275
276 [FILE:379:patches/patch-intel_test__decode.c]
277 --- intel/test_decode.c.orig    2019-10-16 21:36:48 UTC
278 +++ intel/test_decode.c
279 @@ -28,7 +28,13 @@
280  #include <fcntl.h>
281  #include <sys/types.h>
282  #include <sys/stat.h>
283 +#ifdef __sun__
284 +#define errx(exitcode, format, args...) \
285 +       { fprintf(stderr, format "\n", ## args); \
286 +         exit(exitcode); }
287 +#else
288  #include <err.h>
289 +#endif
290  
291  #include "libdrm_macros.h"
292  #include "intel_bufmgr.h"
293
294
295 [FILE:852:patches/patch-libkms_vmwgfx.c]
296 # the defintion of ERESTART is behind a check for _KERNEL, but
297 # defining that causes errno to not be defined. fortunately, there's
298 # an alternative switch. unfortunately, those differ by platform and
299 # _WANT_KERNEL_ERRNO is too recent to be part of any release, so just
300 # define ERESTART if we still don't have it after including errno.h 
301 #
302 --- libkms/vmwgfx.c.orig        2019-10-16 21:36:48 UTC
303 +++ libkms/vmwgfx.c
304 @@ -26,10 +26,18 @@
305   **************************************************************************/
306  
307  
308 +#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
309 +#define _WANT_KERNEL_ERRNO
310 +#elif defined(__DragonFly__)
311 +#define _KERNEL_STRUCTURES
312 +#endif
313  #include <errno.h>
314  #include <stdlib.h>
315  #include <string.h>
316  #include "internal.h"
317 +#ifndef ERESTART
318 +#define ERESTART (-1)
319 +#endif
320  
321  #include "xf86drm.h"
322  #include "libdrm_macros.h"
323
324
325 [FILE:521:patches/patch-libsync.h]
326 define ETIME as ETIMEOUT same as done in mesa
327
328 --- libsync.h.orig      2019-10-16 21:36:48 UTC
329 +++ libsync.h
330 @@ -35,6 +35,9 @@
331  #include <sys/ioctl.h>
332  #include <sys/poll.h>
333  #include <unistd.h>
334 +#ifndef ETIME
335 +#define ETIME ETIMEDOUT
336 +#endif
337  
338  #if defined(__cplusplus)
339  extern "C" {
340 @@ -53,6 +56,9 @@ struct sync_merge_data {
341         uint32_t        flags;
342         uint32_t        pad;
343  };
344 +#ifdef __sun__
345 +#include <sys/ioccom.h>
346 +#endif
347  #define SYNC_IOC_MAGIC         '>'
348  #define SYNC_IOC_MERGE         _IOWR(SYNC_IOC_MAGIC, 3, struct sync_merge_data)
349  #endif
350
351
352 [FILE:267:patches/patch-tests_drmdevice.c]
353 --- tests/drmdevice.c.orig      2019-10-16 21:36:48 UTC
354 +++ tests/drmdevice.c
355 @@ -31,6 +31,9 @@
356  #include <unistd.h>
357  #include <xf86drm.h>
358  
359 +#ifndef O_CLOEXEC
360 +#define O_CLOEXEC 0
361 +#endif
362  
363  static void
364  print_device_info(drmDevicePtr device, int i, bool print_revision)
365
366
367 [FILE:16850:patches/patch-xf86drm.c]
368 --- xf86drm.c.orig      2019-10-16 21:36:48 UTC
369 +++ xf86drm.c
370 @@ -31,6 +31,12 @@
371   * DEALINGS IN THE SOFTWARE.
372   */
373  
374 +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
375 +#define FREEDFLY 1
376 +#else
377 +#define FREEDFLY 0
378 +#endif
379 +
380  #include <stdio.h>
381  #include <stdlib.h>
382  #include <stdbool.h>
383 @@ -57,6 +63,12 @@
384  #ifdef MAJOR_IN_SYSMACROS
385  #include <sys/sysmacros.h>
386  #endif
387 +#if FREEDFLY
388 +#include <sys/pciio.h>
389 +#endif
390 +#ifdef HAVE_SYS_SYSCTL_H
391 +#include <sys/sysctl.h>
392 +#endif
393  #include <math.h>
394  
395  #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
396 @@ -71,8 +83,12 @@
397  
398  #include "util_math.h"
399  
400 -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
401 -#define DRM_MAJOR 145
402 +#ifndef O_CLOEXEC
403 +#define O_CLOEXEC 0
404 +#endif
405 +
406 +#if FREEDFLY
407 +#define DRM_MAJOR 0    /* Major ID unused on systems with devfs */
408  #endif
409  
410  #ifdef __NetBSD__
411 @@ -212,6 +228,63 @@ drm_public drmHashEntry *drmGetEntry(int
412      return entry;
413  }
414  
415 +#if FREEDFLY
416 +static int drmGetMinorBase(int type)
417 +{
418 +    switch (type) {
419 +        case DRM_NODE_PRIMARY:
420 +        case DRM_NODE_CONTROL:
421 +        case DRM_NODE_RENDER:
422 +            return type << 6;
423 +        default:
424 +            return -1;
425 +    };
426 +}
427 +
428 +static int drmGetMinorType(int minor)
429 +{
430 +    int type;
431 +
432 +    if (minor < 0)
433 +        return -1;
434 +
435 +    type = minor >> 6;
436 +    switch (type) {
437 +        case DRM_NODE_PRIMARY:
438 +        case DRM_NODE_CONTROL:
439 +        case DRM_NODE_RENDER:
440 +            return type;
441 +        default:
442 +            return -1;
443 +    }
444 +}
445 +
446 +static int drmGetNodeNumber(const char *name)
447 +{
448 +    size_t name_len = strnlen(name, DRM_NODE_NAME_MAX);
449 +    while (name_len && isdigit(name[name_len - 1]))
450 +        --name_len;
451 +    return strtol(name + name_len, NULL, 10);
452 +}
453 +#endif /* FREEDFLY */
454 +
455 +static int drmGetNodeType(const char *name)
456 +{
457 +    if (strncmp(name, DRM_PRIMARY_MINOR_NAME,
458 +                sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0)
459 +        return DRM_NODE_PRIMARY;
460 +
461 +    if (strncmp(name, DRM_CONTROL_MINOR_NAME,
462 +                sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0)
463 +        return DRM_NODE_CONTROL;
464 +
465 +    if (strncmp(name, DRM_RENDER_MINOR_NAME,
466 +                sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0)
467 +        return DRM_NODE_RENDER;
468 +
469 +    return -EINVAL;
470 +}
471 +
472  /**
473   * Compare two busid strings
474   *
475 @@ -343,7 +416,11 @@ static int drmOpenDevice(dev_t dev, int
476      if (!dev_name)
477          return -EINVAL;
478  
479 +#if FREEDFLY
480 +    sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type));
481 +#else
482      sprintf(buf, dev_name, DRM_DIR_NAME, minor);
483 +#endif
484      drmMsg("drmOpenDevice: node name is %s\n", buf);
485  
486      if (drm_server_info && drm_server_info->get_perms) {
487 @@ -456,7 +533,11 @@ static int drmOpenMinor(int minor, int c
488      if (!dev_name)
489          return -EINVAL;
490  
491 +#if FREEDFLY
492 +    sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type));
493 +#else
494      sprintf(buf, dev_name, DRM_DIR_NAME, minor);
495 +#endif
496      if ((fd = open(buf, O_RDWR | O_CLOEXEC, 0)) >= 0)
497          return fd;
498      return -errno;
499 @@ -497,6 +578,7 @@ drm_public int drmAvailable(void)
500      return retval;
501  }
502  
503 +#if !FREEDFLY
504  static int drmGetMinorBase(int type)
505  {
506      switch (type) {
507 @@ -527,7 +609,9 @@ static int drmGetMinorType(int minor)
508          return -1;
509      }
510  }
511 +#endif /* !FREEDFLY */
512  
513 +#ifdef __linux__
514  static const char *drmGetMinorName(int type)
515  {
516      switch (type) {
517 @@ -541,6 +625,7 @@ static const char *drmGetMinorName(int t
518          return NULL;
519      }
520  }
521 +#endif
522  
523  /**
524   * Open the device by bus ID.
525 @@ -2552,7 +2637,7 @@ drm_public int drmCommandNone(int fd, un
526  {
527      unsigned long request;
528  
529 -    request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);
530 +    request = DRM_IO( (DRM_COMMAND_BASE + drmCommandIndex) );
531  
532      if (drmIoctl(fd, request, NULL)) {
533          return -errno;
534 @@ -2744,7 +2829,6 @@ drm_public int drmIsMaster(int fd)
535  
536  drm_public char *drmGetDeviceNameFromFd(int fd)
537  {
538 -    char name[128];
539      struct stat sbuf;
540      dev_t d;
541      int i;
542 @@ -2758,14 +2842,12 @@ drm_public char *drmGetDeviceNameFromFd(
543      d = sbuf.st_rdev;
544  
545      for (i = 0; i < DRM_MAX_MINOR; i++) {
546 +        char name[DRM_NODE_NAME_MAX];
547          snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i);
548          if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d)
549 -            break;
550 +            return strdup(name);
551      }
552 -    if (i == DRM_MAX_MINOR)
553 -        return NULL;
554 -
555 -    return strdup(name);
556 +    return NULL;
557  }
558  
559  static bool drmNodeIsDRM(int maj, int min)
560 @@ -2784,6 +2866,20 @@ static bool drmNodeIsDRM(int maj, int mi
561  
562  drm_public int drmGetNodeTypeFromFd(int fd)
563  {
564 +#if FREEDFLY
565 +    char *name = drmGetDeviceNameFromFd2(fd);
566 +    int type;
567 +    if (!name) {
568 +        errno = ENODEV;
569 +        return -1;
570 +    }
571 +
572 +    type = drmGetNodeType(name);
573 +    free(name);
574 +    if (type < 0)
575 +        errno = ENODEV;
576 +    return type;
577 +#else
578      struct stat sbuf;
579      int maj, min, type;
580  
581 @@ -2802,6 +2898,7 @@ drm_public int drmGetNodeTypeFromFd(int
582      if (type == -1)
583          errno = ENODEV;
584      return type;
585 +#endif /* FREEDFLY */
586  }
587  
588  drm_public int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags,
589 @@ -2880,6 +2977,23 @@ static char *drmGetMinorNameForFD(int fd
590  
591      closedir(sysdir);
592      return NULL;
593 +#elif FREEDFLY
594 +    int oldnum, oldtype, newnum;
595 +    const char *dev_name = drmGetDeviceName(type);
596 +    char *name = drmGetDeviceNameFromFd2(fd);
597 +    if (!dev_name || !name)
598 +        return NULL;
599 +
600 +    oldnum = drmGetNodeNumber(name);
601 +    oldtype = drmGetMinorType(oldnum);
602 +    if (oldtype < 0) {
603 +        free(name);
604 +        return NULL;
605 +    }
606 +
607 +    newnum = oldnum - drmGetMinorBase(oldtype) + drmGetMinorBase(type);
608 +    snprintf(name, DRM_NODE_NAME_MAX, dev_name, DRM_DIR_NAME, newnum);
609 +    return name;
610  #else
611      struct stat sbuf;
612      char buf[PATH_MAX + 1];
613 @@ -2900,7 +3014,7 @@ static char *drmGetMinorNameForFD(int fd
614          return NULL;
615  
616      n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min);
617 -    if (n == -1 || n >= sizeof(buf))
618 +    if (n == -1 || n >= (int)sizeof(buf))
619          return NULL;
620  
621      return strdup(buf);
622 @@ -2998,7 +3112,7 @@ static int drmParseSubsystemType(int maj
623      }
624  
625      return -EINVAL;
626 -#elif defined(__OpenBSD__) || defined(__DragonFly__)
627 +#elif defined(__OpenBSD__) || FREEDFLY
628      return DRM_BUS_PCI;
629  #else
630  #warning "Missing implementation of drmParseSubsystemType"
631 @@ -3006,6 +3120,7 @@ static int drmParseSubsystemType(int maj
632  #endif
633  }
634  
635 +#ifdef __linux__
636  static void
637  get_pci_path(int maj, int min, char *pci_path)
638  {
639 @@ -3021,8 +3136,10 @@ get_pci_path(int maj, int min, char *pci
640      if (term && strncmp(term, "/virtio", 7) == 0)
641          *term = 0;
642  }
643 +#endif
644  
645 -static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
646 +static int drmParsePciBusInfo(const char *node, int node_type,
647 +                              int maj, int min, drmPciBusInfoPtr info)
648  {
649  #ifdef __linux__
650      unsigned int domain, bus, dev, func;
651 @@ -3047,7 +3164,62 @@ static int drmParsePciBusInfo(int maj, i
652      info->func = func;
653  
654      return 0;
655 -#elif defined(__OpenBSD__) || defined(__DragonFly__)
656 +#elif FREEDFLY
657 +    /*
658 +     * Only the primary nodes can be mapped to hw.dri.%i via major/minor
659 +     * Determine the primary node by offset and use its major/minor pair
660 +     */
661 +    if (node_type != DRM_NODE_PRIMARY) {
662 +        char name[DRM_NODE_NAME_MAX];
663 +        stat_t sbuf;
664 +        snprintf(name, sizeof(name), DRM_DEV_NAME, DRM_DIR_NAME,
665 +                 drmGetNodeNumber(node) - drmGetMinorBase(node_type));
666 +
667 +        if (stat(name, &sbuf))
668 +            return -errno;
669 +
670 +        maj = major(sbuf.st_rdev);
671 +        min = minor(sbuf.st_rdev);
672 +    }
673 +    /*
674 +     * Major/minor appear after the driver name in the hw.dri.%i.name node
675 +     * Find the node with matching major/minor pair and parse the bus ID,
676 +     * which may be after the name or may be alone in hw.dri.%i.busid
677 +     */
678 +    #define bus_fmt "pci:%04x:%02x:%02x.%u"
679 +    #define name_fmt "%*s %x " bus_fmt
680 +    for (int i = 0; i < DRM_MAX_MINOR; ++i) {
681 +        char name[16], value[256];
682 +        unsigned int rdev = 0, domain = 0, bus = 0, slot = 0, func = 0;
683 +        int vals;
684 +        size_t length = sizeof(value);
685 +        snprintf(name, sizeof(name), "hw.dri.%i.name", i);
686 +        if (sysctlbyname(name, value, &length, NULL, 0))
687 +            continue;
688 +
689 +        value[length] = '\0';
690 +        vals = sscanf(value, name_fmt, &rdev, &domain, &bus, &slot, &func);
691 +
692 +       if (vals >= 1 && rdev == makedev(maj,min)) {
693 +            if (vals < 5) {
694 +                /* busid not in the name, try busid */
695 +                length = sizeof(value);
696 +                snprintf(name, sizeof(name), "hw.dri.%i.busid", i);
697 +                if (sysctlbyname(name, value, &length, NULL, 0))
698 +                    break;
699 +                value[length] = '\0';
700 +                if (sscanf(value, bus_fmt, &domain, &bus, &slot, &func) != 4)
701 +                    break;
702 +            }
703 +            info->domain = domain;
704 +            info->bus = bus;
705 +            info->dev = slot;
706 +            info->func = func;
707 +            return 0;
708 +        }
709 +    }
710 +    return -ENODEV;
711 +#elif defined(__OpenBSD__)
712      struct drm_pciinfo pinfo;
713      int fd, type;
714  
715 @@ -3105,32 +3277,6 @@ drm_public int drmDevicesEqual(drmDevice
716      return 0;
717  }
718  
719 -static int drmGetNodeType(const char *name)
720 -{
721 -    if (strncmp(name, DRM_CONTROL_MINOR_NAME,
722 -        sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0)
723 -        return DRM_NODE_CONTROL;
724 -
725 -    if (strncmp(name, DRM_RENDER_MINOR_NAME,
726 -        sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0)
727 -        return DRM_NODE_RENDER;
728 -
729 -    if (strncmp(name, DRM_PRIMARY_MINOR_NAME,
730 -        sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0)
731 -        return DRM_NODE_PRIMARY;
732 -
733 -    return -EINVAL;
734 -}
735 -
736 -static int drmGetMaxNodeName(void)
737 -{
738 -    return sizeof(DRM_DIR_NAME) +
739 -           MAX3(sizeof(DRM_PRIMARY_MINOR_NAME),
740 -                sizeof(DRM_CONTROL_MINOR_NAME),
741 -                sizeof(DRM_RENDER_MINOR_NAME)) +
742 -           3 /* length of the node number */;
743 -}
744 -
745  #ifdef __linux__
746  static int parse_separate_sysfs_files(int maj, int min,
747                                        drmPciDeviceInfoPtr device,
748 @@ -3202,6 +3348,7 @@ static int parse_config_sysfs_file(int m
749  #endif
750  
751  static int drmParsePciDeviceInfo(int maj, int min,
752 +                                 drmPciBusInfoPtr info,
753                                   drmPciDeviceInfoPtr device,
754                                   uint32_t flags)
755  {
756 @@ -3213,7 +3360,44 @@ static int drmParsePciDeviceInfo(int maj
757          return parse_config_sysfs_file(maj, min, device);
758  
759      return 0;
760 -#elif defined(__OpenBSD__) || defined(__DragonFly__)
761 +#elif FREEDFLY
762 +    struct pci_conf_io pc;
763 +    struct pci_match_conf patterns[1];
764 +    struct pci_conf results[1];
765 +
766 +    int fd = open("/dev/pci", O_RDONLY, 0);
767 +    if (fd < 0)
768 +        return -errno;
769 +
770 +    bzero(&patterns, sizeof(patterns));
771 +    patterns[0].pc_sel.pc_domain = info->domain;
772 +    patterns[0].pc_sel.pc_bus = info->bus;
773 +    patterns[0].pc_sel.pc_dev = info->dev;
774 +    patterns[0].pc_sel.pc_func = info->func;
775 +    patterns[0].flags = PCI_GETCONF_MATCH_DOMAIN | PCI_GETCONF_MATCH_BUS
776 +                      | PCI_GETCONF_MATCH_DEV | PCI_GETCONF_MATCH_FUNC;
777 +    bzero(&pc, sizeof(struct pci_conf_io));
778 +    pc.num_patterns = 1;
779 +    pc.pat_buf_len = sizeof(patterns);
780 +    pc.patterns = patterns;
781 +    pc.match_buf_len = sizeof(results);
782 +    pc.matches = results;
783 +
784 +    if (ioctl(fd, PCIOCGETCONF, &pc) || pc.status == PCI_GETCONF_ERROR) {
785 +        int error = errno;
786 +        close(fd);
787 +        return -error;
788 +    }
789 +    close(fd);
790 +
791 +    device->vendor_id = results[0].pc_vendor;
792 +    device->device_id = results[0].pc_device;
793 +    device->subvendor_id = results[0].pc_subvendor;
794 +    device->subdevice_id = results[0].pc_subdevice;
795 +    device->revision_id = results[0].pc_revid;
796 +
797 +    return 0;
798 +#elif defined(__OpenBSD__)
799      struct drm_pciinfo pinfo;
800      int fd, type;
801  
802 @@ -3318,7 +3502,7 @@ static drmDevicePtr drmDeviceAlloc(unsig
803      unsigned int i;
804      char *ptr;
805  
806 -    max_node_length = ALIGN(drmGetMaxNodeName(), sizeof(void *));
807 +    max_node_length = ALIGN(DRM_NODE_NAME_MAX, sizeof(void *));
808      extra = DRM_NODE_MAX * (sizeof(void *) + max_node_length);
809  
810      size = sizeof(*device) + extra + bus_size + device_size;
811 @@ -3364,7 +3548,7 @@ static int drmProcessPciDevice(drmDevice
812  
813      dev->businfo.pci = (drmPciBusInfoPtr)addr;
814  
815 -    ret = drmParsePciBusInfo(maj, min, dev->businfo.pci);
816 +    ret = drmParsePciBusInfo(node, node_type, maj, min, dev->businfo.pci);
817      if (ret)
818          goto free_device;
819  
820 @@ -3373,7 +3557,7 @@ static int drmProcessPciDevice(drmDevice
821          addr += sizeof(drmPciBusInfo);
822          dev->deviceinfo.pci = (drmPciDeviceInfoPtr)addr;
823  
824 -        ret = drmParsePciDeviceInfo(maj, min, dev->deviceinfo.pci, flags);
825 +        ret = drmParsePciDeviceInfo(maj, min, dev->businfo.pci, dev->deviceinfo.pci, flags);
826          if (ret)
827              goto free_device;
828      }
829 @@ -3675,7 +3859,7 @@ process_device(drmDevicePtr *device, con
830                 bool fetch_deviceinfo, uint32_t flags)
831  {
832      struct stat sbuf;
833 -    char node[PATH_MAX + 1];
834 +    char node[DRM_NODE_NAME_MAX];
835      int node_type, subsystem_type;
836      unsigned int maj, min;
837  
838 @@ -3683,14 +3867,14 @@ process_device(drmDevicePtr *device, con
839      if (node_type < 0)
840          return -1;
841  
842 -    snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, d_name);
843 +    snprintf(node, sizeof(node), "%s/%s", DRM_DIR_NAME, d_name);
844      if (stat(node, &sbuf))
845          return -1;
846  
847      maj = major(sbuf.st_rdev);
848      min = minor(sbuf.st_rdev);
849  
850 -    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
851 +    if ((DRM_MAJOR && maj != DRM_MAJOR) || !S_ISCHR(sbuf.st_mode))
852          return -1;
853  
854      subsystem_type = drmParseSubsystemType(maj, min);
855 @@ -3731,7 +3915,7 @@ static void drmFoldDuplicatedDevices(drm
856                  local_devices[i]->available_nodes |= local_devices[j]->available_nodes;
857                  node_type = log2(local_devices[j]->available_nodes);
858                  memcpy(local_devices[i]->nodes[node_type],
859 -                       local_devices[j]->nodes[node_type], drmGetMaxNodeName());
860 +                       local_devices[j]->nodes[node_type], DRM_NODE_NAME_MAX);
861                  drmFreeDevice(&local_devices[j]);
862              }
863          }
864 @@ -3790,7 +3974,7 @@ drm_public int drmGetDevice2(int fd, uin
865       */
866      drmDevicePtr     d;
867      struct stat      sbuf;
868 -    char             node[PATH_MAX + 1];
869 +    char             node[DRM_NODE_NAME_MAX];
870      const char      *dev_name;
871      int              node_type, subsystem_type;
872      int              maj, min, n, ret;
873 @@ -3804,7 +3988,7 @@ drm_public int drmGetDevice2(int fd, uin
874      maj = major(sbuf.st_rdev);
875      min = minor(sbuf.st_rdev);
876  
877 -    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
878 +    if (DRM_MAJOR && !drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
879          return -EINVAL;
880  
881      node_type = drmGetMinorType(min);
882 @@ -3815,8 +3999,8 @@ drm_public int drmGetDevice2(int fd, uin
883      if (!dev_name)
884          return -EINVAL;
885  
886 -    n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min);
887 -    if (n == -1 || n >= PATH_MAX)
888 +    n = snprintf(node, sizeof(node), dev_name, DRM_DIR_NAME, min);
889 +    if (n == -1 || n >= (int)sizeof(node))
890        return -errno;
891      if (stat(node, &sbuf))
892          return -EINVAL;
893 @@ -4030,9 +4214,27 @@ drm_public char *drmGetDeviceNameFromFd2
894      free(value);
895  
896      return strdup(path);
897 +#elif FREEDFLY
898 +    stat_t sbuf;
899 +    dev_t rdev;
900 +    if (fstat(fd, &sbuf))
901 +        return NULL;
902 +
903 +    rdev = sbuf.st_rdev;
904 +    /* minor numbers don't depend on node name suffix, search for a match */
905 +    for (int i = 0; i < DRM_MAX_MINOR; ++i) {
906 +        char node[DRM_NODE_NAME_MAX];
907 +        for (int j = 0; j < DRM_NODE_MAX; ++j) {
908 +            snprintf(node, sizeof(node), drmGetDeviceName(j),
909 +                     DRM_DIR_NAME, drmGetMinorBase(j) + i);
910 +            if (stat(node, &sbuf) == 0 && sbuf.st_rdev == rdev)
911 +                return strdup(node);
912 +        }
913 +    }
914 +    return NULL;
915  #else
916      struct stat      sbuf;
917 -    char             node[PATH_MAX + 1];
918 +    char             node[DRM_NODE_NAME_MAX];
919      const char      *dev_name;
920      int              node_type;
921      int              maj, min, n;
922 @@ -4054,8 +4256,8 @@ drm_public char *drmGetDeviceNameFromFd2
923      if (!dev_name)
924          return NULL;
925  
926 -    n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min);
927 -    if (n == -1 || n >= PATH_MAX)
928 +    n = snprintf(node, sizeof(node), dev_name, DRM_DIR_NAME, min);
929 +    if (n == -1 || n >= (int)sizeof(node))
930        return NULL;
931  
932      return strdup(node);
933
934
935 [FILE:397:patches/patch-xf86drm.h]
936 --- xf86drm.h.orig      2019-10-16 21:36:48 UTC
937 +++ xf86drm.h
938 @@ -59,6 +59,9 @@ extern "C" {
939  #else /* One of the *BSDs */
940  
941  #include <sys/ioccom.h>
942 +#ifdef __sun__
943 +#define _IOC(inout,group,num,len)      (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
944 +#endif
945  #define DRM_IOCTL_NR(n)         ((n) & 0xff)
946  #define DRM_IOC_VOID            IOC_VOID
947  #define DRM_IOC_READ            IOC_OUT
948
949
950 [FILE:3248:patches/patch-xf86drmMode.c]
951 --- xf86drmMode.c.orig  2019-10-16 21:36:48 UTC
952 +++ xf86drmMode.c
953 @@ -43,6 +43,7 @@
954  #include <stdlib.h>
955  #include <sys/ioctl.h>
956  #ifdef HAVE_SYS_SYSCTL_H
957 +#include <sys/types.h>
958  #include <sys/sysctl.h>
959  #endif
960  #include <stdio.h>
961 @@ -799,41 +800,59 @@ drm_public int drmCheckModesettingSuppor
962         closedir(sysdir);
963         if (found)
964                 return 0;
965 -#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
966 -       char kbusid[1024], sbusid[1024];
967 -       char oid[128];
968 -       int domain, bus, dev, func;
969 -       int i, modesetting, ret;
970 -       size_t len;
971 +#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__DragonFly__)
972 +       #define bus_fmt "pci:%04x:%02x:%02x.%u"
973 +       #define name_fmt "%*s %*s " bus_fmt
974 +       unsigned int d1 = 0, b1 = 0, s1 = 0, f1 = 0;
975 +       if (sscanf(busid, bus_fmt, &d1, &b1, &s1, &f1) != 4)
976 +                return -EINVAL;
977 +       /*
978 +        * hw.dri.%i.bus is not always present and hw.dri.%i.name does not
979 +        * always contain the busid, so try both for best chance of success
980 +        */
981 +       for (int i = 0; i < DRM_MAX_MINOR; ++i) {
982 +               char name[22], value[256];
983 +               unsigned int d2 = 0, b2 = 0, s2 = 0, f2 = 0;
984 +               size_t length = sizeof(value);
985 +               snprintf(name, sizeof(name), "hw.dri.%i.name", i);
986 +               if (sysctlbyname(name, value, &length, NULL, 0))
987 +                       continue;
988  
989 -       ret = sscanf(busid, "pci:%04x:%02x:%02x.%d", &domain, &bus, &dev,
990 -           &func);
991 -       if (ret != 4)
992 -               return -EINVAL;
993 -       snprintf(kbusid, sizeof(kbusid), "pci:%04x:%02x:%02x.%d", domain, bus,
994 -           dev, func);
995 +               value[length] = '\0';
996 +               switch (sscanf(value, name_fmt, &d2, &b2, &s2, &f2)) {
997 +               case 0: /* busid not in the name, try busid */
998 +                       length = sizeof(value);
999 +                       snprintf(name, sizeof(name), "hw.dri.%i.busid", i);
1000 +                       if (sysctlbyname(name, value, &length, NULL, 0))
1001 +                               continue;
1002  
1003 -       /* How many GPUs do we expect in the machine ? */
1004 -       for (i = 0; i < 16; i++) {
1005 -               snprintf(oid, sizeof(oid), "hw.dri.%d.busid", i);
1006 -               len = sizeof(sbusid);
1007 -               ret = sysctlbyname(oid, sbusid, &len, NULL, 0);
1008 -               if (ret == -1) {
1009 -                       if (errno == ENOENT)
1010 +                       value[length] = '\0';
1011 +                       if (sscanf(value, bus_fmt, &d2, &b2, &s2, &f2) != 4)
1012                                 continue;
1013 -                       return -EINVAL;
1014 +                       /* fall through after parsing busid */
1015 +
1016 +               case 4: /* if we jumped here then busid was in the name */ 
1017 +                       if (d1 == d2 && b1 == b2 && s1 == s2 && f1 == f2) {
1018 +                       /*
1019 +                        * Confirm the drm driver for this device supports KMS,
1020 +                        * except on DragonFly where all the drm drivers do so
1021 +                        * but only hw.dri.0.modesetting is present
1022 +                        */ 
1023 +                       #ifndef __DragonFly__
1024 +                               int modesetting = 0;
1025 +                               length = sizeof(modesetting);
1026 +                               snprintf(name, sizeof(name), "hw.dri.%i.modesetting", i);
1027 +                               if (sysctlbyname(name, &modesetting, &length, NULL, 0)
1028 +                                || length != sizeof(modesetting) || !modesetting)
1029 +                                       return -ENOSYS;
1030 +                               else
1031 +                       #endif
1032 +                                       return 0;
1033 +                       }
1034 +               default:
1035 +                       break;
1036                 }
1037 -               if (strcmp(sbusid, kbusid) != 0)
1038 -                       continue;
1039 -               snprintf(oid, sizeof(oid), "hw.dri.%d.modesetting", i);
1040 -               len = sizeof(modesetting);
1041 -               ret = sysctlbyname(oid, &modesetting, &len, NULL, 0);
1042 -               if (ret == -1 || len != sizeof(modesetting))
1043 -                       return -EINVAL;
1044 -               return (modesetting ? 0 : -ENOSYS);
1045         }
1046 -#elif defined(__DragonFly__)
1047 -       return 0;
1048  #elif defined(__OpenBSD__)
1049         int     fd;
1050         struct drm_mode_card_res res;
1051