| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright 2018-2020 Broadcom. |
| */ |
| |
| #ifndef BCM_VK_SG_H |
| #define BCM_VK_SG_H |
| |
| #include <linux/dma-mapping.h> |
| |
| struct bcm_vk_dma { |
| /* for userland buffer */ |
| struct page **pages; |
| int nr_pages; |
| |
| /* common */ |
| dma_addr_t handle; |
| /* |
| * sglist is of the following LE format |
| * [U32] num_sg = number of sg addresses (N) |
| * [U32] totalsize = totalsize of data being transferred in sglist |
| * [U32] size[0] = size of data in address0 |
| * [U32] addr_l[0] = lower 32-bits of address0 |
| * [U32] addr_h[0] = higher 32-bits of address0 |
| * .. |
| * [U32] size[N-1] = size of data in addressN-1 |
| * [U32] addr_l[N-1] = lower 32-bits of addressN-1 |
| * [U32] addr_h[N-1] = higher 32-bits of addressN-1 |
| */ |
| u32 *sglist; |
| #define SGLIST_NUM_SG 0 |
| #define SGLIST_TOTALSIZE 1 |
| #define SGLIST_VKDATA_START 2 |
| |
| int sglen; /* Length (bytes) of sglist */ |
| int direction; |
| }; |
| |
| struct _vk_data { |
| u32 size; /* data size in bytes */ |
| u64 address; /* Pointer to data */ |
| } __packed; |
| |
| /* |
| * Scatter-gather DMA buffer API. |
| * |
| * These functions provide a simple way to create a page list and a |
| * scatter-gather list from userspace address and map the memory |
| * for DMA operation. |
| */ |
| int bcm_vk_sg_alloc(struct device *dev, |
| struct bcm_vk_dma *dma, |
| int dir, |
| struct _vk_data *vkdata, |
| int num); |
| |
| int bcm_vk_sg_free(struct device *dev, struct bcm_vk_dma *dma, int num, |
| int *proc_cnt); |
| |
| #endif |
| |