# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) # Copyright (c) 2020, Intel Corporation. All rights reserved. See COPYING file #cython: language_level=3 import weakref from pyverbs.base cimport close_weakrefs from pyverbs.base import PyverbsRDMAErrno from pyverbs.mr cimport DmaBufMR cdef extern from "dmabuf_alloc.h": cdef struct dmabuf: pass dmabuf *dmabuf_alloc(unsigned long size, int gpu, int gtt) void dmabuf_free(dmabuf *dmabuf) int dmabuf_get_drm_fd(dmabuf *dmabuf) int dmabuf_get_fd(dmabuf *dmabuf) unsigned long dmabuf_get_offset(dmabuf *dmabuf) cdef class DmaBuf: def __init__(self, size, gpu=0, gtt=0): """ Allocate DmaBuf object from a GPU device. This is done through the DRI device interface. Usually this requires the effective user id being a member of the 'render' group. :param size: The size (in number of bytes) of the buffer. :param gpu: The GPU unit to allocate the buffer from. :param gtt: Allocate from GTT (Graphics Translation Table) instead of VRAM. :return: The newly created DmaBuf object on success. """ self.dmabuf_mrs = weakref.WeakSet() self.dmabuf = dmabuf_alloc(size, gpu, gtt) if self.dmabuf == NULL: raise PyverbsRDMAErrno(f'Failed to allocate dmabuf of size {size} on gpu {gpu}') self.drm_fd = dmabuf_get_drm_fd(self.dmabuf) self.fd = dmabuf_get_fd(self.dmabuf) self.map_offset = dmabuf_get_offset(self.dmabuf) def __dealloc__(self): self.close() cpdef close(self): if self.dmabuf == NULL: return None close_weakrefs([self.dmabuf_mrs]) dmabuf_free(self.dmabuf) self.dmabuf = NULL cdef add_ref(self, obj): if isinstance(obj, DmaBufMR): self.dmabuf_mrs.add(obj) @property def drm_fd(self): return self.drm_fd @property def handle(self): return self.handle @property def fd(self): return self.fd @property def size(self): return self.size @property def map_offset(self): return self.map_offset