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