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