root/arch/sparc/lib/NGpage.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /* NGpage.S: Niagara optimize clear and copy page.
   3  *
   4  * Copyright (C) 2006 (davem@davemloft.net)
   5  */
   6 
   7 #include <asm/asi.h>
   8 #include <asm/page.h>
   9 
  10         .text
  11         .align  32
  12 
  13         /* This is heavily simplified from the sun4u variants
  14          * because Niagara does not have any D-cache aliasing issues
  15          * and also we don't need to use the FPU in order to implement
  16          * an optimal page copy/clear.
  17          */
  18 
  19 NGcopy_user_page:       /* %o0=dest, %o1=src, %o2=vaddr */
  20         save            %sp, -192, %sp
  21         rd              %asi, %g3
  22         wr              %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
  23         set             PAGE_SIZE, %g7
  24         prefetch        [%i1 + 0x00], #one_read
  25         prefetch        [%i1 + 0x40], #one_read
  26 
  27 1:      prefetch        [%i1 + 0x80], #one_read
  28         prefetch        [%i1 + 0xc0], #one_read
  29         ldda            [%i1 + 0x00] %asi, %o2
  30         ldda            [%i1 + 0x10] %asi, %o4
  31         ldda            [%i1 + 0x20] %asi, %l2
  32         ldda            [%i1 + 0x30] %asi, %l4
  33         stxa            %o2, [%i0 + 0x00] %asi
  34         stxa            %o3, [%i0 + 0x08] %asi
  35         stxa            %o4, [%i0 + 0x10] %asi
  36         stxa            %o5, [%i0 + 0x18] %asi
  37         stxa            %l2, [%i0 + 0x20] %asi
  38         stxa            %l3, [%i0 + 0x28] %asi
  39         stxa            %l4, [%i0 + 0x30] %asi
  40         stxa            %l5, [%i0 + 0x38] %asi
  41         ldda            [%i1 + 0x40] %asi, %o2
  42         ldda            [%i1 + 0x50] %asi, %o4
  43         ldda            [%i1 + 0x60] %asi, %l2
  44         ldda            [%i1 + 0x70] %asi, %l4
  45         stxa            %o2, [%i0 + 0x40] %asi
  46         stxa            %o3, [%i0 + 0x48] %asi
  47         stxa            %o4, [%i0 + 0x50] %asi
  48         stxa            %o5, [%i0 + 0x58] %asi
  49         stxa            %l2, [%i0 + 0x60] %asi
  50         stxa            %l3, [%i0 + 0x68] %asi
  51         stxa            %l4, [%i0 + 0x70] %asi
  52         stxa            %l5, [%i0 + 0x78] %asi
  53         add             %i1, 128, %i1
  54         subcc           %g7, 128, %g7
  55         bne,pt          %xcc, 1b
  56          add            %i0, 128, %i0
  57         wr              %g3, 0x0, %asi
  58         membar          #Sync
  59         ret
  60          restore
  61 
  62         .align          32
  63         .globl          NGclear_page
  64         .globl          NGclear_user_page
  65 NGclear_page:           /* %o0=dest */
  66 NGclear_user_page:      /* %o0=dest, %o1=vaddr */
  67         rd              %asi, %g3
  68         wr              %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
  69         set             PAGE_SIZE, %g7
  70 
  71 1:      stxa            %g0, [%o0 + 0x00] %asi
  72         stxa            %g0, [%o0 + 0x08] %asi
  73         stxa            %g0, [%o0 + 0x10] %asi
  74         stxa            %g0, [%o0 + 0x18] %asi
  75         stxa            %g0, [%o0 + 0x20] %asi
  76         stxa            %g0, [%o0 + 0x28] %asi
  77         stxa            %g0, [%o0 + 0x30] %asi
  78         stxa            %g0, [%o0 + 0x38] %asi
  79         stxa            %g0, [%o0 + 0x40] %asi
  80         stxa            %g0, [%o0 + 0x48] %asi
  81         stxa            %g0, [%o0 + 0x50] %asi
  82         stxa            %g0, [%o0 + 0x58] %asi
  83         stxa            %g0, [%o0 + 0x60] %asi
  84         stxa            %g0, [%o0 + 0x68] %asi
  85         stxa            %g0, [%o0 + 0x70] %asi
  86         stxa            %g0, [%o0 + 0x78] %asi
  87         stxa            %g0, [%o0 + 0x80] %asi
  88         stxa            %g0, [%o0 + 0x88] %asi
  89         stxa            %g0, [%o0 + 0x90] %asi
  90         stxa            %g0, [%o0 + 0x98] %asi
  91         stxa            %g0, [%o0 + 0xa0] %asi
  92         stxa            %g0, [%o0 + 0xa8] %asi
  93         stxa            %g0, [%o0 + 0xb0] %asi
  94         stxa            %g0, [%o0 + 0xb8] %asi
  95         stxa            %g0, [%o0 + 0xc0] %asi
  96         stxa            %g0, [%o0 + 0xc8] %asi
  97         stxa            %g0, [%o0 + 0xd0] %asi
  98         stxa            %g0, [%o0 + 0xd8] %asi
  99         stxa            %g0, [%o0 + 0xe0] %asi
 100         stxa            %g0, [%o0 + 0xe8] %asi
 101         stxa            %g0, [%o0 + 0xf0] %asi
 102         stxa            %g0, [%o0 + 0xf8] %asi
 103         subcc           %g7, 256, %g7
 104         bne,pt          %xcc, 1b
 105          add            %o0, 256, %o0
 106         wr              %g3, 0x0, %asi
 107         membar          #Sync
 108         retl
 109          nop
 110 
 111 #define BRANCH_ALWAYS   0x10680000
 112 #define NOP             0x01000000
 113 #define NG_DO_PATCH(OLD, NEW)   \
 114         sethi   %hi(NEW), %g1; \
 115         or      %g1, %lo(NEW), %g1; \
 116         sethi   %hi(OLD), %g2; \
 117         or      %g2, %lo(OLD), %g2; \
 118         sub     %g1, %g2, %g1; \
 119         sethi   %hi(BRANCH_ALWAYS), %g3; \
 120         sll     %g1, 11, %g1; \
 121         srl     %g1, 11 + 2, %g1; \
 122         or      %g3, %lo(BRANCH_ALWAYS), %g3; \
 123         or      %g3, %g1, %g3; \
 124         stw     %g3, [%g2]; \
 125         sethi   %hi(NOP), %g3; \
 126         or      %g3, %lo(NOP), %g3; \
 127         stw     %g3, [%g2 + 0x4]; \
 128         flush   %g2;
 129 
 130         .globl  niagara_patch_pageops
 131         .type   niagara_patch_pageops,#function
 132 niagara_patch_pageops:
 133         NG_DO_PATCH(copy_user_page, NGcopy_user_page)
 134         NG_DO_PATCH(_clear_page, NGclear_page)
 135         NG_DO_PATCH(clear_user_page, NGclear_user_page)
 136         retl
 137          nop
 138         .size   niagara_patch_pageops,.-niagara_patch_pageops

/* [<][>][^][v][top][bottom][index][help] */