13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * DMA BUF PagePool implementation
43d0407baSopenharmony_ci * Based on earlier ION code by Google
53d0407baSopenharmony_ci *
63d0407baSopenharmony_ci * Copyright (C) 2011 Google, Inc.
73d0407baSopenharmony_ci * Copyright (C) 2020 Linaro Ltd.
83d0407baSopenharmony_ci */
93d0407baSopenharmony_ci
103d0407baSopenharmony_ci#ifndef _DMABUF_PAGE_POOL_H
113d0407baSopenharmony_ci#define _DMABUF_PAGE_POOL_H
123d0407baSopenharmony_ci
133d0407baSopenharmony_ci#include <linux/device.h>
143d0407baSopenharmony_ci#include <linux/kref.h>
153d0407baSopenharmony_ci#include <linux/mm_types.h>
163d0407baSopenharmony_ci#include <linux/mutex.h>
173d0407baSopenharmony_ci#include <linux/shrinker.h>
183d0407baSopenharmony_ci#include <linux/types.h>
193d0407baSopenharmony_ci
203d0407baSopenharmony_ci/* page types we track in the pool */
213d0407baSopenharmony_cienum {
223d0407baSopenharmony_ci	POOL_LOWPAGE,      /* Clean lowmem pages */
233d0407baSopenharmony_ci	POOL_HIGHPAGE,     /* Clean highmem pages */
243d0407baSopenharmony_ci
253d0407baSopenharmony_ci	POOL_TYPE_SIZE,
263d0407baSopenharmony_ci};
273d0407baSopenharmony_ci
283d0407baSopenharmony_ci/**
293d0407baSopenharmony_ci * struct dmabuf_page_pool - pagepool struct
303d0407baSopenharmony_ci * @count[]:		array of number of pages of that type in the pool
313d0407baSopenharmony_ci * @items[]:		array of list of pages of the specific type
323d0407baSopenharmony_ci * @mutex:		lock protecting this struct and especially the count
333d0407baSopenharmony_ci *			item list
343d0407baSopenharmony_ci * @gfp_mask:		gfp_mask to use from alloc
353d0407baSopenharmony_ci * @order:		order of pages in the pool
363d0407baSopenharmony_ci * @list:		list node for list of pools
373d0407baSopenharmony_ci *
383d0407baSopenharmony_ci * Allows you to keep a pool of pre allocated pages to use
393d0407baSopenharmony_ci */
403d0407baSopenharmony_cistruct dmabuf_page_pool {
413d0407baSopenharmony_ci	int count[POOL_TYPE_SIZE];
423d0407baSopenharmony_ci	struct list_head items[POOL_TYPE_SIZE];
433d0407baSopenharmony_ci	struct mutex mutex;
443d0407baSopenharmony_ci	gfp_t gfp_mask;
453d0407baSopenharmony_ci	unsigned int order;
463d0407baSopenharmony_ci	struct list_head list;
473d0407baSopenharmony_ci};
483d0407baSopenharmony_ci
493d0407baSopenharmony_cistruct dmabuf_page_pool *dmabuf_page_pool_create(gfp_t gfp_mask,
503d0407baSopenharmony_ci						 unsigned int order);
513d0407baSopenharmony_civoid dmabuf_page_pool_destroy(struct dmabuf_page_pool *pool);
523d0407baSopenharmony_cistruct page *dmabuf_page_pool_alloc(struct dmabuf_page_pool *pool);
533d0407baSopenharmony_civoid dmabuf_page_pool_free(struct dmabuf_page_pool *pool, struct page *page);
543d0407baSopenharmony_ci
553d0407baSopenharmony_ci#endif /* _DMABUF_PAGE_POOL_H */
56