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