From patchwork Fri Nov 9 17:43:29 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Hijacking CPU_FTR_VSX for BGQ QPX Date: Fri, 09 Nov 2012 07:43:29 -0000 From: Jimi Xenidis X-Patchwork-Id: 198140 Message-Id: <29970ED2-02E3-45F5-96FD-B4270385E3ED@pobox.com> To: Benjamin Herrenschmidt , Michael Neuling Cc: linuxppc-dev The CPU_FTR_* values are pretty tight (a few bits left) yes I need to save and restore the QPX registers. There are 32 QPX registers, each 32 bytes in size, it is otherwise managed by the FPSCR and MSR[FP] I was thinking that I could hijack the VSX, since there is no plan to add it to embedded yet. I could be explicit or create an alieas fo the same bit, but the basic effect (after increasing the save area size) would be something like the diff below. Thoughts? -jx diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index de36955..adb08af 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S @@ -25,14 +25,24 @@ #include #include -#ifdef CONFIG_VSX +#if defined (CONFIG_VSX) && defined(CONFIG_BGQ) +# error "This code depends on CONFIG_VSX and CONFIG_BGQ being exclusive +#elif defined (CONFIG_VSX) +# define _REST_32VSRS(n,c,base) REST_32VSRS(n,c,base) +# define _SAVE_32VSRS(n,c,base) SAVE_32VSRS(n,c,base) +#elif defined(CONFIG_BGQ) +# define _REST_32VSRS(n,c,base) REST_32QRS(n,c,base) +# define _SAVE_32VSRS(n,c,base) SAVE_32QRS(n,c,base) +#endif + +#if defined (CONFIG_VSX) || defined(CONFIG_BGQ) #define REST_32FPVSRS(n,c,base) \ BEGIN_FTR_SECTION \ b 2f; \ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ REST_32FPRS(n,base); \ b 3f; \ -2: REST_32VSRS(n,c,base); \ +2: _REST_32VSRS(n,c,base); \ 3: #define SAVE_32FPVSRS(n,c,base) \ @@ -41,7 +51,7 @@ BEGIN_FTR_SECTION \ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ SAVE_32FPRS(n,base); \ b 3f; \ -2: SAVE_32VSRS(n,c,base); \ +2: _SAVE_32VSRS(n,c,base); \ 3: #else #define REST_32FPVSRS(n,b,base) REST_32FPRS(n, base)