参照元

説明

引数

返り値

参考

実装

static int ion_carveout_heap_allocate(struct ion_heap *heap,
                                      struct ion_buffer *buffer,
                                      unsigned long size, unsigned long align,
                                      unsigned long flags)
{
        struct sg_table *table;
        ion_phys_addr_t paddr;
        int ret;
        if (align > PAGE_SIZE)
                return -EINVAL;
        table = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
        if (!table)
                return -ENOMEM;
        ret = sg_alloc_table(table, 1, GFP_KERNEL);
        if (ret)
                goto err_free;
        paddr = ion_carveout_allocate(heap, size, align);
        if (paddr == ION_CARVEOUT_ALLOCATE_FAIL) {
                ret = -ENOMEM;
                goto err_free_table;
        }
        sg_set_page(table->sgl, pfn_to_page(PFN_DOWN(paddr)), size, 0);
        buffer->priv_virt = table;
        return 0;

err_free_table:
        sg_free_table(table);
err_free:
        kfree(table);
        return ret;
}

コメント


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS