You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
4.3 KiB
200 lines
4.3 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pciopregion.c
|
|
|
|
Abstract:
|
|
|
|
This module implements PCI_BUS_INTERFACE_STANDARD,
|
|
which allows the PCI driver to get utility functions
|
|
from its parent.
|
|
|
|
Author:
|
|
|
|
Jake Oshins (jakeo) 11-14-97
|
|
|
|
Environment:
|
|
|
|
NT Kernel Model Driver only
|
|
|
|
--*/
|
|
#include "pch.h"
|
|
|
|
VOID
|
|
PciInterfacePinToLine(
|
|
IN PVOID Context,
|
|
IN PPCI_COMMON_CONFIG PciData
|
|
);
|
|
|
|
VOID
|
|
PciInterfaceLineToPin(
|
|
IN PVOID Context,
|
|
IN PPCI_COMMON_CONFIG PciNewData,
|
|
IN PPCI_COMMON_CONFIG PciOldData
|
|
);
|
|
|
|
ULONG
|
|
PciInterfaceReadConfig(
|
|
IN PVOID Context,
|
|
IN UCHAR BusOffset,
|
|
IN ULONG Slot,
|
|
IN PVOID Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
PciInterfaceWriteConfig(
|
|
IN PVOID Context,
|
|
IN UCHAR BusOffset,
|
|
IN ULONG Slot,
|
|
IN PVOID Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma alloc_text(PAGE, PciInterfacePinToLine)
|
|
#pragma alloc_text(PAGE, PciInterfaceLineToPin)
|
|
#pragma alloc_text(PAGE, PciBusEjectInterface)
|
|
#endif
|
|
|
|
NTSTATUS
|
|
PciBusEjectInterface(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp
|
|
)
|
|
{
|
|
PIO_RESOURCE_REQUIREMENTS_LIST ioList = NULL;
|
|
PPCI_BUS_INTERFACE_STANDARD pciInterface;
|
|
PIO_STACK_LOCATION irpSp;
|
|
PDEVICE_EXTENSION devExtension;
|
|
NTSTATUS status;
|
|
BOOLEAN foundBusNumber = FALSE;
|
|
OBJDATA crsData;
|
|
ULONG i, busNumber;
|
|
|
|
|
|
PAGED_CODE();
|
|
|
|
ASSERT(HalPciInterfaceReadConfig);
|
|
ASSERT(HalPciInterfaceWriteConfig);
|
|
|
|
devExtension = ACPIInternalGetDeviceExtension(DeviceObject);
|
|
|
|
ASSERT(devExtension);
|
|
ASSERT(devExtension->AcpiObject);
|
|
|
|
irpSp = IoGetCurrentIrpStackLocation(Irp);
|
|
|
|
ASSERT(irpSp->Parameters.QueryInterface.Size >=
|
|
sizeof(PCI_BUS_INTERFACE_STANDARD));
|
|
|
|
pciInterface = (PPCI_BUS_INTERFACE_STANDARD)irpSp->Parameters.QueryInterface.Interface;
|
|
|
|
ASSERT(pciInterface);
|
|
|
|
status = ACPIGetDataSync(devExtension, PACKED_CRS, &crsData);
|
|
|
|
if (NT_SUCCESS(status)) {
|
|
|
|
ASSERT(crsData.dwDataType == OBJTYPE_BUFFDATA);
|
|
|
|
//
|
|
// Turn it into something meaningful.
|
|
//
|
|
status = PnpBiosResourcesToNtResources(
|
|
crsData.pbDataBuff,
|
|
PNP_BIOS_TO_IO_NO_CONSUMED_RESOURCES,
|
|
&ioList
|
|
);
|
|
|
|
if (NT_SUCCESS(status) && ioList) {
|
|
|
|
//
|
|
// A _CRS shouldn't have choices.
|
|
//
|
|
ASSERT(ioList->AlternativeLists == 1);
|
|
|
|
//
|
|
// Look for the Bus Number resource.
|
|
//
|
|
for (i = 0; i < ioList->List[0].Count; i++) {
|
|
|
|
if (ioList->List[0].Descriptors[i].Type == CmResourceTypeBusNumber) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i != ioList->List[0].Count) {
|
|
|
|
busNumber = (ULONG)ioList->List[0].Descriptors[i].u.BusNumber.MinBusNumber;
|
|
foundBusNumber = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
AMLIFreeDataBuffs(&crsData, 1);
|
|
|
|
}
|
|
|
|
if (!foundBusNumber) {
|
|
|
|
//
|
|
// Punt. Assume this is for PCI bus 0.
|
|
//
|
|
|
|
busNumber = 0;
|
|
}
|
|
|
|
pciInterface->Size = sizeof(PCI_BUS_INTERFACE_STANDARD);
|
|
pciInterface->Version = 1;
|
|
pciInterface->Context = (PVOID)UlongToPtr(busNumber);
|
|
pciInterface->InterfaceReference = AcpiNullReference;
|
|
pciInterface->InterfaceDereference = AcpiNullReference;
|
|
pciInterface->ReadConfig = HalPciInterfaceReadConfig;
|
|
pciInterface->WriteConfig = HalPciInterfaceWriteConfig;
|
|
pciInterface->PinToLine = PciInterfacePinToLine;
|
|
pciInterface->LineToPin = PciInterfaceLineToPin;
|
|
|
|
status = STATUS_SUCCESS;
|
|
|
|
if (ioList) {
|
|
ExFreePool(ioList);
|
|
}
|
|
|
|
Irp->IoStatus.Status = status;
|
|
|
|
return status;
|
|
}
|
|
|
|
VOID
|
|
PciInterfacePinToLine(
|
|
IN PVOID Context,
|
|
IN PPCI_COMMON_CONFIG PciData
|
|
)
|
|
{
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
PciInterfaceLineToPin(
|
|
IN PVOID Context,
|
|
IN PPCI_COMMON_CONFIG PciNewData,
|
|
IN PPCI_COMMON_CONFIG PciOldData
|
|
)
|
|
{
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
AcpiNullReference(
|
|
PVOID Context
|
|
)
|
|
{
|
|
return;
|
|
}
|