summaryrefslogtreecommitdiffstats
path: root/fru-area.hpp
blob: d040a9ca468dd242bdd0562eec6f88f035cacb32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef __IPMI_FRU_AREA_H__
#define __IPMI_FRU_AREA_H__

#include <stdint.h>
#include <stddef.h>
#include <systemd/sd-bus.h>
#include <string>
#include <vector>
#include <memory>
#include "frup.hpp"
#include "writefrudata.hpp"

class ipmi_fru;
typedef std::vector<std::unique_ptr<ipmi_fru>> fru_area_vec_t;

class ipmi_fru
{
    private:
        // Unique way of identifying a FRU
        uint8_t iv_fruid = 0;

        // Type of the fru matching offsets in common header
        ipmi_fru_area_type iv_type = IPMI_FRU_AREA_INTERNAL_USE;

        // Name of the fru area. ( BOARD/CHASSIS/PRODUCT )
        std::string iv_name;

        // Length of a specific fru area.
        size_t  iv_len = 0;

        // Special bit for BMC readable eeprom only.
        bool iv_bmc_fru = false;

        // If a FRU is physically present.
        bool iv_present = false;

        // Whether a particular area is valid ?
        bool iv_valid = false;

        // Actual area data.
        uint8_t *iv_data = nullptr;

        // fru inventory dbus name
        std::string iv_bus_name;

        // fru inventory dbus object path
        std::string iv_obj_path;

        // fru inventory dbus interface name
        std::string iv_intf_name;

        // sd_bus handle
        sd_bus *iv_bus_type = nullptr;

        // Default constructor disabled.
        ipmi_fru();

    public:
        // constructor
        ipmi_fru(const uint8_t fruid, const ipmi_fru_area_type type,
                 sd_bus *bus_type, bool bmc_fru = false);

        // Destructor
        virtual ~ipmi_fru();

        // If a particular area has been marked valid / invalid
        inline bool is_valid() const
        {
            return iv_valid;
        }

        // Sets the present bit
        inline void set_present(const bool present)
        {
            iv_present = present;
        }

        // Sets the valid bit for a corresponding area.
        inline void set_valid(const bool valid)
        {
            iv_valid = valid;
        }

        // If a particular area accessible only by BMC
        inline bool is_bmc_fru() const
        {
            return iv_bmc_fru;
        }

        // returns fru id;
        uint8_t get_fruid() const
        {
            return iv_fruid;
        }

        // Returns the length.
        size_t get_len() const
        {
            return iv_len;
        }

        // Returns the type of the current fru area
        ipmi_fru_area_type get_type() const
        {
            return iv_type;
        }

        // Returns the name
        const char *get_name() const
        {
            return iv_name.c_str();
        }

        // Returns SD bus name
        const char *get_bus_name() const
        {
            return iv_bus_name.c_str();
        }

        // Retrns SD bus object path
        const char *get_obj_path() const
        {
            return iv_obj_path.c_str();
        }

        // Returns SD bus interface name
        const char *get_intf_name() const
        {
            return iv_intf_name.c_str();
        }

        // Returns the data portion
        inline uint8_t *get_data() const
        {
           return iv_data;
        }

        // Returns the bus type.
        inline sd_bus *get_bus_type() const
        {
            return iv_bus_type;
        }

        // Sets up the sd_bus variables for the given AREA type
        int setup_sd_bus_paths(void);

        // Accepts a pointer to data and sets it in the object.
        void set_data(const uint8_t *, const size_t);

        // Sets the dbus parameters
        void update_dbus_paths(const char *, const char *, const char *);
};

#endif
OpenPOWER on IntegriCloud