blob: 60961d32df9a347f1917d047cf4028a1a77cf23b [file] [log] [blame]
Tom9e5232e2016-11-07 12:14:51 +05301#include "systemintfcmds.h"
2#include "host-ipmid/ipmid-api.h"
Vishwanatha Subbannab891a572017-03-31 11:34:48 +05303#include "config.h"
Andrew Geissler12866372017-03-21 22:58:28 -05004#include "host-interface.hpp"
Tom9e5232e2016-11-07 12:14:51 +05305
6#include <stdio.h>
Vishwanatha Subbanna83b5c1c2017-01-25 18:41:51 +05307#include <mapper.h>
Tom9e5232e2016-11-07 12:14:51 +05308
9void register_netfn_app_functions() __attribute__((constructor));
10
Andrew Geissler12866372017-03-21 22:58:28 -050011using namespace sdbusplus::xyz::openbmc_project::Control::server;
12
13// Internal function to get next host command
14Host::Command getNextHostCmd();
15
Andrew Geissler12866372017-03-21 22:58:28 -050016//-------------------------------------------------------------------
17// Called by Host post response from Get_Message_Flags
18//-------------------------------------------------------------------
19ipmi_ret_t ipmi_app_read_event(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
20 ipmi_request_t request, ipmi_response_t response,
21 ipmi_data_len_t data_len, ipmi_context_t context)
22{
23 ipmi_ret_t rc = IPMI_CC_OK;
24
25 printf("IPMI APP READ EVENT command received\n");
26
27 struct oem_sel_timestamped oem_sel = {0};
28 *data_len = sizeof(struct oem_sel_timestamped);
Vishwanatha Subbanna83b5c1c2017-01-25 18:41:51 +053029
Tom9e5232e2016-11-07 12:14:51 +053030 // either id[0] -or- id[1] can be filled in. We will use id[0]
Andrew Geissler12866372017-03-21 22:58:28 -050031 oem_sel.id[0] = SEL_OEM_ID_0;
32 oem_sel.id[1] = SEL_OEM_ID_0;
33 oem_sel.type = SEL_RECORD_TYPE_OEM;
Tom9e5232e2016-11-07 12:14:51 +053034
35 // Following 3 bytes are from IANA Manufactre_Id field. See below
Andrew Geissler12866372017-03-21 22:58:28 -050036 oem_sel.manuf_id[0]= 0x41;
37 oem_sel.manuf_id[1]= 0xA7;
38 oem_sel.manuf_id[2]= 0x00;
Tom9e5232e2016-11-07 12:14:51 +053039
40 // per IPMI spec NetFuntion for OEM
Andrew Geissler12866372017-03-21 22:58:28 -050041 oem_sel.netfun = 0x3A;
Tom9e5232e2016-11-07 12:14:51 +053042
Andrew Geissler12866372017-03-21 22:58:28 -050043 // Read from the queue to see what our response is here
44 Host::Command hCmd = getNextHostCmd();
45 switch (hCmd)
46 {
47 case Host::Command::SoftOff:
Andrew Geissler12866372017-03-21 22:58:28 -050048 oem_sel.cmd = CMD_POWER;
49 oem_sel.data[0] = SOFT_OFF;
50 break;
51 case Host::Command::Heartbeat:
52 oem_sel.cmd = CMD_HEARTBEAT;
53 oem_sel.data[0] = 0x00;
54 break;
55 }
Tom9e5232e2016-11-07 12:14:51 +053056
57 // All '0xFF' since unused.
Andrew Geissler12866372017-03-21 22:58:28 -050058 memset(&oem_sel.data[1], 0xFF, 3);
Tom9e5232e2016-11-07 12:14:51 +053059
60 // Pack the actual response
Andrew Geissler12866372017-03-21 22:58:28 -050061 memcpy(response, &oem_sel, *data_len);
Tom9e5232e2016-11-07 12:14:51 +053062 return rc;
63}
64
65//---------------------------------------------------------------------
66// Called by Host on seeing a SMS_ATN bit set. Return a hardcoded
67// value of 0x2 indicating we need Host read some data.
68//-------------------------------------------------------------------
69ipmi_ret_t ipmi_app_get_msg_flags(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
70 ipmi_request_t request, ipmi_response_t response,
71 ipmi_data_len_t data_len, ipmi_context_t context)
72{
73 // Generic return from IPMI commands.
74 ipmi_ret_t rc = IPMI_CC_OK;
75
76 printf("IPMI APP GET MSG FLAGS returning with [bit:2] set\n");
77
78 // From IPMI spec V2.0 for Get Message Flags Command :
79 // bit:[1] from LSB : 1b = Event Message Buffer Full.
80 // Return as 0 if Event Message Buffer is not supported,
81 // or when the Event Message buffer is disabled.
82 // TODO. For now. assume its not disabled and send "0x2" anyway:
83
84 uint8_t set_event_msg_buffer_full = 0x2;
85 *data_len = sizeof(set_event_msg_buffer_full);
86
87 // Pack the actual response
88 memcpy(response, &set_event_msg_buffer_full, *data_len);
89
90 return rc;
91}
92
93ipmi_ret_t ipmi_app_set_bmc_global_enables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
94 ipmi_request_t request, ipmi_response_t response,
95 ipmi_data_len_t data_len, ipmi_context_t context)
96{
97 ipmi_ret_t rc = IPMI_CC_OK;
98 *data_len = 0;
99
100 // Event and message logging enabled by default so return for now
101 printf("IPMI APP SET BMC GLOBAL ENABLES Ignoring for now\n");
102
103 return rc;
104}
105
Lei YU12c2db72017-05-15 11:24:04 +0800106namespace {
107// Static storage to keep the object alive during process life
108std::unique_ptr<sdbusplus::bus::bus> sdbus __attribute__((init_priority(101)));
109std::unique_ptr<phosphor::host::Host> host __attribute__((init_priority(101)));
110}
Andrew Geissler12866372017-03-21 22:58:28 -0500111
112#include <unistd.h>
Tom9e5232e2016-11-07 12:14:51 +0530113void register_netfn_app_functions()
114{
115
116 // <Read Event Message Buffer>
117 printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_READ_EVENT);
Tom05732372016-09-06 17:21:23 +0530118 ipmi_register_callback(NETFUN_APP, IPMI_CMD_READ_EVENT, NULL, ipmi_app_read_event,
119 SYSTEM_INTERFACE);
Tom9e5232e2016-11-07 12:14:51 +0530120
121 // <Set BMC Global Enables>
122 printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP,
123 IPMI_CMD_SET_BMC_GLOBAL_ENABLES);
124 ipmi_register_callback(NETFUN_APP, IPMI_CMD_SET_BMC_GLOBAL_ENABLES, NULL,
Tom05732372016-09-06 17:21:23 +0530125 ipmi_app_set_bmc_global_enables, SYSTEM_INTERFACE);
Tom9e5232e2016-11-07 12:14:51 +0530126
127 // <Get Message Flags>
128 printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_GET_MSG_FLAGS);
Tom05732372016-09-06 17:21:23 +0530129 ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_MSG_FLAGS, NULL, ipmi_app_get_msg_flags,
130 SYSTEM_INTERFACE);
Tom9e5232e2016-11-07 12:14:51 +0530131
Andrew Geissler12866372017-03-21 22:58:28 -0500132 // Gets a hook onto SYSTEM bus used by host-ipmid
133 sd_bus *bus = ipmid_get_sd_bus_connection();
134
135 sdbus = std::make_unique<sdbusplus::bus::bus>(bus);
136
137 // Create new xyz.openbmc_project.host object on the bus
138 auto objPathInst = std::string{CONTROL_HOST_OBJPATH} + '0';
139
140 // Add sdbusplus ObjectManager.
141 sdbusplus::server::manager::manager objManager(*sdbus,
142 objPathInst.c_str());
143
Andrew Geissler83159702017-04-03 13:31:13 -0500144 // Get the sd_events pointer
145 auto events = ipmid_get_sd_event_connection();
146
Lei YU12c2db72017-05-15 11:24:04 +0800147 host = std::make_unique<phosphor::host::Host>(*sdbus,
148 objPathInst.c_str(),
149 events);
Andrew Geissler12866372017-03-21 22:58:28 -0500150
151 sdbus->request_name(CONTROL_HOST_BUSNAME);
152
Tom9e5232e2016-11-07 12:14:51 +0530153 return;
154}
Andrew Geissler12866372017-03-21 22:58:28 -0500155
156Host::Command getNextHostCmd()
157{
158 return(host->getNextCommand());
159}