3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/pnpdma.c
6 * PURPOSE: PnP manager DMA routines
8 * PROGRAMMERS: Filip Navara (xnavara@volny.cz)
11 /* INCLUDES ******************************************************************/
15 #include <internal/debug.h>
16 #include <ddk/wdmguid.h>
18 typedef struct _DMA_ADAPTER_INTERNAL
{
21 PDMA_OPERATIONS DmaOperations
;
22 PADAPTER_OBJECT HalAdapter
;
23 } DMA_ADAPTER_INTERNAL
, *PDMA_ADAPTER_INTERNAL
;
25 /* FUNCTIONS *****************************************************************/
30 PDMA_ADAPTER DmaAdapter
)
32 DPRINT("IopPutDmaAdapter\n");
33 ExFreePool(DmaAdapter
);
39 IopAllocateCommonBuffer(
40 IN PDMA_ADAPTER DmaAdapter
,
42 OUT PPHYSICAL_ADDRESS LogicalAddress
,
43 IN BOOLEAN CacheEnabled
)
45 DPRINT("IopAllocateCommonBuffer\n");
46 return HalAllocateCommonBuffer(
47 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
48 Length
, LogicalAddress
, CacheEnabled
);
55 IN PDMA_ADAPTER DmaAdapter
,
57 IN PHYSICAL_ADDRESS LogicalAddress
,
58 IN PVOID VirtualAddress
,
59 IN BOOLEAN CacheEnabled
)
61 DPRINT("IopFreeCommonBuffer\n");
63 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
64 Length
, LogicalAddress
, VirtualAddress
, CacheEnabled
);
70 IopAllocateAdapterChannel(
71 IN PDMA_ADAPTER DmaAdapter
,
72 IN PDEVICE_OBJECT DeviceObject
,
73 IN ULONG NumberOfMapRegisters
,
74 IN PDRIVER_CONTROL ExecutionRoutine
,
77 DPRINT("IopAllocateAdapterChannel\n");
78 return IoAllocateAdapterChannel(
79 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
80 DeviceObject
, NumberOfMapRegisters
, ExecutionRoutine
, Context
);
86 IopFlushAdapterBuffers(
87 IN PDMA_ADAPTER DmaAdapter
,
89 IN PVOID MapRegisterBase
,
92 IN BOOLEAN WriteToDevice
)
94 DPRINT("IopFlushAdapterBuffers\n");
95 return IoFlushAdapterBuffers(
96 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
97 Mdl
, MapRegisterBase
, CurrentVa
, Length
, WriteToDevice
);
103 IopFreeAdapterChannel(
104 IN PDMA_ADAPTER DmaAdapter
)
106 DPRINT("IopFreeAdapterChannel\n");
107 IoFreeAdapterChannel(((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
);
114 IN PDMA_ADAPTER DmaAdapter
,
115 PVOID MapRegisterBase
,
116 ULONG NumberOfMapRegisters
)
118 DPRINT("IopFreeMapRegisters\n");
120 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
121 MapRegisterBase
, NumberOfMapRegisters
);
128 IN PDMA_ADAPTER DmaAdapter
,
130 IN PVOID MapRegisterBase
,
132 IN OUT PULONG Length
,
133 IN BOOLEAN WriteToDevice
)
135 DPRINT("IopMapTransfer\n");
136 return IoMapTransfer(
137 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
138 Mdl
, MapRegisterBase
, CurrentVa
, Length
, WriteToDevice
);
145 IN PDMA_ADAPTER DmaAdapter
)
147 DPRINT("IopGetDmaAlignment\n");
148 /* FIXME: This is actually true only on i386 and Amd64 */
156 IN PDMA_ADAPTER DmaAdapter
)
158 DPRINT("IopReadDmaCounter\n");
159 return HalReadDmaCounter(((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
);
165 IopGetScatterGatherList(
166 IN PDMA_ADAPTER DmaAdapter
,
167 IN PDEVICE_OBJECT DeviceObject
,
171 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
173 IN BOOLEAN WriteToDevice
)
175 DPRINT("IopGetScatterGatherList\n");
177 return STATUS_UNSUCCESSFUL
;
183 IopPutScatterGatherList(
184 IN PDMA_ADAPTER DmaAdapter
,
185 IN PSCATTER_GATHER_LIST ScatterGather
,
186 IN BOOLEAN WriteToDevice
)
188 DPRINT("IopPutScatterGatherList\n");
198 IN PDEVICE_OBJECT PhysicalDeviceObject
,
199 IN PDEVICE_DESCRIPTION DeviceDescription
,
200 IN OUT PULONG NumberOfMapRegisters
)
202 static DMA_OPERATIONS HalDmaOperations
= {
203 sizeof(DMA_OPERATIONS
),
205 IopAllocateCommonBuffer
,
207 IopAllocateAdapterChannel
,
208 IopFlushAdapterBuffers
,
209 IopFreeAdapterChannel
,
214 IopGetScatterGatherList
,
215 IopPutScatterGatherList
219 BUS_INTERFACE_STANDARD BusInterface
;
220 IO_STATUS_BLOCK IoStatusBlock
;
221 IO_STACK_LOCATION Stack
;
222 DEVICE_DESCRIPTION PrivateDeviceDescription
;
223 PDMA_ADAPTER Result
= NULL
;
224 PDMA_ADAPTER_INTERNAL ResultInternal
= NULL
;
225 PADAPTER_OBJECT HalAdapter
;
227 DPRINT("IoGetDmaAdapter called\n");
230 * Try to create DMA adapter through bus driver
232 if (PhysicalDeviceObject
!= NULL
)
234 if (DeviceDescription
->InterfaceType
== 0x0F /*PNPBus*/ ||
235 DeviceDescription
->InterfaceType
== 0xFFFFFFFF)
237 RtlCopyMemory(&PrivateDeviceDescription
, DeviceDescription
,
238 sizeof(DEVICE_DESCRIPTION
));
239 Status
= IoGetDeviceProperty(PhysicalDeviceObject
,
240 DevicePropertyLegacyBusType
, sizeof(INTERFACE_TYPE
),
241 &PrivateDeviceDescription
.InterfaceType
, &ResultLength
);
242 if (!NT_SUCCESS(Status
))
244 PrivateDeviceDescription
.InterfaceType
= Internal
;
246 DeviceDescription
= &PrivateDeviceDescription
;
249 Stack
.Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
250 Stack
.Parameters
.QueryInterface
.Version
= 1;
251 Stack
.Parameters
.QueryInterface
.Interface
= (PINTERFACE
)&BusInterface
;
252 Stack
.Parameters
.QueryInterface
.InterfaceType
=
253 &GUID_BUS_INTERFACE_STANDARD
;
254 Status
= IopInitiatePnpIrp(PhysicalDeviceObject
, &IoStatusBlock
,
255 IRP_MN_QUERY_INTERFACE
, &Stack
);
256 if (NT_SUCCESS(Status
))
258 Result
= BusInterface
.GetDmaAdapter(BusInterface
.Context
,
259 DeviceDescription
, NumberOfMapRegisters
);
260 BusInterface
.InterfaceDereference(BusInterface
.Context
);
270 HalAdapter
= HalGetAdapter(DeviceDescription
, NumberOfMapRegisters
);
271 if (HalAdapter
== NULL
)
274 ResultInternal
= ExAllocatePool(PagedPool
, sizeof(DMA_ADAPTER_INTERNAL
));
275 if (ResultInternal
== NULL
)
278 ResultInternal
->Version
= DEVICE_DESCRIPTION_VERSION
;
279 ResultInternal
->Size
= sizeof(DMA_ADAPTER
);
280 ResultInternal
->DmaOperations
= &HalDmaOperations
;
281 ResultInternal
->HalAdapter
= HalAdapter
;
283 return (PDMA_ADAPTER
)ResultInternal
;