book3s_hv_builtin.c 5.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/*
 * Copyright 2011 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License, version 2, as
 * published by the Free Software Foundation.
 */

#include <linux/kvm_host.h>
#include <linux/preempt.h>
11
#include <linux/export.h>
12 13 14 15 16 17 18 19 20
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/bootmem.h>
#include <linux/init.h>

#include <asm/cputable.h>
#include <asm/kvm_ppc.h>
#include <asm/kvm_book3s.h>

21
#define KVM_LINEAR_RMA		0
A
Alexander Graf 已提交
22
#define KVM_LINEAR_HPT		1
23 24 25 26 27

static void __init kvm_linear_init_one(ulong size, int count, int type);
static struct kvmppc_linear_info *kvm_alloc_linear(int type);
static void kvm_release_linear(struct kvmppc_linear_info *ri);

28 29 30
int kvm_hpt_order = KVM_DEFAULT_HPT_ORDER;
EXPORT_SYMBOL_GPL(kvm_hpt_order);

31 32
/*************** RMA *************/

33 34 35 36 37 38 39 40 41 42 43 44
/*
 * This maintains a list of RMAs (real mode areas) for KVM guests to use.
 * Each RMA has to be physically contiguous and of a size that the
 * hardware supports.  PPC970 and POWER7 support 64MB, 128MB and 256MB,
 * and other larger sizes.  Since we are unlikely to be allocate that
 * much physically contiguous memory after the system is up and running,
 * we preallocate a set of RMAs in early boot for KVM to use.
 */
static unsigned long kvm_rma_size = 64 << 20;	/* 64MB */
static unsigned long kvm_rma_count;

/* Work out RMLS (real mode limit selector) field value for a given RMA size.
45
   Assumes POWER7 or PPC970. */
46 47 48 49
static inline int lpcr_rmls(unsigned long rma_size)
{
	switch (rma_size) {
	case 32ul << 20:	/* 32 MB */
50 51 52
		if (cpu_has_feature(CPU_FTR_ARCH_206))
			return 8;	/* only supported on POWER7 */
		return -1;
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
	case 64ul << 20:	/* 64 MB */
		return 3;
	case 128ul << 20:	/* 128 MB */
		return 7;
	case 256ul << 20:	/* 256 MB */
		return 4;
	case 1ul << 30:		/* 1 GB */
		return 2;
	case 16ul << 30:	/* 16 GB */
		return 1;
	case 256ul << 30:	/* 256 GB */
		return 0;
	default:
		return -1;
	}
}

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
static int __init early_parse_rma_size(char *p)
{
	if (!p)
		return 1;

	kvm_rma_size = memparse(p, &p);

	return 0;
}
early_param("kvm_rma_size", early_parse_rma_size);

static int __init early_parse_rma_count(char *p)
{
	if (!p)
		return 1;

	kvm_rma_count = simple_strtoul(p, NULL, 0);

	return 0;
}
early_param("kvm_rma_count", early_parse_rma_count);

struct kvmppc_linear_info *kvm_alloc_rma(void)
{
	return kvm_alloc_linear(KVM_LINEAR_RMA);
}
EXPORT_SYMBOL_GPL(kvm_alloc_rma);

void kvm_release_rma(struct kvmppc_linear_info *ri)
{
	kvm_release_linear(ri);
}
EXPORT_SYMBOL_GPL(kvm_release_rma);

A
Alexander Graf 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/*************** HPT *************/

/*
 * This maintains a list of big linear HPT tables that contain the GVA->HPA
 * memory mappings. If we don't reserve those early on, we might not be able
 * to get a big (usually 16MB) linear memory region from the kernel anymore.
 */

static unsigned long kvm_hpt_count;

static int __init early_parse_hpt_count(char *p)
{
	if (!p)
		return 1;

	kvm_hpt_count = simple_strtoul(p, NULL, 0);

	return 0;
}
early_param("kvm_hpt_count", early_parse_hpt_count);

