xref: /openbmc/phosphor-host-ipmid/oem/nvidia/bootstrap-credentials-oem-cmds.cpp (revision 529d31c7b9ce70a1747b1f50b24b7ddcfaf8bc25)
1bffaa110SPrithvi Pai /*
2bffaa110SPrithvi Pai  * SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION &
3bffaa110SPrithvi Pai  * AFFILIATES. All rights reserved.
4bffaa110SPrithvi Pai  * SPDX-License-Identifier: Apache-2.0
5bffaa110SPrithvi Pai  */
6bffaa110SPrithvi Pai 
7bffaa110SPrithvi Pai #include "oemcommands.hpp"
8bffaa110SPrithvi Pai 
9bffaa110SPrithvi Pai #include <ipmid/api.hpp>
10bffaa110SPrithvi Pai #include <ipmid/types.hpp>
116823fd46SPrithvi Pai #include <ipmid/utils.hpp>
126823fd46SPrithvi Pai #include <phosphor-logging/lg2.hpp>
13bffaa110SPrithvi Pai 
14bffaa110SPrithvi Pai #include <cstdint>
15bffaa110SPrithvi Pai 
16bffaa110SPrithvi Pai void registerBootstrapCredentialsOemCommands() __attribute__((constructor));
17bffaa110SPrithvi Pai 
18bffaa110SPrithvi Pai namespace ipmi
19bffaa110SPrithvi Pai {
20bffaa110SPrithvi Pai ipmi::RspType<uint8_t, uint8_t> ipmiGetUsbVendorIdProductId(uint8_t type)
21bffaa110SPrithvi Pai {
22bffaa110SPrithvi Pai     constexpr uint8_t descriptorVendorId = 1;
23bffaa110SPrithvi Pai     constexpr uint8_t descriptorProductId = 2;
24bffaa110SPrithvi Pai 
25bffaa110SPrithvi Pai     // IPMI OEM USB Linux Gadget info
26bffaa110SPrithvi Pai     constexpr uint16_t usbVendorId = 0x0525;
27bffaa110SPrithvi Pai     constexpr uint16_t usbProductId = 0xA4A2;
28bffaa110SPrithvi Pai 
29bffaa110SPrithvi Pai     if (type == descriptorVendorId)
30bffaa110SPrithvi Pai     {
31bffaa110SPrithvi Pai         return ipmi::responseSuccess(static_cast<uint8_t>(usbVendorId >> 8),
32bffaa110SPrithvi Pai                                      static_cast<uint8_t>(usbVendorId & 0xFF));
33bffaa110SPrithvi Pai     }
34bffaa110SPrithvi Pai     else if (type == descriptorProductId)
35bffaa110SPrithvi Pai     {
36bffaa110SPrithvi Pai         return ipmi::responseSuccess(static_cast<uint8_t>(usbProductId >> 8),
37bffaa110SPrithvi Pai                                      static_cast<uint8_t>(usbProductId & 0xFF));
38bffaa110SPrithvi Pai     }
39bffaa110SPrithvi Pai     return ipmi::responseInvalidFieldRequest();
40bffaa110SPrithvi Pai }
41bffaa110SPrithvi Pai 
426bf35ee6SPrithvi Pai ipmi::RspType<ipmi::message::Payload> ipmiGetUsbSerialNumber()
436bf35ee6SPrithvi Pai {
446bf35ee6SPrithvi Pai     static constexpr uint8_t usbSerialNumber = 0x00;
456bf35ee6SPrithvi Pai     ipmi::message::Payload usbSerialNumberPayload;
466bf35ee6SPrithvi Pai     usbSerialNumberPayload.pack(usbSerialNumber);
476bf35ee6SPrithvi Pai     return ipmi::responseSuccess(usbSerialNumberPayload);
486bf35ee6SPrithvi Pai }
496bf35ee6SPrithvi Pai 
506823fd46SPrithvi Pai ipmi::RspType<ipmi::message::Payload> ipmiGetRedfishHostName(
516823fd46SPrithvi Pai     ipmi::Context::ptr ctx)
526823fd46SPrithvi Pai {
536823fd46SPrithvi Pai     std::string service{};
546823fd46SPrithvi Pai     constexpr auto networkConfigObj = "/xyz/openbmc_project/network/config";
556823fd46SPrithvi Pai     constexpr auto networkConfigIface =
566823fd46SPrithvi Pai         "xyz.openbmc_project.Network.SystemConfiguration";
576823fd46SPrithvi Pai     boost::system::error_code ec =
586823fd46SPrithvi Pai         ipmi::getService(ctx, networkConfigIface, networkConfigObj, service);
596823fd46SPrithvi Pai     if (ec)
606823fd46SPrithvi Pai     {
616823fd46SPrithvi Pai         lg2::error("ipmiGetRedfishHostName failed to get Network SystemConfig "
626823fd46SPrithvi Pai                    "object: {STATUS}",
636823fd46SPrithvi Pai                    "STATUS", ec.message());
646823fd46SPrithvi Pai         return ipmi::responseResponseError();
656823fd46SPrithvi Pai     }
666823fd46SPrithvi Pai 
676823fd46SPrithvi Pai     std::string hostName{};
686823fd46SPrithvi Pai     ec = ipmi::getDbusProperty<std::string>(
696823fd46SPrithvi Pai         ctx, service, networkConfigObj, networkConfigIface, "HostName",
706823fd46SPrithvi Pai         hostName);
716823fd46SPrithvi Pai     if (ec)
726823fd46SPrithvi Pai     {
736823fd46SPrithvi Pai         lg2::error("ipmiGetRedfishHostName failed to get HostName from Network "
746823fd46SPrithvi Pai                    "SystemConfig service: {STATUS}",
756823fd46SPrithvi Pai                    "STATUS", ec.message());
766823fd46SPrithvi Pai         return ipmi::responseResponseError();
776823fd46SPrithvi Pai     }
786823fd46SPrithvi Pai     ipmi::message::Payload hostNamePayload;
796823fd46SPrithvi Pai     hostNamePayload.pack(
806823fd46SPrithvi Pai         std::vector<uint8_t>(hostName.begin(), hostName.end()));
816823fd46SPrithvi Pai     return ipmi::responseSuccess(hostNamePayload);
826823fd46SPrithvi Pai }
83*529d31c7SPrithvi Pai 
84*529d31c7SPrithvi Pai ipmi::RspType<uint8_t> ipmiGetIpmiChannelRfHi()
85*529d31c7SPrithvi Pai {
86*529d31c7SPrithvi Pai     constexpr auto redfishHostInterfaceChannel = "usb0";
87*529d31c7SPrithvi Pai     uint8_t chNum = ipmi::getChannelByName(redfishHostInterfaceChannel);
88*529d31c7SPrithvi Pai     ChannelInfo chInfo{};
89*529d31c7SPrithvi Pai     Cc compCode = ipmi::getChannelInfo(chNum, chInfo);
90*529d31c7SPrithvi Pai     if (compCode != ipmi::ccSuccess)
91*529d31c7SPrithvi Pai     {
92*529d31c7SPrithvi Pai         lg2::error(
93*529d31c7SPrithvi Pai             "ipmiGetIpmiChannelRfHi failed for channel {CHANNEL} with error {ERROR}",
94*529d31c7SPrithvi Pai             "CHANNEL", chNum, "ERROR", compCode);
95*529d31c7SPrithvi Pai         return ipmi::responseUnspecifiedError();
96*529d31c7SPrithvi Pai     }
97*529d31c7SPrithvi Pai 
98*529d31c7SPrithvi Pai     if (chInfo.mediumType !=
99*529d31c7SPrithvi Pai             static_cast<uint8_t>(EChannelMediumType::lan8032) ||
100*529d31c7SPrithvi Pai         chInfo.protocolType !=
101*529d31c7SPrithvi Pai             static_cast<uint8_t>(EChannelProtocolType::ipmbV10) ||
102*529d31c7SPrithvi Pai         chInfo.sessionSupported !=
103*529d31c7SPrithvi Pai             static_cast<uint8_t>(EChannelSessSupported::multi) ||
104*529d31c7SPrithvi Pai         chInfo.isIpmi != true)
105*529d31c7SPrithvi Pai     {
106*529d31c7SPrithvi Pai         lg2::error(
107*529d31c7SPrithvi Pai             "ipmiGetIpmiChannelRfHi: channel {CHANNEL} lacks required config",
108*529d31c7SPrithvi Pai             "CHANNEL", chNum);
109*529d31c7SPrithvi Pai         return responseSensorInvalid();
110*529d31c7SPrithvi Pai     }
111*529d31c7SPrithvi Pai     return ipmi::responseSuccess(static_cast<uint8_t>(chNum));
112*529d31c7SPrithvi Pai }
113*529d31c7SPrithvi Pai 
114bffaa110SPrithvi Pai } // namespace ipmi
115bffaa110SPrithvi Pai 
116bffaa110SPrithvi Pai void registerBootstrapCredentialsOemCommands()
117bffaa110SPrithvi Pai {
118bffaa110SPrithvi Pai     ipmi::registerHandler(
119bffaa110SPrithvi Pai         ipmi::prioOemBase, ipmi::groupNvidia,
120bffaa110SPrithvi Pai         ipmi::bootstrap_credentials_oem::cmdGetUsbVendorIdProductId,
121bffaa110SPrithvi Pai         ipmi::Privilege::Admin, ipmi::ipmiGetUsbVendorIdProductId);
1226bf35ee6SPrithvi Pai 
1236bf35ee6SPrithvi Pai     ipmi::registerHandler(
1246bf35ee6SPrithvi Pai         ipmi::prioOemBase, ipmi::groupNvidia,
1256bf35ee6SPrithvi Pai         ipmi::bootstrap_credentials_oem::cmdGetUsbSerialNumber,
1266bf35ee6SPrithvi Pai         ipmi::Privilege::Admin, ipmi::ipmiGetUsbSerialNumber);
1276823fd46SPrithvi Pai 
1286823fd46SPrithvi Pai     ipmi::registerHandler(
1296823fd46SPrithvi Pai         ipmi::prioOemBase, ipmi::groupNvidia,
1306823fd46SPrithvi Pai         ipmi::bootstrap_credentials_oem::cmdGetRedfishHostName,
1316823fd46SPrithvi Pai         ipmi::Privilege::Admin, ipmi::ipmiGetRedfishHostName);
132*529d31c7SPrithvi Pai 
133*529d31c7SPrithvi Pai     ipmi::registerHandler(
134*529d31c7SPrithvi Pai         ipmi::prioOemBase, ipmi::groupNvidia,
135*529d31c7SPrithvi Pai         ipmi::bootstrap_credentials_oem::cmdGetIpmiChannelRfHi,
136*529d31c7SPrithvi Pai         ipmi::Privilege::Admin, ipmi::ipmiGetIpmiChannelRfHi);
137bffaa110SPrithvi Pai }
138