162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * tsunami.S: High speed MicroSparc-I mmu/cache operations. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <asm/ptrace.h> 962306a36Sopenharmony_ci#include <asm/asm-offsets.h> 1062306a36Sopenharmony_ci#include <asm/psr.h> 1162306a36Sopenharmony_ci#include <asm/asi.h> 1262306a36Sopenharmony_ci#include <asm/page.h> 1362306a36Sopenharmony_ci#include <asm/pgtsrmmu.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci .text 1662306a36Sopenharmony_ci .align 4 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci .globl tsunami_flush_cache_all, tsunami_flush_cache_mm 1962306a36Sopenharmony_ci .globl tsunami_flush_cache_range, tsunami_flush_cache_page 2062306a36Sopenharmony_ci .globl tsunami_flush_page_to_ram, tsunami_flush_page_for_dma 2162306a36Sopenharmony_ci .globl tsunami_flush_sig_insns 2262306a36Sopenharmony_ci .globl tsunami_flush_tlb_all, tsunami_flush_tlb_mm 2362306a36Sopenharmony_ci .globl tsunami_flush_tlb_range, tsunami_flush_tlb_page 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci /* Sliiick... */ 2662306a36Sopenharmony_citsunami_flush_cache_page: 2762306a36Sopenharmony_citsunami_flush_cache_range: 2862306a36Sopenharmony_ci ld [%o0 + VMA_VM_MM], %o0 2962306a36Sopenharmony_citsunami_flush_cache_mm: 3062306a36Sopenharmony_ci ld [%o0 + AOFF_mm_context], %g2 3162306a36Sopenharmony_ci cmp %g2, -1 3262306a36Sopenharmony_ci be tsunami_flush_cache_out 3362306a36Sopenharmony_citsunami_flush_cache_all: 3462306a36Sopenharmony_ci WINDOW_FLUSH(%g4, %g5) 3562306a36Sopenharmony_citsunami_flush_page_for_dma: 3662306a36Sopenharmony_ci sta %g0, [%g0] ASI_M_IC_FLCLEAR 3762306a36Sopenharmony_ci sta %g0, [%g0] ASI_M_DC_FLCLEAR 3862306a36Sopenharmony_citsunami_flush_cache_out: 3962306a36Sopenharmony_citsunami_flush_page_to_ram: 4062306a36Sopenharmony_ci retl 4162306a36Sopenharmony_ci nop 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_citsunami_flush_sig_insns: 4462306a36Sopenharmony_ci flush %o1 4562306a36Sopenharmony_ci retl 4662306a36Sopenharmony_ci flush %o1 + 4 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci /* More slick stuff... */ 4962306a36Sopenharmony_citsunami_flush_tlb_range: 5062306a36Sopenharmony_ci ld [%o0 + VMA_VM_MM], %o0 5162306a36Sopenharmony_citsunami_flush_tlb_mm: 5262306a36Sopenharmony_ci ld [%o0 + AOFF_mm_context], %g2 5362306a36Sopenharmony_ci cmp %g2, -1 5462306a36Sopenharmony_ci be tsunami_flush_tlb_out 5562306a36Sopenharmony_citsunami_flush_tlb_all: 5662306a36Sopenharmony_ci mov 0x400, %o1 5762306a36Sopenharmony_ci sta %g0, [%o1] ASI_M_FLUSH_PROBE 5862306a36Sopenharmony_ci nop 5962306a36Sopenharmony_ci nop 6062306a36Sopenharmony_ci nop 6162306a36Sopenharmony_ci nop 6262306a36Sopenharmony_ci nop 6362306a36Sopenharmony_citsunami_flush_tlb_out: 6462306a36Sopenharmony_ci retl 6562306a36Sopenharmony_ci nop 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci /* This one can be done in a fine grained manner... */ 6862306a36Sopenharmony_citsunami_flush_tlb_page: 6962306a36Sopenharmony_ci ld [%o0 + VMA_VM_MM], %o0 7062306a36Sopenharmony_ci mov SRMMU_CTX_REG, %g1 7162306a36Sopenharmony_ci ld [%o0 + AOFF_mm_context], %o3 7262306a36Sopenharmony_ci andn %o1, (PAGE_SIZE - 1), %o1 7362306a36Sopenharmony_ci cmp %o3, -1 7462306a36Sopenharmony_ci be tsunami_flush_tlb_page_out 7562306a36Sopenharmony_ci lda [%g1] ASI_M_MMUREGS, %g5 7662306a36Sopenharmony_ci sta %o3, [%g1] ASI_M_MMUREGS 7762306a36Sopenharmony_ci sta %g0, [%o1] ASI_M_FLUSH_PROBE 7862306a36Sopenharmony_ci nop 7962306a36Sopenharmony_ci nop 8062306a36Sopenharmony_ci nop 8162306a36Sopenharmony_ci nop 8262306a36Sopenharmony_ci nop 8362306a36Sopenharmony_citsunami_flush_tlb_page_out: 8462306a36Sopenharmony_ci retl 8562306a36Sopenharmony_ci sta %g5, [%g1] ASI_M_MMUREGS 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define MIRROR_BLOCK(dst, src, offset, t0, t1, t2, t3) \ 8862306a36Sopenharmony_ci ldd [src + offset + 0x18], t0; \ 8962306a36Sopenharmony_ci std t0, [dst + offset + 0x18]; \ 9062306a36Sopenharmony_ci ldd [src + offset + 0x10], t2; \ 9162306a36Sopenharmony_ci std t2, [dst + offset + 0x10]; \ 9262306a36Sopenharmony_ci ldd [src + offset + 0x08], t0; \ 9362306a36Sopenharmony_ci std t0, [dst + offset + 0x08]; \ 9462306a36Sopenharmony_ci ldd [src + offset + 0x00], t2; \ 9562306a36Sopenharmony_ci std t2, [dst + offset + 0x00]; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_citsunami_copy_1page: 9862306a36Sopenharmony_ci/* NOTE: This routine has to be shorter than 70insns --jj */ 9962306a36Sopenharmony_ci or %g0, (PAGE_SIZE >> 8), %g1 10062306a36Sopenharmony_ci1: 10162306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0x00, %o2, %o3, %o4, %o5) 10262306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0x20, %o2, %o3, %o4, %o5) 10362306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0x40, %o2, %o3, %o4, %o5) 10462306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0x60, %o2, %o3, %o4, %o5) 10562306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0x80, %o2, %o3, %o4, %o5) 10662306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0xa0, %o2, %o3, %o4, %o5) 10762306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0xc0, %o2, %o3, %o4, %o5) 10862306a36Sopenharmony_ci MIRROR_BLOCK(%o0, %o1, 0xe0, %o2, %o3, %o4, %o5) 10962306a36Sopenharmony_ci subcc %g1, 1, %g1 11062306a36Sopenharmony_ci add %o0, 0x100, %o0 11162306a36Sopenharmony_ci bne 1b 11262306a36Sopenharmony_ci add %o1, 0x100, %o1 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci .globl tsunami_setup_blockops 11562306a36Sopenharmony_citsunami_setup_blockops: 11662306a36Sopenharmony_ci sethi %hi(__copy_1page), %o0 11762306a36Sopenharmony_ci or %o0, %lo(__copy_1page), %o0 11862306a36Sopenharmony_ci sethi %hi(tsunami_copy_1page), %o1 11962306a36Sopenharmony_ci or %o1, %lo(tsunami_copy_1page), %o1 12062306a36Sopenharmony_ci sethi %hi(tsunami_setup_blockops), %o2 12162306a36Sopenharmony_ci or %o2, %lo(tsunami_setup_blockops), %o2 12262306a36Sopenharmony_ci ld [%o1], %o4 12362306a36Sopenharmony_ci1: add %o1, 4, %o1 12462306a36Sopenharmony_ci st %o4, [%o0] 12562306a36Sopenharmony_ci add %o0, 4, %o0 12662306a36Sopenharmony_ci cmp %o1, %o2 12762306a36Sopenharmony_ci bne 1b 12862306a36Sopenharmony_ci ld [%o1], %o4 12962306a36Sopenharmony_ci sta %g0, [%g0] ASI_M_IC_FLCLEAR 13062306a36Sopenharmony_ci sta %g0, [%g0] ASI_M_DC_FLCLEAR 13162306a36Sopenharmony_ci retl 13262306a36Sopenharmony_ci nop 133