*参照元 [#d43e70e0] #backlinks *説明 [#e0b2606d] -パス: [[linux-4.4.1/arch/arm64/mm/dma-mapping.c]] -FIXME: これは何? -優先順に書くと --IOMMU が定義する DMA 処理 --デバイス独自の DMA 処理(dev->archdata.dma_ops) --ARM64 デフォルトの DMA 処理(swiotlb_dma_ops) --IOMMU が定義する DMA 処理 **引数 [#yedae688] -struct device *dev -- --[[linux-4.4.1/device]] -u64 dma_base -- -u64 size -- -struct iommu_ops *iommu -- --[[linux-4.4.1/iommu_ops]] -bool coherent -- **返り値 [#b426795f] -なし **参考 [#w17639ff] DMA 操作の取得 -[[linux-4.4.1/get_dma_ops()(arm64)]] 関係する DMA 操作 -ARM64 デフォルト: [[linux-4.4.1/swiotlb_dma_ops(global)]] -ダミー: [[linux-4.4.1/dummy_dma_ops(global)]] -ダミーは直接設定されるわけではなく、この関数を一度も呼ばないなど DMA 操作が未定義の状態で DMA API を使った場合、下記経路でダミーを返す --[[linux-4.4.1/get_dma_ops()]] --[[linux-4.4.1/__generic_dma_ops()]] *実装 [#z2f67570] void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, struct iommu_ops *iommu, bool coherent) { if (!dev->archdata.dma_ops) dev->archdata.dma_ops = &swiotlb_dma_ops; -デバイス独自の DMA 処理が定義されていなければ ARM64 デフォルトの DMA 処理を使う --[[linux-4.4.1/swiotlb_dma_ops(global)]] dev->archdata.dma_coherent = coherent; - --参照するときは is_device_dma_coherent() を使う。 --[[linux-4.4.1/is_device_dma_coherent()]] __iommu_setup_dma_ops(dev, dma_base, size, iommu); -IOMMU の DMA 処理があれば、優先する --[[linux-4.4.1/__iommu_setup_dma_ops()]] } *コメント [#o5dda86f]