blob: 6b4ff26a05debdf11ee66673a7d40ad1e401fd52 [file] [log] [blame]
#ifndef _LINUX_RBIN_REGION_H
#define _LINUX_RBIN_REGION_H
#include <linux/atomic.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/genalloc.h>
#include <linux/highmem.h>
#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 */
#define ION_RBIN_ALLOCATE_FAIL -1
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*/