aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Van Hensbergen <ericvh@gmail.com>2011-03-09 20:05:36 -0600
committerEric Van Hensbergen <ericvh@gmail.com>2011-03-09 20:05:36 -0600
commit94bffe786324b9bd07187b11afd836e3ec362d95 (patch)
tree5eb0210b89e54fc08f7d9d127f203924b8dd323c
parenteaf86842a8c5d386e4b705db4f0aa6090023d4df (diff)
downloadbluegene-kittyhawk-2.6.22.tar.gz
double hummer related fixes and patcheskittyhawk-2.6.22
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
-rw-r--r--arch/powerpc/configs/bgp_defconfig4
-rw-r--r--arch/powerpc/kernel/asm-offsets.c4
-rw-r--r--arch/powerpc/kernel/fpu.S9
-rw-r--r--include/asm-powerpc/ppc_asm.h42
-rw-r--r--include/asm-powerpc/processor.h2
5 files changed, 40 insertions, 21 deletions
diff --git a/arch/powerpc/configs/bgp_defconfig b/arch/powerpc/configs/bgp_defconfig
index 3d317ff33d5a9b..86ef959b328a79 100644
--- a/arch/powerpc/configs/bgp_defconfig
+++ b/arch/powerpc/configs/bgp_defconfig
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.22
-# Mon Nov 3 16:20:50 2008
+# Wed Feb 11 21:13:17 2009
#
# CONFIG_PPC64 is not set
CONFIG_PPC32=y
@@ -830,7 +830,7 @@ CONFIG_INOTIFY_USER=y
CONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
+CONFIG_FUSE_FS=y
#
# CD-ROM/DVD Filesystems
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index 2cb1d948779614..744442cc1640f2 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -88,7 +88,9 @@ int main(void)
DEFINE(THREAD_USED_SPE, offsetof(struct thread_struct, used_spe));
#endif /* CONFIG_SPE */
#endif /* CONFIG_PPC64 */
-
+#ifdef CONFIG_DOUBLE_HUMMER
+ DEFINE(THREAD_SFPR0, offsetof(struct thread_struct, sfpr[0]));
+#endif /* CONFIG_DOUBLE_HUMMER */
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S
index 821e152e093c5b..3829223e01fd8f 100644
--- a/arch/powerpc/kernel/fpu.S
+++ b/arch/powerpc/kernel/fpu.S
@@ -51,6 +51,9 @@ _GLOBAL(load_up_fpu)
toreal(r4)
addi r4,r4,THREAD /* want last_task_used_math->thread */
SAVE_32FPRS(0, r4)
+#ifdef CONFIG_DOUBLE_HUMMER
+ SAVE_32SFPRS(0, r10, r3)
+#endif /* CONFIG_DOUBLE_HUMMER */
mffs fr0
stfd fr0,THREAD_FPSCR(r4)
PPC_LL r5,PT_REGS(r4)
@@ -78,6 +81,9 @@ _GLOBAL(load_up_fpu)
lfd fr0,THREAD_FPSCR(r5)
MTFSF_L(fr0)
REST_32FPRS(0, r5)
+#ifdef CONFIG_DOUBLE_HUMMER
+ REST_32SFPRS(0, r10, r5)
+#endif /* CONFIG_DOUBLE_HUMMER */
#ifndef CONFIG_SMP
subi r4,r5,THREAD
fromreal(r4)
@@ -107,6 +113,9 @@ _GLOBAL(giveup_fpu)
PPC_LL r5,PT_REGS(r3)
PPC_LCMPI 0,r5,0
SAVE_32FPRS(0, r3)
+#ifdef CONFIG_DOUBLE_HUMMER
+ SAVE_32SFPRS(0, r10, r3)
+#endif /* CONFIG_DOUBLE_HUMMER */
mffs fr0
stfd fr0,THREAD_FPSCR(r3)
beq 1f
diff --git a/include/asm-powerpc/ppc_asm.h b/include/asm-powerpc/ppc_asm.h
index 8aca5e29ea3056..1352c2e9887109 100644
--- a/include/asm-powerpc/ppc_asm.h
+++ b/include/asm-powerpc/ppc_asm.h
@@ -83,23 +83,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \
#define REST_8GPRS(n, base) REST_4GPRS(n, base); REST_4GPRS(n+4, base)
#define REST_10GPRS(n, base) REST_8GPRS(n, base); REST_2GPRS(n+8, base)
-#if 0
-/* Only a patched toolchain will support the stfpdx/lfpdx instructions */
-#define LFPDX(frt,ra,rb) .long (31<<26)|((frt)<<21)|((ra)<<16)|((rb)<<11)|(462<<1)
-#define STFPDX(frt,ra,rb) .long (31<<26)|((frt)<<21)|((ra)<<16)|((rb)<<11)|(974<<1)
-#define SAVE_DFPR(n,b,base) li b,THREAD_FPR0+(16*(n)); STFPDX(n,base,b)
-#define SAVE_2DFPRS(n,b,base) SAVE_DFPR(n,b,base); SAVE_DFPR(n+1,b,base)
-#define SAVE_4DFPRS(n,b,base) SAVE_2DFPRS(n,b,base); SAVE_2DFPRS(n+2,b,base)
-#define SAVE_8DFPRS(n,b,base) SAVE_4DFPRS(n,b,base); SAVE_4DFPRS(n+4,b,base)
-#define SAVE_16DFPRS(n,b,base) SAVE_8DFPRS(n,b,base); SAVE_8DFPRS(n+8,b,base)
-#define SAVE_32DFPRS(n,b,base) SAVE_16DFPRS(n,b,base);SAVE_16DFPRS(n+16,b,base)
-#define REST_DFPR(n,b,base) li b,THREAD_FPR0+(16*(n)); LFPDX(n,base,b)
-#define REST_2DFPRS(n,b,base) REST_DFPR(n,b,base); REST_DFPR(n+1,b,base)
-#define REST_4DFPRS(n,b,base) REST_2DFPRS(n,b,base); REST_2DFPRS(n+2,b,base)
-#define REST_8DFPRS(n,b,base) REST_4DFPRS(n,b,base); REST_4DFPRS(n+4,b,base)
-#define REST_16DFPRS(n,b,base) REST_8DFPRS(n,b,base); REST_8DFPRS(n+8,b,base)
-#define REST_32DFPRS(n,b,base) REST_16DFPRS(n,b,base);REST_16DFPRS(n+16,b,base)
-#endif
#define SAVE_FPR(n, base) stfd n,THREAD_FPR0+8*(n)(base)
#define SAVE_2FPRS(n, base) SAVE_FPR(n, base); SAVE_FPR(n+1, base)
@@ -114,6 +97,30 @@ END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \
#define REST_16FPRS(n, base) REST_8FPRS(n, base); REST_8FPRS(n+8, base)
#define REST_32FPRS(n, base) REST_16FPRS(n, base); REST_16FPRS(n+16, base)
+/* In the case of the Double Hummer as on Blue Gene we must take care of */
+/* the secondary floating point registers. We reserve space in the thread */
+/* structure similar to the fpr array but called sfpr array */
+/* Only a bg patched toolchain will support the stfsdx/lfsdx instructions */
+/* So we manifest the necessary opcodes by hand with the following macros
+/* these instructions only load and store the secondary floating point registers of */
+/* the double hummer */
+#define LFSDX(frt,ra,rb) .long (31<<26)|((frt)<<21)|((ra)<<16)|((rb)<<11)|(206<<1)
+#define STFSDX(frt,ra,rb) .long (31<<26)|((frt)<<21)|((ra)<<16)|((rb)<<11)|(718<<1)
+
+#define SAVE_SFPR(n,b,base) li b,THREAD_SFPR0+(8*(n)); STFSDX(n,b,base)
+#define SAVE_2SFPRS(n,b,base) SAVE_SFPR(n,b,base); SAVE_SFPR(n+1,b,base)
+#define SAVE_4SFPRS(n,b,base) SAVE_2SFPRS(n,b,base); SAVE_2SFPRS(n+2,b,base)
+#define SAVE_8SFPRS(n,b,base) SAVE_4SFPRS(n,b,base); SAVE_4SFPRS(n+4,b,base)
+#define SAVE_16SFPRS(n,b,base) SAVE_8SFPRS(n,b,base); SAVE_8SFPRS(n+8,b,base)
+#define SAVE_32SFPRS(n,b,base) SAVE_16SFPRS(n,b,base);SAVE_16SFPRS(n+16,b,base)
+#define REST_SFPR(n,b,base) li b,THREAD_SFPR0+(8*(n)); LFSDX(n,b,base)
+#define REST_2SFPRS(n,b,base) REST_SFPR(n,b,base); REST_SFPR(n+1,b,base)
+#define REST_4SFPRS(n,b,base) REST_2SFPRS(n,b,base); REST_2SFPRS(n+2,b,base)
+#define REST_8SFPRS(n,b,base) REST_4SFPRS(n,b,base); REST_4SFPRS(n+4,b,base)
+#define REST_16SFPRS(n,b,base) REST_8SFPRS(n,b,base); REST_8SFPRS(n+8,b,base)
+#define REST_32SFPRS(n,b,base) REST_16SFPRS(n,b,base);REST_16SFPRS(n+16,b,base)
+
+
#define SAVE_VR(n,b,base) li b,THREAD_VR0+(16*(n)); stvx n,b,base
#define SAVE_2VRS(n,b,base) SAVE_VR(n,b,base); SAVE_VR(n+1,b,base)
#define SAVE_4VRS(n,b,base) SAVE_2VRS(n,b,base); SAVE_2VRS(n+2,b,base)
@@ -140,6 +147,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \
#define REST_16EVRS(n,s,base) REST_8EVRS(n,s,base); REST_8EVRS(n+8,s,base)
#define REST_32EVRS(n,s,base) REST_16EVRS(n,s,base); REST_16EVRS(n+16,s,base)
+
/* Macros to adjust thread priority for hardware multithreading */
#define HMT_VERY_LOW or 31,31,31 # very low priority
#define HMT_LOW or 1,1,1
diff --git a/include/asm-powerpc/processor.h b/include/asm-powerpc/processor.h
index 0b3ce1435078f3..2f39ae6b657c35 100644
--- a/include/asm-powerpc/processor.h
+++ b/include/asm-powerpc/processor.h
@@ -166,7 +166,7 @@ struct thread_struct {
int used_spe; /* set if process has used spe */
#endif /* CONFIG_SPE */
#ifdef CONFIG_DOUBLE_HUMMER
- double sfpr[32];
+ double sfpr[32];
#endif /* CONFIG_DOUBLE_HUMMER */
};