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