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