1*a5311abdSJayanth Othayoth /** 2*a5311abdSJayanth Othayoth * Copyright (C) 2017 IBM Corporation 3*a5311abdSJayanth Othayoth * 4*a5311abdSJayanth Othayoth * Licensed under the Apache License, Version 2.0 (the "License"); 5*a5311abdSJayanth Othayoth * you may not use this file except in compliance with the License. 6*a5311abdSJayanth Othayoth * You may obtain a copy of the License at 7*a5311abdSJayanth Othayoth * 8*a5311abdSJayanth Othayoth * http://www.apache.org/licenses/LICENSE-2.0 9*a5311abdSJayanth Othayoth * 10*a5311abdSJayanth Othayoth * Unless required by applicable law or agreed to in writing, software 11*a5311abdSJayanth Othayoth * distributed under the License is distributed on an "AS IS" BASIS, 12*a5311abdSJayanth Othayoth * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*a5311abdSJayanth Othayoth * See the License for the specific language governing permissions and 14*a5311abdSJayanth Othayoth * limitations under the License. 15*a5311abdSJayanth Othayoth */ 16*a5311abdSJayanth Othayoth #include "cfam_access.hpp" 17*a5311abdSJayanth Othayoth #include "p9_cfam.hpp" 18*a5311abdSJayanth Othayoth #include "registration.hpp" 19*a5311abdSJayanth Othayoth #include "targeting.hpp" 20*a5311abdSJayanth Othayoth 21*a5311abdSJayanth Othayoth #include <phosphor-logging/log.hpp> 22*a5311abdSJayanth Othayoth 23*a5311abdSJayanth Othayoth namespace openpower 24*a5311abdSJayanth Othayoth { 25*a5311abdSJayanth Othayoth namespace p9 26*a5311abdSJayanth Othayoth { 27*a5311abdSJayanth Othayoth namespace debug 28*a5311abdSJayanth Othayoth { 29*a5311abdSJayanth Othayoth // SBE messaging register - cfam 2809 30*a5311abdSJayanth Othayoth union sbeMsgReg_t 31*a5311abdSJayanth Othayoth { 32*a5311abdSJayanth Othayoth uint32_t data32; 33*a5311abdSJayanth Othayoth 34*a5311abdSJayanth Othayoth struct 35*a5311abdSJayanth Othayoth { 36*a5311abdSJayanth Othayoth #if __BYTE_ORDER == __LITTLE_ENDIAN 37*a5311abdSJayanth Othayoth uint32_t reserved2 : 6; 38*a5311abdSJayanth Othayoth uint32_t minorStep : 6; 39*a5311abdSJayanth Othayoth uint32_t majorStep : 8; 40*a5311abdSJayanth Othayoth uint32_t currState : 4; 41*a5311abdSJayanth Othayoth uint32_t prevState : 4; 42*a5311abdSJayanth Othayoth uint32_t reserved1 : 2; 43*a5311abdSJayanth Othayoth uint32_t asyncFFDC : 1; 44*a5311abdSJayanth Othayoth uint32_t sbeBooted : 1; 45*a5311abdSJayanth Othayoth #else 46*a5311abdSJayanth Othayoth uint32_t sbeBooted : 1; 47*a5311abdSJayanth Othayoth uint32_t asyncFFDC : 1; 48*a5311abdSJayanth Othayoth uint32_t reserved1 : 2; 49*a5311abdSJayanth Othayoth uint32_t prevState : 4; 50*a5311abdSJayanth Othayoth uint32_t currState : 4; 51*a5311abdSJayanth Othayoth uint32_t majorStep : 8; 52*a5311abdSJayanth Othayoth uint32_t minorStep : 6; 53*a5311abdSJayanth Othayoth uint32_t reserved2 : 6; 54*a5311abdSJayanth Othayoth #endif 55*a5311abdSJayanth Othayoth } PACKED; 56*a5311abdSJayanth Othayoth }; 57*a5311abdSJayanth Othayoth 58*a5311abdSJayanth Othayoth // HB mailbox scratch register 5 - cfam 283C 59*a5311abdSJayanth Othayoth union MboxScratch5_HB_t 60*a5311abdSJayanth Othayoth { 61*a5311abdSJayanth Othayoth uint32_t data32; 62*a5311abdSJayanth Othayoth struct 63*a5311abdSJayanth Othayoth { 64*a5311abdSJayanth Othayoth #if __BYTE_ORDER == __LITTLE_ENDIAN 65*a5311abdSJayanth Othayoth uint32_t minorStep : 8; // 24:31 66*a5311abdSJayanth Othayoth uint32_t majorStep : 8; // 16:23 67*a5311abdSJayanth Othayoth uint32_t internalStep : 4; // 12:15 68*a5311abdSJayanth Othayoth uint32_t reserved : 2; // 10:11 69*a5311abdSJayanth Othayoth uint32_t stepFinish : 1; // 9 70*a5311abdSJayanth Othayoth uint32_t stepStart : 1; // 8 71*a5311abdSJayanth Othayoth uint32_t magic : 8; // 0:7 72*a5311abdSJayanth Othayoth #else 73*a5311abdSJayanth Othayoth uint32_t magic : 8; // 0:7 74*a5311abdSJayanth Othayoth uint32_t stepStart : 1; // 8 75*a5311abdSJayanth Othayoth uint32_t stepFinish : 1; // 9 76*a5311abdSJayanth Othayoth uint32_t reserved : 2; // 10:11 77*a5311abdSJayanth Othayoth uint32_t internalStep : 4; // 12:15 78*a5311abdSJayanth Othayoth uint32_t majorStep : 8; // 16:23 79*a5311abdSJayanth Othayoth uint32_t minorStep : 8; // 24:31 80*a5311abdSJayanth Othayoth #endif 81*a5311abdSJayanth Othayoth } PACKED; 82*a5311abdSJayanth Othayoth }; 83*a5311abdSJayanth Othayoth 84*a5311abdSJayanth Othayoth static constexpr uint8_t HB_MBX5_VALID_FLAG = 0xAA; 85*a5311abdSJayanth Othayoth 86*a5311abdSJayanth Othayoth /** 87*a5311abdSJayanth Othayoth * @brief Capture SBE and HB istep information on watchdog timeout 88*a5311abdSJayanth Othayoth * @return void 89*a5311abdSJayanth Othayoth */ 90*a5311abdSJayanth Othayoth void collectSBEHBData() 91*a5311abdSJayanth Othayoth { 92*a5311abdSJayanth Othayoth using namespace openpower::targeting; 93*a5311abdSJayanth Othayoth using namespace openpower::cfam::p9; 94*a5311abdSJayanth Othayoth using namespace openpower::cfam::access; 95*a5311abdSJayanth Othayoth using namespace phosphor::logging; 96*a5311abdSJayanth Othayoth 97*a5311abdSJayanth Othayoth Targeting targets; 98*a5311abdSJayanth Othayoth 99*a5311abdSJayanth Othayoth for (const auto& proc : targets) 100*a5311abdSJayanth Othayoth { 101*a5311abdSJayanth Othayoth // Read and parse SBE messaging register 102*a5311abdSJayanth Othayoth try 103*a5311abdSJayanth Othayoth { 104*a5311abdSJayanth Othayoth auto readData = readReg(proc, P9_SBE_MSG_REGISTER); 105*a5311abdSJayanth Othayoth auto msg = reinterpret_cast<const sbeMsgReg_t*>(&readData); 106*a5311abdSJayanth Othayoth log<level::INFO>("SBE status register", 107*a5311abdSJayanth Othayoth entry("PROC=%d", proc->getPos()), 108*a5311abdSJayanth Othayoth entry("SBE_MAJOR_ISTEP=%d", msg->PACKED.majorStep), 109*a5311abdSJayanth Othayoth entry("SBE_MINOR_ISTEP=%d", msg->PACKED.minorStep), 110*a5311abdSJayanth Othayoth entry("REG_VAL=0x%08X", msg->data32)); 111*a5311abdSJayanth Othayoth } 112*a5311abdSJayanth Othayoth catch (const std::exception& e) 113*a5311abdSJayanth Othayoth { 114*a5311abdSJayanth Othayoth log<level::ERR>(e.what()); 115*a5311abdSJayanth Othayoth // We want to continue - capturing as much info as possible 116*a5311abdSJayanth Othayoth } 117*a5311abdSJayanth Othayoth } 118*a5311abdSJayanth Othayoth 119*a5311abdSJayanth Othayoth const auto& master = *(targets.begin()); 120*a5311abdSJayanth Othayoth // Read and parse HB messaging register 121*a5311abdSJayanth Othayoth try 122*a5311abdSJayanth Othayoth { 123*a5311abdSJayanth Othayoth auto readData = readReg(master, P9_HB_MBX5_REG); 124*a5311abdSJayanth Othayoth auto msg = reinterpret_cast<const MboxScratch5_HB_t*>(&readData); 125*a5311abdSJayanth Othayoth if (HB_MBX5_VALID_FLAG == msg->PACKED.magic) 126*a5311abdSJayanth Othayoth { 127*a5311abdSJayanth Othayoth log<level::INFO>("HB MBOX 5 register", 128*a5311abdSJayanth Othayoth entry("HB_MAJOR_ISTEP=%d", msg->PACKED.majorStep), 129*a5311abdSJayanth Othayoth entry("HB_MINOR_ISTEP=%d", msg->PACKED.minorStep), 130*a5311abdSJayanth Othayoth entry("REG_VAL=0x%08X", msg->data32)); 131*a5311abdSJayanth Othayoth } 132*a5311abdSJayanth Othayoth } 133*a5311abdSJayanth Othayoth catch (const std::exception& e) 134*a5311abdSJayanth Othayoth { 135*a5311abdSJayanth Othayoth log<level::ERR>(e.what()); 136*a5311abdSJayanth Othayoth // We want to continue - capturing as much info as possible 137*a5311abdSJayanth Othayoth } 138*a5311abdSJayanth Othayoth } 139*a5311abdSJayanth Othayoth 140*a5311abdSJayanth Othayoth REGISTER_PROCEDURE("collectSBEHBData", collectSBEHBData); 141*a5311abdSJayanth Othayoth 142*a5311abdSJayanth Othayoth } // namespace debug 143*a5311abdSJayanth Othayoth } // namespace p9 144*a5311abdSJayanth Othayoth } // namespace openpower 145