diff options
| -rw-r--r-- | arch/sparc/include/asm/asi.h | 19 | ||||
| -rw-r--r-- | arch/sparc/kernel/head_64.S | 2 | ||||
| -rw-r--r-- | arch/sparc/lib/Makefile | 2 | ||||
| -rw-r--r-- | arch/sparc/lib/NG4clear_page.S | 29 | ||||
| -rw-r--r-- | arch/sparc/lib/NG4copy_page.S | 16 | ||||
| -rw-r--r-- | arch/sparc/lib/NG4memset.S | 105 | ||||
| -rw-r--r-- | arch/sparc/lib/NG4patch.S | 15 |
7 files changed, 176 insertions, 12 deletions
diff --git a/arch/sparc/include/asm/asi.h b/arch/sparc/include/asm/asi.h index cc0006dc5d4a..aace6f313716 100644 --- a/arch/sparc/include/asm/asi.h +++ b/arch/sparc/include/asm/asi.h | |||
| @@ -270,9 +270,28 @@ | |||
| 270 | #define ASI_BLK_INIT_QUAD_LDD_P 0xe2 /* (NG) init-store, twin load, | 270 | #define ASI_BLK_INIT_QUAD_LDD_P 0xe2 /* (NG) init-store, twin load, |
| 271 | * primary, implicit | 271 | * primary, implicit |
| 272 | */ | 272 | */ |
| 273 | #define ASI_BLK_INIT_QUAD_LDD_S 0xe3 /* (NG) init-store, twin load, | ||
| 274 | * secondary, implicit | ||
| 275 | */ | ||
| 273 | #define ASI_BLK_P 0xf0 /* Primary, blk ld/st */ | 276 | #define ASI_BLK_P 0xf0 /* Primary, blk ld/st */ |
| 274 | #define ASI_BLK_S 0xf1 /* Secondary, blk ld/st */ | 277 | #define ASI_BLK_S 0xf1 /* Secondary, blk ld/st */ |
| 278 | #define ASI_ST_BLKINIT_MRU_P 0xf2 /* (NG4) init-store, twin load, | ||
| 279 | * Most-Recently-Used, primary, | ||
| 280 | * implicit | ||
| 281 | */ | ||
| 282 | #define ASI_ST_BLKINIT_MRU_S 0xf2 /* (NG4) init-store, twin load, | ||
| 283 | * Most-Recently-Used, secondary, | ||
| 284 | * implicit | ||
| 285 | */ | ||
| 275 | #define ASI_BLK_PL 0xf8 /* Primary, blk ld/st, little */ | 286 | #define ASI_BLK_PL 0xf8 /* Primary, blk ld/st, little */ |
| 276 | #define ASI_BLK_SL 0xf9 /* Secondary, blk ld/st, little */ | 287 | #define ASI_BLK_SL 0xf9 /* Secondary, blk ld/st, little */ |
| 288 | #define ASI_ST_BLKINIT_MRU_PL 0xfa /* (NG4) init-store, twin load, | ||
| 289 | * Most-Recently-Used, primary, | ||
| 290 | * implicit, little-endian | ||
| 291 | */ | ||
| 292 | #define ASI_ST_BLKINIT_MRU_SL 0xfb /* (NG4) init-store, twin load, | ||
| 293 | * Most-Recently-Used, secondary, | ||
| 294 | * implicit, little-endian | ||
| 295 | */ | ||
| 277 | 296 | ||
| 278 | #endif /* _SPARC_ASI_H */ | 297 | #endif /* _SPARC_ASI_H */ |
diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index ee5dcced2499..2feb15c35d9e 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S | |||
| @@ -576,7 +576,7 @@ niagara_tlb_fixup: | |||
| 576 | niagara4_patch: | 576 | niagara4_patch: |
| 577 | call niagara4_patch_copyops | 577 | call niagara4_patch_copyops |
| 578 | nop | 578 | nop |
| 579 | call niagara_patch_bzero | 579 | call niagara4_patch_bzero |
| 580 | nop | 580 | nop |
| 581 | call niagara4_patch_pageops | 581 | call niagara4_patch_pageops |
| 582 | nop | 582 | nop |
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index 30f6ab51c551..8410065f2862 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile | |||
| @@ -33,7 +33,7 @@ lib-$(CONFIG_SPARC64) += NG2memcpy.o NG2copy_from_user.o NG2copy_to_user.o | |||
| 33 | lib-$(CONFIG_SPARC64) += NG2patch.o | 33 | lib-$(CONFIG_SPARC64) += NG2patch.o |
| 34 | 34 | ||
| 35 | lib-$(CONFIG_SPARC64) += NG4memcpy.o NG4copy_from_user.o NG4copy_to_user.o | 35 | lib-$(CONFIG_SPARC64) += NG4memcpy.o NG4copy_from_user.o NG4copy_to_user.o |
| 36 | lib-$(CONFIG_SPARC64) += NG4patch.o NG4copy_page.o | 36 | lib-$(CONFIG_SPARC64) += NG4patch.o NG4copy_page.o NG4clear_page.o NG4memset.o |
| 37 | 37 | ||
| 38 | lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o | 38 | lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o |
| 39 | lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o | 39 | lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o |
diff --git a/arch/sparc/lib/NG4clear_page.S b/arch/sparc/lib/NG4clear_page.S new file mode 100644 index 000000000000..e16c88204a42 --- /dev/null +++ b/arch/sparc/lib/NG4clear_page.S | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | /* NG4copy_page.S: Niagara-4 optimized clear page. | ||
| 2 | * | ||
| 3 | * Copyright (C) 2012 (davem@davemloft.net) | ||
| 4 | */ | ||
| 5 | |||
| 6 | #include <asm/asi.h> | ||
| 7 | #include <asm/page.h> | ||
| 8 | |||
| 9 | .text | ||
| 10 | |||
| 11 | .register %g3, #scratch | ||
| 12 | |||
| 13 | .align 32 | ||
| 14 | .globl NG4clear_page | ||
| 15 | .globl NG4clear_user_page | ||
| 16 | NG4clear_page: /* %o0=dest */ | ||
| 17 | NG4clear_user_page: /* %o0=dest, %o1=vaddr */ | ||
| 18 | set PAGE_SIZE, %g7 | ||
| 19 | mov 0x20, %g3 | ||
| 20 | 1: stxa %g0, [%o0 + %g0] ASI_ST_BLKINIT_MRU_P | ||
| 21 | subcc %g7, 0x40, %g7 | ||
| 22 | stxa %g0, [%o0 + %g3] ASI_ST_BLKINIT_MRU_P | ||
| 23 | bne,pt %xcc, 1b | ||
| 24 | add %o0, 0x40, %o0 | ||
| 25 | membar #StoreLoad|#StoreStore | ||
| 26 | retl | ||
| 27 | nop | ||
| 28 | .size NG4clear_page,.-NG4clear_page | ||
| 29 | .size NG4clear_user_page,.-NG4clear_user_page \ No newline at end of file | ||
diff --git a/arch/sparc/lib/NG4copy_page.S b/arch/sparc/lib/NG4copy_page.S index f30ec10bbcac..28504e88c535 100644 --- a/arch/sparc/lib/NG4copy_page.S +++ b/arch/sparc/lib/NG4copy_page.S | |||
| @@ -30,25 +30,25 @@ NG4copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ | |||
| 30 | ldx [%o1 + 0x10], %o4 | 30 | ldx [%o1 + 0x10], %o4 |
| 31 | ldx [%o1 + 0x18], %o5 | 31 | ldx [%o1 + 0x18], %o5 |
| 32 | ldx [%o1 + 0x20], %g1 | 32 | ldx [%o1 + 0x20], %g1 |
| 33 | stxa %o2, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 33 | stxa %o2, [%o0] ASI_ST_BLKINIT_MRU_P |
| 34 | add %o0, 0x08, %o0 | 34 | add %o0, 0x08, %o0 |
| 35 | ldx [%o1 + 0x28], %g2 | 35 | ldx [%o1 + 0x28], %g2 |
| 36 | stxa %o3, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 36 | stxa %o3, [%o0] ASI_ST_BLKINIT_MRU_P |
| 37 | add %o0, 0x08, %o0 | 37 | add %o0, 0x08, %o0 |
| 38 | ldx [%o1 + 0x30], %g3 | 38 | ldx [%o1 + 0x30], %g3 |
| 39 | stxa %o4, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 39 | stxa %o4, [%o0] ASI_ST_BLKINIT_MRU_P |
| 40 | add %o0, 0x08, %o0 | 40 | add %o0, 0x08, %o0 |
| 41 | ldx [%o1 + 0x38], %o2 | 41 | ldx [%o1 + 0x38], %o2 |
| 42 | add %o1, 0x40, %o1 | 42 | add %o1, 0x40, %o1 |
| 43 | stxa %o5, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 43 | stxa %o5, [%o0] ASI_ST_BLKINIT_MRU_P |
| 44 | add %o0, 0x08, %o0 | 44 | add %o0, 0x08, %o0 |
| 45 | stxa %g1, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 45 | stxa %g1, [%o0] ASI_ST_BLKINIT_MRU_P |
| 46 | add %o0, 0x08, %o0 | 46 | add %o0, 0x08, %o0 |
| 47 | stxa %g2, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 47 | stxa %g2, [%o0] ASI_ST_BLKINIT_MRU_P |
| 48 | add %o0, 0x08, %o0 | 48 | add %o0, 0x08, %o0 |
| 49 | stxa %g3, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 49 | stxa %g3, [%o0] ASI_ST_BLKINIT_MRU_P |
| 50 | add %o0, 0x08, %o0 | 50 | add %o0, 0x08, %o0 |
| 51 | stxa %o2, [%o0] ASI_BLK_INIT_QUAD_LDD_P | 51 | stxa %o2, [%o0] ASI_ST_BLKINIT_MRU_P |
| 52 | add %o0, 0x08, %o0 | 52 | add %o0, 0x08, %o0 |
| 53 | bne,pt %icc, 1b | 53 | bne,pt %icc, 1b |
| 54 | prefetch [%o1 + 0x200], #n_reads_strong | 54 | prefetch [%o1 + 0x200], #n_reads_strong |
diff --git a/arch/sparc/lib/NG4memset.S b/arch/sparc/lib/NG4memset.S new file mode 100644 index 000000000000..41da4bdd95cb --- /dev/null +++ b/arch/sparc/lib/NG4memset.S | |||
| @@ -0,0 +1,105 @@ | |||
| 1 | /* NG4memset.S: Niagara-4 optimized memset/bzero. | ||
| 2 | * | ||
| 3 | * Copyright (C) 2012 David S. Miller (davem@davemloft.net) | ||
| 4 | */ | ||
| 5 | |||
| 6 | #include <asm/asi.h> | ||
| 7 | |||
| 8 | .register %g2, #scratch | ||
| 9 | .register %g3, #scratch | ||
| 10 | |||
| 11 | .text | ||
| 12 | .align 32 | ||
| 13 | .globl NG4memset | ||
| 14 | NG4memset: | ||
| 15 | andcc %o1, 0xff, %o4 | ||
| 16 | be,pt %icc, 1f | ||
| 17 | mov %o2, %o1 | ||
| 18 | sllx %o4, 8, %g1 | ||
| 19 | or %g1, %o4, %o2 | ||
| 20 | sllx %o2, 16, %g1 | ||
| 21 | or %g1, %o2, %o2 | ||
| 22 | sllx %o2, 32, %g1 | ||
| 23 | ba,pt %icc, 1f | ||
| 24 | or %g1, %o2, %o4 | ||
| 25 | .size NG4memset,.-NG4memset | ||
| 26 | |||
| 27 | .align 32 | ||
| 28 | .globl NG4bzero | ||
| 29 | NG4bzero: | ||
| 30 | clr %o4 | ||
| 31 | 1: cmp %o1, 16 | ||
| 32 | ble %icc, .Ltiny | ||
| 33 | mov %o0, %o3 | ||
| 34 | sub %g0, %o0, %g1 | ||
| 35 | and %g1, 0x7, %g1 | ||
| 36 | brz,pt %g1, .Laligned8 | ||
| 37 | sub %o1, %g1, %o1 | ||
| 38 | 1: stb %o4, [%o0 + 0x00] | ||
| 39 | subcc %g1, 1, %g1 | ||
| 40 | bne,pt %icc, 1b | ||
| 41 | add %o0, 1, %o0 | ||
| 42 | .Laligned8: | ||
| 43 | cmp %o1, 64 + (64 - 8) | ||
| 44 | ble .Lmedium | ||
| 45 | sub %g0, %o0, %g1 | ||
| 46 | andcc %g1, (64 - 1), %g1 | ||
| 47 | brz,pn %g1, .Laligned64 | ||
| 48 | sub %o1, %g1, %o1 | ||
| 49 | 1: stx %o4, [%o0 + 0x00] | ||
| 50 | subcc %g1, 8, %g1 | ||
| 51 | bne,pt %icc, 1b | ||
| 52 | add %o0, 0x8, %o0 | ||
| 53 | .Laligned64: | ||
| 54 | andn %o1, 64 - 1, %g1 | ||
| 55 | sub %o1, %g1, %o1 | ||
| 56 | brnz,pn %o4, .Lnon_bzero_loop | ||
| 57 | mov 0x20, %g2 | ||
| 58 | 1: stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P | ||
| 59 | subcc %g1, 0x40, %g1 | ||
| 60 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P | ||
| 61 | bne,pt %icc, 1b | ||
| 62 | add %o0, 0x40, %o0 | ||
| 63 | .Lpostloop: | ||
| 64 | cmp %o1, 8 | ||
| 65 | bl,pn %icc, .Ltiny | ||
| 66 | membar #StoreStore|#StoreLoad | ||
| 67 | .Lmedium: | ||
| 68 | andn %o1, 0x7, %g1 | ||
| 69 | sub %o1, %g1, %o1 | ||
| 70 | 1: stx %o4, [%o0 + 0x00] | ||
| 71 | subcc %g1, 0x8, %g1 | ||
| 72 | bne,pt %icc, 1b | ||
| 73 | add %o0, 0x08, %o0 | ||
| 74 | andcc %o1, 0x4, %g1 | ||
| 75 | be,pt %icc, .Ltiny | ||
| 76 | sub %o1, %g1, %o1 | ||
| 77 | stw %o4, [%o0 + 0x00] | ||
| 78 | add %o0, 0x4, %o0 | ||
| 79 | .Ltiny: | ||
| 80 | cmp %o1, 0 | ||
| 81 | be,pn %icc, .Lexit | ||
| 82 | 1: subcc %o1, 1, %o1 | ||
| 83 | stb %o4, [%o0 + 0x00] | ||
| 84 | bne,pt %icc, 1b | ||
| 85 | add %o0, 1, %o0 | ||
| 86 | .Lexit: | ||
| 87 | retl | ||
| 88 | mov %o3, %o0 | ||
| 89 | .Lnon_bzero_loop: | ||
| 90 | mov 0x08, %g3 | ||
| 91 | mov 0x28, %o5 | ||
| 92 | 1: stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P | ||
| 93 | subcc %g1, 0x40, %g1 | ||
| 94 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P | ||
| 95 | stxa %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P | ||
| 96 | stxa %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P | ||
| 97 | add %o0, 0x10, %o0 | ||
| 98 | stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P | ||
| 99 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P | ||
| 100 | stxa %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P | ||
| 101 | stxa %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P | ||
| 102 | bne,pt %icc, 1b | ||
| 103 | add %o0, 0x30, %o0 | ||
| 104 | ba,a,pt %icc, .Lpostloop | ||
| 105 | .size NG4bzero,.-NG4bzero | ||
diff --git a/arch/sparc/lib/NG4patch.S b/arch/sparc/lib/NG4patch.S index c21c34c61dda..a114cbcf2a48 100644 --- a/arch/sparc/lib/NG4patch.S +++ b/arch/sparc/lib/NG4patch.S | |||
| @@ -32,12 +32,23 @@ niagara4_patch_copyops: | |||
| 32 | nop | 32 | nop |
| 33 | .size niagara4_patch_copyops,.-niagara4_patch_copyops | 33 | .size niagara4_patch_copyops,.-niagara4_patch_copyops |
| 34 | 34 | ||
| 35 | .globl niagara4_patch_bzero | ||
| 36 | .type niagara4_patch_bzero,#function | ||
| 37 | niagara4_patch_bzero: | ||
| 38 | NG_DO_PATCH(memset, NG4memset) | ||
| 39 | NG_DO_PATCH(__bzero, NG4bzero) | ||
| 40 | NG_DO_PATCH(__clear_user, NGclear_user) | ||
| 41 | NG_DO_PATCH(tsb_init, NGtsb_init) | ||
| 42 | retl | ||
| 43 | nop | ||
| 44 | .size niagara4_patch_bzero,.-niagara4_patch_bzero | ||
| 45 | |||
| 35 | .globl niagara4_patch_pageops | 46 | .globl niagara4_patch_pageops |
| 36 | .type niagara4_patch_pageops,#function | 47 | .type niagara4_patch_pageops,#function |
| 37 | niagara4_patch_pageops: | 48 | niagara4_patch_pageops: |
| 38 | NG_DO_PATCH(copy_user_page, NG4copy_user_page) | 49 | NG_DO_PATCH(copy_user_page, NG4copy_user_page) |
| 39 | NG_DO_PATCH(_clear_page, NGclear_page) | 50 | NG_DO_PATCH(_clear_page, NG4clear_page) |
| 40 | NG_DO_PATCH(clear_user_page, NGclear_user_page) | 51 | NG_DO_PATCH(clear_user_page, NG4clear_user_page) |
| 41 | retl | 52 | retl |
| 42 | nop | 53 | nop |
| 43 | .size niagara4_patch_pageops,.-niagara4_patch_pageops | 54 | .size niagara4_patch_pageops,.-niagara4_patch_pageops |
