xref: /openbmc/openpower-proc-control/procedures/common/collect_sbe_hb_data.cpp (revision a5311abddaa057a50b492c839b310f968a7e270f)
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