1 /** @file
2   Smbus Library Services that conduct SMBus transactions and enable the operatation
3   to be replayed during an S3 resume. This library class maps directly on top
4   of the SmbusLib class.
5 
6   Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
7 
8   This program and the accompanying materials
9   are licensed and made available under the terms and conditions
10   of the BSD License which accompanies this distribution.  The
11   full text of the license may be found at
12   http://opensource.org/licenses/bsd-license.php
13 
14   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
15   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 
17 **/
18 
19 #ifndef __S3_SMBUS_LIB_H__
20 #define __S3_SMBUS_LIB_H__
21 
22 /**
23   Executes an SMBUS quick read command, and saves the value in the S3 script to be replayed
24   on S3 resume.
25 
26   Executes an SMBUS quick read command on the SMBUS device specified by SmBusAddress.
27   Only the SMBUS slave address field of SmBusAddress is required.
28   If Status is not NULL, then the status of the executed command is returned in Status.
29   If PEC is set in SmBusAddress, then ASSERT().
30   If Command in SmBusAddress is not zero, then ASSERT().
31   If Length in SmBusAddress is not zero, then ASSERT().
32   If any reserved bits of SmBusAddress are set, then ASSERT().
33 
34   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
35                              SMBUS Command, SMBUS Data Length, and PEC.
36   @param[out] Status         The return status for the executed command.
37                              This is an optional parameter and may be NULL.
38                              RETURN_SUCCESS  		 The SMBUS command was executed.
39                              RETURN_TIMEOUT  		 A timeout occurred while executing the SMBUS command.
40                              RETURN_DEVICE_ERROR The request was not completed because a failure
41                               was recorded in the Host Status Register bit.  Device errors are a result
42                               of a transaction collision, illegal command field, unclaimed cycle
43                               (host initiated), or bus error (collision).
44                              RETURN_UNSUPPORTED  	The SMBus operation is not supported.
45 
46 **/
47 VOID
48 EFIAPI
49 S3SmBusQuickRead (
50   IN  UINTN          SmBusAddress,
51   OUT RETURN_STATUS  *Status       OPTIONAL
52   );
53 
54 /**
55   Executes an SMBUS quick write command, and saves the value in the S3 script to be replayed
56   on S3 resume.
57 
58   Executes an SMBUS quick write command on the SMBUS device specified by SmBusAddress.
59   Only the SMBUS slave address field of SmBusAddress is required.
60   If Status is not NULL, then the status of the executed command is returned in Status.
61   If PEC is set in SmBusAddress, then ASSERT().
62   If Command in SmBusAddress is not zero, then ASSERT().
63   If Length in SmBusAddress is not zero, then ASSERT().
64   If any reserved bits of SmBusAddress are set, then ASSERT().
65 
66   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
67                              SMBUS Command, SMBUS Data Length, and PEC.
68   @param[out] Status         The return status for the executed command.
69                              This is an optional parameter and may be NULL.
70                              RETURN_SUCCESS  		The SMBUS command was executed.
71                              RETURN_TIMEOUT  		A timeout occurred while executing the SMBUS command.
72                              RETURN_DEVICE_ERROR The request was not completed because a failure
73                              was recorded in the Host Status Register bit.  Device errors are a result
74                              of a transaction collision, illegal command field, unclaimed cycle
75                              (host initiated), or bus error (collision).
76                              RETURN_UNSUPPORTED  	The SMBus operation is not supported.
77 
78 **/
79 VOID
80 EFIAPI
81 S3SmBusQuickWrite (
82   IN  UINTN          SmBusAddress,
83   OUT RETURN_STATUS  *Status       OPTIONAL
84   );
85 
86 /**
87   Executes an SMBUS receive byte command, and saves the value in the S3 script to be replayed
88   on S3 resume.
89 
90   Executes an SMBUS receive byte command on the SMBUS device specified by SmBusAddress.
91   Only the SMBUS slave address field of SmBusAddress is required.
92   The byte received from the SMBUS is returned.
93   If Status is not NULL, then the status of the executed command is returned in Status.
94   If Command in SmBusAddress is not zero, then ASSERT().
95   If Length in SmBusAddress is not zero, then ASSERT().
96   If any reserved bits of SmBusAddress are set, then ASSERT().
97 
98   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
99                              SMBUS Command, SMBUS Data Length, and PEC.
100   @param[out] Status         The return status for the executed command.
101                              This is an optional parameter and may be NULL.
102                              RETURN_SUCCESS  		The SMBUS command was executed.
103                              RETURN_TIMEOUT  		A timeout occurred while executing the SMBUS command.
104                              RETURN_DEVICE_ERROR The request was not completed because a failure
105                              was recorded in the Host Status Register bit.  Device errors are a result
106                              of a transaction collision, illegal command field, unclaimed cycle
107                              (host initiated), or bus error (collision).
108                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
109                              RETURN_UNSUPPORTED  	The SMBus operation is not supported.
110 
111   @return   The byte received from the SMBUS.
112 
113 **/
114 UINT8
115 EFIAPI
116 S3SmBusReceiveByte (
117   IN  UINTN          SmBusAddress,
118   OUT RETURN_STATUS  *Status        OPTIONAL
119   );
120 
121 /**
122   Executes an SMBUS send byte command, and saves the value in the S3 script to be replayed
123   on S3 resume.
124 
125   Executes an SMBUS send byte command on the SMBUS device specified by SmBusAddress.
126   The byte specified by Value is sent.
127   Only the SMBUS slave address field of SmBusAddress is required.  Value is returned.
128   If Status is not NULL, then the status of the executed command is returned in Status.
129   If Command in SmBusAddress is not zero, then ASSERT().
130   If Length in SmBusAddress is not zero, then ASSERT().
131   If any reserved bits of SmBusAddress are set, then ASSERT().
132 
133   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
134                              SMBUS Command, SMBUS Data Length, and PEC.
135   @param[in]  Value          The 8-bit value to send.
136   @param[out] Status         The return status for the executed command.
137                              This is an optional parameter and may be NULL.
138                              RETURN_SUCCESS The SMBUS command was executed.
139                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
140                              RETURN_DEVICE_ERROR  The request was not completed because a failure
141                              was recorded in the Host Status Register bit.  Device errors are a result
142                              of a transaction collision, illegal command field, unclaimed cycle
143                              (host initiated), or bus errors (collisions).
144                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
145                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
146 
147   @return   The parameter of Value.
148 
149 **/
150 UINT8
151 EFIAPI
152 S3SmBusSendByte (
153   IN  UINTN          SmBusAddress,
154   IN  UINT8          Value,
155   OUT RETURN_STATUS  *Status        OPTIONAL
156   );
157 
158 /**
159   Executes an SMBUS read data byte command, and saves the value in the S3 script to be replayed
160   on S3 resume.
161 
162   Executes an SMBUS read data byte command on the SMBUS device specified by SmBusAddress.
163   Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
164   The 8-bit value read from the SMBUS is returned.
165   If Status is not NULL, then the status of the executed command is returned in Status.
166   If Length in SmBusAddress is not zero, then ASSERT().
167   If any reserved bits of SmBusAddress are set, then ASSERT().
168 
169   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
170                              SMBUS Command, SMBUS Data Length, and PEC.
171   @param[out] Status         The return status for the executed command.
172                              This is an optional parameter and may be NULL.
173                              RETURN_SUCCESS The SMBUS command was executed.
174                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
175                              RETURN_DEVICE_ERROR  The request was not completed because a failure
176                              was recorded in the Host Status Register bit.  Device errors are a result
177                              of a transaction collision, illegal command field, unclaimed cycle
178                              (host initiated), or bus error (collision).
179                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
180                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
181 
182   @return   The byte read from the SMBUS.
183 
184 **/
185 UINT8
186 EFIAPI
187 S3SmBusReadDataByte (
188   IN  UINTN          SmBusAddress,
189   OUT RETURN_STATUS  *Status        OPTIONAL
190   );
191 
192 /**
193   Executes an SMBUS write data byte command, and saves the value in the S3 script to be replayed
194   on S3 resume.
195 
196   Executes an SMBUS write data byte command on the SMBUS device specified by SmBusAddress.
197   The 8-bit value specified by Value is written.
198   Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
199   Value is returned.
200   If Status is not NULL, then the status of the executed command is returned in Status.
201   If Length in SmBusAddress is not zero, then ASSERT().
202   If any reserved bits of SmBusAddress are set, then ASSERT().
203 
204   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
205                              SMBUS Command, SMBUS Data Length, and PEC.
206   @param[in]  Value          The 8-bit value to write.
207   @param[out] Status         The return status for the executed command.
208                              This is an optional parameter and may be NULL.
209                              RETURN_SUCCESS The SMBUS command was executed.
210                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
211                              RETURN_DEVICE_ERROR  The request was not completed because a failure
212                              was recorded in the Host Status Register bit.  Device errors are a result
213                              of a transaction collision, illegal command field, unclaimed cycle
214                              (host initiated), or bus error (collision).
215                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
216                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
217 
218   @return   The parameter of Value.
219 
220 **/
221 UINT8
222 EFIAPI
223 S3SmBusWriteDataByte (
224   IN  UINTN          SmBusAddress,
225   IN  UINT8          Value,
226   OUT RETURN_STATUS  *Status        OPTIONAL
227   );
228 
229 /**
230   Executes an SMBUS read data word command, and saves the value in the S3 script to be replayed
231   on S3 resume.
232 
233   Executes an SMBUS read data word command on the SMBUS device specified by SmBusAddress.
234   Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
235   The 16-bit value read from the SMBUS is returned.
236   If Status is not NULL, then the status of the executed command is returned in Status.
237   If Length in SmBusAddress is not zero, then ASSERT().
238   If any reserved bits of SmBusAddress are set, then ASSERT().
239 
240   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
241                              SMBUS Command, SMBUS Data Length, and PEC.
242   @param[out] Status         The return status for the executed command.
243                              This is an optional parameter and may be NULL.
244                              RETURN_SUCCESS The SMBUS command was executed.
245                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
246                              RETURN_DEVICE_ERROR  The request was not completed because a failure
247                              was recorded in the Host Status Register bit.  Device errors are a result
248                              of a transaction collision, illegal command field, unclaimed cycle
249                              (host initiated), or bus error (collision).
250                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
251                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
252 
253   @return   The byte read from the SMBUS.
254 
255 **/
256 UINT16
257 EFIAPI
258 S3SmBusReadDataWord (
259   IN  UINTN          SmBusAddress,
260   OUT RETURN_STATUS  *Status        OPTIONAL
261   );
262 
263 /**
264   Executes an SMBUS write data word command, and saves the value in the S3 script to be replayed
265   on S3 resume.
266 
267   Executes an SMBUS write data word command on the SMBUS device specified by SmBusAddress.
268   The 16-bit value specified by Value is written.
269   Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
270   Value is returned.
271   If Status is not NULL, then the status of the executed command is returned in Status.
272   If Length in SmBusAddress is not zero, then ASSERT().
273   If any reserved bits of SmBusAddress are set, then ASSERT().
274 
275   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
276                              SMBUS Command, SMBUS Data Length, and PEC.
277   @param[in]  Value          The 16-bit value to write.
278   @param[out] Status         The return status for the executed command.
279                              This is an optional parameter and may be NULL.
280                              RETURN_SUCCESS The SMBUS command was executed.
281                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
282                              RETURN_DEVICE_ERROR  The request was not completed because a failure
283                              was recorded in the Host Status Register bit.  Device errors are a result
284                              of a transaction collision, illegal command field, unclaimed cycle
285                              (host initiated), or bus error (collision).
286                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
287                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
288 
289   @return   The parameter of Value.
290 
291 **/
292 UINT16
293 EFIAPI
294 S3SmBusWriteDataWord (
295   IN  UINTN          SmBusAddress,
296   IN  UINT16         Value,
297   OUT RETURN_STATUS  *Status        OPTIONAL
298   );
299 
300 /**
301   Executes an SMBUS process call command, and saves the value in the S3 script to be replayed
302   on S3 resume.
303 
304   Executes an SMBUS process call command on the SMBUS device specified by SmBusAddress.
305   The 16-bit value specified by Value is written.
306   Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
307   The 16-bit value returned by the process call command is returned.
308   If Status is not NULL, then the status of the executed command is returned in Status.
309   If Length in SmBusAddress is not zero, then ASSERT().
310   If any reserved bits of SmBusAddress are set, then ASSERT().
311 
312   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
313                              SMBUS Command, SMBUS Data Length, and PEC.
314   @param[in]  Value          The 16-bit value to write.
315   @param[out] Status         The return status for the executed command.
316                              This is an optional parameter and may be NULL.
317                              RETURN_SUCCESS The SMBUS command was executed.
318                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
319                              RETURN_DEVICE_ERROR  The request was not completed because a failure
320                              was recorded in the Host Status Register bit.  Device errors are a result
321                              of a transaction collision, illegal command field, unclaimed cycle
322                              (host initiated), or bus error (collision).
323                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
324                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
325 
326   @return   The 16-bit value returned by the process call command.
327 
328 **/
329 UINT16
330 EFIAPI
331 S3SmBusProcessCall (
332   IN  UINTN          SmBusAddress,
333   IN  UINT16         Value,
334   OUT RETURN_STATUS  *Status        OPTIONAL
335   );
336 
337 /**
338   Executes an SMBUS read block command, and saves the value in the S3 script to be replayed
339   on S3 resume.
340 
341   Executes an SMBUS read block command on the SMBUS device specified by SmBusAddress.
342   Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
343   Bytes are read from the SMBUS and stored in Buffer.
344   The number of bytes read is returned, and will never return a value larger than 32-bytes.
345   If Status is not NULL, then the status of the executed command is returned in Status.
346   It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
347   SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
348   If Length in SmBusAddress is not zero, then ASSERT().
349   If Buffer is NULL, then ASSERT().
350   If any reserved bits of SmBusAddress are set, then ASSERT().
351 
352   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
353                              SMBUS Command, SMBUS Data Length, and PEC.
354   @param[out] Buffer         The pointer to the buffer to store the bytes read from the SMBUS.
355   @param[out] Status         The return status for the executed command.
356                              This is an optional parameter and may be NULL.
357                              RETURN_SUCCESS The SMBUS command was executed.
358                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
359                              RETURN_DEVICE_ERROR  The request was not completed because a failure
360                              was recorded in the Host Status Register bit.  Device errors are a result
361                              of a transaction collision, illegal command field, unclaimed cycle
362                              (host initiated), or bus error (collision).
363                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
364                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
365 
366   @return   The number of bytes read.
367 
368 **/
369 UINTN
370 EFIAPI
371 S3SmBusReadBlock (
372   IN  UINTN          SmBusAddress,
373   OUT VOID           *Buffer,
374   OUT RETURN_STATUS  *Status        OPTIONAL
375   );
376 
377 /**
378   Executes an SMBUS write block command, and saves the value in the S3 script to be replayed
379   on S3 resume.
380 
381   Executes an SMBUS write block command on the SMBUS device specified by SmBusAddress.
382   The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
383   Bytes are written to the SMBUS from Buffer.
384   The number of bytes written is returned, and will never return a value larger than 32-bytes.
385   If Status is not NULL, then the status of the executed command is returned in Status.
386   If Length in SmBusAddress is zero or greater than 32, then ASSERT().
387   If Buffer is NULL, then ASSERT().
388   If any reserved bits of SmBusAddress are set, then ASSERT().
389 
390   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
391                              SMBUS Command, SMBUS Data Length, and PEC.
392   @param[out] Buffer         The pointer to the buffer to store the bytes read from the SMBUS.
393   @param[out] Status         The return status for the executed command.
394                              This is an optional parameter and may be NULL.
395                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
396                              RETURN_DEVICE_ERROR  The request was not completed because a failure
397                              was recorded in the Host Status Register bit.  Device errors are a result
398                              of a transaction collision, illegal command field, unclaimed cycle
399                              (host initiated), or bus error (collision).
400                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
401                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
402 
403   @return   The number of bytes written.
404 
405 **/
406 UINTN
407 EFIAPI
408 S3SmBusWriteBlock (
409   IN  UINTN          SmBusAddress,
410   OUT VOID           *Buffer,
411   OUT RETURN_STATUS  *Status        OPTIONAL
412   );
413 
414 /**
415   Executes an SMBUS block process call command, and saves the value in the S3 script to be replayed
416   on S3 resume.
417 
418   Executes an SMBUS block process call command on the SMBUS device specified by SmBusAddress.
419   The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
420   Bytes are written to the SMBUS from WriteBuffer.  Bytes are then read from the SMBUS into ReadBuffer.
421   If Status is not NULL, then the status of the executed command is returned in Status.
422   It is the caller's responsibility to make sure ReadBuffer is large enough for the total number of bytes read.
423   SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
424   If Length in SmBusAddress is zero or greater than 32, then ASSERT().
425   If WriteBuffer is NULL, then ASSERT().
426   If ReadBuffer is NULL, then ASSERT().
427   If any reserved bits of SmBusAddress are set, then ASSERT().
428 
429   @param[in]  SmBusAddress   The address that encodes the SMBUS Slave Address,
430                              SMBUS Command, SMBUS Data Length, and PEC.
431   @param[in]  WriteBuffer    The pointer to the buffer of bytes to write to the SMBUS.
432   @param[out] ReadBuffer     The pointer to the buffer of bytes to read from the SMBUS.
433   @param[out] Status         The return status for the executed command.
434                              This is an optional parameter and may be NULL.
435                              RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
436                              RETURN_DEVICE_ERROR  The request was not completed because a failure
437                              was recorded in the Host Status Register bit.  Device errors are a result
438                              of a transaction collision, illegal command field, unclaimed cycle
439                              (host initiated), or bus error (collision).
440                              RETURN_CRC_ERROR  The checksum is not correct (PEC is incorrect).
441                              RETURN_UNSUPPORTED  The SMBus operation is not supported.
442 
443   @return   The number of bytes written.
444 
445 **/
446 UINTN
447 EFIAPI
448 S3SmBusBlockProcessCall (
449   IN  UINTN          SmBusAddress,
450   IN  VOID           *WriteBuffer,
451   OUT VOID           *ReadBuffer,
452   OUT RETURN_STATUS  *Status        OPTIONAL
453   );
454 
455 #endif
456