NT4/private/ntos/nthals/halalpha/adjust.c

150 lines
3.5 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*++
Copyright (c) 1989 Microsoft Corporation
Copyright (c) 1994 Digital Equipment Corporation
Module Name:
adjust.c
Abstract:
This module contains platform-independent slot resource adjust routines.
Author:
Eric Rehm 6-January-1994
Environment:
Kernel mode
Revision History:
--*/
#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;
}
}