1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright 2018-2020 Broadcom. 4 */ 5 6 #ifndef BCM_VK_SG_H 7 #define BCM_VK_SG_H 8 9 #include <linux/dma-mapping.h> 10 11 struct bcm_vk_dma { 12 /* for userland buffer */ 13 struct page **pages; 14 int nr_pages; 15 16 /* common */ 17 dma_addr_t handle; 18 /* 19 * sglist is of the following LE format 20 * [U32] num_sg = number of sg addresses (N) 21 * [U32] totalsize = totalsize of data being transferred in sglist 22 * [U32] size[0] = size of data in address0 23 * [U32] addr_l[0] = lower 32-bits of address0 24 * [U32] addr_h[0] = higher 32-bits of address0 25 * .. 26 * [U32] size[N-1] = size of data in addressN-1 27 * [U32] addr_l[N-1] = lower 32-bits of addressN-1 28 * [U32] addr_h[N-1] = higher 32-bits of addressN-1 29 */ 30 u32 *sglist; 31 #define SGLIST_NUM_SG 0 32 #define SGLIST_TOTALSIZE 1 33 #define SGLIST_VKDATA_START 2 34 35 int sglen; /* Length (bytes) of sglist */ 36 int direction; 37 }; 38 39 struct _vk_data { 40 u32 size; /* data size in bytes */ 41 u64 address; /* Pointer to data */ 42 } __packed; 43 44 /* 45 * Scatter-gather DMA buffer API. 46 * 47 * These functions provide a simple way to create a page list and a 48 * scatter-gather list from userspace address and map the memory 49 * for DMA operation. 50 */ 51 int bcm_vk_sg_alloc(struct device *dev, 52 struct bcm_vk_dma *dma, 53 int dir, 54 struct _vk_data *vkdata, 55 int num); 56 57 int bcm_vk_sg_free(struct device *dev, struct bcm_vk_dma *dma, int num, 58 int *proc_cnt); 59 60 #endif 61 62