* [PATCH] MIPS: R10000: Split R10000 definitions from R12000 and up
@ 2015-01-19 8:56 Joshua Kinard
2015-01-21 11:37 ` Joshua Kinard
0 siblings, 1 reply; 3+ messages in thread
From: Joshua Kinard @ 2015-01-19 8:56 UTC (permalink / raw)
To: Ralf Baechle; +Cc: Linux MIPS List
From: Joshua Kinard <kumba@gentoo.org>
This patch splits the old R10000 definitions so that the R10000_LLSC_WAR can be
disabled and -mno-fix-r10000 passed to CFLAGS for systems running R12000 CPUs
and greater. This allows the kernel to build without branch-likely
instructions, which are considered deprecated in current MIPS implementations.
Only R10000 systems with R2.6 and lower CPUs require branch-likely to work
around a known hardware errata item.
Verified on both an SGI Onyx2 and an SGI Octane.
Signed-off-by: Joshua Kinard <kumba@gentoo.org>
---
arch/mips/Kconfig | 18 +++++++++++++++++-
arch/mips/Makefile | 3 +++
arch/mips/include/asm/hazards.h | 3 ++-
arch/mips/include/asm/mach-ip27/war.h | 7 ++++++-
arch/mips/include/asm/module.h | 2 ++
arch/mips/sgi-ip27/Platform | 15 ++++++++-------
arch/mips/sgi-ip32/Platform | 2 ++
drivers/video/fbdev/gbefb.c | 2 +-
8 files changed, 41 insertions(+), 11 deletions(-)
linux-mips-split-r10k-family.patch
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 73983e1..b526133 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -551,6 +551,7 @@ config SGI_IP27
select HW_HAS_PCI
select NR_CPUS_DEFAULT_64
select SYS_HAS_CPU_R10000
+ select SYS_HAS_CPU_R12K_R14K_R16K
select SYS_SUPPORTS_64BIT_KERNEL
select SYS_SUPPORTS_BIG_ENDIAN
select SYS_SUPPORTS_NUMA
@@ -612,6 +613,7 @@ config SGI_IP32
select RM7000_CPU_SCACHE
select SYS_HAS_CPU_R5000
select SYS_HAS_CPU_R10000 if BROKEN
+ select SYS_HAS_CPU_R12K_R14K_R16K if BROKEN
select SYS_HAS_CPU_RM7000
select SYS_HAS_CPU_NEVADA
select SYS_SUPPORTS_64BIT_KERNEL
@@ -1456,7 +1458,18 @@ config CPU_R10000
select CPU_SUPPORTS_HIGHMEM
select CPU_SUPPORTS_HUGEPAGES
help
- MIPS Technologies R10000-series processors.
+ MIPS Technologies R10000 processor.
+
+config CPU_R12K_R14K_R16K
+ bool "R12k/R14k/R16k"
+ depends on SYS_HAS_CPU_R12K_R14K_R16K
+ select CPU_HAS_PREFETCH
+ select CPU_SUPPORTS_32BIT_KERNEL
+ select CPU_SUPPORTS_64BIT_KERNEL
+ select CPU_SUPPORTS_HIGHMEM
+ select CPU_SUPPORTS_HUGEPAGES
+ help
+ MIPS Technologies R12k/R14k/R16k-series processors.
config CPU_RM7000
bool "RM7000"
@@ -1704,6 +1717,9 @@ config SYS_HAS_CPU_R8000
config SYS_HAS_CPU_R10000
bool
+config SYS_HAS_CPU_R12K_R14K_R16K
+ bool
+
config SYS_HAS_CPU_RM7000
bool
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 37fce70..abccbb2 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -176,6 +176,9 @@ cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-mno-mips3d)
cflags-$(CONFIG_CPU_R8000) += -march=r8000 -Wa,--trap
cflags-$(CONFIG_CPU_R10000) += $(call cc-option,-march=r10000,-march=r8000) \
-Wa,--trap
+cflags-$(CONFIG_CPU_R12K_R14K_R16K) += $(call cc-option,-march=r12000,-march=r8000) \
+ $(call cc-option,-mno-fix-r10000,) \
+ -Wa,--trap
cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += $(call cc-option,-march=octeon) -Wa,--trap
ifeq (,$(findstring march=octeon, $(cflags-$(CONFIG_CPU_CAVIUM_OCTEON))))
cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += -Wa,-march=octeon
diff --git a/arch/mips/include/asm/hazards.h b/arch/mips/include/asm/hazards.h
index e3ee92d..0b565e5 100644
--- a/arch/mips/include/asm/hazards.h
+++ b/arch/mips/include/asm/hazards.h
@@ -138,7 +138,8 @@ do { \
#elif defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_CPU_CAVIUM_OCTEON) || \
defined(CONFIG_CPU_LOONGSON2) || defined(CONFIG_CPU_R10000) || \
- defined(CONFIG_CPU_R5500) || defined(CONFIG_CPU_XLR)
+ defined(CONFIG_CPU_R12K_R14K_R16K) || defined(CONFIG_CPU_R5500) || \
+ defined(CONFIG_CPU_XLR)
/*
* R10000 rocks - all hazards handled in hardware, so this becomes a nobrainer.
diff --git a/arch/mips/include/asm/mach-ip27/war.h b/arch/mips/include/asm/mach-ip27/war.h
index 4ee0e4b..e901a81 100644
--- a/arch/mips/include/asm/mach-ip27/war.h
+++ b/arch/mips/include/asm/mach-ip27/war.h
@@ -18,7 +18,12 @@
#define MIPS_CACHE_SYNC_WAR 0
#define TX49XX_ICACHE_INDEX_INV_WAR 0
#define ICACHE_REFILLS_WORKAROUND_WAR 0
-#define R10000_LLSC_WAR 1
#define MIPS34K_MISSED_ITLB_WAR 0
+#ifdef CONFIG_CPU_R10000
+#define R10000_LLSC_WAR 1
+#else
+#define R10000_LLSC_WAR 0
+#endif
+
#endif /* __ASM_MIPS_MACH_IP27_WAR_H */
diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h
index 800fe57..394dee4 100644
--- a/arch/mips/include/asm/module.h
+++ b/arch/mips/include/asm/module.h
@@ -118,6 +118,8 @@ search_module_dbetables(unsigned long addr)
#define MODULE_PROC_FAMILY "R8000 "
#elif defined CONFIG_CPU_R10000
#define MODULE_PROC_FAMILY "R10000 "
+#elif defined CONFIG_CPU_R12K_R14K_R16K
+#define MODULE_PROC_FAMILY "R12K/R14K/R16K "
#elif defined CONFIG_CPU_RM7000
#define MODULE_PROC_FAMILY "RM7000 "
#elif defined CONFIG_CPU_SB1
diff --git a/arch/mips/sgi-ip27/Platform b/arch/mips/sgi-ip27/Platform
index 1fb9c2e..4ad7060 100644
--- a/arch/mips/sgi-ip27/Platform
+++ b/arch/mips/sgi-ip27/Platform
@@ -6,14 +6,15 @@
# be 16kb aligned or the handling of the current variable will break.
#
ifdef CONFIG_SGI_IP27
-platform-$(CONFIG_SGI_IP27) += sgi-ip27/
-cflags-$(CONFIG_SGI_IP27) += -I$(srctree)/arch/mips/include/asm/mach-ip27
+platform-$(CONFIG_SGI_IP27) += sgi-ip27/
+cflags-$(CONFIG_SGI_IP27) += -I$(srctree)/arch/mips/include/asm/mach-ip27
+cflags-$(CONFIG_CPU_R12K_R14K_R16K) += -mno-fix-r10000
ifdef CONFIG_MAPPED_KERNEL
-load-$(CONFIG_SGI_IP27) += 0xc00000004001c000
-OBJCOPYFLAGS := --change-addresses=0x3fffffff80000000
-dataoffset-$(CONFIG_SGI_IP27) += 0x01000000
+load-$(CONFIG_SGI_IP27) += 0xc00000004001c000
+OBJCOPYFLAGS := --change-addresses=0x3fffffff80000000
+dataoffset-$(CONFIG_SGI_IP27) += 0x01000000
else
-load-$(CONFIG_SGI_IP27) += 0xa80000000001c000
-OBJCOPYFLAGS := --change-addresses=0x57ffffff80000000
+load-$(CONFIG_SGI_IP27) += 0xa80000000001c000
+OBJCOPYFLAGS := --change-addresses=0x57ffffff80000000
endif
endif
diff --git a/arch/mips/sgi-ip32/Platform b/arch/mips/sgi-ip32/Platform
index 0fea556..5899305 100644
--- a/arch/mips/sgi-ip32/Platform
+++ b/arch/mips/sgi-ip32/Platform
@@ -8,4 +8,6 @@
#
platform-$(CONFIG_SGI_IP32) += sgi-ip32/
cflags-$(CONFIG_SGI_IP32) += -I$(srctree)/arch/mips/include/asm/mach-ip32
+cflags-$(CONFIG_CPU_R10000) += -mr10k-cache-barrier=load-store
+cflags-$(CONFIG_CPU_R12K_R14K_R16K) += -mno-fix-r10000 -mr10k-cache-barrier=load-store
load-$(CONFIG_SGI_IP32) += 0xffffffff80004000
diff --git a/drivers/video/fbdev/gbefb.c b/drivers/video/fbdev/gbefb.c
index 6d9ef39..c5dc991 100644
--- a/drivers/video/fbdev/gbefb.c
+++ b/drivers/video/fbdev/gbefb.c
@@ -47,7 +47,7 @@ struct gbefb_par {
/* macro for fastest write-though access to the framebuffer */
#ifdef CONFIG_MIPS
-#ifdef CONFIG_CPU_R10000
+#if defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_R12K_R14K_R16K)
#define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_UNCACHED_ACCELERATED)
#else
#define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_CACHABLE_NO_WA)
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] MIPS: R10000: Split R10000 definitions from R12000 and up
@ 2015-01-21 11:37 ` Joshua Kinard
0 siblings, 0 replies; 3+ messages in thread
From: Joshua Kinard @ 2015-01-21 11:37 UTC (permalink / raw)
To: Ralf Baechle; +Cc: Linux MIPS List
On 01/19/2015 03:56, Joshua Kinard wrote:
> From: Joshua Kinard <kumba@gentoo.org>
>
> This patch splits the old R10000 definitions so that the R10000_LLSC_WAR can be
> disabled and -mno-fix-r10000 passed to CFLAGS for systems running R12000 CPUs
> and greater. This allows the kernel to build without branch-likely
> instructions, which are considered deprecated in current MIPS implementations.
> Only R10000 systems with R2.6 and lower CPUs require branch-likely to work
> around a known hardware errata item.
From the R16000 discussion, it appears I missed the bits in __get_cpu_type, so
ignore this patch for now. I'll send another when I account for that function,
and double check I didn't miss any other R10K areas.
--J
> Verified on both an SGI Onyx2 and an SGI Octane.
>
> Signed-off-by: Joshua Kinard <kumba@gentoo.org>
> ---
> arch/mips/Kconfig | 18 +++++++++++++++++-
> arch/mips/Makefile | 3 +++
> arch/mips/include/asm/hazards.h | 3 ++-
> arch/mips/include/asm/mach-ip27/war.h | 7 ++++++-
> arch/mips/include/asm/module.h | 2 ++
> arch/mips/sgi-ip27/Platform | 15 ++++++++-------
> arch/mips/sgi-ip32/Platform | 2 ++
> drivers/video/fbdev/gbefb.c | 2 +-
> 8 files changed, 41 insertions(+), 11 deletions(-)
>
> linux-mips-split-r10k-family.patch
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 73983e1..b526133 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -551,6 +551,7 @@ config SGI_IP27
> select HW_HAS_PCI
> select NR_CPUS_DEFAULT_64
> select SYS_HAS_CPU_R10000
> + select SYS_HAS_CPU_R12K_R14K_R16K
> select SYS_SUPPORTS_64BIT_KERNEL
> select SYS_SUPPORTS_BIG_ENDIAN
> select SYS_SUPPORTS_NUMA
> @@ -612,6 +613,7 @@ config SGI_IP32
> select RM7000_CPU_SCACHE
> select SYS_HAS_CPU_R5000
> select SYS_HAS_CPU_R10000 if BROKEN
> + select SYS_HAS_CPU_R12K_R14K_R16K if BROKEN
> select SYS_HAS_CPU_RM7000
> select SYS_HAS_CPU_NEVADA
> select SYS_SUPPORTS_64BIT_KERNEL
> @@ -1456,7 +1458,18 @@ config CPU_R10000
> select CPU_SUPPORTS_HIGHMEM
> select CPU_SUPPORTS_HUGEPAGES
> help
> - MIPS Technologies R10000-series processors.
> + MIPS Technologies R10000 processor.
> +
> +config CPU_R12K_R14K_R16K
> + bool "R12k/R14k/R16k"
> + depends on SYS_HAS_CPU_R12K_R14K_R16K
> + select CPU_HAS_PREFETCH
> + select CPU_SUPPORTS_32BIT_KERNEL
> + select CPU_SUPPORTS_64BIT_KERNEL
> + select CPU_SUPPORTS_HIGHMEM
> + select CPU_SUPPORTS_HUGEPAGES
> + help
> + MIPS Technologies R12k/R14k/R16k-series processors.
>
> config CPU_RM7000
> bool "RM7000"
> @@ -1704,6 +1717,9 @@ config SYS_HAS_CPU_R8000
> config SYS_HAS_CPU_R10000
> bool
>
> +config SYS_HAS_CPU_R12K_R14K_R16K
> + bool
> +
> config SYS_HAS_CPU_RM7000
> bool
>
> diff --git a/arch/mips/Makefile b/arch/mips/Makefile
> index 37fce70..abccbb2 100644
> --- a/arch/mips/Makefile
> +++ b/arch/mips/Makefile
> @@ -176,6 +176,9 @@ cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-mno-mips3d)
> cflags-$(CONFIG_CPU_R8000) += -march=r8000 -Wa,--trap
> cflags-$(CONFIG_CPU_R10000) += $(call cc-option,-march=r10000,-march=r8000) \
> -Wa,--trap
> +cflags-$(CONFIG_CPU_R12K_R14K_R16K) += $(call cc-option,-march=r12000,-march=r8000) \
> + $(call cc-option,-mno-fix-r10000,) \
> + -Wa,--trap
> cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += $(call cc-option,-march=octeon) -Wa,--trap
> ifeq (,$(findstring march=octeon, $(cflags-$(CONFIG_CPU_CAVIUM_OCTEON))))
> cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += -Wa,-march=octeon
> diff --git a/arch/mips/include/asm/hazards.h b/arch/mips/include/asm/hazards.h
> index e3ee92d..0b565e5 100644
> --- a/arch/mips/include/asm/hazards.h
> +++ b/arch/mips/include/asm/hazards.h
> @@ -138,7 +138,8 @@ do { \
>
> #elif defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_CPU_CAVIUM_OCTEON) || \
> defined(CONFIG_CPU_LOONGSON2) || defined(CONFIG_CPU_R10000) || \
> - defined(CONFIG_CPU_R5500) || defined(CONFIG_CPU_XLR)
> + defined(CONFIG_CPU_R12K_R14K_R16K) || defined(CONFIG_CPU_R5500) || \
> + defined(CONFIG_CPU_XLR)
>
> /*
> * R10000 rocks - all hazards handled in hardware, so this becomes a nobrainer.
> diff --git a/arch/mips/include/asm/mach-ip27/war.h b/arch/mips/include/asm/mach-ip27/war.h
> index 4ee0e4b..e901a81 100644
> --- a/arch/mips/include/asm/mach-ip27/war.h
> +++ b/arch/mips/include/asm/mach-ip27/war.h
> @@ -18,7 +18,12 @@
> #define MIPS_CACHE_SYNC_WAR 0
> #define TX49XX_ICACHE_INDEX_INV_WAR 0
> #define ICACHE_REFILLS_WORKAROUND_WAR 0
> -#define R10000_LLSC_WAR 1
> #define MIPS34K_MISSED_ITLB_WAR 0
>
> +#ifdef CONFIG_CPU_R10000
> +#define R10000_LLSC_WAR 1
> +#else
> +#define R10000_LLSC_WAR 0
> +#endif
> +
> #endif /* __ASM_MIPS_MACH_IP27_WAR_H */
> diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h
> index 800fe57..394dee4 100644
> --- a/arch/mips/include/asm/module.h
> +++ b/arch/mips/include/asm/module.h
> @@ -118,6 +118,8 @@ search_module_dbetables(unsigned long addr)
> #define MODULE_PROC_FAMILY "R8000 "
> #elif defined CONFIG_CPU_R10000
> #define MODULE_PROC_FAMILY "R10000 "
> +#elif defined CONFIG_CPU_R12K_R14K_R16K
> +#define MODULE_PROC_FAMILY "R12K/R14K/R16K "
> #elif defined CONFIG_CPU_RM7000
> #define MODULE_PROC_FAMILY "RM7000 "
> #elif defined CONFIG_CPU_SB1
> diff --git a/arch/mips/sgi-ip27/Platform b/arch/mips/sgi-ip27/Platform
> index 1fb9c2e..4ad7060 100644
> --- a/arch/mips/sgi-ip27/Platform
> +++ b/arch/mips/sgi-ip27/Platform
> @@ -6,14 +6,15 @@
> # be 16kb aligned or the handling of the current variable will break.
> #
> ifdef CONFIG_SGI_IP27
> -platform-$(CONFIG_SGI_IP27) += sgi-ip27/
> -cflags-$(CONFIG_SGI_IP27) += -I$(srctree)/arch/mips/include/asm/mach-ip27
> +platform-$(CONFIG_SGI_IP27) += sgi-ip27/
> +cflags-$(CONFIG_SGI_IP27) += -I$(srctree)/arch/mips/include/asm/mach-ip27
> +cflags-$(CONFIG_CPU_R12K_R14K_R16K) += -mno-fix-r10000
> ifdef CONFIG_MAPPED_KERNEL
> -load-$(CONFIG_SGI_IP27) += 0xc00000004001c000
> -OBJCOPYFLAGS := --change-addresses=0x3fffffff80000000
> -dataoffset-$(CONFIG_SGI_IP27) += 0x01000000
> +load-$(CONFIG_SGI_IP27) += 0xc00000004001c000
> +OBJCOPYFLAGS := --change-addresses=0x3fffffff80000000
> +dataoffset-$(CONFIG_SGI_IP27) += 0x01000000
> else
> -load-$(CONFIG_SGI_IP27) += 0xa80000000001c000
> -OBJCOPYFLAGS := --change-addresses=0x57ffffff80000000
> +load-$(CONFIG_SGI_IP27) += 0xa80000000001c000
> +OBJCOPYFLAGS := --change-addresses=0x57ffffff80000000
> endif
> endif
> diff --git a/arch/mips/sgi-ip32/Platform b/arch/mips/sgi-ip32/Platform
> index 0fea556..5899305 100644
> --- a/arch/mips/sgi-ip32/Platform
> +++ b/arch/mips/sgi-ip32/Platform
> @@ -8,4 +8,6 @@
> #
> platform-$(CONFIG_SGI_IP32) += sgi-ip32/
> cflags-$(CONFIG_SGI_IP32) += -I$(srctree)/arch/mips/include/asm/mach-ip32
> +cflags-$(CONFIG_CPU_R10000) += -mr10k-cache-barrier=load-store
> +cflags-$(CONFIG_CPU_R12K_R14K_R16K) += -mno-fix-r10000 -mr10k-cache-barrier=load-store
> load-$(CONFIG_SGI_IP32) += 0xffffffff80004000
> diff --git a/drivers/video/fbdev/gbefb.c b/drivers/video/fbdev/gbefb.c
> index 6d9ef39..c5dc991 100644
> --- a/drivers/video/fbdev/gbefb.c
> +++ b/drivers/video/fbdev/gbefb.c
> @@ -47,7 +47,7 @@ struct gbefb_par {
>
> /* macro for fastest write-though access to the framebuffer */
> #ifdef CONFIG_MIPS
> -#ifdef CONFIG_CPU_R10000
> +#if defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_R12K_R14K_R16K)
> #define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_UNCACHED_ACCELERATED)
> #else
> #define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_CACHABLE_NO_WA)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] MIPS: R10000: Split R10000 definitions from R12000 and up
@ 2015-01-21 11:37 ` Joshua Kinard
0 siblings, 0 replies; 3+ messages in thread
From: Joshua Kinard @ 2015-01-21 11:37 UTC (permalink / raw)
To: Ralf Baechle; +Cc: Linux MIPS List
On 01/19/2015 03:56, Joshua Kinard wrote:
> From: Joshua Kinard <kumba@gentoo.org>
>
> This patch splits the old R10000 definitions so that the R10000_LLSC_WAR can be
> disabled and -mno-fix-r10000 passed to CFLAGS for systems running R12000 CPUs
> and greater. This allows the kernel to build without branch-likely
> instructions, which are considered deprecated in current MIPS implementations.
> Only R10000 systems with R2.6 and lower CPUs require branch-likely to work
> around a known hardware errata item.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-01-21 11:38 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-19 8:56 [PATCH] MIPS: R10000: Split R10000 definitions from R12000 and up Joshua Kinard
2015-01-21 11:37 ` Joshua Kinard
2015-01-21 11:37 ` Joshua Kinard
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.