diff options
author | Ella Feng <ella.feng@nxp.com> | 2020-04-21 22:04:22 +0800 |
---|---|---|
committer | Ella Feng <ella.feng@nxp.com> | 2020-04-23 21:58:39 +0800 |
commit | ebde654b30cd6d2fcf7862f5cc8173b6fe3b2f76 (patch) | |
tree | e1b2f7147ae642108003635184e251ece56ee725 /drivers/mxc | |
parent | 855447f2e9119e8a2dfadd77dae18ad16662827c (diff) |
MGS-5616-2 [#ccc] Remove dma-buf map/unmap hooks for 5.5 kernel
Make this change only for 5.5 kernel
Revert "mxc: gpu-viv: Remove dma-buf map/unmap hooks"
This reverts commit 5c6c9d8bed6d0e6adc57de9f422fd19bf8a569cd.
Date: 21 Apr, 2020
Signed-off-by: Ella Feng <ella.feng@nxp.com>
Diffstat (limited to 'drivers/mxc')
-rw-r--r-- | drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c index 4b803050314d..e1b18295d741 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c @@ -4083,12 +4083,93 @@ static void _dmabuf_release(struct dma_buf *dmabuf) gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(nodeObject->kernel, nodeObject)); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,5,0) +static void *_dmabuf_kmap(struct dma_buf *dmabuf, unsigned long offset) +{ + gckVIDMEM_NODE nodeObject = dmabuf->priv; + gcuVIDMEM_NODE_PTR node = nodeObject->node; + gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent; + gctINT8_PTR kvaddr = gcvNULL; + gctPHYS_ADDR physical = gcvNULL; + gctSIZE_T bytes = 0; + + offset = (offset << PAGE_SHIFT); + if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM) + { + physical = node->VidMem.parent->physical; + offset += node->VidMem.offset; + bytes = node->VidMem.bytes; + } + else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK) + { + physical = vidMemBlock->physical; + offset += node->VirtualChunk.offset; + bytes = node->VirtualChunk.bytes; + } + else + { + physical = node->Virtual.physical; + bytes = node->Virtual.bytes; + } + + if (gcmIS_SUCCESS(gckOS_CreateKernelMapping( + nodeObject->kernel->os, physical, 0, bytes, (gctPOINTER*)&kvaddr))) + { + kvaddr += offset; + } + + return (gctPOINTER)kvaddr; +} + +static void _dmabuf_kunmap(struct dma_buf *dmabuf, unsigned long offset, void *ptr) +{ + gckVIDMEM_NODE nodeObject = dmabuf->priv; + gcuVIDMEM_NODE_PTR node = nodeObject->node; + gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent; + gctINT8_PTR kvaddr = (gctINT8_PTR)ptr - (offset << PAGE_SHIFT); + gctPHYS_ADDR physical = gcvNULL; + + if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM) + { + physical = node->VidMem.parent->physical; + kvaddr -= node->VidMem.offset; + } + else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK) + { + physical = vidMemBlock->physical; + kvaddr -= node->VirtualChunk.offset; + } + else + { + physical = node->Virtual.physical; + } + + gcmkVERIFY_OK(gckOS_DestroyKernelMapping( + nodeObject->kernel->os, physical, (gctPOINTER*)&kvaddr)); +} +#endif + static struct dma_buf_ops _dmabuf_ops = { .map_dma_buf = _dmabuf_map, .unmap_dma_buf = _dmabuf_unmap, .mmap = _dmabuf_mmap, .release = _dmabuf_release, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0) +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0) + .map = _dmabuf_kmap, + .unmap = _dmabuf_kunmap, +# elif LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0) + .map_atomic = _dmabuf_kmap, + .unmap_atomic = _dmabuf_kunmap, + .map = _dmabuf_kmap, + .unmap = _dmabuf_kunmap, +# else + .kmap_atomic = _dmabuf_kmap, + .kunmap_atomic = _dmabuf_kunmap, + .kmap = _dmabuf_kmap, + .kunmap = _dmabuf_kunmap, +# endif }; #endif |