1*858d1aafSDhruvaraj Subhashchandran #pragma once
2*858d1aafSDhruvaraj Subhashchandran 
3*858d1aafSDhruvaraj Subhashchandran extern "C"
4*858d1aafSDhruvaraj Subhashchandran {
5*858d1aafSDhruvaraj Subhashchandran #include <libpdbg.h>
6*858d1aafSDhruvaraj Subhashchandran #include <libpdbg_sbe.h>
7*858d1aafSDhruvaraj Subhashchandran }
8*858d1aafSDhruvaraj Subhashchandran 
9*858d1aafSDhruvaraj Subhashchandran #include <cstdint>
10*858d1aafSDhruvaraj Subhashchandran #include <filesystem>
11*858d1aafSDhruvaraj Subhashchandran #include <future>
12*858d1aafSDhruvaraj Subhashchandran #include <vector>
13*858d1aafSDhruvaraj Subhashchandran 
14*858d1aafSDhruvaraj Subhashchandran namespace openpower::dump::sbe_chipop
15*858d1aafSDhruvaraj Subhashchandran {
16*858d1aafSDhruvaraj Subhashchandran 
17*858d1aafSDhruvaraj Subhashchandran /**
18*858d1aafSDhruvaraj Subhashchandran  * @class SbeDumpCollector
19*858d1aafSDhruvaraj Subhashchandran  * @brief Manages the collection of dumps from SBEs on failure.
20*858d1aafSDhruvaraj Subhashchandran  *
21*858d1aafSDhruvaraj Subhashchandran  * This class provides functionalities to orchestrate the collection of
22*858d1aafSDhruvaraj Subhashchandran  * diagnostic dumps from Self Boot Engines across multiple processors
23*858d1aafSDhruvaraj Subhashchandran  * in response to failures or for diagnostic purposes.
24*858d1aafSDhruvaraj Subhashchandran  */
25*858d1aafSDhruvaraj Subhashchandran class SbeDumpCollector
26*858d1aafSDhruvaraj Subhashchandran {
27*858d1aafSDhruvaraj Subhashchandran   public:
28*858d1aafSDhruvaraj Subhashchandran     /**
29*858d1aafSDhruvaraj Subhashchandran      * @brief Constructs a new SbeDumpCollector object.
30*858d1aafSDhruvaraj Subhashchandran      */
31*858d1aafSDhruvaraj Subhashchandran     SbeDumpCollector() = default;
32*858d1aafSDhruvaraj Subhashchandran 
33*858d1aafSDhruvaraj Subhashchandran     /**
34*858d1aafSDhruvaraj Subhashchandran      * @brief Destroys the SbeDumpCollector object.
35*858d1aafSDhruvaraj Subhashchandran      */
36*858d1aafSDhruvaraj Subhashchandran     ~SbeDumpCollector() = default;
37*858d1aafSDhruvaraj Subhashchandran 
38*858d1aafSDhruvaraj Subhashchandran     /**
39*858d1aafSDhruvaraj Subhashchandran      * @brief Orchestrates the collection of dumps from all available SBEs.
40*858d1aafSDhruvaraj Subhashchandran      *
41*858d1aafSDhruvaraj Subhashchandran      * Initiates the process of collecting diagnostic dumps from SBEs. This
42*858d1aafSDhruvaraj Subhashchandran      * involves identifying available processors, initiating the dump
43*858d1aafSDhruvaraj Subhashchandran      * collection process, and managing the collected dump files.
44*858d1aafSDhruvaraj Subhashchandran      *
45*858d1aafSDhruvaraj Subhashchandran      * @param type The type of dump to collect.
46*858d1aafSDhruvaraj Subhashchandran      * @param id A unique identifier for the dump collection operation.
47*858d1aafSDhruvaraj Subhashchandran      * @param failingUnit The identifier of the failing unit prompting the dump
48*858d1aafSDhruvaraj Subhashchandran      * collection.
49*858d1aafSDhruvaraj Subhashchandran      * @param path The filesystem path where collected dumps should be stored.
50*858d1aafSDhruvaraj Subhashchandran      */
51*858d1aafSDhruvaraj Subhashchandran     void collectDump(uint8_t type, uint32_t id, uint64_t failingUnit,
52*858d1aafSDhruvaraj Subhashchandran                      const std::filesystem::path& path);
53*858d1aafSDhruvaraj Subhashchandran 
54*858d1aafSDhruvaraj Subhashchandran   private:
55*858d1aafSDhruvaraj Subhashchandran     /**
56*858d1aafSDhruvaraj Subhashchandran      * @brief Collects a dump from a single SBE.
57*858d1aafSDhruvaraj Subhashchandran      *
58*858d1aafSDhruvaraj Subhashchandran      * Executes the low-level operations required to collect a diagnostic
59*858d1aafSDhruvaraj Subhashchandran      * dump from the specified SBE.
60*858d1aafSDhruvaraj Subhashchandran      *
61*858d1aafSDhruvaraj Subhashchandran      * @param chip A pointer to the pdbg_target structure representing the SBE.
62*858d1aafSDhruvaraj Subhashchandran      * @param path The filesystem path where the dump should be stored.
63*858d1aafSDhruvaraj Subhashchandran      * @param id The unique identifier for this dump collection operation.
64*858d1aafSDhruvaraj Subhashchandran      * @param type The type of dump to collect.
65*858d1aafSDhruvaraj Subhashchandran      * @param clockState The clock state of the SBE during dump collection.
66*858d1aafSDhruvaraj Subhashchandran      * @param failingUnit The identifier of the failing unit.
67*858d1aafSDhruvaraj Subhashchandran      */
68*858d1aafSDhruvaraj Subhashchandran     void collectDumpFromSBE(struct pdbg_target* chip,
69*858d1aafSDhruvaraj Subhashchandran                             const std::filesystem::path& path, uint32_t id,
70*858d1aafSDhruvaraj Subhashchandran                             uint8_t type, uint8_t clockState,
71*858d1aafSDhruvaraj Subhashchandran                             uint64_t failingUnit);
72*858d1aafSDhruvaraj Subhashchandran 
73*858d1aafSDhruvaraj Subhashchandran     /**
74*858d1aafSDhruvaraj Subhashchandran      * @brief Initializes the PDBG library.
75*858d1aafSDhruvaraj Subhashchandran      *
76*858d1aafSDhruvaraj Subhashchandran      * Prepares the PDBG library for interacting with processor targets. This
77*858d1aafSDhruvaraj Subhashchandran      * must be called before any PDBG-related operations are performed.
78*858d1aafSDhruvaraj Subhashchandran      */
79*858d1aafSDhruvaraj Subhashchandran     void initializePdbg();
80*858d1aafSDhruvaraj Subhashchandran 
81*858d1aafSDhruvaraj Subhashchandran     /**
82*858d1aafSDhruvaraj Subhashchandran      * @brief Launches asynchronous dump collection tasks for a set of targets.
83*858d1aafSDhruvaraj Subhashchandran      *
84*858d1aafSDhruvaraj Subhashchandran      * This method initiates the dump collection process asynchronously for each
85*858d1aafSDhruvaraj Subhashchandran      * target provided in the `targets` vector. It launches a separate
86*858d1aafSDhruvaraj Subhashchandran      * asynchronous task for each target, where each task calls
87*858d1aafSDhruvaraj Subhashchandran      * `collectDumpFromSBE` with the specified parameters, including the clock
88*858d1aafSDhruvaraj Subhashchandran      * state.
89*858d1aafSDhruvaraj Subhashchandran      *
90*858d1aafSDhruvaraj Subhashchandran      * @param type The type of the dump to collect. This could be a hardware
91*858d1aafSDhruvaraj Subhashchandran      * dump, software dump, etc., as defined by the SBE dump type enumeration.
92*858d1aafSDhruvaraj Subhashchandran      * @param id A unique identifier for the dump collection operation. This ID
93*858d1aafSDhruvaraj Subhashchandran      * is used to tag the collected dump for identification.
94*858d1aafSDhruvaraj Subhashchandran      * @param path The filesystem path where the collected dumps should be
95*858d1aafSDhruvaraj Subhashchandran      * stored. Each dump file will be stored under this directory.
96*858d1aafSDhruvaraj Subhashchandran      * @param failingUnit The identifier of the unit or component that is
97*858d1aafSDhruvaraj Subhashchandran      * failing or suspected to be the cause of the issue prompting the dump
98*858d1aafSDhruvaraj Subhashchandran      * collection. This is used for diagnostic purposes.
99*858d1aafSDhruvaraj Subhashchandran      * @param cstate The clock state during the dump collection. This parameter
100*858d1aafSDhruvaraj Subhashchandran      *               dictates whether the dump should be collected with the
101*858d1aafSDhruvaraj Subhashchandran      * clocks running (SBE_CLOCK_ON) or with the clocks stopped (SBE_CLOCK_OFF).
102*858d1aafSDhruvaraj Subhashchandran      * @param targets A vector of `pdbg_target*` representing the targets from
103*858d1aafSDhruvaraj Subhashchandran      * which dumps should be collected. Each target corresponds to a physical or
104*858d1aafSDhruvaraj Subhashchandran      * logical component in the system, such as a processor or an SBE.
105*858d1aafSDhruvaraj Subhashchandran      *
106*858d1aafSDhruvaraj Subhashchandran      * @return A vector of `std::future<void>` objects. Each future represents
107*858d1aafSDhruvaraj Subhashchandran      * the completion state of an asynchronous dump collection task. The caller
108*858d1aafSDhruvaraj Subhashchandran      *         can wait on these futures to determine when all dump collection
109*858d1aafSDhruvaraj Subhashchandran      * tasks have completed. Exceptions thrown by the asynchronous tasks are
110*858d1aafSDhruvaraj Subhashchandran      * captured by the futures and can be rethrown when the futures are
111*858d1aafSDhruvaraj Subhashchandran      * accessed.
112*858d1aafSDhruvaraj Subhashchandran      */
113*858d1aafSDhruvaraj Subhashchandran     std::vector<std::future<void>> spawnDumpCollectionProcesses(
114*858d1aafSDhruvaraj Subhashchandran         uint8_t type, uint32_t id, const std::filesystem::path& path,
115*858d1aafSDhruvaraj Subhashchandran         uint64_t failingUnit, uint8_t cstate,
116*858d1aafSDhruvaraj Subhashchandran         const std::vector<struct pdbg_target*>& targets);
117*858d1aafSDhruvaraj Subhashchandran };
118*858d1aafSDhruvaraj Subhashchandran 
119*858d1aafSDhruvaraj Subhashchandran } // namespace openpower::dump::sbe_chipop
120