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>