diff --git a/repos/libports/lib/mk/libdrm.inc b/repos/libports/lib/mk/libdrm.inc index 36e9a5b868..227cea307f 100644 --- a/repos/libports/lib/mk/libdrm.inc +++ b/repos/libports/lib/mk/libdrm.inc @@ -20,7 +20,7 @@ SRC_C := xf86drm.c \ SRC_C += dummies.c -CC_OPT = -DHAVE_LIBDRM_ATOMIC_PRIMITIVES=1 -DHAVE_SYS_SYSCTL_H=1 +CC_OPT = -D__GENODE__ -DHAVE_LIBDRM_ATOMIC_PRIMITIVES=1 -DHAVE_SYS_SYSCTL_H=1 # # We rename 'ioctl' calls to 'genode_ioctl' calls, this way we are not required diff --git a/repos/libports/ports/libdrm.hash b/repos/libports/ports/libdrm.hash index 9c99ec0f44..3509d0cff5 100644 --- a/repos/libports/ports/libdrm.hash +++ b/repos/libports/ports/libdrm.hash @@ -1 +1 @@ -b9c5f6ab814f107e5eb743892281c6ef0e80d860 +cacc86de9adf92f7dc7212928555d9e7f640da76 diff --git a/repos/libports/ports/libdrm.port b/repos/libports/ports/libdrm.port index fba5650045..73e42cb893 100644 --- a/repos/libports/ports/libdrm.port +++ b/repos/libports/ports/libdrm.port @@ -1,9 +1,9 @@ LICENSE := MIT -VERSION := 2.4.105 +VERSION := 2.4.120 DOWNLOADS := libdrm.archive URL(libdrm) := https://dri.freedesktop.org/libdrm/libdrm-$(VERSION).tar.xz -SHA(libdrm) := 1d1d024b7cadc63e2b59cddaca94f78864940ab440843841113fbac6afaf2a46 +SHA(libdrm) := 3bf55363f76c7250946441ab51d3a6cc0ae518055c0ff017324ab76cdefb327a DIR(libdrm) := src/lib/libdrm FILE_LIST := $(REP_DIR)/src/lib/libdrm/files.list TAR_OPT(libdrm) := --strip-components=1 --files-from $(FILE_LIST) diff --git a/repos/libports/src/lib/libdrm/files.list b/repos/libports/src/lib/libdrm/files.list index d5b06650d8..fb7d97ad1c 100644 --- a/repos/libports/src/lib/libdrm/files.list +++ b/repos/libports/src/lib/libdrm/files.list @@ -1,42 +1,41 @@ -libdrm-2.4.105/etnaviv/etnaviv_bo.c -libdrm-2.4.105/etnaviv/etnaviv_bo_cache.c -libdrm-2.4.105/etnaviv/etnaviv_cmd_stream.c -libdrm-2.4.105/etnaviv/etnaviv_device.c -libdrm-2.4.105/etnaviv/etnaviv_drm.h -libdrm-2.4.105/etnaviv/etnaviv_drmif.h -libdrm-2.4.105/etnaviv/etnaviv_gpu.c -libdrm-2.4.105/etnaviv/etnaviv_perfmon.c -libdrm-2.4.105/etnaviv/etnaviv_pipe.c -libdrm-2.4.105/etnaviv/etnaviv_priv.h -libdrm-2.4.105/include/drm/drm.h -libdrm-2.4.105/include/drm/drm_mode.h -libdrm-2.4.105/include/drm/i915_drm.h -libdrm-2.4.105/intel/i915_pciids.h -libdrm-2.4.105/intel/intel_aub.h -libdrm-2.4.105/intel/intel_bufmgr.c -libdrm-2.4.105/intel/intel_bufmgr.h -libdrm-2.4.105/intel/intel_bufmgr_fake.c -libdrm-2.4.105/intel/intel_bufmgr_gem.c -libdrm-2.4.105/intel/intel_bufmgr_priv.h -libdrm-2.4.105/intel/intel_chipset.c -libdrm-2.4.105/intel/intel_chipset.h -libdrm-2.4.105/intel/intel_debug.h -libdrm-2.4.105/intel/intel_decode.c -libdrm-2.4.105/intel/mm.c -libdrm-2.4.105/intel/mm.h -libdrm-2.4.105/intel/test_decode.c -libdrm-2.4.105/intel/uthash.h -libdrm-2.4.105/libdrm_lists.h -libdrm-2.4.105/libsync.h -libdrm-2.4.105/util_double_list.h -libdrm-2.4.105/util_math.h -libdrm-2.4.105/xf86atomic.h -libdrm-2.4.105/xf86drm.c -libdrm-2.4.105/xf86drm.h -libdrm-2.4.105/xf86drmHash.c -libdrm-2.4.105/xf86drmHash.h -libdrm-2.4.105/xf86drmMode.c -libdrm-2.4.105/xf86drmMode.h -libdrm-2.4.105/xf86drmRandom.c -libdrm-2.4.105/xf86drmRandom.h -libdrm-2.4.105/xf86drmSL.c +libdrm-2.4.120/etnaviv/etnaviv_bo.c +libdrm-2.4.120/etnaviv/etnaviv_bo_cache.c +libdrm-2.4.120/etnaviv/etnaviv_cmd_stream.c +libdrm-2.4.120/etnaviv/etnaviv_device.c +libdrm-2.4.120/etnaviv/etnaviv_drm.h +libdrm-2.4.120/etnaviv/etnaviv_drmif.h +libdrm-2.4.120/etnaviv/etnaviv_gpu.c +libdrm-2.4.120/etnaviv/etnaviv_perfmon.c +libdrm-2.4.120/etnaviv/etnaviv_pipe.c +libdrm-2.4.120/etnaviv/etnaviv_priv.h +libdrm-2.4.120/include/drm/drm.h +libdrm-2.4.120/include/drm/drm_fourcc.h +libdrm-2.4.120/include/drm/drm_mode.h +libdrm-2.4.120/include/drm/i915_drm.h +libdrm-2.4.120/intel/intel_aub.h +libdrm-2.4.120/intel/intel_bufmgr.c +libdrm-2.4.120/intel/intel_bufmgr.h +libdrm-2.4.120/intel/intel_bufmgr_fake.c +libdrm-2.4.120/intel/intel_bufmgr_gem.c +libdrm-2.4.120/intel/intel_bufmgr_priv.h +libdrm-2.4.120/intel/intel_chipset.h +libdrm-2.4.120/intel/intel_debug.h +libdrm-2.4.120/intel/intel_decode.c +libdrm-2.4.120/intel/mm.c +libdrm-2.4.120/intel/mm.h +libdrm-2.4.120/intel/test_decode.c +libdrm-2.4.120/intel/uthash.h +libdrm-2.4.120/libdrm_lists.h +libdrm-2.4.120/libsync.h +libdrm-2.4.120/util_double_list.h +libdrm-2.4.120/util_math.h +libdrm-2.4.120/xf86atomic.h +libdrm-2.4.120/xf86drm.c +libdrm-2.4.120/xf86drm.h +libdrm-2.4.120/xf86drmHash.c +libdrm-2.4.120/xf86drmHash.h +libdrm-2.4.120/xf86drmMode.c +libdrm-2.4.120/xf86drmMode.h +libdrm-2.4.120/xf86drmRandom.c +libdrm-2.4.120/xf86drmRandom.h +libdrm-2.4.120/xf86drmSL.c diff --git a/repos/libports/src/lib/libdrm/include/generated_static_table_fourcc.h b/repos/libports/src/lib/libdrm/include/generated_static_table_fourcc.h new file mode 100644 index 0000000000..468b84e209 --- /dev/null +++ b/repos/libports/src/lib/libdrm/include/generated_static_table_fourcc.h @@ -0,0 +1,58 @@ +/* AUTOMATICALLY GENERATED by gen_table_fourcc.py. You should modify + that script instead of adding here entries manually! */ +static const struct drmFormatModifierInfo drm_format_modifier_table[] = { + { DRM_MODIFIER_INVALID(NONE, INVALID) }, + { DRM_MODIFIER_LINEAR(NONE, LINEAR) }, + { DRM_MODIFIER_INTEL(X_TILED, X_TILED) }, + { DRM_MODIFIER_INTEL(Y_TILED, Y_TILED) }, + { DRM_MODIFIER_INTEL(Yf_TILED, Yf_TILED) }, + { DRM_MODIFIER_INTEL(Y_TILED_CCS, Y_TILED_CCS) }, + { DRM_MODIFIER_INTEL(Yf_TILED_CCS, Yf_TILED_CCS) }, + { DRM_MODIFIER_INTEL(Y_TILED_GEN12_RC_CCS, Y_TILED_GEN12_RC_CCS) }, + { DRM_MODIFIER_INTEL(Y_TILED_GEN12_MC_CCS, Y_TILED_GEN12_MC_CCS) }, + { DRM_MODIFIER_INTEL(Y_TILED_GEN12_RC_CCS_CC, Y_TILED_GEN12_RC_CCS_CC) }, + { DRM_MODIFIER_INTEL(4_TILED, 4_TILED) }, + { DRM_MODIFIER_INTEL(4_TILED_DG2_RC_CCS, 4_TILED_DG2_RC_CCS) }, + { DRM_MODIFIER_INTEL(4_TILED_DG2_MC_CCS, 4_TILED_DG2_MC_CCS) }, + { DRM_MODIFIER_INTEL(4_TILED_DG2_RC_CCS_CC, 4_TILED_DG2_RC_CCS_CC) }, + { DRM_MODIFIER_INTEL(4_TILED_MTL_RC_CCS, 4_TILED_MTL_RC_CCS) }, + { DRM_MODIFIER_INTEL(4_TILED_MTL_MC_CCS, 4_TILED_MTL_MC_CCS) }, + { DRM_MODIFIER_INTEL(4_TILED_MTL_RC_CCS_CC, 4_TILED_MTL_RC_CCS_CC) }, + { DRM_MODIFIER(SAMSUNG, 64_32_TILE, 64_32_TILE) }, + { DRM_MODIFIER(SAMSUNG, 16_16_TILE, 16_16_TILE) }, + { DRM_MODIFIER(QCOM, COMPRESSED, COMPRESSED) }, + { DRM_MODIFIER(QCOM, TILED3, TILED3) }, + { DRM_MODIFIER(QCOM, TILED2, TILED2) }, + { DRM_MODIFIER(VIVANTE, TILED, TILED) }, + { DRM_MODIFIER(VIVANTE, SUPER_TILED, SUPER_TILED) }, + { DRM_MODIFIER(VIVANTE, SPLIT_TILED, SPLIT_TILED) }, + { DRM_MODIFIER(VIVANTE, SPLIT_SUPER_TILED, SPLIT_SUPER_TILED) }, + { DRM_MODIFIER(NVIDIA, TEGRA_TILED, TEGRA_TILED) }, + { DRM_MODIFIER(NVIDIA, 16BX2_BLOCK_ONE_GOB, 16BX2_BLOCK_ONE_GOB) }, + { DRM_MODIFIER(NVIDIA, 16BX2_BLOCK_TWO_GOB, 16BX2_BLOCK_TWO_GOB) }, + { DRM_MODIFIER(NVIDIA, 16BX2_BLOCK_FOUR_GOB, 16BX2_BLOCK_FOUR_GOB) }, + { DRM_MODIFIER(NVIDIA, 16BX2_BLOCK_EIGHT_GOB, 16BX2_BLOCK_EIGHT_GOB) }, + { DRM_MODIFIER(NVIDIA, 16BX2_BLOCK_SIXTEEN_GOB, 16BX2_BLOCK_SIXTEEN_GOB) }, + { DRM_MODIFIER(NVIDIA, 16BX2_BLOCK_THIRTYTWO_GOB, 16BX2_BLOCK_THIRTYTWO_GOB) }, + { DRM_MODIFIER(BROADCOM, VC4_T_TILED, VC4_T_TILED) }, + { DRM_MODIFIER(BROADCOM, SAND32, SAND32) }, + { DRM_MODIFIER(BROADCOM, SAND64, SAND64) }, + { DRM_MODIFIER(BROADCOM, SAND128, SAND128) }, + { DRM_MODIFIER(BROADCOM, SAND256, SAND256) }, + { DRM_MODIFIER(BROADCOM, UIF, UIF) }, + { DRM_MODIFIER(ARM, 16X16_BLOCK_U_INTERLEAVED, 16X16_BLOCK_U_INTERLEAVED) }, + { DRM_MODIFIER(ALLWINNER, TILED, TILED) }, +}; +static const struct drmFormatModifierVendorInfo drm_format_modifier_vendor_table[] = { + { DRM_FORMAT_MOD_VENDOR_NONE, "NONE" }, + { DRM_FORMAT_MOD_VENDOR_INTEL, "INTEL" }, + { DRM_FORMAT_MOD_VENDOR_AMD, "AMD" }, + { DRM_FORMAT_MOD_VENDOR_NVIDIA, "NVIDIA" }, + { DRM_FORMAT_MOD_VENDOR_SAMSUNG, "SAMSUNG" }, + { DRM_FORMAT_MOD_VENDOR_QCOM, "QCOM" }, + { DRM_FORMAT_MOD_VENDOR_VIVANTE, "VIVANTE" }, + { DRM_FORMAT_MOD_VENDOR_BROADCOM, "BROADCOM" }, + { DRM_FORMAT_MOD_VENDOR_ARM, "ARM" }, + { DRM_FORMAT_MOD_VENDOR_ALLWINNER, "ALLWINNER" }, + { DRM_FORMAT_MOD_VENDOR_AMLOGIC, "AMLOGIC" }, +}; diff --git a/repos/libports/src/lib/libdrm/ioctl_etnaviv.cc b/repos/libports/src/lib/libdrm/ioctl_etnaviv.cc index f26276d9cb..fe342cfe50 100644 --- a/repos/libports/src/lib/libdrm/ioctl_etnaviv.cc +++ b/repos/libports/src/lib/libdrm/ioctl_etnaviv.cc @@ -446,6 +446,7 @@ class Etnaviv::Call public: bool defer_destruction { false }; + bool fenced { false }; static constexpr size_t _exec_buffer_size = { 256u << 10 }; @@ -780,9 +781,12 @@ class Etnaviv::Call arg.fence = pending_exec_buffer & 0xffffffffu; /* XXX make part of context ? */ - new (&_heap) Fenceobj(_fenceobj_space, - Gpu_context_space::Id { .value = gc.id() }, - arg.fence); + if (gc.fenced == false) { + new (&_heap) Fenceobj(_fenceobj_space, + Gpu_context_space::Id { .value = gc.id() }, + arg.fence); + gc.fenced = true; + } result = true; } catch (Gpu::Session::Invalid_state) { diff --git a/repos/libports/src/lib/libdrm/ioctl_iris.cc b/repos/libports/src/lib/libdrm/ioctl_iris.cc index 9d483577c8..d6c72203e0 100644 --- a/repos/libports/src/lib/libdrm/ioctl_iris.cc +++ b/repos/libports/src/lib/libdrm/ioctl_iris.cc @@ -31,7 +31,7 @@ extern "C" { #include #include #include - +#include #define DRM_NUMBER(req) ((req) & 0xff) } @@ -39,9 +39,35 @@ namespace Libc { #include #include #include +#include #include } +/* + * This is currently not in upstream libdrm (2.4.120) but in internal Mesa + * 'i195_drm.h' + */ +#ifndef I915_PARAM_PXP_STATUS +/* + * Query the status of PXP support in i915. + * + * The query can fail in the following scenarios with the listed error codes: + * -ENODEV = PXP support is not available on the GPU device or in the + * kernel due to missing component drivers or kernel configs. + * + * If the IOCTL is successful, the returned parameter will be set to one of + * the following values: + * 1 = PXP feature is supported and is ready for use. + * 2 = PXP feature is supported but should be ready soon (pending + * initialization of non-i915 system dependencies). + * + * NOTE: When param is supported (positive return values), user space should + * still refer to the GEM PXP context-creation UAPI header specs to be + * aware of possible failure due to system state machine at the time. + */ +#define I915_PARAM_PXP_STATUS 58 +#endif + using Genode::addr_t; using Genode::Attached_dataspace; using Genode::Constructible; @@ -284,11 +310,18 @@ struct Drm::Buffer Vram::Allocation _allocation; Gpu::addr_t _local_addr { 0 }; + /* handle id's have to start at 1 (0) is invalid */ + static Drm::Buffer_id _new_id() + { + static unsigned long _id = 0; + return Drm::Buffer_id { ++_id }; + } + Buffer(Genode::Env &env, Genode::Id_space &space, Vram::Allocation allocation) : - _env { env }, _elem { *this, space }, _allocation { allocation } + _env { env }, _elem { *this, space, _new_id() }, _allocation { allocation } { } ~Buffer() @@ -319,6 +352,7 @@ struct Drm::Buffer Drm::Buffer_id id() const { + /* skip first id (0) */ return Drm::Buffer_id { _elem.id().value }; } }; @@ -460,7 +494,7 @@ struct Drm::Context _gpu.unmap_gpu(buffer.vram.id, buffer.vram.offset, - buffer.gpu_vaddr); + Utils::limit_to_48bit(buffer.gpu_vaddr)); buffer.gpu_vaddr_valid = false; } @@ -882,6 +916,18 @@ class Drm::Call if (verbose_ioctl) Genode::warning("I915_PARAM_MMAP_GTT_VERSION ", *value); return 0; + /* validates user pointer and size */ + case I915_PARAM_HAS_USERPTR_PROBE: + *value = 0; + return 0; + /* + * Protected Xe Path (PXP) hardware/ME feature (encrypted video memory, TEE, + * ...) + */ + case I915_PARAM_PXP_STATUS: + *value = 0; + errno = ENODEV; + return -1; default: Genode::error("Unhandled device param:", Genode::Hex(param)); return -1; @@ -951,6 +997,18 @@ class Drm::Call return 0; case I915_CONTEXT_PARAM_RECOVERABLE: return 0; + /* + * The id of the associated virtual memory address space (ppGTT) of + * this context. Can be retrieved and passed to another context + * (on the same fd) for both to use the same ppGTT and so share + * address layouts, and avoid reloading the page tables on context + * switches between themselves. + * + * This is currently not supported. + */ + case I915_CONTEXT_PARAM_VM: + return 0; + default: Genode::error(__func__, " unknown param=", p->param); return -1; @@ -964,6 +1022,16 @@ class Drm::Call switch (p->param) { case I915_CONTEXT_PARAM_SSEU: return 0; + + /* addressable VM area (PPGTT 48Bit - one page) for GEN8+ */ + case I915_CONTEXT_PARAM_GTT_SIZE: + p->value = (1ull << 48) - 0x1000; + return 0; + + /* global VM used for sharing BOs between contexts -> not supported so far */ + case I915_CONTEXT_PARAM_VM: + return 0; + default: Genode::error(__func__, " ctx=", p->ctx_id, " param=", p->param, " size=", p->size, " value=", Genode::Hex(p->value)); return -1; @@ -1025,28 +1093,9 @@ class Drm::Call return -1; } - if (p->flags & I915_EXEC_FENCE_ARRAY) { - bool unsupported = false; - - for (unsigned i = 0; i < p->num_cliprects; i++) { - auto &fence = reinterpret_cast(p->cliprects_ptr)[i]; - - Sync_obj::Id const id { .value = fence.handle }; - _sync_objects.apply(id, [&](Sync_obj &) { - /** - * skipping signal fences should be save as long as - * no one tries to wait for ... - * - fence.flags & I915_EXEC_FENCE_SIGNAL - */ - if (fence.flags & I915_EXEC_FENCE_WAIT) - unsupported = true; - }); - } - - if (unsupported) { - Genode::error("fence wait not supported"); - return -1; - } + if (verbose_ioctl && p->flags & I915_EXEC_FENCE_ARRAY) { + Genode::warning("unsupported: Fence array with Sync-objects with " + "FENCE_WAIT/SIGNAL"); } auto const obj = @@ -1055,7 +1104,6 @@ class Drm::Call return _context_space.apply(Drm::Context::id(ctx_id), [&] (Drm::Context &context) { return context.exec_buffer(obj, p->buffer_count, bb_id, p->batch_len); }); - } int _device_gem_busy(void *arg) @@ -1230,13 +1278,14 @@ class Drm::Call } if (ok) { - errno = 62 /* ETIME */; - return -1; + return 0; } else Genode::error("unknown sync object handle ", handles[0]); + errno = EINVAL; return -1; } + int _generic_syncobj_destroy(void *arg) { auto * const p = reinterpret_cast(arg); @@ -1311,11 +1360,35 @@ class Drm::Call } catch (Genode::Id_space::Unknown_id) { return -1; } - p->fd = prime_fd; return 0; } + + /* + * This is used to distinguish between the "i915" and the "xe" kernel + * drivers. Genode's driver is "i915" for now. + */ + int _generic_version(void *arg) + { + auto *version = reinterpret_cast(arg); + + char const *driver = "i915"; + + version->name_len = 5; + if (version->name) + Genode::copy_cstring(version->name, driver, 5); + + /* + * dummy alloc remaining member, since they are de-allocated using 'free' + * in xf86drm.c + */ + if (!version->date) version->date = (char *)Libc::malloc(1); + if (!version->desc) version->desc = (char *)Libc::malloc(1); + + return 0; + } + int _generic_ioctl(unsigned cmd, void *arg) { if (!arg) { @@ -1324,13 +1397,14 @@ class Drm::Call } switch (cmd) { - case DRM_NUMBER(DRM_IOCTL_GEM_CLOSE): return _generic_gem_close(arg); - case DRM_NUMBER(DRM_IOCTL_GEM_FLINK): return _generic_gem_flink(arg); - case DRM_NUMBER(DRM_IOCTL_SYNCOBJ_CREATE): return _generic_syncobj_create(arg); - case DRM_NUMBER(DRM_IOCTL_SYNCOBJ_WAIT): return _generic_syncobj_wait(arg); + case DRM_NUMBER(DRM_IOCTL_GEM_CLOSE): return _generic_gem_close(arg); + case DRM_NUMBER(DRM_IOCTL_GEM_FLINK): return _generic_gem_flink(arg); + case DRM_NUMBER(DRM_IOCTL_GEM_OPEN): return _generic_gem_open(arg); + case DRM_NUMBER(DRM_IOCTL_GET_CAP): return _generic_get_cap(arg); + case DRM_NUMBER(DRM_IOCTL_SYNCOBJ_CREATE): return _generic_syncobj_create(arg); case DRM_NUMBER(DRM_IOCTL_SYNCOBJ_DESTROY): return _generic_syncobj_destroy(arg); - case DRM_NUMBER(DRM_IOCTL_GEM_OPEN): return _generic_gem_open(arg); - case DRM_NUMBER(DRM_IOCTL_GET_CAP): return _generic_get_cap(arg); + case DRM_NUMBER(DRM_IOCTL_SYNCOBJ_WAIT): return _generic_syncobj_wait(arg); + case DRM_NUMBER(DRM_IOCTL_VERSION): return _generic_version(arg); case DRM_NUMBER(DRM_IOCTL_PRIME_FD_TO_HANDLE): return _generic_prime_fd_to_handle(arg); case DRM_NUMBER(DRM_IOCTL_PRIME_HANDLE_TO_FD): @@ -1351,6 +1425,9 @@ class Drm::Call drm_syncobj_create reserve_id_0 { }; if (_generic_syncobj_create(&reserve_id_0)) Genode::warning("syncobject 0 not reserved"); + + /* make handle id 0 unavailable in buffer space */ + _alloc_buffer(0x1000, [](Buffer &) { }); } ~Call() @@ -1425,6 +1502,18 @@ class Drm::Call return device ? _device_ioctl(device_number(request), arg) : _generic_ioctl(command_number(request), arg); } + + /* + * Mesa 24+ way to retrieve device information (incomplete, expand as + * needed). Before it was done via '_device_getparam' + */ + int drm_pci_device(drmDevicePtr device) + { + device->deviceinfo.pci->device_id = _gpu_info.chip_id; + device->deviceinfo.pci->revision_id = _gpu_info.revision.value; + + return 0; + } }; @@ -1493,3 +1582,17 @@ extern "C" int genode_ioctl(int /* fd */, unsigned long request, void *arg) if (verbose_ioctl) { Genode::log("returned ", ret, " from ", __builtin_return_address(0)); } return ret; } + + +extern "C" int genode_drmGetPciDevice(int fd, uint32_t flags, drmDevicePtr device) +{ + if (_call.constructed() == false) { errno = EIO; return -1; } + + /* TODO create constant */ + if (fd != 43) { + Genode::error(__func__, " fd is not Genode Iris (43)"); + return -ENODEV; + } + + return _call->drm_pci_device(device); +} diff --git a/repos/libports/src/lib/libdrm/patches/xf86drm.patch b/repos/libports/src/lib/libdrm/patches/xf86drm.patch new file mode 100644 index 0000000000..3dfd5be329 --- /dev/null +++ b/repos/libports/src/lib/libdrm/patches/xf86drm.patch @@ -0,0 +1,65 @@ +diff --git a/src/lib/libdrm/xf86drm.c b/src/lib/libdrm/xf86drm.c +index 2e76f0e..ff7e432 100644 +--- a/src/lib/libdrm/xf86drm.c ++++ b/src/lib/libdrm/xf86drm.c +@@ -4562,6 +4562,7 @@ drm_device_has_rdev(drmDevicePtr device, dev_t find_rdev) + */ + #define MAX_DRM_NODES 256 + ++ + /** + * Get information about a device from its dev_t identifier + * +@@ -4704,6 +4705,10 @@ drm_public int drmGetNodeTypeFromDevId(dev_t devid) + return node_type; + } + ++#ifdef __GENODE__ ++int genode_drmGetPciDevice(int fd, uint32_t flags, drmDevicePtr device); ++#endif ++ + /** + * Get information about the opened drm device + * +@@ -4724,6 +4729,41 @@ drm_public int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device) + if (fd == -1) + return -EINVAL; + ++#ifdef __GENODE__ ++ /* PCI only */ ++ int node_type = DRM_NODE_PRIMARY; ++ char const * node = "genode"; ++ char *addr; ++ int ret; ++ drmDevicePtr dev; ++ ++ ++ if (flags & DRM_DEVICE_GET_PCI_REVISION) { ++ dev = drmDeviceAlloc(node_type, node, sizeof(drmPciBusInfo), ++ sizeof(drmPciDeviceInfo), &addr); ++ if (!dev) return -ENOMEM; ++ dev->bustype = DRM_BUS_PCI; ++ dev->businfo.pci = (drmPciBusInfoPtr)addr; ++ ++ addr += sizeof(drmPciBusInfo); ++ dev->deviceinfo.pci = (drmPciDeviceInfoPtr)addr; ++ ++ if ((ret = genode_drmGetPciDevice(fd, flags, dev))) return ret; ++ } else { ++ dev = drmDeviceAlloc(node_type, node, sizeof(drmPlatformBusInfo), ++ sizeof(drmPlatformDeviceInfo), &addr); ++ if (!dev) return -ENOMEM; ++ ++ dev->bustype = DRM_BUS_PLATFORM; ++ dev->businfo.platform = addr; ++ dev->deviceinfo.platform = NULL; ++ } ++ ++ *device = dev; ++ ++ return 0; ++#endif ++ + if (fstat(fd, &sbuf)) + return -errno; +