Add CPU and memory LocationCode DBus interface

LocationCode DBus interface can describe the sockets with physical
labels printed on the board. Bmcweb looks up the LocationCode for CPU
and DIMM resources and then identify the resource location. Those
physical CPU and DIMM socket labels are hardcoded in SMBIOS table as
socket designation.

Tested:
CPU and memory DBus objects show the
xyz.openbmc_project.Inventory.Decorator.LocationCode interface and the
LocationCode property is the socket label.

Signed-off-by: Jie Yang <jjy@google.com>
Change-Id: I6131567aca1958505989773fc800a4c2d1dd7e1f
diff --git a/include/cpu.hpp b/include/cpu.hpp
index d4871fb..96cb367 100644
--- a/include/cpu.hpp
+++ b/include/cpu.hpp
@@ -18,6 +18,7 @@
 #include "smbios_mdrv2.hpp"
 
 #include <xyz/openbmc_project/Inventory/Decorator/Asset/server.hpp>
+#include <xyz/openbmc_project/Inventory/Decorator/LocationCode/server.hpp>
 #include <xyz/openbmc_project/Inventory/Decorator/Revision/server.hpp>
 #include <xyz/openbmc_project/Inventory/Item/Cpu/server.hpp>
 #include <xyz/openbmc_project/Inventory/Item/server.hpp>
@@ -32,6 +33,8 @@
     sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::Revision;
 using asset =
     sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::Asset;
+using location =
+    sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::LocationCode;
 using processor = sdbusplus::xyz::openbmc_project::Inventory::Item::server::Cpu;
 using Item = sdbusplus::xyz::openbmc_project::Inventory::server::Item;
 
@@ -90,7 +93,7 @@
                          std::nullopt,
                          std::nullopt};
 
-class Cpu : sdbusplus::server::object_t<processor, asset, rev, Item>
+class Cpu : sdbusplus::server::object_t<processor, asset, location, rev, Item>
 {
   public:
     Cpu() = delete;
@@ -102,7 +105,7 @@
 
     Cpu(sdbusplus::bus::bus& bus, const std::string& objPath,
         const uint8_t& cpuId, uint8_t* smbiosTableStorage) :
-        sdbusplus::server::object_t<processor, asset, rev, Item>(
+        sdbusplus::server::object_t<processor, asset, location, rev, Item>(
             bus, objPath.c_str()),
         cpuNum(cpuId), storage(smbiosTableStorage)
     {
diff --git a/include/dimm.hpp b/include/dimm.hpp
index 43b5456..ec1e32c 100644
--- a/include/dimm.hpp
+++ b/include/dimm.hpp
@@ -18,6 +18,7 @@
 #include "smbios_mdrv2.hpp"
 
 #include <xyz/openbmc_project/Inventory/Decorator/Asset/server.hpp>
+#include <xyz/openbmc_project/Inventory/Decorator/LocationCode/server.hpp>
 #include <xyz/openbmc_project/Inventory/Item/Dimm/server.hpp>
 #include <xyz/openbmc_project/Inventory/Item/server.hpp>
 
@@ -36,6 +37,9 @@
     sdbusplus::server::object::object<
         sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::Asset>,
     sdbusplus::server::object::object<
+        sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::
+            LocationCode>,
+    sdbusplus::server::object::object<
         sdbusplus::xyz::openbmc_project::Inventory::server::Item>
 {
   public:
@@ -56,6 +60,9 @@
             sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::
                 Asset>(bus, objPath.c_str()),
         sdbusplus::server::object::object<
+            sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::
+                LocationCode>(bus, objPath.c_str()),
+        sdbusplus::server::object::object<
             sdbusplus::xyz::openbmc_project::Inventory::server::Item>(
             bus, objPath.c_str()),
         dimmNum(dimmId), storage(smbiosTableStorage)
@@ -75,6 +82,7 @@
     bool present(bool value) override;
     std::string serialNumber(std::string value) override;
     std::string partNumber(std::string value) override;
+    std::string locationCode(std::string value) override;
     uint8_t memoryAttributes(uint8_t value) override;
     uint16_t memoryConfiguredSpeedInMhz(uint16_t value) override;
 
diff --git a/src/cpu.cpp b/src/cpu.cpp
index 1010b58..5e96254 100644
--- a/src/cpu.cpp
+++ b/src/cpu.cpp
@@ -30,6 +30,8 @@
     std::string result = positionToString(positionNum, structLen, dataIn);
 
     processor::socket(result);
+
+    location::locationCode(result);
 }
 
 void Cpu::family(const uint8_t value)
diff --git a/src/dimm.cpp b/src/dimm.cpp
index e2cfbc6..03b35f9 100644
--- a/src/dimm.cpp
+++ b/src/dimm.cpp
@@ -113,6 +113,8 @@
     std::string result = positionToString(positionNum, structLen, dataIn);
 
     memoryDeviceLocator(result);
+
+    locationCode(result);
 }
 
 std::string Dimm::memoryDeviceLocator(std::string value)
@@ -225,6 +227,12 @@
         Asset::partNumber(value);
 }
 
+std::string Dimm::locationCode(std::string value)
+{
+    return sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::
+        LocationCode::locationCode(value);
+}
+
 uint8_t Dimm::memoryAttributes(uint8_t value)
 {
     return sdbusplus::xyz::openbmc_project::Inventory::Item::server::Dimm::