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
11struct 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
39struct _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 */
51int 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
57int bcm_vk_sg_free(struct device *dev, struct bcm_vk_dma *dma, int num,
58		   int *proc_cnt);
59
60#endif
61
62