参照元

説明

引数

返り値

参考

実装

void *ion_heap_map_kernel(struct ion_heap *heap,
                          struct ion_buffer *buffer)
{
        struct scatterlist *sg;
        int i, j;
        void *vaddr;
        pgprot_t pgprot;
        struct sg_table *table = buffer->sg_table;
        int npages = PAGE_ALIGN(buffer->size) / PAGE_SIZE;
        struct page **pages = vmalloc(sizeof(struct page *) * npages);
        struct page **tmp = pages;
        if (!pages)
                return NULL;

        if (buffer->flags & ION_FLAG_CACHED)
                pgprot = PAGE_KERNEL;
        else
                pgprot = pgprot_writecombine(PAGE_KERNEL);
        for_each_sg(table->sgl, sg, table->nents, i) {
                int npages_this_entry = PAGE_ALIGN(sg->length) / PAGE_SIZE;
                struct page *page = sg_page(sg);
                BUG_ON(i >= npages);
                for (j = 0; j < npages_this_entry; j++)
                        *(tmp++) = page++;
        }
        vaddr = vmap(pages, npages, VM_MAP, pgprot);
        vfree(pages);
        if (!vaddr)
                return ERR_PTR(-ENOMEM);
        return vaddr;
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-10-27 (木) 15:40:26