2020-09-30 17:12:29 +02:00

147 lines
3.0 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 Corporation, Digital Equipment Corporation
Module Name:
pcibus.c
Abstract:
Platform-specific PCI bus routines
Author:
Eric Rehm 6-June-1995
Environment:
Kernel mode
Revision History:
--*/
#include "halp.h"
#include "pci.h"
#include "pcip.h"
#include "machdep.h"
extern ULONG PCIMaxBus;
PCI_CONFIGURATION_TYPES
HalpPCIConfigCycleType (
IN PBUS_HANDLER BusHandler
)
{
PCI_CONFIGURATION_TYPES ConfigType;
ULONG BusNumber = BusHandler->BusNumber;
PPCIPBUSDATA BusData;
BOOLEAN BusIsAcrossPPB;
//
// Get a pointer to the bus-specific data.
//
BusData = (PPCIPBUSDATA)BusHandler->BusData;
//
// Get the flag that tells use whether this is
// a root bus or not.
//
BusIsAcrossPPB = BusData->BusIsAcrossPPB;
//
// Valid Config cycles for Bus # < PCIMaxBus
//
// Then, Type 1 config cycles only when bus is across
// a PPB.
//
if (BusNumber < PCIMaxBus) {
ConfigType = PciConfigType0;
if (BusIsAcrossPPB == TRUE)
{
ConfigType = PciConfigType1;
}
} else {
ConfigType = PciConfigTypeInvalid;
}
#if HALDBG
DbgPrint("BusNumber %d BusIsAcrossPPB %d ConfigType %d\n",
BusNumber, BusIsAcrossPPB, ConfigType);
#endif
return ConfigType;
}
VOID
HalpPCIConfigAddr (
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
PPCI_CFG_CYCLE_BITS pPciAddr
)
{
PCI_CONFIGURATION_TYPES ConfigType;
MC_DEVICE_ID McDevid;
ULONG BusNumber = BusHandler->BusNumber;
PPCIPBUSDATA BusData;
ConfigType = HalpPCIConfigCycleType(BusHandler);
//
// Get a pointer to the bus-specific data.
//
BusData = (PPCIPBUSDATA)BusHandler->BusData;
#if HALDBG
DbgPrint( "PCI Config Access: Bus = %d, Device = %d, BusIsAcrossPPB %d ConfigType = %d\n",
BusNumber, Slot.u.bits.DeviceNumber, BusData->BusIsAcrossPPB, ConfigType );
#endif //HALDBG
//
// From the root bus number (a.k.a. HwBusNumber), get
// the MC_DEVICE_ID of the IOD that we're attempting to access.
//
McDevid = HalpIodLogicalToPhysical[BusData->HwBusNumber];
//
// If this is an access to an PCI device on a root bus,
// then we want to generate a Type 0 config cycle. To do this
// on Rawhide, you must set BusNumber to zero.
//
// We know that an access is destined to a root bus when
// when the bus being accessed is *not* across a PPB.
//
if (BusData->BusIsAcrossPPB == FALSE) {
BusNumber = 0;
}
//
// Initialize PciAddr for a PCI type 1 configuration cycle
//
pPciAddr->u.AsULONG = McDevid.all << 24;
pPciAddr->u.bits1.BusNumber = BusNumber;
pPciAddr->u.bits1.DeviceNumber = Slot.u.bits.DeviceNumber;
pPciAddr->u.bits1.FunctionNumber = Slot.u.bits.FunctionNumber;
pPciAddr->u.bits1.Reserved1 = PciConfigType1; // don't care!
return;
}