summaryrefslogtreecommitdiff
path: root/drivers/mxc
diff options
context:
space:
mode:
authorElla Feng <ella.feng@nxp.com>2020-04-21 22:04:22 +0800
committerElla Feng <ella.feng@nxp.com>2020-04-23 21:58:39 +0800
commitebde654b30cd6d2fcf7862f5cc8173b6fe3b2f76 (patch)
treee1b2f7147ae642108003635184e251ece56ee725 /drivers/mxc
parent855447f2e9119e8a2dfadd77dae18ad16662827c (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.c81
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