参照元

説明

引数

返り値

参考

実装

/**
 * __vb2_buf_mem_alloc() - allocate video memory for the given buffer
 */
static int __vb2_buf_mem_alloc(struct vb2_buffer *vb)
{
        struct vb2_queue *q = vb->vb2_queue;
        enum dma_data_direction dma_dir =
                q->is_output ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
        void *mem_priv;
        int plane;
        /*
         * Allocate memory for all planes in this buffer
         * NOTE: mmapped areas should be page aligned
         */
        for (plane = 0; plane < vb->num_planes; ++plane) {
                unsigned long size = PAGE_ALIGN(q->plane_sizes[plane]);
                mem_priv = call_ptr_memop(vb, alloc, q->alloc_ctx[plane],
                                      size, dma_dir, q->gfp_flags);
                if (IS_ERR_OR_NULL(mem_priv))
                        goto free;
                /* Associate allocator private data with this plane */
                vb->planes[plane].mem_priv = mem_priv;
                vb->planes[plane].length = q->plane_sizes[plane];
        }

        return 0;
free:
        /* Free already allocated memory if one of the allocations failed */
        for (; plane > 0; --plane) {
                call_void_memop(vb, put, vb->planes[plane - 1].mem_priv);
                vb->planes[plane - 1].mem_priv = NULL;
        }
        return -ENOMEM;
}

コメント


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