1 /* 2 // Copyright (c) 2017 2018 Intel Corporation 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 */ 16 17 #pragma once 18 #include <cstdint> 19 #include <phosphor-ipmi-host/sensorhandler.hpp> 20 21 static constexpr uint8_t ipmiSdrVersion = 0x51; 22 23 namespace intel_oem::ipmi::sel 24 { 25 static constexpr uint8_t selOperationSupport = 0x02; 26 static constexpr uint8_t systemEvent = 0x02; 27 static constexpr size_t systemEventSize = 3; 28 static constexpr uint8_t oemTsEventFirst = 0xC0; 29 static constexpr uint8_t oemTsEventLast = 0xDF; 30 static constexpr size_t oemTsEventSize = 9; 31 static constexpr uint8_t oemEventFirst = 0xE0; 32 static constexpr uint8_t oemEventLast = 0xFF; 33 static constexpr size_t oemEventSize = 13; 34 static constexpr uint8_t eventMsgRev = 0x04; 35 } // namespace intel_oem::ipmi::sel 36 37 #pragma pack(push, 1) 38 struct GetSDRInfoResp 39 { 40 uint8_t sdrVersion; 41 uint8_t recordCountLS; 42 uint8_t recordCountMS; 43 uint8_t freeSpace[2]; 44 uint32_t mostRecentAddition; 45 uint32_t mostRecentErase; 46 uint8_t operationSupport; 47 }; 48 49 struct GetSDRReq 50 { 51 uint16_t reservationID; 52 uint16_t recordID; 53 uint8_t offset; 54 uint8_t bytesToRead; 55 }; 56 #pragma pack(pop) 57 58 enum class SdrRepositoryInfoOps : uint8_t 59 { 60 allocCommandSupported = 0x1, 61 reserveSDRRepositoryCommandSupported = 0x2, 62 partialAddSDRSupported = 0x4, 63 deleteSDRSupported = 0x8, 64 reserved = 0x10, 65 modalLSB = 0x20, 66 modalMSB = 0x40, 67 overflow = 0x80 68 }; 69 70 #pragma pack(push, 1) 71 struct GetAllocInfoResp 72 { 73 uint8_t allocUnitsLSB; 74 uint8_t allocUnitsMSB; 75 uint8_t allocUnitSizeLSB; 76 uint8_t allocUnitSizeMSB; 77 uint8_t allocUnitFreeLSB; 78 uint8_t allocUnitFreeMSB; 79 uint8_t allocUnitLargestFreeLSB; 80 uint8_t allocUnitLargestFreeMSB; 81 uint8_t maxRecordSize; 82 }; 83 84 struct GetFRUAreaReq 85 { 86 uint8_t fruDeviceID; 87 uint16_t fruInventoryOffset; 88 uint8_t countToRead; 89 }; 90 91 struct GetFRUAreaResp 92 { 93 uint8_t inventorySizeLSB; 94 uint8_t inventorySizeMSB; 95 uint8_t accessType; 96 }; 97 98 struct WriteFRUDataReq 99 { 100 uint8_t fruDeviceID; 101 uint16_t fruInventoryOffset; 102 uint8_t data[]; 103 }; 104 105 struct AddSELRequest 106 { 107 uint16_t recordID; 108 uint8_t recordType; 109 union 110 { 111 struct 112 { 113 uint32_t timestamp; 114 uint16_t generatorID; 115 uint8_t eventMsgRevision; 116 uint8_t sensorType; 117 uint8_t sensorNum; 118 uint8_t eventType; 119 uint8_t eventData[intel_oem::ipmi::sel::systemEventSize]; 120 } system; 121 struct 122 { 123 uint32_t timestamp; 124 uint8_t eventData[intel_oem::ipmi::sel::oemTsEventSize]; 125 } oemTs; 126 struct 127 { 128 uint8_t eventData[intel_oem::ipmi::sel::oemEventSize]; 129 } oem; 130 } record; 131 }; 132 #pragma pack(pop) 133 134 enum class GetFRUAreaAccessType : uint8_t 135 { 136 byte = 0x0, 137 words = 0x1 138 }; 139 140 enum class SensorUnits : uint8_t 141 { 142 unspecified = 0x0, 143 degreesC = 0x1, 144 volts = 0x4, 145 amps = 0x5, 146 watts = 0x6, 147 rpm = 0x12, 148 }; 149 150 enum class IPMINetfnStorageCmds : ipmi_cmd_t 151 { 152 ipmiCmdGetFRUInvAreaInfo = 0x10, 153 ipmiCmdReadFRUData = 0x11, 154 ipmiCmdWriteFRUData = 0x12, 155 ipmiCmdGetRepositoryInfo = 0x20, 156 ipmiCmdGetSDRAllocationInfo = 0x21, 157 ipmiCmdReserveSDR = 0x22, 158 ipmiCmdGetSDR = 0x23, 159 ipmiCmdAddSEL = 0x44, 160 }; 161 162 #pragma pack(push, 1) 163 struct FRUHeader 164 { 165 uint8_t commonHeaderFormat; 166 uint8_t internalOffset; 167 uint8_t chassisOffset; 168 uint8_t boardOffset; 169 uint8_t productOffset; 170 uint8_t multiRecordOffset; 171 uint8_t pad; 172 uint8_t checksum; 173 }; 174 #pragma pack(pop) 175 176 namespace ipmi 177 { 178 namespace storage 179 { 180 ipmi_ret_t getFruSdrs(size_t index, get_sdr::SensorDataFruRecord& resp); 181 182 ipmi_ret_t getFruSdrCount(size_t& count); 183 } // namespace storage 184 } // namespace ipmi 185