Source code for testcases.SbePassThrough
#!/usr/bin/env python3
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: op-test-framework/testcases/SbePassThrough.py $
#
# OpenPOWER Automated Test Project
#
# Contributors Listed Below - COPYRIGHT 2015
# [+] 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
'''
SbePassThrough
--------------
Test case for SBE passthrough
'''
import unittest
import time
import OpTestConfiguration
from common.OpTestSystem import OpSystemState
from common.Exceptions import CommandFailed
import logging
import OpTestLogger
log = OpTestLogger.optest_logger_glob.get_logger(__name__)
[docs]class SbePassThrough(unittest.TestCase):
[docs] def setUp(self):
conf = OpTestConfiguration.conf
self.cv_IPMI = conf.ipmi()
self.cv_SYSTEM = conf.system()
self.cv_HOST = conf.host()
self.bmc_type = conf.args.bmc_type
self.cv_SYSTEM.goto_state(OpSystemState.OS)
def setup_init(self):
self.c.run_command("dmesg -D")
self.cpu = ''.join(self.c.run_command(
"grep '^cpu' /proc/cpuinfo |uniq|sed -e 's/^.*: //;s/[,]* .*//;'"))
if self.cpu not in ["POWER9", "POWER9P"]:
self.skipTest(
"SBE passthrough test not supported on %s" % self.cpu)
if self.cpu in ["POWER9", "POWER9P"]:
self.DOORBELL_REG = "D0063"
self.os_level = self.cv_HOST.host_get_OS_Level()
self.chips = self.cv_HOST.host_get_list_of_chips()
def setup_opalprd_logs(self):
self.prd_log_cmd = "journalctl -t opal-prd -p 7"
self.c.run_command("%s > /tmp/opal_prd_log" % self.prd_log_cmd)
def is_sbe_interrupt_processed(self):
cmd = "%s | diff -a /tmp/opal_prd_log -" % self.prd_log_cmd
for i in range(31):
self.data = " ".join(self.c.run_command_ignore_fail(cmd))
if "SBEIO:<< process_sbe_msg" in self.data:
log.debug(
"OPAL Processed the SBE interrupt and called HBRT accordingly")
return True
time.sleep(2)
else:
return False
def is_sel_sent_to_bmc(self):
if "IPMI:sel: <<process_esel" in self.data:
log.debug("HBRT/Host Commited error log and sent to BMC/FSP")
return True
return False
def runTest(self):
self.cv_SYSTEM.goto_state(OpSystemState.OS)
self.c = self.cv_SYSTEM.console
# Clear any pre-existing SEL or eSEL's
self.cv_SYSTEM.sys_sdr_clear()
self.c.run_command("dmesg -D")
# Make sure opal-prd daemon runs before test starts
try:
start_res = self.c.run_command("service opal-prd start")
log.debug("start_res={}".format(start_res))
pid_res = self.c.run_command("pidof opal-prd")
log.debug("pid_res={}".format(pid_res))
except Exception as e:
log.debug("Unable to start opal-prd.service or keep opal-prd running,"
" unable to run test, Exception={}".format(e))
self.assertTrue(False, "Unable to start opal-prd.service or keep "
"opal-prd running, unable to run test, raise a bug {}".format(e))
self.setup_init()
for i in range(0, 2):
for chip in self.chips:
self.setup_opalprd_logs()
cmd = "PATH=/usr/local/sbin:$PATH getscom -c %s %s" % (
chip, self.DOORBELL_REG)
self.c.run_command(cmd)
value = "0x0800000000000000"
cmd = "PATH=/usr/local/sbin:$PATH putscom -c %s %s %s" % (
chip, self.DOORBELL_REG, value)
self.c.run_command(cmd)
self.assertTrue(self.is_sbe_interrupt_processed(),
"OPAL Failed to process the SBE Interrupt")
self.assertTrue(self.is_sel_sent_to_bmc(),
"HBRT/Host failed to send the eSEL to MC/SP")
log.debug(self.cv_SYSTEM.sys_get_sel_list())
sels = " ".join(self.c.run_command("ipmitool sel list"))
if 'SEL has no entries' in sels:
self.assertTrue(False, "SP/MC is failed to log eSEL")
elif "OEM record df | 040020" in sels:
log.debug("SEL is properly committed and logged by SP/MC")