forked from KolibriOS/kolibrios
ddk: 4.4
git-svn-id: svn://kolibrios.org@6082 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -2,12 +2,37 @@
|
||||
#define _LINUX_SCATTERLIST_H
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/scatterlist.h>
|
||||
//#include <asm/io.h>
|
||||
struct scatterlist {
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
unsigned long sg_magic;
|
||||
#endif
|
||||
unsigned long page_link;
|
||||
unsigned int offset;
|
||||
unsigned int length;
|
||||
dma_addr_t dma_address;
|
||||
#ifdef CONFIG_NEED_SG_DMA_LENGTH
|
||||
unsigned int dma_length;
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* These macros should be used after a dma_map_sg call has been done
|
||||
* to get bus addresses of each of the SG entries and their lengths.
|
||||
* You should only work with the number of sg entries dma_map_sg
|
||||
* returns, or alternatively stop on the first sg_dma_len(sg) which
|
||||
* is 0.
|
||||
*/
|
||||
#define sg_dma_address(sg) ((sg)->dma_address)
|
||||
|
||||
#ifdef CONFIG_NEED_SG_DMA_LENGTH
|
||||
#define sg_dma_len(sg) ((sg)->dma_length)
|
||||
#else
|
||||
#define sg_dma_len(sg) ((sg)->length)
|
||||
#endif
|
||||
|
||||
struct sg_table {
|
||||
struct scatterlist *sgl; /* the list */
|
||||
@@ -18,10 +43,9 @@ struct sg_table {
|
||||
/*
|
||||
* Notes on SG table design.
|
||||
*
|
||||
* Architectures must provide an unsigned long page_link field in the
|
||||
* scatterlist struct. We use that to place the page pointer AND encode
|
||||
* information about the sg table as well. The two lower bits are reserved
|
||||
* for this information.
|
||||
* We use the unsigned long page_link field in the scatterlist struct to place
|
||||
* the page pointer AND encode information about the sg table as well. The two
|
||||
* lower bits are reserved for this information.
|
||||
*
|
||||
* If bit 0 is set, then the page_link contains a pointer to the next sg
|
||||
* table list. Otherwise the next entry is at sg + 1.
|
||||
@@ -108,14 +132,14 @@ static inline struct page *sg_page(struct scatterlist *sg)
|
||||
* @buflen: Data length
|
||||
*
|
||||
**/
|
||||
//static inline void sg_set_buf(struct scatterlist *sg, const void *buf,
|
||||
// unsigned int buflen)
|
||||
//{
|
||||
//#ifdef CONFIG_DEBUG_SG
|
||||
// BUG_ON(!virt_addr_valid(buf));
|
||||
//#endif
|
||||
// sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf));
|
||||
//}
|
||||
static inline void sg_set_buf(struct scatterlist *sg, const void *buf,
|
||||
unsigned int buflen)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
BUG_ON(!virt_addr_valid(buf));
|
||||
#endif
|
||||
sg_set_page(sg, (struct page*)((unsigned)buf&0xFFFFF000), buflen, offset_in_page(buf));
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop over each sg element, following the pointer to a new list if necessary
|
||||
@@ -136,10 +160,6 @@ static inline struct page *sg_page(struct scatterlist *sg)
|
||||
static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents,
|
||||
struct scatterlist *sgl)
|
||||
{
|
||||
#ifndef CONFIG_ARCH_HAS_SG_CHAIN
|
||||
BUG();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* offset and length are unused for chain entry. Clear them.
|
||||
*/
|
||||
@@ -221,10 +241,16 @@ static inline dma_addr_t sg_phys(struct scatterlist *sg)
|
||||
//}
|
||||
|
||||
int sg_nents(struct scatterlist *sg);
|
||||
int sg_nents_for_len(struct scatterlist *sg, u64 len);
|
||||
struct scatterlist *sg_next(struct scatterlist *);
|
||||
struct scatterlist *sg_last(struct scatterlist *s, unsigned int);
|
||||
void sg_init_table(struct scatterlist *, unsigned int);
|
||||
void sg_init_one(struct scatterlist *, const void *, unsigned int);
|
||||
int sg_split(struct scatterlist *in, const int in_mapped_nents,
|
||||
const off_t skip, const int nb_splits,
|
||||
const size_t *split_sizes,
|
||||
struct scatterlist **out, int *out_mapped_nents,
|
||||
gfp_t gfp_mask);
|
||||
|
||||
typedef struct scatterlist *(sg_alloc_fn)(unsigned int, gfp_t);
|
||||
typedef void (sg_free_fn)(struct scatterlist *, unsigned int);
|
||||
@@ -239,13 +265,16 @@ int sg_alloc_table_from_pages(struct sg_table *sgt,
|
||||
unsigned long offset, unsigned long size,
|
||||
gfp_t gfp_mask);
|
||||
|
||||
size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, void *buf,
|
||||
size_t buflen, off_t skip, bool to_buffer);
|
||||
|
||||
size_t sg_copy_from_buffer(struct scatterlist *sgl, unsigned int nents,
|
||||
void *buf, size_t buflen);
|
||||
const void *buf, size_t buflen);
|
||||
size_t sg_copy_to_buffer(struct scatterlist *sgl, unsigned int nents,
|
||||
void *buf, size_t buflen);
|
||||
|
||||
size_t sg_pcopy_from_buffer(struct scatterlist *sgl, unsigned int nents,
|
||||
void *buf, size_t buflen, off_t skip);
|
||||
const void *buf, size_t buflen, off_t skip);
|
||||
size_t sg_pcopy_to_buffer(struct scatterlist *sgl, unsigned int nents,
|
||||
void *buf, size_t buflen, off_t skip);
|
||||
|
||||
@@ -349,4 +378,6 @@ 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);
|
||||
|
||||
#define dma_unmap_sg(d, s, n, r)
|
||||
|
||||
#endif /* _LINUX_SCATTERLIST_H */
|
||||
|
Reference in New Issue
Block a user