@@ -124,6 +124,7 @@ struct rtas_suspend_me_data {
#define RTAS_TYPE_INFO 0xE2
#define RTAS_TYPE_DEALLOC 0xE3
#define RTAS_TYPE_DUMP 0xE4
+#define RTAS_TYPE_HOTPLUG 0xE5
/* I don't add PowerMGM events right now, this is a different topic */
#define RTAS_TYPE_PMGM_POWER_SW_ON 0x60
#define RTAS_TYPE_PMGM_POWER_SW_OFF 0x61
@@ -360,7 +360,7 @@ int dlpar_release_drc(u32 drc_index)
return 0;
}
-static int handle_dlpar_errorlog(struct rtas_error_log *error_log)
+int handle_dlpar_errorlog(struct rtas_error_log *error_log)
{
struct pseries_errorlog *pseries_log;
struct pseries_hp_elog *hp_elog;
@@ -64,6 +64,7 @@ extern int dlpar_acquire_drc(u32);
extern int dlpar_release_drc(u32);
extern int dlpar_memory(struct pseries_hp_elog *);
extern int dlpar_cpus(struct pseries_hp_elog *);
+extern int handle_dlpar_errorlog(struct rtas_error_log *);
/* PCI root bridge prepare function override for pseries */
struct pci_host_bridge;
@@ -183,6 +183,7 @@ void rtas_parse_epow_errlog(struct rtas_error_log *log)
/* Handle environmental and power warning (EPOW) interrupts. */
static irqreturn_t ras_epow_interrupt(int irq, void *dev_id)
{
+ struct rtas_error_log *elog;
int status;
int state;
int critical;
@@ -205,7 +206,16 @@ static irqreturn_t ras_epow_interrupt(int irq, void *dev_id)
log_error(ras_log_buf, ERR_TYPE_RTAS_LOG, 0);
- rtas_parse_epow_errlog((struct rtas_error_log *)ras_log_buf);
+ elog = (struct rtas_error_log *)ras_log_buf;
+
+ switch(rtas_error_type(elog)) {
+ case RTAS_TYPE_EPOW:
+ rtas_parse_epow_errlog(elog);
+ break;
+ case RTAS_TYPE_HOTPLUG:
+ handle_dlpar_errorlog(elog);
+ break;
+ }
spin_unlock(&ras_log_buf_lock);
return IRQ_HANDLED;