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