]> git.proxmox.com Git - mirror_edk2.git/blob - Vlv2TbltDevicePkg/Library/I2CLibPei/I2CLibPei.h
076d2a28be837ee5e69977a071061acb1400af20
[mirror_edk2.git] / Vlv2TbltDevicePkg / Library / I2CLibPei / I2CLibPei.h
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