1 /* $Id: pnpdma.c,v 1.9 2004/10/23 17:32:51 navaraf Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/pnpmgr.c
6 * PURPOSE: PnP manager DMA routines
7 * PROGRAMMER: Filip Navara (xnavara@volny.cz)
9 * 22/09/2003 FiN Created
12 /* INCLUDES ******************************************************************/
16 #include <internal/debug.h>
20 #include <ole32/guiddef.h>
22 #include <ddk/wdmguid.h>
24 typedef struct _DMA_ADAPTER_INTERNAL
{
27 PDMA_OPERATIONS DmaOperations
;
28 PADAPTER_OBJECT HalAdapter
;
29 } DMA_ADAPTER_INTERNAL
, *PDMA_ADAPTER_INTERNAL
;
31 /* FUNCTIONS *****************************************************************/
35 PDMA_ADAPTER DmaAdapter
)
37 DPRINT("IopPutDmaAdapter\n");
38 ExFreePool(DmaAdapter
);
43 IopAllocateCommonBuffer(
44 IN PDMA_ADAPTER DmaAdapter
,
46 OUT PPHYSICAL_ADDRESS LogicalAddress
,
47 IN BOOLEAN CacheEnabled
)
49 DPRINT("IopAllocateCommonBuffer\n");
50 return HalAllocateCommonBuffer(
51 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
52 Length
, LogicalAddress
, CacheEnabled
);
58 IN PDMA_ADAPTER DmaAdapter
,
60 IN PHYSICAL_ADDRESS LogicalAddress
,
61 IN PVOID VirtualAddress
,
62 IN BOOLEAN CacheEnabled
)
64 DPRINT("IopFreeCommonBuffer\n");
66 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
67 Length
, LogicalAddress
, VirtualAddress
, CacheEnabled
);
72 IopAllocateAdapterChannel(
73 IN PDMA_ADAPTER DmaAdapter
,
74 IN PDEVICE_OBJECT DeviceObject
,
75 IN ULONG NumberOfMapRegisters
,
76 IN PDRIVER_CONTROL ExecutionRoutine
,
79 DPRINT("IopAllocateAdapterChannel\n");
80 return IoAllocateAdapterChannel(
81 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
82 DeviceObject
, NumberOfMapRegisters
, ExecutionRoutine
, Context
);
87 IopFlushAdapterBuffers(
88 IN PDMA_ADAPTER DmaAdapter
,
90 IN PVOID MapRegisterBase
,
93 IN BOOLEAN WriteToDevice
)
95 DPRINT("IopFlushAdapterBuffers\n");
96 return IoFlushAdapterBuffers(
97 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
98 Mdl
, MapRegisterBase
, CurrentVa
, Length
, WriteToDevice
);
103 IopFreeAdapterChannel(
104 IN PDMA_ADAPTER DmaAdapter
)
106 DPRINT("IopFreeAdapterChannel\n");
107 IoFreeAdapterChannel(((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
);
113 IN PDMA_ADAPTER DmaAdapter
,
114 PVOID MapRegisterBase
,
115 ULONG NumberOfMapRegisters
)
117 DPRINT("IopFreeMapRegisters\n");
119 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
120 MapRegisterBase
, NumberOfMapRegisters
);
126 IN PDMA_ADAPTER DmaAdapter
,
128 IN PVOID MapRegisterBase
,
130 IN OUT PULONG Length
,
131 IN BOOLEAN WriteToDevice
)
133 DPRINT("IopMapTransfer\n");
134 return IoMapTransfer(
135 ((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
,
136 Mdl
, MapRegisterBase
, CurrentVa
, Length
, WriteToDevice
);
142 IN PDMA_ADAPTER DmaAdapter
)
144 DPRINT("IopGetDmaAlignment\n");
145 /* FIXME: This is actually true only on i386 and Amd64 */
152 IN PDMA_ADAPTER DmaAdapter
)
154 DPRINT("IopReadDmaCounter\n");
155 return HalReadDmaCounter(((PDMA_ADAPTER_INTERNAL
)DmaAdapter
)->HalAdapter
);
160 IopGetScatterGatherList(
161 IN PDMA_ADAPTER DmaAdapter
,
162 IN PDEVICE_OBJECT DeviceObject
,
166 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
168 IN BOOLEAN WriteToDevice
)
170 DPRINT("IopGetScatterGatherList\n");
172 return STATUS_UNSUCCESSFUL
;
177 IopPutScatterGatherList(
178 IN PDMA_ADAPTER DmaAdapter
,
179 IN PSCATTER_GATHER_LIST ScatterGather
,
180 IN BOOLEAN WriteToDevice
)
192 IN PDEVICE_OBJECT PhysicalDeviceObject
,
193 IN PDEVICE_DESCRIPTION DeviceDescription
,
194 IN OUT PULONG NumberOfMapRegisters
)
196 static DMA_OPERATIONS HalDmaOperations
= {
197 sizeof(DMA_OPERATIONS
),
199 IopAllocateCommonBuffer
,
201 IopAllocateAdapterChannel
,
202 IopFlushAdapterBuffers
,
203 IopFreeAdapterChannel
,
208 IopGetScatterGatherList
,
209 IopPutScatterGatherList
213 BUS_INTERFACE_STANDARD BusInterface
;
214 IO_STATUS_BLOCK IoStatusBlock
;
215 IO_STACK_LOCATION Stack
;
216 DEVICE_DESCRIPTION PrivateDeviceDescription
;
217 PDMA_ADAPTER Result
= NULL
;
218 PDMA_ADAPTER_INTERNAL ResultInternal
= NULL
;
219 PADAPTER_OBJECT HalAdapter
;
221 DPRINT("IoGetDmaAdapter called\n");
224 * Try to create DMA adapter through bus driver
226 if (PhysicalDeviceObject
!= NULL
)
228 if (DeviceDescription
->InterfaceType
== 0x0F /*PNPBus*/ ||
229 DeviceDescription
->InterfaceType
== 0xFFFFFFFF)
231 RtlCopyMemory(&PrivateDeviceDescription
, DeviceDescription
,
232 sizeof(DEVICE_DESCRIPTION
));
233 Status
= IoGetDeviceProperty(PhysicalDeviceObject
,
234 DevicePropertyLegacyBusType
, sizeof(INTERFACE_TYPE
),
235 &PrivateDeviceDescription
.InterfaceType
, &ResultLength
);
236 if (!NT_SUCCESS(Status
))
238 PrivateDeviceDescription
.InterfaceType
= Internal
;
240 DeviceDescription
= &PrivateDeviceDescription
;
243 Stack
.Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
244 Stack
.Parameters
.QueryInterface
.Version
= 1;
245 Stack
.Parameters
.QueryInterface
.Interface
= (PINTERFACE
)&BusInterface
;
246 Stack
.Parameters
.QueryInterface
.InterfaceType
=
247 &GUID_BUS_INTERFACE_STANDARD
;
248 Status
= IopInitiatePnpIrp(PhysicalDeviceObject
, &IoStatusBlock
,
249 IRP_MN_QUERY_INTERFACE
, &Stack
);
250 if (NT_SUCCESS(Status
))
252 Result
= BusInterface
.GetDmaAdapter(BusInterface
.Context
,
253 DeviceDescription
, NumberOfMapRegisters
);
254 BusInterface
.InterfaceDereference(BusInterface
.Context
);
264 HalAdapter
= HalGetAdapter(DeviceDescription
, NumberOfMapRegisters
);
265 if (HalAdapter
== NULL
)
268 ResultInternal
= ExAllocatePool(PagedPool
, sizeof(DMA_ADAPTER_INTERNAL
));
269 if (ResultInternal
== NULL
)
272 ResultInternal
->Version
= DEVICE_DESCRIPTION_VERSION
;
273 ResultInternal
->Size
= sizeof(DMA_ADAPTER
);
274 ResultInternal
->DmaOperations
= &HalDmaOperations
;
275 ResultInternal
->HalAdapter
= HalAdapter
;
277 return (PDMA_ADAPTER
)ResultInternal
;