xref: /openbmc/pldm/libpldmresponder/bios.hpp (revision 1553152a)
1 #pragma once
2 
3 #include "bios_config.hpp"
4 #include "bios_table.hpp"
5 #include "pldmd/handler.hpp"
6 #include "pldmd/instance_id.hpp"
7 #include "requester/handler.hpp"
8 
9 #include <libpldm/bios.h>
10 #include <libpldm/bios_table.h>
11 #include <stdint.h>
12 
13 #include <ctime>
14 #include <functional>
15 #include <map>
16 #include <vector>
17 
18 namespace pldm
19 {
20 
21 namespace responder
22 {
23 
24 namespace bios
25 {
26 
27 class Handler : public CmdHandler
28 {
29   public:
30     /** @brief Constructor
31      *
32      *  @param[in] fd - socket descriptor to communicate to host
33      *  @param[in] eid - MCTP EID of host firmware
34      *  @param[in] instanceIdDb - pointer to an InstanceIdDb object
35      *  @param[in] handler - PLDM request handler
36      */
37     Handler(int fd, uint8_t eid, pldm::InstanceIdDb* instanceIdDb,
38             pldm::requester::Handler<pldm::requester::Request>* handler);
39 
40     /** @brief Handler for GetDateTime
41      *
42      *  @param[in] request - Request message payload
43      *  @return Response - PLDM Response message
44      */
45     Response getDateTime(const pldm_msg* request, size_t payloadLength);
46 
47     /** @brief Handler for GetBIOSTable
48      *
49      *  @param[in] request - Request message
50      *  @param[in] payload_length - Request message payload length
51      *  @return Response - PLDM Response message
52      */
53     Response getBIOSTable(const pldm_msg* request, size_t payloadLength);
54 
55     /** @brief Handler for SetBIOSTable
56      *
57      *  @param[in] request - Request message
58      *  @param[in] payload_length - Request message payload length
59      *  @return Response - PLDM Response message
60      */
61     Response setBIOSTable(const pldm_msg* request, size_t payloadLength);
62 
63     /** @brief Handler for GetBIOSAttributeCurrentValueByHandle
64      *
65      *  @param[in] request - Request message
66      *  @param[in] payloadLength - Request message payload length
67      *  @return Response - PLDM Response message
68      */
69     Response getBIOSAttributeCurrentValueByHandle(const pldm_msg* request,
70                                                   size_t payloadLength);
71 
72     /** @brief Handler for SetDateTime
73      *
74      *  @param[in] request - Request message payload
75      *  @param[in] payloadLength - Request message payload length
76      *  @return Response - PLDM Response message
77      */
78     Response setDateTime(const pldm_msg* request, size_t payloadLength);
79 
80     /** @brief Handler for setBIOSAttributeCurrentValue
81      *
82      *  @param[in] request - Request message
83      *  @param[in] payloadLength - Request message payload length
84      *  @return Response - PLDM Response message
85      */
86     Response setBIOSAttributeCurrentValue(const pldm_msg* request,
87                                           size_t payloadLength);
88 
89   private:
90     BIOSConfig biosConfig;
91 };
92 
93 } // namespace bios
94 
95 namespace utils
96 {
97 
98 /** @brief Convert epoch time to BCD time
99  *
100  *  @param[in] timeSec - Time got from epoch time in seconds
101  *  @param[out] seconds - number of seconds in BCD
102  *  @param[out] minutes - number of minutes in BCD
103  *  @param[out] hours - number of hours in BCD
104  *  @param[out] day - day of the month in BCD
105  *  @param[out] month - month number in BCD
106  *  @param[out] year - year number in BCD
107  */
108 void epochToBCDTime(uint64_t timeSec, uint8_t& seconds, uint8_t& minutes,
109                     uint8_t& hours, uint8_t& day, uint8_t& month,
110                     uint16_t& year);
111 
112 /** @brief Convert dec time to epoch time
113  *
114  *  @param[in] seconds - number of seconds in dec
115  *  @param[in] minutes - number of minutes in dec
116  *  @param[in] hours - number of hours in dec
117  *  @param[in] day - day of the month in dec
118  *  @param[in] month - month number in dec
119  *  @param[in] year - year number in dec
120  *  @return time - epoch time
121  */
122 std::time_t timeToEpoch(uint8_t seconds, uint8_t minutes, uint8_t hours,
123                         uint8_t day, uint8_t month, uint16_t year);
124 } // namespace utils
125 
126 } // namespace responder
127 } // namespace pldm
128