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 21b4e70611SAlexander Graf #define KVM_LINEAR_RMA 0 22d2a1b483SAlexander Graf #define KVM_LINEAR_HPT 1 23b4e70611SAlexander Graf 24b4e70611SAlexander Graf static void __init kvm_linear_init_one(ulong size, int count, int type); 25b4e70611SAlexander Graf static struct kvmppc_linear_info *kvm_alloc_linear(int type); 26b4e70611SAlexander Graf static void kvm_release_linear(struct kvmppc_linear_info *ri); 27b4e70611SAlexander Graf 28b4e70611SAlexander Graf /*************** RMA *************/ 29b4e70611SAlexander Graf 30aa04b4ccSPaul Mackerras /* 31aa04b4ccSPaul Mackerras * This maintains a list of RMAs (real mode areas) for KVM guests to use. 32aa04b4ccSPaul Mackerras * Each RMA has to be physically contiguous and of a size that the 33aa04b4ccSPaul Mackerras * hardware supports. PPC970 and POWER7 support 64MB, 128MB and 256MB, 34aa04b4ccSPaul Mackerras * and other larger sizes. Since we are unlikely to be allocate that 35aa04b4ccSPaul Mackerras * much physically contiguous memory after the system is up and running, 36aa04b4ccSPaul Mackerras * we preallocate a set of RMAs in early boot for KVM to use. 37aa04b4ccSPaul Mackerras */ 38aa04b4ccSPaul Mackerras static unsigned long kvm_rma_size = 64 << 20; /* 64MB */ 39aa04b4ccSPaul Mackerras static unsigned long kvm_rma_count; 40aa04b4ccSPaul Mackerras 41aa04b4ccSPaul Mackerras /* Work out RMLS (real mode limit selector) field value for a given RMA size. 429e368f29SPaul Mackerras Assumes POWER7 or PPC970. */ 43aa04b4ccSPaul Mackerras static inline int lpcr_rmls(unsigned long rma_size) 44aa04b4ccSPaul Mackerras { 45aa04b4ccSPaul Mackerras switch (rma_size) { 46aa04b4ccSPaul Mackerras case 32ul << 20: /* 32 MB */ 479e368f29SPaul Mackerras if (cpu_has_feature(CPU_FTR_ARCH_206)) 489e368f29SPaul Mackerras return 8; /* only supported on POWER7 */ 499e368f29SPaul Mackerras return -1; 50aa04b4ccSPaul Mackerras case 64ul << 20: /* 64 MB */ 51aa04b4ccSPaul Mackerras return 3; 52aa04b4ccSPaul Mackerras case 128ul << 20: /* 128 MB */ 53aa04b4ccSPaul Mackerras return 7; 54aa04b4ccSPaul Mackerras case 256ul << 20: /* 256 MB */ 55aa04b4ccSPaul Mackerras return 4; 56aa04b4ccSPaul Mackerras case 1ul << 30: /* 1 GB */ 57aa04b4ccSPaul Mackerras return 2; 58aa04b4ccSPaul Mackerras case 16ul << 30: /* 16 GB */ 59aa04b4ccSPaul Mackerras return 1; 60aa04b4ccSPaul Mackerras case 256ul << 30: /* 256 GB */ 61aa04b4ccSPaul Mackerras return 0; 62aa04b4ccSPaul Mackerras default: 63aa04b4ccSPaul Mackerras return -1; 64aa04b4ccSPaul Mackerras } 65aa04b4ccSPaul Mackerras } 66aa04b4ccSPaul Mackerras 67b4e70611SAlexander Graf static int __init early_parse_rma_size(char *p) 68b4e70611SAlexander Graf { 69b4e70611SAlexander Graf if (!p) 70b4e70611SAlexander Graf return 1; 71b4e70611SAlexander Graf 72b4e70611SAlexander Graf kvm_rma_size = memparse(p, &p); 73b4e70611SAlexander Graf 74b4e70611SAlexander Graf return 0; 75b4e70611SAlexander Graf } 76b4e70611SAlexander Graf early_param("kvm_rma_size", early_parse_rma_size); 77b4e70611SAlexander Graf 78b4e70611SAlexander Graf static int __init early_parse_rma_count(char *p) 79b4e70611SAlexander Graf { 80b4e70611SAlexander Graf if (!p) 81b4e70611SAlexander Graf return 1; 82b4e70611SAlexander Graf 83b4e70611SAlexander Graf kvm_rma_count = simple_strtoul(p, NULL, 0); 84b4e70611SAlexander Graf 85b4e70611SAlexander Graf return 0; 86b4e70611SAlexander Graf } 87b4e70611SAlexander Graf early_param("kvm_rma_count", early_parse_rma_count); 88b4e70611SAlexander Graf 89b4e70611SAlexander Graf struct kvmppc_linear_info *kvm_alloc_rma(void) 90b4e70611SAlexander Graf { 91b4e70611SAlexander Graf return kvm_alloc_linear(KVM_LINEAR_RMA); 92b4e70611SAlexander Graf } 93b4e70611SAlexander Graf EXPORT_SYMBOL_GPL(kvm_alloc_rma); 94b4e70611SAlexander Graf 95b4e70611SAlexander Graf void kvm_release_rma(struct kvmppc_linear_info *ri) 96b4e70611SAlexander Graf { 97b4e70611SAlexander Graf kvm_release_linear(ri); 98b4e70611SAlexander Graf } 99b4e70611SAlexander Graf EXPORT_SYMBOL_GPL(kvm_release_rma); 100b4e70611SAlexander Graf 101d2a1b483SAlexander Graf /*************** HPT *************/ 102d2a1b483SAlexander Graf 103d2a1b483SAlexander Graf /* 104d2a1b483SAlexander Graf * This maintains a list of big linear HPT tables that contain the GVA->HPA 105d2a1b483SAlexander Graf * memory mappings. If we don't reserve those early on, we might not be able 106d2a1b483SAlexander Graf * to get a big (usually 16MB) linear memory region from the kernel anymore. 107d2a1b483SAlexander Graf */ 108d2a1b483SAlexander Graf 109d2a1b483SAlexander Graf static unsigned long kvm_hpt_count; 110d2a1b483SAlexander Graf 111d2a1b483SAlexander Graf static int __init early_parse_hpt_count(char *p) 112d2a1b483SAlexander Graf { 113d2a1b483SAlexander Graf if (!p) 114d2a1b483SAlexander Graf return 1; 115d2a1b483SAlexander Graf 116d2a1b483SAlexander Graf kvm_hpt_count = simple_strtoul(p, NULL, 0); 117d2a1b483SAlexander Graf 118d2a1b483SAlexander Graf return 0; 119d2a1b483SAlexander Graf } 120d2a1b483SAlexander Graf early_param("kvm_hpt_count", early_parse_hpt_count); 121d2a1b483SAlexander Graf 122d2a1b483SAlexander Graf struct kvmppc_linear_info *kvm_alloc_hpt(void) 123d2a1b483SAlexander Graf { 124d2a1b483SAlexander Graf return kvm_alloc_linear(KVM_LINEAR_HPT); 125d2a1b483SAlexander Graf } 126d2a1b483SAlexander Graf EXPORT_SYMBOL_GPL(kvm_alloc_hpt); 127d2a1b483SAlexander Graf 128d2a1b483SAlexander Graf void kvm_release_hpt(struct kvmppc_linear_info *li) 129d2a1b483SAlexander Graf { 130d2a1b483SAlexander Graf kvm_release_linear(li); 131d2a1b483SAlexander Graf } 132d2a1b483SAlexander Graf EXPORT_SYMBOL_GPL(kvm_release_hpt); 133d2a1b483SAlexander Graf 134b4e70611SAlexander Graf /*************** generic *************/ 135b4e70611SAlexander Graf 136b4e70611SAlexander Graf static LIST_HEAD(free_linears); 137b4e70611SAlexander Graf static DEFINE_SPINLOCK(linear_lock); 138b4e70611SAlexander Graf 139b4e70611SAlexander Graf static void __init kvm_linear_init_one(ulong size, int count, int type) 140aa04b4ccSPaul Mackerras { 141aa04b4ccSPaul Mackerras unsigned long i; 142aa04b4ccSPaul Mackerras unsigned long j, npages; 143b4e70611SAlexander Graf void *linear; 144aa04b4ccSPaul Mackerras struct page *pg; 145b4e70611SAlexander Graf const char *typestr; 146b4e70611SAlexander Graf struct kvmppc_linear_info *linear_info; 147aa04b4ccSPaul Mackerras 148b4e70611SAlexander Graf if (!count) 149b4e70611SAlexander Graf return; 150b4e70611SAlexander Graf 151d2a1b483SAlexander Graf typestr = (type == KVM_LINEAR_RMA) ? "RMA" : "HPT"; 152b4e70611SAlexander Graf 153b4e70611SAlexander Graf npages = size >> PAGE_SHIFT; 154b4e70611SAlexander Graf linear_info = alloc_bootmem(count * sizeof(struct kvmppc_linear_info)); 155b4e70611SAlexander Graf for (i = 0; i < count; ++i) { 156b4e70611SAlexander Graf linear = alloc_bootmem_align(size, size); 157b4e70611SAlexander Graf pr_info("Allocated KVM %s at %p (%ld MB)\n", typestr, linear, 158b4e70611SAlexander Graf size >> 20); 159b4e70611SAlexander Graf linear_info[i].base_virt = linear; 160b4e70611SAlexander Graf linear_info[i].base_pfn = __pa(linear) >> PAGE_SHIFT; 161b4e70611SAlexander Graf linear_info[i].npages = npages; 162b4e70611SAlexander Graf linear_info[i].type = type; 163b4e70611SAlexander Graf list_add_tail(&linear_info[i].list, &free_linears); 164b4e70611SAlexander Graf atomic_set(&linear_info[i].use_count, 0); 165b4e70611SAlexander Graf 166b4e70611SAlexander Graf pg = pfn_to_page(linear_info[i].base_pfn); 167b4e70611SAlexander Graf for (j = 0; j < npages; ++j) { 168b4e70611SAlexander Graf atomic_inc(&pg->_count); 169b4e70611SAlexander Graf ++pg; 170b4e70611SAlexander Graf } 171b4e70611SAlexander Graf } 172b4e70611SAlexander Graf } 173b4e70611SAlexander Graf 174b4e70611SAlexander Graf static struct kvmppc_linear_info *kvm_alloc_linear(int type) 175b4e70611SAlexander Graf { 176b4e70611SAlexander Graf struct kvmppc_linear_info *ri; 177b4e70611SAlexander Graf 178b4e70611SAlexander Graf ri = NULL; 179b4e70611SAlexander Graf spin_lock(&linear_lock); 180b4e70611SAlexander Graf list_for_each_entry(ri, &free_linears, list) { 181b4e70611SAlexander Graf if (ri->type != type) 182b4e70611SAlexander Graf continue; 183b4e70611SAlexander Graf 184b4e70611SAlexander Graf list_del(&ri->list); 185b4e70611SAlexander Graf atomic_inc(&ri->use_count); 186b4e70611SAlexander Graf break; 187b4e70611SAlexander Graf } 188b4e70611SAlexander Graf spin_unlock(&linear_lock); 189b7f5d011SAlexander Graf memset(ri->base_virt, 0, ri->npages << PAGE_SHIFT); 190b4e70611SAlexander Graf return ri; 191b4e70611SAlexander Graf } 192b4e70611SAlexander Graf 193b4e70611SAlexander Graf static void kvm_release_linear(struct kvmppc_linear_info *ri) 194b4e70611SAlexander Graf { 195b4e70611SAlexander Graf if (atomic_dec_and_test(&ri->use_count)) { 196b4e70611SAlexander Graf spin_lock(&linear_lock); 197b4e70611SAlexander Graf list_add_tail(&ri->list, &free_linears); 198b4e70611SAlexander Graf spin_unlock(&linear_lock); 199b4e70611SAlexander Graf 200b4e70611SAlexander Graf } 201b4e70611SAlexander Graf } 202b4e70611SAlexander Graf 203b4e70611SAlexander Graf /* 204b4e70611SAlexander Graf * Called at boot time while the bootmem allocator is active, 205b4e70611SAlexander Graf * to allocate contiguous physical memory for the hash page 206b4e70611SAlexander Graf * tables for guests. 207b4e70611SAlexander Graf */ 208b4e70611SAlexander Graf void __init kvm_linear_init(void) 209b4e70611SAlexander Graf { 210d2a1b483SAlexander Graf /* HPT */ 211d2a1b483SAlexander Graf kvm_linear_init_one(1 << HPT_ORDER, kvm_hpt_count, KVM_LINEAR_HPT); 212d2a1b483SAlexander Graf 213b4e70611SAlexander Graf /* RMA */ 2149e368f29SPaul Mackerras /* Only do this on PPC970 in HV mode */ 2159e368f29SPaul Mackerras if (!cpu_has_feature(CPU_FTR_HVMODE) || 2169e368f29SPaul Mackerras !cpu_has_feature(CPU_FTR_ARCH_201)) 217aa04b4ccSPaul Mackerras return; 218aa04b4ccSPaul Mackerras 219aa04b4ccSPaul Mackerras if (!kvm_rma_size || !kvm_rma_count) 220aa04b4ccSPaul Mackerras return; 221aa04b4ccSPaul Mackerras 222aa04b4ccSPaul Mackerras /* Check that the requested size is one supported in hardware */ 223aa04b4ccSPaul Mackerras if (lpcr_rmls(kvm_rma_size) < 0) { 224aa04b4ccSPaul Mackerras pr_err("RMA size of 0x%lx not supported\n", kvm_rma_size); 225aa04b4ccSPaul Mackerras return; 226aa04b4ccSPaul Mackerras } 227aa04b4ccSPaul Mackerras 228b4e70611SAlexander Graf kvm_linear_init_one(kvm_rma_size, kvm_rma_count, KVM_LINEAR_RMA); 229aa04b4ccSPaul Mackerras } 230