blob: f60b26ba89dfbc22182a1084c7b796d6bddbc042 [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef __AMLOGIC_CMA_H__
#define __AMLOGIC_CMA_H__
#ifdef CONFIG_AMLOGIC_CMA
#define GFP_NO_CMA (__GFP_NO_CMA | __GFP_WRITE)
static inline bool cma_forbidden_mask(gfp_t gfp_flags)
{
if ((gfp_flags & GFP_NO_CMA) || !(gfp_flags & __GFP_MOVABLE))
return true;
return false;
}
#endif
/* the highest bit of total_migrate_scanned in struct compact_control */
#define FORBID_TO_CMA_BIT 63
#ifdef CONFIG_AMLOGIC_CMA_DIS
extern unsigned long ion_cma_allocated;
#endif
extern int cma_debug_level;
void cma_page_count_update(long size);
void aml_cma_alloc_pre_hook(int *dummy, int count, unsigned long *tick);
void aml_cma_alloc_post_hook(int *dummy, int count, struct page *page,
unsigned long tick, int ret);
void aml_cma_release_hook(int a, struct page *p);
struct page *get_cma_page(struct zone *zone, unsigned int order);
unsigned long compact_to_free_cma(struct zone *zone);
bool can_use_cma(gfp_t gfp_flags);
bool cma_page(struct page *page);
unsigned long get_cma_allocated(void);
unsigned long get_total_cmapages(void);
int aml_cma_alloc_range(unsigned long start, unsigned long end,
unsigned int migrate_type, gfp_t gfp_mask);
void check_cma_isolated(unsigned long *isolate,
unsigned long active, unsigned long inactive);
void cma_keep_high_active(struct page *page, struct list_head *high,
struct list_head *clean);
void update_gfp_flags(gfp_t *gfp);
void check_water_mark(long free_pages, unsigned long mark);
struct compact_control;
void check_page_to_cma(struct compact_control *cc, struct page *page);
struct page *get_compact_page(struct page *migratepage,
struct compact_control *cc);
void aml_cma_free(unsigned long pfn, unsigned int nr_pages, int update);
void show_page(struct page *page);
struct page *compaction_cma_alloc(struct page *migratepage,
unsigned long data,
int **result);
/* for cma area serror */
int cma_mmu_op(struct page *page, int count, bool set);
int setup_cma_full_pagemap(unsigned long pfn, unsigned long count);
/* check page in cma allocating process */
int in_cma_allocating(struct page *page);
#define cma_debug(l, p, format, args...) \
{ \
if ((l) < cma_debug_level) { \
show_page(p); \
pr_info("%s,%d " format, __func__, __LINE__, ##args); \
} \
}
#endif /* __AMLOGIC_CMA_H__ */