#ifndef _LINUX_RBIN_REGION_H #define _LINUX_RBIN_REGION_H #include #include #include #include #include #include #define E_NOREGION 55 // returned when region is disabled struct rr_handle { int pool_id; /* Pool index : corresponds to filesystem */ int rb_index; /* Redblack tree index: value equals inode number */ int ra_index; /* Radix tree index : value equals page->index */ int usage; /* indicates current usage of corresponding page */ struct list_head lru; /* use lru of struct page instead */ }; enum usage { RC_FREED, RC_INUSE, ION_FREED, ION_INUSE, }; struct region_ops { void (*evict)(unsigned long handle); }; struct rbin_region { struct zone *zone; unsigned long start_pfn; unsigned long end_pfn; struct rr_handle *handles; struct list_head freelist; /* protected by lru_lock. handle->lru */ struct list_head usedlist; /* protected by lru_lock. handle->lru */ const struct region_ops *ops; spinlock_t lru_lock; spinlock_t region_lock; struct gen_pool *pool; int ion_inflight; int rc_inflight; bool rc_disabled; unsigned long timeout; /* timeout for rbincache enable */ }; /* rbin region api's */ #define ZERO_HANDLE ((void *)~(~0UL >> 1)) struct rr_handle *region_store_cache(struct page *page, int pool_id, int rb_index, int ra_index); int region_load_cache(struct rr_handle *handle, struct page *page, int pool_id, int rb_index, int ra_index); int region_flush_cache(struct rr_handle *handle); bool try_get_rbincache(void); void put_rbincache(void); void init_region(unsigned long pfn, unsigned long nr_pages, const struct region_ops *ops); /* rbin region api's end */ /* helper function declaration */ struct rr_handle *pfn_to_handle(unsigned long pfn); struct rr_handle *page_to_handle(struct page *page); struct page *handle_to_page(struct rr_handle *handle); bool handle_is_valid(struct rr_handle *handle); /* helper function declaration end */ /* ion_rbin_heap apis */ phys_addr_t ion_rbin_allocate(unsigned long size); void ion_rbin_free(phys_addr_t addr, unsigned long size); int init_rbinregion(unsigned long base, unsigned long size); /* ion_rbin_heap apis end */ #endif /* _LINUX_RBIN_REGION_H*/