• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   I2C PEI Lib Instance.
3 
4   Copyright (c) 1999- 2015, 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 #ifndef I2C_PEI_REGS_H
16 #define I2C_PEI_REGS_H
17 
18 #include "PiPei.h"
19 
20 #define R_PCH_LPC_PMC_BASE                        0x44
21 #define B_PCH_LPC_PMC_BASE_BAR                    0xFFFFFE00
22 #define R_PCH_PMC_FUNC_DIS                        0x34  // Function Disable Register
23 #define PCIEX_BASE_ADDRESS                        0xE0000000
24 #define PciD31F0RegBase                           PCIEX_BASE_ADDRESS + (UINT32) (31 << 15)
25 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC7             BIT7  // LPSS SPI Disable
26 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC6             BIT6  // LPSS HSUART #2 Disable
27 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC5             BIT5  // LPSS HSUART #1 Disable
28 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC4             BIT4  // LPSS I2S Disable
29 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC3             BIT3  // LPSS PCM Disable
30 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC2             BIT2  // LPSS I2C #2 Disable
31 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC1             BIT1  // LPSS I2C #1 Disable
32 #define B_PCH_PMC_FUNC_DIS_LPSS_FUNC0             BIT0  // LPSS DMA Disable
33 
34 
35 #define DEFAULT_PCI_BUS_NUMBER_PCH       0
36 
37 #define R_PCH_LPSS_I2C_STSCMD                     0x04  // Status & Command
38 #define B_PCH_LPSS_I2C_STSCMD_RMA                 BIT29 // RMA
39 #define B_PCH_LPSS_I2C_STSCMD_RCA                 BIT28 // RCA
40 #define B_PCH_LPSS_I2C_STSCMD_CAPLIST             BIT20 // Capability List
41 #define B_PCH_LPSS_I2C_STSCMD_INTRSTS             BIT19 // Interrupt Status
42 #define B_PCH_LPSS_I2C_STSCMD_INTRDIS             BIT10 // Interrupt Disable
43 #define B_PCH_LPSS_I2C_STSCMD_SERREN              BIT8  // SERR# Enable
44 #define B_PCH_LPSS_I2C_STSCMD_BME                 BIT2  // Bus Master Enable
45 #define B_PCH_LPSS_I2C_STSCMD_MSE                 BIT1  // Memory Space Enable
46 
47 #define R_PCH_LPSS_I2C_BAR                        0x10  // BAR
48 #define B_PCH_LPSS_I2C_BAR_BA                     0xFFFFF000 // Base Address
49 #define B_PCH_LPSS_I2C_BAR_SI                     0x00000FF0 // Size Indicator
50 #define B_PCH_LPSS_I2C_BAR_PF                     BIT3  // Prefetchable
51 #define B_PCH_LPSS_I2C_BAR_TYPE                   (BIT2 | BIT1) // Type
52 #define B_PCH_LPSS_I2C_BAR_MS                     BIT0  // Message Space
53 
54 #define R_PCH_LPSS_I2C_BAR1                       0x14  // BAR 1
55 #define B_PCH_LPSS_I2C_BAR1_BA                    0xFFFFF000 // Base Address
56 #define B_PCH_LPSS_I2C_BAR1_SI                    0x00000FF0 // Size Indicator
57 #define B_PCH_LPSS_I2C_BAR1_PF                    BIT3  // Prefetchable
58 #define B_PCH_LPSS_I2C_BAR1_TYPE                  (BIT2 | BIT1) // Type
59 #define B_PCH_LPSS_I2C_BAR1_MS                    BIT0  // Message Space
60 
61 #define NUM_RETRIES         0xFFFF
62 
63 //
64 // LPIO I2C Module Memory Space Registers
65 //
66 #define R_PCH_LPIO_I2C_MEM_RESETS                 0x804 // Software Reset
67 #define B_PCH_LPIO_I2C_MEM_RESETS_FUNC            BIT1  // Function Clock Domain Reset
68 #define B_PCH_LPIO_I2C_MEM_RESETS_APB             BIT0  // APB Domain Reset
69 
70 #define R_PCH_LPSS_I2C_MEM_PCP                    0x800 // Private Clock Parameters
71 
72 #define  bit(a)                   1 << (a)
73 
74 //
75 // MMIO Register Definitions
76 //
77 
78 #define  I2C0_REG_SPACE_ADDR_BASE            0xFF138000  //01K
79 
80 #define    R_IC_CON                          ( 0x00) // I2C Control
81 #define     B_IC_RESTART_EN                  BIT5
82 #define     B_IC_SLAVE_DISABLE               BIT6
83 #define     V_SPEED_STANDARD                 0x02
84 #define     V_SPEED_FAST                     0x04
85 #define     V_SPEED_HIGH                     0x06
86 #define     B_MASTER_MODE                    BIT0
87 
88 #define    R_IC_TAR                          ( 0x04) // I2C Target Address
89 #define     IC_TAR_10BITADDR_MASTER           BIT12
90 
91 #define    R_IC_SAR                          ( 0x08) // I2C Slave Address
92 #define    R_IC_HS_MADDR                     ( 0x0C) // I2C HS MasterMode Code Address
93 #define    R_IC_DATA_CMD                     ( 0x10) // I2C Rx/Tx Data Buffer and Command
94 
95 #define    B_READ_CMD                         BIT8    // 1 = read, 0 = write
96 #define    B_CMD_STOP                         BIT9    // 1 = STOP
97 #define    B_CMD_RESTART                      BIT10   // 1 = IC_RESTART_EN
98 
99 #define    V_WRITE_CMD_MASK                  ( 0xFF)
100 
101 #define    R_IC_SS_SCL_HCNT                  ( 0x14) // Standard Speed I2C Clock SCL High Count
102 #define    R_IC_SS_SCL_LCNT                  ( 0x18) // Standard Speed I2C Clock SCL Low Count
103 #define    R_IC_FS_SCL_HCNT                  ( 0x1C) // Full Speed I2C Clock SCL High Count
104 #define    R_IC_FS_SCL_LCNT                  ( 0x20) // Full Speed I2C Clock SCL Low Count
105 #define    R_IC_HS_SCL_HCNT                  ( 0x24) // High Speed I2C Clock SCL High Count
106 #define    R_IC_HS_SCL_LCNT                  ( 0x28) // High Speed I2C Clock SCL Low Count
107 #define    R_IC_INTR_STAT                    ( 0x2C) // I2C Inetrrupt Status
108 #define    R_IC_INTR_MASK                    ( 0x30) // I2C Interrupt Mask
109 #define     I2C_INTR_GEN_CALL                 BIT11  // General call received
110 #define     I2C_INTR_START_DET                BIT10
111 #define     I2C_INTR_STOP_DET                 BIT9
112 #define     I2C_INTR_ACTIVITY                 BIT8
113 #define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
114 #define     I2C_INTR_TX_EMPTY                 BIT4
115 #define     I2C_INTR_TX_OVER                  BIT3
116 #define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
117 #define     I2C_INTR_RX_OVER                  BIT1
118 #define     I2C_INTR_RX_UNDER                 BIT0
119 #define    R_IC_RawIntrStat                ( 0x34) // I2C Raw Interrupt Status
120 #define    R_IC_RX_TL                        ( 0x38) // I2C Receive FIFO Threshold
121 #define    R_IC_TX_TL                        ( 0x3C) // I2C Transmit FIFO Threshold
122 #define    R_IC_CLR_INTR                     ( 0x40) // Clear Combined and Individual Interrupts
123 #define    R_IC_CLR_RX_UNDER                 ( 0x44) // Clear RX_UNDER Interrupt
124 #define    R_IC_CLR_RX_OVER                  ( 0x48) // Clear RX_OVERinterrupt
125 #define    R_IC_CLR_TX_OVER                  ( 0x4C) // Clear TX_OVER interrupt
126 #define    R_IC_CLR_RD_REQ                   ( 0x50) // Clear RD_REQ interrupt
127 #define    R_IC_CLR_TX_ABRT                  ( 0x54) // Clear TX_ABRT interrupt
128 #define    R_IC_CLR_RX_DONE                  ( 0x58) // Clear RX_DONE interrupt
129 #define    R_IC_CLR_ACTIVITY                 ( 0x5C) // Clear ACTIVITY interrupt
130 #define    R_IC_CLR_STOP_DET                 ( 0x60) // Clear STOP_DET interrupt
131 #define    R_IC_CLR_START_DET                ( 0x64) // Clear START_DET interrupt
132 #define    R_IC_CLR_GEN_CALL                 ( 0x68) // Clear GEN_CALL interrupt
133 #define    R_IC_ENABLE                       ( 0x6C) // I2C Enable
134 #define    R_IC_STATUS                       ( 0x70) // I2C Status
135 
136 #define    R_IC_SDA_HOLD                     ( 0x7C) // I2C IC_DEFAULT_SDA_HOLD//16bits
137 
138 #define     STAT_MST_ACTIVITY                 BIT5   // Master FSM Activity Status.
139 #define     STAT_RFF                          BIT4   // RX FIFO is completely full
140 #define     STAT_RFNE                         BIT3   // RX FIFO is not empty
141 #define     STAT_TFE                          BIT2   // TX FIFO is completely empty
142 #define     STAT_TFNF                         BIT1   // TX FIFO is not full
143 
144 #define    R_IC_TXFLR                        ( 0x74) // Transmit FIFO Level Register
145 #define    R_IC_RXFLR                        ( 0x78) // Receive FIFO Level Register
146 #define    R_IC_TX_ABRT_SOURCE               ( 0x80) // I2C Transmit Abort Status Register
147 #define    R_IC_SLV_DATA_NACK_ONLY           ( 0x84) // Generate SLV_DATA_NACK Register
148 #define    R_IC_DMA_CR                       ( 0x88) // DMA Control Register
149 #define    R_IC_DMA_TDLR                     ( 0x8C) // DMA Transmit Data Level
150 #define    R_IC_DMA_RDLR                     ( 0x90) // DMA Receive Data Level
151 #define    R_IC_SDA_SETUP                    ( 0x94) // I2C SDA Setup Register
152 #define    R_IC_ACK_GENERAL_CALL             ( 0x98) // I2C ACK General Call Register
153 #define    R_IC_ENABLE_STATUS                ( 0x9C) // I2C Enable Status Register
154 #define    R_IC_COMP_PARAM                   ( 0xF4) // Component Parameter Register
155 #define    R_IC_COMP_VERSION                 ( 0xF8) // Component Version ID
156 #define    R_IC_COMP_TYPE                    ( 0xFC) // Component Type
157 
158 #define I2C_SS_SCL_HCNT_VALUE_100M           0x1DD
159 #define I2C_SS_SCL_LCNT_VALUE_100M           0x1E4
160 #define I2C_FS_SCL_HCNT_VALUE_100M           0x54
161 #define I2C_FS_SCL_LCNT_VALUE_100M           0x9a
162 #define I2C_HS_SCL_HCNT_VALUE_100M           0x7
163 #define I2C_HS_SCL_LCNT_VALUE_100M           0xE
164 
165 //
166 // FIFO write workaround value.
167 //
168 #define     FIFO_WRITE_DELAY    2
169 #define     IC_TAR_10BITADDR_MASTER           BIT12
170 #define     FIFO_SIZE                         32
171 #define     R_IC_INTR_STAT                    ( 0x2C) // I2c Inetrrupt Status
172 #define     R_IC_INTR_MASK                    ( 0x30) // I2c Interrupt Mask
173 #define     I2C_INTR_GEN_CALL                 BIT11  // General call received
174 #define     I2C_INTR_START_DET                BIT10
175 #define     I2C_INTR_STOP_DET                 BIT9
176 #define     I2C_INTR_ACTIVITY                 BIT8
177 #define     I2C_INTR_TX_ABRT                  BIT6   // Set on NACK
178 #define     I2C_INTR_TX_EMPTY                 BIT4
179 #define     I2C_INTR_TX_OVER                  BIT3
180 #define     I2C_INTR_RX_FULL                  BIT2   // Data bytes in RX FIFO over threshold
181 #define     I2C_INTR_RX_OVER                  BIT1
182 #define     I2C_INTR_RX_UNDER                 BIT0
183 
184 /**
185   Programe all I2C controllers on LPSS.
186 
187   I2C0 is function 1 of LPSS. I2C1 is function 2 of LPSS, etc..
188 
189   @param   VOID
190 
191   @return  EFI_SUCCESS
192 **/
193 EFI_STATUS
194 ProgramPciLpssI2C (
195   VOID
196   );
197 
198 /**
199   Reads a Byte from I2C Device.
200 
201   @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
202   @param  SlaveAddress        Device Address from which the byte value has to be read
203   @param  Offset              Offset from which the data has to be read
204   @param  *Byte               Address to which the value read has to be stored
205   @param  Start               Whether a RESTART is issued before the byte is sent or received
206   @param  End                 Whether STOP is generated after a data byte is sent or received
207 
208   @return  EFI_SUCCESS        If the byte value has been successfully read
209   @return  EFI_DEVICE_ERROR   Operation Failed, Device Error
210 **/
211 EFI_STATUS
212 ByteReadI2CBasic(
213   IN  UINT8 I2cControllerIndex,
214   IN  UINT8 SlaveAddress,
215   IN  UINTN ReadBytes,
216   OUT UINT8 *ReadBuffer,
217   IN  UINT8 Start,
218   IN  UINT8 End
219   );
220 
221 /**
222   Writes a Byte to I2C Device.
223 
224   @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
225   @param  SlaveAddress         Device Address from which the byte value has to be written
226   @param  Offset               Offset from which the data has to be read
227   @param  *Byte                Address to which the value written is stored
228   @param  Start               Whether a RESTART is issued before the byte is sent or received
229   @param  End                 Whether STOP is generated after a data byte is sent or received
230 
231   @return  EFI_SUCCESS         IF the byte value has been successfully written
232   @return  EFI_DEVICE_ERROR    Operation Failed, Device Error
233 **/
234 EFI_STATUS
235 ByteWriteI2CBasic(
236   IN  UINT8 I2cControllerIndex,
237   IN  UINT8 SlaveAddress,
238   IN  UINTN WriteBytes,
239   IN  UINT8 *WriteBuffer,
240   IN  UINT8 Start,
241   IN  UINT8 End
242   );
243 
244 /**
245   Reads a Byte from I2C Device.
246 
247   @param  I2cControllerIndex   I2C Bus no to which the I2C device has been connected
248   @param  SlaveAddress         Device Address from which the byte value has to be read
249   @param  Offset               Offset from which the data has to be read
250   @param  ReadBytes            Number of bytes to be read
251   @param  *ReadBuffer          Address to which the value read has to be stored
252 
253   @return  EFI_SUCCESS       IF the byte value has been successfully read
254   @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
255 **/
256 EFI_STATUS
257 ByteReadI2C(
258   IN  UINT8 I2cControllerIndex,
259   IN  UINT8 SlaveAddress,
260   IN  UINT8 Offset,
261   IN  UINTN ReadBytes,
262   OUT UINT8 *ReadBuffer
263   );
264 
265 /**
266   Writes a Byte to I2C Device.
267 
268   @param  I2cControllerIndex  I2C Bus no to which the I2C device has been connected
269   @param  SlaveAddress        Device Address from which the byte value has to be written
270   @param  Offset              Offset from which the data has to be written
271   @param  WriteBytes          Number of bytes to be written
272   @param  *Byte               Address to which the value written is stored
273 
274   @return  EFI_SUCCESS       IF the byte value has been successfully read
275   @return  EFI_DEVICE_ERROR  Operation Failed, Device Error
276 **/
277 EFI_STATUS
278 ByteWriteI2C(
279   IN  UINT8 I2cControllerIndex,
280   IN  UINT8 SlaveAddress,
281   IN  UINT8 Offset,
282   IN  UINTN WriteBytes,
283   IN  UINT8 *WriteBuffer
284   );
285 
286 #endif
287