diff --git a/repos/libports/lib/import/import-drm.mk b/repos/libports/lib/import/import-drm.mk deleted file mode 100644 index 2fe33c7f11..0000000000 --- a/repos/libports/lib/import/import-drm.mk +++ /dev/null @@ -1,7 +0,0 @@ -ifeq ($(CONTRIB_DIR),) -DRM_DIR = $(realpath $(call select_from_repositories,include/drm)/..) -INC_DIR += $(DRM_DIR) $(addprefix $(DRM_DIR)/,intel drm) -else -DRM_DIR = $(call select_from_ports,drm)/src/lib/drm -INC_DIR += $(DRM_DIR) $(addprefix $(DRM_DIR)/,intel include/drm) -endif diff --git a/repos/libports/lib/mk/drm.mk b/repos/libports/lib/mk/drm.mk deleted file mode 100644 index 8f50f5206e..0000000000 --- a/repos/libports/lib/mk/drm.mk +++ /dev/null @@ -1,29 +0,0 @@ -include $(call select_from_repositories,lib/import/import-drm.mk) - -SHARED_LIB = yes -LIBS = libc -DRM_SRC_DIR := $(call select_from_ports,drm)/src/lib/drm -LIB_DIR = $(REP_DIR)/src/lib/drm - -INC_DIR += $(LIB_DIR)/include - -SRC_C = intel/intel_bufmgr.c \ - intel/intel_bufmgr_gem.c \ - intel/intel_decode.c \ - xf86drm.c xf86drmHash.c \ - xf86drmRandom.c - -SRC_CC = dummies.cc ioctl.cc - -CC_OPT = -DHAVE_LIBDRM_ATOMIC_PRIMITIVES=1 -DO_CLOEXEC=0 - -# -# We rename 'ioctl' calls to 'genode_ioctl' calls, this way we are not required -# to write a libc plugin for libdrm. -# -CC_C_OPT += -Dioctl=genode_ioctl - -vpath %.c $(DRM_SRC_DIR) -vpath %.cc $(LIB_DIR) - -CC_CXX_WARN_STRICT = diff --git a/repos/libports/lib/symbols/drm b/repos/libports/lib/symbols/drm deleted file mode 100644 index 6013301cb5..0000000000 --- a/repos/libports/lib/symbols/drm +++ /dev/null @@ -1,182 +0,0 @@ -_Z12drm_completev T -_Z8drm_initRN6Genode3EnvERNS_10EntrypointE T -_ZN5Utils14canonical_addrEm T -_ZN5Utils17noncanonical_addrEm T -drmAddBufs T -drmAddContextPrivateMapping T -drmAddContextTag T -drmAddMap T -drmAgpAcquire T -drmAgpAlloc T -drmAgpBase T -drmAgpBind T -drmAgpDeviceId T -drmAgpEnable T -drmAgpFree T -drmAgpGetMode T -drmAgpMemoryAvail T -drmAgpMemoryUsed T -drmAgpRelease T -drmAgpSize T -drmAgpUnbind T -drmAgpVendorId T -drmAgpVersionMajor T -drmAgpVersionMinor T -drmAuthMagic T -drmAvailable T -drmClose T -drmCloseOnce T -drmCommandNone T -drmCommandRead T -drmCommandWrite T -drmCommandWriteRead T -drmCreateContext T -drmCreateDrawable T -drmCtlInstHandler T -drmCtlUninstHandler T -drmDMA T -drmDelContextTag T -drmDestroyContext T -drmDestroyDrawable T -drmDropMaster T -drmError T -drmFinish T -drmFree T -drmFreeBufs T -drmFreeBusid T -drmFreeDevices T -drmFreeReservedContextList T -drmFreeVersion T -drmGetBufInfo T -drmGetBusid T -drmGetCap T -drmGetClient T -drmGetContextFlags T -drmGetContextPrivateMapping T -drmGetContextTag T -drmGetDeviceNameFromFd T -drmGetDevices T -drmGetEntry T -drmGetHashTable T -drmGetInterruptFromBusID T -drmGetLibVersion T -drmGetLock T -drmGetMagic T -drmGetMap T -drmGetNodeTypeFromFd T -drmGetPrimaryDeviceNameFromFd T -drmGetRenderDeviceNameFromFd T -drmGetReservedContextList T -drmGetStats T -drmGetVersion T -drmHashCreate T -drmHashDelete T -drmHashDestroy T -drmHashFirst T -drmHashInsert T -drmHashLookup T -drmHashNext T -drmIoctl T -drmMalloc T -drmMap T -drmMapBufs T -drmMarkBufs T -drmMsg T -drmOpen T -drmOpenControl T -drmOpenOnce T -drmOpenOnceWithType T -drmOpenRender T -drmOpenWithType T -drmPrimeFDToHandle T -drmPrimeHandleToFD T -drmRandom T -drmRandomCreate T -drmRandomDestroy T -drmRandomDouble T -drmRmMap T -drmScatterGatherAlloc T -drmScatterGatherFree T -drmSetBusid T -drmSetClientCap T -drmSetContextFlags T -drmSetInterfaceVersion T -drmSetMaster T -drmSetServerInfo T -drmSwitchToContext T -drmUnlock T -drmUnmap T -drmUnmapBufs T -drmUpdateDrawableInfo T -drmWaitVBlank T -drm_intel_bo_alloc T -drm_intel_bo_alloc_for_render T -drm_intel_bo_alloc_tiled T -drm_intel_bo_alloc_userptr T -drm_intel_bo_busy T -drm_intel_bo_disable_reuse T -drm_intel_bo_emit_reloc T -drm_intel_bo_emit_reloc_fence T -drm_intel_bo_exec T -drm_intel_bo_flink T -drm_intel_bo_gem_create_from_name T -drm_intel_bo_gem_create_from_prime T -drm_intel_bo_gem_export_to_prime T -drm_intel_bo_get_subdata T -drm_intel_bo_get_tiling T -drm_intel_bo_is_reusable T -drm_intel_bo_madvise T -drm_intel_bo_map T -drm_intel_bo_mrb_exec T -drm_intel_bo_pin T -drm_intel_bo_reference T -drm_intel_bo_references T -drm_intel_bo_set_tiling T -drm_intel_bo_subdata T -drm_intel_bo_unmap T -drm_intel_bo_unpin T -drm_intel_bo_unreference T -drm_intel_bo_wait_rendering T -drm_intel_bufmgr_check_aperture_space T -drm_intel_bufmgr_destroy T -drm_intel_bufmgr_gem_enable_fenced_relocs T -drm_intel_bufmgr_gem_enable_reuse T -drm_intel_bufmgr_gem_get_devid T -drm_intel_bufmgr_gem_init T -drm_intel_bufmgr_gem_set_aub_annotations T -drm_intel_bufmgr_gem_set_aub_dump T -drm_intel_bufmgr_gem_set_aub_filename T -drm_intel_bufmgr_gem_set_vma_cache_size T -drm_intel_bufmgr_set_debug T -drm_intel_decode T -drm_intel_decode_context_alloc T -drm_intel_decode_context_free T -drm_intel_decode_set_batch_pointer T -drm_intel_decode_set_dump_past_end T -drm_intel_decode_set_head_tail T -drm_intel_decode_set_output_file T -drm_intel_gem_bo_aub_dump_bmp T -drm_intel_gem_bo_clear_relocs T -drm_intel_gem_bo_context_exec T -drm_intel_gem_bo_get_reloc_count T -drm_intel_gem_bo_map_gtt T -drm_intel_gem_bo_map_unsynchronized T -drm_intel_gem_bo_start_gtt_access T -drm_intel_gem_bo_unmap_gtt T -drm_intel_gem_bo_wait T -drm_intel_gem_context_create T -drm_intel_gem_context_destroy T -drm_intel_get_aperture_sizes T -drm_intel_get_eu_total T -drm_intel_get_pipe_from_crtc_id T -drm_intel_get_reset_stats T -drm_intel_get_subslice_total T -drm_intel_reg_read T -drm_mmap T -drm_munmap T -genode_ioctl T -pci_device_find_by_slot T -pci_device_probe T -pci_system_cleanup T -pci_system_init T -posix_memalign T diff --git a/repos/libports/ports/drm.hash b/repos/libports/ports/drm.hash deleted file mode 100644 index 3c3b93d8fb..0000000000 --- a/repos/libports/ports/drm.hash +++ /dev/null @@ -1 +0,0 @@ -01858a251ad7ec3e36c33e910dbb44bfbe0a467f diff --git a/repos/libports/ports/drm.port b/repos/libports/ports/drm.port deleted file mode 100644 index 6663e215cc..0000000000 --- a/repos/libports/ports/drm.port +++ /dev/null @@ -1,12 +0,0 @@ -LICENSE := MIT -VERSION := 2.4.65 -DOWNLOADS := drm.archive - -URL(drm) := https://dri.freedesktop.org/libdrm/libdrm-$(VERSION).tar.bz2 -SHA(drm) := 71960ac8bde7d710992b1bc8879935e8300a870c36bd06f22412d0447e3d96c4 -DIR(drm) := src/lib/drm -FILE_LIST := $(REP_DIR)/src/lib/drm/files.list -TAR_OPT(drm) := --strip-components=1 --files-from $(FILE_LIST) -HASH_INPUT += $(FILE_LIST) - - diff --git a/repos/libports/recipes/api/drm/content.mk b/repos/libports/recipes/api/drm/content.mk deleted file mode 100644 index 214460d716..0000000000 --- a/repos/libports/recipes/api/drm/content.mk +++ /dev/null @@ -1,23 +0,0 @@ -MIRROR_FROM_REP_DIR := lib/import/import-drm.mk \ - lib/symbols/drm - -content: $(MIRROR_FROM_REP_DIR) - -$(MIRROR_FROM_REP_DIR): - $(mirror_from_rep_dir) - -PORT_DIR := $(call port_dir,$(REP_DIR)/ports/drm) - -content: include - -include: - mkdir -p $@ - cp -r $(PORT_DIR)/src/lib/drm/*.h $@ - cp -r $(PORT_DIR)/src/lib/drm/include/drm $@ - mkdir -p $@/intel - cp -r $(PORT_DIR)/src/lib/drm/intel/*.h $@/intel - -content: LICENSE - -LICENSE: - echo "MIT, see header files" > $@ diff --git a/repos/libports/recipes/api/drm/hash b/repos/libports/recipes/api/drm/hash deleted file mode 100644 index 8135732300..0000000000 --- a/repos/libports/recipes/api/drm/hash +++ /dev/null @@ -1 +0,0 @@ -2019-02-25 85225ee17a8545ab86590b7df612dc4eb2c27884 diff --git a/repos/libports/recipes/src/drm/api b/repos/libports/recipes/src/drm/api deleted file mode 100644 index 706adf0f48..0000000000 --- a/repos/libports/recipes/src/drm/api +++ /dev/null @@ -1 +0,0 @@ -drm diff --git a/repos/libports/recipes/src/drm/content.mk b/repos/libports/recipes/src/drm/content.mk deleted file mode 100644 index aadb0f8829..0000000000 --- a/repos/libports/recipes/src/drm/content.mk +++ /dev/null @@ -1,34 +0,0 @@ -MIRROR_FROM_REP_DIR := lib/mk/drm.mk \ - src/lib/drm/include \ - src/lib/drm/dummies.cc \ - src/lib/drm/ioctl.cc - -content: $(MIRROR_FROM_REP_DIR) src/lib/drm/target.mk - -$(MIRROR_FROM_REP_DIR): - $(mirror_from_rep_dir) - -src/lib/drm/target.mk: - mkdir -p $(dir $@) - echo "LIBS = drm" > $@ - -PORT_DIR := $(call port_dir,$(REP_DIR)/ports/drm) - -MIRROR_FROM_PORT_DIR := $(addprefix src/lib/drm/,\ - intel/intel_bufmgr.c \ - intel/intel_bufmgr_gem.c \ - intel/intel_decode.c \ - xf86drm.c \ - xf86drmHash.c \ - xf86drmRandom.c) - -content: $(MIRROR_FROM_PORT_DIR) - -$(MIRROR_FROM_PORT_DIR): - mkdir -p $(dir $@) - cp -r $(PORT_DIR)/$@ $(dir $@) - -content: LICENSE - -LICENSE: - echo "MIT, see header files" > $@ diff --git a/repos/libports/recipes/src/drm/hash b/repos/libports/recipes/src/drm/hash deleted file mode 100644 index 81b5ef1321..0000000000 --- a/repos/libports/recipes/src/drm/hash +++ /dev/null @@ -1 +0,0 @@ -2021-08-08 e30cf957358114d371cef7a098bd9c2630f07577 diff --git a/repos/libports/recipes/src/drm/used_apis b/repos/libports/recipes/src/drm/used_apis deleted file mode 100644 index 139debad25..0000000000 --- a/repos/libports/recipes/src/drm/used_apis +++ /dev/null @@ -1,3 +0,0 @@ -base -gpu_session -libc diff --git a/repos/libports/src/lib/drm/dummies.cc b/repos/libports/src/lib/drm/dummies.cc deleted file mode 100644 index 61e645d4f5..0000000000 --- a/repos/libports/src/lib/drm/dummies.cc +++ /dev/null @@ -1,55 +0,0 @@ -/** - * \brief DRM library dummies - * \author Sebastian Sumpf - * \date 2017-08-17 - */ - -/* - * Copyright (C) 2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - - - -extern "C" { -#include -} - -#include - -#define TRACE Genode::log(__func__, "called not implemented"); - -int pci_system_init(void) -{ - TRACE; - return -1; -} - - -void pci_system_cleanup(void) -{ - TRACE; -} - - -struct pci_device *pci_device_find_by_slot(uint32_t domain, uint32_t bus, - uint32_t dev, uint32_t func) -{ - TRACE; - return nullptr; -} - - -int pci_device_probe(struct pci_device *dev) -{ - TRACE; - return -1; -} - -extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size) -{ - TRACE; - return -1; -} diff --git a/repos/libports/src/lib/drm/files.list b/repos/libports/src/lib/drm/files.list deleted file mode 100644 index 7c3c608034..0000000000 --- a/repos/libports/src/lib/drm/files.list +++ /dev/null @@ -1,18 +0,0 @@ -libdrm-2.4.65/libdrm_lists.h -libdrm-2.4.65/xf86atomic.h -libdrm-2.4.65/xf86drm.c -libdrm-2.4.65/xf86drm.h -libdrm-2.4.65/xf86drmHash.c -libdrm-2.4.65/xf86drmHash.h -libdrm-2.4.65/xf86drmRandom.c -libdrm-2.4.65/xf86drmRandom.h -libdrm-2.4.65/include/drm/drm_mode.h -libdrm-2.4.65/include/drm/drm.h -libdrm-2.4.65/include/drm/i915_drm.h -libdrm-2.4.65/intel/intel_aub.h -libdrm-2.4.65/intel/intel_bufmgr.c -libdrm-2.4.65/intel/intel_bufmgr.h -libdrm-2.4.65/intel/intel_bufmgr_priv.h -libdrm-2.4.65/intel/intel_bufmgr_gem.c -libdrm-2.4.65/intel/intel_chipset.h -libdrm-2.4.65/intel/intel_decode.c diff --git a/repos/libports/src/lib/drm/include/genode_types.h b/repos/libports/src/lib/drm/include/genode_types.h deleted file mode 100644 index ad2c4ba205..0000000000 --- a/repos/libports/src/lib/drm/include/genode_types.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _INCLUDE__GENODE_TYPES_H_ -#define _INCLUDE__GENODE_TYPES_H_ - -#include - -typedef genode_uint32_t uint32_t; -typedef __SIZE_TYPE__ size_t; - -#endif /* _INCLUDE__GENODE_TYPES_H_ */ diff --git a/repos/libports/src/lib/drm/include/libdrm_macros.h b/repos/libports/src/lib/drm/include/libdrm_macros.h deleted file mode 100644 index fb2b1e1feb..0000000000 --- a/repos/libports/src/lib/drm/include/libdrm_macros.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _INCLUDE__LIBDRM_MACROS_H_ -#define _INCLUDE__LIBDRM_MACROS_H_ - -#include - -void *drm_mmap(void *addr, size_t length, int prot, int flags, - int fd, off_t offset); -int drm_munmap(void *addr, size_t length); - -#endif /* _INCLUDE__LIBDRM_MACROS_H_ */ diff --git a/repos/libports/src/lib/drm/include/pciaccess.h b/repos/libports/src/lib/drm/include/pciaccess.h deleted file mode 100644 index 0410ee1944..0000000000 --- a/repos/libports/src/lib/drm/include/pciaccess.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _INCLUDE__PCIACCESS_H_ -#define _INCLUDE__PCIACCESS_H_ - -#include - -struct pci_mem_region -{ - void *memory; - size_t size; -}; - -struct pci_device -{ - struct pci_mem_region regions[6]; -}; - -int pci_system_init(void); -void pci_system_cleanup(void); -int pci_device_probe(struct pci_device *dev); - -struct pci_device *pci_device_find_by_slot(uint32_t domain, uint32_t bus, - uint32_t dev, uint32_t func); -#endif /* _INCLUDE__PCIACCESS_H_ */ diff --git a/repos/libports/src/lib/drm/ioctl.cc b/repos/libports/src/lib/drm/ioctl.cc deleted file mode 100644 index 079a27c77f..0000000000 --- a/repos/libports/src/lib/drm/ioctl.cc +++ /dev/null @@ -1,883 +0,0 @@ -/* - * \brief DRM ioctl backend - * \author Sebastian Sumpf - * \author Josef Soentgen - * \date 2017-05-10 - */ - -/* - * Copyright (C) 2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -/* Genode includes */ -#include -#include -#include -#include -// #include -#include -#include - -extern "C" { -#include -#include - -#define DRM_NUMBER(req) ((req) & 0xff) -} - - -enum { verbose_ioctl = false }; - -namespace Utils -{ - uint64_t canonical_addr(uint64_t addr) { - return (Genode::int64_t)(addr << 16) >> 16; } - - uint64_t noncanonical_addr(uint64_t addr) { - return addr & 0xffffffffffffu; } -} - - -/** - * Get DRM command number - */ -static long command_number(long request) -{ - return request & 0xff; -} - - -/** - * Get device specific command number - */ -static long device_number(long request) -{ - return command_number(request) - DRM_COMMAND_BASE; -} - - -/** - * Check if request is device command - */ -static bool device_ioctl(long request) -{ - long const cmd = command_number(request); - return cmd >= DRM_COMMAND_BASE && cmd < DRM_COMMAND_END; -} - - -static const char *command_name(long request) -{ - if (IOCGROUP(request) != DRM_IOCTL_BASE) - return ""; - - - if (!device_ioctl(request)) { - long const cmd = command_number(request); - switch (cmd) { - case DRM_NUMBER(DRM_IOCTL_GEM_CLOSE): return "DRM_IOCTL_GEM_CLOSE"; - case DRM_NUMBER(DRM_IOCTL_GEM_FLINK): return "DRM_IOCTL_GEM_FLINK"; - default: return ""; - } - } - - switch (device_number(request)) { - case DRM_I915_INIT: return "DRM_I915_INIT"; - case DRM_I915_FLUSH: return "DRM_I915_FLUSH"; - case DRM_I915_FLIP: return "DRM_I915_FLIP"; - case DRM_I915_BATCHBUFFER: return "DRM_I915_BATCHBUFFER"; - case DRM_I915_IRQ_EMIT: return "DRM_I915_IRQ_EMIT"; - case DRM_I915_IRQ_WAIT: return "DRM_I915_IRQ_WAIT"; - case DRM_I915_GETPARAM: return "DRM_I915_GETPARAM"; - case DRM_I915_SETPARAM: return "DRM_I915_SETPARAM"; - case DRM_I915_ALLOC: return "DRM_I915_ALLOC"; - case DRM_I915_FREE: return "DRM_I915_FREE"; - case DRM_I915_INIT_HEAP: return "DRM_I915_INIT_HEAP"; - case DRM_I915_CMDBUFFER: return "DRM_I915_CMDBUFFER"; - case DRM_I915_DESTROY_HEAP: return "DRM_I915_DESTROY_HEAP"; - case DRM_I915_SET_VBLANK_PIPE: return "DRM_I915_SET_VBLANK_PIPE"; - case DRM_I915_GET_VBLANK_PIPE: return "DRM_I915_GET_VBLANK_PIPE"; - case DRM_I915_VBLANK_SWAP: return "DRM_I915_VBLANK_SWAP"; - case DRM_I915_HWS_ADDR: return "DRM_I915_HWS_ADDR"; - case DRM_I915_GEM_INIT: return "DRM_I915_GEM_INIT"; - case DRM_I915_GEM_EXECBUFFER: return "DRM_I915_GEM_EXECBUFFER"; - case DRM_I915_GEM_PIN: return "DRM_I915_GEM_PIN"; - case DRM_I915_GEM_UNPIN: return "DRM_I915_GEM_UNPIN"; - case DRM_I915_GEM_BUSY: return "DRM_I915_GEM_BUSY"; - case DRM_I915_GEM_THROTTLE: return "DRM_I915_GEM_THROTTLE"; - case DRM_I915_GEM_ENTERVT: return "DRM_I915_GEM_ENTERVT"; - case DRM_I915_GEM_LEAVEVT: return "DRM_I915_GEM_LEAVEVT"; - case DRM_I915_GEM_CREATE: return "DRM_I915_GEM_CREATE"; - case DRM_I915_GEM_PREAD: return "DRM_I915_GEM_PREAD"; - case DRM_I915_GEM_PWRITE: return "DRM_I915_GEM_PWRITE"; - case DRM_I915_GEM_MMAP: return "DRM_I915_GEM_MMAP"; - case DRM_I915_GEM_SET_DOMAIN: return "DRM_I915_GEM_SET_DOMAIN"; - case DRM_I915_GEM_SW_FINISH: return "DRM_I915_GEM_SW_FINISH"; - case DRM_I915_GEM_SET_TILING: return "DRM_I915_GEM_SET_TILING"; - case DRM_I915_GEM_GET_TILING: return "DRM_I915_GEM_GET_TILING"; - case DRM_I915_GEM_GET_APERTURE: return "DRM_I915_GEM_GET_APERTURE"; - case DRM_I915_GEM_MMAP_GTT: return "DRM_I915_GEM_MMAP_GTT"; - case DRM_I915_GET_PIPE_FROM_CRTC_ID: return "DRM_I915_GET_PIPE_FROM_CRTC_ID"; - case DRM_I915_GEM_MADVISE: return "DRM_I915_GEM_MADVISE"; - case DRM_I915_OVERLAY_PUT_IMAGE: return "DRM_I915_OVERLAY_PUT_IMAGE"; - case DRM_I915_OVERLAY_ATTRS: return "DRM_I915_OVERLAY_ATTRS"; - case DRM_I915_GEM_EXECBUFFER2: return "DRM_I915_GEM_EXECBUFFER2"; - case DRM_I915_REG_READ: return "DRM_I915_REG_READ"; - case DRM_I915_GET_RESET_STATS: return "DRM_I915_GET_RESET_STATS"; - case DRM_I915_GEM_CONTEXT_CREATE: return "DRM_I915_GEM_CONTEXT_CREATE"; - default: - return ""; - } -} - -static void dump_ioctl(long request) -{ - using namespace Genode; - - log("ioctl(request=", Hex(request), - (request & 0xe0000000) == IOC_OUT ? " out" : - (request & 0xe0000000) == IOC_IN ? " in" : - (request & 0xe0000000) == IOC_INOUT ? " inout" : " void", - " len=", IOCPARM_LEN(request), - " cmd=",command_name(request), " (", Hex(command_number(request)), ")"); -} - - -class Drm_call -{ - private: - - Genode::Env &_env; - Genode::Heap _heap { _env.ram(), _env.rm() }; - - Gpu::Connection _gpu_session { _env }; - Gpu::Info _gpu_info { _gpu_session.info() }; - - Genode::Blockade _completion_lock { }; - - size_t available_gtt_size { _gpu_info.aperture_size }; - - using Handle = uint32_t; - using Offset = unsigned long; - - enum { INVALID_HANDLE = 0, }; - struct Buffer_handle - { - Genode::Dataspace_capability cap; - Genode::size_t size; - Handle handle; - Genode::addr_t addr; - - Genode::Dataspace_capability map_cap; - Offset map_offset; - - Buffer_handle(Genode::Dataspace_capability cap, - Genode::size_t size, - Handle handle) - : cap(cap), size(size), handle(handle) { } - - virtual ~Buffer_handle() { } - - bool valid() { return cap.valid() && size != 0; } - }; - - using Buffer = Genode::Registered; - - Genode::Registry _buffer_registry; - - Handle _alloc_buffer(uint64_t const size) - { - static uint32_t handle = INVALID_HANDLE; - - Genode::size_t donate = size; - Genode::Dataspace_capability cap = Genode::retry( - [&] () { return _gpu_session.alloc_buffer(size); }, - [&] () { - _gpu_session.upgrade_ram(donate); - donate /= 4; - }); - - /* - * Every buffer always is mapped into the PPGTT. To make things - * simplish[sic], we reuse the client local virtual adress for the - * PPGTT mapping. - */ - - Genode::addr_t const addr = static_cast(_env.rm().attach(cap)); - - bool const ppgtt = Genode::retry( - [&]() { return _gpu_session.map_buffer_ppgtt(cap, addr); }, - [&]() { _gpu_session.upgrade_ram(4096); } - ); - - if (!ppgtt) { - Genode::error("could not insert buffer into PPGTT"); - _env.rm().detach(addr); - _gpu_session.free_buffer(cap); - return INVALID_HANDLE; - } - - try { - Buffer *buffer = new (&_heap) Buffer(_buffer_registry, cap, size, ++handle); - buffer->addr = addr; - return buffer->handle; - } catch (...) { - _env.rm().detach(addr); - _gpu_session.free_buffer(cap); - return INVALID_HANDLE; - } - } - - void _unmap_buffer(Buffer_handle &h) - { - _env.rm().detach(h.map_offset); - h.map_offset = 0; - - _gpu_session.unmap_buffer(h.map_cap); - h.map_cap = Genode::Dataspace_capability(); - - available_gtt_size += h.size; - } - - int _free_buffer(Handle handle) - { - int result = -1; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.handle != handle) { return; } - - if (h.map_cap.valid()) { - // Genode::warning("free buffer, handle:", Genode::Hex(h.handle), " ggtt mapped"); - _unmap_buffer(h); - } - - _env.rm().detach(h.addr); - _gpu_session.unmap_buffer_ppgtt(h.cap, h.addr); - _gpu_session.free_buffer(h.cap); - result = 0; - }; - _buffer_registry.for_each(lookup_buffer); - - return result; - } - - Offset _map_buffer(Handle handle) - { - Offset offset = 0; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.handle != handle) { return; } - - if (h.map_cap.valid()) { - offset = h.map_offset; - return; - } - - try { - _gpu_session.upgrade_ram(4096); - h.map_cap = _gpu_session.map_buffer(h.cap, true); - h.map_offset = static_cast(_env.rm().attach(h.map_cap)); - offset = h.map_offset; - - available_gtt_size -= h.size; - } catch (...) { - if (h.map_cap.valid()) { _gpu_session.unmap_buffer(h.map_cap); } - h.map_cap = Genode::Dataspace_capability(); - Genode::error("could not attach GEM buffer handle: ", h.handle); - } - }; - _buffer_registry.for_each(lookup_buffer); - - return offset; - } - - /******************* - ** lookup buffer ** - *******************/ - - Buffer_handle *_lookup_buffer(Handle handle) - { - Buffer_handle *bh = nullptr; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.handle != handle) { return; } - bh = &h; - }; - _buffer_registry.for_each(lookup_buffer); - - return bh; - } - - Genode::Dataspace_capability _lookup_buffer_cap(Handle handle) - { - Genode::Dataspace_capability cap; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.handle != handle) { return; } - if (!h.cap.valid()) { return; } - cap = h.cap; - }; - _buffer_registry.for_each(lookup_buffer); - - return cap; - } - - Genode::Dataspace_capability _lookup_buffer_map_cap(Handle handle) - { - Genode::Dataspace_capability cap; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.handle != handle) { return; } - if (!h.map_cap.valid()) { return; } - cap = h.map_cap; - }; - _buffer_registry.for_each(lookup_buffer); - - return cap; - } - - bool _is_mapped(Genode::Dataspace_capability cap) - { - bool mapped = false; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (!(h.cap == cap)) { return; } - if (!h.map_cap.valid()) { return; } - mapped = true; - }; - _buffer_registry.for_each(lookup_buffer); - - return mapped; - } - - /*************************** - ** execbuffer completion ** - ***************************/ - - void _handle_completion() { _completion_lock.wakeup(); } - - Genode::Io_signal_handler _completion_sigh { - _env.ep(), *this, &Drm_call::_handle_completion }; - - - /************ - ** ioctls ** - ************/ - - int _device_gem_get_aperture_size(void *arg) - { - drm_i915_gem_get_aperture * const p = reinterpret_cast(arg); - p->aper_size = _gpu_info.aperture_size; - p->aper_available_size = available_gtt_size; - Genode::warning(__func__, ": available_gtt_size is not properly accounted"); - return 0; - } - - int _device_gem_create(void *arg) - { - drm_i915_gem_create * const p = reinterpret_cast(arg); - - /* roundup to next page size and add guarding page */ - uint64_t const size = ((p->size + 0xfff) & ~0xfff) + 0x1000; - Handle handle = _alloc_buffer(size); - if (handle == INVALID_HANDLE) { return -1; } - - p->size = size; - p->handle = handle; - - if (verbose_ioctl) { - Genode::error(__func__, ": ", "handle: ", handle, " size: ", size); - } - - return 0; - } - - int _device_gem_mmap(void *arg) - { - drm_i915_gem_mmap * const p = reinterpret_cast(arg); - Handle const handle = p->handle; - - Genode::addr_t addr = 0; - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.handle != handle) { return; } - addr = h.addr; - }; - _buffer_registry.for_each(lookup_buffer); - - if (addr == 0) { return -1; } - - if (verbose_ioctl) { - Genode::error(__func__, ": ", "handle: ", handle, " addr: ", Genode::Hex(addr)); - } - - p->addr_ptr = addr; - return 0; - } - - int _device_gem_mmap_gtt(void *arg) - { - drm_i915_gem_mmap * const p = reinterpret_cast(arg); - Handle const handle = p->handle; - - if (verbose_ioctl) { - Genode::error(__func__, ": ", "handle: ", handle, - " offset: ", Genode::Hex(p->offset)); - } - - /* - * We always map a buffer when the tiling is set. Since Mesa - * sets the filing first and maps the buffer afterwards we might - * already have a mapping at this point. - */ - p->offset = _map_buffer(handle); - - if (verbose_ioctl) { - Genode::error(__func__, ": ", "handle: ", handle, - " offset: ", Genode::Hex(p->offset), " (mapped)"); - } - - return p->offset ? 0 : -1; - } - - char const *_domain_name(uint32_t d) - { - if (d & I915_GEM_DOMAIN_CPU) { return "CPU"; } - if (d & I915_GEM_DOMAIN_GTT) { return "CPU (GTT)"; } - if (d & I915_GEM_DOMAIN_RENDER) { return "GPU (RC)"; } - if (d & I915_GEM_DOMAIN_VERTEX) { return "GPU (VC)"; } - if (d & I915_GEM_DOMAIN_INSTRUCTION) { return "GPU (IC)"; } - if (d & I915_GEM_DOMAIN_SAMPLER) { return "GPU (SC)"; } - return "N/A"; - } - - int _device_gem_set_domain(void *arg) - { - /* XXX check read_domains/write_domain */ - drm_i915_gem_set_domain * const p = reinterpret_cast(arg); - Handle const handle = p->handle; - uint32_t const rd = p->read_domains; - uint32_t const wd = p->write_domain; - - if (verbose_ioctl) { - Genode::error(__func__, ": ", "handle: ", handle, - " rd: ", _domain_name(rd), - " wd: ", _domain_name(wd)); - } - - return 0; - } - - int _device_getparam(void *arg) - { - drm_i915_getparam_t *p = reinterpret_cast(arg); - int const param = p->param; - int *value = p->value; - - switch (param) { - case I915_PARAM_CHIPSET_ID: - *value = _gpu_info.chip_id; - break; - case I915_PARAM_HAS_RELAXED_FENCING: - case I915_PARAM_HAS_RELAXED_DELTA: - case I915_PARAM_HAS_EXECBUF2: - case I915_PARAM_HAS_LLC: - *value = 1; - break; - case I915_PARAM_HAS_BSD: - case I915_PARAM_HAS_BLT: - case I915_PARAM_HAS_VEBOX: - case I915_PARAM_HAS_WAIT_TIMEOUT: - case 36 /* I915_PARAM_HAS_RESOURCE_STREAMER */: - *value = 0; - break; - case I915_PARAM_CMD_PARSER_VERSION: - *value = 23; - break; - default: - Genode::error("Unhandled device param:", Genode::Hex(param)); - return -1; - break; - } - return 0; - } - - int _device_gem_context_create(void *arg) - { - drm_i915_gem_context_create * const p = reinterpret_cast(arg); - p->ctx_id = _gpu_info.ctx_id; - return 0; - } - - int _device_gem_set_tiling(void *arg) - { - drm_i915_gem_set_tiling * const p = reinterpret_cast(arg); - Handle const handle = p->handle; - uint32_t const mode = p->tiling_mode; - uint32_t const stride = p->stride; - uint32_t const swizzle = p->swizzle_mode; - - if (verbose_ioctl) { - Genode::error(__func__, ": ", - "handle: ", handle, " " - "mode: ", mode, " " - "stride: ", stride , " " - "swizzle: ", swizzle); - } - - /* - * XXX instead of returning the buffer cap and later-on the map_cap - * returning the buffer itself in the first place is better - */ - Genode::Dataspace_capability const cap = _lookup_buffer_cap(handle); - if (!cap.valid()) { return -1; } - - /* we need a valid GGTT mapping for fencing */ - if (!_is_mapped(cap) && !_map_buffer(handle)) { return -2; } - - Genode::Dataspace_capability map_cap = _lookup_buffer_map_cap(handle); - - uint32_t const m = (stride << 16) | (mode == 1 ? 1 : 0); - bool const ok = _gpu_session.set_tiling(map_cap, m); - return ok ? 0 : -1; - } - - int _device_gem_pwrite(void *arg) - { - drm_i915_gem_pwrite * const p = reinterpret_cast(arg); - Handle const handle = p->handle; - - Buffer_handle const *bh = _lookup_buffer(handle); - if (bh == nullptr) { - Genode::error(__func__, ": invalid handle: ", handle); - return -1; - } - - if (bh->size < p->size) { - Genode::error(__func__, ": request size: ", p->size, " " - "does not fit buffer size: ", bh->size); - return -1; - } - - if (!bh->addr) { return -1; } - - if (verbose_ioctl) { - Genode::error(__func__, ": ", "handle: ", handle, " size: ", p->size, " addr: ", Genode::Hex(bh->addr)); - } - - Genode::memcpy((void*)bh->addr, reinterpret_cast(p->data_ptr), p->size); - return 0; - } - - int _device_gem_sw_finish(void *arg) - { - // drm_i915_gem_sw_finish * const p = reinterpret_cast(arg); - // Handle const handle = p->handle; - return 0; - } - - bool _relocate_batch_buffer(drm_i915_gem_exec_object2 &obj, size_t batch_len) - { - Buffer_handle const * const bb_handle = _lookup_buffer(obj.handle); - if (bb_handle == nullptr) { - Genode::error("batch buffer handle: ", obj.handle, " invalid"); - return false; - } - - uint8_t *bb_addr = (uint8_t*)bb_handle->addr; - - drm_i915_gem_relocation_entry *e = - reinterpret_cast(obj.relocs_ptr); - - uint32_t const count = obj.relocation_count; - for (uint64_t i = 0; i < count; i++) { - if (verbose_ioctl) { - using namespace Genode; - log("target_handle: ", e[i].target_handle, " " - "delta: ", Hex(e[i].delta), " " - "offset: ", Hex(e[i].offset), " " - "presumed_offset: ", Hex(e[i].presumed_offset), " " - "read_domains: ", Hex(e[i].read_domains), - " (", _domain_name(e[i].read_domains), ") " - "write_domain: ", Hex(e[i].write_domain), - " (", _domain_name(e[i].write_domain), ") "); - } - - Buffer_handle * buffer = _lookup_buffer(e[i].target_handle); - if (buffer == nullptr) { - Genode::error("target_handle: ", e[i].target_handle, " invalid"); - return false; - } - uint64_t target_offset = Utils::canonical_addr(buffer->addr + e[i].delta); - - uint32_t *addr = (uint32_t*)(bb_addr + e[i].offset); - *addr = (target_offset & 0xffffffff); - *(addr + 1) = (target_offset >> 32) & 0xffffffff; - - e[i].presumed_offset = target_offset; - } - - return true; - } - - int _device_gem_execbuffer2(void *arg) - { - drm_i915_gem_execbuffer2 * const p = reinterpret_cast(arg); - uint64_t const buffers_ptr = p->buffers_ptr; - uint64_t const buffer_count = p->buffer_count; - uint32_t const batch_start_offset = p->batch_start_offset; - uint32_t const batch_len = p->batch_len; - uint32_t const dr1 = p->DR1; - uint32_t const dr4 = p->DR4; - uint32_t const num_cliprects = p->num_cliprects; - uint64_t const cliprects_ptr = p->cliprects_ptr; - uint64_t const flags = p->flags; - uint64_t const ctx_id = p->rsvd1; - - uint64_t const batch_buffer_id = buffer_count - 1; - - if (verbose_ioctl) { - Genode::log(__func__, " " - "buffers_ptr: ", Genode::Hex(buffers_ptr), " " - "buffer_count: ", buffer_count, " " - "batch_start_offset: ", Genode::Hex(batch_start_offset), " " - "batch_len: ", batch_len, " " - "dr1: ", Genode::Hex(dr1), " " - "dr4: ", Genode::Hex(dr4), " " - "num_cliprects: ", num_cliprects, " " - "cliprects_ptr: ", Genode::Hex(cliprects_ptr), " " - "flags: ", Genode::Hex(flags), " " - "ctx_id: ", Genode::Hex(ctx_id)); - } - - drm_i915_gem_exec_object2 *obj = - reinterpret_cast(buffers_ptr); - - for (uint64_t i = 0; i < buffer_count; i++) { - if (verbose_ioctl) { - Genode::log(" obj[", i, "] ", - "handle: ", obj[i].handle, " " - "relocation_count: ", obj[i].relocation_count, " " - "relocs_ptr: ", Genode::Hex(obj[i].relocs_ptr), " " - "alignment: ", Genode::Hex(obj[i].alignment), " " - "offset: ", Genode::Hex(obj[i].offset), " " - "flags: ", Genode::Hex(obj[i].flags)); - } - - Buffer_handle *bh = _lookup_buffer(obj[i].handle); - if (!bh || !bh->cap.valid()) { - Genode::error("handle: ", obj[i].handle, " invalid"); - return -1; - } - - obj[i].offset = bh->addr; - - if (obj[i].relocation_count > 0) { - drm_i915_gem_relocation_entry *e = - reinterpret_cast(obj[i].relocs_ptr); - uint32_t const count = obj[i].relocation_count; - for (uint64_t i = 0; i < count; i++) { - if (verbose_ioctl) { - Genode::log(" ", - "target_handle: ", e[i].target_handle, " " - "delta: ", Genode::Hex(e[i].delta), " " - "offset: ", Genode::Hex(e[i].offset), " " - "presumed_offset: ", Genode::Hex(e[i].presumed_offset), " " - "read_domains: ", Genode::Hex(e[i].read_domains), " " - "write_domain: ", Genode::Hex(e[i].write_domain)); - } - - Genode::Dataspace_capability cap = _lookup_buffer_cap(e[i].target_handle); - if (!cap.valid()) { - Genode::error("target_handle: ", e[i].target_handle, " invalid"); - return -1; - } - } - } - } - - /* relocate in batch buffer and copy object to command buffer */ - drm_i915_gem_exec_object2 &bb = obj[batch_buffer_id]; - if (!_relocate_batch_buffer(bb, batch_len)) { - Genode::error("could not relocate batch buffer objects"); - return -1; - } - - Genode::Dataspace_capability bb_cap = _lookup_buffer_cap(bb.handle); - if (!bb_cap.valid()) { - Genode::error("batch buffer cap invalid"); - return -1; - } - - _gpu_session.exec_buffer(bb_cap, batch_len); - return 0; - } - - int _device_gem_busy(void *arg) - { - drm_i915_gem_busy * const p = reinterpret_cast(arg); - // Handle const handle = p->handle; - // uint32_t busy = p->busy; - /* TODO flag currently executed buffer */ - p->busy = 0; - return 0; - } - - int _device_gem_madvise(void *arg) - { - drm_i915_gem_madvise * const p = reinterpret_cast(arg); - // Handle const handle = p->handle; - // uint32_t const madv = p->madv; - /* all buffer are always available */ - p->retained = 1; - return 0; - } - - int _device_ioctl(unsigned cmd, void *arg) - { - switch (cmd) { - case DRM_I915_GEM_GET_APERTURE: return _device_gem_get_aperture_size(arg); - case DRM_I915_GETPARAM: return _device_getparam(arg); - case DRM_I915_GEM_CREATE: return _device_gem_create(arg); - case DRM_I915_GEM_MMAP: return _device_gem_mmap(arg); - case DRM_I915_GEM_MMAP_GTT: return _device_gem_mmap_gtt(arg); - case DRM_I915_GEM_SET_DOMAIN: return _device_gem_set_domain(arg); - case DRM_I915_GEM_CONTEXT_CREATE: return _device_gem_context_create(arg); - case DRM_I915_GEM_SET_TILING: return _device_gem_set_tiling(arg); - case DRM_I915_GEM_PWRITE: return _device_gem_pwrite(arg); - case DRM_I915_GEM_SW_FINISH: return _device_gem_sw_finish(arg); - case DRM_I915_GEM_EXECBUFFER2: return _device_gem_execbuffer2(arg); - case DRM_I915_GEM_BUSY: return _device_gem_busy(arg); - case DRM_I915_GEM_MADVISE: return _device_gem_madvise(arg); - default: - Genode::error("Unhandled device specific ioctl:", Genode::Hex(cmd)); - break; - } - - return -1; - } - - int _generic_gem_close(void *arg) - { - drm_gem_close * const p = reinterpret_cast(arg); - return _free_buffer(p->handle); - } - - int _generic_gem_flink(void *arg) - { - drm_gem_flink * const p = reinterpret_cast(arg); - p->name = p->handle; - return 0; - } - - int _generic_ioctl(unsigned cmd, void *arg) - { - 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); - default: - Genode::error("Unhandled generic DRM ioctl:", Genode::Hex(cmd)); - break; - } - - return -1; - } - - public: - - Drm_call(Genode::Env &env, Genode::Entrypoint &signal_ep) - : _env(env), - _completion_sigh(signal_ep, *this, &Drm_call::_handle_completion) - { - _gpu_session.completion_sigh(_completion_sigh); - } - - bool map_buffer_ggtt(Offset offset, size_t length) - { - bool result = false; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.map_offset != offset) { return; } - result = true; - }; - _buffer_registry.for_each(lookup_buffer); - - if (!result) { - Genode::error("could not lookup buffer for offset: ", offset); - } - - return result; - } - - void unmap_buffer_ggtt(void *addr, size_t length) - { - Offset const offset = (Offset const)addr; - - auto lookup_buffer = [&] (Buffer_handle &h) { - if (h.map_offset != offset) { return; } - - if (!h.map_cap.valid()) { - Genode::error("no valid capability found for offset: ", Genode::Hex(offset)); - return; - } - - _unmap_buffer(h); - }; - _buffer_registry.for_each(lookup_buffer); - } - - int ioctl(unsigned long request, void *arg) - { - bool const device = device_ioctl(request); - return device ? _device_ioctl(device_number(request), arg) - : _generic_ioctl(command_number(request), arg); - } - - void wait_for_completion() { _completion_lock.block(); } -}; - - -static Genode::Constructible _call; - - -void drm_init(Genode::Env &env, Genode::Entrypoint &signal_ep) -{ - _call.construct(env, signal_ep); -} - - -void drm_complete() { _call->wait_for_completion(); } - - -/** - * Mmap buffer object - * - * On Genode the virtual address of MMAP_GTT is stored in the offset. - */ -extern "C" void *drm_mmap(void *addr, size_t length, int prot, int flags, - int fd, off_t offset) -{ - /* sanity check if we got a GTT mapped offset */ - bool const ok = _call->map_buffer_ggtt(offset, length); - return ok ? (void *)offset : nullptr; -} - -/** - * Unmap buffer object - */ -extern "C" int drm_munmap(void *addr, size_t length) -{ - _call->unmap_buffer_ggtt(addr, length); - return 0; -} - - -extern "C" int genode_ioctl(int fd, unsigned long request, void *arg) -{ - if (verbose_ioctl) { dump_ioctl(request); } - int const ret = _call->ioctl(request, arg); - if (verbose_ioctl) { Genode::log("returned ", ret); } - return ret; -}