NTSTATUS
NTAPI
HDA_TransferCodecVerbs(
-IN PVOID _context,
-IN ULONG Count,
-IN OUT PHDAUDIO_CODEC_TRANSFER CodecTransfer,
-IN PHDAUDIO_TRANSFER_COMPLETE_CALLBACK Callback,
-IN PVOID Context)
+ IN PVOID _context,
+ IN ULONG Count,
+ IN OUT PHDAUDIO_CODEC_TRANSFER CodecTransfer,
+ IN PHDAUDIO_TRANSFER_COMPLETE_CALLBACK Callback,
+ IN PVOID Context)
{
- UNIMPLEMENTED;
- ASSERT(FALSE);
- return STATUS_NOT_IMPLEMENTED;
+ ULONG Verbs[MAX_CODEC_RESPONSES], Responses[MAX_CODEC_RESPONSES];
+ ULONG Index;
+ PHDA_PDO_DEVICE_EXTENSION DeviceExtension;
+
+ DPRINT1("HDA_TransferCodecVerbs Coun %lu CodecTransfer %p Callback %p Context %p\n", Count, CodecTransfer, Callback, Context);
+
+ /* get device extension */
+ DeviceExtension = (PHDA_PDO_DEVICE_EXTENSION)_context;
+ ASSERT(DeviceExtension->IsFDO == FALSE);
+
+ /* FIXME handle callback*/
+ ASSERT(Callback == NULL);
+
+ for (Index = 0; Index < Count; Index++)
+ {
+ Verbs[Index] = CodecTransfer[Index].Output.Command;
+ }
+
+ HDA_SendVerbs(DeviceExtension->FDO, DeviceExtension->Codec, Verbs, Responses, Count);
+
+ for (Index = 0; Index < DeviceExtension->Codec->ResponseCount; Index++)
+ {
+ CodecTransfer[Index].Input.Response = DeviceExtension->Codec->Responses[Index];
+ }
+ return STATUS_SUCCESS;
}
NTSTATUS
*FunctionGroupStartNode = DeviceExtension->AudioGroup->NodeId;
}
+NTSTATUS
+NTAPI
+HDA_AllocateDmaBufferWithNotification(
+ IN PVOID _context,
+ IN HANDLE Handle,
+ IN ULONG NotificationCount,
+ IN SIZE_T RequestedBufferSize,
+ OUT PMDL *BufferMdl,
+ OUT PSIZE_T AllocatedBufferSize,
+ OUT PSIZE_T OffsetFromFirstPage,
+ OUT PUCHAR StreamId,
+ OUT PULONG FifoSize)
+{
+ UNIMPLEMENTED;
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+
+}
+NTSTATUS
+NTAPI
+HDA_FreeDmaBufferWithNotification(
+ IN PVOID _context,
+ IN HANDLE Handle,
+ IN PMDL BufferMdl,
+ IN SIZE_T BufferSize)
+{
+ UNIMPLEMENTED;
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+
+}
+
+NTSTATUS
+NTAPI
+HDA_RegisterNotificationEvent(
+ PVOID _context,
+ HANDLE Handle,
+ IN PKEVENT NotificationEvent)
+{
+ UNIMPLEMENTED;
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+
+}
+
+NTSTATUS
+NTAPI
+HDA_UnregisterNotificationEvent(
+ IN PVOID _context,
+ IN HANDLE Handle,
+ IN PKEVENT NotificationEvent)
+{
+ UNIMPLEMENTED;
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
NTSTATUS
HDA_PDOHandleQueryInterface(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PIO_STACK_LOCATION IoStack;
- PHDAUDIO_BUS_INTERFACE InterfaceHDA;
+ PHDAUDIO_BUS_INTERFACE_V2 InterfaceHDA;
PHDA_PDO_DEVICE_EXTENSION DeviceExtension;
/* get device extension */
if (IsEqualGUIDAligned(*IoStack->Parameters.QueryInterface.InterfaceType, GUID_HDAUDIO_BUS_INTERFACE))
{
- InterfaceHDA = (PHDAUDIO_BUS_INTERFACE)IoStack->Parameters.QueryInterface.Interface;
+ InterfaceHDA = (PHDAUDIO_BUS_INTERFACE_V2)IoStack->Parameters.QueryInterface.Interface;
InterfaceHDA->Version = IoStack->Parameters.QueryInterface.Version;
- InterfaceHDA->Size = IoStack->Parameters.QueryInterface.Size;
+ InterfaceHDA->Size = sizeof(HDAUDIO_BUS_INTERFACE);
InterfaceHDA->Context = DeviceExtension;
+ InterfaceHDA->InterfaceReference = HDA_InterfaceReference;
+ InterfaceHDA->InterfaceDereference = HDA_InterfaceDereference;
InterfaceHDA->TransferCodecVerbs = HDA_TransferCodecVerbs;
InterfaceHDA->AllocateCaptureDmaEngine = HDA_AllocateCaptureDmaEngine;
InterfaceHDA->UnregisterEventCallback = HDA_UnregisterEventCallback;
InterfaceHDA->GetDeviceInformation = HDA_GetDeviceInformation;
InterfaceHDA->GetResourceInformation = HDA_GetResourceInformation;
-
return STATUS_SUCCESS;
}
+ else if (IsEqualGUIDAligned(*IoStack->Parameters.QueryInterface.InterfaceType, GUID_HDAUDIO_BUS_INTERFACE_V2))
+ {
+ InterfaceHDA = (PHDAUDIO_BUS_INTERFACE_V2)IoStack->Parameters.QueryInterface.Interface;
+ InterfaceHDA->Version = IoStack->Parameters.QueryInterface.Version;
+ InterfaceHDA->Size = sizeof(HDAUDIO_BUS_INTERFACE_V2);
+ InterfaceHDA->Context = DeviceExtension;
+ InterfaceHDA->InterfaceReference = HDA_InterfaceReference;
+ InterfaceHDA->InterfaceDereference = HDA_InterfaceDereference;
+
+ InterfaceHDA->TransferCodecVerbs = HDA_TransferCodecVerbs;
+ InterfaceHDA->AllocateCaptureDmaEngine = HDA_AllocateCaptureDmaEngine;
+ InterfaceHDA->AllocateRenderDmaEngine = HDA_AllocateRenderDmaEngine;
+ InterfaceHDA->ChangeBandwidthAllocation = HDA_ChangeBandwidthAllocation;
+ InterfaceHDA->AllocateDmaBuffer = HDA_AllocateDmaBuffer;
+ InterfaceHDA->FreeDmaBuffer = HDA_FreeDmaBuffer;
+ InterfaceHDA->FreeDmaEngine = HDA_FreeDmaEngine;
+ InterfaceHDA->SetDmaEngineState = HDA_SetDmaEngineState;
+ InterfaceHDA->GetWallClockRegister = HDA_GetWallClockRegister;
+ InterfaceHDA->GetLinkPositionRegister = HDA_GetLinkPositionRegister;
+ InterfaceHDA->RegisterEventCallback = HDA_RegisterEventCallback;
+ InterfaceHDA->UnregisterEventCallback = HDA_UnregisterEventCallback;
+ InterfaceHDA->GetDeviceInformation = HDA_GetDeviceInformation;
+ InterfaceHDA->GetResourceInformation = HDA_GetResourceInformation;
+
+ InterfaceHDA->AllocateDmaBufferWithNotification = HDA_AllocateDmaBufferWithNotification;
+ InterfaceHDA->FreeDmaBufferWithNotification = HDA_FreeDmaBufferWithNotification;
+ InterfaceHDA->RegisterNotificationEvent = HDA_RegisterNotificationEvent;
+ InterfaceHDA->UnregisterNotificationEvent = HDA_UnregisterNotificationEvent;
+ }
// FIXME
- // implement support for GUID_HDAUDIO_BUS_INTERFACE_BDL, GUID_HDAUDIO_BUS_INTERFACE_V2
+ // implement support for GUID_HDAUDIO_BUS_INTERFACE_BDL
+ UNIMPLEMENTED;
return STATUS_NOT_SUPPORTED;
}
//ChildDeviceExtension = (PHDA_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
IoStack = IoGetCurrentIrpStackLocation(Irp);
- DPRINT1("HDA_Pnp Minor: %u IsFDO%d\n", IoStack->MinorFunction, FDODeviceExtension->IsFDO);
-
if (FDODeviceExtension->IsFDO)
{
if (IoStack->MinorFunction == IRP_MN_START_DEVICE)
{
- DPRINT1("IRP_MN_START_DEVICE\n");
Status = HDA_FDOStartDevice(DeviceObject, Irp);
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS)
{
- DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS\n");
/* handle bus device relations */
if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations)
{
{
if (IoStack->MinorFunction == IRP_MN_START_DEVICE)
{
- DPRINT1("IRP_MN_START_DEVICE\n");
/* no op for pdo */
Status = STATUS_SUCCESS;
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_BUS_INFORMATION)
{
- DPRINT1("IRP_MN_QUERY_BUS_INFORMATION\n");
/* query bus information */
Status = HDA_PDOQueryBusInformation(Irp);
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE)
{
- DPRINT1("IRP_MN_QUERY_PNP_DEVICE_STATE\n");
/* query pnp state */
Status = HDA_PDOQueryBusDevicePnpState(Irp);
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS)
{
- DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS\n");
if (IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation)
{
/* handle target device relations */
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_CAPABILITIES)
{
- DPRINT1("IRP_MN_QUERY_CAPABILITIES\n");
/* query capabilities */
Status = HDA_PDOQueryBusDeviceCapabilities(Irp);
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
{
- DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
/* no op */
Status = STATUS_SUCCESS;
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCES)
{
- DPRINT1("IRP_MN_QUERY_RESOURCES\n");
/* no op */
Status = STATUS_SUCCESS;
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_ID)
{
- DPRINT1("IRP_MN_QUERY_ID\n");
Status = HDA_PDOQueryId(DeviceObject, Irp);
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_TEXT)
{
- DPRINT1("IRP_MN_QUERY_DEVICE_TEXT\n");
Status = HDA_PDOHandleQueryDeviceText(Irp);
}
else if (IoStack->MinorFunction == IRP_MN_QUERY_INTERFACE)
{
- DPRINT1("IRP_MN_QUERY_INTERFACE\n");
Status = HDA_PDOHandleQueryInterface(DeviceObject, Irp);
}
else