xref: /openbmc/intel-ipmi-oem/include/smbiosmdrv2.hpp (revision a3702c1f160b7995c4bf5df2654a29cd79be057f)
1  /*
2  // Copyright (c) 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 <ipmid/api.h>
19  
20  #include <oemcommands.hpp>
21  
22  constexpr uint8_t maxDirEntries = 4;
23  constexpr uint16_t msgPayloadSize = 1024 * 60;
24  constexpr uint32_t smbiosTableStorageSize = 64 * 1024;
25  constexpr uint32_t mdriiSMSize = 0x00100000;
26  
27  struct DataIdStruct
28  {
29      uint8_t dataInfo[16];
30  } __attribute__((packed));
31  
32  struct Mdr2DirEntry
33  {
34      DataIdStruct Id;
35      uint32_t size;
36      uint32_t dataSetSize;
37      uint32_t dataVersion;
38      uint32_t timestamp;
39  } __attribute__((packed));
40  
41  // ====================== MDR II Pull Command Structures ======================
42  // MDR II Pull Agent status inquiry command
43  struct MDRiiGetAgentStatus
44  {
45      uint16_t agentId;
46      uint8_t dirVersion;
47  } __attribute__((packed));
48  
49  // MDR II status inquiry response
50  struct MDRiiAgentStatusResponse
51  {
52      uint8_t mdrVersion;
53      uint8_t agentVersion;
54      uint8_t dirVersion;
55      uint8_t dirEntries;
56      uint8_t dataRequest;
57  } __attribute__((packed));
58  
59  // MDR II Pull Agent directory information inquiry command
60  struct MDRiiGetDirRequest
61  {
62      uint16_t agentId;
63      uint8_t dirIndex;
64  } __attribute__((packed));
65  
66  // MDR II directory information inquiry response
67  struct MDRiiGetDirResponse
68  {
69      uint8_t mdrVersion;
70      uint8_t dirVersion;
71      uint8_t returnedEntries;
72      uint8_t remainingEntries;
73      uint8_t data[1];
74  } __attribute__((packed));
75  
76  // MDR II Pull Agent data set information inquiry command
77  struct MDRiiGetDataInfoRequest
78  {
79      uint16_t agentId;
80      DataIdStruct dataSetInfo;
81  } __attribute__((packed));
82  
83  // MDR II data set information inquiry response
84  struct MDRiiGetDataInfoResponse
85  {
86      uint8_t mdrVersion;
87      DataIdStruct dataSetId;
88      uint8_t validFlag;
89      uint32_t dataLength;
90      uint32_t dataVersion;
91      uint32_t timeStamp;
92  } __attribute__((packed));
93  
94  // MDR II Pull Agent lock data set command
95  struct MDRiiLockDataRequest
96  {
97      uint16_t agentId;
98      DataIdStruct dataSetInfo;
99      uint16_t timeout;
100  } __attribute__((packed));
101  
102  // MDR II Pull Agent lock data set response
103  struct MDRiiLockDataResponse
104  {
105      uint8_t mdrVersion;
106      uint16_t lockHandle;
107      uint32_t dataLength;
108      uint32_t xferAddress;
109      uint32_t xferLength;
110  } __attribute__((packed));
111  
112  // MDR II Pull Agent unlock data set command
113  struct MDRiiUnlockDataRequest
114  {
115      uint16_t agentId;
116      uint16_t lockHandle;
117  } __attribute__((packed));
118  
119  // MDR II Pull Agent get data block command
120  struct MDRiiGetDataBlockRequest
121  {
122      uint16_t agentId;
123      uint16_t lockHandle;
124      uint32_t xferOffset;
125      uint32_t xferLength;
126  } __attribute__((packed));
127  
128  // MDR II Pull Agent get data block response
129  struct MDRiiGetDataBlockResponse
130  {
131      uint32_t xferLength;
132      uint32_t checksum;
133      uint8_t data[msgPayloadSize];
134  } __attribute__((packed));
135  
136  // ====================== MDR II Push Command Structures ======================
137  // MDR II Push Agent send dir info command
138  struct MDRiiSendDirRequest
139  {
140      uint16_t agentId;
141      uint8_t dirVersion;
142      uint8_t dirIndex;
143      uint8_t returnedEntries;
144      uint8_t remainingEntries;
145      Mdr2DirEntry data[1]; // place holder for N directory entries
146  } __attribute__((packed));
147  
148  // MDR II Push Agent offer data set info command
149  struct MDRiiOfferDataInfo
150  {
151      uint16_t agentId;
152  } __attribute__((packed));
153  
154  // MDR II Client send data set info offer response
155  struct MDRiiOfferDataInfoResponse
156  {
157      DataIdStruct dataSetInfo;
158  } __attribute__((packed));
159  
160  // MDR II Push Agent send data set info command
161  struct MDRiiSendDataInfoRequest
162  {
163      uint16_t agentId;
164      DataIdStruct dataSetInfo;
165      uint8_t validFlag;
166      uint32_t dataLength;
167      uint32_t dataVersion; // Roughly equivalent to the "file name"
168      uint32_t
169          timeStamp; // More info on the identity of this particular set of data
170  } __attribute__((packed));
171  
172  // MDR II Push Agent send data start command
173  struct MDRiiDataStartRequest
174  {
175      uint16_t agentId;
176      DataIdStruct dataSetInfo;
177      uint32_t dataLength;
178      uint32_t xferAddress;
179      uint32_t xferLength;
180      uint16_t timeout;
181  } __attribute__((packed));
182  
183  // MDR II Client send data start response
184  struct MDRiiDataStartResponse
185  {
186      uint8_t xferStartAck;
187      uint16_t sessionHandle;
188  } __attribute__((packed));
189  
190  // MDR II
191  struct MDRiiDataDoneRequest
192  {
193      uint16_t agentId;
194      uint16_t lockHandle;
195  } __attribute__((packed));
196  
197  // MDR II Push Agent send data block command
198  struct MDRiiSendDataBlockRequest
199  {
200      uint16_t agentId;
201      uint16_t lockHandle;
202      uint32_t xferOffset;
203      uint32_t xferLength;
204      uint32_t checksum;
205  } __attribute__((packed));
206