mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2025-12-28 09:50:12 +01:00
Merge branch 'add-hurd-support' into 'main'
Add support for GNU/Hurd See merge request mesa/libdrm!441
This commit is contained in:
commit
d3be62df48
3 changed files with 67 additions and 17 deletions
|
|
@ -41,6 +41,21 @@
|
|||
#include <asm/ioctl.h>
|
||||
typedef unsigned int drm_handle_t;
|
||||
|
||||
#elif defined(__GNU__)
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <mach/i386/ioccom.h>
|
||||
typedef __int8_t __s8;
|
||||
typedef __uint8_t __u8;
|
||||
typedef __int16_t __s16;
|
||||
typedef __uint16_t __u16;
|
||||
typedef __int32_t __s32;
|
||||
typedef __uint32_t __u32;
|
||||
typedef __int64_t __s64;
|
||||
typedef __uint64_t __u64;
|
||||
typedef size_t __kernel_size_t;
|
||||
typedef unsigned int drm_handle_t;
|
||||
|
||||
#else /* One of the BSDs */
|
||||
|
||||
#include <stdint.h>
|
||||
|
|
|
|||
59
xf86drm.c
59
xf86drm.c
|
|
@ -101,7 +101,7 @@
|
|||
#define DRM_MAJOR 226 /* Linux */
|
||||
#endif
|
||||
|
||||
#if defined(__OpenBSD__) || defined(__DragonFly__)
|
||||
#if defined(__OpenBSD__) || defined(__DragonFly__) || defined(__GNU__)
|
||||
struct drm_pciinfo {
|
||||
uint16_t domain;
|
||||
uint8_t bus;
|
||||
|
|
@ -3495,7 +3495,8 @@ static char *drmGetMinorNameForFD(int fd, int type)
|
|||
return strdup(name);
|
||||
#else
|
||||
struct stat sbuf;
|
||||
char buf[PATH_MAX + 1];
|
||||
int len = 0;
|
||||
char *buf = NULL;
|
||||
const char *dev_name = drmGetDeviceName(type);
|
||||
unsigned int maj, min;
|
||||
int n;
|
||||
|
|
@ -3512,11 +3513,19 @@ static char *drmGetMinorNameForFD(int fd, int type)
|
|||
if (!dev_name)
|
||||
return NULL;
|
||||
|
||||
n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min);
|
||||
if (n == -1 || n >= sizeof(buf))
|
||||
len = snprintf(NULL, 0, dev_name, DRM_DIR_NAME, min);
|
||||
if (len < 0)
|
||||
return NULL;
|
||||
len++;
|
||||
buf = malloc(len);
|
||||
n = snprintf(buf, len, dev_name, DRM_DIR_NAME, min);
|
||||
if (n == -1 || n >= len) {
|
||||
free(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return buf;
|
||||
|
||||
return strdup(buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -3636,7 +3645,7 @@ static int drmParseSubsystemType(int maj, int min)
|
|||
return DRM_BUS_VIRTIO;
|
||||
}
|
||||
return subsystem_type;
|
||||
#elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__)
|
||||
#elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__GNU__)
|
||||
return DRM_BUS_PCI;
|
||||
#else
|
||||
#warning "Missing implementation of drmParseSubsystemType"
|
||||
|
|
@ -3744,7 +3753,7 @@ static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info)
|
|||
info->func = func;
|
||||
|
||||
return 0;
|
||||
#elif defined(__OpenBSD__) || defined(__DragonFly__)
|
||||
#elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__GNU__)
|
||||
struct drm_pciinfo pinfo;
|
||||
int fd, type;
|
||||
|
||||
|
|
@ -3915,7 +3924,7 @@ static int drmParsePciDeviceInfo(int maj, int min,
|
|||
return parse_config_sysfs_file(maj, min, device);
|
||||
|
||||
return 0;
|
||||
#elif defined(__OpenBSD__) || defined(__DragonFly__)
|
||||
#elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__GNU__)
|
||||
struct drm_pciinfo pinfo;
|
||||
int fd, type;
|
||||
|
||||
|
|
@ -4524,18 +4533,28 @@ process_device(drmDevicePtr *device, const char *d_name,
|
|||
bool fetch_deviceinfo, uint32_t flags)
|
||||
{
|
||||
struct stat sbuf;
|
||||
char node[PATH_MAX + 1];
|
||||
int node_type, subsystem_type, written;
|
||||
char *node = NULL;
|
||||
int node_type, subsystem_type, written, len = 0;
|
||||
unsigned int maj, min;
|
||||
const int max_node_length = ALIGN(drmGetMaxNodeName(), sizeof(void *));
|
||||
|
||||
node_type = drmGetNodeType(d_name);
|
||||
if (node_type < 0)
|
||||
return -1;
|
||||
len = snprintf(NULL, 0, "%s/%s", DRM_DIR_NAME, d_name);
|
||||
if (len < 0)
|
||||
return -1;
|
||||
len++;
|
||||
node = malloc(len);
|
||||
written = snprintf(node, len, "%s/%s", DRM_DIR_NAME, d_name);
|
||||
if (written == -1 || written >= len) {
|
||||
free(node);
|
||||
}
|
||||
|
||||
written = snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, d_name);
|
||||
if (written < 0)
|
||||
if (stat(node, &sbuf)) {
|
||||
free(node);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* anything longer than this will be truncated in drmDeviceAlloc.
|
||||
* Account for NULL byte
|
||||
|
|
@ -4940,10 +4959,10 @@ drm_public char *drmGetDeviceNameFromFd2(int fd)
|
|||
return drmGetDeviceNameFromFd(fd);
|
||||
#else
|
||||
struct stat sbuf;
|
||||
char node[PATH_MAX + 1];
|
||||
char *node = NULL;
|
||||
const char *dev_name;
|
||||
int node_type;
|
||||
int maj, min, n;
|
||||
int maj, min, n, len = 0;
|
||||
|
||||
if (fstat(fd, &sbuf))
|
||||
return NULL;
|
||||
|
|
@ -4962,11 +4981,17 @@ drm_public char *drmGetDeviceNameFromFd2(int fd)
|
|||
if (!dev_name)
|
||||
return NULL;
|
||||
|
||||
n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min);
|
||||
if (n == -1 || n >= PATH_MAX)
|
||||
len = snprintf(NULL, 0, dev_name, DRM_DIR_NAME, min);
|
||||
if (len < 0)
|
||||
return NULL;
|
||||
len++;
|
||||
node = malloc(len);
|
||||
|
||||
return strdup(node);
|
||||
n = snprintf(node, len, dev_name, DRM_DIR_NAME, min);
|
||||
if (n == -1 || n >= len)
|
||||
return NULL;
|
||||
|
||||
return node;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
10
xf86drm.h
10
xf86drm.h
|
|
@ -56,6 +56,16 @@ extern "C" {
|
|||
#define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE
|
||||
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
|
||||
|
||||
#elif defined(__GNU__)
|
||||
#include <mach/port.h>
|
||||
#include <hurd/ioctl.h>
|
||||
#define DRM_IOCTL_NR(n) ((n) & 0xff)
|
||||
#define DRM_IOC_VOID IOC_VOID
|
||||
#define DRM_IOC_READ IOC_OUT
|
||||
#define DRM_IOC_WRITE IOC_IN
|
||||
#define DRM_IOC_READWRITE IOC_INOUT
|
||||
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
|
||||
|
||||
#else /* One of the *BSDs */
|
||||
|
||||
#include <sys/ioccom.h>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue