1 /** @file 2 Null implementation of SmBusLib class library. 3 4 Copyright (c) 2013, 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 15 #include <Base.h> 16 #include <Library/SmbusLib.h> 17 #include <Library/DebugLib.h> 18 19 /** 20 Executes an SMBUS quick read command. 21 22 Executes an SMBUS quick read command on the SMBUS device specified by SmBusAddress. 23 Only the SMBUS slave address field of SmBusAddress is required. 24 If Status is not NULL, then the status of the executed command is returned in Status. 25 If PEC is set in SmBusAddress, then ASSERT(). 26 If Command in SmBusAddress is not zero, then ASSERT(). 27 If Length in SmBusAddress is not zero, then ASSERT(). 28 If any reserved bits of SmBusAddress are set, then ASSERT(). 29 30 @param SmBusAddress Address that encodes the SMBUS Slave Address, 31 SMBUS Command, SMBUS Data Length, and PEC. 32 @param Status Return status for the executed command. 33 This is an optional parameter and may be NULL. 34 RETURN_SUCCESS The SMBUS command was executed. 35 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 36 RETURN_DEVICE_ERROR The request was not completed because a failure 37 reflected in the Host Status Register bit. Device errors are a result 38 of a transaction collision, illegal command field, unclaimed cycle 39 (host initiated), or bus errors (collisions). 40 RETURN_UNSUPPORTED The SMBus operation is not supported. 41 42 **/ 43 VOID 44 EFIAPI 45 SmBusQuickRead ( 46 IN UINTN SmBusAddress, 47 OUT RETURN_STATUS *Status OPTIONAL 48 ) 49 { 50 ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); 51 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); 52 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 53 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 54 if (Status != NULL) { 55 *Status = RETURN_UNSUPPORTED; 56 } 57 } 58 59 /** 60 Executes an SMBUS quick write command. 61 62 Executes an SMBUS quick write command on the SMBUS device specified by SmBusAddress. 63 Only the SMBUS slave address field of SmBusAddress is required. 64 If Status is not NULL, then the status of the executed command is returned in Status. 65 If PEC is set in SmBusAddress, then ASSERT(). 66 If Command in SmBusAddress is not zero, then ASSERT(). 67 If Length in SmBusAddress is not zero, then ASSERT(). 68 If any reserved bits of SmBusAddress are set, then ASSERT(). 69 70 @param SmBusAddress Address that encodes the SMBUS Slave Address, 71 SMBUS Command, SMBUS Data Length, and PEC. 72 @param Status Return status for the executed command. 73 This is an optional parameter and may be NULL. 74 RETURN_SUCCESS The SMBUS command was executed. 75 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 76 RETURN_DEVICE_ERROR The request was not completed because a failure 77 reflected in the Host Status Register bit. Device errors are a result 78 of a transaction collision, illegal command field, unclaimed cycle 79 (host initiated), or bus errors (collisions). 80 RETURN_UNSUPPORTED The SMBus operation is not supported. 81 82 **/ 83 VOID 84 EFIAPI 85 SmBusQuickWrite ( 86 IN UINTN SmBusAddress, 87 OUT RETURN_STATUS *Status OPTIONAL 88 ) 89 { 90 ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); 91 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); 92 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 93 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 94 if (Status != NULL) { 95 *Status = RETURN_UNSUPPORTED; 96 } 97 } 98 99 /** 100 Executes an SMBUS receive byte command. 101 102 Executes an SMBUS receive byte command on the SMBUS device specified by SmBusAddress. 103 Only the SMBUS slave address field of SmBusAddress is required. 104 The byte received from the SMBUS is returned. 105 If Status is not NULL, then the status of the executed command is returned in Status. 106 If Command in SmBusAddress is not zero, then ASSERT(). 107 If Length in SmBusAddress is not zero, then ASSERT(). 108 If any reserved bits of SmBusAddress are set, then ASSERT(). 109 110 @param SmBusAddress Address that encodes the SMBUS Slave Address, 111 SMBUS Command, SMBUS Data Length, and PEC. 112 @param Status Return status for the executed command. 113 This is an optional parameter and may be NULL. 114 RETURN_SUCCESS The SMBUS command was executed. 115 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 116 RETURN_DEVICE_ERROR The request was not completed because a failure 117 reflected in the Host Status Register bit. Device errors are a result 118 of a transaction collision, illegal command field, unclaimed cycle 119 (host initiated), or bus errors (collisions). 120 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 121 RETURN_UNSUPPORTED The SMBus operation is not supported. 122 123 @return The byte received from the SMBUS. 124 125 **/ 126 UINT8 127 EFIAPI 128 SmBusReceiveByte ( 129 IN UINTN SmBusAddress, 130 OUT RETURN_STATUS *Status OPTIONAL 131 ) 132 { 133 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); 134 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 135 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 136 if (Status != NULL) { 137 *Status = RETURN_UNSUPPORTED; 138 } 139 return 0; 140 } 141 142 /** 143 Executes an SMBUS send byte command. 144 145 Executes an SMBUS send byte command on the SMBUS device specified by SmBusAddress. 146 The byte specified by Value is sent. 147 Only the SMBUS slave address field of SmBusAddress is required. Value is returned. 148 If Status is not NULL, then the status of the executed command is returned in Status. 149 If Command in SmBusAddress is not zero, then ASSERT(). 150 If Length in SmBusAddress is not zero, then ASSERT(). 151 If any reserved bits of SmBusAddress are set, then ASSERT(). 152 153 @param SmBusAddress Address that encodes the SMBUS Slave Address, 154 SMBUS Command, SMBUS Data Length, and PEC. 155 @param Value The 8-bit value to send. 156 @param Status Return status for the executed command. 157 This is an optional parameter and may be NULL. 158 RETURN_SUCCESS The SMBUS command was executed. 159 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 160 RETURN_DEVICE_ERROR The request was not completed because a failure 161 reflected in the Host Status Register bit. Device errors are a result 162 of a transaction collision, illegal command field, unclaimed cycle 163 (host initiated), or bus errors (collisions). 164 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 165 RETURN_UNSUPPORTED The SMBus operation is not supported. 166 167 @return The parameter of Value. 168 169 **/ 170 UINT8 171 EFIAPI 172 SmBusSendByte ( 173 IN UINTN SmBusAddress, 174 IN UINT8 Value, 175 OUT RETURN_STATUS *Status OPTIONAL 176 ) 177 { 178 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); 179 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 180 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 181 if (Status != NULL) { 182 *Status = RETURN_UNSUPPORTED; 183 } 184 return 0; 185 } 186 187 /** 188 Executes an SMBUS read data byte command. 189 190 Executes an SMBUS read data byte command on the SMBUS device specified by SmBusAddress. 191 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required. 192 The 8-bit value read from the SMBUS is returned. 193 If Status is not NULL, then the status of the executed command is returned in Status. 194 If Length in SmBusAddress is not zero, then ASSERT(). 195 If any reserved bits of SmBusAddress are set, then ASSERT(). 196 197 @param SmBusAddress Address that encodes the SMBUS Slave Address, 198 SMBUS Command, SMBUS Data Length, and PEC. 199 @param Status Return status for the executed command. 200 This is an optional parameter and may be NULL. 201 RETURN_SUCCESS The SMBUS command was executed. 202 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 203 RETURN_DEVICE_ERROR The request was not completed because a failure 204 reflected in the Host Status Register bit. Device errors are a result 205 of a transaction collision, illegal command field, unclaimed cycle 206 (host initiated), or bus errors (collisions). 207 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 208 RETURN_UNSUPPORTED The SMBus operation is not supported. 209 210 @return The byte read from the SMBUS. 211 212 **/ 213 UINT8 214 EFIAPI 215 SmBusReadDataByte ( 216 IN UINTN SmBusAddress, 217 OUT RETURN_STATUS *Status OPTIONAL 218 ) 219 { 220 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 221 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 222 if (Status != NULL) { 223 *Status = RETURN_UNSUPPORTED; 224 } 225 return 0; 226 } 227 228 /** 229 Executes an SMBUS write data byte command. 230 231 Executes an SMBUS write data byte command on the SMBUS device specified by SmBusAddress. 232 The 8-bit value specified by Value is written. 233 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required. 234 Value is returned. 235 If Status is not NULL, then the status of the executed command is returned in Status. 236 If Length in SmBusAddress is not zero, then ASSERT(). 237 If any reserved bits of SmBusAddress are set, then ASSERT(). 238 239 @param SmBusAddress Address that encodes the SMBUS Slave Address, 240 SMBUS Command, SMBUS Data Length, and PEC. 241 @param Value The 8-bit value to write. 242 @param Status 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 reflected 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 errors (collisions). 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 parameter of Value. 254 255 **/ 256 UINT8 257 EFIAPI 258 SmBusWriteDataByte ( 259 IN UINTN SmBusAddress, 260 IN UINT8 Value, 261 OUT RETURN_STATUS *Status OPTIONAL 262 ) 263 { 264 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 265 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 266 if (Status != NULL) { 267 *Status = RETURN_UNSUPPORTED; 268 } 269 return 0; 270 } 271 272 /** 273 Executes an SMBUS read data word command. 274 275 Executes an SMBUS read data word command on the SMBUS device specified by SmBusAddress. 276 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required. 277 The 16-bit value read from the SMBUS is returned. 278 If Status is not NULL, then the status of the executed command is returned in Status. 279 If Length in SmBusAddress is not zero, then ASSERT(). 280 If any reserved bits of SmBusAddress are set, then ASSERT(). 281 282 @param SmBusAddress Address that encodes the SMBUS Slave Address, 283 SMBUS Command, SMBUS Data Length, and PEC. 284 @param Status Return status for the executed command. 285 This is an optional parameter and may be NULL. 286 RETURN_SUCCESS The SMBUS command was executed. 287 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 288 RETURN_DEVICE_ERROR The request was not completed because a failure 289 reflected in the Host Status Register bit. Device errors are a result 290 of a transaction collision, illegal command field, unclaimed cycle 291 (host initiated), or bus errors (collisions). 292 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 293 RETURN_UNSUPPORTED The SMBus operation is not supported. 294 295 @return The byte read from the SMBUS. 296 297 **/ 298 UINT16 299 EFIAPI 300 SmBusReadDataWord ( 301 IN UINTN SmBusAddress, 302 OUT RETURN_STATUS *Status OPTIONAL 303 ) 304 { 305 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 306 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 307 if (Status != NULL) { 308 *Status = RETURN_UNSUPPORTED; 309 } 310 return 0; 311 } 312 313 /** 314 Executes an SMBUS write data word command. 315 316 Executes an SMBUS write data word command on the SMBUS device specified by SmBusAddress. 317 The 16-bit value specified by Value is written. 318 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required. 319 Value is returned. 320 If Status is not NULL, then the status of the executed command is returned in Status. 321 If Length in SmBusAddress is not zero, then ASSERT(). 322 If any reserved bits of SmBusAddress are set, then ASSERT(). 323 324 @param SmBusAddress Address that encodes the SMBUS Slave Address, 325 SMBUS Command, SMBUS Data Length, and PEC. 326 @param Value The 16-bit value to write. 327 @param Status Return status for the executed command. 328 This is an optional parameter and may be NULL. 329 RETURN_SUCCESS The SMBUS command was executed. 330 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 331 RETURN_DEVICE_ERROR The request was not completed because a failure 332 reflected in the Host Status Register bit. Device errors are a result 333 of a transaction collision, illegal command field, unclaimed cycle 334 (host initiated), or bus errors (collisions). 335 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 336 RETURN_UNSUPPORTED The SMBus operation is not supported. 337 338 @return The parameter of Value. 339 340 **/ 341 UINT16 342 EFIAPI 343 SmBusWriteDataWord ( 344 IN UINTN SmBusAddress, 345 IN UINT16 Value, 346 OUT RETURN_STATUS *Status OPTIONAL 347 ) 348 { 349 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 350 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 351 if (Status != NULL) { 352 *Status = RETURN_UNSUPPORTED; 353 } 354 return 0; 355 } 356 357 /** 358 Executes an SMBUS process call command. 359 360 Executes an SMBUS process call command on the SMBUS device specified by SmBusAddress. 361 The 16-bit value specified by Value is written. 362 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required. 363 The 16-bit value returned by the process call command is returned. 364 If Status is not NULL, then the status of the executed command is returned in Status. 365 If Length in SmBusAddress is not zero, then ASSERT(). 366 If any reserved bits of SmBusAddress are set, then ASSERT(). 367 368 @param SmBusAddress Address that encodes the SMBUS Slave Address, 369 SMBUS Command, SMBUS Data Length, and PEC. 370 @param Value The 16-bit value to write. 371 @param Status Return status for the executed command. 372 This is an optional parameter and may be NULL. 373 RETURN_SUCCESS The SMBUS command was executed. 374 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 375 RETURN_DEVICE_ERROR The request was not completed because a failure 376 reflected in the Host Status Register bit. Device errors are a result 377 of a transaction collision, illegal command field, unclaimed cycle 378 (host initiated), or bus errors (collisions). 379 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 380 RETURN_UNSUPPORTED The SMBus operation is not supported. 381 382 @return The 16-bit value returned by the process call command. 383 384 **/ 385 UINT16 386 EFIAPI 387 SmBusProcessCall ( 388 IN UINTN SmBusAddress, 389 IN UINT16 Value, 390 OUT RETURN_STATUS *Status OPTIONAL 391 ) 392 { 393 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 394 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 395 if (Status != NULL) { 396 *Status = RETURN_UNSUPPORTED; 397 } 398 return 0; 399 } 400 401 /** 402 Executes an SMBUS read block command. 403 404 Executes an SMBUS read block command on the SMBUS device specified by SmBusAddress. 405 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required. 406 Bytes are read from the SMBUS and stored in Buffer. 407 The number of bytes read is returned, and will never return a value larger than 32-bytes. 408 If Status is not NULL, then the status of the executed command is returned in Status. 409 It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read. 410 SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes. 411 If Length in SmBusAddress is not zero, then ASSERT(). 412 If Buffer is NULL, then ASSERT(). 413 If any reserved bits of SmBusAddress are set, then ASSERT(). 414 415 @param SmBusAddress Address that encodes the SMBUS Slave Address, 416 SMBUS Command, SMBUS Data Length, and PEC. 417 @param Buffer Pointer to the buffer to store the bytes read from the SMBUS. 418 @param Status Return status for the executed command. 419 This is an optional parameter and may be NULL. 420 RETURN_SUCCESS The SMBUS command was executed. 421 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 422 RETURN_DEVICE_ERROR The request was not completed because a failure 423 reflected in the Host Status Register bit. Device errors are a result 424 of a transaction collision, illegal command field, unclaimed cycle 425 (host initiated), or bus errors (collisions). 426 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 427 RETURN_UNSUPPORTED The SMBus operation is not supported. 428 429 @return The number of bytes read. 430 431 **/ 432 UINTN 433 EFIAPI 434 SmBusReadBlock ( 435 IN UINTN SmBusAddress, 436 OUT VOID *Buffer, 437 OUT RETURN_STATUS *Status OPTIONAL 438 ) 439 { 440 ASSERT (Buffer != NULL); 441 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); 442 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 443 if (Status != NULL) { 444 *Status = RETURN_UNSUPPORTED; 445 } 446 return 0; 447 } 448 449 /** 450 Executes an SMBUS write block command. 451 452 Executes an SMBUS write block command on the SMBUS device specified by SmBusAddress. 453 The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required. 454 Bytes are written to the SMBUS from Buffer. 455 The number of bytes written is returned, and will never return a value larger than 32-bytes. 456 If Status is not NULL, then the status of the executed command is returned in Status. 457 If Length in SmBusAddress is zero or greater than 32, then ASSERT(). 458 If Buffer is NULL, then ASSERT(). 459 If any reserved bits of SmBusAddress are set, then ASSERT(). 460 461 @param SmBusAddress Address that encodes the SMBUS Slave Address, 462 SMBUS Command, SMBUS Data Length, and PEC. 463 @param Buffer Pointer to the buffer to store the bytes read from the SMBUS. 464 @param Status Return status for the executed command. 465 This is an optional parameter and may be NULL. 466 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 467 RETURN_DEVICE_ERROR The request was not completed because a failure 468 reflected in the Host Status Register bit. Device errors are a result 469 of a transaction collision, illegal command field, unclaimed cycle 470 (host initiated), or bus errors (collisions). 471 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 472 RETURN_UNSUPPORTED The SMBus operation is not supported. 473 474 @return The number of bytes written. 475 476 **/ 477 UINTN 478 EFIAPI 479 SmBusWriteBlock ( 480 IN UINTN SmBusAddress, 481 OUT VOID *Buffer, 482 OUT RETURN_STATUS *Status OPTIONAL 483 ) 484 { 485 ASSERT (Buffer != NULL); 486 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1); 487 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32); 488 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 489 if (Status != NULL) { 490 *Status = RETURN_UNSUPPORTED; 491 } 492 return 0; 493 } 494 495 /** 496 Executes an SMBUS block process call command. 497 498 Executes an SMBUS block process call command on the SMBUS device specified by SmBusAddress. 499 The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required. 500 Bytes are written to the SMBUS from WriteBuffer. Bytes are then read from the SMBUS into ReadBuffer. 501 If Status is not NULL, then the status of the executed command is returned in Status. 502 It is the caller's responsibility to make sure ReadBuffer is large enough for the total number of bytes read. 503 SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes. 504 If Length in SmBusAddress is zero or greater than 32, then ASSERT(). 505 If WriteBuffer is NULL, then ASSERT(). 506 If ReadBuffer is NULL, then ASSERT(). 507 If any reserved bits of SmBusAddress are set, then ASSERT(). 508 509 @param SmBusAddress Address that encodes the SMBUS Slave Address, 510 SMBUS Command, SMBUS Data Length, and PEC. 511 @param WriteBuffer Pointer to the buffer of bytes to write to the SMBUS. 512 @param ReadBuffer Pointer to the buffer of bytes to read from the SMBUS. 513 @param Status Return status for the executed command. 514 This is an optional parameter and may be NULL. 515 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. 516 RETURN_DEVICE_ERROR The request was not completed because a failure 517 reflected in the Host Status Register bit. Device errors are a result 518 of a transaction collision, illegal command field, unclaimed cycle 519 (host initiated), or bus errors (collisions). 520 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect) 521 RETURN_UNSUPPORTED The SMBus operation is not supported. 522 523 @return The number of bytes written. 524 525 **/ 526 UINTN 527 EFIAPI 528 SmBusBlockProcessCall ( 529 IN UINTN SmBusAddress, 530 IN VOID *WriteBuffer, 531 OUT VOID *ReadBuffer, 532 OUT RETURN_STATUS *Status OPTIONAL 533 ) 534 { 535 ASSERT (WriteBuffer != NULL); 536 ASSERT (ReadBuffer != NULL); 537 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1); 538 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32); 539 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0); 540 if (Status != NULL) { 541 *Status = RETURN_UNSUPPORTED; 542 } 543 return 0; 544 } 545