/* * VideoPort driver * * Copyright (C) 2002, 2003, 2004 ReactOS Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ #include "videoprt.h" #include #define NDEBUG #include /* PRIVATE FUNCTIONS **********************************************************/ BOOLEAN NTAPI IntVideoPortInterruptRoutine( IN struct _KINTERRUPT *Interrupt, IN PVOID ServiceContext) { PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = ServiceContext; ASSERT(DeviceExtension->DriverExtension->InitializationData.HwInterrupt != NULL); return DeviceExtension->DriverExtension->InitializationData.HwInterrupt( &DeviceExtension->MiniPortDeviceExtension); } BOOLEAN NTAPI IntVideoPortSetupInterrupt( IN PDEVICE_OBJECT DeviceObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PVIDEO_PORT_CONFIG_INFO ConfigInfo) { NTSTATUS Status; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; /* * MSDN documentation for VIDEO_PORT_CONFIG_INFO states: "If a miniport driver's * HwVidFindAdapter function finds that the video adapter does not generate * interrupts or that it cannot determine a valid interrupt vector/level for * the adapter, HwVidFindAdapter should set both BusInterruptVector and * BusInterruptLevel to zero. */ if (DriverExtension->InitializationData.HwInterrupt != NULL && (ConfigInfo->BusInterruptLevel != 0 || ConfigInfo->BusInterruptVector != 0)) { ULONG InterruptVector; KIRQL Irql; KAFFINITY Affinity; InterruptVector = HalGetInterruptVector( ConfigInfo->AdapterInterfaceType, ConfigInfo->SystemIoBusNumber, ConfigInfo->BusInterruptLevel, ConfigInfo->BusInterruptVector, &Irql, &Affinity); if (InterruptVector == 0) { WARN_(VIDEOPRT, "HalGetInterruptVector failed\n"); return FALSE; } KeInitializeSpinLock(&DeviceExtension->InterruptSpinLock); Status = IoConnectInterrupt( &DeviceExtension->InterruptObject, IntVideoPortInterruptRoutine, DeviceExtension, &DeviceExtension->InterruptSpinLock, InterruptVector, Irql, Irql, ConfigInfo->InterruptMode, DeviceExtension->InterruptShared, Affinity, FALSE); if (!NT_SUCCESS(Status)) { WARN_(VIDEOPRT, "IoConnectInterrupt failed with status 0x%08x\n", Status); return FALSE; } } return TRUE; } /* PUBLIC FUNCTIONS ***********************************************************/ /* * @implemented */ VP_STATUS NTAPI VideoPortEnableInterrupt(IN PVOID HwDeviceExtension) { #ifndef _M_AMD64 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; BOOLEAN InterruptValid; /* Get the device extension */ DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); /* Fail if the driver didn't register an ISR */ if (!DeviceExtension->DriverExtension->InitializationData.HwInterrupt) { /* No ISR, no interrupts */ return ERROR_INVALID_FUNCTION; } /* Re-enable the interrupt and return */ InterruptValid = HalEnableSystemInterrupt(DeviceExtension->InterruptVector, 0, DeviceExtension->InterruptLevel); /* Make sure the interrupt was valid */ ASSERT(InterruptValid == TRUE); /* Return to caller */ return NO_ERROR; #else /* FIXME: Function still present? If so what to use instead of HalEnableSystemInterrupt? */ UNIMPLEMENTED; return ERROR_INVALID_FUNCTION; #endif } /* * @implemented */ VP_STATUS NTAPI VideoPortDisableInterrupt(IN PVOID HwDeviceExtension) { #ifndef _M_AMD64 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; /* Get the device extension */ DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); /* Fail if the driver didn't register an ISR */ if (!DeviceExtension->DriverExtension->InitializationData.HwInterrupt) { /* No ISR, no interrupts */ return ERROR_INVALID_FUNCTION; } /* Disable the interrupt and return */ HalDisableSystemInterrupt(DeviceExtension->InterruptVector, 0); return NO_ERROR; #else /* FIXME: Function still present? If so what to use instead of HalDisableSystemInterrupt? */ UNIMPLEMENTED; return ERROR_INVALID_FUNCTION; #endif }