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