From d73083bf624069acdeb8aa56f3d6cfa65dd00e08 Mon Sep 17 00:00:00 2001 From: Santosh Puranik Date: Wed, 27 Apr 2016 12:02:24 -0500 Subject: Machine check interrupt handler Added an interrupt handler for PPE machine check to gracefully handle SCOM failures. Change-Id: I75711ea9817a95e678e365efec9c12243c5e8b46 RTC: 148524 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23735 Tested-by: Jenkins Server Reviewed-by: Sachin Gupta Reviewed-by: AMIT J. TENDOLKAR --- sbe/sbefw/pk_app_cfg.h | 29 ++++++++++++++++++++ sbe/sbefw/sbeirq.C | 67 ++++++++++++++++++++++++++++++++++++++++++++++ sbe/sbefw/sbeirq.H | 27 ++++++++++++++++++- sbe/test/testPutGetScom.py | 58 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+), 1 deletion(-) (limited to 'sbe') diff --git a/sbe/sbefw/pk_app_cfg.h b/sbe/sbefw/pk_app_cfg.h index 36f8b775..a7489ab8 100644 --- a/sbe/sbefw/pk_app_cfg.h +++ b/sbe/sbefw/pk_app_cfg.h @@ -1,3 +1,27 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: sbe/sbefw/pk_app_cfg.h $ */ +/* */ +/* OpenPOWER sbe Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2015,2016 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ /* * @file: ppe/sbe/sbefw/pk_app_cfg.h * @@ -107,4 +131,9 @@ */ #define PK_TRACE_TIMER_OUTPUT 0 +#ifdef PPE42_MACHINE_CHECK_HANDLER +#undef PPE42_MACHINE_CHECK_HANDLER +#endif +#define PPE42_MACHINE_CHECK_HANDLER SBE_MACHINE_CHECK_HANDLER + #endif /*__PK_APP_CFG_H__*/ diff --git a/sbe/sbefw/sbeirq.C b/sbe/sbefw/sbeirq.C index 0f160509..efcb210b 100644 --- a/sbe/sbefw/sbeirq.C +++ b/sbe/sbefw/sbeirq.C @@ -1,3 +1,27 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: sbe/sbefw/sbeirq.C $ */ +/* */ +/* OpenPOWER sbe Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2015,2016 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ /* * @file: ppe/sbe/sbefw/sbeirq.C * @@ -124,3 +148,46 @@ int sbeIRQSetup (void) #undef SBE_FUNC } +//////////////////////////////////////////////////////////////// +// SBE handler for the PPE machine check interrupt +//////////////////////////////////////////////////////////////// +// TODO: via RTC 155896 - Change the way bad scoms are handled. +// Once HW375602 is fixed, there will be no need for this +// interrupt handler. +extern "C" void __sbe_machine_check_handler() +{ + asm( + "# Save r4 to stack, since it is going to be used by\n" + "# this handler\n" + "stwu %r1, -8(%r1)\n" + "stw %r4, 0(%r1)\n" + "# Check the MCS bits (29:31) in the ISR to determine the cause for the machine check\n" + "# For a data machine check, the MCS should be 0x001 to 0x011\n" + "mfisr %r4\n" + "andi. %r4, %r4, 0x0007\n" + "bwz %r4, __hang_forever\n" + "cmpwibgt %r4, 0x0003, __hang_forever\n" + "# The EDR contains the address that caused the machine check\n" + "mfedr %r4\n" + "srawi %r4, %r4, 16\n" + "# If the address is in the range 0x00000000 - 0x7f000000, we treat it as a\n" + "# failed scom and jump to __scom_error\n" + "cmplwi %r4, 0x8000\n" + "blt __scom_error\n" + "# Else, just hang here forever\n" + "__hang_forever:\n" + "b .\n" + "__scom_error:\n" + "# The srr0 contains the address of the instruction that caused the machine\n" + "# check (since the the interrupt is raised *before* the instruction\n" + "# completed execution). Since we want the code to continue with the next\n" + "# instruction, we increment srr0 by 4, restore r4, and rfi to branch to srr0\n" + "mfsrr0 %r4\n" + "addi %r4, %r4, 4\n" + "mtsrr0 %r4\n" + "lwz %r4, 0(%r1)\n" + "addi %r1, %r1, 8\n" + "rfi\n" + ); +} + diff --git a/sbe/sbefw/sbeirq.H b/sbe/sbefw/sbeirq.H index acf32079..d01affbf 100644 --- a/sbe/sbefw/sbeirq.H +++ b/sbe/sbefw/sbeirq.H @@ -1,3 +1,27 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: sbe/sbefw/sbeirq.H $ */ +/* */ +/* OpenPOWER sbe Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2015,2016 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ /* * $file: ppe/sbe/sbefw/sbeirq.H * @@ -80,6 +104,7 @@ #define SBE_IRQ_RESERVED_62 62 #define SBE_IRQ_RESERVED_63 63 - +#define SBE_MACHINE_CHECK_HANDLER \ + b __sbe_machine_check_handler #endif //_SBE_IRQ_H diff --git a/sbe/test/testPutGetScom.py b/sbe/test/testPutGetScom.py index 63007191..53d0ea2c 100755 --- a/sbe/test/testPutGetScom.py +++ b/sbe/test/testPutGetScom.py @@ -1,3 +1,27 @@ +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: sbe/test/testPutGetScom.py $ +# +# OpenPOWER sbe Project +# +# Contributors Listed Below - COPYRIGHT 2015,2016 +# [+] International Business Machines Corp. +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. See the License for the specific language governing +# permissions and limitations under the License. +# +# IBM_PROLOG_END_TAG import sys sys.path.append("targets/p9_nimbus/sbeTest" ) import testUtil @@ -15,21 +39,47 @@ PUTSCOM_TESTDATA = [0,0,0,6, 0xde,0xca,0xff,0xee, 0x00,0x00,0x00,0x00 ] +PUTSCOM_TESTDATA_INVALID = [0,0,0,6, + 0,0,0xA2,0x02, + 0,0,0x0,0x00, + # TODO via RTC 152952: This address is invalid for + # Nimbus but not for Cumulus + 0x0a,0x00,0x00,0x00, + 0xde,0xca,0xff,0xee, + 0x00,0x00,0x00,0x00 ] + PUTSCOM_EXPDATA = [0xc0,0xde,0xa2,0x02, 0x0,0x0,0x0,0x0, 0x00,0x0,0x0,0x03]; +PUTSCOM_EXPDATA_INVALID = [0xc0,0xde,0xa2,0x02, + 0x0,0xfe,0x0,0x0a, + 0x00,0x0,0x0,0x04, + 0x00,0x0,0x0,0x04]; + GETSCOM_TESTDATA = [0,0,0,4, 0,0,0xA2,0x01, 0,0,0x0,0x00, 0,0x05,0x0,0x3E] +GETSCOM_TESTDATA_INVALID = [0,0,0,4, + 0,0,0xA2,0x01, + 0,0,0x0,0x00, + # TODO via RTC: 152952: This address is invalid for + # Nimbus but not for Cumulus + 0x0a,0x0,0x0,0x0] + GETSCOM_EXPDATA = [0xde,0xca,0xff,0xee, 0x00,0x00,0x00,0x00, 0xc0,0xde,0xa2,0x01, 0x0,0x0,0x0,0x0, 0x00,0x0,0x0,0x03]; +GETSCOM_EXPDATA_INVALID = [0xc0,0xde,0xa2,0x01, + 0x0,0xfe,0x0,0x0a, + 0x00,0x0,0x0,0x04, + 0x00,0x0,0x0,0x04]; + # MAIN Test Run Starts Here... #------------------------------------------------- def main( ): @@ -38,10 +88,18 @@ def main( ): testUtil.writeEot( ) testUtil.readDsFifo( PUTSCOM_EXPDATA ) testUtil.readEot( ) + testUtil.writeUsFifo( PUTSCOM_TESTDATA_INVALID ) + testUtil.writeEot( ) + testUtil.readDsFifo( PUTSCOM_EXPDATA_INVALID ) + testUtil.readEot( ) testUtil.writeUsFifo( GETSCOM_TESTDATA ) testUtil.writeEot( ) testUtil.readDsFifo( GETSCOM_EXPDATA ) testUtil.readEot( ) + testUtil.writeUsFifo( GETSCOM_TESTDATA_INVALID ) + testUtil.writeEot( ) + testUtil.readDsFifo( GETSCOM_EXPDATA_INVALID ) + testUtil.readEot( ) #------------------------------------------------- # Calling all test code -- cgit v1.2.1