* Tero Kristo <[email protected]> [091119 07:12]: > From: Tero Kristo <[email protected]> > > 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 [email protected] 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 <[email protected]> if you want to. > Signed-off-by: Tero Kristo <[email protected]> > Cc: Vishwanath Sripathy <[email protected]> > Cc: Rajendra Nayak <[email protected]> > Cc: Richard Woodruff <[email protected]> > Cc: Peter 'p2' De Schrijver <[email protected]> > --- > 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 [email protected] > 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 [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
