diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2017-11-10 06:01:29 -0600 |
---|---|---|
committer | Martha Broyles <mbroyles@us.ibm.com> | 2017-12-18 11:42:27 -0500 |
commit | 0bf193d8d4f98934d4f539b1950e8b46c03a2716 (patch) | |
tree | b429746ff2533b2fc95178cfc7342457c0b46ed0 /src/occ_gpe0/apss_init.c | |
parent | fce2d94a9bc94e9468bce173b11fd0b96ef36c1f (diff) | |
download | talos-occ-0bf193d8d4f98934d4f539b1950e8b46c03a2716.tar.gz talos-occ-0bf193d8d4f98934d4f539b1950e8b46c03a2716.zip |
APSS Reset Support
Change-Id: I23dd10a7bc78841ecd4382e8ac8667afbb7c2ddd
RTC: 163601
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/49871
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com>
Reviewed-by: William A. Bryan <wilbryan@us.ibm.com>
Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
Diffstat (limited to 'src/occ_gpe0/apss_init.c')
-rw-r--r-- | src/occ_gpe0/apss_init.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/occ_gpe0/apss_init.c b/src/occ_gpe0/apss_init.c index 702393a..efb3f8d 100644 --- a/src/occ_gpe0/apss_init.c +++ b/src/occ_gpe0/apss_init.c @@ -29,6 +29,11 @@ #include "pss_constants.h" #include <apss_structs.h> //H file common with occ_405 #include "gpe_util.h" +#include "p9_misc_scom_addresses.h" + +// PV_CP0_P_PRV_GPIO2 +#define APSS_RESET_GPIO (0x2000000000000000ull) + // Default to Auto-2 for now, should get set when the mode // is initialized, and before any APSS data is gathered. @@ -201,6 +206,45 @@ void apss_init_gpio(ipc_msg_t* cmd, void* arg) break; } }//End of port while loop. + if (rc) + { + break; + } + + // Enable GPIO that's used for APSS resets + // + // Set APSS_RESET_GPIO output high before enabling it's output + + regValue = APSS_RESET_GPIO; + rc = putscom_abs(PU_GPIO_OUTPUT_OR, regValue); + if(rc) + { + PK_TRACE("apss_init: APSS_RESET_GPIO_OUTPUT low failed. rc:0x%08x",rc); + gpe_set_ffdc(&(args->error), 0, GPE_RC_SCOM_PUT_FAILED, rc); + break; + } + + // Read output enable pins. + rc = getscom_abs(PU_GPIO_OUTPUT_EN, ®Value); + if(rc) + { + PK_TRACE("apss_init: Read APSS_RESET_GPIO_OUTPUT_EN failed. rc:0x%08x",rc); + gpe_set_ffdc(&(args->error), 0, GPE_RC_SCOM_GET_FAILED, rc); + break; + } + + // Enable APSS_RESET_GPIO as output + regValue |= APSS_RESET_GPIO; + + rc = putscom_abs(PU_GPIO_OUTPUT_EN, regValue); + if(rc) + { + PK_TRACE("apss_init: APSS_RESET_GPIO_OUTPUT_EN failed. rc:0x%08x",rc); + gpe_set_ffdc(&(args->error), 0, GPE_RC_SCOM_PUT_FAILED, rc); + break; + } + + }while(0); // send back a successful response. OCC will check rc and ffdc @@ -353,3 +397,48 @@ void apss_init_mode(ipc_msg_t* cmd, void* arg) PK_TRACE("apss_init_mode: completed successfully."); } } + + +// ---------------------------------------------------- +// Toggle the output of the APSS RESET pin +// ---------------------------------------------------- +void apss_toggle_hw_reset(ipc_msg_t* cmd, void* arg) +{ + static int g_apss_reset_state = ~(0); + + int rc = 0; + uint32_t apss_reset_address; + ipc_async_cmd_t *async_cmd = (ipc_async_cmd_t*)cmd; + initGpioArgs_t *args = (initGpioArgs_t*)async_cmd->cmd_data; + + if(g_apss_reset_state) // not in reset + { + apss_reset_address = PU_GPIO_OUTPUT_CLR; + } + else + { + apss_reset_address = PU_GPIO_OUTPUT_OR; + } + g_apss_reset_state = ~g_apss_reset_state; + PK_TRACE("apss_toggle_apss_hw_reset: %d",(uint16_t)g_apss_reset_state); + + + // Set/clear GPIO2 output + rc = putscom_abs(apss_reset_address, APSS_RESET_GPIO); + if(rc) + { + PK_TRACE("apss_toggle_hw_reset: APSS_RESET_GPIO_OUTPUT toggle failed. rc:0x%08x",rc); + gpe_set_ffdc(&(args->error), 0, GPE_RC_SCOM_PUT_FAILED, rc); + } + + // send back a successful response. OCC will check rc and ffdc + rc = ipc_send_rsp(cmd, IPC_RC_SUCCESS); + + if(rc) + { + PK_TRACE("apss_toggle_hw_reset: Failed to send response back. rc = 0x%08x. Halting GPE0", + rc); + gpe_set_ffdc(&(args->error), 0x00, rc, 0); + pk_halt(); + } +} |