diff options
-rw-r--r-- | arch/sparc64/kernel/tsb.S | 69 | ||||
-rw-r--r-- | arch/sparc64/lib/NGbzero.S | 1 | ||||
-rw-r--r-- | arch/sparc64/mm/tsb.c | 2 | ||||
-rw-r--r-- | include/asm-sparc64/mmu.h | 1 |
4 files changed, 72 insertions, 1 deletions
diff --git a/arch/sparc64/kernel/tsb.S b/arch/sparc64/kernel/tsb.S index 1b154c863628..118baea44f69 100644 --- a/arch/sparc64/kernel/tsb.S +++ b/arch/sparc64/kernel/tsb.S | |||
@@ -371,3 +371,72 @@ copy_tsb: /* %o0=old_tsb_base, %o1=old_tsb_size | |||
371 | retl | 371 | retl |
372 | TSB_MEMBAR | 372 | TSB_MEMBAR |
373 | .size copy_tsb, .-copy_tsb | 373 | .size copy_tsb, .-copy_tsb |
374 | |||
375 | /* Set the invalid bit in all TSB entries. */ | ||
376 | .align 32 | ||
377 | .globl tsb_init | ||
378 | .type tsb_init,#function | ||
379 | tsb_init: /* %o0 = TSB vaddr, %o1 = size in bytes */ | ||
380 | prefetch [%o0 + 0x000], #n_writes | ||
381 | mov 1, %g1 | ||
382 | prefetch [%o0 + 0x040], #n_writes | ||
383 | sllx %g1, TSB_TAG_INVALID_BIT, %g1 | ||
384 | prefetch [%o0 + 0x080], #n_writes | ||
385 | 1: prefetch [%o0 + 0x0c0], #n_writes | ||
386 | stx %g1, [%o0 + 0x00] | ||
387 | stx %g1, [%o0 + 0x10] | ||
388 | stx %g1, [%o0 + 0x20] | ||
389 | stx %g1, [%o0 + 0x30] | ||
390 | prefetch [%o0 + 0x100], #n_writes | ||
391 | stx %g1, [%o0 + 0x40] | ||
392 | stx %g1, [%o0 + 0x50] | ||
393 | stx %g1, [%o0 + 0x60] | ||
394 | stx %g1, [%o0 + 0x70] | ||
395 | prefetch [%o0 + 0x140], #n_writes | ||
396 | stx %g1, [%o0 + 0x80] | ||
397 | stx %g1, [%o0 + 0x90] | ||
398 | stx %g1, [%o0 + 0xa0] | ||
399 | stx %g1, [%o0 + 0xb0] | ||
400 | prefetch [%o0 + 0x180], #n_writes | ||
401 | stx %g1, [%o0 + 0xc0] | ||
402 | stx %g1, [%o0 + 0xd0] | ||
403 | stx %g1, [%o0 + 0xe0] | ||
404 | stx %g1, [%o0 + 0xf0] | ||
405 | subcc %o1, 0x100, %o1 | ||
406 | bne,pt %xcc, 1b | ||
407 | add %o0, 0x100, %o0 | ||
408 | retl | ||
409 | nop | ||
410 | nop | ||
411 | nop | ||
412 | .size tsb_init, .-tsb_init | ||
413 | |||
414 | .globl NGtsb_init | ||
415 | .type NGtsb_init,#function | ||
416 | NGtsb_init: | ||
417 | rd %asi, %g2 | ||
418 | mov 1, %g1 | ||
419 | wr %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi | ||
420 | sllx %g1, TSB_TAG_INVALID_BIT, %g1 | ||
421 | 1: stxa %g1, [%o0 + 0x00] %asi | ||
422 | stxa %g1, [%o0 + 0x10] %asi | ||
423 | stxa %g1, [%o0 + 0x20] %asi | ||
424 | stxa %g1, [%o0 + 0x30] %asi | ||
425 | stxa %g1, [%o0 + 0x40] %asi | ||
426 | stxa %g1, [%o0 + 0x50] %asi | ||
427 | stxa %g1, [%o0 + 0x60] %asi | ||
428 | stxa %g1, [%o0 + 0x70] %asi | ||
429 | stxa %g1, [%o0 + 0x80] %asi | ||
430 | stxa %g1, [%o0 + 0x90] %asi | ||
431 | stxa %g1, [%o0 + 0xa0] %asi | ||
432 | stxa %g1, [%o0 + 0xb0] %asi | ||
433 | stxa %g1, [%o0 + 0xc0] %asi | ||
434 | stxa %g1, [%o0 + 0xd0] %asi | ||
435 | stxa %g1, [%o0 + 0xe0] %asi | ||
436 | stxa %g1, [%o0 + 0xf0] %asi | ||
437 | subcc %o1, 0x100, %o1 | ||
438 | bne,pt %xcc, 1b | ||
439 | add %o0, 0x100, %o0 | ||
440 | retl | ||
441 | wr %g2, 0x0, %asi | ||
442 | .size NGtsb_init, .-NGtsb_init | ||
diff --git a/arch/sparc64/lib/NGbzero.S b/arch/sparc64/lib/NGbzero.S index fef584f745dc..e86baece5cc8 100644 --- a/arch/sparc64/lib/NGbzero.S +++ b/arch/sparc64/lib/NGbzero.S | |||
@@ -157,6 +157,7 @@ niagara_patch_bzero: | |||
157 | NG_DO_PATCH(memset, NGmemset) | 157 | NG_DO_PATCH(memset, NGmemset) |
158 | NG_DO_PATCH(__bzero, NGbzero) | 158 | NG_DO_PATCH(__bzero, NGbzero) |
159 | NG_DO_PATCH(__clear_user, NGclear_user) | 159 | NG_DO_PATCH(__clear_user, NGclear_user) |
160 | NG_DO_PATCH(tsb_init, NGtsb_init) | ||
160 | retl | 161 | retl |
161 | nop | 162 | nop |
162 | .size niagara_patch_bzero,.-niagara_patch_bzero | 163 | .size niagara_patch_bzero,.-niagara_patch_bzero |
diff --git a/arch/sparc64/mm/tsb.c b/arch/sparc64/mm/tsb.c index 1af797a0a092..b2064e2a44d6 100644 --- a/arch/sparc64/mm/tsb.c +++ b/arch/sparc64/mm/tsb.c | |||
@@ -313,7 +313,7 @@ retry_tsb_alloc: | |||
313 | } | 313 | } |
314 | 314 | ||
315 | /* Mark all tags as invalid. */ | 315 | /* Mark all tags as invalid. */ |
316 | memset(new_tsb, 0x40, new_size); | 316 | tsb_init(new_tsb, new_size); |
317 | 317 | ||
318 | /* Ok, we are about to commit the changes. If we are | 318 | /* Ok, we are about to commit the changes. If we are |
319 | * growing an existing TSB the locking is very tricky, | 319 | * growing an existing TSB the locking is very tricky, |
diff --git a/include/asm-sparc64/mmu.h b/include/asm-sparc64/mmu.h index da14a9bf0ed6..230ba678d3b0 100644 --- a/include/asm-sparc64/mmu.h +++ b/include/asm-sparc64/mmu.h | |||
@@ -88,6 +88,7 @@ struct tsb { | |||
88 | 88 | ||
89 | extern void __tsb_insert(unsigned long ent, unsigned long tag, unsigned long pte); | 89 | extern void __tsb_insert(unsigned long ent, unsigned long tag, unsigned long pte); |
90 | extern void tsb_flush(unsigned long ent, unsigned long tag); | 90 | extern void tsb_flush(unsigned long ent, unsigned long tag); |
91 | extern void tsb_init(struct tsb *tsb, unsigned long size); | ||
91 | 92 | ||
92 | typedef struct { | 93 | typedef struct { |
93 | spinlock_t lock; | 94 | spinlock_t lock; |