NT4/private/ntos/nthals/halflex/adjust.c
2020-09-30 17:12:29 +02:00

186 lines
4.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}