| /* |
| * Google LWIS Anchorage Platform-Specific DMA Functions |
| * |
| * Copyright (c) 2020 Google, LLC |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| |
| #include <linux/slab.h> |
| |
| #include <linux/dma-buf.h> |
| #include <linux/dma-heap.h> |
| #include "lwis_commands.h" |
| #include "lwis_init.h" |
| #include "lwis_platform.h" |
| #include "lwis_platform_dma.h" |
| struct dma_buf *lwis_platform_dma_buffer_alloc(size_t len, unsigned int flags) |
| { |
| const char *heap_name; |
| struct dma_heap *heap; |
| struct dma_buf *dmabuf; |
| |
| if ((flags & LWIS_DMA_BUFFER_SECURE) && IS_ENABLED(CONFIG_EXYNOS_CONTENT_PATH_PROTECTION)) |
| heap_name = "farawimg-secure"; |
| else if (flags & LWIS_DMA_BUFFER_CACHED) |
| heap_name = "system"; |
| else |
| heap_name = "system-uncached"; |
| |
| heap = dma_heap_find(heap_name); |
| if (!heap) { |
| pr_err("Could not find %s DMA-BUF heap\n", heap_name); |
| return NULL; |
| } |
| |
| dmabuf = dma_heap_buffer_alloc(heap, len, O_RDWR, 0); |
| if (IS_ERR_OR_NULL(dmabuf)) { |
| pr_err("DMA-BUF heap failed to alloc %#zx bytes. Error code %lu\n", |
| len, PTR_ERR(dmabuf)); |
| dmabuf = NULL; |
| } |
| |
| dma_heap_put(heap); |
| |
| return dmabuf; |
| } |
| |
| dma_addr_t lwis_platform_dma_buffer_map(struct lwis_device *lwis_dev, |
| struct lwis_enrolled_buffer *lwis_buffer, off_t offset, |
| size_t size, int flags) |
| { |
| return sg_dma_address(lwis_buffer->sg_table->sgl); |
| } |
| |
| /* |
| * We don't ever do dma_buf_vmap before. Instead, use the upstream dma-buf |
| * interface to map ION buffers, so we don't need to do dma_buf_vunmap. |
| * Keep this function by defult return 0 |
| */ |
| int lwis_platform_dma_buffer_unmap(struct lwis_device *lwis_dev, |
| struct dma_buf_attachment *attachment, dma_addr_t address) |
| { |
| return 0; |
| } |