Ravenports generated: 07 Jun 2017 17:40
[ravenports.git] / bucket_CD / libdrm
1 # Buildsheet autogenerated by ravenadm tool -- Do not edit.
2
3 NAMEBASE=               libdrm
4 VERSION=                2.4.80
5 KEYWORDS=               graphics x11
6 VARIANTS=               standard
7 SDESC[standard]=        Direct Rendering Module services kernel interface
8 HOMEPAGE=               http://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.80.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=                   libtool pkgconfig
29 XORG_COMPONENTS=        pciaccess
30
31 FPC_EQUIVALENT=         graphics/libdrm
32
33 MUST_CONFIGURE=         gnu
34 CONFIGURE_ARGS=         --disable-cairo-tests
35                         --enable-install-test-programs
36
37 INSTALL_TARGET=         install-strip
38 INSTALL_REQ_TOOLCHAIN=  yes
39
40 [X86].DESCRIPTION=                      DRM Drivers for amd64 and i386 architectures
41
42 [ARM].DESCRIPTION=                      DRM Drivers for AARCH64 architecture
43
44 [FILE:70:descriptions/desc.single]
45 Userspace interface to kernel DRM (Direct Rendering Module) services.
46
47
48 [FILE:100:distinfo]
49 a82a519601e9cdfad795e760807eb07ac8913b225e25fc8fe9bc03e3be6549f1       771243 libdrm-2.4.80.tar.bz2
50
51
52 [FILE:1959:manifests/plist.single]
53 bin/
54  kms-steal-crtc
55  kms-universal-planes
56  kmstest
57  modeprint
58  modetest
59  proptest
60  vbltest
61 %%ARM-ON%%include/freedreno/
62  freedreno_drmif.h
63  freedreno_ringbuffer.h
64 %%X86-ON%%include/libdrm/
65  amdgpu.h
66  amdgpu_drm.h
67 include/libdrm/
68  drm.h
69  drm_fourcc.h
70  drm_mode.h
71  drm_sarea.h
72  i915_drm.h
73 %%X86-ON%%include/libdrm/
74  intel_aub.h
75  intel_bufmgr.h
76  intel_debug.h
77 include/libdrm/
78  mach64_drm.h
79  mga_drm.h
80 %%X86-ON%%include/libdrm/nouveau/nouveau.h
81 %%X86-ON%%include/libdrm/nouveau/nvif/
82  cl0080.h
83  cl9097.h
84  class.h
85  if0002.h
86  if0003.h
87  ioctl.h
88  unpack.h
89 include/libdrm/
90  nouveau_drm.h
91  qxl_drm.h
92  r128_drm.h
93 %%X86-ON%%include/libdrm/
94  r600_pci_ids.h
95  radeon_bo.h
96  radeon_bo_gem.h
97  radeon_bo_int.h
98  radeon_cs.h
99  radeon_cs_gem.h
100  radeon_cs_int.h
101 include/libdrm/
102  radeon_drm.h
103 %%X86-ON%%include/libdrm/
104  radeon_surface.h
105 include/libdrm/
106  savage_drm.h
107  sis_drm.h
108  tegra_drm.h
109  vc4_drm.h
110 %%ARM-ON%%include/libdrm/
111  vc4_packet.h
112  vc4_qpu_defines.h
113 include/libdrm/
114  via_drm.h
115  virtgpu_drm.h
116  vmwgfx_drm.h
117 include/libkms/libkms.h
118 include/
119  libsync.h
120  xf86drm.h
121  xf86drmMode.h
122 lib/
123  libdrm.so
124  libdrm.so.2
125  libdrm.so.2.4.0
126 %%X86-ON%%lib/
127  libdrm_amdgpu.so
128  libdrm_amdgpu.so.1
129  libdrm_amdgpu.so.1.0.0
130 %%ARM-ON%%lib/
131  libdrm_freedreno.so
132  libdrm_freedreno.so.1
133  libdrm_freedreno.so.1.0.0
134 %%X86-ON%%lib/
135  libdrm_intel.so
136  libdrm_intel.so.1
137  libdrm_intel.so.1.0.0
138  libdrm_nouveau.so
139  libdrm_nouveau.so.2
140  libdrm_nouveau.so.2.0.0
141  libdrm_radeon.so
142  libdrm_radeon.so.1
143  libdrm_radeon.so.1.0.1
144 lib/
145  libkms.so
146  libkms.so.1
147  libkms.so.1.0.0
148 lib/pkgconfig/
149  libdrm.pc
150 %%X86-ON%%lib/pkgconfig/
151  libdrm_amdgpu.pc
152 %%ARM-ON%%lib/pkgconfig/
153  libdrm_freedreno.pc
154 %%X86-ON%%lib/pkgconfig/
155  libdrm_intel.pc
156  libdrm_nouveau.pc
157  libdrm_radeon.pc
158 %%ARM-ON%%lib/pkgconfig/
159  libdrm_vc4.pc
160 lib/pkgconfig/
161  libkms.pc
162 share/man/man3/
163  drmAvailable.3.gz
164  drmHandleEvent.3.gz
165  drmModeGetResources.3.gz
166 share/man/man7/
167  drm-gem.7.gz
168  drm-kms.7.gz
169  drm-memory.7.gz
170  drm-mm.7.gz
171  drm-ttm.7.gz
172  drm.7.gz
173
174
175 [FILE:801:patches/patch-libkms_vmwgfx.c]
176 # the defintion of ERESTART is behind a check for _KERNEL, but
177 # defining that causes errno to not be defined. fortunately, there's
178 # an alternative switch. unfortunately, those differ by platform and
179 # _WANT_KERNEL_ERRNO is too recent to be part of any release, so just
180 # define ERESTART if we still don't have it after including errno.h 
181 #
182 --- libkms/vmwgfx.c.orig        2017-04-14 23:29:46 UTC
183 +++ libkms/vmwgfx.c
184 @@ -30,10 +30,18 @@
185  #include "config.h"
186  #endif
187  
188 +#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
189 +#define _WANT_KERNEL_ERRNO
190 +#elif defined(__DragonFly__)
191 +#define _KERNEL_STRUCTURES
192 +#endif
193  #include <errno.h>
194  #include <stdlib.h>
195  #include <string.h>
196  #include "internal.h"
197 +#ifndef ERESTART
198 +#define ERESTART (-1)
199 +#endif
200  
201  #include "xf86drm.h"
202  #include "libdrm_macros.h"
203
204
205 [FILE:283:patches/patch-libsync.h]
206 # define ETIME as ETIMEOUT same as done in Mesa
207 #
208 --- libsync.h.orig      2017-04-14 23:29:46 UTC
209 +++ libsync.h
210 @@ -35,6 +35,9 @@
211  #include <sys/ioctl.h>
212  #include <sys/poll.h>
213  #include <unistd.h>
214 +#ifndef ETIME
215 +#define ETIME ETIMEDOUT
216 +#endif
217  
218  #if defined(__cplusplus)
219  extern "C" {
220
221
222 [FILE:24055:patches/patch-xf86drm.c]
223 --- xf86drm.c.orig      2017-04-07 08:49:13 UTC
224 +++ xf86drm.c
225 @@ -49,6 +49,9 @@
226  #include <signal.h>
227  #include <time.h>
228  #include <sys/types.h>
229 +#ifdef HAVE_SYS_SYSCTL_H
230 +#include <sys/sysctl.h>
231 +#endif
232  #include <sys/stat.h>
233  #define stat_t struct stat
234  #include <sys/ioctl.h>
235 @@ -62,6 +65,10 @@
236  #endif
237  #include <math.h>
238  
239 +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
240 +#include <sys/pciio.h>
241 +#endif
242 +
243  /* Not all systems have MAP_FAILED defined */
244  #ifndef MAP_FAILED
245  #define MAP_FAILED ((void *)-1)
246 @@ -72,18 +79,8 @@
247  
248  #include "util_math.h"
249  
250 -#ifdef __OpenBSD__
251 -#define DRM_PRIMARY_MINOR_NAME  "drm"
252 -#define DRM_CONTROL_MINOR_NAME  "drmC"
253 -#define DRM_RENDER_MINOR_NAME   "drmR"
254 -#else
255 -#define DRM_PRIMARY_MINOR_NAME  "card"
256 -#define DRM_CONTROL_MINOR_NAME  "controlD"
257 -#define DRM_RENDER_MINOR_NAME   "renderD"
258 -#endif
259 -
260  #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
261 -#define DRM_MAJOR 145
262 +#define DRM_MAJOR 0    /* Major ID unused on systems with devfs */
263  #endif
264  
265  #ifdef __NetBSD__
266 @@ -180,7 +177,7 @@ void drmFree(void *pt)
267  }
268  
269  /**
270 - * Call ioctl, restarting if it is interupted
271 + * Call ioctl, restarting if it is interrupted
272   */
273  int
274  drmIoctl(int fd, unsigned long request, void *arg)
275 @@ -223,6 +220,89 @@ drmHashEntry *drmGetEntry(int fd)
276      return entry;
277  }
278  
279 +static int drmGetMinorBase(int type)
280 +{
281 +    switch (type) {
282 +        case DRM_NODE_PRIMARY:
283 +        case DRM_NODE_CONTROL:
284 +        case DRM_NODE_RENDER:
285 +            return type << 6;
286 +        default:
287 +            return -1;
288 +    };
289 +}
290 +
291 +static int drmGetMinorType(int minor)
292 +{
293 +    if (minor < 0)
294 +        return -1;
295 +
296 +    int type = minor >> 6;
297 +    switch (type) {
298 +        case DRM_NODE_PRIMARY:
299 +        case DRM_NODE_CONTROL:
300 +        case DRM_NODE_RENDER:
301 +            return type;
302 +        default:
303 +            return -1;
304 +    }
305 +}
306 +
307 +#ifdef __linux__
308 +static const char *drmGetMinorName(int type)
309 +{
310 +    switch (type) {
311 +        case DRM_NODE_PRIMARY:
312 +            return DRM_PRIMARY_MINOR_NAME;
313 +        case DRM_NODE_CONTROL:
314 +            return DRM_CONTROL_MINOR_NAME;
315 +        case DRM_NODE_RENDER:
316 +            return DRM_RENDER_MINOR_NAME;
317 +        default:
318 +            return NULL;
319 +    }
320 +}
321 +#endif
322 +
323 +static const char *drmGetDeviceName(int type)
324 +{
325 +    switch (type) {
326 +        case DRM_NODE_PRIMARY:
327 +            return DRM_DEV_NAME;
328 +        case DRM_NODE_CONTROL:
329 +            return DRM_CONTROL_DEV_NAME;
330 +        case DRM_NODE_RENDER:
331 +            return DRM_RENDER_DEV_NAME;
332 +        default:
333 +            return NULL;
334 +    }
335 +}
336 +
337 +static int drmGetNodeNumber(const char *name)
338 +{
339 +    size_t name_len = strnlen(name, DRM_NODE_NAME_MAX);
340 +    while (name_len && isdigit(name[name_len - 1]))
341 +        --name_len;
342 +    return strtol(name + name_len, NULL, 10);
343 +}
344 +
345 +static int drmGetNodeType(const char *name)
346 +{
347 +    if (strncmp(name, DRM_PRIMARY_MINOR_NAME,
348 +                sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0)
349 +        return DRM_NODE_PRIMARY;
350 +
351 +    if (strncmp(name, DRM_CONTROL_MINOR_NAME,
352 +                sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0)
353 +        return DRM_NODE_CONTROL;
354 +
355 +    if (strncmp(name, DRM_RENDER_MINOR_NAME,
356 +                sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0)
357 +        return DRM_NODE_RENDER;
358 +
359 +    return -1;
360 +}
361 +
362  /**
363   * Compare two busid strings
364   *
365 @@ -290,7 +370,7 @@ static int drmMatchBusID(const char *id1
366   *
367   * \internal
368   * Checks for failure. If failure was caused by signal call chown again.
369 - * If any other failure happened then it will output error mesage using
370 + * If any other failure happened then it will output error message using
371   * drmMsg() call.
372   */
373  #if !defined(UDEV)
374 @@ -327,8 +407,8 @@ static int chown_check_return(const char
375  static int drmOpenDevice(dev_t dev, int minor, int type)
376  {
377      stat_t          st;
378 -    const char      *dev_name;
379 -    char            buf[64];
380 +    const char      *dev_name = drmGetDeviceName(type);
381 +    char            buf[DRM_NODE_NAME_MAX];
382      int             fd;
383      mode_t          devmode = DRM_DEV_MODE, serv_mode;
384      gid_t           serv_group;
385 @@ -338,21 +418,14 @@ static int drmOpenDevice(dev_t dev, int 
386      gid_t           group   = DRM_DEV_GID;
387  #endif
388  
389 -    switch (type) {
390 -    case DRM_NODE_PRIMARY:
391 -        dev_name = DRM_DEV_NAME;
392 -        break;
393 -    case DRM_NODE_CONTROL:
394 -        dev_name = DRM_CONTROL_DEV_NAME;
395 -        break;
396 -    case DRM_NODE_RENDER:
397 -        dev_name = DRM_RENDER_DEV_NAME;
398 -        break;
399 -    default:
400 +    if (!dev_name)
401          return -EINVAL;
402 -    };
403  
404 +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
405 +    sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type));
406 +#else
407      sprintf(buf, dev_name, DRM_DIR_NAME, minor);
408 +#endif
409      drmMsg("drmOpenDevice: node name is %s\n", buf);
410  
411      if (drm_server_info && drm_server_info->get_perms) {
412 @@ -456,27 +529,20 @@ wait_for_udev:
413  static int drmOpenMinor(int minor, int create, int type)
414  {
415      int  fd;
416 -    char buf[64];
417 -    const char *dev_name;
418 +    char buf[DRM_NODE_NAME_MAX];
419 +    const char *dev_name = drmGetDeviceName(type);
420  
421      if (create)
422          return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type);
423  
424 -    switch (type) {
425 -    case DRM_NODE_PRIMARY:
426 -        dev_name = DRM_DEV_NAME;
427 -        break;
428 -    case DRM_NODE_CONTROL:
429 -        dev_name = DRM_CONTROL_DEV_NAME;
430 -        break;
431 -    case DRM_NODE_RENDER:
432 -        dev_name = DRM_RENDER_DEV_NAME;
433 -        break;
434 -    default:
435 +    if (!dev_name)
436          return -EINVAL;
437 -    };
438  
439 +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
440 +    sprintf(buf, dev_name, DRM_DIR_NAME, minor + drmGetMinorBase(type));
441 +#else
442      sprintf(buf, dev_name, DRM_DIR_NAME, minor);
443 +#endif
444      if ((fd = open(buf, O_RDWR, 0)) >= 0)
445          return fd;
446      return -errno;
447 @@ -517,51 +583,6 @@ int drmAvailable(void)
448      return retval;
449  }
450  
451 -static int drmGetMinorBase(int type)
452 -{
453 -    switch (type) {
454 -    case DRM_NODE_PRIMARY:
455 -        return 0;
456 -    case DRM_NODE_CONTROL:
457 -        return 64;
458 -    case DRM_NODE_RENDER:
459 -        return 128;
460 -    default:
461 -        return -1;
462 -    };
463 -}
464 -
465 -static int drmGetMinorType(int minor)
466 -{
467 -    int type = minor >> 6;
468 -
469 -    if (minor < 0)
470 -        return -1;
471 -
472 -    switch (type) {
473 -    case DRM_NODE_PRIMARY:
474 -    case DRM_NODE_CONTROL:
475 -    case DRM_NODE_RENDER:
476 -        return type;
477 -    default:
478 -        return -1;
479 -    }
480 -}
481 -
482 -static const char *drmGetMinorName(int type)
483 -{
484 -    switch (type) {
485 -    case DRM_NODE_PRIMARY:
486 -        return DRM_PRIMARY_MINOR_NAME;
487 -    case DRM_NODE_CONTROL:
488 -        return DRM_CONTROL_MINOR_NAME;
489 -    case DRM_NODE_RENDER:
490 -        return DRM_RENDER_MINOR_NAME;
491 -    default:
492 -        return NULL;
493 -    }
494 -}
495 -
496  /**
497   * Open the device by bus ID.
498   *
499 @@ -2705,33 +2726,40 @@ int drmDropMaster(int fd)
500  
501  char *drmGetDeviceNameFromFd(int fd)
502  {
503 -    char name[128];
504 -    struct stat sbuf;
505 -    dev_t d;
506 -    int i;
507 -
508      /* The whole drmOpen thing is a fiasco and we need to find a way
509       * back to just using open(2).  For now, however, lets just make
510       * things worse with even more ad hoc directory walking code to
511       * discover the device file name. */
512  
513 +    stat_t sbuf;
514      fstat(fd, &sbuf);
515 -    d = sbuf.st_rdev;
516 +    dev_t d = sbuf.st_rdev;
517  
518 -    for (i = 0; i < DRM_MAX_MINOR; i++) {
519 +    for (int i = 0; i < DRM_MAX_MINOR; i++) {
520 +        char name[DRM_NODE_NAME_MAX];
521          snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i);
522          if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d)
523 -            break;
524 +            return strdup(name);
525      }
526 -    if (i == DRM_MAX_MINOR)
527 -        return NULL;
528 -
529 -    return strdup(name);
530 +    return NULL;
531  }
532  
533  int drmGetNodeTypeFromFd(int fd)
534  {
535 -    struct stat sbuf;
536 +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
537 +    char *name = drmGetDeviceNameFromFd2(fd);
538 +    if (!name) {
539 +        errno = ENODEV;
540 +        return -1;
541 +    }
542 +
543 +    int type = drmGetNodeType(name);
544 +    free(name);
545 +    if (type < 0)
546 +        errno = ENODEV;
547 +    return type;
548 +#else
549 +    stat_t sbuf;
550      int maj, min, type;
551  
552      if (fstat(fd, &sbuf))
553 @@ -2749,6 +2777,7 @@ int drmGetNodeTypeFromFd(int fd)
554      if (type == -1)
555          errno = ENODEV;
556      return type;
557 +#endif
558  }
559  
560  int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd)
561 @@ -2788,7 +2817,7 @@ static char *drmGetMinorNameForFD(int fd
562  #ifdef __linux__
563      DIR *sysdir;
564      struct dirent *pent, *ent;
565 -    struct stat sbuf;
566 +    stat_t sbuf;
567      const char *name = drmGetMinorName(type);
568      int len;
569      char dev_name[64], buf[64];
570 @@ -2839,13 +2868,35 @@ static char *drmGetMinorNameForFD(int fd
571  
572  out_close_dir:
573      closedir(sysdir);
574 +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
575 +    const char *dev_name = drmGetDeviceName(type);
576 +    if (!dev_name)
577 +        return NULL;
578 +
579 +    char *name = drmGetDeviceNameFromFd2(fd);
580 +    if (!name)
581 +        return NULL;
582 +
583 +    int oldnum = drmGetNodeNumber(name);
584 +    int oldtype = drmGetMinorType(oldnum);
585 +    if (oldtype < 0) {
586 +        free(name);
587 +        return NULL;
588 +    }
589 +
590 +    int newnum = oldnum - drmGetMinorBase(oldtype) + drmGetMinorBase(type);
591 +    snprintf(name, DRM_NODE_NAME_MAX, dev_name, DRM_DIR_NAME, newnum);
592 +    return name;
593  #else
594 -    struct stat sbuf;
595 -    char buf[PATH_MAX + 1];
596 -    const char *dev_name;
597 +    stat_t sbuf;
598 +    char buf[DRM_NODE_NAME_MAX];
599 +    const char *dev_name = drmGetDeviceName(type);
600      unsigned int maj, min;
601      int n, base;
602  
603 +    if (!dev_name)
604 +        return NULL;
605 +
606      if (fstat(fd, &sbuf))
607          return NULL;
608  
609 @@ -2855,20 +2906,6 @@ out_close_dir:
610      if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
611          return NULL;
612  
613 -    switch (type) {
614 -    case DRM_NODE_PRIMARY:
615 -        dev_name = DRM_DEV_NAME;
616 -        break;
617 -    case DRM_NODE_CONTROL:
618 -        dev_name = DRM_CONTROL_DEV_NAME;
619 -        break;
620 -    case DRM_NODE_RENDER:
621 -        dev_name = DRM_RENDER_DEV_NAME;
622 -        break;
623 -    default:
624 -        return NULL;
625 -    };
626 -
627      base = drmGetMinorBase(type);
628      if (base < 0)
629          return NULL;
630 @@ -2966,7 +3003,7 @@ static int drmParseSubsystemType(int maj
631          return DRM_BUS_HOST1X;
632  
633      return -EINVAL;
634 -#elif defined(__OpenBSD__)
635 +#elif defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
636      return DRM_BUS_PCI;
637  #else
638  #warning "Missing implementation of drmParseSubsystemType"
639 @@ -2974,7 +3011,8 @@ static int drmParseSubsystemType(int maj
640  #endif
641  }
642  
643 -static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
644 +static int drmParsePciBusInfo(const char *node, int node_type,
645 +                              int maj, int min, drmPciBusInfoPtr info)
646  {
647  #ifdef __linux__
648      unsigned int domain, bus, dev, func;
649 @@ -3023,6 +3061,60 @@ static int drmParsePciBusInfo(int maj, i
650      info->func = pinfo.func;
651  
652      return 0;
653 +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
654 +    /*
655 +     * Only the primary nodes can be mapped to hw.dri.%i via major/minor
656 +     * Determine the primary node by offset and use its major/minor pair
657 +     */
658 +    if (node_type != DRM_NODE_PRIMARY) {
659 +        char name[DRM_NODE_NAME_MAX];
660 +        snprintf(name, sizeof(name), DRM_DEV_NAME, DRM_DIR_NAME,
661 +                 drmGetNodeNumber(node) - drmGetMinorBase(node_type));
662 +
663 +        stat_t sbuf;
664 +        if (stat(name, &sbuf))
665 +            return -errno;
666 +
667 +        maj = major(sbuf.st_rdev);
668 +        min = minor(sbuf.st_rdev);
669 +    }
670 +    /*
671 +     * Major/minor appear after the driver name in the hw.dri.%i.name node
672 +     * Find the node with matching major/minor pair and parse the bus ID,
673 +     * which may be after the name or may be alone in hw.dri.%i.busid
674 +     */
675 +    #define bus_fmt "pci:%04x:%02x:%02x.%u"
676 +    #define name_fmt "%*s %x " bus_fmt
677 +    for (int i = 0; i < DRM_MAX_MINOR; ++i) {
678 +        char name[16], value[256];
679 +        size_t length = sizeof(value);
680 +        snprintf(name, sizeof(name), "hw.dri.%i.name", i);
681 +        if (sysctlbyname(name, value, &length, NULL, 0))
682 +            continue;
683 +
684 +        value[length] = '\0';
685 +        unsigned int rdev = 0, domain = 0, bus = 0, slot = 0, func = 0;
686 +        int vals = sscanf(value, name_fmt, &rdev, &domain, &bus, &slot, &func);
687 +
688 +       if (vals >= 1 && rdev == makedev(maj,min)) {
689 +            if (vals < 5) {
690 +                /* busid not in the name, try busid */
691 +                length = sizeof(value);
692 +                snprintf(name, sizeof(name), "hw.dri.%i.busid", i);
693 +                if (sysctlbyname(name, value, &length, NULL, 0))
694 +                    break;
695 +                value[length] = '\0';
696 +                if (sscanf(value, bus_fmt, &domain, &bus, &slot, &func) != 4)
697 +                    break;
698 +            }
699 +            info->domain = domain;
700 +            info->bus = bus;
701 +            info->dev = slot;
702 +            info->func = func;
703 +            return 0;
704 +        }
705 +    }
706 +    return -ENODEV;
707  #else
708  #warning "Missing implementation of drmParsePciBusInfo"
709      return -EINVAL;
710 @@ -3057,32 +3149,6 @@ static int drmCompareBusInfo(drmDevicePt
711      return -1;
712  }
713  
714 -static int drmGetNodeType(const char *name)
715 -{
716 -    if (strncmp(name, DRM_PRIMARY_MINOR_NAME,
717 -        sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0)
718 -        return DRM_NODE_PRIMARY;
719 -
720 -    if (strncmp(name, DRM_CONTROL_MINOR_NAME,
721 -        sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0)
722 -        return DRM_NODE_CONTROL;
723 -
724 -    if (strncmp(name, DRM_RENDER_MINOR_NAME,
725 -        sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0)
726 -        return DRM_NODE_RENDER;
727 -
728 -    return -EINVAL;
729 -}
730 -
731 -static int drmGetMaxNodeName(void)
732 -{
733 -    return sizeof(DRM_DIR_NAME) +
734 -           MAX3(sizeof(DRM_PRIMARY_MINOR_NAME),
735 -                sizeof(DRM_CONTROL_MINOR_NAME),
736 -                sizeof(DRM_RENDER_MINOR_NAME)) +
737 -           3 /* length of the node number */;
738 -}
739 -
740  #ifdef __linux__
741  static int parse_separate_sysfs_files(int maj, int min,
742                                        drmPciDeviceInfoPtr device,
743 @@ -3152,6 +3218,7 @@ static int parse_config_sysfs_file(int m
744  #endif
745  
746  static int drmParsePciDeviceInfo(int maj, int min,
747 +                                 drmPciBusInfoPtr info,
748                                   drmPciDeviceInfoPtr device,
749                                   uint32_t flags)
750  {
751 @@ -3188,6 +3255,43 @@ static int drmParsePciDeviceInfo(int maj
752      device->subdevice_id = pinfo.subdevice_id;
753  
754      return 0;
755 +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
756 +    struct pci_conf_io pc;
757 +    struct pci_match_conf patterns[1];
758 +    struct pci_conf results[1];
759 +
760 +    int fd = open("/dev/pci", O_RDONLY, 0);
761 +    if (fd < 0)
762 +        return -errno;
763 +
764 +    bzero(&patterns, sizeof(patterns));
765 +    patterns[0].pc_sel.pc_domain = info->domain;
766 +    patterns[0].pc_sel.pc_bus = info->bus;
767 +    patterns[0].pc_sel.pc_dev = info->dev;
768 +    patterns[0].pc_sel.pc_func = info->func;
769 +    patterns[0].flags = PCI_GETCONF_MATCH_DOMAIN | PCI_GETCONF_MATCH_BUS
770 +                      | PCI_GETCONF_MATCH_DEV | PCI_GETCONF_MATCH_FUNC;
771 +    bzero(&pc, sizeof(struct pci_conf_io));
772 +    pc.num_patterns = 1;
773 +    pc.pat_buf_len = sizeof(patterns);
774 +    pc.patterns = patterns;
775 +    pc.match_buf_len = sizeof(results);
776 +    pc.matches = results;
777 +
778 +    if (ioctl(fd, PCIOCGETCONF, &pc) || pc.status == PCI_GETCONF_ERROR) {
779 +        int error = errno;
780 +        close(fd);
781 +        return -error;
782 +    }
783 +    close(fd);
784 +
785 +    device->vendor_id = results[0].pc_vendor;
786 +    device->device_id = results[0].pc_device;
787 +    device->subvendor_id = results[0].pc_subvendor;
788 +    device->subdevice_id = results[0].pc_subdevice;
789 +    device->revision_id = results[0].pc_revid;
790 +
791 +    return 0;
792  #else
793  #warning "Missing implementation of drmParsePciDeviceInfo"
794      return -EINVAL;
795 @@ -3268,7 +3372,7 @@ static drmDevicePtr drmDeviceAlloc(unsig
796      unsigned int i;
797      char *ptr;
798  
799 -    max_node_length = ALIGN(drmGetMaxNodeName(), sizeof(void *));
800 +    max_node_length = ALIGN(DRM_NODE_NAME_MAX, sizeof(void *));
801      extra = DRM_NODE_MAX * (sizeof(void *) + max_node_length);
802  
803      size = sizeof(*device) + extra + bus_size + device_size;
804 @@ -3314,7 +3418,7 @@ static int drmProcessPciDevice(drmDevice
805  
806      dev->businfo.pci = (drmPciBusInfoPtr)addr;
807  
808 -    ret = drmParsePciBusInfo(maj, min, dev->businfo.pci);
809 +    ret = drmParsePciBusInfo(node, node_type, maj, min, dev->businfo.pci);
810      if (ret)
811          goto free_device;
812  
813 @@ -3323,7 +3427,7 @@ static int drmProcessPciDevice(drmDevice
814          addr += sizeof(drmPciBusInfo);
815          dev->deviceinfo.pci = (drmPciDeviceInfoPtr)addr;
816  
817 -        ret = drmParsePciDeviceInfo(maj, min, dev->deviceinfo.pci, flags);
818 +        ret = drmParsePciDeviceInfo(maj, min, dev->businfo.pci, dev->deviceinfo.pci, flags);
819          if (ret)
820              goto free_device;
821      }
822 @@ -3673,7 +3777,7 @@ static void drmFoldDuplicatedDevices(drm
823                  local_devices[i]->available_nodes |= local_devices[j]->available_nodes;
824                  node_type = log2(local_devices[j]->available_nodes);
825                  memcpy(local_devices[i]->nodes[node_type],
826 -                       local_devices[j]->nodes[node_type], drmGetMaxNodeName());
827 +                       local_devices[j]->nodes[node_type], DRM_NODE_NAME_MAX);
828                  drmFreeDevice(&local_devices[j]);
829              }
830          }
831 @@ -3691,7 +3795,7 @@ drm_device_validate_flags(uint32_t flags
832   * Get information about the opened drm device
833   *
834   * \param fd file descriptor of the drm device
835 - * \param flags feature/behaviour bitmask
836 + * \param flags feature/behavior bitmask
837   * \param device the address of a drmDevicePtr where the information
838   *               will be allocated in stored
839   *
840 @@ -3709,8 +3813,8 @@ int drmGetDevice2(int fd, uint32_t flags
841       * Avoid stat'ing all of /dev needlessly by implementing this custom path.
842       */
843      drmDevicePtr     d;
844 -    struct stat      sbuf;
845 -    char             node[PATH_MAX + 1];
846 +    stat_t           sbuf;
847 +    char             node[DRM_NODE_NAME_MAX];
848      const char      *dev_name;
849      int              node_type, subsystem_type;
850      int              maj, min, n, ret, base;
851 @@ -3731,26 +3835,16 @@ int drmGetDevice2(int fd, uint32_t flags
852      if (node_type == -1)
853          return -ENODEV;
854  
855 -    switch (node_type) {
856 -    case DRM_NODE_PRIMARY:
857 -        dev_name = DRM_DEV_NAME;
858 -        break;
859 -    case DRM_NODE_CONTROL:
860 -        dev_name = DRM_CONTROL_DEV_NAME;
861 -        break;
862 -    case DRM_NODE_RENDER:
863 -        dev_name = DRM_RENDER_DEV_NAME;
864 -        break;
865 -    default:
866 +    dev_name = drmGetDeviceName(node_type);
867 +    if (!dev_name)
868          return -EINVAL;
869 -    };
870  
871      base = drmGetMinorBase(node_type);
872      if (base < 0)
873          return -EINVAL;
874  
875 -    n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min - base);
876 -    if (n == -1 || n >= PATH_MAX)
877 +    n = snprintf(node, sizeof(node), dev_name, DRM_DIR_NAME, min - base);
878 +    if (n == -1 || n >= sizeof(node))
879        return -errno;
880      if (stat(node, &sbuf))
881          return -EINVAL;
882 @@ -3771,8 +3865,8 @@ int drmGetDevice2(int fd, uint32_t flags
883      drmDevicePtr d;
884      DIR *sysdir;
885      struct dirent *dent;
886 -    struct stat sbuf;
887 -    char node[PATH_MAX + 1];
888 +    stat_t sbuf;
889 +    char node[DRM_NODE_NAME_MAX];
890      int node_type, subsystem_type;
891      int maj, min;
892      int ret, i, node_count;
893 @@ -3792,7 +3886,7 @@ int drmGetDevice2(int fd, uint32_t flags
894      maj = major(sbuf.st_rdev);
895      min = minor(sbuf.st_rdev);
896  
897 -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
898 +    if ((DRM_MAJOR && maj != DRM_MAJOR) || !S_ISCHR(sbuf.st_mode))
899          return -EINVAL;
900  
901      subsystem_type = drmParseSubsystemType(maj, min);
902 @@ -3813,14 +3907,14 @@ int drmGetDevice2(int fd, uint32_t flags
903          if (node_type < 0)
904              continue;
905  
906 -        snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
907 +        snprintf(node, sizeof(node), "%s/%s", DRM_DIR_NAME, dent->d_name);
908          if (stat(node, &sbuf))
909              continue;
910  
911          maj = major(sbuf.st_rdev);
912          min = minor(sbuf.st_rdev);
913  
914 -        if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
915 +        if ((DRM_MAJOR && maj != DRM_MAJOR) || !S_ISCHR(sbuf.st_mode))
916              continue;
917  
918          if (drmParseSubsystemType(maj, min) != subsystem_type)
919 @@ -3918,7 +4012,7 @@ int drmGetDevice(int fd, drmDevicePtr *d
920  /**
921   * Get drm devices on the system
922   *
923 - * \param flags feature/behaviour bitmask
924 + * \param flags feature/behavior bitmask
925   * \param devices the array of devices with drmDevicePtr elements
926   *                can be NULL to get the device number first
927   * \param max_devices the maximum number of devices for the array
928 @@ -3937,8 +4031,8 @@ int drmGetDevices2(uint32_t flags, drmDe
929      drmDevicePtr device;
930      DIR *sysdir;
931      struct dirent *dent;
932 -    struct stat sbuf;
933 -    char node[PATH_MAX + 1];
934 +    stat_t sbuf;
935 +    char node[DRM_NODE_NAME_MAX];
936      int node_type, subsystem_type;
937      int maj, min;
938      int ret, i, node_count, device_count;
939 @@ -3963,14 +4057,14 @@ int drmGetDevices2(uint32_t flags, drmDe
940          if (node_type < 0)
941              continue;
942  
943 -        snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name);
944 +        snprintf(node, sizeof(node), "%s/%s", DRM_DIR_NAME, dent->d_name);
945          if (stat(node, &sbuf))
946              continue;
947  
948          maj = major(sbuf.st_rdev);
949          min = minor(sbuf.st_rdev);
950  
951 -        if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
952 +        if ((DRM_MAJOR && maj != DRM_MAJOR) || !S_ISCHR(sbuf.st_mode))
953              continue;
954  
955          subsystem_type = drmParseSubsystemType(maj, min);
956 @@ -4078,7 +4172,7 @@ int drmGetDevices(drmDevicePtr devices[]
957  char *drmGetDeviceNameFromFd2(int fd)
958  {
959  #ifdef __linux__
960 -    struct stat sbuf;
961 +    stat_t sbuf;
962      char path[PATH_MAX + 1], *value;
963      unsigned int maj, min;
964  
965 @@ -4101,9 +4195,26 @@ char *drmGetDeviceNameFromFd2(int fd)
966      free(value);
967  
968      return strdup(path);
969 +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
970 +    stat_t sbuf;
971 +    if (fstat(fd, &sbuf))
972 +        return NULL;
973 +
974 +    dev_t rdev = sbuf.st_rdev;
975 +    /* minor numbers don't depend on node name suffix, search for a match */
976 +    for (int i = 0; i < DRM_MAX_MINOR; ++i) {
977 +        char node[DRM_NODE_NAME_MAX];
978 +        for (int j = 0; j < DRM_NODE_MAX; ++j) {
979 +            snprintf(node, sizeof(node), drmGetDeviceName(j),
980 +                     DRM_DIR_NAME, drmGetMinorBase(j) + i);
981 +            if (stat(node, &sbuf) == 0 && sbuf.st_rdev == rdev)
982 +                return strdup(node);
983 +        }
984 +    }
985 +    return NULL;
986  #else
987 -    struct stat      sbuf;
988 -    char             node[PATH_MAX + 1];
989 +    stat_t           sbuf;
990 +    char             node[DRM_NODE_NAME_MAX];
991      const char      *dev_name;
992      int              node_type;
993      int              maj, min, n, base;
994 @@ -4121,26 +4232,16 @@ char *drmGetDeviceNameFromFd2(int fd)
995      if (node_type == -1)
996          return NULL;
997  
998 -    switch (node_type) {
999 -    case DRM_NODE_PRIMARY:
1000 -        dev_name = DRM_DEV_NAME;
1001 -        break;
1002 -    case DRM_NODE_CONTROL:
1003 -        dev_name = DRM_CONTROL_DEV_NAME;
1004 -        break;
1005 -    case DRM_NODE_RENDER:
1006 -        dev_name = DRM_RENDER_DEV_NAME;
1007 -        break;
1008 -    default:
1009 +    dev_name = drmGetDeviceName(node_type);
1010 +    if (!dev_name)
1011          return NULL;
1012 -    };
1013  
1014      base = drmGetMinorBase(node_type);
1015      if (base < 0)
1016          return NULL;
1017  
1018 -    n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min - base);
1019 -    if (n == -1 || n >= PATH_MAX)
1020 +    n = snprintf(node, sizeof(node), dev_name, DRM_DIR_NAME, min - base);
1021 +    if (n == -1 || n >= sizeof(node))
1022        return NULL;
1023  
1024      return strdup(node);
1025
1026
1027 [FILE:1334:patches/patch-xf86drm.h]
1028 --- xf86drm.h.orig      2017-04-07 08:49:13 UTC
1029 +++ xf86drm.h
1030 @@ -78,17 +78,27 @@ extern "C" {
1031  
1032  #ifdef __OpenBSD__
1033  #define DRM_DIR_NAME  "/dev"
1034 -#define DRM_DEV_NAME  "%s/drm%d"
1035 -#define DRM_CONTROL_DEV_NAME  "%s/drmC%d"
1036 -#define DRM_RENDER_DEV_NAME  "%s/drmR%d"
1037 +#define DRM_PRIMARY_MINOR_NAME  "drm"
1038 +#define DRM_CONTROL_MINOR_NAME  "drmC"
1039 +#define DRM_RENDER_MINOR_NAME   "drmR"
1040  #else
1041  #define DRM_DIR_NAME  "/dev/dri"
1042 -#define DRM_DEV_NAME  "%s/card%d"
1043 -#define DRM_CONTROL_DEV_NAME  "%s/controlD%d"
1044 -#define DRM_RENDER_DEV_NAME  "%s/renderD%d"
1045 -#define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */
1046 +#define DRM_PRIMARY_MINOR_NAME  "card"
1047 +#define DRM_CONTROL_MINOR_NAME  "controlD"
1048 +#define DRM_RENDER_MINOR_NAME   "renderD"
1049  #endif
1050  
1051 +#define DRM_DEV_NAME  "%s/" DRM_PRIMARY_MINOR_NAME "%d"
1052 +#define DRM_CONTROL_DEV_NAME  "%s/" DRM_CONTROL_MINOR_NAME "%d"
1053 +#define DRM_RENDER_DEV_NAME  "%s/" DRM_RENDER_MINOR_NAME "%d"
1054 +
1055 +#define DRM_NODE_NAME_MAX                   \
1056 +    (sizeof(DRM_DIR_NAME) +                 \
1057 +     MAX3(sizeof(DRM_PRIMARY_MINOR_NAME),   \
1058 +         sizeof(DRM_CONTROL_MINOR_NAME),    \
1059 +         sizeof(DRM_RENDER_MINOR_NAME))     \
1060 +    + 3) /* length of the node number */
1061 +
1062  #define DRM_ERR_NO_DEVICE  (-1001)
1063  #define DRM_ERR_NO_ACCESS  (-1002)
1064  #define DRM_ERR_NOT_ROOT   (-1003)
1065
1066
1067 [FILE:3299:patches/patch-xf86drmMode.c]
1068 --- xf86drmMode.c.orig  2017-04-07 08:49:13 UTC
1069 +++ xf86drmMode.c
1070 @@ -47,6 +47,7 @@
1071  #include <stdlib.h>
1072  #include <sys/ioctl.h>
1073  #ifdef HAVE_SYS_SYSCTL_H
1074 +#include <sys/types.h>
1075  #include <sys/sysctl.h>
1076  #endif
1077  #include <stdio.h>
1078 @@ -796,43 +797,60 @@ int drmCheckModesettingSupported(const c
1079         closedir(sysdir);
1080         if (found)
1081                 return 0;
1082 -#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
1083 -       char kbusid[1024], sbusid[1024];
1084 -       char oid[128];
1085 -       int domain, bus, dev, func;
1086 -       int i, modesetting, ret;
1087 -       size_t len;
1088 +#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__DragonFly__)
1089 +       #define bus_fmt "pci:%04x:%02x:%02x.%u"
1090 +       #define name_fmt "%*s %*s " bus_fmt
1091 +       unsigned int d1 = 0, b1 = 0, s1 = 0, f1 = 0;
1092 +       if (sscanf(busid, bus_fmt, &d1, &b1, &s1, &f1) != 4)
1093 +                return -EINVAL;
1094 +       /*
1095 +        * hw.dri.%i.bus is not always present and hw.dri.%i.name does not
1096 +        * always contain the busid, so try both for best chance of success
1097 +        */
1098 +       for (int i = 0; i < DRM_MAX_MINOR; ++i) {
1099 +               char name[22], value[256];
1100 +               size_t length = sizeof(value);
1101 +               snprintf(name, sizeof(name), "hw.dri.%i.name", i);
1102 +               if (sysctlbyname(name, value, &length, NULL, 0))
1103 +                       continue;
1104  
1105 -       ret = sscanf(busid, "pci:%04x:%02x:%02x.%d", &domain, &bus, &dev,
1106 -           &func);
1107 -       if (ret != 4)
1108 -               return -EINVAL;
1109 -       snprintf(kbusid, sizeof(kbusid), "pci:%04x:%02x:%02x.%d", domain, bus,
1110 -           dev, func);
1111 +               value[length] = '\0';
1112 +               unsigned int d2 = 0, b2 = 0, s2 = 0, f2 = 0;
1113 +               switch (sscanf(value, name_fmt, &d2, &b2, &s2, &f2)) {
1114 +               case 0: /* busid not in the name, try busid */
1115 +                       length = sizeof(value);
1116 +                       snprintf(name, sizeof(name), "hw.dri.%i.busid", i);
1117 +                       if (sysctlbyname(name, value, &length, NULL, 0))
1118 +                               continue;
1119  
1120 -       /* How many GPUs do we expect in the machine ? */
1121 -       for (i = 0; i < 16; i++) {
1122 -               snprintf(oid, sizeof(oid), "hw.dri.%d.busid", i);
1123 -               len = sizeof(sbusid);
1124 -               ret = sysctlbyname(oid, sbusid, &len, NULL, 0);
1125 -               if (ret == -1) {
1126 -                       if (errno == ENOENT)
1127 +                       value[length] = '\0';
1128 +                       if (sscanf(value, bus_fmt, &d2, &b2, &s2, &f2) != 4)
1129                                 continue;
1130 -                       return -EINVAL;
1131 +                       /* fall through after parsing busid */
1132 +
1133 +               case 4: /* if we jumped here then busid was in the name */ 
1134 +                       if (d1 == d2 && b1 == b2 && s1 == s2 && f1 == f2) {
1135 +                       /*
1136 +                        * Confirm the drm driver for this device supports KMS,
1137 +                        * except on DragonFly where all the drm drivers do so
1138 +                        * but only hw.dri.0.modesetting is present
1139 +                        */ 
1140 +                       #ifndef __DragonFly__
1141 +                               int modesetting = 0;
1142 +                               length = sizeof(modesetting);
1143 +                               snprintf(name, sizeof(name), "hw.dri.%i.modesetting", i);
1144 +                               if (sysctlbyname(name, &modesetting, &length, NULL, 0)
1145 +                                || length != sizeof(modesetting) || !modesetting)
1146 +                                       return -ENOSYS;
1147 +                               else
1148 +                       #endif
1149 +                                       return 0;
1150 +                       }
1151 +               default:
1152 +                       break;
1153                 }
1154 -               if (strcmp(sbusid, kbusid) != 0)
1155 -                       continue;
1156 -               snprintf(oid, sizeof(oid), "hw.dri.%d.modesetting", i);
1157 -               len = sizeof(modesetting);
1158 -               ret = sysctlbyname(oid, &modesetting, &len, NULL, 0);
1159 -               if (ret == -1 || len != sizeof(modesetting))
1160 -                       return -EINVAL;
1161 -               return (modesetting ? 0 : -ENOSYS);
1162         }
1163 -#elif defined(__DragonFly__)
1164 -       return 0;
1165 -#endif
1166 -#ifdef __OpenBSD__
1167 +#elif defined(__OpenBSD__)
1168         int     fd;
1169         struct drm_mode_card_res res;
1170         drmModeResPtr r = 0;
1171
1172
1173 [FILE:728:freebsd/patch-xf86drm.c]
1174 Error code 512 is being leaked from kernel space. While it should be
1175 converted to either EINTR or EAGAIN in the kernel. Teach libdrm to do this
1176 for now. Newer kernel modules will have this fixed included.
1177
1178 dragonfly fixed this issue in,
1179 http://gitweb.dragonflybsd.org/dragonfly.git/commit/b922632f623ee2cc2c1346bb3a6894a7756676aa
1180 which has been included since the 4.4 release.
1181
1182 --- xf86drm.c.orig      2017-01-30 13:59:15.919081000 +0100
1183 +++ xf86drm.c
1184 @@ -197,7 +197,7 @@ drmIoctl(int fd, unsigned long request, 
1185  
1186      do {
1187          ret = ioctl(fd, request, arg);
1188 -    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
1189 +    } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == 512));
1190      return ret;
1191  }
1192  
1193