gpu : add gpu sensor app

The commit adds a dbus sensor app that uses MCTP VDM protocol to read
temperature sensor value from the gpu.

The MCTP VDM protocol is an extension of the OCP specification -
'''
  https://www.opencompute.org/documents/ocp-gpu-accelerator-management-interfaces-v1-pdf
'''

Tested.

Copy the gpusensor app on gb200nvl-obmc machine and run it.
```
root@gb200nvl-obmc:~# ./gpusensor
```

The app runs without errors.
```
root@gb200nvl-obmc:~# busctl tree xyz.openbmc_project.GpuSensor
└─ /xyz
  └─ /xyz/openbmc_project
    └─ /xyz/openbmc_project/sensors
```

Change-Id: Iee7376a9116489052c690f2e3a1ca8d0f29564dd
Signed-off-by: Harshit Aghera <haghera@nvidia.com>
diff --git a/meson.options b/meson.options
index de733c9..f927eb2 100644
--- a/meson.options
+++ b/meson.options
@@ -65,6 +65,12 @@
     description: 'Enable PSU sensor.',
 )
 option(
+    'gpu',
+    type: 'feature',
+    value: 'enabled',
+    description: 'Enable GPU sensor.',
+)
+option(
     'external',
     type: 'feature',
     value: 'enabled',
diff --git a/src/gpu/GpuSensorMain.cpp b/src/gpu/GpuSensorMain.cpp
new file mode 100644
index 0000000..85fec45
--- /dev/null
+++ b/src/gpu/GpuSensorMain.cpp
@@ -0,0 +1,23 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION &
+ * AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <boost/asio/io_context.hpp>
+#include <sdbusplus/asio/connection.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+
+#include <memory>
+#include <string>
+
+int main()
+{
+    boost::asio::io_context io;
+    auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
+    sdbusplus::asio::object_server objectServer(systemBus, true);
+    objectServer.add_manager("/xyz/openbmc_project/sensors");
+    systemBus->request_name("xyz.openbmc_project.GpuSensor");
+
+    io.run();
+    return 0;
+}
diff --git a/src/gpu/meson.build b/src/gpu/meson.build
new file mode 100644
index 0000000..ec3a29b
--- /dev/null
+++ b/src/gpu/meson.build
@@ -0,0 +1,13 @@
+gpusensor_sources = files('GpuSensorMain.cpp')
+
+gpusensor_include_dir = include_directories('.', is_system: true)
+sensor_include_dir = include_directories('../..')
+
+executable(
+    'gpusensor',
+    gpusensor_sources,
+    implicit_include_directories: false,
+    include_directories: [gpusensor_include_dir, sensor_include_dir],
+    dependencies: [thresholds_dep, utils_dep],
+    install: true,
+)
diff --git a/src/meson.build b/src/meson.build
index ca995e5..508bf85 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -111,6 +111,10 @@
     subdir('psu')
 endif
 
+if get_option('gpu').allowed()
+    subdir('gpu')
+endif
+
 if get_option('external').allowed()
     subdir('external')
 endif