1 #include <libpdbg.h>
2 
3 #include <attn/attn_common.hpp>
4 #include <attn/attn_logging.hpp>
5 #include <sdbusplus/bus.hpp>
6 #include <util/pdbg.hpp>
7 
8 #include <iomanip>
9 #include <iostream>
10 #include <map>
11 
12 namespace attn
13 {
14 
15 /** @brief Traces some regs for hostboot */
16 void addHbStatusRegs()
17 {
18     // Only do this for P10 systems
19     if (util::pdbg::queryHardwareAnalysisSupported())
20     {
21         // We only need this for PRIMARY processor
22         pdbg_target* pibTarget = pdbg_target_from_path(nullptr, "/proc0/pib");
23         pdbg_target* fsiTarget = pdbg_target_from_path(nullptr, "/proc0/fsi");
24 
25         uint32_t l_cfamData  = 0xFFFFFFFF;
26         uint64_t l_scomData1 = 0xFFFFFFFFFFFFFFFFull;
27         uint64_t l_scomData2 = 0xFFFFFFFFFFFFFFFFull;
28         uint32_t l_cfamAddr  = 0x283C;
29         uint64_t l_scomAddr1 = 0x4602F489;
30         uint64_t l_scomAddr2 = 0x4602F487;
31 
32         if ((nullptr != fsiTarget) && (nullptr != pibTarget))
33         {
34             // get first debug reg (CFAM)
35             if (RC_SUCCESS != fsi_read(fsiTarget, l_cfamAddr, &l_cfamData))
36             {
37                 eventAttentionFail((int)AttnSection::addHbStatusRegs |
38                                    ATTN_PDBG_CFAM);
39                 l_cfamData = 0xFFFFFFFF;
40             }
41 
42             // Get SCOM regs next (just 2 of them)
43             if (RC_SUCCESS != pib_read(pibTarget, l_scomAddr1, &l_scomData1))
44             {
45                 eventAttentionFail((int)AttnSection::addHbStatusRegs |
46                                    ATTN_PDBG_SCOM);
47                 l_scomData1 = 0xFFFFFFFFFFFFFFFFull;
48             }
49 
50             if (RC_SUCCESS != pib_read(pibTarget, l_scomAddr2, &l_scomData2))
51             {
52                 eventAttentionFail((int)AttnSection::addHbStatusRegs |
53                                    ATTN_PDBG_SCOM);
54                 l_scomData2 = 0xFFFFFFFFFFFFFFFFull;
55             }
56         }
57 
58         // Trace out the results here of all 3 regs
59         // (Format should resemble FSP: HostBoot Reg:0000283C  Data:AA801504
60         // 00000000  Proc:00050001 )
61         std::stringstream ss1, ss2, ss3;
62 
63         ss1 << "HostBoot Reg:" << std::setw(8) << std::setfill('0') << std::hex
64             << l_cfamAddr << " Data:" << l_cfamData << " Proc:00000000";
65 
66         ss2 << "HostBoot Reg:" << std::setw(8) << std::setfill('0') << std::hex
67             << l_scomAddr1 << " Data:" << std::setw(16) << l_scomData1
68             << " Proc:00000000";
69 
70         ss3 << "HostBoot Reg:" << std::setw(8) << std::setfill('0') << std::hex
71             << l_scomAddr2 << " Data:" << std::setw(16) << l_scomData2
72             << " Proc:00000000";
73 
74         std::string strobj1 = ss1.str();
75         std::string strobj2 = ss2.str();
76         std::string strobj3 = ss3.str();
77 
78         trace<level::INFO>(strobj1.c_str());
79         trace<level::INFO>(strobj2.c_str());
80         trace<level::INFO>(strobj3.c_str());
81     }
82 
83     return;
84 
85 } // end addHbStatusRegs
86 
87 } // namespace attn
88