1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2478b8fecSSam Ravnborg/* NGpage.S: Niagara optimize clear and copy page. 3478b8fecSSam Ravnborg * 4478b8fecSSam Ravnborg * Copyright (C) 2006 (davem@davemloft.net) 5478b8fecSSam Ravnborg */ 6478b8fecSSam Ravnborg 7478b8fecSSam Ravnborg#include <asm/asi.h> 8478b8fecSSam Ravnborg#include <asm/page.h> 9478b8fecSSam Ravnborg 10478b8fecSSam Ravnborg .text 11478b8fecSSam Ravnborg .align 32 12478b8fecSSam Ravnborg 13478b8fecSSam Ravnborg /* This is heavily simplified from the sun4u variants 14478b8fecSSam Ravnborg * because Niagara does not have any D-cache aliasing issues 15478b8fecSSam Ravnborg * and also we don't need to use the FPU in order to implement 16478b8fecSSam Ravnborg * an optimal page copy/clear. 17478b8fecSSam Ravnborg */ 18478b8fecSSam Ravnborg 19478b8fecSSam RavnborgNGcopy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ 20e95ade08SDavid S. Miller save %sp, -192, %sp 21e95ade08SDavid S. Miller rd %asi, %g3 22e95ade08SDavid S. Miller wr %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi 23478b8fecSSam Ravnborg set PAGE_SIZE, %g7 24e95ade08SDavid S. Miller prefetch [%i1 + 0x00], #one_read 25e95ade08SDavid S. Miller prefetch [%i1 + 0x40], #one_read 26478b8fecSSam Ravnborg 27e95ade08SDavid S. Miller1: prefetch [%i1 + 0x80], #one_read 28e95ade08SDavid S. Miller prefetch [%i1 + 0xc0], #one_read 29e95ade08SDavid S. Miller ldda [%i1 + 0x00] %asi, %o2 30e95ade08SDavid S. Miller ldda [%i1 + 0x10] %asi, %o4 31e95ade08SDavid S. Miller ldda [%i1 + 0x20] %asi, %l2 32e95ade08SDavid S. Miller ldda [%i1 + 0x30] %asi, %l4 33e95ade08SDavid S. Miller stxa %o2, [%i0 + 0x00] %asi 34e95ade08SDavid S. Miller stxa %o3, [%i0 + 0x08] %asi 35e95ade08SDavid S. Miller stxa %o4, [%i0 + 0x10] %asi 36e95ade08SDavid S. Miller stxa %o5, [%i0 + 0x18] %asi 37e95ade08SDavid S. Miller stxa %l2, [%i0 + 0x20] %asi 38e95ade08SDavid S. Miller stxa %l3, [%i0 + 0x28] %asi 39e95ade08SDavid S. Miller stxa %l4, [%i0 + 0x30] %asi 40e95ade08SDavid S. Miller stxa %l5, [%i0 + 0x38] %asi 41e95ade08SDavid S. Miller ldda [%i1 + 0x40] %asi, %o2 42e95ade08SDavid S. Miller ldda [%i1 + 0x50] %asi, %o4 43e95ade08SDavid S. Miller ldda [%i1 + 0x60] %asi, %l2 44e95ade08SDavid S. Miller ldda [%i1 + 0x70] %asi, %l4 45e95ade08SDavid S. Miller stxa %o2, [%i0 + 0x40] %asi 46e95ade08SDavid S. Miller stxa %o3, [%i0 + 0x48] %asi 47e95ade08SDavid S. Miller stxa %o4, [%i0 + 0x50] %asi 48e95ade08SDavid S. Miller stxa %o5, [%i0 + 0x58] %asi 49e95ade08SDavid S. Miller stxa %l2, [%i0 + 0x60] %asi 50e95ade08SDavid S. Miller stxa %l3, [%i0 + 0x68] %asi 51e95ade08SDavid S. Miller stxa %l4, [%i0 + 0x70] %asi 52e95ade08SDavid S. Miller stxa %l5, [%i0 + 0x78] %asi 53e95ade08SDavid S. Miller add %i1, 128, %i1 54e95ade08SDavid S. Miller subcc %g7, 128, %g7 55478b8fecSSam Ravnborg bne,pt %xcc, 1b 56e95ade08SDavid S. Miller add %i0, 128, %i0 57e95ade08SDavid S. Miller wr %g3, 0x0, %asi 58478b8fecSSam Ravnborg membar #Sync 59e95ade08SDavid S. Miller ret 60e95ade08SDavid S. Miller restore 61478b8fecSSam Ravnborg 62e95ade08SDavid S. Miller .align 32 63ae2c6ca6SDavid S. Miller .globl NGclear_page 64ae2c6ca6SDavid S. Miller .globl NGclear_user_page 65478b8fecSSam RavnborgNGclear_page: /* %o0=dest */ 66478b8fecSSam RavnborgNGclear_user_page: /* %o0=dest, %o1=vaddr */ 67e95ade08SDavid S. Miller rd %asi, %g3 68e95ade08SDavid S. Miller wr %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi 69478b8fecSSam Ravnborg set PAGE_SIZE, %g7 70478b8fecSSam Ravnborg 71e95ade08SDavid S. Miller1: stxa %g0, [%o0 + 0x00] %asi 72e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x08] %asi 73e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x10] %asi 74e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x18] %asi 75e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x20] %asi 76e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x28] %asi 77e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x30] %asi 78e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x38] %asi 79e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x40] %asi 80e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x48] %asi 81e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x50] %asi 82e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x58] %asi 83e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x60] %asi 84e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x68] %asi 85e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x70] %asi 86e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x78] %asi 87e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x80] %asi 88e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x88] %asi 89e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x90] %asi 90e95ade08SDavid S. Miller stxa %g0, [%o0 + 0x98] %asi 91e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xa0] %asi 92e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xa8] %asi 93e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xb0] %asi 94e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xb8] %asi 95e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xc0] %asi 96e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xc8] %asi 97e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xd0] %asi 98e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xd8] %asi 99e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xe0] %asi 100e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xe8] %asi 101e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xf0] %asi 102e95ade08SDavid S. Miller stxa %g0, [%o0 + 0xf8] %asi 103e95ade08SDavid S. Miller subcc %g7, 256, %g7 104478b8fecSSam Ravnborg bne,pt %xcc, 1b 105e95ade08SDavid S. Miller add %o0, 256, %o0 106e95ade08SDavid S. Miller wr %g3, 0x0, %asi 107478b8fecSSam Ravnborg membar #Sync 108478b8fecSSam Ravnborg retl 109478b8fecSSam Ravnborg nop 110478b8fecSSam Ravnborg 111478b8fecSSam Ravnborg#define BRANCH_ALWAYS 0x10680000 112478b8fecSSam Ravnborg#define NOP 0x01000000 113478b8fecSSam Ravnborg#define NG_DO_PATCH(OLD, NEW) \ 114478b8fecSSam Ravnborg sethi %hi(NEW), %g1; \ 115478b8fecSSam Ravnborg or %g1, %lo(NEW), %g1; \ 116478b8fecSSam Ravnborg sethi %hi(OLD), %g2; \ 117478b8fecSSam Ravnborg or %g2, %lo(OLD), %g2; \ 118478b8fecSSam Ravnborg sub %g1, %g2, %g1; \ 119478b8fecSSam Ravnborg sethi %hi(BRANCH_ALWAYS), %g3; \ 120478b8fecSSam Ravnborg sll %g1, 11, %g1; \ 121478b8fecSSam Ravnborg srl %g1, 11 + 2, %g1; \ 122478b8fecSSam Ravnborg or %g3, %lo(BRANCH_ALWAYS), %g3; \ 123478b8fecSSam Ravnborg or %g3, %g1, %g3; \ 124478b8fecSSam Ravnborg stw %g3, [%g2]; \ 125478b8fecSSam Ravnborg sethi %hi(NOP), %g3; \ 126478b8fecSSam Ravnborg or %g3, %lo(NOP), %g3; \ 127478b8fecSSam Ravnborg stw %g3, [%g2 + 0x4]; \ 128478b8fecSSam Ravnborg flush %g2; 129478b8fecSSam Ravnborg 130478b8fecSSam Ravnborg .globl niagara_patch_pageops 131478b8fecSSam Ravnborg .type niagara_patch_pageops,#function 132478b8fecSSam Ravnborgniagara_patch_pageops: 133478b8fecSSam Ravnborg NG_DO_PATCH(copy_user_page, NGcopy_user_page) 134478b8fecSSam Ravnborg NG_DO_PATCH(_clear_page, NGclear_page) 135478b8fecSSam Ravnborg NG_DO_PATCH(clear_user_page, NGclear_user_page) 136478b8fecSSam Ravnborg retl 137478b8fecSSam Ravnborg nop 138478b8fecSSam Ravnborg .size niagara_patch_pageops,.-niagara_patch_pageops 139