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