RefRefine soma code to make code run safely.
[mirror_edk2.git] / PcAtChipsetPkg / 8259InterruptControllerDxe / 8259.h
1 /** @file
2 Driver implementing the Tiano Legacy 8259 Protocol
3
4 Copyright (c) 2005 - 2009, 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 _8259_H__
16 #define _8259_H__
17
18 #include <FrameworkDxe.h>
19
20 #include <Protocol/Legacy8259.h>
21 #include <Protocol/PciIo.h>
22
23 #include <Library/UefiBootServicesTableLib.h>
24 #include <Library/DebugLib.h>
25 #include <Library/IoLib.h>
26 #include <Library/BaseLib.h>
27 #include <Library/PcdLib.h>
28
29 #include <IndustryStandard/Pci.h>
30
31 // 8259 Hardware definitions
32
33 #define LEGACY_MODE_BASE_VECTOR_MASTER 0x08
34 #define LEGACY_MODE_BASE_VECTOR_SLAVE 0x70
35
36 #define PROTECTED_MODE_BASE_VECTOR_MASTER 0x68
37 #define PROTECTED_MODE_BASE_VECTOR_SLAVE 0x70
38
39 #define LEGACY_8259_CONTROL_REGISTER_MASTER 0x20
40 #define LEGACY_8259_MASK_REGISTER_MASTER 0x21
41 #define LEGACY_8259_CONTROL_REGISTER_SLAVE 0xA0
42 #define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1
43 #define LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER 0x4D0
44 #define LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE 0x4D1
45
46 #define LEGACY_8259_EOI 0x20
47
48 // Protocol Function Prototypes
49
50 /**
51 Sets the base address for the 8259 master and slave PICs.
52
53 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
54 @param[in] MasterBase Interrupt vectors for IRQ0-IRQ7.
55 @param[in] SlaveBase Interrupt vectors for IRQ8-IRQ15.
56
57 @retval EFI_SUCCESS The 8259 PIC was programmed successfully.
58 @retval EFI_DEVICE_ERROR There was an error while writing to the 8259 PIC.
59
60 **/
61 EFI_STATUS
62 EFIAPI
63 Interrupt8259SetVectorBase (
64 IN EFI_LEGACY_8259_PROTOCOL *This,
65 IN UINT8 MasterBase,
66 IN UINT8 SlaveBase
67 );
68
69 /**
70 Gets the current 16-bit real mode and 32-bit protected-mode IRQ masks.
71
72 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
73 @param[out] LegacyMask 16-bit mode interrupt mask for IRQ0-IRQ15.
74 @param[out] LegacyEdgeLevel 16-bit mode edge/level mask for IRQ-IRQ15.
75 @param[out] ProtectedMask 32-bit mode interrupt mask for IRQ0-IRQ15.
76 @param[out] ProtectedEdgeLevel 32-bit mode edge/level mask for IRQ0-IRQ15.
77
78 @retval EFI_SUCCESS The 8259 PIC was programmed successfully.
79 @retval EFI_DEVICE_ERROR There was an error while reading the 8259 PIC.
80
81 **/
82 EFI_STATUS
83 EFIAPI
84 Interrupt8259GetMask (
85 IN EFI_LEGACY_8259_PROTOCOL *This,
86 OUT UINT16 *LegacyMask, OPTIONAL
87 OUT UINT16 *LegacyEdgeLevel, OPTIONAL
88 OUT UINT16 *ProtectedMask, OPTIONAL
89 OUT UINT16 *ProtectedEdgeLevel OPTIONAL
90 );
91
92 /**
93 Sets the current 16-bit real mode and 32-bit protected-mode IRQ masks.
94
95 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
96 @param[in] LegacyMask 16-bit mode interrupt mask for IRQ0-IRQ15.
97 @param[in] LegacyEdgeLevel 16-bit mode edge/level mask for IRQ-IRQ15.
98 @param[in] ProtectedMask 32-bit mode interrupt mask for IRQ0-IRQ15.
99 @param[in] ProtectedEdgeLevel 32-bit mode edge/level mask for IRQ0-IRQ15.
100
101 @retval EFI_SUCCESS The 8259 PIC was programmed successfully.
102 @retval EFI_DEVICE_ERROR There was an error while writing the 8259 PIC.
103
104 **/
105 EFI_STATUS
106 EFIAPI
107 Interrupt8259SetMask (
108 IN EFI_LEGACY_8259_PROTOCOL *This,
109 IN UINT16 *LegacyMask, OPTIONAL
110 IN UINT16 *LegacyEdgeLevel, OPTIONAL
111 IN UINT16 *ProtectedMask, OPTIONAL
112 IN UINT16 *ProtectedEdgeLevel OPTIONAL
113 );
114
115 /**
116 Sets the mode of the PICs.
117
118 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
119 @param[in] Mode 16-bit real or 32-bit protected mode.
120 @param[in] Mask The value with which to set the interrupt mask.
121 @param[in] EdgeLevel The value with which to set the edge/level mask.
122
123 @retval EFI_SUCCESS The mode was set successfully.
124 @retval EFI_INVALID_PARAMETER The mode was not set.
125
126 **/
127 EFI_STATUS
128 EFIAPI
129 Interrupt8259SetMode (
130 IN EFI_LEGACY_8259_PROTOCOL *This,
131 IN EFI_8259_MODE Mode,
132 IN UINT16 *Mask, OPTIONAL
133 IN UINT16 *EdgeLevel OPTIONAL
134 );
135
136 /**
137 Translates the IRQ into a vector.
138
139 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
140 @param[in] Irq IRQ0-IRQ15.
141 @param[out] Vector The vector that is assigned to the IRQ.
142
143 @retval EFI_SUCCESS The Vector that matches Irq was returned.
144 @retval EFI_INVALID_PARAMETER Irq is not valid.
145
146 **/
147 EFI_STATUS
148 EFIAPI
149 Interrupt8259GetVector (
150 IN EFI_LEGACY_8259_PROTOCOL *This,
151 IN EFI_8259_IRQ Irq,
152 OUT UINT8 *Vector
153 );
154
155 /**
156 Enables the specified IRQ.
157
158 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
159 @param[in] Irq IRQ0-IRQ15.
160 @param[in] LevelTriggered 0 = Edge triggered; 1 = Level triggered.
161
162 @retval EFI_SUCCESS The Irq was enabled on the 8259 PIC.
163 @retval EFI_INVALID_PARAMETER The Irq is not valid.
164
165 **/
166 EFI_STATUS
167 EFIAPI
168 Interrupt8259EnableIrq (
169 IN EFI_LEGACY_8259_PROTOCOL *This,
170 IN EFI_8259_IRQ Irq,
171 IN BOOLEAN LevelTriggered
172 );
173
174 /**
175 Disables the specified IRQ.
176
177 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
178 @param[in] Irq IRQ0-IRQ15.
179
180 @retval EFI_SUCCESS The Irq was disabled on the 8259 PIC.
181 @retval EFI_INVALID_PARAMETER The Irq is not valid.
182
183 **/
184 EFI_STATUS
185 EFIAPI
186 Interrupt8259DisableIrq (
187 IN EFI_LEGACY_8259_PROTOCOL *This,
188 IN EFI_8259_IRQ Irq
189 );
190
191 /**
192 Reads the PCI configuration space to get the interrupt number that is assigned to the card.
193
194 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
195 @param[in] PciHandle PCI function for which to return the vector.
196 @param[out] Vector IRQ number that corresponds to the interrupt line.
197
198 @retval EFI_SUCCESS The interrupt line value was read successfully.
199
200 **/
201 EFI_STATUS
202 EFIAPI
203 Interrupt8259GetInterruptLine (
204 IN EFI_LEGACY_8259_PROTOCOL *This,
205 IN EFI_HANDLE PciHandle,
206 OUT UINT8 *Vector
207 );
208
209 /**
210 Issues the End of Interrupt (EOI) commands to PICs.
211
212 @param[in] This Indicates the EFI_LEGACY_8259_PROTOCOL instance.
213 @param[in] Irq The interrupt for which to issue the EOI command.
214
215 @retval EFI_SUCCESS The EOI command was issued.
216 @retval EFI_INVALID_PARAMETER The Irq is not valid.
217
218 **/
219 EFI_STATUS
220 EFIAPI
221 Interrupt8259EndOfInterrupt (
222 IN EFI_LEGACY_8259_PROTOCOL *This,
223 IN EFI_8259_IRQ Irq
224 );
225
226 #endif