summaryrefslogtreecommitdiffstats
path: root/src/occ_405/wof
diff options
context:
space:
mode:
authormbroyles <mbroyles@us.ibm.com>2018-01-10 16:18:59 -0600
committerMartha Broyles <mbroyles@us.ibm.com>2018-01-15 13:42:20 -0500
commit2397cb606cda005ae0fdd8455a827450fb4d8b4f (patch)
treefc19b43040853cc2878a4f0003bc2458128b4781 /src/occ_405/wof
parentd868b77dfc6afd90d4fea874ae4a1175fffffaed (diff)
downloadtalos-occ-2397cb606cda005ae0fdd8455a827450fb4d8b4f.tar.gz
talos-occ-2397cb606cda005ae0fdd8455a827450fb4d8b4f.zip
Handle PGPE timeouts as workaround for prolonged droop events
Add "CLIP" information to poll response Fix incorrectly throttling due to power when all cores are in stop 2 or greater Change-Id: I502cc65ad8c4cffd7f9a1442fd4de185f3cac6e2 RTC: 183700 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/51741 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com> Reviewed-by: Andres A. Lugo-Reyes <aalugore@us.ibm.com> Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
Diffstat (limited to 'src/occ_405/wof')
-rw-r--r--src/occ_405/wof/wof.c76
1 files changed, 68 insertions, 8 deletions
diff --git a/src/occ_405/wof/wof.c b/src/occ_405/wof/wof.c
index f6d1050..9d58239 100644
--- a/src/occ_405/wof/wof.c
+++ b/src/occ_405/wof/wof.c
@@ -36,6 +36,7 @@
#include <wof.h>
#include <amec_freq.h>
#include <pgpe_interface.h>
+#include "common.h" // For ignore_pgpe_error()
//******************************************************************************
// External Globals
//******************************************************************************
@@ -132,6 +133,11 @@ void call_wof_main( void )
// Variable to ensure we do not keep trying to send the wof control
static bool L_wof_control_last_chance = false;
+ // Variable to keep track of logging timeouts being ignored
+ // Since WOF runs every 4ms we have already waited more than the required 1ms for PGPE
+ // to set the bit to give ignore indication so no additional timer needed before checking
+ static bool L_current_timeout_recorded = false;
+
// Variable to keep track of PState enablement to prevent setting/clearing
// wof_disabled bit every iteration.
static uint8_t L_pstate_protocol_off = 0;
@@ -222,19 +228,29 @@ void call_wof_main( void )
if( (!async_request_is_idle(&G_wof_vfrt_req.request)) ||
(g_wof->vfrt_state != STANDBY) )
{
- if( L_vfrt_last_chance == 0 )
+ if( (L_vfrt_last_chance == 0) && (!ignore_pgpe_error()) )
{
INTR_TRAC_ERR("WOF Disabled!"
" Init VFRT request timeout");
set_clear_wof_disabled( SET, WOF_RC_VFRT_REQ_TIMEOUT);
}
- else
+ else if(L_vfrt_last_chance != 0)
{
INTR_TRAC_INFO("initial VFRT NOT idle."
" %d more chance(s)",
L_vfrt_last_chance );
L_vfrt_last_chance--;
}
+ else
+ {
+ // Wait forever for PGPE to respond
+ // Put a mark on the wall so we know we hit this state
+ if(!L_current_timeout_recorded)
+ {
+ INCREMENT_ERR_HISTORY(ERRH_VFRT_TIMEOUT_IGNORED);
+ L_current_timeout_recorded = TRUE;
+ }
+ }
}
break;
@@ -247,23 +263,36 @@ void call_wof_main( void )
enable_success = enable_wof();
if( !enable_success )
{
- if( L_wof_control_last_chance )
+ // Treat as an error only if not currently ignoring PGPE failures
+ if( L_wof_control_last_chance && (!ignore_pgpe_error()) )
{
INTR_TRAC_ERR("WOF Disabled! Control req timeout(1)");
set_clear_wof_disabled(SET, WOF_RC_CONTROL_REQ_TIMEOUT);
}
- else
+ else if(!L_wof_control_last_chance)
{
INTR_TRAC_ERR("One more chance for WOF "
"control request(1)");
L_wof_control_last_chance = true;
}
+ else
+ {
+ // Wait forever for PGPE to respond
+ // Put a mark on the wall so we know we hit this state
+ if(!L_current_timeout_recorded)
+ {
+ INCREMENT_ERR_HISTORY(ERRH_WOF_CONTROL_TIMEOUT_IGNORED);
+ L_current_timeout_recorded = TRUE;
+ }
+ }
}
else
{
// Reset the last chance variable
// Init state updated in enable_wof
L_wof_control_last_chance = false;
+
+ L_current_timeout_recorded = FALSE;
}
break;
@@ -271,17 +300,32 @@ void call_wof_main( void )
// check if request is still processing.
if( !async_request_is_idle(&G_wof_control_req.request) )
{
- if( L_wof_control_last_chance )
+ // Treat as an error only if not currently ignoring PGPE failures
+ if( L_wof_control_last_chance && (!ignore_pgpe_error()) )
{
INTR_TRAC_ERR("WOF Disabled! Control req timeout(2)");
set_clear_wof_disabled(SET, WOF_RC_CONTROL_REQ_TIMEOUT);
}
- else
+ else if(!L_wof_control_last_chance)
{
INTR_TRAC_ERR("One more chance for WOF "
"control request(2)");
L_wof_control_last_chance = true;
}
+ else
+ {
+ // Wait forever for PGPE to respond
+ // Put a mark on the wall so we know we hit this state
+ if(!L_current_timeout_recorded)
+ {
+ INCREMENT_ERR_HISTORY(ERRH_WOF_CONTROL_TIMEOUT_IGNORED);
+ L_current_timeout_recorded = TRUE;
+ }
+ }
+ }
+ else
+ {
+ L_current_timeout_recorded = FALSE;
}
// Init state updated in wof_control_callback
break;
@@ -303,8 +347,22 @@ void call_wof_main( void )
{
if( L_vfrt_last_chance == 0 )
{
- INTR_TRAC_ERR("WOF Disabled! VFRT req timeout");
- set_clear_wof_disabled(SET,WOF_RC_VFRT_REQ_TIMEOUT);
+ // Treat as an error only if not currently ignoring PGPE failures
+ if(!ignore_pgpe_error())
+ {
+ INTR_TRAC_ERR("WOF Disabled! VFRT req timeout");
+ set_clear_wof_disabled(SET,WOF_RC_VFRT_REQ_TIMEOUT);
+ }
+ else
+ {
+ // Wait forever for PGPE to respond
+ // Put a mark on the wall so we know we hit this state
+ if(!L_current_timeout_recorded)
+ {
+ INCREMENT_ERR_HISTORY(ERRH_VFRT_TIMEOUT_IGNORED);
+ L_current_timeout_recorded = TRUE;
+ }
+ }
}
else
{
@@ -315,6 +373,8 @@ void call_wof_main( void )
}
else
{
+ L_current_timeout_recorded = FALSE;
+
// Request is idle. Run wof algorithm
wof_main();
OpenPOWER on IntegriCloud