123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /*
- * Copyright (c) 2016-2017,2019,2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
- */
- #ifndef __KGSL_POOL_H
- #define __KGSL_POOL_H
- #ifdef CONFIG_QCOM_KGSL_USE_SHMEM
- static inline void kgsl_probe_page_pools(void) { }
- static inline void kgsl_exit_page_pools(void) { }
- static inline u32 kgsl_get_page_size(size_t size, unsigned int align)
- {
- u32 page_size;
- for (page_size = rounddown_pow_of_two(size); page_size > PAGE_SIZE; page_size >>= 1)
- if ((align >= ilog2(page_size)) && (size >= page_size))
- return page_size;
- return PAGE_SIZE;
- }
- static inline int kgsl_pool_page_count_get(void *data, u64 *val)
- {
- return 0;
- }
- static inline int kgsl_pool_reserved_get(void *data, u64 *val)
- {
- return 0;
- }
- static inline int kgsl_pool_size_total(void)
- {
- return 0;
- }
- #else
- /**
- * kgsl_pool_free_page - Frees the page and adds it back to pool/system memory
- * @page: Pointer to page struct that needs to be freed
- */
- void kgsl_pool_free_page(struct page *page);
- /**
- * kgsl_get_page_size - Get supported pagesize
- * @size: Size of the page
- * @align: Desired alignment of the size
- *
- * Return largest available page size from pools that can be used to meet
- * given size and alignment requirements
- */
- u32 kgsl_get_page_size(size_t size, unsigned int align);
- /**
- * kgsl_pool_alloc_page - Allocate a page of requested size
- * @page_size: Size of the page to be allocated
- * @pages: pointer to hold list of pages, should be big enough to hold
- * requested page
- * @len: Length of array pages
- *
- * Return total page count on success and negative value on failure
- */
- int kgsl_pool_alloc_page(int *page_size, struct page **pages,
- unsigned int pages_len, unsigned int *align,
- struct device *dev);
- /**
- * kgsl_pool_free_pages - Free pages in an pages array
- * @pages: pointer to an array of page structs
- * @page_count: Number of entries in @pages
- *
- * Free the pages by collapsing any physical adjacent pages.
- * Pages are added back to the pool, if pool has sufficient space
- * otherwise they are given back to system.
- */
- void kgsl_pool_free_pages(struct page **pages, unsigned int page_count);
- /* Debugfs node functions */
- int kgsl_pool_reserved_get(void *data, u64 *val);
- int kgsl_pool_page_count_get(void *data, u64 *val);
- /**
- * kgsl_pool_size_total - Return the number of pages in all kgsl page pools
- */
- int kgsl_pool_size_total(void);
- /**
- * kgsl_probe_page_pools - Initialize the memory pools
- */
- void kgsl_probe_page_pools(void);
- /**
- * kgsl_exit_page_pools - Free outstanding pooled memory
- */
- void kgsl_exit_page_pools(void);
- #endif
- #endif /* __KGSL_POOL_H */
|