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