186 lines
4.6 KiB
C
186 lines
4.6 KiB
C
|
/*++
|
|||
|
|
|||
|
|
|||
|
Copyright (C) 1989-1995 Microsoft Corporation
|
|||
|
Copyright (c) 1994,1995 Digital Equipment Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
adjust.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains platform-independent slot resource adjust routines.
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "halp.h"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text(PAGE,HalpAdjustResourceListUpperLimits)
|
|||
|
#endif
|
|||
|
|
|||
|
VOID
|
|||
|
HalpAdjustResourceListUpperLimits (
|
|||
|
IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList,
|
|||
|
IN LARGE_INTEGER MaximumPortAddress,
|
|||
|
IN LARGE_INTEGER MaximumMemoryAddress,
|
|||
|
IN ULONG MaximumInterruptVector,
|
|||
|
IN ULONG MaximumDmaChannel
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Adjust a pResource list with respect to the upper bounds supplied.
|
|||
|
(A resource is changed only if it execceds the maximum.)
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pResouceList - Resource list to be checked.
|
|||
|
|
|||
|
MaximumPortAddress - Maximum I/O port allowed.
|
|||
|
|
|||
|
MaximumMemoryAddress - Maximum I/O memory address allowed.
|
|||
|
|
|||
|
MaximumInterruptVector - Maximum interrupt vector allowed.
|
|||
|
|
|||
|
MaximumDmaChannel - Maximum dma channel allowed.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PIO_RESOURCE_REQUIREMENTS_LIST CompleteList;
|
|||
|
PIO_RESOURCE_LIST ResourceList;
|
|||
|
PIO_RESOURCE_DESCRIPTOR Descriptor;
|
|||
|
ULONG alt, cnt;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Walk each ResourceList and shrink any values to system limits
|
|||
|
//
|
|||
|
|
|||
|
CompleteList = *pResourceList;
|
|||
|
ResourceList = CompleteList->List;
|
|||
|
|
|||
|
for (alt=0; alt < CompleteList->AlternativeLists; alt++) {
|
|||
|
Descriptor = ResourceList->Descriptors;
|
|||
|
for (cnt = ResourceList->Count; cnt; cnt--) {
|
|||
|
|
|||
|
//
|
|||
|
// Make sure descriptor limits fall within the
|
|||
|
// CompleteList->InterfaceType & CompleteList->BusNumber.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
switch (Descriptor->Type) {
|
|||
|
case CmResourceTypePort:
|
|||
|
if (Descriptor->u.Port.MaximumAddress.QuadPart >
|
|||
|
MaximumPortAddress.QuadPart) {
|
|||
|
|
|||
|
Descriptor->u.Port.MaximumAddress = MaximumPortAddress;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case CmResourceTypeInterrupt:
|
|||
|
if (Descriptor->u.Interrupt.MaximumVector >
|
|||
|
MaximumInterruptVector ) {
|
|||
|
|
|||
|
Descriptor->u.Interrupt.MaximumVector =
|
|||
|
MaximumInterruptVector;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case CmResourceTypeMemory:
|
|||
|
if (Descriptor->u.Memory.MaximumAddress.QuadPart >
|
|||
|
MaximumMemoryAddress.QuadPart) {
|
|||
|
|
|||
|
Descriptor->u.Memory.MaximumAddress =
|
|||
|
MaximumMemoryAddress;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case CmResourceTypeDma:
|
|||
|
if (Descriptor->u.Dma.MaximumChannel >
|
|||
|
MaximumDmaChannel ) {
|
|||
|
|
|||
|
Descriptor->u.Dma.MaximumChannel =
|
|||
|
MaximumDmaChannel;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
#if DBG
|
|||
|
default:
|
|||
|
DbgPrint ("HalAdjustResourceList: Unkown resource type\n");
|
|||
|
break;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Next descriptor
|
|||
|
//
|
|||
|
Descriptor++;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Next Resource List
|
|||
|
//
|
|||
|
ResourceList = (PIO_RESOURCE_LIST) Descriptor;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
HalpAdjustIsaResourceList (
|
|||
|
IN PBUS_HANDLER BusHandler,
|
|||
|
IN PBUS_HANDLER RootHandler,
|
|||
|
IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
The function adjusts pResourceList to keep it in the bounds of ISA bus
|
|||
|
resources.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
BusHandler - Registered BUSHANDLER for the target configuration space
|
|||
|
|
|||
|
RootHandler - Register BUSHANDLER for the orginating HalAdjustResourceList request.
|
|||
|
|
|||
|
pResourceList - Supplies the PIO_RESOURCE_REQUIREMENTS_LIST to be checked.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
STATUS_SUCCESS
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LARGE_INTEGER li64k, limem;
|
|||
|
|
|||
|
li64k.QuadPart = 0xffff;
|
|||
|
limem.QuadPart = 0xffffff;
|
|||
|
|
|||
|
HalpAdjustResourceListUpperLimits (
|
|||
|
pResourceList,
|
|||
|
li64k, // Bus supports up to I/O port 0xFFFF
|
|||
|
limem, // Bus supports up to memory 0xFFFFFF
|
|||
|
15, // Bus supports up to 15 IRQs
|
|||
|
7 // Bus supports up to Dma channel 7
|
|||
|
);
|
|||
|
|
|||
|
return STATUS_SUCCESS;
|
|||
|
}
|