|
@@ -40,6 +40,9 @@ static int ras_check_exception_token;
|
|
|
#define EPOW_SENSOR_TOKEN 9
|
|
|
#define EPOW_SENSOR_INDEX 0
|
|
|
|
|
|
+/* EPOW events counter variable */
|
|
|
+static int num_epow_events;
|
|
|
+
|
|
|
static irqreturn_t ras_epow_interrupt(int irq, void *dev_id);
|
|
|
static irqreturn_t ras_error_interrupt(int irq, void *dev_id);
|
|
|
|
|
@@ -82,32 +85,30 @@ static void handle_system_shutdown(char event_modifier)
|
|
|
{
|
|
|
switch (event_modifier) {
|
|
|
case EPOW_SHUTDOWN_NORMAL:
|
|
|
- pr_emerg("Firmware initiated power off");
|
|
|
+ pr_emerg("Power off requested\n");
|
|
|
orderly_poweroff(true);
|
|
|
break;
|
|
|
|
|
|
case EPOW_SHUTDOWN_ON_UPS:
|
|
|
- pr_emerg("Loss of power reported by firmware, system is "
|
|
|
- "running on UPS/battery");
|
|
|
- pr_emerg("Check RTAS error log for details");
|
|
|
+ pr_emerg("Loss of system power detected. System is running on"
|
|
|
+ " UPS/battery. Check RTAS error log for details\n");
|
|
|
orderly_poweroff(true);
|
|
|
break;
|
|
|
|
|
|
case EPOW_SHUTDOWN_LOSS_OF_CRITICAL_FUNCTIONS:
|
|
|
- pr_emerg("Loss of system critical functions reported by "
|
|
|
- "firmware");
|
|
|
- pr_emerg("Check RTAS error log for details");
|
|
|
+ pr_emerg("Loss of system critical functions detected. Check"
|
|
|
+ " RTAS error log for details\n");
|
|
|
orderly_poweroff(true);
|
|
|
break;
|
|
|
|
|
|
case EPOW_SHUTDOWN_AMBIENT_TEMPERATURE_TOO_HIGH:
|
|
|
- pr_emerg("Ambient temperature too high reported by firmware");
|
|
|
- pr_emerg("Check RTAS error log for details");
|
|
|
+ pr_emerg("High ambient temperature detected. Check RTAS"
|
|
|
+ " error log for details\n");
|
|
|
orderly_poweroff(true);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- pr_err("Unknown power/cooling shutdown event (modifier %d)",
|
|
|
+ pr_err("Unknown power/cooling shutdown event (modifier = %d)\n",
|
|
|
event_modifier);
|
|
|
}
|
|
|
}
|
|
@@ -145,17 +146,20 @@ static void rtas_parse_epow_errlog(struct rtas_error_log *log)
|
|
|
|
|
|
switch (action_code) {
|
|
|
case EPOW_RESET:
|
|
|
- pr_err("Non critical power or cooling issue cleared");
|
|
|
+ if (num_epow_events) {
|
|
|
+ pr_info("Non critical power/cooling issue cleared\n");
|
|
|
+ num_epow_events--;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case EPOW_WARN_COOLING:
|
|
|
- pr_err("Non critical cooling issue reported by firmware");
|
|
|
- pr_err("Check RTAS error log for details");
|
|
|
+ pr_info("Non-critical cooling issue detected. Check RTAS error"
|
|
|
+ " log for details\n");
|
|
|
break;
|
|
|
|
|
|
case EPOW_WARN_POWER:
|
|
|
- pr_err("Non critical power issue reported by firmware");
|
|
|
- pr_err("Check RTAS error log for details");
|
|
|
+ pr_info("Non-critical power issue detected. Check RTAS error"
|
|
|
+ " log for details\n");
|
|
|
break;
|
|
|
|
|
|
case EPOW_SYSTEM_SHUTDOWN:
|
|
@@ -163,23 +167,27 @@ static void rtas_parse_epow_errlog(struct rtas_error_log *log)
|
|
|
break;
|
|
|
|
|
|
case EPOW_SYSTEM_HALT:
|
|
|
- pr_emerg("Firmware initiated power off");
|
|
|
+ pr_emerg("Critical power/cooling issue detected. Check RTAS"
|
|
|
+ " error log for details. Powering off.\n");
|
|
|
orderly_poweroff(true);
|
|
|
break;
|
|
|
|
|
|
case EPOW_MAIN_ENCLOSURE:
|
|
|
case EPOW_POWER_OFF:
|
|
|
- pr_emerg("Critical power/cooling issue reported by firmware");
|
|
|
- pr_emerg("Check RTAS error log for details");
|
|
|
- pr_emerg("Immediate power off");
|
|
|
+ pr_emerg("System about to lose power. Check RTAS error log "
|
|
|
+ " for details. Powering off immediately.\n");
|
|
|
emergency_sync();
|
|
|
kernel_power_off();
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- pr_err("Unknown power/cooling event (action code %d)",
|
|
|
+ pr_err("Unknown power/cooling event (action code = %d)\n",
|
|
|
action_code);
|
|
|
}
|
|
|
+
|
|
|
+ /* Increment epow events counter variable */
|
|
|
+ if (action_code != EPOW_RESET)
|
|
|
+ num_epow_events++;
|
|
|
}
|
|
|
|
|
|
/* Handle environmental and power warning (EPOW) interrupts. */
|
|
@@ -249,13 +257,12 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)
|
|
|
log_error(ras_log_buf, ERR_TYPE_RTAS_LOG, fatal);
|
|
|
|
|
|
if (fatal) {
|
|
|
- pr_emerg("Fatal hardware error reported by firmware");
|
|
|
- pr_emerg("Check RTAS error log for details");
|
|
|
- pr_emerg("Immediate power off");
|
|
|
+ pr_emerg("Fatal hardware error detected. Check RTAS error"
|
|
|
+ " log for details. Powering off immediately\n");
|
|
|
emergency_sync();
|
|
|
kernel_power_off();
|
|
|
} else {
|
|
|
- pr_err("Recoverable hardware error reported by firmware");
|
|
|
+ pr_err("Recoverable hardware error detected\n");
|
|
|
}
|
|
|
|
|
|
spin_unlock(&ras_log_buf_lock);
|