/* * Support for Medifield PNW Camera Imaging ISP subsystem. * * Copyright (c) 2010 Intel Corporation. All Rights Reserved. * * Copyright (c) 2010 Silicon Hive www.siliconhive.com. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * */ #ifndef __HMM_POOL_H__ #define __HMM_POOL_H__ #include #include #include #include #include #include #include "hmm_common.h" #include "hmm/hmm_bo.h" #define ALLOC_PAGE_FAIL_NUM 5 enum hmm_pool_type { HMM_POOL_TYPE_RESERVED, HMM_POOL_TYPE_DYNAMIC, }; /** * struct hmm_pool_ops - memory pool callbacks. * * @pool_init: initialize the memory pool. * @pool_exit: uninitialize the memory pool. * @pool_alloc_pages: allocate pages from memory pool. * @pool_free_pages: free pages to memory pool. * @pool_inited: check whether memory pool is initialized. */ struct hmm_pool_ops { int (*pool_init)(void **pool, unsigned int pool_size); void (*pool_exit)(void **pool); unsigned int (*pool_alloc_pages)(void *pool, struct hmm_page_object *page_obj, unsigned int size, bool cached); void (*pool_free_pages)(void *pool, struct hmm_page_object *page_obj); int (*pool_inited)(void *pool); }; struct hmm_pool { struct hmm_pool_ops *pops; void *pool_info; }; /** * struct hmm_reserved_pool_info - represents reserved pool private data. * @pages: a array that store physical pages. * The array is as reserved memory pool. * @index: to indicate the first blank page number * in reserved memory pool(pages array). * @pgnr: the valid page amount in reserved memory * pool. * @list_lock: list lock is used to protect the operation * to reserved memory pool. * @flag: reserved memory pool state flag. */ struct hmm_reserved_pool_info { struct page **pages; unsigned int index; unsigned int pgnr; spinlock_t list_lock; bool initialized; }; /** * struct hmm_dynamic_pool_info - represents dynamic pool private data. * @pages_list: a list that store physical pages. * The pages list is as dynamic memory pool. * @list_lock: list lock is used to protect the operation * to dynamic memory pool. * @flag: dynamic memory pool state flag. * @pgptr_cache: struct kmem_cache, manages a cache. */ struct hmm_dynamic_pool_info { struct list_head pages_list; /* list lock is used to protect the free pages block lists */ spinlock_t list_lock; struct kmem_cache *pgptr_cache; bool initialized; unsigned int pool_size; unsigned int pgnr; }; struct hmm_page { struct page *page; struct list_head list; }; extern struct hmm_pool_ops reserved_pops; extern struct hmm_pool_ops dynamic_pops; #endif