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, unsigned int order);
503d0407baSopenharmony_civoid dmabuf_page_pool_destroy(struct dmabuf_page_pool *pool);
513d0407baSopenharmony_cistruct page *dmabuf_page_pool_alloc(struct dmabuf_page_pool *pool);
523d0407baSopenharmony_civoid dmabuf_page_pool_free(struct dmabuf_page_pool *pool, struct page *page);
533d0407baSopenharmony_ci
543d0407baSopenharmony_ci#endif /* _DMABUF_PAGE_POOL_H */
55