R&D/OS

Dynamic DMA mapping

sunshout 2014. 2. 12. 17:05


DMA에서 가장 중요한 사안은

- DMA Address가 Physical Address 임

- If Guest VM, Guest Physical Address




struct scatterlist

file: include/asm-generic/scatterlist.h

#ifndef __ASM_GENERIC_SCATTERLIST_H

#define __ASM_GENERIC_SCATTERLIST_H


#include <linux/types.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 pci_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


#endif /* __ASM_GENERIC_SCATTERLIST_H */