* Tero Kristo <tero.kristo@xxxxxxxxx> [091119 07:12]: > From: Tero Kristo <tero.kristo@xxxxxxxxx> > > In some ARM architectures, like OMAP3, the VFP context can be lost during > dynamic sleep cycle. For this purpose, there is now a function > vfp_pm_save_context() that should be called before the VFP is assumed to > lose context. Next VFP trap will then restore context automatically. > > We need to have the last_VFP_context[cpu] cleared after the save in idle, > else the restore would fail to restore when it sees that the last_VFP_context > is same as the current threads vfp_state. This happens when the same > process/thread traps an exception post idle. > > Main work for this patch was done by Peter and Rajendra. Some cleanup and > optimization by Tero. This should go via the linux-arm-kernel@xxxxxxxxxxxxxxxxxxx list. We should probably merge them both via LAKML as they logically belong toghether. Can you please resend, and also Cc linux-omap list? For both, you can add Acked-by: Tony Lindgren <tony@xxxxxxxxxxx> if you want to. > Signed-off-by: Tero Kristo <tero.kristo@xxxxxxxxx> > Cc: Vishwanath Sripathy <vishwanath.bs@xxxxxx> > Cc: Rajendra Nayak <rnayak@xxxxxx> > Cc: Richard Woodruff <r-woodruff2@xxxxxx> > Cc: Peter 'p2' De Schrijver <peter.de-schrijver@xxxxxxxxx> > --- > arch/arm/vfp/vfpmodule.c | 25 +++++++++++++++++++++++++ > 1 files changed, 25 insertions(+), 0 deletions(-) > > diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c > index 2d7423a..80a08bd 100644 > --- a/arch/arm/vfp/vfpmodule.c > +++ b/arch/arm/vfp/vfpmodule.c > @@ -329,6 +329,31 @@ static void vfp_enable(void *unused) > #ifdef CONFIG_PM > #include <linux/sysdev.h> > > +void vfp_pm_save_context(void) > +{ > + struct thread_info *thread = current_thread_info(); > + u32 fpexc = fmrx(FPEXC); > + __u32 cpu = thread->cpu; > + > + if (last_VFP_context[cpu]) { > + if (!(fpexc & FPEXC_EN)) { > + /* enable vfp now to save context */ > + vfp_enable(NULL); > + fmxr(FPEXC, fmrx(FPEXC) | FPEXC_EN); > + } > + vfp_save_state(last_VFP_context[cpu], fpexc); > + > + /* Disable vfp. The next inst traps an exception and restores*/ > + fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN); > + > + /* > + * This is needed else the restore might fail if it sees > + * last_VFP_context if same as the current threads vfp_state. > + */ > + last_VFP_context[cpu] = NULL; > + } > +} > + > static int vfp_pm_suspend(struct sys_device *dev, pm_message_t state) > { > struct thread_info *ti = current_thread_info(); > -- > 1.5.4.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html