1e7596040SQuentin Perret // SPDX-License-Identifier: GPL-2.0-only 2e7596040SQuentin Perret /* 3e7596040SQuentin Perret * Copyright (C) 2020 Google LLC 4e7596040SQuentin Perret * Author: Quentin Perret <qperret@google.com> 5e7596040SQuentin Perret */ 6e7596040SQuentin Perret 7e7596040SQuentin Perret #include <asm/kvm_pgtable.h> 8e7596040SQuentin Perret 9e7596040SQuentin Perret #include <nvhe/early_alloc.h> 10e7596040SQuentin Perret #include <nvhe/memory.h> 11e7596040SQuentin Perret 12e7596040SQuentin Perret struct kvm_pgtable_mm_ops hyp_early_alloc_mm_ops; 13e7596040SQuentin Perret s64 __ro_after_init hyp_physvirt_offset; 14e7596040SQuentin Perret 15e7596040SQuentin Perret static unsigned long base; 16e7596040SQuentin Perret static unsigned long end; 17e7596040SQuentin Perret static unsigned long cur; 18e7596040SQuentin Perret hyp_early_alloc_nr_used_pages(void)19e7596040SQuentin Perretunsigned long hyp_early_alloc_nr_used_pages(void) 20e7596040SQuentin Perret { 21e7596040SQuentin Perret return (cur - base) >> PAGE_SHIFT; 22e7596040SQuentin Perret } 23e7596040SQuentin Perret hyp_early_alloc_contig(unsigned int nr_pages)24e7596040SQuentin Perretvoid *hyp_early_alloc_contig(unsigned int nr_pages) 25e7596040SQuentin Perret { 26e7596040SQuentin Perret unsigned long size = (nr_pages << PAGE_SHIFT); 27e7596040SQuentin Perret void *ret = (void *)cur; 28e7596040SQuentin Perret 29e7596040SQuentin Perret if (!nr_pages) 30e7596040SQuentin Perret return NULL; 31e7596040SQuentin Perret 32e7596040SQuentin Perret if (end - cur < size) 33e7596040SQuentin Perret return NULL; 34e7596040SQuentin Perret 35e7596040SQuentin Perret cur += size; 36e7596040SQuentin Perret memset(ret, 0, size); 37e7596040SQuentin Perret 38e7596040SQuentin Perret return ret; 39e7596040SQuentin Perret } 40e7596040SQuentin Perret hyp_early_alloc_page(void * arg)41e7596040SQuentin Perretvoid *hyp_early_alloc_page(void *arg) 42e7596040SQuentin Perret { 43e7596040SQuentin Perret return hyp_early_alloc_contig(1); 44e7596040SQuentin Perret } 45e7596040SQuentin Perret hyp_early_alloc_get_page(void * addr)46*1fac3cfbSQuentin Perretstatic void hyp_early_alloc_get_page(void *addr) { } hyp_early_alloc_put_page(void * addr)47*1fac3cfbSQuentin Perretstatic void hyp_early_alloc_put_page(void *addr) { } 48*1fac3cfbSQuentin Perret hyp_early_alloc_init(void * virt,unsigned long size)49e7596040SQuentin Perretvoid hyp_early_alloc_init(void *virt, unsigned long size) 50e7596040SQuentin Perret { 51e7596040SQuentin Perret base = cur = (unsigned long)virt; 52e7596040SQuentin Perret end = base + size; 53e7596040SQuentin Perret 54e7596040SQuentin Perret hyp_early_alloc_mm_ops.zalloc_page = hyp_early_alloc_page; 55e7596040SQuentin Perret hyp_early_alloc_mm_ops.phys_to_virt = hyp_phys_to_virt; 56e7596040SQuentin Perret hyp_early_alloc_mm_ops.virt_to_phys = hyp_virt_to_phys; 57*1fac3cfbSQuentin Perret hyp_early_alloc_mm_ops.get_page = hyp_early_alloc_get_page; 58*1fac3cfbSQuentin Perret hyp_early_alloc_mm_ops.put_page = hyp_early_alloc_put_page; 59e7596040SQuentin Perret } 60