xref: /reactos/hal/halx86/acpi/busemul.c (revision 64e52088)
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 CODE_SEG("INIT")
20 VOID
21 NTAPI
HalpRegisterKdSupportFunctions(VOID)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
HalpAssignSlotResources(IN PUNICODE_STRING RegistryPath,IN PUNICODE_STRING DriverClassName,IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT DeviceObject,IN INTERFACE_TYPE BusType,IN ULONG BusNumber,IN ULONG SlotNumber,IN OUT PCM_RESOURCE_LIST * AllocatedResources)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
HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,IN ULONG BusNumber,IN PHYSICAL_ADDRESS BusAddress,IN OUT PULONG AddressSpace,OUT PPHYSICAL_ADDRESS TranslatedAddress)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 BOOLEAN
89 NTAPI
HalpFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,IN OUT PULONG AddressSpace,OUT PPHYSICAL_ADDRESS TranslatedAddress,IN OUT PULONG_PTR Context,IN BOOLEAN NextBus)90 HalpFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
91                               IN OUT PULONG AddressSpace,
92                               OUT PPHYSICAL_ADDRESS TranslatedAddress,
93                               IN OUT PULONG_PTR Context,
94                               IN BOOLEAN NextBus)
95 {
96     /* Make sure we have a context */
97     if (!Context) return FALSE;
98 
99     /* If we have data in the context, then this shouldn't be a new lookup */
100     if ((*Context != 0) && (NextBus != FALSE)) return FALSE;
101 
102     /* Return bus data */
103     TranslatedAddress->QuadPart = BusAddress.QuadPart;
104 
105     /* Set context value and return success */
106     *Context = 1;
107     return TRUE;
108 }
109 
110 /* PUBLIC FUNCTIONS **********************************************************/
111 
112 /*
113  * @implemented
114  */
115 NTSTATUS
116 NTAPI
HalAdjustResourceList(IN OUT PIO_RESOURCE_REQUIREMENTS_LIST * pRequirementsList)117 HalAdjustResourceList(IN OUT PIO_RESOURCE_REQUIREMENTS_LIST* pRequirementsList)
118 {
119     /* Deprecated, return success */
120     return STATUS_SUCCESS;
121 }
122 
123 /*
124  * @implemented
125  */
126 NTSTATUS
127 NTAPI
HalAssignSlotResources(IN PUNICODE_STRING RegistryPath,IN PUNICODE_STRING DriverClassName,IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT DeviceObject,IN INTERFACE_TYPE BusType,IN ULONG BusNumber,IN ULONG SlotNumber,IN OUT PCM_RESOURCE_LIST * AllocatedResources)128 HalAssignSlotResources(IN PUNICODE_STRING RegistryPath,
129                        IN PUNICODE_STRING DriverClassName,
130                        IN PDRIVER_OBJECT DriverObject,
131                        IN PDEVICE_OBJECT DeviceObject,
132                        IN INTERFACE_TYPE BusType,
133                        IN ULONG BusNumber,
134                        IN ULONG SlotNumber,
135                        IN OUT PCM_RESOURCE_LIST *AllocatedResources)
136 {
137     /* Check the bus type */
138     if (BusType != PCIBus)
139     {
140         /* Call our internal handler */
141         return HalpAssignSlotResources(RegistryPath,
142                                        DriverClassName,
143                                        DriverObject,
144                                        DeviceObject,
145                                        BusType,
146                                        BusNumber,
147                                        SlotNumber,
148                                        AllocatedResources);
149     }
150     else
151     {
152         /* Call the PCI registered function */
153         return HalPciAssignSlotResources(RegistryPath,
154                                          DriverClassName,
155                                          DriverObject,
156                                          DeviceObject,
157                                          PCIBus,
158                                          BusNumber,
159                                          SlotNumber,
160                                          AllocatedResources);
161     }
162 }
163 
164 /*
165  * @implemented
166  */
167 ULONG
168 NTAPI
HalGetBusData(IN BUS_DATA_TYPE BusDataType,IN ULONG BusNumber,IN ULONG SlotNumber,IN PVOID Buffer,IN ULONG Length)169 HalGetBusData(IN BUS_DATA_TYPE BusDataType,
170               IN ULONG BusNumber,
171               IN ULONG SlotNumber,
172               IN PVOID Buffer,
173               IN ULONG Length)
174 {
175     /* Call the extended function */
176     return HalGetBusDataByOffset(BusDataType,
177                                  BusNumber,
178                                  SlotNumber,
179                                  Buffer,
180                                  0,
181                                  Length);
182 }
183 
184 /*
185  * @implemented
186  */
187 ULONG
188 NTAPI
HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,IN ULONG BusNumber,IN ULONG SlotNumber,IN PVOID Buffer,IN ULONG Offset,IN ULONG Length)189 HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
190                       IN ULONG BusNumber,
191                       IN ULONG SlotNumber,
192                       IN PVOID Buffer,
193                       IN ULONG Offset,
194                       IN ULONG Length)
195 {
196     BUS_HANDLER BusHandler;
197 
198     /* Look as the bus type */
199     if (BusDataType == Cmos)
200     {
201         /* Call CMOS Function */
202         return HalpGetCmosData(0, SlotNumber, Buffer, Length);
203     }
204     else if (BusDataType == EisaConfiguration)
205     {
206         /* FIXME: TODO */
207         ASSERT(FALSE);
208     }
209     else if ((BusDataType == PCIConfiguration) &&
210              (HalpPCIConfigInitialized) &&
211              ((BusNumber >= HalpMinPciBus) && (BusNumber <= HalpMaxPciBus)))
212     {
213         /* Setup fake PCI Bus handler */
214         RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
215         BusHandler.BusNumber = BusNumber;
216 
217         /* Call PCI function */
218         return HalpGetPCIData(&BusHandler,
219                               &BusHandler,
220                               SlotNumber,
221                               Buffer,
222                               Offset,
223                               Length);
224     }
225 
226     /* Invalid bus */
227     return 0;
228 }
229 
230 /*
231  * @implemented
232  */
233 ULONG
234 NTAPI
HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,IN ULONG BusNumber,IN ULONG BusInterruptLevel,IN ULONG BusInterruptVector,OUT PKIRQL Irql,OUT PKAFFINITY Affinity)235 HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
236                       IN ULONG BusNumber,
237                       IN ULONG BusInterruptLevel,
238                       IN ULONG BusInterruptVector,
239                       OUT PKIRQL Irql,
240                       OUT PKAFFINITY Affinity)
241 {
242     /* Call the system bus translator */
243     return HalpGetRootInterruptVector(BusInterruptLevel,
244                                       BusInterruptVector,
245                                       Irql,
246                                       Affinity);
247 }
248 
249 /*
250  * @implemented
251  */
252 ULONG
253 NTAPI
HalSetBusData(IN BUS_DATA_TYPE BusDataType,IN ULONG BusNumber,IN ULONG SlotNumber,IN PVOID Buffer,IN ULONG Length)254 HalSetBusData(IN BUS_DATA_TYPE BusDataType,
255               IN ULONG BusNumber,
256               IN ULONG SlotNumber,
257               IN PVOID Buffer,
258               IN ULONG Length)
259 {
260     /* Call the extended function */
261     return HalSetBusDataByOffset(BusDataType,
262                                  BusNumber,
263                                  SlotNumber,
264                                  Buffer,
265                                  0,
266                                  Length);
267 }
268 
269 /*
270  * @implemented
271  */
272 ULONG
273 NTAPI
HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,IN ULONG BusNumber,IN ULONG SlotNumber,IN PVOID Buffer,IN ULONG Offset,IN ULONG Length)274 HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
275                       IN ULONG BusNumber,
276                       IN ULONG SlotNumber,
277                       IN PVOID Buffer,
278                       IN ULONG Offset,
279                       IN ULONG Length)
280 {
281     BUS_HANDLER BusHandler;
282 
283     /* Look as the bus type */
284     if (BusDataType == Cmos)
285     {
286         /* Call CMOS Function */
287         return HalpSetCmosData(0, SlotNumber, Buffer, Length);
288     }
289     else if ((BusDataType == PCIConfiguration) && (HalpPCIConfigInitialized))
290     {
291         /* Setup fake PCI Bus handler */
292         RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
293         BusHandler.BusNumber = BusNumber;
294 
295         /* Call PCI function */
296         return HalpSetPCIData(&BusHandler,
297                               &BusHandler,
298                               SlotNumber,
299                               Buffer,
300                               Offset,
301                               Length);
302     }
303 
304     /* Invalid bus */
305     return 0;
306 }
307 
308 /*
309  * @implemented
310  */
311 BOOLEAN
312 NTAPI
HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,IN ULONG BusNumber,IN PHYSICAL_ADDRESS BusAddress,IN OUT PULONG AddressSpace,OUT PPHYSICAL_ADDRESS TranslatedAddress)313 HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
314                        IN ULONG BusNumber,
315                        IN PHYSICAL_ADDRESS BusAddress,
316                        IN OUT PULONG AddressSpace,
317                        OUT PPHYSICAL_ADDRESS TranslatedAddress)
318 {
319     /* Look as the bus type */
320     if (InterfaceType == PCIBus)
321     {
322         /* Call the PCI registered function */
323         return HalPciTranslateBusAddress(PCIBus,
324                                          BusNumber,
325                                          BusAddress,
326                                          AddressSpace,
327                                          TranslatedAddress);
328     }
329     else
330     {
331         /* Translation is easy */
332         TranslatedAddress->QuadPart = BusAddress.QuadPart;
333         return TRUE;
334     }
335 }
336 
337 /* EOF */
338