xref: /kernel/linux/linux-6.6/arch/sparc/mm/leon_mm.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/sparc/mm/leon_m.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2004 Konrad Eisele (eiselekd@web.de, konrad@gaisler.com) Gaisler Research
662306a36Sopenharmony_ci * Copyright (C) 2009 Daniel Hellstrom (daniel@gaisler.com) Aeroflex Gaisler AB
762306a36Sopenharmony_ci * Copyright (C) 2009 Konrad Eisele (konrad@gaisler.com) Aeroflex Gaisler AB
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * do srmmu probe in software
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/kernel.h>
1462306a36Sopenharmony_ci#include <linux/mm.h>
1562306a36Sopenharmony_ci#include <asm/asi.h>
1662306a36Sopenharmony_ci#include <asm/leon.h>
1762306a36Sopenharmony_ci#include <asm/tlbflush.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include "mm_32.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciint leon_flush_during_switch = 1;
2262306a36Sopenharmony_cistatic int srmmu_swprobe_trace;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic inline unsigned long leon_get_ctable_ptr(void)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	unsigned int retval;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	__asm__ __volatile__("lda [%1] %2, %0\n\t" :
2962306a36Sopenharmony_ci			     "=r" (retval) :
3062306a36Sopenharmony_ci			     "r" (SRMMU_CTXTBL_PTR),
3162306a36Sopenharmony_ci			     "i" (ASI_LEON_MMUREGS));
3262306a36Sopenharmony_ci	return (retval & SRMMU_CTX_PMASK) << 4;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciunsigned long leon_swprobe(unsigned long vaddr, unsigned long *paddr)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	unsigned int ctxtbl;
4062306a36Sopenharmony_ci	unsigned int pgd, pmd, ped;
4162306a36Sopenharmony_ci	unsigned int ptr;
4262306a36Sopenharmony_ci	unsigned int lvl, pte, paddrbase;
4362306a36Sopenharmony_ci	unsigned int ctx;
4462306a36Sopenharmony_ci	unsigned int paddr_calc;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	paddrbase = 0;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	if (srmmu_swprobe_trace)
4962306a36Sopenharmony_ci		printk(KERN_INFO "swprobe: trace on\n");
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	ctxtbl = leon_get_ctable_ptr();
5262306a36Sopenharmony_ci	if (!(ctxtbl)) {
5362306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
5462306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: leon_get_ctable_ptr returned 0=>0\n");
5562306a36Sopenharmony_ci		return 0;
5662306a36Sopenharmony_ci	}
5762306a36Sopenharmony_ci	if (!_pfn_valid(PFN(ctxtbl))) {
5862306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
5962306a36Sopenharmony_ci			printk(KERN_INFO
6062306a36Sopenharmony_ci			       "swprobe: !_pfn_valid(%x)=>0\n",
6162306a36Sopenharmony_ci			       PFN(ctxtbl));
6262306a36Sopenharmony_ci		return 0;
6362306a36Sopenharmony_ci	}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	ctx = srmmu_get_context();
6662306a36Sopenharmony_ci	if (srmmu_swprobe_trace)
6762306a36Sopenharmony_ci		printk(KERN_INFO "swprobe:  --- ctx (%x) ---\n", ctx);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	pgd = LEON_BYPASS_LOAD_PA(ctxtbl + (ctx * 4));
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	if (((pgd & SRMMU_ET_MASK) == SRMMU_ET_PTE)) {
7262306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
7362306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: pgd is entry level 3\n");
7462306a36Sopenharmony_ci		lvl = 3;
7562306a36Sopenharmony_ci		pte = pgd;
7662306a36Sopenharmony_ci		paddrbase = pgd & _SRMMU_PTE_PMASK_LEON;
7762306a36Sopenharmony_ci		goto ready;
7862306a36Sopenharmony_ci	}
7962306a36Sopenharmony_ci	if (((pgd & SRMMU_ET_MASK) != SRMMU_ET_PTD)) {
8062306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
8162306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: pgd is invalid => 0\n");
8262306a36Sopenharmony_ci		return 0;
8362306a36Sopenharmony_ci	}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	if (srmmu_swprobe_trace)
8662306a36Sopenharmony_ci		printk(KERN_INFO "swprobe:  --- pgd (%x) ---\n", pgd);
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	ptr = (pgd & SRMMU_PTD_PMASK) << 4;
8962306a36Sopenharmony_ci	ptr += ((((vaddr) >> LEON_PGD_SH) & LEON_PGD_M) * 4);
9062306a36Sopenharmony_ci	if (!_pfn_valid(PFN(ptr)))
9162306a36Sopenharmony_ci		return 0;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	pmd = LEON_BYPASS_LOAD_PA(ptr);
9462306a36Sopenharmony_ci	if (((pmd & SRMMU_ET_MASK) == SRMMU_ET_PTE)) {
9562306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
9662306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: pmd is entry level 2\n");
9762306a36Sopenharmony_ci		lvl = 2;
9862306a36Sopenharmony_ci		pte = pmd;
9962306a36Sopenharmony_ci		paddrbase = pmd & _SRMMU_PTE_PMASK_LEON;
10062306a36Sopenharmony_ci		goto ready;
10162306a36Sopenharmony_ci	}
10262306a36Sopenharmony_ci	if (((pmd & SRMMU_ET_MASK) != SRMMU_ET_PTD)) {
10362306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
10462306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: pmd is invalid => 0\n");
10562306a36Sopenharmony_ci		return 0;
10662306a36Sopenharmony_ci	}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	if (srmmu_swprobe_trace)
10962306a36Sopenharmony_ci		printk(KERN_INFO "swprobe:  --- pmd (%x) ---\n", pmd);
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	ptr = (pmd & SRMMU_PTD_PMASK) << 4;
11262306a36Sopenharmony_ci	ptr += (((vaddr >> LEON_PMD_SH) & LEON_PMD_M) * 4);
11362306a36Sopenharmony_ci	if (!_pfn_valid(PFN(ptr))) {
11462306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
11562306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: !_pfn_valid(%x)=>0\n",
11662306a36Sopenharmony_ci			       PFN(ptr));
11762306a36Sopenharmony_ci		return 0;
11862306a36Sopenharmony_ci	}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	ped = LEON_BYPASS_LOAD_PA(ptr);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	if (((ped & SRMMU_ET_MASK) == SRMMU_ET_PTE)) {
12362306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
12462306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: ped is entry level 1\n");
12562306a36Sopenharmony_ci		lvl = 1;
12662306a36Sopenharmony_ci		pte = ped;
12762306a36Sopenharmony_ci		paddrbase = ped & _SRMMU_PTE_PMASK_LEON;
12862306a36Sopenharmony_ci		goto ready;
12962306a36Sopenharmony_ci	}
13062306a36Sopenharmony_ci	if (((ped & SRMMU_ET_MASK) != SRMMU_ET_PTD)) {
13162306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
13262306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: ped is invalid => 0\n");
13362306a36Sopenharmony_ci		return 0;
13462306a36Sopenharmony_ci	}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	if (srmmu_swprobe_trace)
13762306a36Sopenharmony_ci		printk(KERN_INFO "swprobe:  --- ped (%x) ---\n", ped);
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	ptr = (ped & SRMMU_PTD_PMASK) << 4;
14062306a36Sopenharmony_ci	ptr += (((vaddr >> LEON_PTE_SH) & LEON_PTE_M) * 4);
14162306a36Sopenharmony_ci	if (!_pfn_valid(PFN(ptr)))
14262306a36Sopenharmony_ci		return 0;
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	ptr = LEON_BYPASS_LOAD_PA(ptr);
14562306a36Sopenharmony_ci	if (((ptr & SRMMU_ET_MASK) == SRMMU_ET_PTE)) {
14662306a36Sopenharmony_ci		if (srmmu_swprobe_trace)
14762306a36Sopenharmony_ci			printk(KERN_INFO "swprobe: ptr is entry level 0\n");
14862306a36Sopenharmony_ci		lvl = 0;
14962306a36Sopenharmony_ci		pte = ptr;
15062306a36Sopenharmony_ci		paddrbase = ptr & _SRMMU_PTE_PMASK_LEON;
15162306a36Sopenharmony_ci		goto ready;
15262306a36Sopenharmony_ci	}
15362306a36Sopenharmony_ci	if (srmmu_swprobe_trace)
15462306a36Sopenharmony_ci		printk(KERN_INFO "swprobe: ptr is invalid => 0\n");
15562306a36Sopenharmony_ci	return 0;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ciready:
15862306a36Sopenharmony_ci	switch (lvl) {
15962306a36Sopenharmony_ci	case 0:
16062306a36Sopenharmony_ci		paddr_calc =
16162306a36Sopenharmony_ci		    (vaddr & ~(-1 << LEON_PTE_SH)) | ((pte & ~0xff) << 4);
16262306a36Sopenharmony_ci		break;
16362306a36Sopenharmony_ci	case 1:
16462306a36Sopenharmony_ci		paddr_calc =
16562306a36Sopenharmony_ci		    (vaddr & ~(-1 << LEON_PMD_SH)) | ((pte & ~0xff) << 4);
16662306a36Sopenharmony_ci		break;
16762306a36Sopenharmony_ci	case 2:
16862306a36Sopenharmony_ci		paddr_calc =
16962306a36Sopenharmony_ci		    (vaddr & ~(-1 << LEON_PGD_SH)) | ((pte & ~0xff) << 4);
17062306a36Sopenharmony_ci		break;
17162306a36Sopenharmony_ci	default:
17262306a36Sopenharmony_ci	case 3:
17362306a36Sopenharmony_ci		paddr_calc = vaddr;
17462306a36Sopenharmony_ci		break;
17562306a36Sopenharmony_ci	}
17662306a36Sopenharmony_ci	if (srmmu_swprobe_trace)
17762306a36Sopenharmony_ci		printk(KERN_INFO "swprobe: padde %x\n", paddr_calc);
17862306a36Sopenharmony_ci	if (paddr)
17962306a36Sopenharmony_ci		*paddr = paddr_calc;
18062306a36Sopenharmony_ci	return pte;
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_civoid leon_flush_icache_all(void)
18462306a36Sopenharmony_ci{
18562306a36Sopenharmony_ci	__asm__ __volatile__(" flush ");	/*iflush*/
18662306a36Sopenharmony_ci}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_civoid leon_flush_dcache_all(void)
18962306a36Sopenharmony_ci{
19062306a36Sopenharmony_ci	__asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : :
19162306a36Sopenharmony_ci			     "i"(ASI_LEON_DFLUSH) : "memory");
19262306a36Sopenharmony_ci}
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_civoid leon_flush_pcache_all(struct vm_area_struct *vma, unsigned long page)
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	if (vma->vm_flags & VM_EXEC)
19762306a36Sopenharmony_ci		leon_flush_icache_all();
19862306a36Sopenharmony_ci	leon_flush_dcache_all();
19962306a36Sopenharmony_ci}
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_civoid leon_flush_cache_all(void)
20262306a36Sopenharmony_ci{
20362306a36Sopenharmony_ci	__asm__ __volatile__(" flush ");	/*iflush*/
20462306a36Sopenharmony_ci	__asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : :
20562306a36Sopenharmony_ci			     "i"(ASI_LEON_DFLUSH) : "memory");
20662306a36Sopenharmony_ci}
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_civoid leon_flush_tlb_all(void)
20962306a36Sopenharmony_ci{
21062306a36Sopenharmony_ci	leon_flush_cache_all();
21162306a36Sopenharmony_ci	__asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : "r"(0x400),
21262306a36Sopenharmony_ci			     "i"(ASI_LEON_MMUFLUSH) : "memory");
21362306a36Sopenharmony_ci}
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci/* get all cache regs */
21662306a36Sopenharmony_civoid leon3_getCacheRegs(struct leon3_cacheregs *regs)
21762306a36Sopenharmony_ci{
21862306a36Sopenharmony_ci	unsigned long ccr, iccr, dccr;
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	if (!regs)
22162306a36Sopenharmony_ci		return;
22262306a36Sopenharmony_ci	/* Get Cache regs from "Cache ASI" address 0x0, 0x8 and 0xC */
22362306a36Sopenharmony_ci	__asm__ __volatile__("lda [%%g0] %3, %0\n\t"
22462306a36Sopenharmony_ci			     "mov 0x08, %%g1\n\t"
22562306a36Sopenharmony_ci			     "lda [%%g1] %3, %1\n\t"
22662306a36Sopenharmony_ci			     "mov 0x0c, %%g1\n\t"
22762306a36Sopenharmony_ci			     "lda [%%g1] %3, %2\n\t"
22862306a36Sopenharmony_ci			     : "=r"(ccr), "=r"(iccr), "=r"(dccr)
22962306a36Sopenharmony_ci			       /* output */
23062306a36Sopenharmony_ci			     : "i"(ASI_LEON_CACHEREGS)	/* input */
23162306a36Sopenharmony_ci			     : "g1"	/* clobber list */
23262306a36Sopenharmony_ci	    );
23362306a36Sopenharmony_ci	regs->ccr = ccr;
23462306a36Sopenharmony_ci	regs->iccr = iccr;
23562306a36Sopenharmony_ci	regs->dccr = dccr;
23662306a36Sopenharmony_ci}
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci/* Due to virtual cache we need to check cache configuration if
23962306a36Sopenharmony_ci * it is possible to skip flushing in some cases.
24062306a36Sopenharmony_ci *
24162306a36Sopenharmony_ci * Leon2 and Leon3 differ in their way of telling cache information
24262306a36Sopenharmony_ci *
24362306a36Sopenharmony_ci */
24462306a36Sopenharmony_ciint __init leon_flush_needed(void)
24562306a36Sopenharmony_ci{
24662306a36Sopenharmony_ci	int flush_needed = -1;
24762306a36Sopenharmony_ci	unsigned int ssize, sets;
24862306a36Sopenharmony_ci	char *setStr[4] =
24962306a36Sopenharmony_ci	    { "direct mapped", "2-way associative", "3-way associative",
25062306a36Sopenharmony_ci		"4-way associative"
25162306a36Sopenharmony_ci	};
25262306a36Sopenharmony_ci	/* leon 3 */
25362306a36Sopenharmony_ci	struct leon3_cacheregs cregs;
25462306a36Sopenharmony_ci	leon3_getCacheRegs(&cregs);
25562306a36Sopenharmony_ci	sets = (cregs.dccr & LEON3_XCCR_SETS_MASK) >> 24;
25662306a36Sopenharmony_ci	/* (ssize=>realsize) 0=>1k, 1=>2k, 2=>4k, 3=>8k ... */
25762306a36Sopenharmony_ci	ssize = 1 << ((cregs.dccr & LEON3_XCCR_SSIZE_MASK) >> 20);
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	printk(KERN_INFO "CACHE: %s cache, set size %dk\n",
26062306a36Sopenharmony_ci	       sets > 3 ? "unknown" : setStr[sets], ssize);
26162306a36Sopenharmony_ci	if ((ssize <= (PAGE_SIZE / 1024)) && (sets == 0)) {
26262306a36Sopenharmony_ci		/* Set Size <= Page size  ==>
26362306a36Sopenharmony_ci		   flush on every context switch not needed. */
26462306a36Sopenharmony_ci		flush_needed = 0;
26562306a36Sopenharmony_ci		printk(KERN_INFO "CACHE: not flushing on every context switch\n");
26662306a36Sopenharmony_ci	}
26762306a36Sopenharmony_ci	return flush_needed;
26862306a36Sopenharmony_ci}
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_civoid leon_switch_mm(void)
27162306a36Sopenharmony_ci{
27262306a36Sopenharmony_ci	flush_tlb_mm((void *)0);
27362306a36Sopenharmony_ci	if (leon_flush_during_switch)
27462306a36Sopenharmony_ci		leon_flush_cache_all();
27562306a36Sopenharmony_ci}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistatic void leon_flush_cache_mm(struct mm_struct *mm)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	leon_flush_cache_all();
28062306a36Sopenharmony_ci}
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistatic void leon_flush_cache_page(struct vm_area_struct *vma, unsigned long page)
28362306a36Sopenharmony_ci{
28462306a36Sopenharmony_ci	leon_flush_pcache_all(vma, page);
28562306a36Sopenharmony_ci}
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_cistatic void leon_flush_cache_range(struct vm_area_struct *vma,
28862306a36Sopenharmony_ci				   unsigned long start,
28962306a36Sopenharmony_ci				   unsigned long end)
29062306a36Sopenharmony_ci{
29162306a36Sopenharmony_ci	leon_flush_cache_all();
29262306a36Sopenharmony_ci}
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_cistatic void leon_flush_tlb_mm(struct mm_struct *mm)
29562306a36Sopenharmony_ci{
29662306a36Sopenharmony_ci	leon_flush_tlb_all();
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_cistatic void leon_flush_tlb_page(struct vm_area_struct *vma,
30062306a36Sopenharmony_ci				unsigned long page)
30162306a36Sopenharmony_ci{
30262306a36Sopenharmony_ci	leon_flush_tlb_all();
30362306a36Sopenharmony_ci}
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cistatic void leon_flush_tlb_range(struct vm_area_struct *vma,
30662306a36Sopenharmony_ci				 unsigned long start,
30762306a36Sopenharmony_ci				 unsigned long end)
30862306a36Sopenharmony_ci{
30962306a36Sopenharmony_ci	leon_flush_tlb_all();
31062306a36Sopenharmony_ci}
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_cistatic void leon_flush_page_to_ram(unsigned long page)
31362306a36Sopenharmony_ci{
31462306a36Sopenharmony_ci	leon_flush_cache_all();
31562306a36Sopenharmony_ci}
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_cistatic void leon_flush_sig_insns(struct mm_struct *mm, unsigned long page)
31862306a36Sopenharmony_ci{
31962306a36Sopenharmony_ci	leon_flush_cache_all();
32062306a36Sopenharmony_ci}
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cistatic void leon_flush_page_for_dma(unsigned long page)
32362306a36Sopenharmony_ci{
32462306a36Sopenharmony_ci	leon_flush_dcache_all();
32562306a36Sopenharmony_ci}
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_civoid __init poke_leonsparc(void)
32862306a36Sopenharmony_ci{
32962306a36Sopenharmony_ci}
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_cistatic const struct sparc32_cachetlb_ops leon_ops = {
33262306a36Sopenharmony_ci	.cache_all	= leon_flush_cache_all,
33362306a36Sopenharmony_ci	.cache_mm	= leon_flush_cache_mm,
33462306a36Sopenharmony_ci	.cache_page	= leon_flush_cache_page,
33562306a36Sopenharmony_ci	.cache_range	= leon_flush_cache_range,
33662306a36Sopenharmony_ci	.tlb_all	= leon_flush_tlb_all,
33762306a36Sopenharmony_ci	.tlb_mm		= leon_flush_tlb_mm,
33862306a36Sopenharmony_ci	.tlb_page	= leon_flush_tlb_page,
33962306a36Sopenharmony_ci	.tlb_range	= leon_flush_tlb_range,
34062306a36Sopenharmony_ci	.page_to_ram	= leon_flush_page_to_ram,
34162306a36Sopenharmony_ci	.sig_insns	= leon_flush_sig_insns,
34262306a36Sopenharmony_ci	.page_for_dma	= leon_flush_page_for_dma,
34362306a36Sopenharmony_ci};
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_civoid __init init_leon(void)
34662306a36Sopenharmony_ci{
34762306a36Sopenharmony_ci	srmmu_name = "LEON";
34862306a36Sopenharmony_ci	sparc32_cachetlb_ops = &leon_ops;
34962306a36Sopenharmony_ci	poke_srmmu = poke_leonsparc;
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	leon_flush_during_switch = leon_flush_needed();
35262306a36Sopenharmony_ci}
353