1 #include <libpdbg.h>
2
3 #include <analyzer/analyzer_main.hpp>
4 #include <attn/attention.hpp>
5 #include <attn/attn_config.hpp>
6 #include <attn/attn_dump.hpp>
7 #include <attn/attn_handler.hpp>
8 #include <attn/attn_main.hpp>
9 #include <buildinfo.hpp>
10 #include <cli.hpp>
11 #include <hei_buildinfo.hpp>
12 #include <util/pdbg_callback.hpp>
13
14 /**
15 * @brief Attention handler application main()
16 *
17 * This is the main interface to the hardware diagnostics application. This
18 * application can be loaded as a daemon for monitoring the attention
19 * gpio or it can be loaded as an application to analyze hardware and
20 * diagnose hardware error conditions.
21 *
22 * Usage:
23 * --analyze: Analyze the hardware
24 * --daemon: Start the attention handler daemon
25 *
26 * @return 0 = success
27 */
main(int argc,char * argv[])28 int main(int argc, char* argv[])
29 {
30 int rc = 0; // assume success
31
32 if (argc == 1)
33 {
34 printf("openpower-hw-diags <options>\n");
35 printf("options:\n");
36 printf(" --analyze: Analyze the hardware\n");
37 printf(" --daemon: Start the attn handler daemon\n");
38 printf("hwdiag: %s, hei: %s\n", BUILDINFO, libhei::getBuildInfo());
39 }
40 else
41 {
42 // set PDBG log callback function.
43 pdbg_set_logfunc(util::pdbg_log_callback);
44
45 // Pdbg targets should only be initialized once according to
46 // libpdbg documentation. Initializing them here will make sure
47 // they are initialized for the attention handler, invocation of
48 // the analyzer via attention handler and direct invocation of
49 // the analyzer via command line (--analyze).
50
51 pdbg_targets_init(nullptr); // nullptr == use default fdt
52
53 // Either analyze (application mode) or daemon mode
54 if (true == getCliOption(argv, argv + argc, "--analyze"))
55 {
56 // Analyze the host hardware.
57 // TODO: At the moment, we'll only do MANUAL analysis (no service
58 // actions). It may be possible in the future to allow command
59 // line options to change the analysis type, if needed.
60
61 attn::DumpParameters dumpParameters;
62 analyzer::analyzeHardware(analyzer::AnalysisType::MANUAL,
63 dumpParameters);
64 }
65 // daemon mode
66 else
67 {
68 if (true == getCliOption(argv, argv + argc, "--daemon"))
69 {
70 attn::Config attnConfig; // default config
71
72 // convert remaining cmd line args to config values
73 parseConfig(argv, argv + argc, &attnConfig);
74
75 attn::attnHandler(&attnConfig); // handle pending attentions
76
77 attn::attnDaemon(&attnConfig); // start daemon
78 }
79 }
80 }
81
82 return rc;
83 }
84