Add system dbus service for MDR V2

Add BIOS version and UUID in smbios table and provide dbus
interface for redfish to get these information.

Tested:
DC cycle the system and waiting for BIOS entering setup page.
Redfish should be able to show correct UUID.

Signed-off-by: Cheng C Yang <cheng.c.yang@linux.intel.com>
Change-Id: I0d364f27488d3efa24e4a9dde97086f09e94d2a2
diff --git a/include/mdrv2.hpp b/include/mdrv2.hpp
index 3dfedf5..772711d 100644
--- a/include/mdrv2.hpp
+++ b/include/mdrv2.hpp
@@ -176,6 +176,7 @@
     int getTotalDimmSlot(void);
     std::vector<std::unique_ptr<Cpu>> cpus;
     std::vector<std::unique_ptr<Dimm>> dimms;
+    std::unique_ptr<System> system;
 };
 
 } // namespace smbios
diff --git a/include/system.hpp b/include/system.hpp
new file mode 100644
index 0000000..6d99599
--- /dev/null
+++ b/include/system.hpp
@@ -0,0 +1,114 @@
+/*
+// Copyright (c) 2018 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#pragma once
+#include "smbios.hpp"
+
+#include <xyz/openbmc_project/Common/UUID/server.hpp>
+#include <xyz/openbmc_project/Inventory/Decorator/Revision/server.hpp>
+
+namespace phosphor
+{
+
+namespace smbios
+{
+
+class System : sdbusplus::server::object::object<
+                   sdbusplus::xyz::openbmc_project::Common::server::UUID>,
+               sdbusplus::server::object::object<
+                   sdbusplus::xyz::openbmc_project::Inventory::Decorator::
+                       server::Revision>
+{
+  public:
+    System() = delete;
+    ~System() = default;
+    System(const System &) = delete;
+    System &operator=(const System &) = delete;
+    System(System &&) = default;
+    System &operator=(System &&) = default;
+
+    System(sdbusplus::bus::bus &bus, const std::string &objPath,
+           uint8_t *smbiosTableStorage) :
+        sdbusplus::server::object::object<
+            sdbusplus::xyz::openbmc_project::Common::server::UUID>(
+            bus, objPath.c_str()),
+        sdbusplus::server::object::object<
+            sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::
+                Revision>(bus, objPath.c_str()),
+        path(objPath), storage(smbiosTableStorage)
+    {
+        std::string input = "0";
+        uUID(input);
+        version("0.00");
+    }
+
+    std::string uUID(std::string value) override;
+
+    std::string version(std::string value) override;
+
+  private:
+    /** @brief Path of the group instance */
+    std::string path;
+
+    uint8_t *storage;
+
+    struct BIOSInfo
+    {
+        uint8_t type;
+        uint8_t length;
+        uint16_t handle;
+        uint8_t vendor;
+        uint8_t biosVersion;
+        uint16_t startAddrSegment;
+        uint8_t releaseData;
+        uint8_t romSize;
+        uint64_t characteristics;
+        uint16_t externCharacteristics;
+        uint8_t systemBIOSMajor;
+        uint8_t systemBIOSMinor;
+        uint8_t embeddedFirmwareMajor;
+        uint8_t embeddedFirmwareMinor;
+    } __attribute__((packed));
+
+    struct UUID
+    {
+        uint32_t timeLow;
+        uint16_t timeMid;
+        uint16_t timeHiAndVer;
+        uint8_t clockSeqHi;
+        uint8_t clockSeqLow;
+        uint8_t node[6];
+    } __attribute__((packed));
+
+    struct SystemInfo
+    {
+        uint8_t type;
+        uint8_t length;
+        uint16_t handle;
+        uint8_t manufacturer;
+        uint8_t productName;
+        uint8_t version;
+        uint8_t serialNum;
+        struct UUID uUID;
+        uint8_t wakeupType;
+        uint8_t skuNum;
+        uint8_t family;
+    } __attribute__((packed));
+};
+
+} // namespace smbios
+
+} // namespace phosphor