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 GetSDRReq
39 {
40     uint16_t reservationID;
41     uint16_t recordID;
42     uint8_t offset;
43     uint8_t bytesToRead;
44 };
45 #pragma pack(pop)
46 
47 enum class SdrRepositoryInfoOps : uint8_t
48 {
49     allocCommandSupported = 0x1,
50     reserveSDRRepositoryCommandSupported = 0x2,
51     partialAddSDRSupported = 0x4,
52     deleteSDRSupported = 0x8,
53     reserved = 0x10,
54     modalLSB = 0x20,
55     modalMSB = 0x40,
56     overflow = 0x80
57 };
58 
59 #pragma pack(push, 1)
60 struct GetFRUAreaReq
61 {
62     uint8_t fruDeviceID;
63     uint16_t fruInventoryOffset;
64     uint8_t countToRead;
65 };
66 
67 struct WriteFRUDataReq
68 {
69     uint8_t fruDeviceID;
70     uint16_t fruInventoryOffset;
71     uint8_t data[];
72 };
73 #pragma pack(pop)
74 
75 enum class GetFRUAreaAccessType : uint8_t
76 {
77     byte = 0x0,
78     words = 0x1
79 };
80 
81 enum class SensorUnits : uint8_t
82 {
83     unspecified = 0x0,
84     degreesC = 0x1,
85     volts = 0x4,
86     amps = 0x5,
87     watts = 0x6,
88     rpm = 0x12,
89 };
90 
91 enum class IPMINetfnStorageCmds : ipmi_cmd_t
92 {
93     ipmiCmdReadFRUData = 0x11,
94     ipmiCmdWriteFRUData = 0x12,
95     ipmiCmdGetRepositoryInfo = 0x20,
96     ipmiCmdGetSDRAllocationInfo = 0x21,
97     ipmiCmdReserveSDR = 0x22,
98     ipmiCmdGetSDR = 0x23,
99 };
100 
101 #pragma pack(push, 1)
102 struct FRUHeader
103 {
104     uint8_t commonHeaderFormat;
105     uint8_t internalOffset;
106     uint8_t chassisOffset;
107     uint8_t boardOffset;
108     uint8_t productOffset;
109     uint8_t multiRecordOffset;
110     uint8_t pad;
111     uint8_t checksum;
112 };
113 #pragma pack(pop)
114 
115 #pragma pack(push, 1)
116 struct Type12Record
117 {
118     get_sdr::SensorDataRecordHeader header;
119     uint8_t slaveAddress;
120     uint8_t channelNumber;
121     uint8_t powerStateNotification;
122     uint8_t deviceCapabilities;
123     uint24_t reserved;
124     uint8_t entityID;
125     uint8_t entityInstance;
126     uint8_t oem;
127     uint8_t typeLengthCode;
128     char name[16];
129 };
130 #pragma pack(pop)
131 
132 namespace ipmi
133 {
134 namespace storage
135 {
136 
137 constexpr const size_t type12Count = 2;
138 ipmi_ret_t getFruSdrs(size_t index, get_sdr::SensorDataFruRecord& resp);
139 
140 ipmi_ret_t getFruSdrCount(size_t& count);
141 
142 std::vector<uint8_t> getType12SDRs(uint16_t index, uint16_t recordId);
143 } // namespace storage
144 } // namespace ipmi
145