| 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 | |