1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 #ifndef __KVM_HYP_GFP_H 3 #define __KVM_HYP_GFP_H 4 5 #include <linux/list.h> 6 7 #include <nvhe/memory.h> 8 #include <nvhe/spinlock.h> 9 10 #define HYP_NO_ORDER USHRT_MAX 11 12 struct hyp_pool { 13 /* 14 * Spinlock protecting concurrent changes to the memory pool as well as 15 * the struct hyp_page of the pool's pages until we have a proper atomic 16 * API at EL2. 17 */ 18 hyp_spinlock_t lock; 19 struct list_head free_area[MAX_ORDER + 1]; 20 phys_addr_t range_start; 21 phys_addr_t range_end; 22 unsigned short max_order; 23 }; 24 25 /* Allocation */ 26 void *hyp_alloc_pages(struct hyp_pool *pool, unsigned short order); 27 void hyp_split_page(struct hyp_page *page); 28 void hyp_get_page(struct hyp_pool *pool, void *addr); 29 void hyp_put_page(struct hyp_pool *pool, void *addr); 30 31 /* Used pages cannot be freed */ 32 int hyp_pool_init(struct hyp_pool *pool, u64 pfn, unsigned int nr_pages, 33 unsigned int reserved_pages); 34 #endif /* __KVM_HYP_GFP_H */ 35