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