92 lines
2.5 KiB
C
92 lines
2.5 KiB
C
/*
|
|
* \brief Linux kernel API
|
|
* \author Norman Feske
|
|
* \author Sebastian Sumpf
|
|
* \author Josef Soentgen
|
|
* \date 2014-08-21
|
|
*
|
|
* Based on the prototypes found in the Linux kernel's 'include/'.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2014 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
/*************************
|
|
** linux/scatterlist.h **
|
|
*************************/
|
|
|
|
enum {
|
|
SG_MITER_TO_SG = 2,
|
|
SG_MITER_FROM_SG = 4,
|
|
};
|
|
|
|
struct scatterlist {
|
|
unsigned long page_link;
|
|
unsigned int offset;
|
|
unsigned int length;
|
|
dma_addr_t dma_address;
|
|
int last;
|
|
};
|
|
|
|
struct sg_table
|
|
{
|
|
struct scatterlist *sgl; /* the list */
|
|
unsigned int nents; /* number of mapped entries */
|
|
};
|
|
|
|
struct sg_page_iter
|
|
{
|
|
struct scatterlist *sg;
|
|
unsigned int sg_pgoffset; /* page offset within the sg */
|
|
};
|
|
|
|
struct sg_mapping_iter
|
|
{
|
|
void *addr;
|
|
size_t length;
|
|
|
|
struct sg_page_iter piter;
|
|
};
|
|
|
|
struct page;
|
|
|
|
void sg_init_table(struct scatterlist *, unsigned int);
|
|
void sg_set_buf(struct scatterlist *sg, const void *buf, unsigned int buflen);
|
|
void sg_set_page(struct scatterlist *sg, struct page *page,
|
|
unsigned int len, unsigned int offset);
|
|
|
|
struct page *sg_page(struct scatterlist *sg);
|
|
void *sg_virt(struct scatterlist *sg);
|
|
struct scatterlist *sg_next(struct scatterlist *);
|
|
|
|
int sg_nents(struct scatterlist *sg);
|
|
size_t sg_copy_from_buffer(struct scatterlist *sgl, unsigned int nents,
|
|
void *buf, size_t buflen);
|
|
size_t sg_copy_to_buffer(struct scatterlist *sgl, unsigned int nents,
|
|
void *buf, size_t buflen);
|
|
|
|
bool __sg_page_iter_next(struct sg_page_iter *piter);
|
|
void __sg_page_iter_start(struct sg_page_iter *piter,
|
|
struct scatterlist *sglist, unsigned int nents,
|
|
unsigned long pgoffset);
|
|
|
|
#define for_each_sg(sglist, sg, nr, __i) \
|
|
for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg))
|
|
|
|
#define for_each_sg_page(sglist, piter, nents, pgoffset) \
|
|
for (__sg_page_iter_start((piter), (sglist), (nents), (pgoffset)); \
|
|
__sg_page_iter_next(piter);)
|
|
|
|
#define sg_dma_address(sg) ((sg)->dma_address)
|
|
#define sg_dma_len(sg) ((sg)->length)
|
|
|
|
void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,
|
|
unsigned int nents, unsigned int flags);
|
|
bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset);
|
|
bool sg_miter_next(struct sg_mapping_iter *miter);
|
|
void sg_miter_stop(struct sg_mapping_iter *miter);
|