xref: /reactos/hal/halx86/acpi/busemul.c (revision 01e5cb0c)
1 /*
2  * PROJECT:         ReactOS HAL
3  * LICENSE:         BSD - See COPYING.ARM in the top level directory
4  * FILE:            hal/halx86/acpi/busemul.c
5  * PURPOSE:         ACPI HAL Bus Handler Emulation Code
6  * PROGRAMMERS:     ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include <hal.h>
12 #define NDEBUG
13 #include <debug.h>
14 
15 /* GLOBALS ********************************************************************/
16 
17 /* PRIVATE FUNCTIONS **********************************************************/
18 
19 INIT_FUNCTION
20 VOID
21 NTAPI
22 HalpRegisterKdSupportFunctions(VOID)
23 {
24     /* Register PCI Device Functions */
25     KdSetupPciDeviceForDebugging = HalpSetupPciDeviceForDebugging;
26     KdReleasePciDeviceforDebugging = HalpReleasePciDeviceForDebugging;
27 
28     /* Register memory functions */
29 #ifndef _MINIHAL_
30 #if (NTDDI_VERSION >= NTDDI_VISTA)
31     KdMapPhysicalMemory64 = HalpMapPhysicalMemory64Vista;
32     KdUnmapVirtualAddress = HalpUnmapVirtualAddressVista;
33 #else
34     KdMapPhysicalMemory64 = HalpMapPhysicalMemory64;
35     KdUnmapVirtualAddress = HalpUnmapVirtualAddress;
36 #endif
37 #endif
38 
39     /* Register ACPI stub */
40     KdCheckPowerButton = HalpCheckPowerButton;
41 }
42 
43 NTSTATUS
44 NTAPI
45 HalpAssignSlotResources(IN PUNICODE_STRING RegistryPath,
46                         IN PUNICODE_STRING DriverClassName,
47                         IN PDRIVER_OBJECT DriverObject,
48                         IN PDEVICE_OBJECT DeviceObject,
49                         IN INTERFACE_TYPE BusType,
50                         IN ULONG BusNumber,
51                         IN ULONG SlotNumber,
52                         IN OUT PCM_RESOURCE_LIST *AllocatedResources)
53 {
54     BUS_HANDLER BusHandler;
55     PAGED_CODE();
56 
57     /* Only PCI is supported */
58     if (BusType != PCIBus) return STATUS_NOT_IMPLEMENTED;
59 
60     /* Setup fake PCI Bus handler */
61     RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
62     BusHandler.BusNumber = BusNumber;
63 
64     /* Call the PCI function */
65     return HalpAssignPCISlotResources(&BusHandler,
66                                       &BusHandler,
67                                       RegistryPath,
68                                       DriverClassName,
69                                       DriverObject,
70                                       DeviceObject,
71                                       SlotNumber,
72                                       AllocatedResources);
73 }
74 
75 BOOLEAN
76 NTAPI
77 HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
78                         IN ULONG BusNumber,
79                         IN PHYSICAL_ADDRESS BusAddress,
80                         IN OUT PULONG AddressSpace,
81                         OUT PPHYSICAL_ADDRESS TranslatedAddress)
82 {
83     /* Translation is easy */
84     TranslatedAddress->QuadPart = BusAddress.QuadPart;
85     return TRUE;
86 }
87 
88 ULONG
89 NTAPI
90 HalpGetSystemInterruptVector_Acpi(IN ULONG BusNumber,
91                                  IN ULONG BusInterruptLevel,
92                                  IN ULONG BusInterruptVector,
93                                  OUT PKIRQL Irql,
94                                  OUT PKAFFINITY Affinity)
95 {
96     UCHAR Vector = IRQ2VECTOR((UCHAR)BusInterruptLevel);
97     *Irql = VECTOR2IRQL(Vector);
98     *Affinity = 0xFFFFFFFF;
99     return Vector;
100 }
101 
102 BOOLEAN
103 NTAPI
104 HalpFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
105                               IN OUT PULONG AddressSpace,
106                               OUT PPHYSICAL_ADDRESS TranslatedAddress,
107                               IN OUT PULONG_PTR Context,
108                               IN BOOLEAN NextBus)
109 {
110     /* Make sure we have a context */
111     if (!Context) return FALSE;
112 
113     /* If we have data in the context, then this shouldn't be a new lookup */
114     if ((*Context != 0) && (NextBus != FALSE)) return FALSE;
115 
116     /* Return bus data */
117     TranslatedAddress->QuadPart = BusAddress.QuadPart;
118 
119     /* Set context value and return success */
120     *Context = 1;
121     return TRUE;
122 }
123 
124 /* PUBLIC FUNCTIONS **********************************************************/
125 
126 /*
127  * @implemented
128  */
129 NTSTATUS
130 NTAPI
131 HalAdjustResourceList(IN OUT PIO_RESOURCE_REQUIREMENTS_LIST* pRequirementsList)
132 {
133     /* Deprecated, return success */
134     return STATUS_SUCCESS;
135 }
136 
137 /*
138  * @implemented
139  */
140 NTSTATUS
141 NTAPI
142 HalAssignSlotResources(IN PUNICODE_STRING RegistryPath,
143                        IN PUNICODE_STRING DriverClassName,
144                        IN PDRIVER_OBJECT DriverObject,
145                        IN PDEVICE_OBJECT DeviceObject,
146                        IN INTERFACE_TYPE BusType,
147                        IN ULONG BusNumber,
148                        IN ULONG SlotNumber,
149                        IN OUT PCM_RESOURCE_LIST *AllocatedResources)
150 {
151     /* Check the bus type */
152     if (BusType != PCIBus)
153     {
154         /* Call our internal handler */
155         return HalpAssignSlotResources(RegistryPath,
156                                        DriverClassName,
157                                        DriverObject,
158                                        DeviceObject,
159                                        BusType,
160                                        BusNumber,
161                                        SlotNumber,
162                                        AllocatedResources);
163     }
164     else
165     {
166         /* Call the PCI registered function */
167         return HalPciAssignSlotResources(RegistryPath,
168                                          DriverClassName,
169                                          DriverObject,
170                                          DeviceObject,
171                                          PCIBus,
172                                          BusNumber,
173                                          SlotNumber,
174                                          AllocatedResources);
175     }
176 }
177 
178 /*
179  * @implemented
180  */
181 ULONG
182 NTAPI
183 HalGetBusData(IN BUS_DATA_TYPE BusDataType,
184               IN ULONG BusNumber,
185               IN ULONG SlotNumber,
186               IN PVOID Buffer,
187               IN ULONG Length)
188 {
189     /* Call the extended function */
190     return HalGetBusDataByOffset(BusDataType,
191                                  BusNumber,
192                                  SlotNumber,
193                                  Buffer,
194                                  0,
195                                  Length);
196 }
197 
198 /*
199  * @implemented
200  */
201 ULONG
202 NTAPI
203 HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
204                       IN ULONG BusNumber,
205                       IN ULONG SlotNumber,
206                       IN PVOID Buffer,
207                       IN ULONG Offset,
208                       IN ULONG Length)
209 {
210     BUS_HANDLER BusHandler;
211 
212     /* Look as the bus type */
213     if (BusDataType == Cmos)
214     {
215         /* Call CMOS Function */
216         return HalpGetCmosData(0, SlotNumber, Buffer, Length);
217     }
218     else if (BusDataType == EisaConfiguration)
219     {
220         /* FIXME: TODO */
221         ASSERT(FALSE);
222     }
223     else if ((BusDataType == PCIConfiguration) &&
224              (HalpPCIConfigInitialized) &&
225              ((BusNumber >= HalpMinPciBus) && (BusNumber <= HalpMaxPciBus)))
226     {
227         /* Setup fake PCI Bus handler */
228         RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
229         BusHandler.BusNumber = BusNumber;
230 
231         /* Call PCI function */
232         return HalpGetPCIData(&BusHandler,
233                               &BusHandler,
234                               SlotNumber,
235                               Buffer,
236                               Offset,
237                               Length);
238     }
239 
240     /* Invalid bus */
241     return 0;
242 }
243 
244 /*
245  * @implemented
246  */
247 ULONG
248 NTAPI
249 HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
250                       IN ULONG BusNumber,
251                       IN ULONG BusInterruptLevel,
252                       IN ULONG BusInterruptVector,
253                       OUT PKIRQL Irql,
254                       OUT PKAFFINITY Affinity)
255 {
256     /* Call the system bus translator */
257     return HalpGetSystemInterruptVector_Acpi(BusNumber,
258                                              BusInterruptLevel,
259                                              BusInterruptVector,
260                                              Irql,
261                                              Affinity);
262 }
263 
264 /*
265  * @implemented
266  */
267 ULONG
268 NTAPI
269 HalSetBusData(IN BUS_DATA_TYPE BusDataType,
270               IN ULONG BusNumber,
271               IN ULONG SlotNumber,
272               IN PVOID Buffer,
273               IN ULONG Length)
274 {
275     /* Call the extended function */
276     return HalSetBusDataByOffset(BusDataType,
277                                  BusNumber,
278                                  SlotNumber,
279                                  Buffer,
280                                  0,
281                                  Length);
282 }
283 
284 /*
285  * @implemented
286  */
287 ULONG
288 NTAPI
289 HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
290                       IN ULONG BusNumber,
291                       IN ULONG SlotNumber,
292                       IN PVOID Buffer,
293                       IN ULONG Offset,
294                       IN ULONG Length)
295 {
296     BUS_HANDLER BusHandler;
297 
298     /* Look as the bus type */
299     if (BusDataType == Cmos)
300     {
301         /* Call CMOS Function */
302         return HalpSetCmosData(0, SlotNumber, Buffer, Length);
303     }
304     else if ((BusDataType == PCIConfiguration) && (HalpPCIConfigInitialized))
305     {
306         /* Setup fake PCI Bus handler */
307         RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
308         BusHandler.BusNumber = BusNumber;
309 
310         /* Call PCI function */
311         return HalpSetPCIData(&BusHandler,
312                               &BusHandler,
313                               SlotNumber,
314                               Buffer,
315                               Offset,
316                               Length);
317     }
318 
319     /* Invalid bus */
320     return 0;
321 }
322 
323 /*
324  * @implemented
325  */
326 BOOLEAN
327 NTAPI
328 HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
329                        IN ULONG BusNumber,
330                        IN PHYSICAL_ADDRESS BusAddress,
331                        IN OUT PULONG AddressSpace,
332                        OUT PPHYSICAL_ADDRESS TranslatedAddress)
333 {
334     /* Look as the bus type */
335     if (InterfaceType == PCIBus)
336     {
337         /* Call the PCI registered function */
338         return HalPciTranslateBusAddress(PCIBus,
339                                          BusNumber,
340                                          BusAddress,
341                                          AddressSpace,
342                                          TranslatedAddress);
343     }
344     else
345     {
346         /* Translation is easy */
347         TranslatedAddress->QuadPart = BusAddress.QuadPart;
348         return TRUE;
349     }
350 }
351 
352 /* EOF */
353