* [PATCH v4 1/4] Loongson: Add CPU_LOONGSON2F_WORKAROUNDS
2010-04-07 13:11 [PATCH v4 0/4] Workaround the Out-of-order Issue of Loongson-2 Wu Zhangjin
@ 2010-04-07 13:11 ` Wu Zhangjin
2010-04-07 13:11 ` [PATCH v4 2/4] Loongson-2F: Enable fixups of the latest binutils Wu Zhangjin
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Wu Zhangjin @ 2010-04-07 13:11 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips, Wu Zhangjin
From: Wu Zhangjin <wuzhangjin@gmail.com>
As the Loongson2F User Manual[2,3] shows, the old Loongson2F series(2F01/02)
have the NOP & JUMP issues, need the related workarounds in the kernel and
binutils, but the new Loongson2F series(2F03 and laters) have no such issues,
so, none of the workarounds is needed.
Currently, the workaround[1] with the -mfix-loongson2f-nop,
-mfix-loongson2f-jump options have been added into the latest binutils(in the
cvs repository), it's time to add the workarounds in the kernel.
The workarounds have no big side effect on the system, but may decrease the
performance, therefore, this patch adds a new CPU_LOONGSON2F_WORKAROUNDS config
option to allow the users to only enable it for the necessary processor series.
[1] "Fixups of Loongson2F" patch for binutils(actually for gas)
http://sourceware.org/ml/binutils/2009-11/msg00387.html
[2] Chapter 15 of "Loongson2F User Manual"(Chinese Version)
http://www.loongson.cn/uploadfile/file/200808211
[3] English Version of the above chapter 15
http://groups.google.com.hk/group/loongson-dev/msg/e0d2e220958f10a6?dmode=source
Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
---
arch/mips/Kconfig | 26 ++++++++++++++++++++++++++
1 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 29e8692..f2ead53 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -1305,6 +1305,32 @@ config CPU_CAVIUM_OCTEON
endchoice
+if CPU_LOONGSON2F
+config CPU_NOP_WORKAROUNDS
+ bool
+
+config CPU_JUMP_WORKAROUNDS
+ bool
+
+config CPU_LOONGSON2F_WORKAROUNDS
+ bool "Loongson 2F Workarounds"
+ default y
+ select CPU_NOP_WORKAROUNDS
+ select CPU_JUMP_WORKAROUNDS
+ help
+ The Loongson 2F01/02 processor has the NOP & JUMP issues, needs the
+ related workarounds, without workarounds, the system will hang
+ unexpectedly. to get more information about them, please refer to the
+ -mfix-loongson2f-nop and -mfix-loongson2f-jump options of gas.
+
+ For Loongson 2F03 and the later batches have fixed the issues, none
+ of these workarounds needed for them. These workarounds have no big
+ side effect on them but may decrease the performance of the system,
+ therefore, it's better to disable this config for them.
+
+ If unsure, please say Y.
+endif # CPU_LOONGSON2F
+
config SYS_SUPPORTS_ZBOOT
bool
select HAVE_KERNEL_GZIP
--
1.7.0.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 2/4] Loongson-2F: Enable fixups of the latest binutils
2010-04-07 13:11 [PATCH v4 0/4] Workaround the Out-of-order Issue of Loongson-2 Wu Zhangjin
2010-04-07 13:11 ` [PATCH v4 1/4] Loongson: Add CPU_LOONGSON2F_WORKAROUNDS Wu Zhangjin
@ 2010-04-07 13:11 ` Wu Zhangjin
2010-04-07 17:16 ` Zhang Le
2010-04-07 13:11 ` [PATCH v4 3/4] Loongson-2F: Flush the branch target history in BTB and RAS (cont.) Wu Zhangjin
2010-04-07 13:11 ` [PATCH v4 4/4] Loongson-2F: Fixup of problems introduced by -mfix-loongson2f-jump Wu Zhangjin
3 siblings, 1 reply; 7+ messages in thread
From: Wu Zhangjin @ 2010-04-07 13:11 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips, Wu Zhangjin, Zhang Le
From: Wu Zhangjin <wuzhangjin@gmail.com>
Changes from old revision:
o Incorporated with the feedbacks from Ralf and used the options
introduced from "Loongson: Add CPU_LOONGSON2F_WORKAROUNDS".
As the "Fixups of Loongson2F" patch[1] to binutils have been applied
into binutils 2.20.1. It's time to enable the options provided by the
patch to compile the kernel.
Without these fixups, the system will hang unexpectedly for the bug of
processor.
To learn more about these fixups, please refer to the following
references.
[1] "Fixups of Loongson2F" patch for binutils(actually for gas)
http://sourceware.org/ml/binutils/2009-11/msg00387.html
[2] Chapter 15 of "Loongson2F User Manual"(Chinese Version)
http://www.loongson.cn/uploadfile/file/200808211
[3] English Version of the above chapter 15
http://groups.google.com.hk/group/loongson-dev/msg/e0d2e220958f10a6?dmode=source
Signed-off-by: Zhang Le <r0bertz@gentoo.org>
Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
---
arch/mips/Makefile | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 2f2eac2..14f12bc 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -136,6 +136,19 @@ cflags-$(CONFIG_CPU_LOONGSON2E) += \
$(call cc-option,-march=loongson2e,-march=r4600)
cflags-$(CONFIG_CPU_LOONGSON2F) += \
$(call cc-option,-march=loongson2f,-march=r4600)
+# enable the workarounds for loongson2f
+ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS
+ ifeq ($(call as-option,-Wa$(comma)-mfix-loongson2f-nop,),)
+ $(error gcc does not support needed option -mfix-loongson2f-nop)
+ else
+ cflags-$(CONFIG_CPU_NOP_WORKAROUNDS) += -Wa$(comma)-mfix-loongson2f-nop
+ endif
+ ifeq ($(call as-option,-Wa$(comma)-mfix-loongson2f-jump,),)
+ $(error gcc does not support needed option -mfix-loongson2f-jump)
+ else
+ cflags-$(CONFIG_CPU_JUMP_WORKAROUNDS) += -Wa$(comma)-mfix-loongson2f-jump
+ endif
+endif
cflags-$(CONFIG_CPU_MIPS32_R1) += $(call cc-option,-march=mips32,-mips32 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS32) \
-Wa,-mips32 -Wa,--trap
--
1.7.0.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/4] Loongson-2F: Enable fixups of the latest binutils
2010-04-07 13:11 ` [PATCH v4 2/4] Loongson-2F: Enable fixups of the latest binutils Wu Zhangjin
@ 2010-04-07 17:16 ` Zhang Le
2010-04-08 8:47 ` Wu Zhangjin
0 siblings, 1 reply; 7+ messages in thread
From: Zhang Le @ 2010-04-07 17:16 UTC (permalink / raw)
To: Wu Zhangjin; +Cc: Ralf Baechle, linux-mips
On 21:11 Wed 07 Apr , Wu Zhangjin wrote:
> From: Wu Zhangjin <wuzhangjin@gmail.com>
>
> Changes from old revision:
>
> o Incorporated with the feedbacks from Ralf and used the options
> introduced from "Loongson: Add CPU_LOONGSON2F_WORKAROUNDS".
>
> As the "Fixups of Loongson2F" patch[1] to binutils have been applied
> into binutils 2.20.1. It's time to enable the options provided by the
> patch to compile the kernel.
>
> Without these fixups, the system will hang unexpectedly for the bug of
> processor.
>
> To learn more about these fixups, please refer to the following
> references.
>
> [1] "Fixups of Loongson2F" patch for binutils(actually for gas)
> http://sourceware.org/ml/binutils/2009-11/msg00387.html
> [2] Chapter 15 of "Loongson2F User Manual"(Chinese Version)
> http://www.loongson.cn/uploadfile/file/200808211
> [3] English Version of the above chapter 15
> http://groups.google.com.hk/group/loongson-dev/msg/e0d2e220958f10a6?dmode=source
>
> Signed-off-by: Zhang Le <r0bertz@gentoo.org>
> Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
> ---
> arch/mips/Makefile | 13 +++++++++++++
> 1 files changed, 13 insertions(+), 0 deletions(-)
>
> diff --git a/arch/mips/Makefile b/arch/mips/Makefile
> index 2f2eac2..14f12bc 100644
> --- a/arch/mips/Makefile
> +++ b/arch/mips/Makefile
> @@ -136,6 +136,19 @@ cflags-$(CONFIG_CPU_LOONGSON2E) += \
> $(call cc-option,-march=loongson2e,-march=r4600)
> cflags-$(CONFIG_CPU_LOONGSON2F) += \
> $(call cc-option,-march=loongson2f,-march=r4600)
> +# enable the workarounds for loongson2f
> +ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS
> + ifeq ($(call as-option,-Wa$(comma)-mfix-loongson2f-nop,),)
> + $(error gcc does not support needed option -mfix-loongson2f-nop)
Again, this is an as option. :)
So this error msg is a little miss leading.
Maybe we should tell user at least which version of binutils is needed.
> + else
> + cflags-$(CONFIG_CPU_NOP_WORKAROUNDS) += -Wa$(comma)-mfix-loongson2f-nop
> + endif
> + ifeq ($(call as-option,-Wa$(comma)-mfix-loongson2f-jump,),)
> + $(error gcc does not support needed option -mfix-loongson2f-jump)
Same here.
Zhang, Le
> + else
> + cflags-$(CONFIG_CPU_JUMP_WORKAROUNDS) += -Wa$(comma)-mfix-loongson2f-jump
> + endif
> +endif
>
> cflags-$(CONFIG_CPU_MIPS32_R1) += $(call cc-option,-march=mips32,-mips32 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS32) \
> -Wa,-mips32 -Wa,--trap
> --
> 1.7.0.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v4 2/4] Loongson-2F: Enable fixups of the latest binutils
2010-04-07 17:16 ` Zhang Le
@ 2010-04-08 8:47 ` Wu Zhangjin
0 siblings, 0 replies; 7+ messages in thread
From: Wu Zhangjin @ 2010-04-08 8:47 UTC (permalink / raw)
To: Zhang Le; +Cc: Ralf Baechle, linux-mips
On Wed, 2010-04-07 at 17:16 +0000, Zhang Le wrote:
[...]
> > +# enable the workarounds for loongson2f
> > +ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS
> > + ifeq ($(call as-option,-Wa$(comma)-mfix-loongson2f-nop,),)
> > + $(error gcc does not support needed option -mfix-loongson2f-nop)
>
> Again, this is an as option. :)
> So this error msg is a little miss leading.
> Maybe we should tell user at least which version of binutils is needed.
>
hmm, yeah, it's better to tell the users the exact tool here although
'as' is part of the integrated gcc toolchain ;)
Thanks & Regards,
Wu Zhangjin
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v4 3/4] Loongson-2F: Flush the branch target history in BTB and RAS (cont.)
2010-04-07 13:11 [PATCH v4 0/4] Workaround the Out-of-order Issue of Loongson-2 Wu Zhangjin
2010-04-07 13:11 ` [PATCH v4 1/4] Loongson: Add CPU_LOONGSON2F_WORKAROUNDS Wu Zhangjin
2010-04-07 13:11 ` [PATCH v4 2/4] Loongson-2F: Enable fixups of the latest binutils Wu Zhangjin
@ 2010-04-07 13:11 ` Wu Zhangjin
2010-04-07 13:11 ` [PATCH v4 4/4] Loongson-2F: Fixup of problems introduced by -mfix-loongson2f-jump Wu Zhangjin
3 siblings, 0 replies; 7+ messages in thread
From: Wu Zhangjin @ 2010-04-07 13:11 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips, Wu Zhangjin
From: Wu Zhangjin <wuzhangjin@gmail.com>
This patch uses the new option CONFIG_CPU_JUMP_WORKAROUNDS introduced
from "Loongson: Add CPU_LOONGSON2F_WORKAROUNDS" to enable the
workarounds for the necessary loongson series(2F01/02).
Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
---
arch/mips/include/asm/stackframe.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h
index c841912..58730c5 100644
--- a/arch/mips/include/asm/stackframe.h
+++ b/arch/mips/include/asm/stackframe.h
@@ -121,7 +121,7 @@
.endm
#else
.macro get_saved_sp /* Uniprocessor variation */
-#ifdef CONFIG_CPU_LOONGSON2F
+#ifdef CONFIG_CPU_JUMP_WORKAROUNDS
/*
* Clear BTB (branch target buffer), forbid RAS (return address
* stack) to workaround the Out-of-order Issue in Loongson2F
--
1.7.0.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 4/4] Loongson-2F: Fixup of problems introduced by -mfix-loongson2f-jump
2010-04-07 13:11 [PATCH v4 0/4] Workaround the Out-of-order Issue of Loongson-2 Wu Zhangjin
` (2 preceding siblings ...)
2010-04-07 13:11 ` [PATCH v4 3/4] Loongson-2F: Flush the branch target history in BTB and RAS (cont.) Wu Zhangjin
@ 2010-04-07 13:11 ` Wu Zhangjin
3 siblings, 0 replies; 7+ messages in thread
From: Wu Zhangjin @ 2010-04-07 13:11 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips, Wu Zhangjin
From: Wu Zhangjin <wuzhangjin@gmail.com>
Changes from old revisions:
o Incorporated with the feedbacks from Ralf Baechle and used the
option CONFIG_CPU_JUMP_WORKAROUNDS introduced by "Loongson: Add
CPU_LOONGSON2F_WORKAROUNDS".
The -mfix-loongson2f-jump option provided by the latest binutils(in the cvs
repository) have fixed the Out-of-order Issue of Loongson-2F described in
Chapter 15 of "Loongson2F User Manual"[1,2], but introduced some problems.
The option changes all of the jumping target to "addr & 0xcfffffff" through the
at($1) register, but for the REBOOT address of loongson-2F: 0xbfc00000, this is
totally wrong, so, this patch try to avoid the problem via telling the
assembler not to use at($1) register.
[1] Loongson2F User Manual(Chinese Version)
http://www.loongson.cn/uploadfile/file/200808211
[2] English Version of Chapter 15:
http://groups.google.com.hk/group/loongson-dev/msg/e0d2e220958f10a6?dmode=source
Reported-and-tested-by: Liu Shiwei <liushiwei@gmail.com>
Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
---
arch/mips/loongson/common/reset.c | 20 +++++++++++++++++++-
1 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/arch/mips/loongson/common/reset.c b/arch/mips/loongson/common/reset.c
index 4bd9c18..9e10d62 100644
--- a/arch/mips/loongson/common/reset.c
+++ b/arch/mips/loongson/common/reset.c
@@ -16,13 +16,31 @@
#include <loongson.h>
+static inline void loongson_reboot(void)
+{
+#ifndef CONFIG_CPU_JUMP_WORKAROUNDS
+ ((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) ();
+#else
+ void (*func)(void);
+
+ func = (void *)ioremap_nocache(LOONGSON_BOOT_BASE, 4);
+
+ __asm__ __volatile__(
+ " .set noat \n"
+ " jr %[func] \n"
+ " .set at \n"
+ : /* No outputs */
+ : [func] "r" (func));
+#endif
+}
+
static void loongson_restart(char *command)
{
/* do preparation for reboot */
mach_prepare_reboot();
/* reboot via jumping to boot base address */
- ((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) ();
+ loongson_reboot();
}
static void loongson_poweroff(void)
--
1.7.0.1
^ permalink raw reply related [flat|nested] 7+ messages in thread