*参照元 [#w9fadc0a]
#backlinks
*説明 [#qc1f353d]
-パス: 複数あり
--CONFIG_HAVE_DMA_ATTRS 有効: [[linux-4.4.1/include/asm-generic/dma-mapping-common.h]]
--CONFIG_HAVE_DMA_ATTRS 無効: [[linux-4.4.1/include/linux/dma-mapping.h]]
--[[linux-4.4.1/CONFIG_HAVE_DMA_ATTRS]]
-FIXME: バッファの仮想アドレス(CPU がアクセスするアドレス)を受け取り、バッファにデバイスがアクセス出来るようにセットアップし、DMA アドレス(DMA を行うデバイスがアクセスするアドレス)を返す。
**引数 [#ee2fee2e]
-struct device *dev
--DMA を行うデバイス。
--[[linux-4.4.1/device]]
-void *ptr
--バッファの仮想アドレス、すなわち CPU がアクセスするアドレス。
-size_t size
--バッファサイズ。
-enum dma_data_direction dir
--DMA の方向。DMA_TO_DEVICE もしくは DMA_FROM_DEVICE を指定する。
--[[linux-4.4.1/dma_data_direction]]
-struct dma_attrs *attrs
--
--[[linux-4.4.1/dma_attrs]]
**返り値 [#pafb0c86]
-dma_addr_t
--バッファの DMA アドレス、すなわち DMA を行うデバイスがアクセスするアドレス。
**参考 [#fbd94e7b]
*実装 [#r116de2a]
**CONFIG_HAVE_DMA_ATTRS 有効: include/asm-generic/dma-mapping-common.h [#a3941f6b]
static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
size_t size,
enum dma_data_direction dir,
struct dma_attrs *attrs)
{
struct dma_map_ops *ops = get_dma_ops(dev);
dma_addr_t addr;
-
--[[linux-4.4.1/dma_map_ops]]
--[[linux-4.4.1/get_dma_ops()]]
--[[linux-4.4.1/dma_addr_t]]
kmemcheck_mark_initialized(ptr, size);
BUG_ON(!valid_dma_direction(dir));
-
--[[linux-4.4.1/kmemcheck_mark_initialized()]]
--[[linux-4.4.1/BUG_ON()]]
--[[linux-4.4.1/valid_dma_direction()]]
addr = ops->map_page(dev, virt_to_page(ptr),
(unsigned long)ptr & ~PAGE_MASK, size,
dir, attrs);
-
--[[linux-4.4.1/dma_map_ops]]
--[[linux-4.4.1/virt_to_page()]]
debug_dma_map_page(dev, virt_to_page(ptr),
(unsigned long)ptr & ~PAGE_MASK, size,
dir, addr, true);
-
--[[linux-4.4.1/debug_dma_map_page()]]
return addr;
}
**CONFIG_HAVE_DMA_ATTRS 無効: include/linux/dma-mapping.h [#mef26331]
#define dma_map_single_attrs(dev, cpu_addr, size, dir, attrs) \
dma_map_single(dev, cpu_addr, size, dir)
-
--[[linux-4.4.1/dma_map_single()]]
*コメント [#xc92fb0b]