Skip to content

Commit

Permalink
MIPS: Convert ICACHE_REFILLS_WORKAROUND_WAR into a config option
Browse files Browse the repository at this point in the history
Use a new config option to enable I-cache refill workaround and remove
define from different war.h files.

Signed-off-by: Thomas Bogendoerfer <[email protected]>
  • Loading branch information
tsbogend committed Sep 7, 2020
1 parent 24a1c02 commit 886ee13
Show file tree
Hide file tree
Showing 15 changed files with 16 additions and 23 deletions.
9 changes: 9 additions & 0 deletions arch/mips/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,7 @@ config MIPS_MALTA
select SYS_SUPPORTS_VPE_LOADER
select SYS_SUPPORTS_ZBOOT
select USE_OF
select WAR_ICACHE_REFILLS
select ZONE_DMA32 if 64BIT
help
This enables support for the MIPS Technologies Malta evaluation
Expand Down Expand Up @@ -756,6 +757,7 @@ config SGI_IP32
select SYS_HAS_CPU_NEVADA
select SYS_SUPPORTS_64BIT_KERNEL
select SYS_SUPPORTS_BIG_ENDIAN
select WAR_ICACHE_REFILLS
help
If you want this kernel to run on SGI O2 workstation, say Y here.

Expand Down Expand Up @@ -2666,6 +2668,13 @@ config WAR_R4600_V2_HIT_CACHEOP
config WAR_TX49XX_ICACHE_INDEX_INV
bool

# The RM7000 processors and the E9000 cores have a bug (though PMC-Sierra
# opposes it being called that) where invalid instructions in the same
# I-cache line worth of instructions being fetched may case spurious
# exceptions.
config WAR_ICACHE_REFILLS
bool

#
# - Highmem only makes sense for the 32-bit kernel.
# - The current highmem code will only work properly on physically indexed
Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-cavium-octeon/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-generic/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-ip22/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-ip27/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 1
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-ip28/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 1
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-ip30/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#ifdef CONFIG_CPU_R10000
#define R10000_LLSC_WAR 1
#else
Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-ip32/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 1
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-malta/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 1
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-rc32434/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-rm/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-sibyte/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ extern int sb1250_m3_workaround_needed(void);

#endif

#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
1 change: 0 additions & 1 deletion arch/mips/include/asm/mach-tx49xx/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define BCM1250_M3_WAR 0
#define SIBYTE_1956_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
#define R10000_LLSC_WAR 0
#define MIPS34K_MISSED_ITLB_WAR 0

Expand Down
10 changes: 0 additions & 10 deletions arch/mips/include/asm/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,6 @@
#error Check setting of SIBYTE_1956_WAR for your platform
#endif

/*
* The RM7000 processors and the E9000 cores have a bug (though PMC-Sierra
* opposes it being called that) where invalid instructions in the same
* I-cache line worth of instructions being fetched may case spurious
* exceptions.
*/
#ifndef ICACHE_REFILLS_WORKAROUND_WAR
#error Check setting of ICACHE_REFILLS_WORKAROUND_WAR for your platform
#endif

/*
* On the R10000 up to version 2.6 (not sure about 2.7) there is a bug that
* may cause ll / sc and lld / scd sequences to execute non-atomically.
Expand Down
8 changes: 7 additions & 1 deletion arch/mips/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,12 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
return err ?: protected_restore_fp_context(sc);
}

#ifdef CONFIG_WAR_ICACHE_REFILLS
#define SIGMASK ~(cpu_icache_line_size()-1)
#else
#define SIGMASK ALMASK
#endif

void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
size_t frame_size)
{
Expand All @@ -565,7 +571,7 @@ void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,

sp = sigsp(sp, ksig);

return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? ~(cpu_icache_line_size()-1) : ALMASK));
return (void __user *)((sp - frame_size) & SIGMASK);
}

/*
Expand Down

0 comments on commit 886ee13

Please sign in to comment.