powerpc/powernv: Support OPAL requested heartbeat
PATCH v2 1/1 powerpc/powernv: Support OPAL requested heartbeat
If OPAL requests it, call it back via opal_poll_events() at a regular interval. Some versions of OPAL on some machines require this to operate some internal timeouts properly.
Signed-off-by Benjamin Herrenschmidt <[email protected]>
---
V2. Change device-tree property to "ibm,heartbeat-ms"
arch/powerpc/platforms/powernv/opal.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
arch/powerpc/platforms/powernv/opal.c +30 -0
@@ -22,6 +22,8 @@#include <linux/kobject.h> #include <linux/delay.h> #include <linux/memblock.h> +#include <linux/kthread.h> +#include <linux/freezer.h> #include <asm/machdep.h> #include <asm/opal.h>
@@ -58,6 +60,7 @@ static struct atomic_notifier_head opal_msg_notifier_head[OPAL_MSG_TYPE_MAX];static DEFINE_SPINLOCK (opal_notifier_lock);static uint64_t last_notified_mask =0x0ul ;static atomic_t opal_notifier_hold =ATOMIC_INIT (0 ); +static uint32_t opal_heartbeat;static void opal_reinit_cores (void ) {
@@ -687,6 +690,29 @@ static void opal_request_interrupts(void) } } +static int kopald (void *unused) +{ +set_freezable (); +do { +try_to_freeze (); +opal_poll_events (NULL ); +msleep_interruptible (opal_heartbeat); + }while (!kthread_should_stop ()); + +return 0 ; +} + +static void opal_init_heartbeat (void ) +{ +/* Old firwmware, we assume the HVC heartbeat is sufficient */ +if (of_property_read_u32 (opal_node,"ibm,heartbeat-ms" , + &opal_heartbeat) !=0 ) + opal_heartbeat =0 ; + +if (opal_heartbeat) +kthread_run (kopald,NULL ,"kopald" ); +} +static int __init opal_init (void ) {int rc;
@@ -703,6 +729,9 @@ static int __init opal_init(void)/* Create i2c platform devices */ opal_i2c_create_devs (); +/* Setup a heatbeat thread if requested by OPAL */ +opal_init_heartbeat (); +/* Register OPAL interrupts */ opal_request_interrupts ();
@@ -723,6 +752,7 @@ static int __init opal_init(void)opal_msglog_init (); } +/* Initialize OPAL IPMI backend */ opal_ipmi_init (opal_node);return 0 ;