On 08.02.2017 13:44, Nicolai Hähnle wrote: > On 08.02.2017 13:39, Christian König wrote: >> Am 08.02.2017 um 13:34 schrieb Nicolai Hähnle: >>> From: Nicolai Hähnle <nicolai.haehnle at amd.com> >>> >>> This variant allows the caller full control over flags and size, and >>> allows passing a NULL bo (for PRT support). >>> >>> Cc: Christian König <christian.koenig at amd.com> >>> Cc: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl> >>> Cc: Jerry Zhang <Jerry.Zhang at amd.com> >>> Signed-off-by: Nicolai Hähnle <nicolai.haehnle at amd.com> >> >> Reviewed-by: Christian König <christian.koenig at amd.com>. >> >> You have a perfect timing, just wanted to ask if anybody has already >> done the unit test or if I should tackle it? > > I actually started hacking on radeonsi support while traveling and > decided to push that towards a somewhat usable state, so a series for > Mesa is going out now :) > > A unit test in libdrm is still a good idea, but I haven't done that. FWIW, I don't plan to write such a unit test, but I did send out a basic piglit test as well that works for me with the Mesa series -- minus the fact I still get GPU VM faults when I change the test to not commit pages. Nicolai > > Cheers, > Nicolai > >> >> Regards, >> Christian. >> >>> --- >>> amdgpu/amdgpu.h | 28 ++++++++++++++++++++++++++++ >>> amdgpu/amdgpu_bo.c | 25 ++++++++++++++++++++----- >>> 2 files changed, 48 insertions(+), 5 deletions(-) >>> >>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h >>> index 7b26a04..6b2ded8 100644 >>> --- a/amdgpu/amdgpu.h >>> +++ b/amdgpu/amdgpu.h >>> @@ -1186,6 +1186,34 @@ int amdgpu_bo_va_op(amdgpu_bo_handle bo, >>> uint32_t ops); >>> /** >>> + * VA mapping/unmapping for a buffer object or PRT region. >>> + * >>> + * This is not a simple drop-in extension for amdgpu_bo_va_op; >>> instead, all >>> + * parameters are treated "raw", i.e. size is not automatically >>> aligned, and >>> + * all flags must be specified explicitly. >>> + * >>> + * \param dev - \c [in] device handle >>> + * \param bo - \c [in] BO handle (may be NULL) >>> + * \param offset - \c [in] Start offset to map >>> + * \param size - \c [in] Size to map >>> + * \param addr - \c [in] Start virtual address. >>> + * \param flags - \c [in] Supported flags for mapping/unmapping >>> + * \param ops - \c [in] AMDGPU_VA_OP_MAP or AMDGPU_VA_OP_UNMAP >>> + * >>> + * \return 0 on success\n >>> + * <0 - Negative POSIX Error code >>> + * >>> +*/ >>> + >>> +int amdgpu_bo_va_op_raw(amdgpu_device_handle dev, >>> + amdgpu_bo_handle bo, >>> + uint64_t offset, >>> + uint64_t size, >>> + uint64_t addr, >>> + uint64_t flags, >>> + uint32_t ops); >>> + >>> +/** >>> * create semaphore >>> * >>> * \param sem - \c [out] semaphore handle >>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c >>> index d30fd1e..f725bfd 100644 >>> --- a/amdgpu/amdgpu_bo.c >>> +++ b/amdgpu/amdgpu_bo.c >>> @@ -683,6 +683,23 @@ int amdgpu_bo_va_op(amdgpu_bo_handle bo, >>> uint32_t ops) >>> { >>> amdgpu_device_handle dev = bo->dev; >>> + >>> + size = ALIGN(size, getpagesize()); >>> + >>> + return amdgpu_bo_va_op_raw(dev, bo, offset, size, addr, >>> + AMDGPU_VM_PAGE_READABLE | >>> + AMDGPU_VM_PAGE_WRITEABLE | >>> + AMDGPU_VM_PAGE_EXECUTABLE, ops); >>> +} >>> + >>> +int amdgpu_bo_va_op_raw(amdgpu_device_handle dev, >>> + amdgpu_bo_handle bo, >>> + uint64_t offset, >>> + uint64_t size, >>> + uint64_t addr, >>> + uint64_t flags, >>> + uint32_t ops) >>> +{ >>> struct drm_amdgpu_gem_va va; >>> int r; >>> @@ -690,14 +707,12 @@ int amdgpu_bo_va_op(amdgpu_bo_handle bo, >>> return -EINVAL; >>> memset(&va, 0, sizeof(va)); >>> - va.handle = bo->handle; >>> + va.handle = bo ? bo->handle : 0; >>> va.operation = ops; >>> - va.flags = AMDGPU_VM_PAGE_READABLE | >>> - AMDGPU_VM_PAGE_WRITEABLE | >>> - AMDGPU_VM_PAGE_EXECUTABLE; >>> + va.flags = flags; >>> va.va_address = addr; >>> va.offset_in_bo = offset; >>> - va.map_size = ALIGN(size, getpagesize()); >>> + va.map_size = size; >>> r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_VA, &va, >>> sizeof(va)); >>> >> >> >