1aa04b4ccSPaul Mackerras /* 2aa04b4ccSPaul Mackerras * Copyright 2011 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com> 3aa04b4ccSPaul Mackerras * 4aa04b4ccSPaul Mackerras * This program is free software; you can redistribute it and/or modify 5aa04b4ccSPaul Mackerras * it under the terms of the GNU General Public License, version 2, as 6aa04b4ccSPaul Mackerras * published by the Free Software Foundation. 7aa04b4ccSPaul Mackerras */ 8aa04b4ccSPaul Mackerras 9aa04b4ccSPaul Mackerras #include <linux/kvm_host.h> 10aa04b4ccSPaul Mackerras #include <linux/preempt.h> 1166b15db6SPaul Gortmaker #include <linux/export.h> 12aa04b4ccSPaul Mackerras #include <linux/sched.h> 13aa04b4ccSPaul Mackerras #include <linux/spinlock.h> 14aa04b4ccSPaul Mackerras #include <linux/bootmem.h> 15aa04b4ccSPaul Mackerras #include <linux/init.h> 16aa04b4ccSPaul Mackerras 17aa04b4ccSPaul Mackerras #include <asm/cputable.h> 18aa04b4ccSPaul Mackerras #include <asm/kvm_ppc.h> 19aa04b4ccSPaul Mackerras #include <asm/kvm_book3s.h> 20aa04b4ccSPaul Mackerras 21aa04b4ccSPaul Mackerras /* 22aa04b4ccSPaul Mackerras * This maintains a list of RMAs (real mode areas) for KVM guests to use. 23aa04b4ccSPaul Mackerras * Each RMA has to be physically contiguous and of a size that the 24aa04b4ccSPaul Mackerras * hardware supports. PPC970 and POWER7 support 64MB, 128MB and 256MB, 25aa04b4ccSPaul Mackerras * and other larger sizes. Since we are unlikely to be allocate that 26aa04b4ccSPaul Mackerras * much physically contiguous memory after the system is up and running, 27aa04b4ccSPaul Mackerras * we preallocate a set of RMAs in early boot for KVM to use. 28aa04b4ccSPaul Mackerras */ 29aa04b4ccSPaul Mackerras static unsigned long kvm_rma_size = 64 << 20; /* 64MB */ 30aa04b4ccSPaul Mackerras static unsigned long kvm_rma_count; 31aa04b4ccSPaul Mackerras 32aa04b4ccSPaul Mackerras static int __init early_parse_rma_size(char *p) 33aa04b4ccSPaul Mackerras { 34aa04b4ccSPaul Mackerras if (!p) 35aa04b4ccSPaul Mackerras return 1; 36aa04b4ccSPaul Mackerras 37aa04b4ccSPaul Mackerras kvm_rma_size = memparse(p, &p); 38aa04b4ccSPaul Mackerras 39aa04b4ccSPaul Mackerras return 0; 40aa04b4ccSPaul Mackerras } 41aa04b4ccSPaul Mackerras early_param("kvm_rma_size", early_parse_rma_size); 42aa04b4ccSPaul Mackerras 43aa04b4ccSPaul Mackerras static int __init early_parse_rma_count(char *p) 44aa04b4ccSPaul Mackerras { 45aa04b4ccSPaul Mackerras if (!p) 46aa04b4ccSPaul Mackerras return 1; 47aa04b4ccSPaul Mackerras 48aa04b4ccSPaul Mackerras kvm_rma_count = simple_strtoul(p, NULL, 0); 49aa04b4ccSPaul Mackerras 50aa04b4ccSPaul Mackerras return 0; 51aa04b4ccSPaul Mackerras } 52aa04b4ccSPaul Mackerras early_param("kvm_rma_count", early_parse_rma_count); 53aa04b4ccSPaul Mackerras 54aa04b4ccSPaul Mackerras static struct kvmppc_rma_info *rma_info; 55aa04b4ccSPaul Mackerras static LIST_HEAD(free_rmas); 56aa04b4ccSPaul Mackerras static DEFINE_SPINLOCK(rma_lock); 57aa04b4ccSPaul Mackerras 58aa04b4ccSPaul Mackerras /* Work out RMLS (real mode limit selector) field value for a given RMA size. 599e368f29SPaul Mackerras Assumes POWER7 or PPC970. */ 60aa04b4ccSPaul Mackerras static inline int lpcr_rmls(unsigned long rma_size) 61aa04b4ccSPaul Mackerras { 62aa04b4ccSPaul Mackerras switch (rma_size) { 63aa04b4ccSPaul Mackerras case 32ul << 20: /* 32 MB */ 649e368f29SPaul Mackerras if (cpu_has_feature(CPU_FTR_ARCH_206)) 659e368f29SPaul Mackerras return 8; /* only supported on POWER7 */ 669e368f29SPaul Mackerras return -1; 67aa04b4ccSPaul Mackerras case 64ul << 20: /* 64 MB */ 68aa04b4ccSPaul Mackerras return 3; 69aa04b4ccSPaul Mackerras case 128ul << 20: /* 128 MB */ 70aa04b4ccSPaul Mackerras return 7; 71aa04b4ccSPaul Mackerras case 256ul << 20: /* 256 MB */ 72aa04b4ccSPaul Mackerras return 4; 73aa04b4ccSPaul Mackerras case 1ul << 30: /* 1 GB */ 74aa04b4ccSPaul Mackerras return 2; 75aa04b4ccSPaul Mackerras case 16ul << 30: /* 16 GB */ 76aa04b4ccSPaul Mackerras return 1; 77aa04b4ccSPaul Mackerras case 256ul << 30: /* 256 GB */ 78aa04b4ccSPaul Mackerras return 0; 79aa04b4ccSPaul Mackerras default: 80aa04b4ccSPaul Mackerras return -1; 81aa04b4ccSPaul Mackerras } 82aa04b4ccSPaul Mackerras } 83aa04b4ccSPaul Mackerras 84aa04b4ccSPaul Mackerras /* 85aa04b4ccSPaul Mackerras * Called at boot time while the bootmem allocator is active, 86aa04b4ccSPaul Mackerras * to allocate contiguous physical memory for the real memory 87aa04b4ccSPaul Mackerras * areas for guests. 88aa04b4ccSPaul Mackerras */ 89aa04b4ccSPaul Mackerras void kvm_rma_init(void) 90aa04b4ccSPaul Mackerras { 91aa04b4ccSPaul Mackerras unsigned long i; 92aa04b4ccSPaul Mackerras unsigned long j, npages; 93aa04b4ccSPaul Mackerras void *rma; 94aa04b4ccSPaul Mackerras struct page *pg; 95aa04b4ccSPaul Mackerras 969e368f29SPaul Mackerras /* Only do this on PPC970 in HV mode */ 979e368f29SPaul Mackerras if (!cpu_has_feature(CPU_FTR_HVMODE) || 989e368f29SPaul Mackerras !cpu_has_feature(CPU_FTR_ARCH_201)) 99aa04b4ccSPaul Mackerras return; 100aa04b4ccSPaul Mackerras 101aa04b4ccSPaul Mackerras if (!kvm_rma_size || !kvm_rma_count) 102aa04b4ccSPaul Mackerras return; 103aa04b4ccSPaul Mackerras 104aa04b4ccSPaul Mackerras /* Check that the requested size is one supported in hardware */ 105aa04b4ccSPaul Mackerras if (lpcr_rmls(kvm_rma_size) < 0) { 106aa04b4ccSPaul Mackerras pr_err("RMA size of 0x%lx not supported\n", kvm_rma_size); 107aa04b4ccSPaul Mackerras return; 108aa04b4ccSPaul Mackerras } 109aa04b4ccSPaul Mackerras 110aa04b4ccSPaul Mackerras npages = kvm_rma_size >> PAGE_SHIFT; 111aa04b4ccSPaul Mackerras rma_info = alloc_bootmem(kvm_rma_count * sizeof(struct kvmppc_rma_info)); 112aa04b4ccSPaul Mackerras for (i = 0; i < kvm_rma_count; ++i) { 113aa04b4ccSPaul Mackerras rma = alloc_bootmem_align(kvm_rma_size, kvm_rma_size); 114aa04b4ccSPaul Mackerras pr_info("Allocated KVM RMA at %p (%ld MB)\n", rma, 115aa04b4ccSPaul Mackerras kvm_rma_size >> 20); 116aa04b4ccSPaul Mackerras rma_info[i].base_virt = rma; 117aa04b4ccSPaul Mackerras rma_info[i].base_pfn = __pa(rma) >> PAGE_SHIFT; 118aa04b4ccSPaul Mackerras rma_info[i].npages = npages; 119aa04b4ccSPaul Mackerras list_add_tail(&rma_info[i].list, &free_rmas); 120aa04b4ccSPaul Mackerras atomic_set(&rma_info[i].use_count, 0); 121aa04b4ccSPaul Mackerras 122aa04b4ccSPaul Mackerras pg = pfn_to_page(rma_info[i].base_pfn); 123aa04b4ccSPaul Mackerras for (j = 0; j < npages; ++j) { 124aa04b4ccSPaul Mackerras atomic_inc(&pg->_count); 125aa04b4ccSPaul Mackerras ++pg; 126aa04b4ccSPaul Mackerras } 127aa04b4ccSPaul Mackerras } 128aa04b4ccSPaul Mackerras } 129aa04b4ccSPaul Mackerras 130aa04b4ccSPaul Mackerras struct kvmppc_rma_info *kvm_alloc_rma(void) 131aa04b4ccSPaul Mackerras { 132aa04b4ccSPaul Mackerras struct kvmppc_rma_info *ri; 133aa04b4ccSPaul Mackerras 134aa04b4ccSPaul Mackerras ri = NULL; 135aa04b4ccSPaul Mackerras spin_lock(&rma_lock); 136aa04b4ccSPaul Mackerras if (!list_empty(&free_rmas)) { 137aa04b4ccSPaul Mackerras ri = list_first_entry(&free_rmas, struct kvmppc_rma_info, list); 138aa04b4ccSPaul Mackerras list_del(&ri->list); 139aa04b4ccSPaul Mackerras atomic_inc(&ri->use_count); 140aa04b4ccSPaul Mackerras } 141aa04b4ccSPaul Mackerras spin_unlock(&rma_lock); 142aa04b4ccSPaul Mackerras return ri; 143aa04b4ccSPaul Mackerras } 144aa04b4ccSPaul Mackerras EXPORT_SYMBOL_GPL(kvm_alloc_rma); 145aa04b4ccSPaul Mackerras 146aa04b4ccSPaul Mackerras void kvm_release_rma(struct kvmppc_rma_info *ri) 147aa04b4ccSPaul Mackerras { 148aa04b4ccSPaul Mackerras if (atomic_dec_and_test(&ri->use_count)) { 149aa04b4ccSPaul Mackerras spin_lock(&rma_lock); 150aa04b4ccSPaul Mackerras list_add_tail(&ri->list, &free_rmas); 151aa04b4ccSPaul Mackerras spin_unlock(&rma_lock); 152aa04b4ccSPaul Mackerras 153aa04b4ccSPaul Mackerras } 154aa04b4ccSPaul Mackerras } 155aa04b4ccSPaul Mackerras EXPORT_SYMBOL_GPL(kvm_release_rma); 156aa04b4ccSPaul Mackerras 157