*参照元 [#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]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS