参照元

説明

引数

返り値

参考

実装

static void __dma_page_dev_to_cpu(struct page *page, unsigned long off,
        size_t size, enum dma_data_direction dir)
{
        phys_addr_t paddr = page_to_phys(page) + off;
        /* FIXME: non-speculating: not required */
        /* in any case, don't bother invalidating if DMA to device */
        if (dir != DMA_TO_DEVICE) {
                outer_inv_range(paddr, paddr + size);
                dma_cache_maint_page(page, off, size, dir, dmac_unmap_area);
        }

        /*
         * Mark the D-cache clean for these pages to avoid extra flushing.
         */
        if (dir != DMA_TO_DEVICE && size >= PAGE_SIZE) {
                unsigned long pfn;
                size_t left = size;

                pfn = page_to_pfn(page) + off / PAGE_SIZE;
                off %= PAGE_SIZE;
                if (off) {
                        pfn++;
                        left -= PAGE_SIZE - off;
                }
                while (left >= PAGE_SIZE) {
                        page = pfn_to_page(pfn++);
                        set_bit(PG_dcache_clean, &page->flags);
                        left -= PAGE_SIZE;
                }
        }
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-22 (月) 11:00:23