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