Add type 12h sdr records

This adds support for BMC and ME type 12 records.

Tested:

ipmitool sdr list mcloc

Device ID              : �Basbrd Mgmt Ctl
Entity ID              : 0.46 (Unspecified)
Device Slave Address   : 20h
Channel Number         : 0h
ACPI System P/S Notif  : Not Required
ACPI Device P/S Notif  : Not Required
Controller Presence    : Dynamic
Logs Init Agent Errors : No
Event Message Gen      : Enable
Device Capabilities
 Chassis Device        : Yes
 Bridge                : No
 IPMB Event Generator  : Yes
 IPMB Event Receiver   : Yes
 FRU Inventory Device  : Yes
 SEL Device            : Yes
 SDR Repository        : Yes
 Sensor Device         : Yes

Device ID              : �Mgmt Engin
Entity ID              : 0.46 (Unspecified)
Device Slave Address   : 2Ch
Channel Number         : 6h
ACPI System P/S Notif  : Not Required
ACPI Device P/S Notif  : Not Required
Controller Presence    : Static
Logs Init Agent Errors : No
Event Message Gen      : Enable
Device Capabilities
 Chassis Device        : No
 Bridge                : No
 IPMB Event Generator  : Yes
 IPMB Event Receiver   : No
 FRU Inventory Device  : No
 SEL Device            : No
 SDR Repository        : No
 Sensor Device         : Yes

Change-Id: I3d015ca2f61ab07be18ba46239c3d6a919f0298b
Signed-off-by: James Feist <james.feist@linux.intel.com>
diff --git a/src/storagecommands.cpp b/src/storagecommands.cpp
index 39405c5..8c716c2 100644
--- a/src/storagecommands.cpp
+++ b/src/storagecommands.cpp
@@ -1022,6 +1022,62 @@
     return ipmi::responseInvalidCommand();
 }
 
+std::vector<uint8_t> getType12SDRs(uint16_t index, uint16_t recordId)
+{
+    std::vector<uint8_t> resp;
+    if (index == 0)
+    {
+        Type12Record bmc = {};
+        bmc.header.record_id_lsb = recordId;
+        bmc.header.record_id_msb = recordId >> 8;
+        bmc.header.sdr_version = ipmiSdrVersion;
+        bmc.header.record_type = 0x12;
+        bmc.header.record_length = 0x1b;
+        bmc.slaveAddress = 0x20;
+        bmc.channelNumber = 0;
+        bmc.powerStateNotification = 0;
+        bmc.deviceCapabilities = 0xBF;
+        bmc.reserved = 0;
+        bmc.entityID = 0x2E;
+        bmc.entityInstance = 1;
+        bmc.oem = 0;
+        bmc.typeLengthCode = 0xD0;
+        std::string bmcName = "Basbrd Mgmt Ctlr";
+        std::copy(bmcName.begin(), bmcName.end(), bmc.name);
+        uint8_t* bmcPtr = reinterpret_cast<uint8_t*>(&bmc);
+        resp.insert(resp.end(), bmcPtr, bmcPtr + sizeof(Type12Record));
+    }
+    else if (index == 1)
+    {
+        Type12Record me = {};
+        me.header.record_id_lsb = recordId;
+        me.header.record_id_msb = recordId >> 8;
+        me.header.sdr_version = ipmiSdrVersion;
+        me.header.record_type = 0x12;
+        me.header.record_length = 0x16;
+        me.slaveAddress = 0x2C;
+        me.channelNumber = 6;
+        me.powerStateNotification = 0x24;
+        me.deviceCapabilities = 0x21;
+        me.reserved = 0;
+        me.entityID = 0x2E;
+        me.entityInstance = 2;
+        me.oem = 0;
+        me.typeLengthCode = 0xCB;
+        std::string meName = "Mgmt Engine";
+        std::copy(meName.begin(), meName.end(), me.name);
+        uint8_t* mePtr = reinterpret_cast<uint8_t*>(&me);
+        resp.insert(resp.end(), mePtr, mePtr + sizeof(Type12Record));
+    }
+    else
+    {
+        throw std::runtime_error("getType12SDRs:: Illegal index " +
+                                 std::to_string(index));
+    }
+
+    return resp;
+}
+
 void registerStorageFunctions()
 {
     // <Get FRU Inventory Area Info>