62 строки
1.4 KiB
C
62 строки
1.4 KiB
C
|
/* 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
|
||
|
|