nvidia-oem: Implement GetHostInterfaceIPMIChannel

his command is used by BIOS before creating SMBIOS record
type 42. BIOS gets USBDescription information from BMC.

Note:
The implementation in this PR is for
HostInterfaceIPMIChannelNumber.
The support for other device descriptors will be added in
upcoming PRs.

Design Document for RHI:
[1] https://gerrit.openbmc.org/c/openbmc/docs/+/79327

Redfish Host Interface specification:
[2] https://www.dmtf.org/sites/default/files/standards/documents/DSP0270_1.3.0.pdf

Tested:
Tested on gb200nvl-obmc platform:

root@gb200nvl-obmc:~# ipmitool raw 0x3c 0x33
 03

Change-Id: Ib2c556e1474ee057a0c28c4fee029e5df95b1419
Signed-off-by: Prithvi Pai <ppai@nvidia.com>
diff --git a/oem/nvidia/bootstrap-credentials-oem-cmds.cpp b/oem/nvidia/bootstrap-credentials-oem-cmds.cpp
index 408cf6c..0a40c65 100644
--- a/oem/nvidia/bootstrap-credentials-oem-cmds.cpp
+++ b/oem/nvidia/bootstrap-credentials-oem-cmds.cpp
@@ -80,6 +80,37 @@
         std::vector<uint8_t>(hostName.begin(), hostName.end()));
     return ipmi::responseSuccess(hostNamePayload);
 }
+
+ipmi::RspType<uint8_t> ipmiGetIpmiChannelRfHi()
+{
+    constexpr auto redfishHostInterfaceChannel = "usb0";
+    uint8_t chNum = ipmi::getChannelByName(redfishHostInterfaceChannel);
+    ChannelInfo chInfo{};
+    Cc compCode = ipmi::getChannelInfo(chNum, chInfo);
+    if (compCode != ipmi::ccSuccess)
+    {
+        lg2::error(
+            "ipmiGetIpmiChannelRfHi failed for channel {CHANNEL} with error {ERROR}",
+            "CHANNEL", chNum, "ERROR", compCode);
+        return ipmi::responseUnspecifiedError();
+    }
+
+    if (chInfo.mediumType !=
+            static_cast<uint8_t>(EChannelMediumType::lan8032) ||
+        chInfo.protocolType !=
+            static_cast<uint8_t>(EChannelProtocolType::ipmbV10) ||
+        chInfo.sessionSupported !=
+            static_cast<uint8_t>(EChannelSessSupported::multi) ||
+        chInfo.isIpmi != true)
+    {
+        lg2::error(
+            "ipmiGetIpmiChannelRfHi: channel {CHANNEL} lacks required config",
+            "CHANNEL", chNum);
+        return responseSensorInvalid();
+    }
+    return ipmi::responseSuccess(static_cast<uint8_t>(chNum));
+}
+
 } // namespace ipmi
 
 void registerBootstrapCredentialsOemCommands()
@@ -98,4 +129,9 @@
         ipmi::prioOemBase, ipmi::groupNvidia,
         ipmi::bootstrap_credentials_oem::cmdGetRedfishHostName,
         ipmi::Privilege::Admin, ipmi::ipmiGetRedfishHostName);
+
+    ipmi::registerHandler(
+        ipmi::prioOemBase, ipmi::groupNvidia,
+        ipmi::bootstrap_credentials_oem::cmdGetIpmiChannelRfHi,
+        ipmi::Privilege::Admin, ipmi::ipmiGetIpmiChannelRfHi);
 }