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