Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 75d9e346 authored by Konrad Eisele's avatar Konrad Eisele Committed by David S. Miller
Browse files

sparc, leon: sparc-leon specific SRMMU initialization and bootup fixes.



The sparc-leon caches are virtually tagged so a flush is needed on ctx
switch.

Signed-off-by: default avatarKonrad Eisele <konrad@gaisler.com>
Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e63829de
Loading
Loading
Loading
Loading
+52 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@
#include <asm/tsunami.h>
#include <asm/swift.h>
#include <asm/turbosparc.h>
#include <asm/leon.h>

#include <asm/btfixup.h>

@@ -569,6 +570,9 @@ static void srmmu_switch_mm(struct mm_struct *old_mm, struct mm_struct *mm,
		srmmu_ctxd_set(&srmmu_context_table[mm->context], mm->pgd);
	}

	if (sparc_cpu_model == sparc_leon)
		leon_switch_mm();

	if (is_hypersparc)
		hyper_flush_whole_icache();

@@ -1977,6 +1981,45 @@ static void __init init_viking(void)
	poke_srmmu = poke_viking;
}

#ifdef CONFIG_SPARC_LEON

void __init poke_leonsparc(void)
{
}

void __init init_leon(void)
{

	srmmu_name = "Leon";

	BTFIXUPSET_CALL(flush_cache_all, leon_flush_cache_all,
			BTFIXUPCALL_NORM);
	BTFIXUPSET_CALL(flush_cache_mm, leon_flush_cache_all,
			BTFIXUPCALL_NORM);
	BTFIXUPSET_CALL(flush_cache_page, leon_flush_pcache_all,
			BTFIXUPCALL_NORM);
	BTFIXUPSET_CALL(flush_cache_range, leon_flush_cache_all,
			BTFIXUPCALL_NORM);
	BTFIXUPSET_CALL(flush_page_for_dma, leon_flush_dcache_all,
			BTFIXUPCALL_NORM);

	BTFIXUPSET_CALL(flush_tlb_all, leon_flush_tlb_all, BTFIXUPCALL_NORM);
	BTFIXUPSET_CALL(flush_tlb_mm, leon_flush_tlb_all, BTFIXUPCALL_NORM);
	BTFIXUPSET_CALL(flush_tlb_page, leon_flush_tlb_all, BTFIXUPCALL_NORM);
	BTFIXUPSET_CALL(flush_tlb_range, leon_flush_tlb_all, BTFIXUPCALL_NORM);

	BTFIXUPSET_CALL(__flush_page_to_ram, leon_flush_cache_all,
			BTFIXUPCALL_NOP);
	BTFIXUPSET_CALL(flush_sig_insns, leon_flush_cache_all, BTFIXUPCALL_NOP);

	poke_srmmu = poke_leonsparc;

	srmmu_cache_pagetables = 0;

	leon_flush_during_switch = leon_flush_needed();
}
#endif

/* Probe for the srmmu chip version. */
static void __init get_srmmu_type(void)
{
@@ -1992,7 +2035,15 @@ static void __init get_srmmu_type(void)
	psr_typ = (psr >> 28) & 0xf;
	psr_vers = (psr >> 24) & 0xf;

	/* First, check for HyperSparc or Cypress. */
	/* First, check for sparc-leon. */
	if (sparc_cpu_model == sparc_leon) {
		psr_typ = 0xf;	/* hardcoded ids for older models/simulators */
		psr_vers = 2;
		init_leon();
		return;
	}

	/* Second, check for HyperSparc or Cypress. */
	if(mod_typ == 1) {
		switch(mod_rev) {
		case 7: