Revision: 14548
          http://sourceforge.net/p/edk2/code/14548
Author:   li-elvin
Date:     2013-08-14 01:14:53 +0000 (Wed, 14 Aug 2013)
Log Message:
-----------
Add I2C related definition in PI 1.3 spec.

Signed-off-by: Elvin Li <elvin...@intel.com>
Reviewed-by: Leahy Leroy P <leroy.p.le...@intel.com>

Modified Paths:
--------------
    trunk/edk2/MdePkg/MdePkg.dec

Added Paths:
-----------
    trunk/edk2/MdePkg/Include/Pi/PiI2c.h
    trunk/edk2/MdePkg/Include/Ppi/I2cMaster.h
    trunk/edk2/MdePkg/Include/Protocol/I2cBusConfigurationManagement.h
    trunk/edk2/MdePkg/Include/Protocol/I2cEnumerate.h
    trunk/edk2/MdePkg/Include/Protocol/I2cHost.h
    trunk/edk2/MdePkg/Include/Protocol/I2cIo.h
    trunk/edk2/MdePkg/Include/Protocol/I2cMaster.h

Added: trunk/edk2/MdePkg/Include/Pi/PiI2c.h
===================================================================
--- trunk/edk2/MdePkg/Include/Pi/PiI2c.h                                (rev 0)
+++ trunk/edk2/MdePkg/Include/Pi/PiI2c.h        2013-08-14 01:14:53 UTC (rev 
14548)
@@ -0,0 +1,307 @@
+/** @file
+  Include file matches things in PI.
+
+Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available 
under 
+the terms and conditions of the BSD License that accompanies this 
distribution.  
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.                                
            
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,          
           
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.  
           
+
+  @par Revision Reference:
+  PI Version 1.3
+
+**/
+
+#ifndef __PI_I2C_H__
+#define __PI_I2C_H__
+
+///
+/// A 10-bit slave address is or'ed with the following value enabling the
+/// I2C protocol stack to address the duplicated address space between 0
+//  and 127 in 10-bit mode.
+///
+#define I2C_ADDRESSING_10_BIT     0x80000000
+
+///
+/// I2C controller capabilities
+///
+/// The EFI_I2C_CONTROLLER_CAPABILITIES specifies the capabilities of the
+/// I2C host controller.  The StructureSizeInBytes enables variations of
+/// this structure to be identified if there is need to extend this
+/// structure in the future.
+///
+typedef struct {
+  ///
+  /// Length of this data structure in bytes
+  ///
+  UINT32 StructureSizeInBytes;
+
+  ///
+  /// The maximum number of bytes the I2C host controller is able to
+  /// receive from the I2C bus.
+  ///
+  UINT32 MaximumReceiveBytes;
+
+  ///
+  /// The maximum number of bytes the I2C host controller is able to send
+  /// on the I2C  bus.
+  ///
+  UINT32 MaximumTransmitBytes;
+
+  ///
+  /// The maximum number of bytes in the I2C bus transaction.
+  ///
+  UINT32 MaximumTotalBytes;
+} EFI_I2C_CONTROLLER_CAPABILITIES;
+
+///
+/// I2C device description
+///
+/// The EFI_I2C_ENUMERATE_PROTOCOL uses the EFI_I2C_DEVICE to describe
+/// the platform specific details associated with an I2C device.  This
+/// description is passed to the I2C bus driver during enumeration where
+/// it is made available to the third party I2C device driver via the
+/// EFI_I2C_IO_PROTOCOL.
+///
+typedef struct {
+  ///
+  /// Unique value assigned by the silicon manufacture or the third
+  /// party I2C driver writer for the I2C part.  This value logically
+  /// combines both the manufacture name and the I2C part number into
+  /// a single value specified as a GUID.
+  ///
+  CONST EFI_GUID *DeviceGuid;
+
+  ///
+  /// Unique ID of the I2C part within the system
+  ///
+  UINT32 DeviceIndex;
+
+  ///
+  /// Hardware revision - ACPI _HRV value.  See the Advanced
+  /// Configuration and Power Interface Specification, Revision 5.0
+  /// for the field format and the Plug and play support for I2C
+  /// web-page for restriction on values.
+  ///
+  /// http://www.acpi.info/spec.htm
+  /// 
http://msdn.microsoft.com/en-us/library/windows/hardware/jj131711(v=vs.85).aspx
+  ///
+  UINT32 HardwareRevision;
+
+  ///
+  /// I2C bus configuration for the I2C device
+  ///
+  UINT32 I2cBusConfiguration;
+
+  ///
+  /// Number of slave addresses for the I2C device.
+  ///
+  UINT32 SlaveAddressCount;
+
+  ///
+  /// Pointer to the array of slave addresses for the I2C device.
+  ///
+  CONST UINT32 *SlaveAddressArray;
+} EFI_I2C_DEVICE;
+
+///
+/// Define the I2C flags
+///
+/// I2C read operation when set
+#define I2C_FLAG_READ               0x00000001
+
+///
+/// Define the flags for SMBus operation
+///
+/// The following flags are also present in only the first I2C operation
+/// and are ignored when present in other operations.  These flags
+/// describe a particular SMB transaction as shown in the following table.
+///
+
+/// SMBus operation
+#define I2C_FLAG_SMBUS_OPERATION    0x00010000
+
+/// SMBus block operation
+///   The flag I2C_FLAG_SMBUS_BLOCK causes the I2C master protocol to update
+///   the LengthInBytes field of the operation in the request packet with
+///   the actual number of bytes read or written.  These values are only
+///   valid when the entire I2C transaction is successful.
+///   This flag also changes the LengthInBytes meaning to be: A maximum
+///   of LengthInBytes is to be read from the device.  The first byte
+///   read contains the number of bytes remaining to be read, plus an
+///   optional PEC value.
+#define I2C_FLAG_SMBUS_BLOCK        0x00020000
+
+/// SMBus process call operation
+#define I2C_FLAG_SMBUS_PROCESS_CALL 0x00040000
+
+/// SMBus use packet error code (PEC)
+///   Note that the I2C master protocol may clear the I2C_FLAG_SMBUS_PEC bit
+///   to indicate that the PEC value was checked by the hardware and is
+///   not appended to the returned read data.
+///
+#define I2C_FLAG_SMBUS_PEC          0x00080000
+
+//----------------------------------------------------------------------
+///
+/// QuickRead:          OperationCount=1,
+///                     LengthInBytes=0,   Flags=I2C_FLAG_READ
+/// QuickWrite:         OperationCount=1,
+///                     LengthInBytes=0,   Flags=0
+///
+///
+/// ReceiveByte:        OperationCount=1,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_READ
+/// ReceiveByte+PEC:    OperationCount=1,
+///                     LengthInBytes=2,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_READ
+///                                            | I2C_FLAG_SMBUS_PEC
+///
+///
+/// SendByte:           OperationCount=1,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+/// SendByte+PEC:       OperationCount=1,
+///                     LengthInBytes=2,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PEC
+///
+///
+/// ReadDataByte:       OperationCount=2,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                     LengthInBytes=1,   Flags=I2C_FLAG_READ
+/// ReadDataByte+PEC:   OperationCount=2,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PEC
+///                     LengthInBytes=2,   Flags=I2C_FLAG_READ
+///
+///
+/// WriteDataByte:      OperationCount=1,
+///                     LengthInBytes=2,   Flags=I2C_FLAG_SMBUS_OPERATION
+/// WriteDataByte+PEC:  OperationCount=1,
+///                     LengthInBytes=3,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PEC
+///
+///
+/// ReadDataWord:       OperationCount=2,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                     LengthInBytes=2,   Flags=I2C_FLAG_READ
+/// ReadDataWord+PEC:   OperationCount=2,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PEC
+///                     LengthInBytes=3,   Flags=I2C_FLAG_READ
+///
+///
+/// WriteDataWord:      OperationCount=1,
+///                     LengthInBytes=3,   Flags=I2C_FLAG_SMBUS_OPERATION
+/// WriteDataWord+PEC:  OperationCount=1,
+///                     LengthInBytes=4,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PEC
+///
+///
+/// ReadBlock:          OperationCount=2,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_BLOCK
+///                     LengthInBytes=33,  Flags=I2C_FLAG_READ
+/// ReadBlock+PEC:      OperationCount=2,
+///                     LengthInBytes=1,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_BLOCK
+///                                            | I2C_FLAG_SMBUS_PEC
+///                     LengthInBytes=34,  Flags=I2C_FLAG_READ
+///
+///
+/// WriteBlock:         OperationCount=1,
+///                     LengthInBytes=N+2, Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_BLOCK
+/// WriteBlock+PEC:     OperationCount=1,
+///                     LengthInBytes=N+3, Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_BLOCK
+///                                            | I2C_FLAG_SMBUS_PEC
+///
+///
+/// ProcessCall:        OperationCount=2,
+///                     LengthInBytes=3,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PROCESS_CALL
+///                     LengthInBytes=2,   Flags=I2C_FLAG_READ
+/// ProcessCall+PEC:    OperationCount=2,
+///                     LengthInBytes=3,   Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PROCESS_CALL
+///                                            | I2C_FLAG_SMBUS_PEC
+///                     LengthInBytes=3,   Flags=I2C_FLAG_READ
+///
+///
+/// BlkProcessCall:     OperationCount=2,
+///                     LengthInBytes=N+2, Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PROCESS_CALL
+///                                            | I2C_FLAG_SMBUS_BLOCK
+///                     LengthInBytes=33,  Flags=I2C_FLAG_READ
+/// BlkProcessCall+PEC: OperationCount=2,
+///                     LengthInBytes=N+2, Flags=I2C_FLAG_SMBUS_OPERATION
+///                                            | I2C_FLAG_SMBUS_PROCESS_CALL
+///                                            | I2C_FLAG_SMBUS_BLOCK
+///                                            | I2C_FLAG_SMBUS_PEC
+///                     LengthInBytes=34,  Flags=I2C_FLAG_READ
+///
+//----------------------------------------------------------------------
+
+///
+/// I2C device operation
+///
+/// The EFI_I2C_OPERATION describes a subset of an I2C transaction in which
+/// the I2C controller is either sending or receiving bytes from the bus.
+/// Some transactions will consist of a single operation while others will
+/// be two or more.
+///
+/// Note: Some I2C controllers do not support read or write ping (address
+/// only) operation and will return EFI_UNSUPPORTED status when these
+/// operations are requested.
+///
+/// Note: I2C controllers which do not support complex transactions requiring
+/// multiple repeated start bits return EFI_UNSUPPORTED without processing
+/// any of the transaction.
+///
+typedef struct {
+  ///
+  /// Flags to qualify the I2C operation.
+  ///
+  UINT32 Flags;
+
+  ///
+  /// Number of bytes to send to or receive from the I2C device.  A ping
+  /// (address only byte/bytes)  is indicated by setting the LengthInBytes
+  /// to zero.
+  ///
+  UINT32 LengthInBytes;
+
+  ///
+  /// Pointer to a buffer containing the data to send or to receive from
+  /// the I2C device.  The Buffer must be at least LengthInBytes in size.
+  ///
+  UINT8 *Buffer;
+} EFI_I2C_OPERATION;
+
+///
+/// I2C device request
+///
+/// The EFI_I2C_REQUEST_PACKET describes a single I2C transaction.  The
+/// transaction starts with a start bit followed by the first operation
+/// in the operation array.  Subsequent operations are separated with
+/// repeated start bits and the last operation is followed by a stop bit
+/// which concludes the transaction.  Each operation is described by one
+/// of the elements in the Operation array.
+///
+typedef struct {
+  ///
+  /// Number of elements in the operation array
+  ///
+  UINTN OperationCount;
+
+  ///
+  /// Description of the I2C operation
+  ///
+  EFI_I2C_OPERATION Operation [1];
+} EFI_I2C_REQUEST_PACKET;
+
+#endif  //  __PI_I2C_H__

Added: trunk/edk2/MdePkg/Include/Ppi/I2cMaster.h
===================================================================
--- trunk/edk2/MdePkg/Include/Ppi/I2cMaster.h                           (rev 0)
+++ trunk/edk2/MdePkg/Include/Ppi/I2cMaster.h   2013-08-14 01:14:53 UTC (rev 
14548)
@@ -0,0 +1,108 @@
+/** @file
+  This PPI manipulates the I2C host controller to perform transactions as a 
master 
+  on the I2C bus using the current state of any switches or multiplexers in 
the I2C bus.
+
+  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD 
License         
+  which accompanies this distribution.  The full text of the license may be 
found at        
+  http://opensource.org/licenses/bsd-license.php                               
             
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+
+  @par Revision Reference:
+  This PPI is introduced in PI Version 1.3.
+
+**/
+
+#ifndef __I2C_MASTER_PPI_H__
+#define __I2C_MASTER_PPI_H__
+
+#include <Pi/PiI2c.h>
+
+#define EFI_PEI_I2C_MASTER_PPI_GUID \
+  { 0xb3bfab9b, 0x9f9c, 0x4e8b, { 0xad, 0x37, 0x7f, 0x8c, 0x51, 0xfc, 0x62, 
0x80 }}
+
+typedef struct _EFI_PEI_I2C_MASTER_PPI EFI_PEI_I2C_MASTER_PPI;
+
+/**
+  Set the frequency for the I2C clock line.
+  
+  @param This                   Pointer to an EFI_PEI_I2C_MASTER_PPI structure.
+  @param BusClockHertz          Pointer to the requested I2C bus clock 
frequency in Hertz.
+                                Upon return this value contains the actual 
frequency 
+                                in use by the I2C controller.
+
+  @retval EFI_SUCCESS           The bus frequency was set successfully.
+  @retval EFI_INVALID_PARAMETER BusClockHertz is NULL
+  @retval EFI_UNSUPPORTED       The controller does not support this frequency.
+   
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_PEI_I2C_MASTER_PPI_SET_BUS_FREQUENCY) (
+  IN EFI_PEI_I2C_MASTER_PPI   *This,
+  IN UINTN                    *BusClockHertz
+  );
+
+/**
+  Reset the I2C controller and configure it for use.
+  
+  @param  This                  Pointer to an EFI_PEI_I2C_MASTER_PPI structure.
+
+  @retval EFI_SUCCESS           The reset completed successfully.
+  @retval EFI_DEVICE_ERROR      The reset operation failed.
+   
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_PEI_I2C_MASTER_PPI_RESET) (
+  IN CONST EFI_PEI_I2C_MASTER_PPI  *This
+  );
+
+/**
+  Start an I2C transaction on the host controller.
+  
+  @param  This                   Pointer to an EFI_PEI_I2C_MASTER_PPI 
structure.
+  @param  SlaveAddress           Address of the device on the I2C bus.
+                                 Set the I2C_ADDRESSING_10_BIT when using 
10-bit addresses, 
+                                 clear this bit for 7-bit addressing.
+                                 Bits 0-6 are used for 7-bit I2C slave 
addresses and 
+                                 bits 0-9 are used for 10-bit I2C slave 
addresses.
+  @param  RequestPacket          Pointer to an EFI_I2C_REQUEST_PACKET 
structure describing the I2C transaction.
+
+  @retval EFI_SUCCESS             The transaction completed successfully.
+  @retval EFI_BAD_BUFFER_SIZE     The RequestPacket->LengthInBytes value is 
too large.
+  @retval EFI_DEVICE_ERROR          There was an I2C error (NACK) during the 
transaction.
+  @retval EFI_INVALID_PARAMETER         RequestPacket is NULL
+  @retval EFI_NO_RESPONSE             The I2C device is not responding to the 
slave address.
+                                 EFI_DEVICE_ERROR will be returned if the 
controller cannot distinguish when the NACK occurred.
+  @retval EFI_NOT_FOUND                 Reserved bit set in the SlaveAddress 
parameter
+  @retval EFI_OUT_OF_RESOURCES  Insufficient memory for I2C transaction
+  @retval EFI_UNSUPPORTED             The controller does not support the 
requested transaction.
+   
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_PEI_I2C_MASTER_PPI_START_REQUEST) (
+  IN CONST EFI_PEI_I2C_MASTER_PPI     *This,
+  IN UINTN                            SlaveAddress,
+  IN EFI_I2C_REQUEST_PACKET           *RequestPacket
+  );
+
+///
+/// This PPI manipulates the I2C host controller to perform transactions as a 
master on the I2C bus
+/// using the current state of any switches or multiplexers in the I2C bus.
+///
+struct _EFI_PEI_I2C_MASTER_PPI {
+  EFI_PEI_I2C_MASTER_PPI_SET_BUS_FREQUENCY   SetBusFrequency;
+  EFI_PEI_I2C_MASTER_PPI_RESET               Reset;
+  EFI_PEI_I2C_MASTER_PPI_START_REQUEST       StartRequest;
+  CONST EFI_I2C_CONTROLLER_CAPABILITIES      *I2cControllerCapabilities;
+  EFI_GUID                                   Identifier;
+};
+
+extern EFI_GUID gEfiPeiI2cMasterPpiGuid;
+
+#endif

Added: trunk/edk2/MdePkg/Include/Protocol/I2cBusConfigurationManagement.h
===================================================================
--- trunk/edk2/MdePkg/Include/Protocol/I2cBusConfigurationManagement.h          
                (rev 0)
+++ trunk/edk2/MdePkg/Include/Protocol/I2cBusConfigurationManagement.h  
2013-08-14 01:14:53 UTC (rev 14548)
@@ -0,0 +1,171 @@
+/** @file
+  I2C Bus Configuration Management Protocol as defined in the PI 1.3 
specification.
+
+  The EFI I2C bus configuration management protocol provides platform specific 
+  services that allow the I2C host protocol to reconfigure the switches and 
multiplexers 
+  and set the clock frequency for the I2C bus. This protocol also enables the 
I2C host protocol 
+  to reset an I2C device which may be locking up the I2C bus by holding the 
clock or data line low.
+
+  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD 
License         
+  which accompanies this distribution.  The full text of the license may be 
found at        
+  http://opensource.org/licenses/bsd-license.php                               
             
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.3.
+
+**/
+
+#ifndef __I2C_BUS_CONFIGURATION_MANAGEMENT_H__
+#define __I2C_BUS_CONFIGURATION_MANAGEMENT_H__
+
+#define EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL_GUID \
+  { 0x55b71fb5, 0x17c6, 0x410e, { 0xb5, 0xbd, 0x5f, 0xa2, 0xe3, 0xd4, 0x46, 
0x6b }}
+
+///
+/// I2C bus configuration management protocol
+///
+/// The EFI I2C bus configuration management protocol provides platform
+/// specific services that allow the I2C host protocol to reconfigure the
+/// switches and multiplexers and set the clock frequency for the I2C bus.
+/// This protocol also enables the I2C host protocol to reset an I2C device
+/// which may be locking up the I2C bus by holding the clock or data line
+/// low.
+///
+/// The I2C protocol stack uses the concept of an I2C bus configuration as
+/// a way to describe a particular state of the switches and multiplexers
+/// in the I2C bus.
+///
+/// A simple I2C bus does not have any multiplexers or switches is described
+/// to the I2C protocol stack with a single I2C bus configuration which
+/// specifies the I2C bus frequency.
+///
+/// An I2C bus with switches and multiplexers use an I2C bus configuration
+/// to describe each of the unique settings for the switches and multiplexers
+/// and the I2C bus frequency.  However the I2C bus configuration management
+/// protocol only needs to define the I2C bus configurations that the software
+/// uses, which may be a subset of the total.
+///
+/// The I2C bus configuration description includes a list of I2C devices
+/// which may be accessed when this I2C bus configuration is enabled.  I2C
+/// devices before a switch or multiplexer must be included in one I2C bus
+/// configuration while I2C devices after a switch or multiplexer are on
+/// another I2C bus configuration.
+///
+/// The I2C bus configuration management protocol is an optional protocol.
+/// When the I2C bus configuration protocol is not defined the I2C host
+/// protocol does not start and the I2C master protocol may be used for
+/// other purposes such as SMBus traffic.  When the I2C bus configuration
+/// protocol is available, the I2C host protocol uses the I2C bus
+/// configuration protocol to call into the platform specific code to set
+/// the switches and multiplexers and set the maximum I2C bus frequency.
+///
+/// The platform designers determine the maximum I2C bus frequency by
+/// selecting a frequency which supports all of the I2C devices on the
+/// I2C bus for the setting of switches and multiplexers.  The platform
+/// designers must validate this against the I2C device data sheets and
+/// any limits of the I2C controller or bus length.
+///
+/// During I2C device enumeration, the I2C bus driver retrieves the I2C
+/// bus configuration that must be used to perform I2C transactions to
+/// each I2C device.  This I2C bus configuration value is passed into
+/// the I2C host protocol to identify the I2C bus configuration required
+/// to access a specific I2C device.  The I2C host protocol calls
+/// EnableBusConfiguration() to set the switches and multiplexers in the
+/// I2C bus and the I2C clock frequency.  The I2C host protocol may
+/// optimize calls to EnableBusConfiguration() by only making the call
+/// when the I2C bus configuration value changes between I2C requests.
+///
+/// When I2C transactions are required on the same I2C bus to change the
+/// state of multiplexers or switches, the I2C master protocol must be
+/// used to perform the necessary I2C transactions.
+///
+/// It is up to the platform specific code to choose the proper I2C bus
+/// configuration when ExitBootServices() is called. Some operating systems
+/// are not able to manage the I2C bus configurations and must use the I2C
+/// bus configuration that is established by the platform firmware before
+/// ExitBootServices() returns.
+///
+typedef struct _EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL 
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL;
+
+
+/**
+  Enable access to an I2C bus configuration.
+
+  This routine must be called at or below TPL_NOTIFY.  For synchronous
+  requests this routine must be called at or below TPL_CALLBACK.
+
+  Reconfigure the switches and multiplexers in the I2C bus to enable
+  access to a specific I2C bus configuration.  Also select the maximum
+  clock frequency for this I2C bus configuration.
+
+  This routine uses the I2C Master protocol to perform I2C transactions
+  on the local bus.  This eliminates any recursion in the I2C stack for
+  configuration transactions on the same I2C bus.  This works because the
+  local I2C bus is idle while the I2C bus configuration is being enabled.
+
+  If I2C transactions must be performed on other I2C busses, then the
+  EFI_I2C_HOST_PROTOCOL, the EFI_I2C_IO_PROTCOL, or a third party I2C
+  driver interface for a specific device must be used.  This requirement
+  is because the I2C host protocol controls the flow of requests to the
+  I2C controller.  Use the EFI_I2C_HOST_PROTOCOL when the I2C device is
+  not enumerated by the EFI_I2C_ENUMERATE_PROTOCOL.  Use a protocol
+  produced by a third party driver when it is available or the
+  EFI_I2C_IO_PROTOCOL when the third party driver is not available but
+  the device is enumerated with the EFI_I2C_ENUMERATE_PROTOCOL.
+
+  When Event is NULL, EnableI2cBusConfiguration operates synchronously
+  and returns the I2C completion status as its return value.
+
+  @param[in]  This            Pointer to an 
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL
+                              structure.
+  @param[in]  I2cBusConfiguration Index of an I2C bus configuration.  All
+                                  values in the range of zero to N-1 are
+                                  valid where N is the total number of I2C
+                                  bus configurations for an I2C bus.
+  @param[in]  Event           Event to signal when the transaction is complete
+  @param[out] I2cStatus       Buffer to receive the transaction status.
+
+  @return  When Event is NULL, EnableI2cBusConfiguration operates synchrouously
+  and returns the I2C completion status as its return value.  In this case it 
is
+  recommended to use NULL for I2cStatus.  The values returned from
+  EnableI2cBusConfiguration are:
+
+  @retval EFI_SUCCESS           The asynchronous bus configuration request
+                                was successfully started when Event is not
+                                NULL.
+  @retval EFI_SUCCESS           The bus configuration request completed
+                                successfully when Event is NULL.
+  @retval EFI_DEVICE_ERROR      The bus configuration failed.
+  @retval EFI_NO_MAPPING        Invalid I2cBusConfiguration value
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI 
*EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL_ENABLE_I2C_BUS_CONFIGURATION) (
+  IN CONST EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *This,
+  IN UINTN                                               I2cBusConfiguration,
+  IN EFI_EVENT                                           Event      OPTIONAL,
+  IN EFI_STATUS                                          *I2cStatus OPTIONAL
+  );
+
+///
+/// I2C bus configuration management protocol
+///
+struct _EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL {
+  ///
+  /// Enable an I2C bus configuration for use.
+  ///
+  EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL_ENABLE_I2C_BUS_CONFIGURATION 
EnableI2cBusConfiguration;
+};
+
+///
+/// Reference to variable defined in the .DEC file
+///
+extern EFI_GUID gEfiI2cBusConfigurationManagementProtocolGuid;
+
+#endif  //  __I2C_BUS_CONFIGURATION_MANAGEMENT_H__

Added: trunk/edk2/MdePkg/Include/Protocol/I2cEnumerate.h
===================================================================
--- trunk/edk2/MdePkg/Include/Protocol/I2cEnumerate.h                           
(rev 0)
+++ trunk/edk2/MdePkg/Include/Protocol/I2cEnumerate.h   2013-08-14 01:14:53 UTC 
(rev 14548)
@@ -0,0 +1,110 @@
+/** @file
+  I2C Device Enumerate Protocol as defined in the PI 1.3 specification.
+
+  This protocol supports the enumerations of device on the I2C bus.
+
+  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD 
License         
+  which accompanies this distribution.  The full text of the license may be 
found at        
+  http://opensource.org/licenses/bsd-license.php                               
             
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.3.
+
+**/
+
+#ifndef __I2C_ENUMERATE_H__
+#define __I2C_ENUMERATE_H__
+
+#include <Pi/PiI2c.h>
+
+#define EFI_I2C_ENUMERATE_PROTOCOL_GUID   { 0xda8cd7c4, 0x1c00, 0x49e2, { 
0x80, 0x3e, 0x52, 0x14, 0xe7, 0x01, 0x89, 0x4c }}
+
+typedef struct _EFI_I2C_ENUMERATE_PROTOCOL  EFI_I2C_ENUMERATE_PROTOCOL;
+
+/**
+  Enumerate the I2C devices
+
+  This function enables the caller to traverse the set of I2C devices
+  on an I2C bus.
+
+  @param[in]  This              The platform data for the next device on
+                                the I2C bus was returned successfully.
+  @param[in, out] Device        Pointer to a buffer containing an
+                                EFI_I2C_DEVICE structure.  Enumeration is
+                                started by setting the initial EFI_I2C_DEVICE
+                                structure pointer to NULL.  The buffer
+                                receives an EFI_I2C_DEVICE structure pointer
+                                to the next I2C device.
+
+  @retval EFI_SUCCESS           The platform data for the next device on
+                                the I2C bus was returned successfully.
+  @retval EFI_INVALID_PARAMETER Device is NULL
+  @retval EFI_NO_MAPPING        *Device does not point to a valid
+                                EFI_I2C_DEVICE structure returned in a
+                                previous call Enumerate().
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_I2C_ENUMERATE_PROTOCOL_ENUMERATE) (
+  IN CONST EFI_I2C_ENUMERATE_PROTOCOL *This,
+  IN OUT CONST EFI_I2C_DEVICE         **Device
+  );
+
+/**
+  Get the requested I2C bus frequency for a specified bus configuration.
+
+  This function returns the requested I2C bus clock frequency for the
+  I2cBusConfiguration.  This routine is provided for diagnostic purposes
+  and is meant to be called after calling Enumerate to get the
+  I2cBusConfiguration value.
+
+  @param[in] This                 Pointer to an EFI_I2C_ENUMERATE_PROTOCOL
+                                  structure.
+  @param[in] I2cBusConfiguration  I2C bus configuration to access the I2C
+                                  device
+  @param[out] *BusClockHertz      Pointer to a buffer to receive the I2C
+                                  bus clock frequency in Hertz
+
+  @retval EFI_SUCCESS           The I2C bus frequency was returned
+                                successfully.
+  @retval EFI_INVALID_PARAMETER BusClockHertz was NULL
+  @retval EFI_NO_MAPPING        Invalid I2cBusConfiguration value
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_I2C_ENUMERATE_PROTOCOL_GET_BUS_FREQUENCY) (
+  IN CONST EFI_I2C_ENUMERATE_PROTOCOL *This,
+  IN UINTN                            I2cBusConfiguration,
+  OUT UINTN                           *BusClockHertz
+  );
+
+///
+/// I2C Enumerate protocol
+///
+struct _EFI_I2C_ENUMERATE_PROTOCOL {
+  ///
+  /// Traverse the set of I2C devices on an I2C bus.  This routine
+  /// returns the next I2C device on an I2C bus.
+  ///
+  EFI_I2C_ENUMERATE_PROTOCOL_ENUMERATE         Enumerate;
+
+  ///
+  /// Get the requested I2C bus frequency for a specified bus
+  /// configuration.
+  ///
+  EFI_I2C_ENUMERATE_PROTOCOL_GET_BUS_FREQUENCY GetBusFrequency;
+};
+
+///
+/// Reference to variable defined in the .DEC file
+///
+extern EFI_GUID gEfiI2cEnumerateProtocolGuid;
+
+#endif  //  __I2C_ENUMERATE_H__

Added: trunk/edk2/MdePkg/Include/Protocol/I2cHost.h
===================================================================
--- trunk/edk2/MdePkg/Include/Protocol/I2cHost.h                                
(rev 0)
+++ trunk/edk2/MdePkg/Include/Protocol/I2cHost.h        2013-08-14 01:14:53 UTC 
(rev 14548)
@@ -0,0 +1,160 @@
+/** @file
+  I2C Host Protocol as defined in the PI 1.3 specification.
+
+  This protocol provides callers with the ability to do I/O transactions 
+  to all of the devices on the I2C bus.
+
+  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD 
License         
+  which accompanies this distribution.  The full text of the license may be 
found at        
+  http://opensource.org/licenses/bsd-license.php                               
             
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.3.
+
+**/
+
+#ifndef __I2C_HOST_H__
+#define __I2C_HOST_H__
+
+#include <Pi/PiI2c.h>
+
+#define EFI_I2C_HOST_PROTOCOL_GUID  { 0xa5aab9e3, 0xc727, 0x48cd, { 0x8b, 
0xbf, 0x42, 0x72, 0x33, 0x85, 0x49, 0x48 }}
+
+///
+/// I2C Host Protocol
+///
+/// The I2C bus driver uses the services of the EFI_I2C_HOST_PROTOCOL
+/// to produce an instance of the EFI_I2C_IO_PROTOCOL for each I2C
+/// device on an I2C bus.
+///
+/// The EFI_I2C_HOST_PROTOCOL exposes an asynchronous interface to
+/// callers to perform transactions to any device on the I2C bus.
+/// Internally, the I2C host protocol manages the flow of the I2C
+/// transactions to the host controller, keeping them in FIFO order.
+/// Prior to each transaction, the I2C host protocol ensures that the
+/// switches and multiplexers are properly configured.  The I2C host
+/// protocol then starts the transaction on the host controller using
+/// the EFI_I2C_MASTER_PROTOCOL.
+///
+typedef struct _EFI_I2C_HOST_PROTOCOL EFI_I2C_HOST_PROTOCOL;
+
+
+/**
+  Queue an I2C transaction for execution on the I2C controller.
+
+  This routine must be called at or below TPL_NOTIFY.  For
+  synchronous requests this routine must be called at or below
+  TPL_CALLBACK.
+  
+  The I2C host protocol uses the concept of I2C bus configurations
+  to describe the I2C bus.  An I2C bus configuration is defined as
+  a unique setting of the multiplexers and switches in the I2C bus
+  which enable access to one or more I2C devices.  When using a
+  switch to divide a bus, due to bus frequency differences, the
+  I2C bus configuration management protocol defines an I2C bus
+  configuration for the I2C devices on each side of the switch.
+  When using a multiplexer, the I2C bus configuration management
+  defines an I2C bus configuration for each of the selector values
+  required to control the multiplexer.  See Figure 1 in the I2C -bus
+  specification and user manual for a complex I2C bus configuration.
+
+  The I2C host protocol processes all transactions in FIFO order.
+  Prior to performing the transaction, the I2C host protocol calls
+  EnableI2cBusConfiguration to reconfigure the switches and
+  multiplexers in the I2C bus enabling access to the specified I2C
+  device.  The EnableI2cBusConfiguration also selects the I2C bus
+  frequency for the I2C device.  After the I2C bus is configured,
+  the I2C host protocol calls the I2C master protocol to start the
+  I2C transaction.
+
+  If the I2C host protocol has pending I2C transactions queued when
+  the driver binding Stop() routine is called then the I2C host
+  protocol completes all of the pending I2C transactions by returning
+  EFI_ABORTED status.  This notifies the upper layers allowing them
+  to take corrective action or prepare to stop.
+
+  When Event is NULL, QueueRequest() operates synchronously and
+  returns the I2C completion status as its return value.
+
+  When Event is not NULL, QueueRequest() synchronously returns
+  EFI_SUCCESS indicating that the asynchronously I2C transaction was
+  queued.  The values above are returned in the buffer pointed to by
+  I2cStatus upon the completion of the I2C transaction when I2cStatus
+  is not NULL.
+
+  @param[in] This             Pointer to an EFI_I2C_HOST_PROTOCOL structure.
+  @param[in] I2cBusConfiguration  I2C bus configuration to access the I2C
+                                  device
+  @param[in] SlaveAddress     Address of the device on the I2C bus.  Set
+                              the I2C_ADDRESSING_10_BIT when using 10-bit
+                              addresses, clear this bit for 7-bit addressing.
+                              Bits 0-6 are used for 7-bit I2C slave addresses
+                              and bits 0-9 are used for 10-bit I2C slave
+                              addresses.
+  @param[in] Event            Event to signal for asynchronous transactions,
+                              NULL for synchronous transactions
+  @param[in] RequestPacket    Pointer to an EFI_I2C_REQUEST_PACKET structure
+                              describing the I2C transaction
+  @param[out] I2cStatus       Optional buffer to receive the I2C transaction
+                              completion status
+
+  @retval EFI_SUCCESS           The asynchronous transaction was successfully
+                                queued when Event is not NULL.
+  @retval EFI_SUCCESS           The transaction completed successfully when
+                                Event is NULL.
+  @retval EFI_ABORTED           The request did not complete because the
+                                driver binding Stop() routine was called.
+  @retval EFI_BAD_BUFFER_SIZE   The RequestPacket->LengthInBytes value is
+                                too large.
+  @retval EFI_DEVICE_ERROR      There was an I2C error (NACK) during the
+                                transaction.
+  @retval EFI_INVALID_PARAMETER RequestPacket is NULL
+  @retval EFI_NOT_FOUND         Reserved bit set in the SlaveAddress parameter
+  @retval EFI_NO_MAPPING        Invalid I2cBusConfiguration value
+  @retval EFI_NO_RESPONSE       The I2C device is not responding to the slave
+                                address.  EFI_DEVICE_ERROR will be returned
+                                if the controller cannot distinguish when the
+                                NACK occurred.
+  @retval EFI_OUT_OF_RESOURCES  Insufficient memory for I2C transaction
+  @retval EFI_UNSUPPORTED       The controller does not support the requested
+                                transaction.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_I2C_HOST_PROTOCOL_QUEUE_REQUEST) (
+  IN CONST EFI_I2C_HOST_PROTOCOL *This,
+  IN UINTN                       I2cBusConfiguration,
+  IN UINTN                       SlaveAddress,
+  IN EFI_EVENT                   Event      OPTIONAL,
+  IN EFI_I2C_REQUEST_PACKET      *RequestPacket,
+  OUT EFI_STATUS                 *I2cStatus OPTIONAL
+  );
+
+///
+/// I2C Host Protocol
+///
+struct _EFI_I2C_HOST_PROTOCOL {
+  ///
+  /// Queue an I2C transaction for execution on the I2C bus
+  ///
+  EFI_I2C_HOST_PROTOCOL_QUEUE_REQUEST     QueueRequest;
+
+  ///
+  /// Pointer to an EFI_I2C_CONTROLLER_CAPABILITIES data structure
+  /// containing the capabilities of the I2C host controller.
+  ///
+  CONST EFI_I2C_CONTROLLER_CAPABILITIES   *I2cControllerCapabilities;
+};
+
+///
+/// Reference to variable defined in the .DEC file
+///
+extern EFI_GUID gEfiI2cHostProtocolGuid;
+
+#endif  //  __I2C_HOST_H__

Added: trunk/edk2/MdePkg/Include/Protocol/I2cIo.h
===================================================================
--- trunk/edk2/MdePkg/Include/Protocol/I2cIo.h                          (rev 0)
+++ trunk/edk2/MdePkg/Include/Protocol/I2cIo.h  2013-08-14 01:14:53 UTC (rev 
14548)
@@ -0,0 +1,175 @@
+/** @file
+  I2C I/O Protocol as defined in the PI 1.3 specification.
+
+  The EFI I2C I/O protocol enables the user to manipulate a single 
+  I2C device independent of the host controller and I2C design.
+
+  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD 
License         
+  which accompanies this distribution.  The full text of the license may be 
found at        
+  http://opensource.org/licenses/bsd-license.php                               
             
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.3.
+
+**/
+
+#ifndef __I2C_IO_H__
+#define __I2C_IO_H__
+
+#include <Pi/PiI2c.h>
+
+#define EFI_I2C_IO_PROTOCOL_GUID { 0xb60a3e6b, 0x18c4, 0x46e5, { 0xa2, 0x9a, 
0xc9, 0xa1, 0x06, 0x65, 0xa2, 0x8e }}
+
+///
+/// I2C I/O protocol
+///
+/// The I2C IO protocol enables access to a specific device on the I2C
+/// bus.
+///
+/// Each I2C device is identified uniquely in the system by the tuple
+/// DeviceGuid:DeviceIndex.  The DeviceGuid represents the manufacture
+/// and part number and is provided by the silicon vendor or the third
+/// party I2C device driver writer.  The DeviceIndex identifies the part
+/// within the system by using a unique number and is created by the
+/// board designer or the writer of the EFI_I2C_ENUMERATE_PROTOCOL.
+///
+/// I2C slave addressing is abstracted to validate addresses and limit
+/// operation to the specified I2C device.  The third party providing
+/// the I2C device support provides an ordered list of slave addresses
+/// for the I2C device required to implement the EFI_I2C_ENUMERATE_PROTOCOL.
+/// The order of the list must be preserved.
+///
+typedef struct _EFI_I2C_IO_PROTOCOL  EFI_I2C_IO_PROTOCOL;
+
+
+/**
+  Queue an I2C transaction for execution on the I2C device.
+
+  This routine must be called at or below TPL_NOTIFY.  For synchronous
+  requests this routine must be called at or below TPL_CALLBACK.
+
+  This routine queues an I2C transaction to the I2C controller for
+  execution on the I2C bus.
+
+  When Event is NULL, QueueRequest() operates synchronously and returns
+  the I2C completion status as its return value.
+
+  When Event is not NULL, QueueRequest() synchronously returns EFI_SUCCESS
+  indicating that the asynchronous I2C transaction was queued.  The values
+  above are returned in the buffer pointed to by I2cStatus upon the
+  completion of the I2C transaction when I2cStatus is not NULL.
+
+  The upper layer driver writer provides the following to the platform
+  vendor:
+  
+  1.  Vendor specific GUID for the I2C part
+  2.  Guidance on proper construction of the slave address array when the
+      I2C device uses more than one slave address.  The I2C bus protocol
+      uses the SlaveAddressIndex to perform relative to physical address
+      translation to access the blocks of hardware within the I2C device.
+
+  @param[in] This               Pointer to an EFI_I2C_IO_PROTOCOL structure.
+  @param[in] SlaveAddressIndex  Index value into an array of slave addresses
+                                for the I2C device.  The values in the array
+                                are specified by the board designer, with the
+                                third party I2C device driver writer providing
+                                the slave address order.
+
+                                For devices that have a single slave address,
+                                this value must be zero.  If the I2C device
+                                uses more than one slave address then the
+                                third party (upper level) I2C driver writer
+                                needs to specify the order of entries in the
+                                slave address array.
+
+                                \ref ThirdPartyI2cDrivers "Third Party I2C
+                                Drivers" section in I2cMaster.h.
+  @param[in] Event              Event to signal for asynchronous transactions,
+                                NULL for synchronous transactions
+  @param[in] RequestPacket      Pointer to an EFI_I2C_REQUEST_PACKET structure
+                                describing the I2C transaction
+  @param[out] I2cStatus         Optional buffer to receive the I2C transaction
+                                completion status
+
+  @retval EFI_SUCCESS           The asynchronous transaction was successfully
+                                queued when Event is not NULL.
+  @retval EFI_SUCCESS           The transaction completed successfully when
+                                Event is NULL.
+  @retval EFI_ABORTED           The request did not complete because the driver
+                                binding Stop() routine was called.
+  @retval EFI_BAD_BUFFER_SIZE   The RequestPacket->LengthInBytes value is too
+                                large.
+  @retval EFI_DEVICE_ERROR      There was an I2C error (NACK) during the
+                                transaction.
+  @retval EFI_INVALID_PARAMETER RequestPacket is NULL
+  @retval EFI_NOT_FOUND         Reserved bit set in the SlaveAddress parameter
+  @retval EFI_NO_MAPPING        The EFI_I2C_HOST_PROTOCOL could not set the
+                                bus configuration required to access this I2C
+                                device.
+  @retval EFI_NO_RESPONSE       The I2C device is not responding to the slave
+                                address selected by SlaveAddressIndex.
+                                EFI_DEVICE_ERROR will be returned if the
+                                controller cannot distinguish when the NACK
+                                occurred.
+  @retval EFI_OUT_OF_RESOURCES  Insufficient memory for I2C transaction
+  @retval EFI_UNSUPPORTED       The controller does not support the requested
+                                transaction.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_I2C_IO_PROTOCOL_QUEUE_REQUEST) (
+  IN CONST EFI_I2C_IO_PROTOCOL  *This,
+  IN UINTN                      SlaveAddressIndex,
+  IN EFI_EVENT                  Event      OPTIONAL,
+  IN EFI_I2C_REQUEST_PACKET     *RequestPacket,
+  OUT EFI_STATUS                *I2cStatus OPTIONAL
+  );
+
+///
+/// I2C I/O protocol
+///
+struct _EFI_I2C_IO_PROTOCOL {
+  ///
+  /// Queue an I2C transaction for execution on the I2C device.
+  ///
+  EFI_I2C_IO_PROTOCOL_QUEUE_REQUEST         QueueRequest;
+
+  ///
+  /// Unique value assigned by the silicon manufacture or the third
+  /// party I2C driver writer for the I2C part.  This value logically
+  /// combines both the manufacture name and the I2C part number into
+  /// a single value specified as a GUID.
+  ///
+  CONST EFI_GUID                            *DeviceGuid;
+
+  ///
+  /// Unique ID of the I2C part within the system
+  ///
+  UINT32                                    DeviceIndex;
+
+  ///
+  /// Hardware revision - ACPI _HRV value.  See the Advanced Configuration
+  /// and Power Interface Specification, Revision 5.0  for the field format
+  /// and the Plug and play support for I2C web-page for restriction on values.
+  ///
+  UINT32                                    HardwareRevision;
+
+  ///
+  /// Pointer to an EFI_I2C_CONTROLLER_CAPABILITIES data structure containing
+  /// the capabilities of the I2C host controller.
+  ///
+  CONST EFI_I2C_CONTROLLER_CAPABILITIES     *I2cControllerCapabilities;
+};
+
+///
+/// Reference to variable defined in the .DEC file
+///
+extern EFI_GUID gEfiI2cIoProtocolGuid;
+
+#endif  //  __I2C_IO_H__

Added: trunk/edk2/MdePkg/Include/Protocol/I2cMaster.h
===================================================================
--- trunk/edk2/MdePkg/Include/Protocol/I2cMaster.h                              
(rev 0)
+++ trunk/edk2/MdePkg/Include/Protocol/I2cMaster.h      2013-08-14 01:14:53 UTC 
(rev 14548)
@@ -0,0 +1,192 @@
+/** @file
+  I2C Master Protocol as defined in the PI 1.3 specification.
+
+  This protocol manipulates the I2C host controller to perform transactions as 
a master 
+  on the I2C bus using the current state of any switches or multiplexers in 
the I2C bus.
+
+  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD 
License         
+  which accompanies this distribution.  The full text of the license may be 
found at        
+  http://opensource.org/licenses/bsd-license.php                               
             
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+
+  @par Revision Reference:
+  This protocol is from PI Version 1.3.
+
+**/
+
+#ifndef __I2C_MASTER_H__
+#define __I2C_MASTER_H__
+
+#include <Pi/PiI2c.h>
+
+#define EFI_I2C_MASTER_PROTOCOL_GUID { 0xcd72881f, 0x45b5, 0x4feb, { 0x98, 
0xc8, 0x31, 0x3d, 0xa8, 0x11, 0x74, 0x62 }}
+
+typedef struct _EFI_I2C_MASTER_PROTOCOL EFI_I2C_MASTER_PROTOCOL;
+
+/**
+  Set the frequency for the I2C clock line.
+
+  This routine must be called at or below TPL_NOTIFY.
+
+  The software and controller do a best case effort of using the specified
+  frequency for the I2C bus.  If the frequency does not match exactly then
+  the I2C master protocol selects the next lower frequency to avoid
+  exceeding the operating conditions for any of the I2C devices on the bus.
+  For example if 400 KHz was specified and the controller's divide network
+  only supports 402 KHz or 398 KHz then the I2C master protocol selects 398
+  KHz.  If there are not lower frequencies available, then return
+  EFI_UNSUPPORTED.
+
+  @param[in] This           Pointer to an EFI_I2C_MASTER_PROTOCOL structure
+  @param[in] BusClockHertz  Pointer to the requested I2C bus clock frequency
+                            in Hertz.  Upon return this value contains the
+                            actual frequency in use by the I2C controller.
+
+  @retval EFI_SUCCESS           The bus frequency was set successfully.
+  @retval EFI_ALREADY_STARTED   The controller is busy with another 
transaction.
+  @retval EFI_INVALID_PARAMETER BusClockHertz is NULL
+  @retval EFI_UNSUPPORTED       The controller does not support this frequency.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_I2C_MASTER_PROTOCOL_SET_BUS_FREQUENCY) (
+  IN CONST EFI_I2C_MASTER_PROTOCOL   *This,
+  IN OUT UINTN                       *BusClockHertz
+  );
+
+/**
+  Reset the I2C controller and configure it for use
+
+  This routine must be called at or below TPL_NOTIFY.
+
+  The I2C controller is reset.  The caller must call SetBusFrequench() after
+  calling Reset().
+
+  @param[in]     This       Pointer to an EFI_I2C_MASTER_PROTOCOL structure.
+
+  @retval EFI_SUCCESS         The reset completed successfully.
+  @retval EFI_ALREADY_STARTED The controller is busy with another transaction.
+  @retval EFI_DEVICE_ERROR    The reset operation failed.
+  
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_I2C_MASTER_PROTOCOL_RESET) (
+  IN CONST EFI_I2C_MASTER_PROTOCOL *This
+  );
+
+/**
+  Start an I2C transaction on the host controller.
+
+  This routine must be called at or below TPL_NOTIFY.  For synchronous
+  requests this routine must be called at or below TPL_CALLBACK.
+
+  This function initiates an I2C transaction on the controller.  To
+  enable proper error handling by the I2C protocol stack, the I2C
+  master protocol does not support queuing but instead only manages
+  one I2C transaction at a time.  This API requires that the I2C bus
+  is in the correct configuration for the I2C transaction.
+
+  The transaction is performed by sending a start-bit and selecting the
+  I2C device with the specified I2C slave address and then performing
+  the specified I2C operations.  When multiple operations are requested
+  they are separated with a repeated start bit and the slave address.
+  The transaction is terminated with a stop bit.
+
+  When Event is NULL, StartRequest operates synchronously and returns
+  the I2C completion status as its return value.
+
+  When Event is not NULL, StartRequest synchronously returns EFI_SUCCESS
+  indicating that the I2C transaction was started asynchronously.  The
+  transaction status value is returned in the buffer pointed to by
+  I2cStatus upon the completion of the I2C transaction when I2cStatus
+  is not NULL.  After the transaction status is returned the Event is
+  signaled.
+
+  Note: The typical consumer of this API is the I2C host protocol.
+  Extreme care must be taken by other consumers of this API to prevent
+  confusing the third party I2C drivers due to a state change at the
+  I2C device which the third party I2C drivers did not initiate.  I2C
+  platform specific code may use this API within these guidelines.
+
+  @param[in] This           Pointer to an EFI_I2C_MASTER_PROTOCOL structure.
+  @param[in] SlaveAddress   Address of the device on the I2C bus.  Set the
+                            I2C_ADDRESSING_10_BIT when using 10-bit addresses,
+                            clear this bit for 7-bit addressing.  Bits 0-6
+                            are used for 7-bit I2C slave addresses and bits
+                            0-9 are used for 10-bit I2C slave addresses.
+  @param[in] RequestPacket  Pointer to an EFI_I2C_REQUEST_PACKET
+                            structure describing the I2C transaction.
+  @param[in] Event          Event to signal for asynchronous transactions,
+                            NULL for asynchronous transactions
+  @param[out] I2cStatus     Optional buffer to receive the I2C transaction
+                            completion status
+
+  @retval EFI_SUCCESS           The asynchronous transaction was successfully
+                                started when Event is not NULL.
+  @retval EFI_SUCCESS           The transaction completed successfully when
+                                Event is NULL.
+  @retval EFI_ALREADY_STARTED   The controller is busy with another 
transaction.
+  @retval EFI_BAD_BUFFER_SIZE   The RequestPacket->LengthInBytes value is too
+                                large.
+  @retval EFI_DEVICE_ERROR      There was an I2C error (NACK) during the
+                                transaction.
+  @retval EFI_INVALID_PARAMETER RequestPacket is NULL
+  @retval EFI_NOT_FOUND         Reserved bit set in the SlaveAddress parameter
+  @retval EFI_NO_RESPONSE       The I2C device is not responding to the slave
+                                address.  EFI_DEVICE_ERROR will be returned if
+                                the controller cannot distinguish when the NACK
+                                occurred.
+  @retval EFI_OUT_OF_RESOURCES  Insufficient memory for I2C transaction
+  @retval EFI_UNSUPPORTED       The controller does not support the requested
+                                transaction.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_I2C_MASTER_PROTOCOL_START_REQUEST) (
+  IN CONST EFI_I2C_MASTER_PROTOCOL *This,
+  IN UINTN                         SlaveAddress,
+  IN EFI_I2C_REQUEST_PACKET        *RequestPacket,
+  IN EFI_EVENT                     Event      OPTIONAL,
+  OUT EFI_STATUS                   *I2cStatus OPTIONAL
+  );
+
+///
+/// I2C master mode protocol
+///
+/// This protocol manipulates the I2C host controller to perform transactions 
as a
+/// master on the I2C bus using the current state of any switches or 
multiplexers
+/// in the I2C bus.
+///
+struct _EFI_I2C_MASTER_PROTOCOL {
+  ///
+  /// Set the clock frequency for the I2C bus.
+  ///
+  EFI_I2C_MASTER_PROTOCOL_SET_BUS_FREQUENCY SetBusFrequency;
+
+  ///
+  /// Reset the I2C host controller.
+  ///
+  EFI_I2C_MASTER_PROTOCOL_RESET             Reset;
+
+  ///
+  /// Start an I2C transaction in master mode on the host controller.
+  ///
+  EFI_I2C_MASTER_PROTOCOL_START_REQUEST     StartRequest;
+
+  ///
+  /// Pointer to an EFI_I2C_CONTROLLER_CAPABILITIES data structure containing
+  /// the capabilities of the I2C host controller.
+  ///
+  CONST EFI_I2C_CONTROLLER_CAPABILITIES     *I2cControllerCapabilities;
+};
+
+extern EFI_GUID gEfiI2cMasterProtocolGuid;
+
+#endif  //  __I2C_MASTER_H__

Modified: trunk/edk2/MdePkg/MdePkg.dec
===================================================================
--- trunk/edk2/MdePkg/MdePkg.dec        2013-08-13 08:45:45 UTC (rev 14547)
+++ trunk/edk2/MdePkg/MdePkg.dec        2013-08-14 01:14:53 UTC (rev 14548)
@@ -686,6 +686,13 @@
   ## Include/Ppi/PiPcd.h
   gEfiPeiPcdPpiGuid                  = { 0x1f34d25, 0x4de2, 0x23ad, { 0x3f, 
0xf3, 0x36, 0x35, 0x3f, 0xf3, 0x23, 0xf1 } }
 
+  #
+  # PPIs defined in PI 1.3.
+  #
+  
+  ## Include/Ppi/I2cMaster.h
+  gEfiPeiI2cMasterPpiGuid            = { 0xb3bfab9b, 0x9f9c, 0x4e8b, { 0xad, 
0x37, 0x7f, 0x8c, 0x51, 0xfc, 0x62, 0x80 }}
+
 [Protocols]
   #
   # Protocols defined in PI1.0.
@@ -909,6 +916,25 @@
   gEfiSmmEndOfDxeProtocolGuid = { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0x39, 
0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }}
 
   #
+  # Protocols defined in PI 1.3.
+  #
+
+  ## Include/Protocol/I2cMaster.h
+  gEfiI2cMasterProtocolGuid = { 0xcd72881f, 0x45b5, 0x4feb, { 0x98, 0xc8, 
0x31, 0x3d, 0xa8, 0x11, 0x74, 0x62 }}
+
+  ## Include/Protocol/I2cIo.h
+  gEfiI2cIoProtocolGuid = { 0xb60a3e6b, 0x18c4, 0x46e5, { 0xa2, 0x9a, 0xc9, 
0xa1, 0x06, 0x65, 0xa2, 0x8e }}
+
+  ## Include/Protocol/I2cEnumerate.h
+  gEfiI2cEnumerateProtocolGuid = { 0xda8cd7c4, 0x1c00, 0x49e2, { 0x80, 0x3e, 
0x52, 0x14, 0xe7, 0x01, 0x89, 0x4c }}
+
+  ## Include/Protocol/I2cHost.h
+  gEfiI2cHostProtocolGuid = { 0xa5aab9e3, 0xc727, 0x48cd, { 0x8b, 0xbf, 0x42, 
0x72, 0x33, 0x85, 0x49, 0x48 }}
+
+  ## Include/Protocol/I2cBusConfigurationManagement.h
+  gEfiI2cBusConfigurationManagementProtocolGuid = { 0x55b71fb5, 0x17c6, 
0x410e, { 0xb5, 0xbd, 0x5f, 0xa2, 0xe3, 0xd4, 0x46, 0x6b }}
+
+  #
   # Protocols defined in UEFI2.1/UEFI2.0/EFI1.1
   #
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
edk2-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to