Nvidia-gpu: Create GPU Inventory device
GPU device class implements Item.accelerator interface to get identified
as as GPU device. This will be used in Redfish to populate the GPU
processor schema.
Tested -
```
root@gb200nvl-obmc:~# busctl introspect xyz.openbmc_project.GpuSensor /xyz/openbmc_project/inventory/NVIDIA_GB200_GPU_0
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
xyz.openbmc_project.Inventory.Item.Accelerator interface - - -
.Type property s "GPU" emits-change
```
Change-Id: I20434529860cb37889e63651bbcd97cadfa9d54e
Signed-off-by: Rohit PAI <ropai@nvidia.com>
diff --git a/src/nvidia-gpu/Inventory.cpp b/src/nvidia-gpu/Inventory.cpp
new file mode 100644
index 0000000..901eca1
--- /dev/null
+++ b/src/nvidia-gpu/Inventory.cpp
@@ -0,0 +1,42 @@
+#include "Inventory.hpp"
+
+#include "Utils.hpp"
+
+#include <NvidiaGpuMctpVdm.hpp>
+#include <phosphor-logging/lg2.hpp>
+#include <sdbusplus/asio/connection.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+
+#include <exception>
+#include <memory>
+#include <string>
+
+constexpr const char* inventoryPrefix = "/xyz/openbmc_project/inventory/";
+constexpr const char* acceleratorIfaceName =
+ "xyz.openbmc_project.Inventory.Item.Accelerator";
+
+Inventory::Inventory(
+ const std::shared_ptr<sdbusplus::asio::connection>& /*conn*/,
+ sdbusplus::asio::object_server& objectServer,
+ const std::string& inventoryName,
+ const gpu::DeviceIdentification deviceType) :
+ name(escapeName(inventoryName))
+{
+ if (deviceType == gpu::DeviceIdentification::DEVICE_GPU)
+ {
+ std::string path = inventoryPrefix + name;
+ try
+ {
+ acceleratorInterface =
+ objectServer.add_interface(path, acceleratorIfaceName);
+ acceleratorInterface->register_property("Type", std::string("GPU"));
+ acceleratorInterface->initialize();
+ }
+ catch (const std::exception& e)
+ {
+ lg2::error(
+ "Failed to add accelerator interface. path='{PATH}', error='{ERROR}'",
+ "PATH", path, "ERROR", e.what());
+ }
+ }
+}
diff --git a/src/nvidia-gpu/Inventory.hpp b/src/nvidia-gpu/Inventory.hpp
new file mode 100644
index 0000000..8de490d
--- /dev/null
+++ b/src/nvidia-gpu/Inventory.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "NvidiaGpuMctpVdm.hpp"
+
+#include <sdbusplus/asio/connection.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+
+#include <memory>
+#include <string>
+
+class Inventory
+{
+ public:
+ Inventory(const std::shared_ptr<sdbusplus::asio::connection>& conn,
+ sdbusplus::asio::object_server& objectServer,
+ const std::string& inventoryName,
+ gpu::DeviceIdentification deviceType);
+
+ private:
+ std::shared_ptr<sdbusplus::asio::dbus_interface> acceleratorInterface;
+
+ std::string name;
+};
diff --git a/src/nvidia-gpu/NvidiaGpuDevice.cpp b/src/nvidia-gpu/NvidiaGpuDevice.cpp
index d25860d..d7ad846 100644
--- a/src/nvidia-gpu/NvidiaGpuDevice.cpp
+++ b/src/nvidia-gpu/NvidiaGpuDevice.cpp
@@ -6,6 +6,7 @@
#include "NvidiaGpuDevice.hpp"
+#include "Inventory.hpp"
#include "NvidiaDeviceDiscovery.hpp"
#include "NvidiaGpuSensor.hpp"
#include "Thresholds.hpp"
@@ -15,6 +16,7 @@
#include <MctpRequester.hpp>
#include <NvidiaGpuEnergySensor.hpp>
+#include <NvidiaGpuMctpVdm.hpp>
#include <NvidiaGpuPowerSensor.hpp>
#include <NvidiaGpuThresholds.hpp>
#include <NvidiaGpuVoltageSensor.hpp>
@@ -42,6 +44,8 @@
mctpRequester(mctpRequester), conn(conn), objectServer(objectServer),
configs(configs), name(escapeName(name)), path(path)
{
+ inventory = std::make_shared<Inventory>(
+ conn, objectServer, name, gpu::DeviceIdentification::DEVICE_GPU);
makeSensors();
}
diff --git a/src/nvidia-gpu/NvidiaGpuDevice.hpp b/src/nvidia-gpu/NvidiaGpuDevice.hpp
index 5357121..2937d1f 100644
--- a/src/nvidia-gpu/NvidiaGpuDevice.hpp
+++ b/src/nvidia-gpu/NvidiaGpuDevice.hpp
@@ -6,6 +6,7 @@
#pragma once
+#include "Inventory.hpp"
#include "MctpRequester.hpp"
#include "NvidiaDeviceDiscovery.hpp"
#include "NvidiaGpuPowerSensor.hpp"
@@ -71,4 +72,6 @@
std::string name;
std::string path;
+
+ std::shared_ptr<Inventory> inventory;
};
diff --git a/src/nvidia-gpu/NvidiaGpuSensorMain.cpp b/src/nvidia-gpu/NvidiaGpuSensorMain.cpp
index 7e404f5..7e0ab9d 100644
--- a/src/nvidia-gpu/NvidiaGpuSensorMain.cpp
+++ b/src/nvidia-gpu/NvidiaGpuSensorMain.cpp
@@ -49,6 +49,7 @@
auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
sdbusplus::asio::object_server objectServer(systemBus, true);
objectServer.add_manager("/xyz/openbmc_project/sensors");
+ objectServer.add_manager("/xyz/openbmc_project/inventory");
systemBus->request_name("xyz.openbmc_project.GpuSensor");
mctp::MctpRequester mctpRequester(io);
diff --git a/src/nvidia-gpu/meson.build b/src/nvidia-gpu/meson.build
index fcf15fa..9359b2b 100644
--- a/src/nvidia-gpu/meson.build
+++ b/src/nvidia-gpu/meson.build
@@ -1,4 +1,5 @@
gpusensor_sources = files(
+ 'Inventory.cpp',
'MctpRequester.cpp',
'NvidiaDeviceDiscovery.cpp',
'NvidiaGpuDevice.cpp',