/* SPDX-License-Identifier: GPL-2.0 */ /* * DMA BUF PagePool implementation * Based on earlier ION code by Google * * Copyright (C) 2011 Google, Inc. * Copyright (C) 2020 Linaro Ltd. * Copyright (C) 2022 Rockchip Electronics Co.Ltd */ #ifndef _LINUX_DMABUF_PAGE_POOL_H #define _LINUX_DMABUF_PAGE_POOL_H #include #include #include #include #include #include /* page types we track in the pool */ enum { POOL_LOWPAGE, /* Clean lowmem pages */ POOL_HIGHPAGE, /* Clean highmem pages */ POOL_TYPE_SIZE, }; /** * struct dmabuf_page_pool - pagepool struct * @count[]: array of number of pages of that type in the pool * @items[]: array of list of pages of the specific type * @mutex: lock protecting this struct and especially the count * item list * @gfp_mask: gfp_mask to use from alloc * @order: order of pages in the pool * @list: list node for list of pools * * Allows you to keep a pool of pre allocated pages to use */ struct dmabuf_page_pool { int count[POOL_TYPE_SIZE]; struct list_head items[POOL_TYPE_SIZE]; struct mutex mutex; gfp_t gfp_mask; unsigned int order; struct list_head list; }; #ifdef CONFIG_DMABUF_PAGE_POOL struct dmabuf_page_pool *dmabuf_page_pool_create(gfp_t gfp_mask, unsigned int order); void dmabuf_page_pool_destroy(struct dmabuf_page_pool *pool); struct page *dmabuf_page_pool_alloc(struct dmabuf_page_pool *pool); void dmabuf_page_pool_free(struct dmabuf_page_pool *pool, struct page *page); struct page ** dmabuf_page_pool_alloc_pages_array(struct dmabuf_page_pool *pool, int npages); void dmabuf_page_pool_free_pages_array(struct dmabuf_page_pool *pool, struct page **pages, int npages); #else static inline struct dmabuf_page_pool * dmabuf_page_pool_create(gfp_t gfp_mask, unsigned int order) { return NULL; } static inline void dmabuf_page_pool_destroy(struct dmabuf_page_pool *pool) { } static inline struct page * dmabuf_page_pool_alloc(struct dmabuf_page_pool *pool) { return NULL; } static inline void dmabuf_page_pool_free(struct dmabuf_page_pool *pool, struct page *page) { } static inline struct page ** dmabuf_page_pool_alloc_pages_array(struct dmabuf_page_pool *pool, int npages) { return NULL; } static inline void dmabuf_page_pool_free_pages_array(struct dmabuf_page_pool *pool, struct page **pages, int npages) { } #endif #endif