NT4/private/ntos/nthals/halsable/alpha/pcibus.c
2020-09-30 17:12:29 +02:00

119 lines
2.4 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) 1993 Microsoft Corporationn, Digital Equipment Corporation
Module Name:
pcibus.c
Abstract:
Platform-specific PCI bus routines
Author:
Environment:
Kernel mode
Revision History:
--*/
#include "halp.h"
#include "pci.h"
#include "pcip.h"
#include "machdep.h"
PCI_CONFIGURATION_TYPES
HalpPCIConfigCycleType(
IN PBUS_HANDLER BusHandler
)
{
BOOLEAN BusIsAcrossPPB;
BusIsAcrossPPB = ((PPCIPBUSDATA)(BusHandler->BusData))->BusIsAcrossPPB;
//
// If the bus is across a PCI-to-PCI bridge use type 1 configuration
// cycles, otherwise use type 0.
//
if( BusIsAcrossPPB ){
return PciConfigType1;
} else {
return PciConfigType0;
}
}
VOID
HalpPCIConfigAddr(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
PPCI_CFG_CYCLE_BITS pPciAddr
)
{
PCI_CONFIGURATION_TYPES ConfigType;
ULONG HwBusNumber;
HwBusNumber = ((PPCIPBUSDATA)(BusHandler->BusData))->HwBusNumber;
ConfigType = HalpPCIConfigCycleType(BusHandler);
if( ConfigType == PciConfigType0 ){
//
// Initialize pPciAddr for a type 0 configuration cycle. Device
// number is mapped to address bits 11:24, which are wired to the
// IDSEL pins.
//
if( HwBusNumber == 0 ){
pPciAddr->u.AsULONG = (ULONG)
(HAL_MAKE_QVA(SABLE_PCI0_CONFIGURATION_PHYSICAL));
} else {
pPciAddr->u.AsULONG = (ULONG)
(HAL_MAKE_QVA(SABLE_PCI1_CONFIGURATION_PHYSICAL));
}
pPciAddr->u.AsULONG += (1 << (Slot.u.bits.DeviceNumber + 11));
pPciAddr->u.bits0.FunctionNumber = Slot.u.bits.FunctionNumber;
pPciAddr->u.bits0.Reserved1 = PciConfigType0;
} else {
//
// Initialize pPciAddr for a type 1 configuration cycle.
//
pPciAddr->u.AsULONG = 0;
pPciAddr->u.bits1.BusNumber = BusHandler->BusNumber;
pPciAddr->u.bits1.FunctionNumber = Slot.u.bits.FunctionNumber;
pPciAddr->u.bits1.DeviceNumber = Slot.u.bits.DeviceNumber;
pPciAddr->u.bits1.Reserved1 = PciConfigType1;
if( HwBusNumber == 0 ){
pPciAddr->u.AsULONG += (ULONG)
(HAL_MAKE_QVA(SABLE_PCI0_CONFIGURATION_PHYSICAL));
} else {
pPciAddr->u.AsULONG += (ULONG)
(HAL_MAKE_QVA(SABLE_PCI1_CONFIGURATION_PHYSICAL));
}
}
return;
}