struct kvmppc_linear_info *kvm_alloc_hpt(void)
{
	return kvm_alloc_linear(KVM_LINEAR_HPT);
}
EXPORT_SYMBOL_GPL(kvm_alloc_hpt);

void kvm_release_hpt(struct kvmppc_linear_info *li)
{
	kvm_release_linear(li);
}
EXPORT_SYMBOL_GPL(kvm_release_hpt);

137 138 139 140 141 142
/*************** generic *************/

static LIST_HEAD(free_linears);
static DEFINE_SPINLOCK(linear_lock);

static void __init kvm_linear_init_one(ulong size, int count, int type)
143 144 145
{
	unsigned long i;
	unsigned long j, npages;
146
	void *linear;
147
	struct page *pg;
148 149
	const char *typestr;
	struct kvmppc_linear_info *linear_info;
150

151
	if (!count)
152 153
		return;

A
Alexander Graf 已提交
154
	typestr = (type == KVM_LINEAR_RMA) ? "RMA" : "HPT";
155 156 157 158 159

	npages = size >> PAGE_SHIFT;
	linear_info = alloc_bootmem(count * sizeof(struct kvmppc_linear_info));
	for (i = 0; i < count; ++i) {
		linear = alloc_bootmem_align(size, size);
160 161
		pr_debug("Allocated KVM %s at %p (%ld MB)\n", typestr, linear,
			 size >> 20);
162 163 164 165 166 167 168 169
		linear_info[i].base_virt = linear;
		linear_info[i].base_pfn = __pa(linear) >> PAGE_SHIFT;
		linear_info[i].npages = npages;
		linear_info[i].type = type;
		list_add_tail(&linear_info[i].list, &free_linears);
		atomic_set(&linear_info[i].use_count, 0);

		pg = pfn_to_page(linear_info[i].base_pfn);
170 171 172 173 174 175 176
		for (j = 0; j < npages; ++j) {
			atomic_inc(&pg->_count);
			++pg;
		}
	}
}

177
static struct kvmppc_linear_info *kvm_alloc_linear(int type)
178
{
179
	struct kvmppc_linear_info *ri, *ret;
180

181
	ret = NULL;
182 183 184 185 186
	spin_lock(&linear_lock);
	list_for_each_entry(ri, &free_linears, list) {
		if (ri->type != type)
			continue;

187 188
		list_del(&ri->list);
		atomic_inc(&ri->use_count);
189 190
		memset(ri->base_virt, 0, ri->npages << PAGE_SHIFT);
		ret = ri;
191
		break;
192
	}
193
	spin_unlock(&linear_lock);
194
	return ret;
195 196
}

197
static void kvm_release_linear(struct kvmppc_linear_info *ri)
198 199
{
	if (atomic_dec_and_test(&ri->use_count)) {
200 201 202
		spin_lock(&linear_lock);
		list_add_tail(&ri->list, &free_linears);
		spin_unlock(&linear_lock);
203 204 205 206

	}
}

207 208 209 210 211 212 213
/*
 * Called at boot time while the bootmem allocator is active,
 * to allocate contiguous physical memory for the hash page
 * tables for guests.
 */
void __init kvm_linear_init(void)
{
A
Alexander Graf 已提交
214
	/* HPT */
215
	kvm_linear_init_one(1 << kvm_hpt_order, kvm_hpt_count, KVM_LINEAR_HPT);
A
Alexander Graf 已提交
216

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
	/* RMA */
	/* Only do this on PPC970 in HV mode */
	if (!cpu_has_feature(CPU_FTR_HVMODE) ||
	    !cpu_has_feature(CPU_FTR_ARCH_201))
		return;

	if (!kvm_rma_size || !kvm_rma_count)
		return;

	/* Check that the requested size is one supported in hardware */
	if (lpcr_rmls(kvm_rma_size) < 0) {
		pr_err("RMA size of 0x%lx not supported\n", kvm_rma_size);
		return;
	}

	kvm_linear_init_one(kvm_rma_size, kvm_rma_count, KVM_LINEAR_RMA);
}