blob: d810c02aca56ac87f509683ded7353988c375623 [file] [log] [blame]
/**
* Copyright (C) 2017 IBM Corporation
*
* 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.
*/
#include "cfam_access.hpp"
#include "p9_cfam.hpp"
#include "registration.hpp"
#include "targeting.hpp"
#include <phosphor-logging/log.hpp>
namespace openpower
{
namespace p9
{
namespace debug
{
// SBE messaging register - cfam 2809
union sbeMsgReg_t
{
uint32_t data32;
struct
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
uint32_t reserved2 : 6;
uint32_t minorStep : 6;
uint32_t majorStep : 8;
uint32_t currState : 4;
uint32_t prevState : 4;
uint32_t reserved1 : 2;
uint32_t asyncFFDC : 1;
uint32_t sbeBooted : 1;
#else
uint32_t sbeBooted : 1;
uint32_t asyncFFDC : 1;
uint32_t reserved1 : 2;
uint32_t prevState : 4;
uint32_t currState : 4;
uint32_t majorStep : 8;
uint32_t minorStep : 6;
uint32_t reserved2 : 6;
#endif
} PACK;
};
// HB mailbox scratch register 5 - cfam 283C
union MboxScratch5_HB_t
{
uint32_t data32;
struct
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
uint32_t minorStep : 8; // 24:31
uint32_t majorStep : 8; // 16:23
uint32_t internalStep : 4; // 12:15
uint32_t reserved : 2; // 10:11
uint32_t stepFinish : 1; // 9
uint32_t stepStart : 1; // 8
uint32_t magic : 8; // 0:7
#else
uint32_t magic : 8; // 0:7
uint32_t stepStart : 1; // 8
uint32_t stepFinish : 1; // 9
uint32_t reserved : 2; // 10:11
uint32_t internalStep : 4; // 12:15
uint32_t majorStep : 8; // 16:23
uint32_t minorStep : 8; // 24:31
#endif
} PACK;
};
static constexpr uint8_t HB_MBX5_VALID_FLAG = 0xAA;
/**
* @brief Capture SBE and HB istep information on watchdog timeout
* @return void
*/
void collectSBEHBData()
{
using namespace openpower::targeting;
using namespace openpower::cfam::p9;
using namespace openpower::cfam::access;
using namespace phosphor::logging;
Targeting targets;
for (const auto& proc : targets)
{
// Read and parse SBE messaging register
try
{
auto readData = readReg(proc, P9_SBE_MSG_REGISTER);
auto msg = reinterpret_cast<const sbeMsgReg_t*>(&readData);
log<level::INFO>("SBE status register",
entry("PROC=%d", proc->getPos()),
entry("SBE_MAJOR_ISTEP=%d", msg->PACK.majorStep),
entry("SBE_MINOR_ISTEP=%d", msg->PACK.minorStep),
entry("REG_VAL=0x%08X", msg->data32));
}
catch (const std::exception& e)
{
log<level::ERR>(e.what());
// We want to continue - capturing as much info as possible
}
}
const auto& master = *(targets.begin());
// Read and parse HB messaging register
try
{
auto readData = readReg(master, P9_HB_MBX5_REG);
auto msg = reinterpret_cast<const MboxScratch5_HB_t*>(&readData);
if (HB_MBX5_VALID_FLAG == msg->PACK.magic)
{
log<level::INFO>("HB MBOX 5 register",
entry("HB_MAJOR_ISTEP=%d", msg->PACK.majorStep),
entry("HB_MINOR_ISTEP=%d", msg->PACK.minorStep),
entry("REG_VAL=0x%08X", msg->data32));
}
}
catch (const std::exception& e)
{
log<level::ERR>(e.what());
// We want to continue - capturing as much info as possible
}
}
REGISTER_PROCEDURE("collectSBEHBData", collectSBEHBData)
} // namespace debug
} // namespace p9
} // namespace openpower