1 /** @file
2   Internal include file for the SMM CPU I/O Protocol.
3 
4 Copyright (c) 2009 - 2010, 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 _CPU_IO2_SMM_H_
16 #define _CPU_IO2_SMM_H_
17 
18 #include <PiSmm.h>
19 
20 #include <Protocol/SmmCpuIo2.h>
21 
22 #include <Library/BaseLib.h>
23 #include <Library/DebugLib.h>
24 #include <Library/IoLib.h>
25 #include <Library/SmmServicesTableLib.h>
26 #include <Library/BaseMemoryLib.h>
27 
28 #define MAX_IO_PORT_ADDRESS   0xFFFF
29 
30 /**
31   Reads memory-mapped registers.
32 
33   The I/O operations are carried out exactly as requested.  The caller is
34   responsible for any alignment and I/O width issues that the bus, device,
35   platform, or type of I/O might require.
36 
37   @param[in]  This     The EFI_SMM_CPU_IO2_PROTOCOL instance.
38   @param[in]  Width    Signifies the width of the I/O operations.
39   @param[in]  Address  The base address of the I/O operations.  The caller is
40                        responsible for aligning the Address if required.
41   @param[in]  Count    The number of I/O operations to perform.
42   @param[out] Buffer   For read operations, the destination buffer to store
43                        the results.  For write operations, the source buffer
44                        from which to write data.
45 
46   @retval EFI_SUCCESS            The data was read from or written to the device.
47   @retval EFI_UNSUPPORTED        The Address is not valid for this system.
48   @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
49   @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a
50                                  lack of resources
51 
52 **/
53 EFI_STATUS
54 EFIAPI
55 CpuMemoryServiceRead (
56   IN  CONST EFI_SMM_CPU_IO2_PROTOCOL  *This,
57   IN  EFI_SMM_IO_WIDTH                Width,
58   IN  UINT64                          Address,
59   IN  UINTN                           Count,
60   OUT VOID                            *Buffer
61   );
62 
63 /**
64   Writes memory-mapped registers.
65 
66   The I/O operations are carried out exactly as requested.  The caller is
67   responsible for any alignment and I/O width issues that the bus, device,
68   platform, or type of I/O might require.
69 
70   @param[in]  This     The EFI_SMM_CPU_IO2_PROTOCOL instance.
71   @param[in]  Width    Signifies the width of the I/O operations.
72   @param[in]  Address  The base address of the I/O operations.  The caller is
73                        responsible for aligning the Address if required.
74   @param[in]  Count    The number of I/O operations to perform.
75   @param[in]  Buffer   For read operations, the destination buffer to store
76                        the results.  For write operations, the source buffer
77                        from which to write data.
78 
79   @retval EFI_SUCCESS            The data was read from or written to the device.
80   @retval EFI_UNSUPPORTED        The Address is not valid for this system.
81   @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
82   @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a
83                                  lack of resources
84 
85 **/
86 EFI_STATUS
87 EFIAPI
88 CpuMemoryServiceWrite (
89   IN CONST EFI_SMM_CPU_IO2_PROTOCOL  *This,
90   IN EFI_SMM_IO_WIDTH                Width,
91   IN UINT64                          Address,
92   IN UINTN                           Count,
93   IN VOID                            *Buffer
94   );
95 
96 /**
97   Reads I/O registers.
98 
99   The I/O operations are carried out exactly as requested.  The caller is
100   responsible for any alignment and I/O width issues that the bus, device,
101   platform, or type of I/O might require.
102 
103   @param[in]  This     The EFI_SMM_CPU_IO2_PROTOCOL instance.
104   @param[in]  Width    Signifies the width of the I/O operations.
105   @param[in]  Address  The base address of the I/O operations.  The caller is
106                        responsible for aligning the Address if required.
107   @param[in]  Count    The number of I/O operations to perform.
108   @param[out] Buffer   For read operations, the destination buffer to store
109                        the results.  For write operations, the source buffer
110                        from which to write data.
111 
112   @retval EFI_SUCCESS            The data was read from or written to the device.
113   @retval EFI_UNSUPPORTED        The Address is not valid for this system.
114   @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
115   @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a
116                                  lack of resources
117 
118 **/
119 EFI_STATUS
120 EFIAPI
121 CpuIoServiceRead (
122   IN  CONST EFI_SMM_CPU_IO2_PROTOCOL  *This,
123   IN  EFI_SMM_IO_WIDTH                Width,
124   IN  UINT64                          Address,
125   IN  UINTN                           Count,
126   OUT VOID                            *Buffer
127   );
128 
129 /**
130   Write I/O registers.
131 
132   The I/O operations are carried out exactly as requested.  The caller is
133   responsible for any alignment and I/O width issues that the bus, device,
134   platform, or type of I/O might require.
135 
136   @param[in]  This     The EFI_SMM_CPU_IO2_PROTOCOL instance.
137   @param[in]  Width    Signifies the width of the I/O operations.
138   @param[in]  Address  The base address of the I/O operations.  The caller is
139                        responsible for aligning the Address if required.
140   @param[in]  Count    The number of I/O operations to perform.
141   @param[in]  Buffer   For read operations, the destination buffer to store
142                        the results.  For write operations, the source buffer
143                        from which to write data.
144 
145   @retval EFI_SUCCESS            The data was read from or written to the device.
146   @retval EFI_UNSUPPORTED        The Address is not valid for this system.
147   @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
148   @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a
149                                  lack of resources
150 
151 **/
152 EFI_STATUS
153 EFIAPI
154 CpuIoServiceWrite (
155   IN CONST EFI_SMM_CPU_IO2_PROTOCOL  *This,
156   IN EFI_SMM_IO_WIDTH                Width,
157   IN UINT64                          Address,
158   IN UINTN                           Count,
159   IN VOID                            *Buffer
160   );
161 
162 #endif
163