Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ebf714ff authored by Scott Wood's avatar Scott Wood Committed by Kumar Gala
Browse files

powerpc/e500mc: Add support for the wait instruction in e500_idle



e500mc cannot doze or nap due to an erratum (as well as having a
different mechanism than previous e500), but it has a "wait" instruction
that is similar to doze.

On 64-bit, due to the soft-irq-disable mechanism, the existing
book3e_idle should be used instead.

Signed-off-by: default avatarVakul Garg <vakul@freescale.com>
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent f340fe69
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -26,6 +26,17 @@ _GLOBAL(e500_idle)
	ori	r4,r4,_TLF_NAPPING	/* so when we take an exception */
	stw	r4,TI_LOCAL_FLAGS(r3)	/* it will return to our caller */

#ifdef CONFIG_E500MC
	wrteei	1
1:	wait

	/*
	 * Guard against spurious wakeups (e.g. from a hypervisor) --
	 * any real interrupt will cause us to return to LR due to
	 * _TLF_NAPPING.
	 */
	b	1b
#else
	/* Check if we can nap or doze, put HID0 mask in r3 */
	lis	r3,0
BEGIN_FTR_SECTION
@@ -72,6 +83,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_L2CSR|CPU_FTR_CAN_NAP)
	mtmsr	r7
	isync
2:	b	2b
#endif /* !E500MC */

/*
 * Return from NAP/DOZE mode, restore some CPU specific registers,
+1 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ define_machine(p3041_ds) {
	.restart		= fsl_rstcr_restart,
	.calibrate_decr		= generic_calibrate_decr,
	.progress		= udbg_progress,
	.power_save		= e500_idle,
};

machine_device_initcall(p3041_ds, corenet_ds_publish_devices);
+1 −0
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ define_machine(p4080_ds) {
	.restart		= fsl_rstcr_restart,
	.calibrate_decr		= generic_calibrate_decr,
	.progress		= udbg_progress,
	.power_save		= e500_idle,
};

machine_device_initcall(p4080_ds, corenet_ds_publish_devices);
+5 −0
Original line number Diff line number Diff line
@@ -74,6 +74,11 @@ define_machine(p5020_ds) {
	.restart		= fsl_rstcr_restart,
	.calibrate_decr		= generic_calibrate_decr,
	.progress		= udbg_progress,
#ifdef CONFIG_PPC64
	.power_save		= book3e_idle,
#else
	.power_save		= e500_idle,
#endif
};

machine_device_initcall(p5020_ds, corenet_ds_publish_devices);