xref: /linux/arch/powerpc/platforms/pseries/lpar.c (revision 858259cf7d1c443c836a2022b78cb281f0a9b95e)
1 /*
2  * pSeries_lpar.c
3  * Copyright (C) 2001 Todd Inglett, IBM Corporation
4  *
5  * pSeries LPAR support.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20  */
21 
22 #undef DEBUG_LOW
23 
24 #include <linux/config.h>
25 #include <linux/kernel.h>
26 #include <linux/dma-mapping.h>
27 #include <asm/processor.h>
28 #include <asm/mmu.h>
29 #include <asm/page.h>
30 #include <asm/pgtable.h>
31 #include <asm/machdep.h>
32 #include <asm/abs_addr.h>
33 #include <asm/mmu_context.h>
34 #include <asm/ppcdebug.h>
35 #include <asm/iommu.h>
36 #include <asm/tlbflush.h>
37 #include <asm/tlb.h>
38 #include <asm/prom.h>
39 #include <asm/abs_addr.h>
40 #include <asm/cputable.h>
41 
42 #include "plpar_wrappers.h"
43 
44 #ifdef DEBUG_LOW
45 #define DBG_LOW(fmt...) do { udbg_printf(fmt); } while(0)
46 #else
47 #define DBG_LOW(fmt...) do { } while(0)
48 #endif
49 
50 /* in pSeries_hvCall.S */
51 EXPORT_SYMBOL(plpar_hcall);
52 EXPORT_SYMBOL(plpar_hcall_4out);
53 EXPORT_SYMBOL(plpar_hcall_norets);
54 EXPORT_SYMBOL(plpar_hcall_8arg_2ret);
55 
56 extern void pSeries_find_serial_port(void);
57 
58 
59 int vtermno;	/* virtual terminal# for udbg  */
60 
61 #define __ALIGNED__ __attribute__((__aligned__(sizeof(long))))
62 static void udbg_hvsi_putc(unsigned char c)
63 {
64 	/* packet's seqno isn't used anyways */
65 	uint8_t packet[] __ALIGNED__ = { 0xff, 5, 0, 0, c };
66 	int rc;
67 
68 	if (c == '\n')
69 		udbg_hvsi_putc('\r');
70 
71 	do {
72 		rc = plpar_put_term_char(vtermno, sizeof(packet), packet);
73 	} while (rc == H_Busy);
74 }
75 
76 static long hvsi_udbg_buf_len;
77 static uint8_t hvsi_udbg_buf[256];
78 
79 static int udbg_hvsi_getc_poll(void)
80 {
81 	unsigned char ch;
82 	int rc, i;
83 
84 	if (hvsi_udbg_buf_len == 0) {
85 		rc = plpar_get_term_char(vtermno, &hvsi_udbg_buf_len, hvsi_udbg_buf);
86 		if (rc != H_Success || hvsi_udbg_buf[0] != 0xff) {
87 			/* bad read or non-data packet */
88 			hvsi_udbg_buf_len = 0;
89 		} else {
90 			/* remove the packet header */
91 			for (i = 4; i < hvsi_udbg_buf_len; i++)
92 				hvsi_udbg_buf[i-4] = hvsi_udbg_buf[i];
93 			hvsi_udbg_buf_len -= 4;
94 		}
95 	}
96 
97 	if (hvsi_udbg_buf_len <= 0 || hvsi_udbg_buf_len > 256) {
98 		/* no data ready */
99 		hvsi_udbg_buf_len = 0;
100 		return -1;
101 	}
102 
103 	ch = hvsi_udbg_buf[0];
104 	/* shift remaining data down */
105 	for (i = 1; i < hvsi_udbg_buf_len; i++) {
106 		hvsi_udbg_buf[i-1] = hvsi_udbg_buf[i];
107 	}
108 	hvsi_udbg_buf_len--;
109 
110 	return ch;
111 }
112 
113 static unsigned char udbg_hvsi_getc(void)
114 {
115 	int ch;
116 	for (;;) {
117 		ch = udbg_hvsi_getc_poll();
118 		if (ch == -1) {
119 			/* This shouldn't be needed...but... */
120 			volatile unsigned long delay;
121 			for (delay=0; delay < 2000000; delay++)
122 				;
123 		} else {
124 			return ch;
125 		}
126 	}
127 }
128 
129 static void udbg_putcLP(unsigned char c)
130 {
131 	char buf[16];
132 	unsigned long rc;
133 
134 	if (c == '\n')
135 		udbg_putcLP('\r');
136 
137 	buf[0] = c;
138 	do {
139 		rc = plpar_put_term_char(vtermno, 1, buf);
140 	} while(rc == H_Busy);
141 }
142 
143 /* Buffered chars getc */
144 static long inbuflen;
145 static long inbuf[2];	/* must be 2 longs */
146 
147 static int udbg_getc_pollLP(void)
148 {
149 	/* The interface is tricky because it may return up to 16 chars.
150 	 * We save them statically for future calls to udbg_getc().
151 	 */
152 	char ch, *buf = (char *)inbuf;
153 	int i;
154 	long rc;
155 	if (inbuflen == 0) {
156 		/* get some more chars. */
157 		inbuflen = 0;
158 		rc = plpar_get_term_char(vtermno, &inbuflen, buf);
159 		if (rc != H_Success)
160 			inbuflen = 0;	/* otherwise inbuflen is garbage */
161 	}
162 	if (inbuflen <= 0 || inbuflen > 16) {
163 		/* Catch error case as well as other oddities (corruption) */
164 		inbuflen = 0;
165 		return -1;
166 	}
167 	ch = buf[0];
168 	for (i = 1; i < inbuflen; i++)	/* shuffle them down. */
169 		buf[i-1] = buf[i];
170 	inbuflen--;
171 	return ch;
172 }
173 
174 static unsigned char udbg_getcLP(void)
175 {
176 	int ch;
177 	for (;;) {
178 		ch = udbg_getc_pollLP();
179 		if (ch == -1) {
180 			/* This shouldn't be needed...but... */
181 			volatile unsigned long delay;
182 			for (delay=0; delay < 2000000; delay++)
183 				;
184 		} else {
185 			return ch;
186 		}
187 	}
188 }
189 
190 /* call this from early_init() for a working debug console on
191  * vterm capable LPAR machines
192  */
193 void udbg_init_debug_lpar(void)
194 {
195 	vtermno = 0;
196 	udbg_putc = udbg_putcLP;
197 	udbg_getc = udbg_getcLP;
198 	udbg_getc_poll = udbg_getc_pollLP;
199 }
200 
201 /* returns 0 if couldn't find or use /chosen/stdout as console */
202 int find_udbg_vterm(void)
203 {
204 	struct device_node *stdout_node;
205 	u32 *termno;
206 	char *name;
207 	int found = 0;
208 
209 	/* find the boot console from /chosen/stdout */
210 	if (!of_chosen)
211 		return 0;
212 	name = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
213 	if (name == NULL)
214 		return 0;
215 	stdout_node = of_find_node_by_path(name);
216 	if (!stdout_node)
217 		return 0;
218 
219 	/* now we have the stdout node; figure out what type of device it is. */
220 	name = (char *)get_property(stdout_node, "name", NULL);
221 	if (!name) {
222 		printk(KERN_WARNING "stdout node missing 'name' property!\n");
223 		goto out;
224 	}
225 
226 	if (strncmp(name, "vty", 3) == 0) {
227 		if (device_is_compatible(stdout_node, "hvterm1")) {
228 			termno = (u32 *)get_property(stdout_node, "reg", NULL);
229 			if (termno) {
230 				vtermno = termno[0];
231 				udbg_putc = udbg_putcLP;
232 				udbg_getc = udbg_getcLP;
233 				udbg_getc_poll = udbg_getc_pollLP;
234 				found = 1;
235 			}
236 		} else if (device_is_compatible(stdout_node, "hvterm-protocol")) {
237 			termno = (u32 *)get_property(stdout_node, "reg", NULL);
238 			if (termno) {
239 				vtermno = termno[0];
240 				udbg_putc = udbg_hvsi_putc;
241 				udbg_getc = udbg_hvsi_getc;
242 				udbg_getc_poll = udbg_hvsi_getc_poll;
243 				found = 1;
244 			}
245 		}
246 	} else if (strncmp(name, "serial", 6)) {
247 		/* XXX fix ISA serial console */
248 		printk(KERN_WARNING "serial stdout on LPAR ('%s')! "
249 				"can't print udbg messages\n",
250 		       stdout_node->full_name);
251 	} else {
252 		printk(KERN_WARNING "don't know how to print to stdout '%s'\n",
253 		       stdout_node->full_name);
254 	}
255 
256 out:
257 	of_node_put(stdout_node);
258 	return found;
259 }
260 
261 void vpa_init(int cpu)
262 {
263 	int hwcpu = get_hard_smp_processor_id(cpu);
264 	unsigned long vpa = __pa(&paca[cpu].lppaca);
265 	long ret;
266 
267 	if (cpu_has_feature(CPU_FTR_ALTIVEC))
268 		paca[cpu].lppaca.vmxregs_in_use = 1;
269 
270 	ret = register_vpa(hwcpu, vpa);
271 
272 	if (ret)
273 		printk(KERN_ERR "WARNING: vpa_init: VPA registration for "
274 				"cpu %d (hw %d) of area %lx returns %ld\n",
275 				cpu, hwcpu, vpa, ret);
276 }
277 
278 long pSeries_lpar_hpte_insert(unsigned long hpte_group,
279  			      unsigned long va, unsigned long pa,
280  			      unsigned long rflags, unsigned long vflags,
281  			      int psize)
282 {
283 	unsigned long lpar_rc;
284 	unsigned long flags;
285 	unsigned long slot;
286 	unsigned long hpte_v, hpte_r;
287 	unsigned long dummy0, dummy1;
288 
289 	if (!(vflags & HPTE_V_BOLTED))
290 		DBG_LOW("hpte_insert(group=%lx, va=%016lx, pa=%016lx, "
291 			"rflags=%lx, vflags=%lx, psize=%d)\n",
292 		hpte_group, va, pa, rflags, vflags, psize);
293 
294  	hpte_v = hpte_encode_v(va, psize) | vflags | HPTE_V_VALID;
295 	hpte_r = hpte_encode_r(pa, psize) | rflags;
296 
297 	if (!(vflags & HPTE_V_BOLTED))
298 		DBG_LOW(" hpte_v=%016lx, hpte_r=%016lx\n", hpte_v, hpte_r);
299 
300 #if 1
301 	{
302 		int i;
303 		for (i=0;i<8;i++) {
304 			unsigned long w0, w1;
305 			plpar_pte_read(0, hpte_group, &w0, &w1);
306 			BUG_ON (HPTE_V_COMPARE(hpte_v, w0)
307 				&& (w0 & HPTE_V_VALID));
308 		}
309 	}
310 #endif
311 
312 	/* Now fill in the actual HPTE */
313 	/* Set CEC cookie to 0         */
314 	/* Zero page = 0               */
315 	/* I-cache Invalidate = 0      */
316 	/* I-cache synchronize = 0     */
317 	/* Exact = 0                   */
318 	flags = 0;
319 
320 	/* Make pHyp happy */
321 	if (rflags & (_PAGE_GUARDED|_PAGE_NO_CACHE))
322 		hpte_r &= ~_PAGE_COHERENT;
323 
324 	lpar_rc = plpar_hcall(H_ENTER, flags, hpte_group, hpte_v,
325 			      hpte_r, &slot, &dummy0, &dummy1);
326 	if (unlikely(lpar_rc == H_PTEG_Full)) {
327 		if (!(vflags & HPTE_V_BOLTED))
328 			DBG_LOW(" full\n");
329 		return -1;
330 	}
331 
332 	/*
333 	 * Since we try and ioremap PHBs we don't own, the pte insert
334 	 * will fail. However we must catch the failure in hash_page
335 	 * or we will loop forever, so return -2 in this case.
336 	 */
337 	if (unlikely(lpar_rc != H_Success)) {
338 		if (!(vflags & HPTE_V_BOLTED))
339 			DBG_LOW(" lpar err %d\n", lpar_rc);
340 		return -2;
341 	}
342 	if (!(vflags & HPTE_V_BOLTED))
343 		DBG_LOW(" -> slot: %d\n", slot & 7);
344 
345 	/* Because of iSeries, we have to pass down the secondary
346 	 * bucket bit here as well
347 	 */
348 	return (slot & 7) | (!!(vflags & HPTE_V_SECONDARY) << 3);
349 }
350 
351 static DEFINE_SPINLOCK(pSeries_lpar_tlbie_lock);
352 
353 static long pSeries_lpar_hpte_remove(unsigned long hpte_group)
354 {
355 	unsigned long slot_offset;
356 	unsigned long lpar_rc;
357 	int i;
358 	unsigned long dummy1, dummy2;
359 
360 	/* pick a random slot to start at */
361 	slot_offset = mftb() & 0x7;
362 
363 	for (i = 0; i < HPTES_PER_GROUP; i++) {
364 
365 		/* don't remove a bolted entry */
366 		lpar_rc = plpar_pte_remove(H_ANDCOND, hpte_group + slot_offset,
367 					   (0x1UL << 4), &dummy1, &dummy2);
368 		if (lpar_rc == H_Success)
369 			return i;
370 		BUG_ON(lpar_rc != H_Not_Found);
371 
372 		slot_offset++;
373 		slot_offset &= 0x7;
374 	}
375 
376 	return -1;
377 }
378 
379 static void pSeries_lpar_hptab_clear(void)
380 {
381 	unsigned long size_bytes = 1UL << ppc64_pft_size;
382 	unsigned long hpte_count = size_bytes >> 4;
383 	unsigned long dummy1, dummy2;
384 	int i;
385 
386 	/* TODO: Use bulk call */
387 	for (i = 0; i < hpte_count; i++)
388 		plpar_pte_remove(0, i, 0, &dummy1, &dummy2);
389 }
390 
391 /*
392  * NOTE: for updatepp ops we are fortunate that the linux "newpp" bits and
393  * the low 3 bits of flags happen to line up.  So no transform is needed.
394  * We can probably optimize here and assume the high bits of newpp are
395  * already zero.  For now I am paranoid.
396  */
397 static long pSeries_lpar_hpte_updatepp(unsigned long slot,
398 				       unsigned long newpp,
399 				       unsigned long va,
400 				       int psize, int local)
401 {
402 	unsigned long lpar_rc;
403 	unsigned long flags = (newpp & 7) | H_AVPN;
404 	unsigned long want_v;
405 
406 	want_v = hpte_encode_v(va, psize);
407 
408 	DBG_LOW("    update: avpnv=%016lx, hash=%016lx, f=%x, psize: %d ... ",
409 		want_v & HPTE_V_AVPN, slot, flags, psize);
410 
411 	lpar_rc = plpar_pte_protect(flags, slot, want_v & HPTE_V_AVPN);
412 
413 	if (lpar_rc == H_Not_Found) {
414 		DBG_LOW("not found !\n");
415 		return -1;
416 	}
417 
418 	DBG_LOW("ok\n");
419 
420 	BUG_ON(lpar_rc != H_Success);
421 
422 	return 0;
423 }
424 
425 static unsigned long pSeries_lpar_hpte_getword0(unsigned long slot)
426 {
427 	unsigned long dword0;
428 	unsigned long lpar_rc;
429 	unsigned long dummy_word1;
430 	unsigned long flags;
431 
432 	/* Read 1 pte at a time                        */
433 	/* Do not need RPN to logical page translation */
434 	/* No cross CEC PFT access                     */
435 	flags = 0;
436 
437 	lpar_rc = plpar_pte_read(flags, slot, &dword0, &dummy_word1);
438 
439 	BUG_ON(lpar_rc != H_Success);
440 
441 	return dword0;
442 }
443 
444 static long pSeries_lpar_hpte_find(unsigned long va, int psize)
445 {
446 	unsigned long hash;
447 	unsigned long i, j;
448 	long slot;
449 	unsigned long want_v, hpte_v;
450 
451 	hash = hpt_hash(va, mmu_psize_defs[psize].shift);
452 	want_v = hpte_encode_v(va, psize);
453 
454 	for (j = 0; j < 2; j++) {
455 		slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
456 		for (i = 0; i < HPTES_PER_GROUP; i++) {
457 			hpte_v = pSeries_lpar_hpte_getword0(slot);
458 
459 			if (HPTE_V_COMPARE(hpte_v, want_v)
460 			    && (hpte_v & HPTE_V_VALID)
461 			    && (!!(hpte_v & HPTE_V_SECONDARY) == j)) {
462 				/* HPTE matches */
463 				if (j)
464 					slot = -slot;
465 				return slot;
466 			}
467 			++slot;
468 		}
469 		hash = ~hash;
470 	}
471 
472 	return -1;
473 }
474 
475 static void pSeries_lpar_hpte_updateboltedpp(unsigned long newpp,
476 					     unsigned long ea,
477 					     int psize)
478 {
479 	unsigned long lpar_rc, slot, vsid, va, flags;
480 
481 	vsid = get_kernel_vsid(ea);
482 	va = (vsid << 28) | (ea & 0x0fffffff);
483 
484 	slot = pSeries_lpar_hpte_find(va, psize);
485 	BUG_ON(slot == -1);
486 
487 	flags = newpp & 7;
488 	lpar_rc = plpar_pte_protect(flags, slot, 0);
489 
490 	BUG_ON(lpar_rc != H_Success);
491 }
492 
493 static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
494 					 int psize, int local)
495 {
496 	unsigned long want_v;
497 	unsigned long lpar_rc;
498 	unsigned long dummy1, dummy2;
499 
500 	DBG_LOW("    inval : slot=%lx, va=%016lx, psize: %d, local: %d",
501 		slot, va, psize, local);
502 
503 	want_v = hpte_encode_v(va, psize);
504 	lpar_rc = plpar_pte_remove(H_AVPN, slot, want_v & HPTE_V_AVPN,
505 				   &dummy1, &dummy2);
506 	if (lpar_rc == H_Not_Found)
507 		return;
508 
509 	BUG_ON(lpar_rc != H_Success);
510 }
511 
512 /*
513  * Take a spinlock around flushes to avoid bouncing the hypervisor tlbie
514  * lock.
515  */
516 void pSeries_lpar_flush_hash_range(unsigned long number, int local)
517 {
518 	int i;
519 	unsigned long flags = 0;
520 	struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
521 	int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE);
522 
523 	if (lock_tlbie)
524 		spin_lock_irqsave(&pSeries_lpar_tlbie_lock, flags);
525 
526 	for (i = 0; i < number; i++)
527 		flush_hash_page(batch->vaddr[i], batch->pte[i],
528 				batch->psize, local);
529 
530 	if (lock_tlbie)
531 		spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags);
532 }
533 
534 void hpte_init_lpar(void)
535 {
536 	ppc_md.hpte_invalidate	= pSeries_lpar_hpte_invalidate;
537 	ppc_md.hpte_updatepp	= pSeries_lpar_hpte_updatepp;
538 	ppc_md.hpte_updateboltedpp = pSeries_lpar_hpte_updateboltedpp;
539 	ppc_md.hpte_insert	= pSeries_lpar_hpte_insert;
540 	ppc_md.hpte_remove	= pSeries_lpar_hpte_remove;
541 	ppc_md.flush_hash_range	= pSeries_lpar_flush_hash_range;
542 	ppc_md.hpte_clear_all   = pSeries_lpar_hptab_clear;
543 
544 	htab_finish_init();
545 }
546