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