linux-4.4.1/dma_alloc_from_coherent()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#s952ff78]
#backlinks
*説明 [#x8942cb1]
-パス: 複数あり
--ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 有効: [[linux-4.4....
--ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 無効: [[linux-4.4....
--[[linux-4.4.1/ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY]]
-FIXME: これは何?
--確保した領域は 0 データで埋められる。
--コンフィグにより、マクロの場合と関数の場合の 2通りある。
**引数 [#pbc777e0]
-struct device *dev
--デバイス
--[[linux-4.4.1/device]]
-ssize_t size
--確保する領域のサイズ
-dma_addr_t *dma_handle
--確保した領域の DMA アドレスを返すためのポインタ
--失敗したときは不定値が返る
--[[linux-4.4.1/dma_addr_t]]
-void **ret
--確保した領域の仮想アドレスを返すためのポインタ
--失敗したときは不定値が返る
**返り値 [#o3705ddb]
-int
--成功なら 0以外、失敗なら 0
**参考 [#k35515dc]
*実装 [#zf0a4f05]
**ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 有効: drivers/base...
/**
* dma_alloc_from_coherent() - try to allocate memory fr...
*
* @dev: device from which we allocate memory
* @size: size of requested memory area
* @dma_handle: This will be filled with the correct dma...
* @ret: This pointer will be filled with the vir...
* to allocated area.
*
* This function should be only called from per-arch dma...
* to support allocation from per-device coherent memory...
*
* Returns 0 if dma_alloc_coherent should continue with ...
* generic memory areas, or !0 if dma_alloc_coherent sho...
*/
int dma_alloc_from_coherent(struct device *dev, ssize_t ...
dma_addr_t *dma_h...
{
struct dma_coherent_mem *mem;
int order = get_order(size);
unsigned long flags;
int pageno;
-
--[[linux-4.4.1/dma_coherent_mem]]
--[[linux-4.4.1/get_order()]]
if (!dev)
return 0;
mem = dev->dma_mem;
if (!mem)
return 0;
-dev->dma_mem の初期化は dma_assign_coherent_memory() に...
--[[linux-4.4.1/dma_assign_coherent_memory()]]
*ret = NULL;
spin_lock_irqsave(&mem->spinlock, flags);
-
--[[linux-4.4.1/spin_lock_irqsave()]]
if (unlikely(size > (mem->size << PAGE_SHIFT)))
goto err;
-
--[[linux-4.4.1/unlikely()]]
pageno = bitmap_find_free_region(mem->bitmap, me...
if (unlikely(pageno < 0))
goto err;
-
--[[linux-4.4.1/bitmap_find_free_region()]]
/*
* Memory was found in the per-device area.
*/
*dma_handle = mem->device_base + (pageno << PAGE...
*ret = mem->virt_base + (pageno << PAGE_SHIFT);
memset(*ret, 0, size);
spin_unlock_irqrestore(&mem->spinlock, flags);
-
--[[linux-4.4.1/memset()]]
--[[linux-4.4.1/spin_unlock_irqrestore()]]
return 1;
err:
spin_unlock_irqrestore(&mem->spinlock, flags);
/*
* In the case where the allocation can not be s...
* per-device area, try to fall back to generic ...
* constraints allow it.
*/
return mem->flags & DMA_MEMORY_EXCLUSIVE;
}
EXPORT_SYMBOL(dma_alloc_from_coherent);
-
--[[linux-4.4.1/EXPORT_SYMBOL()]]
**ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 無効: include/asm-...
#define dma_alloc_from_coherent(dev, size, handle, ret) ...
-割り当てられる領域がない、常に失敗する
*コメント [#jd9190f0]
終了行:
*参照元 [#s952ff78]
#backlinks
*説明 [#x8942cb1]
-パス: 複数あり
--ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 有効: [[linux-4.4....
--ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 無効: [[linux-4.4....
--[[linux-4.4.1/ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY]]
-FIXME: これは何?
--確保した領域は 0 データで埋められる。
--コンフィグにより、マクロの場合と関数の場合の 2通りある。
**引数 [#pbc777e0]
-struct device *dev
--デバイス
--[[linux-4.4.1/device]]
-ssize_t size
--確保する領域のサイズ
-dma_addr_t *dma_handle
--確保した領域の DMA アドレスを返すためのポインタ
--失敗したときは不定値が返る
--[[linux-4.4.1/dma_addr_t]]
-void **ret
--確保した領域の仮想アドレスを返すためのポインタ
--失敗したときは不定値が返る
**返り値 [#o3705ddb]
-int
--成功なら 0以外、失敗なら 0
**参考 [#k35515dc]
*実装 [#zf0a4f05]
**ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 有効: drivers/base...
/**
* dma_alloc_from_coherent() - try to allocate memory fr...
*
* @dev: device from which we allocate memory
* @size: size of requested memory area
* @dma_handle: This will be filled with the correct dma...
* @ret: This pointer will be filled with the vir...
* to allocated area.
*
* This function should be only called from per-arch dma...
* to support allocation from per-device coherent memory...
*
* Returns 0 if dma_alloc_coherent should continue with ...
* generic memory areas, or !0 if dma_alloc_coherent sho...
*/
int dma_alloc_from_coherent(struct device *dev, ssize_t ...
dma_addr_t *dma_h...
{
struct dma_coherent_mem *mem;
int order = get_order(size);
unsigned long flags;
int pageno;
-
--[[linux-4.4.1/dma_coherent_mem]]
--[[linux-4.4.1/get_order()]]
if (!dev)
return 0;
mem = dev->dma_mem;
if (!mem)
return 0;
-dev->dma_mem の初期化は dma_assign_coherent_memory() に...
--[[linux-4.4.1/dma_assign_coherent_memory()]]
*ret = NULL;
spin_lock_irqsave(&mem->spinlock, flags);
-
--[[linux-4.4.1/spin_lock_irqsave()]]
if (unlikely(size > (mem->size << PAGE_SHIFT)))
goto err;
-
--[[linux-4.4.1/unlikely()]]
pageno = bitmap_find_free_region(mem->bitmap, me...
if (unlikely(pageno < 0))
goto err;
-
--[[linux-4.4.1/bitmap_find_free_region()]]
/*
* Memory was found in the per-device area.
*/
*dma_handle = mem->device_base + (pageno << PAGE...
*ret = mem->virt_base + (pageno << PAGE_SHIFT);
memset(*ret, 0, size);
spin_unlock_irqrestore(&mem->spinlock, flags);
-
--[[linux-4.4.1/memset()]]
--[[linux-4.4.1/spin_unlock_irqrestore()]]
return 1;
err:
spin_unlock_irqrestore(&mem->spinlock, flags);
/*
* In the case where the allocation can not be s...
* per-device area, try to fall back to generic ...
* constraints allow it.
*/
return mem->flags & DMA_MEMORY_EXCLUSIVE;
}
EXPORT_SYMBOL(dma_alloc_from_coherent);
-
--[[linux-4.4.1/EXPORT_SYMBOL()]]
**ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY 無効: include/asm-...
#define dma_alloc_from_coherent(dev, size, handle, ret) ...
-割り当てられる領域がない、常に失敗する
*コメント [#jd9190f0]
ページ名: