diff -ruwN source-old/include/drm/drm.h source/include/drm/drm.h --- source-old/include/drm/drm.h 2025-06-08 06:27:53.000000000 -0600 +++ source/include/drm/drm.h 2025-10-30 17:17:33.654234959 -0600 @@ -44,7 +44,11 @@ #else /* One of the BSDs */ #include +#if defined(__redox__) +#include +#else #include +#endif #include typedef int8_t __s8; typedef uint8_t __u8; diff -ruwN source-old/xf86drm.c source/xf86drm.c --- source-old/xf86drm.c 2025-06-08 06:27:53.000000000 -0600 +++ source/xf86drm.c 2025-10-30 17:18:58.374958567 -0600 @@ -57,6 +57,19 @@ #ifdef MAJOR_IN_SYSMACROS #include #endif +#if defined(__redox__) +// From musl sys/sysmacros.h +#define major(x) \ + ((unsigned)( (((x)>>31>>1) & 0xfffff000) | (((x)>>8) & 0x00000fff) )) +#define minor(x) \ + ((unsigned)( (((x)>>12) & 0xffffff00) | ((x) & 0x000000ff) )) + +#define makedev(x,y) ( \ + (((x)&0xfffff000ULL) << 32) | \ + (((x)&0x00000fffULL) << 8) | \ + (((y)&0xffffff00ULL) << 12) | \ + (((y)&0x000000ffULL)) ) +#endif #if HAVE_SYS_SYSCTL_H #include #endif @@ -304,9 +317,14 @@ char *modifier_name = NULL; bool result = false; +#if defined(__redox__) + fprintf(stderr, "open_memstream not available on Redox\n"); + return NULL; +#else fp = open_memstream(&modifier_name, &size); if (!fp) return NULL; +#endif switch (type) { case DRM_FORMAT_MOD_ARM_TYPE_AFBC: @@ -409,9 +427,14 @@ char *mod_amd = NULL; size_t size = 0; +#if defined(__redox__) + fprintf(stderr, "open_memstream not available on Redox\n"); + return NULL; +#else fp = open_memstream(&mod_amd, &size); if (!fp) return NULL; +#endif switch (tile_version) { case AMD_FMT_MOD_TILE_VER_GFX9: @@ -3657,7 +3657,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(__redox__) return DRM_BUS_PCI; #else #warning "Missing implementation of drmParseSubsystemType" @@ -3791,6 +3791,8 @@ static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info) return 0; #elif defined(__FreeBSD__) return get_sysctl_pci_bus_info(maj, min, info); +#elif defined(__redox__) + return 0; // FIXME maybe parse DRM_IOCTL_GET_UNIQUE? #else #warning "Missing implementation of drmParsePciBusInfo" return -EINVAL; @@ -4000,6 +4002,8 @@ static int drmParsePciDeviceInfo(int maj, int min, device->revision_id = results[0].pc_revid; return 0; +#elif defined(__redox__) + return 0; // FIXME get this info somehow? #else #warning "Missing implementation of drmParsePciDeviceInfo" return -EINVAL; @@ -4511,8 +4515,11 @@ process_device(drmDevicePtr *device, const char *d_name, maj = major(sbuf.st_rdev); min = minor(sbuf.st_rdev); + // Doesn't work on Redox as /dev/dri/cardN is a symlink +#ifndef __redox__ if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode)) return -1; +#endif subsystem_type = drmParseSubsystemType(maj, min); if (req_subsystem_type != -1 && req_subsystem_type != subsystem_type) diff -ruwN source-old/xf86drm.h source/xf86drm.h --- source-old/xf86drm.h 2025-06-08 06:27:53.000000000 -0600 +++ source/xf86drm.h 2025-10-30 17:17:33.655115281 -0600 @@ -47,7 +47,7 @@ #define DRM_MAX_MINOR 64 /* deprecated */ #endif -#if defined(__linux__) +#if defined(__linux__) || defined(__redox__) #define DRM_IOCTL_NR(n) _IOC_NR(n) #define DRM_IOC_VOID _IOC_NONE