1# Sketch of OpenBMC OEM message formats
2
3This document describes OEM Requests to be supported using the OpenBMC OEM
4Number.
5
6### What's in the box?
7
8- Briefly recap OEM Extension layout as described in IPMI Specification.
9- Enumerate Command codes allocated for use with the OpenBMC OEM Number.
10- For each such code, describe the associated messages, including
11  representation, function, meaning, limits, and so on.
12
13### OEM Extensions, Block Transfer Transport Example.
14
15This table and the next briefly recap OEM Extension messages as described in the
16[IPMI Specification](http://www.intel.com/content/www/us/en/servers/ipmi/ipmi-second-gen-interface-spec-v2-rev1-1.html).
17To keep it both simple and concrete, only BT Tansport is described. Please
18consult that specification for the full story.
19
20#### OEM Request
21
22Per section 11.1 of IPMI Spec
23
24|  Bytes  | Bits | Spec ID  | Value | Description                               |
25| :-----: | ---: | :------- | :---: | :---------------------------------------- |
26|    0    |      | Length\* |   -   | Number of bytes to follow in this request |
27|    1    |  2:7 | NetFn    | 0x2E  | OEM Request                               |
28|    1    |  0:1 | LUN      |   -   | Allow any LUN                             |
29|    2    |      | Seq\*    |   -   | Per section 11.3 of IPMI Spec             |
30|    3    |      | Cmd      |   -   | Table 3 - OpenBMC Cmd Codes               |
31|  4 ~ 6  |      | OEN      | 49871 | OEM Enterprise Number                     |
32| 2 ~ n+6 |      | Data     |   -   | n data bytes, encoding depends on Cmd     |
33
34Notes:
35
36- Length and Seq are specific to BT transport - other transports may not have
37  them.
38
39- Serialize numbers larger than 1 byte LSB first - e.g., represent OEM
40  Enterprise Number 49871 as `{0xcf, 0xc2, 0x00}`
41
42#### OEM Response
43
44Per section 11.2 of IPMI Spec
45
46|  Bytes  | Bits | Spec ID  | Value | Description                                     |
47| :-----: | ---: | :------- | :---: | :---------------------------------------------- |
48|    0    |      | Length\* |   -   | Number of bytes to follow in this response      |
49|    1    |  2:7 | NetFn    | 0x2F  | OEM Response                                    |
50|    1    |  0:1 | LUN      |   -   | LUN of request to which this is a response      |
51|    2    |      | Seq\*    |   -   | Seq of request to which this is a response      |
52|    3    |      | Cmd      |   -   | Cmd code of request to which this is a response |
53|    4    |      | CC       |   -   | Completion code, Section 5.2 of IPMI Spec v2.0  |
54|  5 ~ 7  |      | OEN      | 49871 | OEM Enterprise Number                           |
55| 8 ~ n+7 |      | Data     |   -   | n data bytes, encoding depends on Cmd           |
56
57### OpenBMC OEM Cmd Codes
58
59```
60/*
61 * This is the OpenBMC IANA OEM Number
62 */
63constexpr OemNumber obmcOemNumber = 49871;
64```
65
66These are the Command codes allocated for use with the OpenBMC OEM Number.
67
68|   Cmd   | Identifier   | Description         |
69| :-----: | :----------- | :------------------ |
70|    0    | -            | Reserved            |
71|    1    | gpioCmd      | GPIO Access         |
72|    2    | i2cCmd       | I2C Device Access   |
73|    3    | flashCmd     | Flash Device Access |
74|    4    | fanManualCmd | Manual Fan Controls |
75| 5 ~ 255 | -            | Unallocated         |
76
77### I2C Device Access (Command 2)
78
79The next subsections describe command and response messages supporting the I2C
80Device Access extension OpenBMC OEM extension (command code 2).
81
82#### I2C Request Message - Overall
83
84|  Bytes  | Bits | Identifier    | Description               |
85| :-----: | :--- | :------------ | :------------------------ |
86|    0    |      | bus           | Logical I2C bus.          |
87|    1    |      | xferFlags     | Flags for all steps.      |
88|         | 7    | I2cFlagUsePec | 1 => use PEC - see note.  |
89|         | 6:0  |               | Reserved(0)               |
90| 2 ~ n-1 |      |               | Step sequence - see next. |
91
92Notes
93
94- Total length of step sequence must exactly fill request.
95
96- Intent is to handle
97  [Linux Kernel SMBus Protocol](https://www.kernel.org/doc/Documentation/i2c/smbus-protocol),
98  with com generalized to m byte sequence - e.g., at24c64 uses 2 address bytes,
99  and n bytes of received data, rather than specific operations for various
100  sizes.
101
102- Goal is to support SMBus v2 32-byte data block length limit; but easily
103  supports new 4 and 8 byte transfers added for
104  [SMBus v3](http://smbus.org/specs/SMBus_3_0_20141220.pdf).
105
106- PEC refers to SMBus Packet Error Check.
107
108- SMBus address resolution, alerts, and non-standard protocols not supported. So
109  for example, there is no way to insert a stop command within a transfer.
110
111- Depending on options, i2cdetect uses either quick write or 1 byte read;
112  default is 1-byte read for eeprom/spd memory ranges, else quick write.
113
114#### I2C Request Message - Step Properties
115
116| Bytes | Bits | Identifier     | Description                                   |
117| :---: | :--: | :------------- | :-------------------------------------------- |
118|   0   |      | devAndDir      |
119|       | 7:1  | dev            | 7-bit I2C device address.                     |
120|       |  0   | isRead         | 1 = read, 0 = write.                          |
121|   1   |      | stepFlags      |
122|       |  7   | i2cFlagRecvLen | 1 if block read, else regular; see table.     |
123|       |  6   | i2cFlagNoStart | 1 to suppress I2C start.                      |
124|       | 5:0  |                | Reserved(0)                                   |
125|   2   |      | p              | Count parameter; see table                    |
126| 3:m+2 |      | wrPayload      | Nonempty iff p supplies nonzero m; see table. |
127
128##### Allowed step property combinations
129
130| is_read | RecvLen |  p  | Size | Description                             |
131| :-----: | :-----: | :-: | :--- | :-------------------------------------- |
132|    0    |    0    |  0  | 3    | Quick write 0; same as write m=0 bytes. |
133|    0    |    0    |  m  | m+3  | Consume and write next m bytes.         |
134|    0    |    1    |  -  | 3    | Reserved.                               |
135|    1    |    0    |  0  | 3    | Quick write 1; same as read n=0 bytes.  |
136|    1    |    0    |  n  | 3    | Read n bytes.                           |
137|    1    |    1    |  -  | 3    | Read count from device.                 |
138
139Notes
140
141- All other combinations are reserved.
142
143- RecvLen corresponds to Linux
144  [I2C_M_RECV_LEN message flags bit](http://elixir.free-electrons.com/linux/v4.10.17/source/include/uapi/linux/i2c.h#L78)
145
146- Transfers include byte count in SMBUS block modes, and PEC byte when selected.
147  Allows for use with SMBUS compatibility layer.
148
149- In case of write steps, wrPayload may include:
150  - register address byte or bytes;
151  - count byte if implementing SMBUS block or call operation;
152  - up to 32 bytes of logical payload; and
153  - PEC byte.
154
155#### I2C Response Message
156
157| Bytes | Identifier |  Size  | Description        |
158| :---: | :--------- | :----: | :----------------- |
159| 0:n-1 | rd_data    | 0 ~ 34 | byte sequence read |
160
161Notes
162
163- Maximum logical payload is 32.
164
165- In the unlikely event a transfer specifies multiple read steps, all bytes read
166  are simply concatenated in the order read.
167
168- However, maximum reply limit is sized for the largest single read.
169
170- RecvLen case w/ PEC can return up to 34 bytes: count + payload + PEC
171