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