1 /** @file
2 Functions for access I2C MMIO register.
3
4 Copyright (c) 2006 - 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 #include <PiPei.h>
16 #include <Library/DebugLib.h>
17 #include <Library/PeiServicesTablePointerLib.h>
18
19 /**
20 Reads an 8-bit MMIO register.
21
22 Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
23 returned. This function must guarantee that all MMIO read and write
24 operations are serialized.
25
26 If 8-bit MMIO register operations are not supported, then ASSERT().
27
28 @param Address The MMIO register to read.
29
30 @return The value read.
31
32 **/
33 UINT8
34 EFIAPI
I2CLibPeiMmioRead8(IN UINTN Address)35 I2CLibPeiMmioRead8 (
36 IN UINTN Address
37 )
38 {
39 UINT8 Value;
40
41 Value = *(volatile UINT8*)Address;
42 return Value;
43 }
44
45 /**
46 Reads a 16-bit MMIO register.
47
48 Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
49 returned. This function must guarantee that all MMIO read and write
50 operations are serialized.
51
52 If 16-bit MMIO register operations are not supported, then ASSERT().
53 If Address is not aligned on a 16-bit boundary, then ASSERT().
54
55 @param Address The MMIO register to read.
56
57 @return The value read.
58
59 **/
60 UINT16
61 EFIAPI
I2CLibPeiMmioRead16(IN UINTN Address)62 I2CLibPeiMmioRead16 (
63 IN UINTN Address
64 )
65 {
66 UINT16 Value;
67
68 ASSERT ((Address & 1) == 0);
69 Value = *(volatile UINT16*)Address;
70 return Value;
71 }
72
73 /**
74 Writes a 16-bit MMIO register.
75
76 Writes the 16-bit MMIO register specified by Address with the value specified
77 by Value and returns Value. This function must guarantee that all MMIO read
78 and write operations are serialized.
79
80 If 16-bit MMIO register operations are not supported, then ASSERT().
81 If Address is not aligned on a 16-bit boundary, then ASSERT().
82
83 @param Address The MMIO register to write.
84 @param Value The value to write to the MMIO register.
85
86 @return Value.
87
88 **/
89 UINT16
90 EFIAPI
I2CLibPeiMmioWrite16(IN UINTN Address,IN UINT16 Value)91 I2CLibPeiMmioWrite16 (
92 IN UINTN Address,
93 IN UINT16 Value
94 )
95 {
96 ASSERT ((Address & 1) == 0);
97 *(volatile UINT16*)Address = Value;
98 return Value;
99 }
100
101 /**
102 Reads a 32-bit MMIO register.
103
104 Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
105 returned. This function must guarantee that all MMIO read and write
106 operations are serialized.
107
108 If 32-bit MMIO register operations are not supported, then ASSERT().
109 If Address is not aligned on a 32-bit boundary, then ASSERT().
110
111 @param Address The MMIO register to read.
112
113 @return The value read.
114
115 **/
116 UINT32
117 EFIAPI
I2CLibPeiMmioRead32(IN UINTN Address)118 I2CLibPeiMmioRead32 (
119 IN UINTN Address
120 )
121 {
122 UINT32 Value;
123
124 ASSERT ((Address & 3) == 0);
125 Value = *(volatile UINT32*)Address;
126
127 return Value;
128 }
129
130 /**
131 Writes a 32-bit MMIO register.
132
133 Writes the 32-bit MMIO register specified by Address with the value specified
134 by Value and returns Value. This function must guarantee that all MMIO read
135 and write operations are serialized.
136
137 If 32-bit MMIO register operations are not supported, then ASSERT().
138 If Address is not aligned on a 32-bit boundary, then ASSERT().
139
140 @param Address The MMIO register to write.
141 @param Value The value to write to the MMIO register.
142
143 @return Value.
144
145 **/
146 UINT32
147 EFIAPI
I2CLibPeiMmioWrite32(IN UINTN Address,IN UINT32 Value)148 I2CLibPeiMmioWrite32 (
149 IN UINTN Address,
150 IN UINT32 Value
151 )
152 {
153 ASSERT ((Address & 3) == 0);
154 *(volatile UINT32*)Address = Value;
155 return Value;
156 }
157
158 /**
159 OR a 32-bit MMIO register.
160
161 OR the 32-bit MMIO register specified by Address with the value specified
162 by Value and returns Value. This function must guarantee that all MMIO read
163 and write operations are serialized.
164
165 If 32-bit MMIO register operations are not supported, then ASSERT().
166 If Address is not aligned on a 32-bit boundary, then ASSERT().
167
168 @param Address The MMIO register to write OR.
169 @param Value The value to OR to the MMIO register.
170
171 @return Value.
172
173 **/
174 UINT32
175 EFIAPI
I2CLibPeiMmioOr32(IN UINTN Address,IN UINT32 OrData)176 I2CLibPeiMmioOr32 (
177 IN UINTN Address,
178 IN UINT32 OrData
179 )
180 {
181 return I2CLibPeiMmioWrite32 (Address, I2CLibPeiMmioRead32(Address) | OrData);
182 }
183
184
185