ReactOS 0.4.16-dev-306-g647d351
hookhal.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS PCI Bus Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/bus/pci/hookhal.c
5 * PURPOSE: HAL Bus Handler Dispatch Routine Support
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <pci.h>
12
13#define NDEBUG
14#include <debug.h>
15
16/* GLOBALS ********************************************************************/
17
20
21/* FUNCTIONS ******************************************************************/
22
30{
34
35 /* FIXME: Broken translation */
38 return TRUE;
39}
40
45{
46 PPCI_FDO_EXTENSION DeviceExtension;
48 PCI_SLOT_NUMBER PciSlot;
49 PciSlot.u.AsULONG = SlotNumber;
50
51 /* Acquire the global lock */
54
55 /* Now search for the extension */
57 while (DeviceExtension)
58 {
59 /* If we found it, break out */
60 if (DeviceExtension->BaseBus == BusNumber) break;
61
62 /* Move to the next device */
63 DeviceExtension = (PPCI_FDO_EXTENSION)DeviceExtension->List.Next;
64 }
65
66 /* Release the global lock */
69
70 /* Check if the device extension for the bus was found */
71 if (!DeviceExtension)
72 {
73 /* It wasn't, bail out */
74 DPRINT1("Pci: Could not find PCI bus FDO. Bus Number = 0x%x\n", BusNumber);
75 return NULL;
76 }
77
78 /* Acquire this device's lock */
80 KeWaitForSingleObject(&DeviceExtension->ChildListLock,
83 FALSE,
84 NULL);
85
86 /* Loop every child PDO */
87 for (PdoExtension = DeviceExtension->ChildPdoList;
90 {
91 /* Check if the function number and header data matches */
92 if ((PdoExtension->Slot.u.bits.FunctionNumber == PciSlot.u.bits.FunctionNumber) &&
93 (PdoExtension->Slot.u.bits.DeviceNumber == PciSlot.u.bits.DeviceNumber))
94 {
95 /* This is considered to be the same PDO */
96 ASSERT(PdoExtension->Slot.u.AsULONG == PciSlot.u.AsULONG);
97 break;
98 }
99 }
100
101 /* Release this device's lock */
102 KeSetEvent(&DeviceExtension->ChildListLock, IO_NO_INCREMENT, FALSE);
104
105 /* Check if we found something */
106 if (!PdoExtension)
107 {
108 /* Let the debugger know */
109 DPRINT1("Pci: Could not find PDO for device @ %x.%x.%x\n",
110 BusNumber,
111 PciSlot.u.bits.DeviceNumber,
112 PciSlot.u.bits.FunctionNumber);
113 }
114
115 /* If the search found something, this is non-NULL, otherwise it's NULL */
116 return PdoExtension;
117}
118
120NTAPI
129{
132 PCI_COMMON_HEADER PciData;
135 PDEVICE_OBJECT ExistingDeviceObject;
136 PAGED_CODE();
139
140 /* Assume no resources */
142
143 /* Find the PDO for this slot and make sure it exists and is started */
146 if (PdoExtension->DeviceState == PciNotStarted) return STATUS_INVALID_OWNER;
147
148 /* Acquire the global lock while we attempt to assign resources */
151 do
152 {
153 /* Make sure we're not on the PDO for some reason */
154 ASSERT(DeviceObject != PdoExtension->PhysicalDeviceObject);
155
156 /* Read the PCI header and cache the routing information */
159 BusNumber,
161 PciData.u.type0.InterruptLine,
162 PciData.u.type0.InterruptPin,
163 PciData.BaseClass,
164 PciData.SubClass,
165 PdoExtension->ParentFdoExtension->
168 &ExistingDeviceObject);
169 if (NT_SUCCESS(Status))
170 {
171 /* Manually build the requirements for this device, and mark it legacy */
173 &PciData,
175 PdoExtension->LegacyDriver = TRUE;
176 if (NT_SUCCESS(Status))
177 {
178 /* Now call the legacy Pnp function to actually assign resources */
184 &Resources);
185 if (NT_SUCCESS(Status))
186 {
187 /* Resources are ready, so enable all decodes */
188 PdoExtension->CommandEnables |= (PCI_ENABLE_IO_SPACE |
191
192 /* Compute new resource settings based on what PnP assigned */
194
195 /* Set these new resources on the device */
197 if (NT_SUCCESS(Status))
198 {
199 /* Some work needs to happen here to handle this */
200 ASSERT(Resources->Count == 1);
201 //ASSERT(PartialList->Count > 0);
202
204
205 /* Return the allocated resources, and success */
207 Resources = NULL;
209 }
210 }
211 else
212 {
213 /* If assignment failed, no resources should exist */
215 }
216
217 /* If assignment succeed, then we are done */
218 if (NT_SUCCESS(Status)) break;
219 }
220
221 /* Otherwise, cache the new routing */
222 PciCacheLegacyDeviceRouting(ExistingDeviceObject,
223 BusNumber,
225 PciData.u.type0.InterruptLine,
226 PciData.u.type0.InterruptPin,
227 PciData.BaseClass,
228 PciData.SubClass,
229 PdoExtension->ParentFdoExtension->
232 NULL);
233 }
234 } while (0);
235
236 /* Release the lock */
239
240 /* Free any temporary resource data and return the status */
243 return Status;
244}
245
246VOID
247NTAPI
249{
250 /* Save the old HAL routines */
255
256 /* Take over the HAL's Bus Handler functions */
257// HalPciAssignSlotResources = PciAssignSlotResources;
259}
260
261/* EOF */
#define PAGED_CODE()
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
SINGLE_LIST_ENTRY PciFdoExtensionListHead
Definition: fdo.c:18
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS NTAPI PciSetResources(IN PPCI_PDO_EXTENSION PdoExtension, IN BOOLEAN DoReset, IN BOOLEAN SomethingSomethingDarkSide)
Definition: enum.c:2155
NTSTATUS NTAPI PciBuildRequirementsList(IN PPCI_PDO_EXTENSION PdoExtension, IN PPCI_COMMON_HEADER PciData, OUT PIO_RESOURCE_REQUIREMENTS_LIST *Buffer)
Definition: enum.c:551
BOOLEAN NTAPI PciComputeNewCurrentSettings(IN PPCI_PDO_EXTENSION PdoExtension, IN PCM_RESOURCE_LIST ResourceList)
Definition: enum.c:55
KEVENT PciGlobalLock
Definition: init.c:20
@ PciNotStarted
Definition: pci.h:129
VOID NTAPI PciReadDeviceConfig(IN PPCI_PDO_EXTENSION DeviceExtension, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: config.c:107
struct _PCI_FDO_EXTENSION * PPCI_FDO_EXTENSION
@ PdoExtension
Definition: precomp.h:49
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
Status
Definition: gdiplustypes.h:25
pHalTranslateBusAddress PcipSavedTranslateBusAddress
Definition: hookhal.c:18
PPCI_PDO_EXTENSION NTAPI PciFindPdoByLocation(IN ULONG BusNumber, IN ULONG SlotNumber)
Definition: hookhal.c:43
NTSTATUS NTAPI PciAssignSlotResources(IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources)
Definition: hookhal.c:121
pHalAssignSlotResources PcipSavedAssignSlotResources
Definition: hookhal.c:19
BOOLEAN NTAPI PciTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress)
Definition: hookhal.c:25
VOID NTAPI PciHookHal(VOID)
Definition: hookhal.c:248
@ PCIBus
Definition: hwresource.cpp:142
enum _INTERFACE_TYPE INTERFACE_TYPE
NTSTATUS NTAPI IoAssignResources(_In_ PUNICODE_STRING RegistryPath, _In_opt_ PUNICODE_STRING DriverClassName, _In_ PDRIVER_OBJECT DriverObject, _In_opt_ PDEVICE_OBJECT DeviceObject, _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, _Inout_ PCM_RESOURCE_LIST *AllocatedResources)
Definition: iorsrce.c:1134
#define KeLeaveCriticalRegion()
Definition: ke_x.h:119
#define KeEnterCriticalRegion()
Definition: ke_x.h:88
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PCM_RESOURCE_LIST * AllocatedResources
Definition: ndis.h:4643
#define KernelMode
Definition: asm.h:34
#define HalPciTranslateBusAddress
Definition: halfuncs.h:41
#define HalPciAssignSlotResources
Definition: halfuncs.h:42
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
#define STATUS_DEVICE_DOES_NOT_EXIST
Definition: ntstatus.h:428
#define STATUS_INVALID_OWNER
Definition: ntstatus.h:326
NTSTATUS NTAPI PciCacheLegacyDeviceRouting(IN PDEVICE_OBJECT DeviceObject, IN ULONG BusNumber, IN ULONG SlotNumber, IN UCHAR InterruptLine, IN UCHAR InterruptPin, IN UCHAR BaseClass, IN UCHAR SubClass, IN PDEVICE_OBJECT PhysicalDeviceObject, IN PPCI_PDO_EXTENSION PdoExtension, OUT PDEVICE_OBJECT *pFoundDeviceObject)
Definition: routintf.c:70
#define STATUS_SUCCESS
Definition: shellext.h:65
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
SINGLE_LIST_ENTRY List
Definition: pci.h:194
struct _PCI_PDO_EXTENSION * ChildPdoList
Definition: pci.h:204
BOOLEAN BaseBus
Definition: pci.h:211
KEVENT ChildListLock
Definition: pci.h:203
union _PCI_SLOT_NUMBER::@4023 u
struct _PCI_SLOT_NUMBER::@4023::@4024 bits
struct _SINGLE_LIST_ENTRY * Next
Definition: ntbasedef.h:637
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
LONGLONG QuadPart
Definition: typedefs.h:114
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
Definition: wdffdo.h:463
_In_ WDFIORESREQLIST RequirementsList
Definition: wdfresource.h:65
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
_In_opt_ PUNICODE_STRING DriverClassName
Definition: halfuncs.h:156
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
Definition: halfuncs.h:160
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE BusType
Definition: halfuncs.h:159
NTSTATUS(NTAPI * pHalAssignSlotResources)(_In_ PUNICODE_STRING RegistryPath, _In_opt_ PUNICODE_STRING DriverClassName, _In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT DeviceObject, _In_ INTERFACE_TYPE BusType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _Inout_ PCM_RESOURCE_LIST *AllocatedResources)
Definition: haltypes.h:169
BOOLEAN(NTAPI * pHalTranslateBusAddress)(_In_ INTERFACE_TYPE InterfaceType, _In_ ULONG BusNumber, _In_ PHYSICAL_ADDRESS BusAddress, _Inout_ PULONG AddressSpace, _Out_ PPHYSICAL_ADDRESS TranslatedAddress)
Definition: haltypes.h:161
_In_ ULONG _In_ PHYSICAL_ADDRESS BusAddress
Definition: iofuncs.h:2273
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG _Out_ PPHYSICAL_ADDRESS TranslatedAddress
Definition: iofuncs.h:2275
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2274
#define PCI_ENABLE_BUS_MASTER
Definition: iotypes.h:3618
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define PCI_ENABLE_IO_SPACE
Definition: iotypes.h:3616
#define PCI_ENABLE_MEMORY_SPACE
Definition: iotypes.h:3617
#define PCI_COMMON_HDR_LENGTH
Definition: iotypes.h:3594
@ Executive
Definition: ketypes.h:415