162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Assembler variants of srmmu access functions.
362306a36Sopenharmony_ci * Implemented in assembler to allow run-time patching.
462306a36Sopenharmony_ci * LEON uses a different ASI for MMUREGS than SUN.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * The leon_1insn_patch infrastructure is used
762306a36Sopenharmony_ci * for the run-time patching.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/linkage.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <asm/asmmacro.h>
1362306a36Sopenharmony_ci#include <asm/pgtsrmmu.h>
1462306a36Sopenharmony_ci#include <asm/asi.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* unsigned int srmmu_get_mmureg(void) */
1762306a36Sopenharmony_ciENTRY(srmmu_get_mmureg)
1862306a36Sopenharmony_ciLEON_PI(lda	[%g0] ASI_LEON_MMUREGS, %o0)
1962306a36Sopenharmony_ciSUN_PI_(lda	[%g0] ASI_M_MMUREGS, %o0)
2062306a36Sopenharmony_ci	retl
2162306a36Sopenharmony_ci	 nop
2262306a36Sopenharmony_ciENDPROC(srmmu_get_mmureg)
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* void srmmu_set_mmureg(unsigned long regval) */
2562306a36Sopenharmony_ciENTRY(srmmu_set_mmureg)
2662306a36Sopenharmony_ciLEON_PI(sta	%o0, [%g0] ASI_LEON_MMUREGS)
2762306a36Sopenharmony_ciSUN_PI_(sta	%o0, [%g0] ASI_M_MMUREGS)
2862306a36Sopenharmony_ci	retl
2962306a36Sopenharmony_ci	 nop
3062306a36Sopenharmony_ciENDPROC(srmmu_set_mmureg)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* void srmmu_set_ctable_ptr(unsigned long paddr) */
3362306a36Sopenharmony_ciENTRY(srmmu_set_ctable_ptr)
3462306a36Sopenharmony_ci	/* paddr = ((paddr >> 4) & SRMMU_CTX_PMASK); */
3562306a36Sopenharmony_ci	srl	%o0, 4, %g1
3662306a36Sopenharmony_ci	and	%g1, SRMMU_CTX_PMASK, %g1
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	mov	SRMMU_CTXTBL_PTR, %g2
3962306a36Sopenharmony_ciLEON_PI(sta	%g1, [%g2] ASI_LEON_MMUREGS)
4062306a36Sopenharmony_ciSUN_PI_(sta	%g1, [%g2] ASI_M_MMUREGS)
4162306a36Sopenharmony_ci	retl
4262306a36Sopenharmony_ci	 nop
4362306a36Sopenharmony_ciENDPROC(srmmu_set_ctable_ptr)
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* void srmmu_set_context(int context) */
4762306a36Sopenharmony_ciENTRY(srmmu_set_context)
4862306a36Sopenharmony_ci	mov	SRMMU_CTX_REG, %g1
4962306a36Sopenharmony_ciLEON_PI(sta	%o0, [%g1] ASI_LEON_MMUREGS)
5062306a36Sopenharmony_ciSUN_PI_(sta	%o0, [%g1] ASI_M_MMUREGS)
5162306a36Sopenharmony_ci	retl
5262306a36Sopenharmony_ci	 nop
5362306a36Sopenharmony_ciENDPROC(srmmu_set_context)
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* int srmmu_get_context(void) */
5762306a36Sopenharmony_ciENTRY(srmmu_get_context)
5862306a36Sopenharmony_ci	mov	SRMMU_CTX_REG, %o0
5962306a36Sopenharmony_ciLEON_PI(lda     [%o0] ASI_LEON_MMUREGS, %o0)
6062306a36Sopenharmony_ciSUN_PI_(lda	[%o0] ASI_M_MMUREGS, %o0)
6162306a36Sopenharmony_ci	retl
6262306a36Sopenharmony_ci	 nop
6362306a36Sopenharmony_ciENDPROC(srmmu_get_context)
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* unsigned int srmmu_get_fstatus(void) */
6762306a36Sopenharmony_ciENTRY(srmmu_get_fstatus)
6862306a36Sopenharmony_ci	mov	SRMMU_FAULT_STATUS, %o0
6962306a36Sopenharmony_ciLEON_PI(lda     [%o0] ASI_LEON_MMUREGS, %o0)
7062306a36Sopenharmony_ciSUN_PI_(lda	[%o0] ASI_M_MMUREGS, %o0)
7162306a36Sopenharmony_ci	retl
7262306a36Sopenharmony_ci	 nop
7362306a36Sopenharmony_ciENDPROC(srmmu_get_fstatus)
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* unsigned int srmmu_get_faddr(void) */
7762306a36Sopenharmony_ciENTRY(srmmu_get_faddr)
7862306a36Sopenharmony_ci	mov	SRMMU_FAULT_ADDR, %o0
7962306a36Sopenharmony_ciLEON_PI(lda     [%o0] ASI_LEON_MMUREGS, %o0)
8062306a36Sopenharmony_ciSUN_PI_(lda	[%o0] ASI_M_MMUREGS, %o0)
8162306a36Sopenharmony_ci	retl
8262306a36Sopenharmony_ci	 nop
8362306a36Sopenharmony_ciENDPROC(srmmu_get_faddr)
84