You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2522 lines
68 KiB
2522 lines
68 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
mts.c
|
|
|
|
Abstract:
|
|
|
|
MikeTs's little KD extension.
|
|
|
|
Author:
|
|
|
|
Michael Tsang (mikets) 18-November-1997
|
|
|
|
Environment:
|
|
|
|
User Mode.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include "pcskthw.h"
|
|
#include "pci.h"
|
|
#include "pcip.h"
|
|
#pragma hdrstop
|
|
|
|
VOID PrintClassInfo(PBYTE pb, DWORD dwReg);
|
|
|
|
VOID
|
|
PrintPciStatusReg(
|
|
USHORT Status
|
|
)
|
|
{
|
|
if (Status & PCI_STATUS_CAPABILITIES_LIST) {
|
|
dprintf("CapList ");
|
|
}
|
|
if (Status & PCI_STATUS_66MHZ_CAPABLE) {
|
|
dprintf("66MHzCapable ");
|
|
}
|
|
if (Status & PCI_STATUS_UDF_SUPPORTED) {
|
|
dprintf("UDFSupported ");
|
|
}
|
|
if (Status & PCI_STATUS_FAST_BACK_TO_BACK) {
|
|
dprintf("FB2BCapable ");
|
|
}
|
|
if (Status & PCI_STATUS_DATA_PARITY_DETECTED) {
|
|
dprintf("DataPERR ");
|
|
}
|
|
if (Status & PCI_STATUS_SIGNALED_TARGET_ABORT) {
|
|
dprintf("TargetDevAbort ");
|
|
}
|
|
if (Status & PCI_STATUS_RECEIVED_TARGET_ABORT) {
|
|
dprintf("TargetAbort ");
|
|
}
|
|
if (Status & PCI_STATUS_RECEIVED_MASTER_ABORT) {
|
|
dprintf("InitiatorAbort ");
|
|
}
|
|
if (Status & PCI_STATUS_SIGNALED_SYSTEM_ERROR) {
|
|
dprintf("SERR ");
|
|
}
|
|
if (Status & PCI_STATUS_DETECTED_PARITY_ERROR) {
|
|
dprintf("PERR ");
|
|
}
|
|
if (Status & PCI_STATUS_DEVSEL) {
|
|
dprintf("DEVSELTiming:%lx",(Status & PCI_STATUS_DEVSEL) >> 9);
|
|
}
|
|
dprintf("\n");
|
|
}
|
|
|
|
VOID
|
|
PrintPciBridgeCtrlReg(
|
|
USHORT Bridge
|
|
)
|
|
{
|
|
PCI_BRIDBG_CTRL_REG bReg = *((PCI_BRIDBG_CTRL_REG *) &Bridge);
|
|
|
|
if (bReg.PERRREnable) {
|
|
dprintf("PERRREnable ");
|
|
}
|
|
if (bReg.SERREnable) {
|
|
dprintf("SERREnable ");
|
|
}
|
|
if (bReg.ISAEnable) {
|
|
dprintf("ISAEnable ");
|
|
}
|
|
if (bReg.MasterAbort) {
|
|
dprintf("MasterAbort ");
|
|
}
|
|
if (bReg.CBRst) {
|
|
dprintf("CBRst ");
|
|
}
|
|
if (bReg.IRQRoutingEnable) {
|
|
dprintf("IRQRoutingEnable ");
|
|
}
|
|
if (bReg.Mem0Prefetch) {
|
|
dprintf("Mem0Prefetch ");
|
|
}
|
|
if (bReg.Mem1Prefetch) {
|
|
dprintf("Mem1Prefetch ");
|
|
}
|
|
if (bReg.WritePostEnable) {
|
|
dprintf("WritePostEnable ");
|
|
}
|
|
dprintf("\n");
|
|
}
|
|
|
|
BOOL
|
|
PrintCommonConfigSpace(
|
|
PCI_COMMON_CONFIG *pCmnCfg,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
PCHAR pch = NULL;
|
|
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
|
|
dprintf("%s%02x: VendorID %04lx ", Pad, CONFIG_OFFSET(VendorID), pCmnCfg->VendorID);
|
|
dprintf("%s\n", ((pch = GetVendorDesc(pCmnCfg->VendorID, TRUE)) ? pch : ""));
|
|
dprintf("%s%02x: DeviceID %04lx\n", Pad, CONFIG_OFFSET(DeviceID), pCmnCfg->DeviceID);
|
|
dprintf("%s%02x: Command %04lx ", Pad, CONFIG_OFFSET(Command), pCmnCfg->Command);
|
|
|
|
if (pCmnCfg->Command & PCI_ENABLE_IO_SPACE) {
|
|
dprintf("IOSpaceEnable ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_MEMORY_SPACE) {
|
|
dprintf("MemSpaceEnable ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_BUS_MASTER) {
|
|
dprintf("BusInitiate ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_SPECIAL_CYCLES) {
|
|
dprintf("SpecialCycle ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_WRITE_AND_INVALIDATE) {
|
|
dprintf("MemWriteEnable ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_VGA_COMPATIBLE_PALETTE) {
|
|
dprintf("VGASnoop ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_PARITY) {
|
|
dprintf("PERREnable ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_WAIT_CYCLE) {
|
|
dprintf("WaitCycle ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_SERR) {
|
|
dprintf("SERREnable ");
|
|
}
|
|
if (pCmnCfg->Command & PCI_ENABLE_FAST_BACK_TO_BACK) {
|
|
dprintf("FB2BEnable ");
|
|
}
|
|
dprintf("\n");
|
|
|
|
|
|
dprintf("%s%02x: Status %04lx ", Pad, CONFIG_OFFSET(Status), pCmnCfg->Status);
|
|
PrintPciStatusReg(pCmnCfg->Status);
|
|
|
|
dprintf("%s%02x: RevisionID %02lx\n%s%02x: ProgIF %02lx",
|
|
Pad,
|
|
CONFIG_OFFSET(RevisionID),
|
|
pCmnCfg->RevisionID,
|
|
Pad,
|
|
CONFIG_OFFSET(ProgIf),
|
|
pCmnCfg->ProgIf);
|
|
PrintClassInfo((PBYTE) pCmnCfg, CONFIG_OFFSET(ProgIf));
|
|
|
|
dprintf("%s%02x: SubClass %02lx", Pad, CONFIG_OFFSET(SubClass), pCmnCfg->SubClass);
|
|
PrintClassInfo((PBYTE) pCmnCfg, CONFIG_OFFSET(SubClass));
|
|
|
|
dprintf("%s%02x: BaseClass %02lx", Pad, CONFIG_OFFSET(BaseClass), pCmnCfg->BaseClass);
|
|
PrintClassInfo((PBYTE) pCmnCfg, CONFIG_OFFSET(BaseClass));
|
|
|
|
dprintf("%s%02x: CacheLineSize %04lx", Pad, CONFIG_OFFSET(CacheLineSize), pCmnCfg->CacheLineSize);
|
|
|
|
if (pCmnCfg->CacheLineSize & 0xf0) {
|
|
dprintf("BurstDisabled ");
|
|
}
|
|
if (pCmnCfg->CacheLineSize & 0xf) {
|
|
dprintf("Burst4DW");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%s%02x: LatencyTimer %02lx\n",
|
|
Pad,
|
|
CONFIG_OFFSET(LatencyTimer),
|
|
pCmnCfg->LatencyTimer);
|
|
dprintf("%s%02x: HeaderType %02lx\n",
|
|
Pad,
|
|
CONFIG_OFFSET(HeaderType),
|
|
pCmnCfg->HeaderType);
|
|
dprintf("%s%02x: BIST %02lx\n",
|
|
Pad,
|
|
CONFIG_OFFSET(BIST),
|
|
pCmnCfg->BIST);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
PrintCfgSpaceType0(
|
|
PCI_COMMON_CONFIG *pCmnCfg,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
int i;
|
|
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
|
|
for (i=0; i<PCI_TYPE0_ADDRESSES; ++i) {
|
|
dprintf("%s%02x: BAR%x %08lx\n", Pad, TYPE0_OFFSET(BaseAddresses[i]), i, pCmnCfg->u.type0.BaseAddresses[i]);
|
|
}
|
|
|
|
dprintf("%s%02x: CBCISPtr %08lx\n", Pad, TYPE0_OFFSET(CIS), pCmnCfg->u.type0.CIS);
|
|
dprintf("%s%02x: SubSysVenID %04lx\n", Pad, TYPE0_OFFSET(SubVendorID), pCmnCfg->u.type0.SubVendorID);
|
|
dprintf("%s%02x: SubSysID %04lx\n", Pad, TYPE0_OFFSET(SubSystemID), pCmnCfg->u.type0.SubSystemID);
|
|
dprintf("%s%02x: ROMBAR %08lx\n", Pad, TYPE0_OFFSET(ROMBaseAddress), pCmnCfg->u.type0.ROMBaseAddress);
|
|
dprintf("%s%02x: CapPtr %02lx\n", Pad, TYPE0_OFFSET(CapabilitiesPtr), pCmnCfg->u.type0.CapabilitiesPtr);
|
|
dprintf("%s%02x: IntLine %02lx\n", Pad, TYPE0_OFFSET(InterruptLine), pCmnCfg->u.type0.InterruptLine);
|
|
dprintf("%s%02x: IntPin %02lx\n", Pad, TYPE0_OFFSET(InterruptPin), pCmnCfg->u.type0.InterruptPin);
|
|
dprintf("%s%02x: MinGnt %02lx\n", Pad, TYPE0_OFFSET(MinimumGrant), pCmnCfg->u.type0.MinimumGrant);
|
|
dprintf("%s%02x: MaxLat %02lx\n", Pad, TYPE0_OFFSET(MaximumLatency), pCmnCfg->u.type0.MaximumLatency);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
PrintCfgSpaceType1(
|
|
PCI_COMMON_CONFIG *pCmnCfg,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
int i;
|
|
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
|
|
for (i=0; i<PCI_TYPE1_ADDRESSES; ++i) {
|
|
dprintf("%s%02x: BAR%x %08lx\n",
|
|
Pad, CONFIG_OFFSET(u.type1.BaseAddresses[i]), i, pCmnCfg->u.type1.BaseAddresses[i]);
|
|
}
|
|
|
|
dprintf("%s%02x: PriBusNum %02lx\n", Pad, TYPE1_OFFSET(PrimaryBus), pCmnCfg->u.type1.PrimaryBus);
|
|
dprintf("%s%02x: SecBusNum %02lx\n", Pad, TYPE1_OFFSET(SecondaryBus), pCmnCfg->u.type1.SecondaryBus);
|
|
dprintf("%s%02x: SubBusNum %02lx\n", Pad, TYPE1_OFFSET(SubordinateBus), pCmnCfg->u.type1.SubordinateBus);
|
|
dprintf("%s%02x: SecLatencyTmr %02lx\n", Pad, TYPE1_OFFSET(SecondaryLatency), pCmnCfg->u.type1.SecondaryLatency);
|
|
dprintf("%s%02x: IOBase %02lx\n", Pad, TYPE1_OFFSET(IOBase), pCmnCfg->u.type1.IOBase);
|
|
dprintf("%s%02x: IOLimit %02lx\n", Pad, TYPE1_OFFSET(IOLimit), pCmnCfg->u.type1.IOLimit);
|
|
dprintf("%s%02x: SecStatus %04lx ",Pad, TYPE1_OFFSET(SecondaryStatus), pCmnCfg->u.type1.SecondaryStatus);
|
|
PrintPciStatusReg(pCmnCfg->u.type1.SecondaryStatus);
|
|
|
|
dprintf("%s%02x: MemBase %04lx\n", Pad, TYPE1_OFFSET(MemoryBase), pCmnCfg->u.type1.MemoryBase);
|
|
dprintf("%s%02x: MemLimit %04lx\n", Pad, TYPE1_OFFSET(MemoryLimit), pCmnCfg->u.type1.MemoryLimit);
|
|
dprintf("%s%02x: PrefMemBase %04lx\n", Pad, TYPE1_OFFSET(PrefetchBase), pCmnCfg->u.type1.PrefetchBase);
|
|
dprintf("%s%02x: PrefMemLimit %04lx\n", Pad, TYPE1_OFFSET(PrefetchLimit), pCmnCfg->u.type1.PrefetchLimit);
|
|
dprintf("%s%02x: PrefBaseHi %08lx\n", Pad, TYPE1_OFFSET(PrefetchBaseUpper32), pCmnCfg->u.type1.PrefetchBaseUpper32);
|
|
dprintf("%s%02x: PrefLimitHi %08lx\n", Pad, TYPE1_OFFSET(PrefetchLimitUpper32), pCmnCfg->u.type1.PrefetchLimitUpper32);
|
|
dprintf("%s%02x: IOBaseHi %04lx\n", Pad, TYPE1_OFFSET(IOBaseUpper16), pCmnCfg->u.type1.IOBaseUpper16);
|
|
dprintf("%s%02x: IOLimitHi %04lx\n", Pad, TYPE1_OFFSET(IOLimitUpper16), pCmnCfg->u.type1.IOLimitUpper16);
|
|
dprintf("%s%02x: CapPtr %02lx\n", Pad, TYPE1_OFFSET(CapabilitiesPtr), pCmnCfg->u.type1.CapabilitiesPtr);
|
|
dprintf("%s%02x: ROMBAR %08lx\n", Pad, TYPE1_OFFSET(ROMBaseAddress), pCmnCfg->u.type1.ROMBaseAddress);
|
|
dprintf("%s%02x: IntLine %02lx\n", Pad, TYPE1_OFFSET(InterruptLine), pCmnCfg->u.type1.InterruptLine);
|
|
dprintf("%s%02x: IntPin %02lx\n", Pad, TYPE1_OFFSET(InterruptPin), pCmnCfg->u.type1.InterruptPin);
|
|
dprintf("%s%02x: BridgeCtrl %04lx ", Pad, TYPE1_OFFSET(BridgeControl), pCmnCfg->u.type1.BridgeControl);
|
|
PrintPciBridgeCtrlReg(pCmnCfg->u.type2.BridgeControl);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
PrintCfgSpaceType2(
|
|
PCI_COMMON_CONFIG *pCmnCfg,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
PPCI_TYPE2_HEADER_EXTRAS extras;
|
|
ULONG extraOffset;
|
|
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
|
|
dprintf("%s%02x: RegBaseAddr %08lx\n", Pad, TYPE2_OFFSET(SocketRegistersBaseAddress), pCmnCfg->u.type2.SocketRegistersBaseAddress);
|
|
dprintf("%s%02x: CapPtr %02lx\n", Pad, TYPE2_OFFSET(SocketRegistersBaseAddress), pCmnCfg->u.type2.CapabilitiesPtr);
|
|
dprintf("%s%02x: SecStatus %04lx ", Pad, TYPE2_OFFSET(SecondaryStatus), pCmnCfg->u.type2.SecondaryStatus);
|
|
PrintPciStatusReg(pCmnCfg->u.type2.SecondaryStatus);
|
|
|
|
dprintf("%s%02x: PCIBusNum %02lx\n", Pad, TYPE2_OFFSET(PrimaryBus), pCmnCfg->u.type2.PrimaryBus);
|
|
dprintf("%s%02x: CBBusNum %02lx\n", Pad, TYPE2_OFFSET(SecondaryBus), pCmnCfg->u.type2.SecondaryBus);
|
|
dprintf("%s%02x: SubBusNum %02lx\n", Pad, TYPE2_OFFSET(SubordinateBus), pCmnCfg->u.type2.SubordinateBus);
|
|
dprintf("%s%02x: CBLatencyTimer %02lx\n", Pad, TYPE2_OFFSET(SecondaryLatency), pCmnCfg->u.type2.SecondaryLatency);
|
|
dprintf("%s%02x: MemBase0 %08lx\n", Pad, TYPE2_OFFSET(Range[0].Base), pCmnCfg->u.type2.Range[0].Base);
|
|
dprintf("%s%02x: MemLimit1 %08lx\n", Pad, TYPE2_OFFSET(Range[1].Limit), pCmnCfg->u.type2.Range[1].Limit);
|
|
dprintf("%s%02x: IOBase0 %08lx\n", Pad, TYPE2_OFFSET(Range[2].Base), pCmnCfg->u.type2.Range[2].Base);
|
|
dprintf("%s%02x: IOLimit1 %08lx\n", Pad, TYPE2_OFFSET(Range[3].Limit), pCmnCfg->u.type2.Range[3].Limit);
|
|
dprintf("%s%02x: IntLine %02lx\n", Pad, TYPE2_OFFSET(InterruptLine), pCmnCfg->u.type2.InterruptLine);
|
|
dprintf("%s%02x: IntPin %02lx\n", Pad, TYPE2_OFFSET(InterruptPin), pCmnCfg->u.type2.InterruptPin);
|
|
dprintf("%s%02x: BridgeCtrl %04lx ", Pad, TYPE2_OFFSET(BridgeControl), pCmnCfg->u.type2.BridgeControl);
|
|
PrintPciBridgeCtrlReg(pCmnCfg->u.type2.BridgeControl);
|
|
|
|
extras = (PPCI_TYPE2_HEADER_EXTRAS) ((PUCHAR) pCmnCfg + CONFIG_OFFSET(DeviceSpecific));
|
|
|
|
extraOffset = CONFIG_OFFSET(DeviceSpecific);
|
|
dprintf("%s%02x: SubSysVenID %04lx\n", Pad, extraOffset, extras->SubVendorID);
|
|
|
|
dprintf("%s%02x: SubSystemID %04lx\n",
|
|
Pad, extraOffset + FIELD_OFFSET(PCI_TYPE2_HEADER_EXTRAS, SubSystemID), extras->SubSystemID);
|
|
|
|
dprintf("%s%02x: LegacyBaseAddr %04lx\n",
|
|
Pad, extraOffset + FIELD_OFFSET(PCI_TYPE2_HEADER_EXTRAS, LegacyModeBaseAddress), extras->LegacyModeBaseAddress);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
PrintDataRange(
|
|
PCHAR pData,
|
|
ULONG nDwords,
|
|
ULONG base,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
unsigned int i;
|
|
unsigned int j;
|
|
PULONG pRange;
|
|
|
|
pRange = (PULONG) pData;
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
for (i=0; i<((nDwords+3)/4); i++) {
|
|
dprintf("%s%02lx:", Pad, base + i*16);
|
|
for (j=0; (j < 4) && (i*4+j < nDwords); j++) {
|
|
dprintf(" %08lx", pRange[i*4+j]);
|
|
}
|
|
dprintf("\n");
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
PrintPciCapHeader(
|
|
PCI_CAPABILITIES_HEADER *pCapHdr,
|
|
ULONG CapOffset,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
|
|
if (!Pad) Pad = "";
|
|
|
|
dprintf("%s%02x: CapID %02x ", Pad, CapOffset, pCapHdr->CapabilityID);
|
|
|
|
switch (pCapHdr->CapabilityID) {
|
|
case PCI_CAPABILITY_ID_POWER_MANAGEMENT:
|
|
dprintf("PwrMgmt ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_AGP:
|
|
dprintf("AGP ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_AGP_TARGET:
|
|
dprintf("AGPT ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_VPD:
|
|
dprintf("VPD ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_SLOT_ID:
|
|
dprintf("SLOT ID ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_MSI:
|
|
dprintf("MSI ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_CPCI_HOTSWAP:
|
|
dprintf("CPCI HotSwap ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_PCIX:
|
|
dprintf("PCI-X ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_HYPERTRANSPORT:
|
|
dprintf("HyperTransport ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_VENDOR_SPECIFIC:
|
|
dprintf("Vendor Specific ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_DEBUG_PORT:
|
|
dprintf("Debug Port ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_CPCI_RES_CTRL:
|
|
dprintf("CPCI Resource Control ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_SHPC:
|
|
dprintf("SHPC ");
|
|
break;
|
|
|
|
default:
|
|
dprintf("Unknown ");
|
|
break;
|
|
}
|
|
|
|
dprintf("\n");
|
|
|
|
dprintf("%s%02x: NextPtr %02lx\n",
|
|
Pad,
|
|
(CapOffset + FIELD_OFFSET(PCI_CAPABILITIES_HEADER, Next)), pCapHdr->Next);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
PrintPciPwrMgmtCaps(
|
|
USHORT Capabilities
|
|
)
|
|
{
|
|
PCI_PMC pmc;
|
|
|
|
pmc = *((PCI_PMC *) &Capabilities);
|
|
|
|
if (pmc.PMEClock) {
|
|
dprintf("PMECLK ");
|
|
}
|
|
if (pmc.Rsvd1) {
|
|
dprintf("AUXPWR ");
|
|
}
|
|
if (pmc.DeviceSpecificInitialization) {
|
|
dprintf("DSI ");
|
|
}
|
|
if (pmc.Support.D1) {
|
|
dprintf("D1Support ");
|
|
}
|
|
if (pmc.Support.D2) {
|
|
dprintf("D2Support ");
|
|
}
|
|
if (pmc.Support.PMED0) {
|
|
dprintf("PMED0 ");
|
|
}
|
|
if (pmc.Support.PMED1) {
|
|
dprintf("PMED1 ");
|
|
}
|
|
if (pmc.Support.PMED2) {
|
|
dprintf("PMED2 ");
|
|
}
|
|
if (pmc.Support.PMED3Hot) {
|
|
dprintf("PMED3Hot ");
|
|
}
|
|
if (pmc.Support.PMED3Cold) {
|
|
dprintf("PMED3Cold ");
|
|
}
|
|
dprintf("Version=%lx\n", pmc.Version);
|
|
}
|
|
BOOL
|
|
PrintPciPowerManagement(
|
|
PCHAR pData,
|
|
ULONG CapOffset,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
PPCI_PM_CAPABILITY pPmC;
|
|
int i;
|
|
|
|
pPmC = (PPCI_PM_CAPABILITY) pData;
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
dprintf("%s%02x: PwrMgmtCap %04x ",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_PM_CAPABILITY, PMC),
|
|
pPmC->PMC.AsUSHORT);
|
|
PrintPciPwrMgmtCaps(pPmC->PMC.AsUSHORT);
|
|
|
|
dprintf("%s%02x: PwrMgmtCtrl %04x ",
|
|
Pad,
|
|
CapOffset+FIELD_OFFSET(PCI_PM_CAPABILITY, PMCSR),
|
|
pPmC->PMCSR.AsUSHORT);
|
|
PCI_PMCSR CtrlStatus = pPmC->PMCSR.ControlStatus;
|
|
if (CtrlStatus.PMEEnable) {
|
|
dprintf("PMEEnable ");
|
|
}
|
|
if (CtrlStatus.PMEStatus) {
|
|
dprintf("PMESTAT ");
|
|
}
|
|
dprintf("DataScale:%lx ", CtrlStatus.DataScale);
|
|
dprintf("DataSel:%lx ", CtrlStatus.DataSelect);
|
|
dprintf("D%lx%s", CtrlStatus.PowerState, (CtrlStatus.PowerState == 3) ? "Hot " : " ");
|
|
|
|
|
|
if (pPmC->PMCSR_BSE.AsUCHAR){
|
|
|
|
dprintf("\n%sPwrMgmtBridge ", Pad);
|
|
if (pPmC->PMCSR_BSE.BridgeSupport.D3HotSupportsStopClock) {
|
|
dprintf("D3HotStopClock ");
|
|
}
|
|
if (pPmC->PMCSR_BSE.BridgeSupport.BusPowerClockControlEnabled) {
|
|
dprintf("BPCCEnable ");
|
|
}
|
|
}
|
|
|
|
dprintf("\n");
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
PrintPciAGP(
|
|
PCHAR pData,
|
|
ULONG CapOffset,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
PPCI_AGP_CAPABILITY pAGP;
|
|
int i;
|
|
|
|
pAGP = (PPCI_AGP_CAPABILITY) pData;
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
dprintf("%s%02x: Version Major %lx, Minor %lx\n",
|
|
Pad,
|
|
CapOffset + sizeof(PCI_CAPABILITIES_HEADER),
|
|
pAGP->Major,
|
|
pAGP->Minor);
|
|
|
|
dprintf("%s%02x: Status MaxRQDepth:%lx",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_AGP_CAPABILITY, AGPStatus),
|
|
pAGP->AGPStatus.RequestQueueDepthMaximum);
|
|
|
|
dprintf(" ARSize:%lx", pAGP->AGPStatus.AsyncRequestSize);
|
|
|
|
dprintf(" CCycle:%lx", pAGP->AGPStatus.CalibrationCycle);
|
|
|
|
if (pAGP->AGPStatus.SideBandAddressing) {
|
|
dprintf(" SBA");
|
|
}
|
|
|
|
if (pAGP->AGPStatus.ITA_Coherent) {
|
|
dprintf(" COH");
|
|
}
|
|
|
|
if (pAGP->AGPStatus.Gart64) {
|
|
dprintf(" Gart64");
|
|
}
|
|
|
|
if (pAGP->AGPStatus.HostTransDisable) {
|
|
dprintf(" HTXDisable");
|
|
}
|
|
|
|
if (pAGP->AGPStatus.FourGB) {
|
|
dprintf(" 4GB");
|
|
}
|
|
|
|
if (pAGP->AGPStatus.FastWrite) {
|
|
dprintf(" FW");
|
|
}
|
|
|
|
if (pAGP->AGPStatus.Agp3Mode) {
|
|
dprintf(" AGP3Mode");
|
|
}
|
|
|
|
dprintf(" Rate:%lx\n", pAGP->AGPStatus.Rate);
|
|
|
|
dprintf("%s%02x: Command ",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_AGP_CAPABILITY, AGPCommand));
|
|
|
|
dprintf("RQDepth:%lx ", pAGP->AGPCommand.RequestQueueDepth);
|
|
|
|
dprintf("ARSize:%lx ", pAGP->AGPCommand.AsyncReqSize);
|
|
|
|
dprintf("CCycle:%lx ", pAGP->AGPCommand.CalibrationCycle);
|
|
|
|
if (pAGP->AGPCommand.SBAEnable) {
|
|
dprintf("SBA ");
|
|
}
|
|
|
|
if (pAGP->AGPCommand.AGPEnable) {
|
|
dprintf("AGPEnable ");
|
|
}
|
|
|
|
if (pAGP->AGPCommand.Gart64) {
|
|
dprintf("Gart64 ");
|
|
}
|
|
|
|
if (pAGP->AGPCommand.FourGBEnable) {
|
|
dprintf("4GB ");
|
|
}
|
|
|
|
if (pAGP->AGPCommand.FastWriteEnable) {
|
|
dprintf("FW ");
|
|
}
|
|
|
|
dprintf("Rate:%lx ", pAGP->AGPCommand.Rate);
|
|
dprintf("\n");
|
|
|
|
if (pAGP->Header.CapabilityID == PCI_CAPABILITY_ID_AGP_TARGET) {
|
|
DWORD dwOff = sizeof(PCI_AGP_CAPABILITY);
|
|
PPCI_AGP_EXTENDED_CAPABILITY pAGPExt =
|
|
(PPCI_AGP_EXTENDED_CAPABILITY)(pAGP + 1);
|
|
|
|
dprintf("%s%02x: Control ", Pad,
|
|
CapOffset + dwOff + FIELD_OFFSET(PCI_AGP_EXTENDED_CAPABILITY, AgpControl));
|
|
|
|
if (!pAGPExt->AgpControl.CAL_Disable) {
|
|
dprintf("CALEnable ");
|
|
}
|
|
|
|
if (pAGPExt->AgpControl.AP_Enable) {
|
|
dprintf("APEnable ");
|
|
}
|
|
|
|
if (pAGPExt->AgpControl.GTLB_Enable) {
|
|
dprintf("GTLBEnable ");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%s%02x: Aperture Size:%lx PageSize:%lx\n",
|
|
Pad,
|
|
CapOffset + dwOff + FIELD_OFFSET(PCI_AGP_EXTENDED_CAPABILITY, ApertureSize),
|
|
pAGPExt->ApertureSize, pAGPExt->AperturePageSize);
|
|
|
|
dprintf("%s%02x: Gart %08lx:%08lx\n", Pad,
|
|
CapOffset + dwOff + FIELD_OFFSET(PCI_AGP_EXTENDED_CAPABILITY, GartLow),
|
|
pAGPExt->GartHigh, pAGPExt->GartLow);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
PrintPciHtCommandReg(
|
|
IN PPCI_HT_CAPABILITY PciHtCap
|
|
)
|
|
{
|
|
|
|
dprintf("Type: ");
|
|
switch (PciHtCap->Command.Generic.CapabilityType) {
|
|
case HTHostSecondary:
|
|
dprintf("Secondary/Host ");
|
|
|
|
if (PciHtCap->Command.HostSecondary.DeviceNumber) {
|
|
dprintf("DeviceNumber:%02x ", PciHtCap->Command.HostSecondary.DeviceNumber);
|
|
}
|
|
|
|
if (PciHtCap->Command.HostSecondary.WarmReset) {
|
|
dprintf("WarmReset ");
|
|
}
|
|
|
|
if (PciHtCap->Command.HostSecondary.DoubleEnded) {
|
|
dprintf("DoubleEnded ");
|
|
}
|
|
|
|
if (PciHtCap->Command.HostSecondary.ChainSide) {
|
|
dprintf("ChainSide ");
|
|
}
|
|
|
|
if (PciHtCap->Command.HostSecondary.HostHide) {
|
|
dprintf("HostHide ");
|
|
}
|
|
|
|
if (PciHtCap->Command.HostSecondary.ActAsSlave) {
|
|
dprintf("ActAsSlave ");
|
|
}
|
|
|
|
if (PciHtCap->Command.HostSecondary.InboundEOCError) {
|
|
dprintf("InboundEOCError ");
|
|
}
|
|
|
|
if (PciHtCap->Command.HostSecondary.DropOnUnitinit) {
|
|
dprintf("DropOnUnitinit ");
|
|
}
|
|
dprintf("\n");
|
|
break;
|
|
|
|
case HTSlavePrimary:
|
|
|
|
dprintf("Primary/Slave ");
|
|
|
|
dprintf("BaseUnitID:%lx ", PciHtCap->Command.SlavePrimary.BaseUnitID);
|
|
dprintf("UnitCount:%lx ", PciHtCap->Command.SlavePrimary.UnitCount);
|
|
|
|
|
|
if (PciHtCap->Command.SlavePrimary.MasterHost) {
|
|
dprintf("MasterHost ");
|
|
}
|
|
|
|
if (PciHtCap->Command.SlavePrimary.DefaultDirection) {
|
|
dprintf("DefaultDirection ");
|
|
}
|
|
|
|
if (PciHtCap->Command.SlavePrimary.DropOnUnitinit) {
|
|
dprintf("DropOnUnitinit ");
|
|
}
|
|
|
|
dprintf("\n");
|
|
break;
|
|
|
|
|
|
case HTInterruptDiscoveryConfig:
|
|
dprintf("InterruptDiscovery ");
|
|
break;
|
|
|
|
case HTAddressMapping:
|
|
dprintf("AddressMapping - ");
|
|
default:
|
|
dprintf("(not implemented)\n");
|
|
break;
|
|
}
|
|
}
|
|
|
|
VOID
|
|
PrintPciHtLinkControl(
|
|
IN PPCI_HT_LinkControl LinkControl
|
|
)
|
|
{
|
|
|
|
if (LinkControl->CFlE) {
|
|
dprintf("CFlE ");
|
|
}
|
|
|
|
if (LinkControl->CST) {
|
|
dprintf("CST ");
|
|
}
|
|
|
|
if (LinkControl->CFE) {
|
|
dprintf("CFE ");
|
|
}
|
|
|
|
if (LinkControl->LkFail) {
|
|
dprintf("LkFail ");
|
|
}
|
|
|
|
if (LinkControl->Init) {
|
|
dprintf("Init ");
|
|
}
|
|
|
|
if (LinkControl->EOC) {
|
|
dprintf("EOC ");
|
|
}
|
|
|
|
if (LinkControl->TXO) {
|
|
dprintf("TXO ");
|
|
}
|
|
|
|
if (LinkControl->CRCError) {
|
|
dprintf("CRCError: %lx ", LinkControl->CRCError);
|
|
}
|
|
|
|
if (LinkControl->IsocEn) {
|
|
dprintf("IsocEn ");
|
|
}
|
|
|
|
if (LinkControl->LSEn) {
|
|
dprintf("LSEn ");
|
|
}
|
|
|
|
if (LinkControl->ExtCTL) {
|
|
dprintf("ExtCTL ");
|
|
}
|
|
dprintf("\n");
|
|
}
|
|
|
|
|
|
VOID
|
|
PrintPciHtLinkConfig(
|
|
IN PPCI_HT_LinkConfig LinkConfig
|
|
)
|
|
{
|
|
|
|
dprintf("MxLnkWdthIn:");
|
|
|
|
switch (LinkConfig->MaxLinkWidthIn) {
|
|
|
|
case HTMaxLinkWidth8bits:
|
|
dprintf("8 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth16bits:
|
|
dprintf("16 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth32bits:
|
|
dprintf("32 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth2bits:
|
|
dprintf("2 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth4bits:
|
|
dprintf("4 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidthNotConnected:
|
|
dprintf("!Connected ");
|
|
break;
|
|
}
|
|
|
|
if (LinkConfig->DwFlowControlIn) {
|
|
dprintf("DwFcIn ");
|
|
}
|
|
|
|
dprintf("MxLnkWdthOut:");
|
|
switch (LinkConfig->MaxLinkWidthOut) {
|
|
|
|
case HTMaxLinkWidth8bits:
|
|
dprintf("8 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth16bits:
|
|
dprintf("16 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth32bits:
|
|
dprintf("32 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth2bits:
|
|
dprintf("2 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth4bits:
|
|
dprintf("4 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidthNotConnected:
|
|
dprintf("!Connected ");
|
|
break;
|
|
}
|
|
|
|
if (LinkConfig->DwFlowControlOut) {
|
|
dprintf("DwFcOut ");
|
|
}
|
|
|
|
dprintf("LnkWdthIn:");
|
|
switch (LinkConfig->LinkWidthIn) {
|
|
|
|
case HTMaxLinkWidth8bits:
|
|
dprintf("8 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth16bits:
|
|
dprintf("16 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth32bits:
|
|
dprintf("32 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth2bits:
|
|
dprintf("2 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth4bits:
|
|
dprintf("4 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidthNotConnected:
|
|
dprintf("!Connected ");
|
|
break;
|
|
}
|
|
|
|
if (LinkConfig->DwFlowControlInEn) {
|
|
dprintf("DwFcInEn ");
|
|
}
|
|
|
|
dprintf("LnkWdthOut:");
|
|
switch (LinkConfig->LinkWidthOut) {
|
|
|
|
case HTMaxLinkWidth8bits:
|
|
dprintf("8 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth16bits:
|
|
dprintf("16 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth32bits:
|
|
dprintf("32 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth2bits:
|
|
dprintf("2 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidth4bits:
|
|
dprintf("4 ");
|
|
break;
|
|
|
|
case HTMaxLinkWidthNotConnected:
|
|
dprintf("!Connected ");
|
|
break;
|
|
}
|
|
|
|
if (LinkConfig->DwFlowControlOutEn) {
|
|
dprintf("DwFcOutEn ");
|
|
}
|
|
|
|
dprintf("\n");
|
|
|
|
}
|
|
|
|
VOID
|
|
PrintPciHtInterruptBlock(
|
|
IN PPCI_TYPE1_CFG_BITS PciCfg1,
|
|
IN ULONG CapOffset
|
|
)
|
|
{
|
|
|
|
UCHAR index;
|
|
ULONG writeOffset, readOffset;
|
|
ULONG currentInterrupt;
|
|
PULONG dataPort;
|
|
PCI_HT_INTERRUPT_INDEX_1 index1;
|
|
PCI_HT_INTERRUPT_INDEX_N interruptIndex;
|
|
|
|
writeOffset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, Command.Interrupt);
|
|
readOffset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, DataPort);
|
|
|
|
//
|
|
// Start with the first index to determine the max interrupt count
|
|
//
|
|
index = 1;
|
|
|
|
if (!(WritePci(PciCfg1, (PUCHAR)&index, writeOffset, sizeof(UCHAR)))){
|
|
dprintf("write operation failed!\n");
|
|
return;
|
|
}
|
|
|
|
RtlZeroMemory(&index1, sizeof(PCI_HT_INTERRUPT_INDEX_1));
|
|
ReadPci(PciCfg1, (PUCHAR)&index1, readOffset, sizeof(ULONG));
|
|
|
|
dprintf("- Last Interrupt: 0x%lx\n", index1.LastInterrupt);
|
|
|
|
//
|
|
// According to the HyperTransport spec the interrupt index list
|
|
// starts at index 0x10
|
|
//
|
|
index = 0x10;
|
|
currentInterrupt = 0;
|
|
|
|
dprintf(" InterruptBlock:\n");
|
|
while (currentInterrupt <= (ULONG)index1.LastInterrupt) {
|
|
|
|
ULONG i = 0;
|
|
|
|
dataPort = (PULONG)&interruptIndex.LowPart;
|
|
RtlZeroMemory(&interruptIndex, sizeof(PCI_HT_INTERRUPT_INDEX_N));
|
|
|
|
//
|
|
// Each interruptIndex is 64bits long so we have to read from the
|
|
// dataport twice to get the full value
|
|
//
|
|
while (i <= 1) {
|
|
|
|
if (!(WritePci(PciCfg1, (PUCHAR)&index, writeOffset, sizeof(UCHAR)))){
|
|
dprintf("write operation failed!\n");
|
|
return;
|
|
}
|
|
|
|
ReadPci(PciCfg1, (PUCHAR)dataPort, readOffset, sizeof(ULONG));
|
|
|
|
index++;
|
|
dataPort++;
|
|
i++;
|
|
}
|
|
|
|
dprintf(" INT%02x: %08x%08x ( ",
|
|
currentInterrupt,
|
|
interruptIndex.HighPart,
|
|
interruptIndex.LowPart);
|
|
|
|
dprintf("MessageType: %lx ", interruptIndex.LowPart.MessageType);
|
|
|
|
if (interruptIndex.LowPart.Mask) {
|
|
dprintf("Masked ");
|
|
}
|
|
if (interruptIndex.LowPart.Polarity) {
|
|
dprintf("active-low ");
|
|
}else{
|
|
dprintf("active-high ");
|
|
}
|
|
|
|
if (interruptIndex.LowPart.RequestEOI) {
|
|
dprintf("RequestEOI ");
|
|
}
|
|
|
|
if (interruptIndex.HighPart.PassPW) {
|
|
dprintf("PassPW ");
|
|
}
|
|
|
|
if (interruptIndex.HighPart.WaitingForEOI) {
|
|
dprintf("WaitingForEOI ");
|
|
}
|
|
dprintf(")\n");
|
|
|
|
currentInterrupt++;
|
|
}
|
|
}
|
|
|
|
VOID
|
|
PrintPciHtFreqError(
|
|
IN PPCI_HT_Frequency_Error FreqError
|
|
)
|
|
{
|
|
UCHAR asUCHAR;
|
|
|
|
asUCHAR = (*(PUCHAR)FreqError);
|
|
|
|
dprintf("Freq: ");
|
|
switch (FreqError->LinkFrequency) {
|
|
case HTFreq200MHz:
|
|
dprintf("200MHz ");
|
|
break;
|
|
case HTFreq300MHz:
|
|
dprintf("300MHz ");
|
|
break;
|
|
case HTFreq400MHz:
|
|
dprintf("400MHz ");
|
|
break;
|
|
case HTFreq500MHz:
|
|
dprintf("500MHz ");
|
|
break;
|
|
case HTFreq600MHz:
|
|
dprintf("600MHz ");
|
|
break;
|
|
case HTFreq800MHz:
|
|
dprintf("800MHz ");
|
|
break;
|
|
case HTFreq1000MHz:
|
|
dprintf("1000MHz ");
|
|
break;
|
|
case HTFreqReserved:
|
|
case HTFreqVendorDefined:
|
|
default:
|
|
dprintf("?? ");
|
|
break;
|
|
}
|
|
|
|
//
|
|
// only print an error if we have one
|
|
//
|
|
if (asUCHAR & 0xf0) {
|
|
|
|
dprintf("Error: ");
|
|
|
|
if (FreqError->ProtocolError) {
|
|
dprintf("ProtocolError ");
|
|
}
|
|
|
|
if (FreqError->OverflowError) {
|
|
dprintf("OverflowError ");
|
|
}
|
|
if (FreqError->EndOfChainError) {
|
|
dprintf("EndOfChainError ");
|
|
}
|
|
if (FreqError->CTLTimeout) {
|
|
dprintf("CTLTimeout ");
|
|
}
|
|
}
|
|
|
|
dprintf("\n");
|
|
}
|
|
|
|
VOID
|
|
PrintPciHtFeatureCap(
|
|
IN PPCI_HT_FeatureCap FeatureCap,
|
|
IN PPCI_HT_FeatureCap_Ex FeatureCapEx
|
|
)
|
|
{
|
|
|
|
if (FeatureCap->IsocMode) {
|
|
dprintf("IsocMode ");
|
|
}
|
|
|
|
if (FeatureCap->LDTSTOP) {
|
|
dprintf("LDTSTOP ");
|
|
}
|
|
|
|
if (FeatureCap->CRCTestMode) {
|
|
dprintf("CRCTestMode ");
|
|
}
|
|
|
|
if (FeatureCapEx){
|
|
if (FeatureCapEx->ExtendedRegisterSet) {
|
|
dprintf("ExtendedRegisterSet ");
|
|
}
|
|
}
|
|
|
|
dprintf("\n");
|
|
}
|
|
VOID
|
|
PrintPciHtErrorHandling(
|
|
IN PPCI_HT_ErrorHandling ErrorHandling
|
|
)
|
|
{
|
|
|
|
USHORT asUSHORT = (*(PUSHORT)ErrorHandling);
|
|
|
|
if (asUSHORT & 0xffff) {
|
|
|
|
if (ErrorHandling->ProtFloodEn){
|
|
dprintf("ProtFloodEn ");
|
|
}
|
|
|
|
if (ErrorHandling->OverflowFloodEn){
|
|
dprintf("OverflowFloodEn ");
|
|
}
|
|
|
|
if (ErrorHandling->ProtFatalEn){
|
|
dprintf("ProtFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->OverflowFatalEn){
|
|
dprintf("OverflowFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->EOCFatalEn){
|
|
dprintf("EOCFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->RespFatalEn){
|
|
dprintf("RespFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->CRCFatalEn){
|
|
dprintf("CRCFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->SERRFataEn){
|
|
dprintf("SERRFataEn ");
|
|
}
|
|
|
|
if (ErrorHandling->ChainFail){
|
|
dprintf("ChainFail ");
|
|
}
|
|
|
|
if (ErrorHandling->ResponseError){
|
|
dprintf("ResponseError ");
|
|
}
|
|
|
|
if (ErrorHandling->ProtNonFatalEn){
|
|
dprintf("ProtNonFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->OverflowNonFatalEn){
|
|
dprintf("OverflowNonFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->EOCNonFatalEn){
|
|
dprintf("EOCNonFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->RespNonFatalEn){
|
|
dprintf("RespNonFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->CRCNonFatalEn){
|
|
dprintf("CRCNonFatalEn ");
|
|
}
|
|
|
|
if (ErrorHandling->SERRNonFatalEn){
|
|
dprintf("SERRNonFatalEn ");
|
|
}
|
|
}
|
|
dprintf("\n");
|
|
}
|
|
|
|
BOOL
|
|
PrintPciHtCaps(
|
|
IN PPCI_TYPE1_CFG_BITS PciCfg1,
|
|
IN PCHAR CapData,
|
|
IN ULONG CapOffset,
|
|
IN PCHAR Pad
|
|
)
|
|
{
|
|
PPCI_HT_CAPABILITY pciHtCap;
|
|
ULONG offset;
|
|
|
|
pciHtCap = (PPCI_HT_CAPABILITY)CapData;
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, Command);
|
|
dprintf("%s%02x: Command %04x ", Pad, offset, pciHtCap->Command);
|
|
|
|
PrintPciHtCommandReg(pciHtCap);
|
|
|
|
if (pciHtCap->Command.Generic.CapabilityType == HTInterruptDiscoveryConfig){
|
|
//
|
|
// Handle the interrupt stuff and return
|
|
//
|
|
PrintPciHtInterruptBlock(PciCfg1, CapOffset);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Print the common link control/config
|
|
//
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, LinkControl_0);
|
|
dprintf("%s%02x: LinkControl_0 %04x ", Pad, offset, pciHtCap->LinkControl_0);
|
|
PrintPciHtLinkControl(&pciHtCap->LinkControl_0);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, LinkConfig_0);
|
|
dprintf("%s%02x: LinkConfig_0 %04x ", Pad, offset, pciHtCap->LinkConfig_0);
|
|
PrintPciHtLinkConfig(&pciHtCap->LinkConfig_0);
|
|
|
|
//
|
|
// Now deal with the host/slave specifics
|
|
//
|
|
switch (pciHtCap->Command.Generic.CapabilityType) {
|
|
|
|
case HTSlavePrimary:
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, LinkControl_0);
|
|
dprintf("%s%02x: LinkControl_1 %04x ", Pad, offset, pciHtCap->LinkControl_0);
|
|
PrintPciHtLinkControl(&pciHtCap->SlavePrimary.LinkControl_1);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.LinkConfig_1);
|
|
dprintf("%s%02x: LinkConfig_1 %04x ", Pad, offset, pciHtCap->SlavePrimary.LinkConfig_1);
|
|
PrintPciHtLinkConfig(&pciHtCap->SlavePrimary.LinkConfig_1);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.RevisionID);
|
|
dprintf("%s%02x: RevisionID %02x:%02x (Major:Minor)\n", Pad, offset,
|
|
pciHtCap->SlavePrimary.RevisionID.MajorRev,
|
|
pciHtCap->SlavePrimary.RevisionID.MinorRev);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.FreqErr_0);
|
|
dprintf("%s%02x: FreqErr_0 %02x ", Pad, offset, pciHtCap->SlavePrimary.FreqErr_0);
|
|
PrintPciHtFreqError(&pciHtCap->SlavePrimary.FreqErr_0);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.LinkFreqCap_0);
|
|
dprintf("%s%02x: LinkFreqCap_0 %04x\n", Pad, offset, pciHtCap->SlavePrimary.LinkFreqCap_0);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.FeatureCap);
|
|
dprintf("%s%02x: FeatureCap %02x ", Pad, offset, pciHtCap->SlavePrimary.FeatureCap);
|
|
PrintPciHtFeatureCap(&pciHtCap->SlavePrimary.FeatureCap, NULL);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.FreqErr_1);
|
|
dprintf("%s%02x: FreqErr_1 %02x ", Pad, offset, pciHtCap->SlavePrimary.FreqErr_1);
|
|
PrintPciHtFreqError(&pciHtCap->SlavePrimary.FreqErr_1);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.LinkFreqCap_1);
|
|
dprintf("%s%02x: LinkFreqCap_1 %04x\n", Pad, offset, pciHtCap->SlavePrimary.LinkFreqCap_1);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.EnumerationScratchpad);
|
|
dprintf("%s%02x: EnumScratchpad %04x\n", Pad, offset, pciHtCap->SlavePrimary.EnumerationScratchpad);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.ErrorHandling);
|
|
dprintf("%s%02x: ErrorHandling %04x ", Pad, offset, pciHtCap->SlavePrimary.ErrorHandling);
|
|
PrintPciHtErrorHandling(&pciHtCap->SlavePrimary.ErrorHandling);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.MemoryBaseUpper8Bits);
|
|
dprintf("%s%02x: MemBaseUpper %02x\n", Pad, offset, pciHtCap->SlavePrimary.MemoryBaseUpper8Bits);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, SlavePrimary.MemoryLimitUpper8Bits);
|
|
dprintf("%s%02x: MemLimitUpper %02x\n", Pad, offset, pciHtCap->SlavePrimary.MemoryLimitUpper8Bits);
|
|
break;
|
|
|
|
case HTHostSecondary:
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.RevisionID);
|
|
dprintf("%s%02x: RevisionID %02x:%02x (Major:Minor)\n", Pad, offset,
|
|
pciHtCap->HostSecondary.RevisionID.MajorRev,
|
|
pciHtCap->HostSecondary.RevisionID.MinorRev);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.FreqErr_0);
|
|
dprintf("%s%02x: FreqErr_0 %02x ", Pad, offset, pciHtCap->HostSecondary.FreqErr_0);
|
|
PrintPciHtFreqError(&pciHtCap->HostSecondary.FreqErr_0);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.LinkFreqCap_0);
|
|
dprintf("%s%02x: LinkFreqCap_0 %04x\n", Pad, offset, pciHtCap->HostSecondary.LinkFreqCap_0);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.FeatureCap);
|
|
dprintf("%s%02x: FeatureCap %04x ", Pad, offset, pciHtCap->HostSecondary.FeatureCap);
|
|
PrintPciHtFeatureCap(&pciHtCap->HostSecondary.FeatureCap, &pciHtCap->HostSecondary.FeatureCapEx);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.EnumerationScratchpad);
|
|
dprintf("%s%02x: EnumScratchpad %04x\n", Pad, offset, pciHtCap->HostSecondary.EnumerationScratchpad);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.ErrorHandling);
|
|
dprintf("%s%02x: ErrorHandling %04x ", Pad, offset, pciHtCap->HostSecondary.ErrorHandling);
|
|
PrintPciHtErrorHandling(&pciHtCap->HostSecondary.ErrorHandling);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.MemoryBaseUpper8Bits);
|
|
dprintf("%s%02x: MemBaseUpper %02x\n", Pad, offset, pciHtCap->HostSecondary.MemoryBaseUpper8Bits);
|
|
|
|
offset = CapOffset + FIELD_OFFSET(PCI_HT_CAPABILITY, HostSecondary.MemoryLimitUpper8Bits);
|
|
dprintf("%s%02x: MemLimitUpper %02x\n", Pad, offset, pciHtCap->HostSecondary.MemoryLimitUpper8Bits);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
PrintPciMSICaps(
|
|
PCHAR pData,
|
|
ULONG CapOffset,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
PPCI_MSI_CAPABILITY pMsiCap;
|
|
pMsiCap = (PPCI_MSI_CAPABILITY) pData;
|
|
if (!Pad) {
|
|
Pad = "";
|
|
}
|
|
|
|
dprintf("%s%02x: MsgCtrl ",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, MessageControl));
|
|
if (pMsiCap->MessageControl.CapableOf64Bits) {
|
|
dprintf("64BitCapable ");
|
|
}
|
|
if (pMsiCap->MessageControl.MSIEnable) {
|
|
dprintf("MSIEnable ");
|
|
}
|
|
|
|
dprintf("MultipleMsgEnable:%lx ", pMsiCap->MessageControl.MultipleMessageEnable);
|
|
dprintf("MultipleMsgCapable:%lx ", pMsiCap->MessageControl.MultipleMessageCapable);
|
|
dprintf("%s%02x: MsgAddr %lx\n",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, MessageAddressLower),
|
|
pMsiCap->MessageAddressLower.Raw);
|
|
|
|
if (pMsiCap->MessageControl.CapableOf64Bits) {
|
|
dprintf("%s%02x: MsgAddrHi %lx\n",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, Option64Bit.MessageAddressUpper),
|
|
pMsiCap->Option64Bit.MessageAddressUpper);
|
|
dprintf("%s%02x: MsData %lx\n",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, Option64Bit.MessageData),
|
|
pMsiCap->Option64Bit.MessageData);
|
|
} else {
|
|
dprintf("%s%02x: MsData %lx\n",
|
|
Pad,
|
|
CapOffset + FIELD_OFFSET(PCI_MSI_CAPABILITY, Option32Bit.MessageData),
|
|
pMsiCap->Option32Bit.MessageData);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*** CardBus Registers
|
|
*/
|
|
|
|
VOID
|
|
PrintCBSktEventReg(
|
|
UCHAR Register
|
|
)
|
|
{
|
|
dprintf("%lx ", Register);
|
|
if (Register & SKTEVENT_CSTSCHG) {
|
|
dprintf("CSTSCHG ");
|
|
}
|
|
if (Register & SKTEVENT_CCD1) {
|
|
dprintf("/CCD1 ");
|
|
}
|
|
if (Register & SKTEVENT_CCD2) {
|
|
dprintf("/CCD2 ");
|
|
}
|
|
if (Register & SKTEVENT_POWERCYCLE) {
|
|
dprintf("PowerCycle ");
|
|
}
|
|
}
|
|
|
|
//Socket Mask Register
|
|
|
|
VOID
|
|
PrintCBSktMaskReg(
|
|
UCHAR Register
|
|
)
|
|
{
|
|
dprintf("%lx ", Register);
|
|
|
|
if (Register & SKTMSK_POWERCYCLE) {
|
|
dprintf("PowerCycle ");
|
|
}
|
|
if (Register & SKTMSK_CSTSCHG) {
|
|
dprintf("CSTSCHG ");
|
|
}
|
|
if ((Register & SKTMSK_CCD) == 0) {
|
|
dprintf("CSCDisabled ");
|
|
} else if ((Register & SKTMSK_CCD) == SKTMSK_CCD) {
|
|
dprintf("CSCEnabled ");
|
|
} else {
|
|
dprintf("Undefined ");
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//Socket Present State Register
|
|
VOID
|
|
PrintCBSktStateReg(
|
|
ULONG Register
|
|
)
|
|
{
|
|
dprintf("%08lx ", Register);
|
|
|
|
if (Register & SKTSTATE_CSTSCHG) {
|
|
dprintf("CSTSCHG ");
|
|
}
|
|
if (Register & SKTSTATE_POWERCYCLE) {
|
|
dprintf("PowerCycle ");
|
|
}
|
|
if (Register & SKTSTATE_CARDTYPE_MASK) {
|
|
dprintf("");
|
|
}
|
|
if (Register & SKTSTATE_R2CARD) {
|
|
dprintf("R2Card ");
|
|
}
|
|
if (Register & SKTSTATE_CBCARD) {
|
|
dprintf("CBCard ");
|
|
}
|
|
if (Register & SKTSTATE_OPTI_DOCK) {
|
|
dprintf("OptiDock ");
|
|
}
|
|
if (Register & SKTSTATE_CARDINT) {
|
|
dprintf("CardInt ");
|
|
}
|
|
if (Register & SKTSTATE_NOTACARD) {
|
|
dprintf("NotACard ");
|
|
}
|
|
if (Register & SKTSTATE_DATALOST) {
|
|
dprintf("DataLoss ");
|
|
}
|
|
if (Register & SKTSTATE_BADVCCREQ) {
|
|
dprintf("BadVccReq ");
|
|
}
|
|
if (Register & SKTSTATE_5VCARD) {
|
|
dprintf("5VCard ");
|
|
}
|
|
if (Register & SKTSTATE_3VCARD) {
|
|
dprintf("3VCard ");
|
|
}
|
|
if (Register & SKTSTATE_XVCARD) {
|
|
dprintf("XVCard ");
|
|
}
|
|
if (Register & SKTSTATE_YVCARD) {
|
|
dprintf("YVCard ");
|
|
}
|
|
if (Register & SKTSTATE_5VSOCKET) {
|
|
dprintf("5VSkt ");
|
|
}
|
|
if (Register & SKTSTATE_3VSOCKET) {
|
|
dprintf("3VSkt ");
|
|
}
|
|
if (Register & SKTSTATE_XVSOCKET) {
|
|
dprintf("XVSkt ");
|
|
}
|
|
if (Register & SKTSTATE_YVSOCKET) {
|
|
dprintf("YVSkt ");
|
|
}
|
|
if ((Register & SKTSTATE_CCD_MASK) == 0) {
|
|
dprintf("CardPresent ");
|
|
} else if ((Register & SKTSTATE_CCD_MASK) == SKTSTATE_CCD_MASK) {
|
|
dprintf("NoCard ");
|
|
} else {
|
|
dprintf("CardMayPresent ");
|
|
}
|
|
}
|
|
|
|
//Socket Control Register
|
|
VOID
|
|
PrintCBSktCtrlReg(
|
|
ULONG Register
|
|
)
|
|
{
|
|
ULONG Ctrl;
|
|
dprintf("%08lx ", Register);
|
|
|
|
Ctrl = Register & SKTPOWER_VPP_CONTROL;
|
|
dprintf("Vpp:");
|
|
switch (Ctrl) {
|
|
case SKTPOWER_VPP_OFF:
|
|
dprintf("Off");
|
|
break;
|
|
case SKTPOWER_VPP_120V:
|
|
dprintf("12V");
|
|
break;
|
|
case SKTPOWER_VPP_050V:
|
|
dprintf("5V");
|
|
break;
|
|
case SKTPOWER_VPP_033V:
|
|
dprintf("3.3V");
|
|
break;
|
|
case SKTPOWER_VPP_0XXV:
|
|
dprintf("X.XV");
|
|
break;
|
|
case SKTPOWER_VPP_0YYV:
|
|
dprintf("Y.YV");
|
|
break;
|
|
}
|
|
|
|
dprintf(" Vcc:");
|
|
switch (Register & SKTPOWER_VCC_CONTROL) {
|
|
case SKTPOWER_VCC_OFF:
|
|
dprintf("Off");
|
|
break;
|
|
case SKTPOWER_VCC_050V:
|
|
dprintf("5V");
|
|
break;
|
|
case SKTPOWER_VCC_033V:
|
|
dprintf("3.3V");
|
|
break;
|
|
case SKTPOWER_VCC_0XXV:
|
|
dprintf("X.XV");
|
|
break;
|
|
case SKTPOWER_VCC_0YYV:
|
|
dprintf("Y.YV");
|
|
break;
|
|
}
|
|
if (Register & SKTPOWER_STOPCLOCK) {
|
|
dprintf(" ClockStopEnabled ");
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
PrintCBRegs(
|
|
PCHAR pData,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
ULONG Off=0;
|
|
dprintf("%s%02lx: SktEvent ", Pad, Off);
|
|
PrintCBSktEventReg(*pData);
|
|
dprintf("\n");
|
|
pData+=4; Off+=4;
|
|
dprintf("%s%02lx: SktMask ", Pad, Off);
|
|
PrintCBSktMaskReg(*pData);
|
|
dprintf("\n");
|
|
pData+=4; Off+=4;
|
|
dprintf("%s%02lx: SktState ", Pad, Off);
|
|
PrintCBSktStateReg(*((PULONG)pData));
|
|
dprintf("\n");
|
|
pData+=4; Off+=4;
|
|
dprintf("%s%02lx: SktForce %08lx\n", Pad, Off, *((PULONG)pData));
|
|
pData+=4; Off+=4;
|
|
dprintf("%s%02lx: SktCtrl ", Pad, Off);
|
|
PrintCBSktEventReg(*(pData));
|
|
dprintf("\n");
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*** ExCA Registers
|
|
*/
|
|
|
|
VOID
|
|
PrintExCARegs(
|
|
PEXCAREGS pExCARegs
|
|
)
|
|
{
|
|
struct _MEMWIN_EXCA {
|
|
USHORT Start;
|
|
USHORT Stop;
|
|
USHORT Offset;
|
|
USHORT Reserved;
|
|
} MemWin, *pMemWin;
|
|
|
|
dprintf("%02lx: IDRev %02lx", FIELD_OFFSET(EXCAREGS, bIDRev),pExCARegs->bIDRev);
|
|
if ((pExCARegs->bIDRev & IDREV_IFID_MASK) == IDREV_IFID_IO) {
|
|
dprintf(" IOOnly");
|
|
}
|
|
else if ((pExCARegs->bIDRev & IDREV_IFID_MASK) == IDREV_IFID_MEM) {
|
|
dprintf(" MemOnly");
|
|
} else if ((pExCARegs->bIDRev & IDREV_IFID_MASK) == IDREV_IFID_IOMEM) {
|
|
dprintf(" IO&Mem");
|
|
}
|
|
dprintf(" Rev: %02lx\n", pExCARegs->bIDRev & IDREV_REV_MASK);
|
|
|
|
dprintf("%02lx: IFStatus %02lx",
|
|
FIELD_OFFSET(EXCAREGS, bInterfaceStatus),
|
|
pExCARegs->bInterfaceStatus);
|
|
|
|
if (pExCARegs->bInterfaceStatus & IFS_BVD1) {
|
|
dprintf(" BVD1");
|
|
}
|
|
if (pExCARegs->bInterfaceStatus & IFS_BVD2) {
|
|
dprintf(" BVD2");
|
|
}
|
|
if (pExCARegs->bInterfaceStatus & IFS_CD1) {
|
|
dprintf(" CD1");
|
|
}
|
|
if (pExCARegs->bInterfaceStatus & IFS_CD2) {
|
|
dprintf(" CD2");
|
|
}
|
|
if (pExCARegs->bInterfaceStatus & IFS_WP) {
|
|
dprintf(" WP");
|
|
}
|
|
if (pExCARegs->bInterfaceStatus & IFS_RDYBSY) {
|
|
dprintf(" Ready");
|
|
}
|
|
if (pExCARegs->bInterfaceStatus & IFS_CARDPWR_ACTIVE) {
|
|
dprintf(" PowerActive");
|
|
}
|
|
if (pExCARegs->bInterfaceStatus & IFS_VPP_VALID) {
|
|
dprintf(" VppValid");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%02lx: PwrCtrl %02lx", FIELD_OFFSET(EXCAREGS, bPowerControl), pExCARegs->bPowerControl);
|
|
|
|
dprintf(" Vpp1=");
|
|
switch (pExCARegs->bPowerControl & PC_VPP1_MASK) {
|
|
case PC_VPP_NO_CONNECT:
|
|
dprintf("Off");
|
|
break;
|
|
case PC_VPP_SETTO_VCC:
|
|
dprintf("Vcc");
|
|
break;
|
|
case PC_VPP_SETTO_VPP:
|
|
dprintf("Vpp");
|
|
break;
|
|
}
|
|
dprintf(" Vpp2=");
|
|
switch ((pExCARegs->bPowerControl & PC_VPP2_MASK) >> 2) {
|
|
case PC_VPP_NO_CONNECT:
|
|
dprintf("Off");
|
|
break;
|
|
case PC_VPP_SETTO_VCC:
|
|
dprintf("Vcc");
|
|
break;
|
|
case PC_VPP_SETTO_VPP:
|
|
dprintf("Vpp");
|
|
break;
|
|
}
|
|
if (pExCARegs->bPowerControl & PC_CARDPWR_ENABLE) {
|
|
dprintf(" PwrEnable");
|
|
}
|
|
if (pExCARegs->bPowerControl & PC_AUTOPWR_ENABLE) {
|
|
dprintf(" AutoPwrEnabled");
|
|
}
|
|
if (pExCARegs->bPowerControl & PC_RESETDRV_DISABLE) {
|
|
dprintf(" RESETDRVDisabled");
|
|
}
|
|
if (pExCARegs->bPowerControl & PC_OUTPUT_ENABLE) {
|
|
dprintf(" OutputEnable");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%02lx: IntGenCtrl %02lx",
|
|
FIELD_OFFSET(EXCAREGS, bIntGenControl),
|
|
pExCARegs->bIntGenControl);
|
|
if (pExCARegs->bIntGenControl & IGC_INTR_ENABLE) {
|
|
dprintf(" INTREnable");
|
|
}
|
|
if (pExCARegs->bIntGenControl & IGC_PCCARD_IO) {
|
|
dprintf(" IOCard");
|
|
}
|
|
if (pExCARegs->bIntGenControl & IGC_PCCARD_RESETLO) {
|
|
dprintf(" ResetOff");
|
|
}
|
|
if (pExCARegs->bIntGenControl & IGC_RINGIND_ENABLE) {
|
|
dprintf(" RingIndEnable");
|
|
}
|
|
dprintf(" CardIRQ:%lx\n", pExCARegs->bIntGenControl & IGC_IRQ_MASK);
|
|
|
|
dprintf("%02lx: CardStatChange %02lx", FIELD_OFFSET(EXCAREGS, bCardStatusChange), pExCARegs->bCardStatusChange);
|
|
if (pExCARegs->bCardStatusChange & CSC_BATT_DEAD) {
|
|
dprintf(" BATTDEAD");
|
|
}
|
|
if (pExCARegs->bCardStatusChange & CSC_BATT_WARNING) {
|
|
dprintf(" BATTWARN");
|
|
}
|
|
if (pExCARegs->bCardStatusChange & CSC_READY_CHANGE) {
|
|
dprintf(" RDYC");
|
|
}
|
|
if (pExCARegs->bCardStatusChange & CSC_CD_CHANGE) {
|
|
dprintf(" CDC");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%02lx: IntConfig %02lx",
|
|
FIELD_OFFSET(EXCAREGS, bCardStatusIntConfig),
|
|
pExCARegs->bCardStatusIntConfig);
|
|
if (pExCARegs->bCardStatusIntConfig & CSCFG_BATT_DEAD) {
|
|
dprintf(" BattDeadEnable");
|
|
}
|
|
if (pExCARegs->bCardStatusIntConfig & CSCFG_BATT_WARNING) {
|
|
dprintf(" BattWarnEnable");
|
|
}
|
|
if (pExCARegs->bCardStatusIntConfig & CSCFG_READY_ENABLE) {
|
|
dprintf(" RDYEnable");
|
|
}
|
|
if (pExCARegs->bCardStatusIntConfig & CSCFG_CD_ENABLE) {
|
|
dprintf(" CDEnable");
|
|
}
|
|
dprintf(" CSCIRQ:%lx\n",(pExCARegs->bCardStatusIntConfig & CSCFG_IRQ_MASK));
|
|
|
|
dprintf("%02lx: WinEnable %02lx",
|
|
FIELD_OFFSET(EXCAREGS, bWindowEnable),
|
|
pExCARegs->bWindowEnable);
|
|
if (pExCARegs->bWindowEnable & WE_MEM0_ENABLE) {
|
|
dprintf(" Mem0Enable");
|
|
}
|
|
if (pExCARegs->bWindowEnable & WE_MEM1_ENABLE) {
|
|
dprintf(" Mem1Enable");
|
|
}
|
|
if (pExCARegs->bWindowEnable & WE_MEM2_ENABLE) {
|
|
dprintf(" Mem2Enable");
|
|
}
|
|
if (pExCARegs->bWindowEnable & WE_MEM3_ENABLE) {
|
|
dprintf(" Mem3Enable");
|
|
}
|
|
if (pExCARegs->bWindowEnable & WE_MEM4_ENABLE) {
|
|
dprintf(" Mem4Enable");
|
|
}
|
|
|
|
if (pExCARegs->bWindowEnable & WE_MEMCS16_DECODE) {
|
|
dprintf(" DecodeA23-A12");
|
|
}
|
|
if (pExCARegs->bWindowEnable & WE_IO0_ENABLE) {
|
|
dprintf(" IO0Enable");
|
|
}
|
|
if (pExCARegs->bWindowEnable & WE_IO1_ENABLE) {
|
|
dprintf(" IO1Enable");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%02lx: IOWinCtrl %02lx",
|
|
FIELD_OFFSET(EXCAREGS, bIOControl),
|
|
pExCARegs->bIOControl);
|
|
if (pExCARegs->bIOControl & IOC_IO0_DATASIZE) {
|
|
dprintf(" IO0CardIOCS");
|
|
}
|
|
if (pExCARegs->bIOControl & IOC_IO0_IOCS16) {
|
|
dprintf(" IO016Bit");
|
|
}
|
|
if (pExCARegs->bIOControl & IOC_IO0_ZEROWS) {
|
|
dprintf(" IO0ZeroWS");
|
|
}
|
|
if (pExCARegs->bIOControl & IOC_IO0_WAITSTATE) {
|
|
dprintf(" IO0WS");
|
|
}
|
|
if (pExCARegs->bIOControl & IOC_IO1_DATASIZE) {
|
|
dprintf(" IO1CardIOCS");
|
|
}
|
|
if (pExCARegs->bIOControl & IOC_IO1_IOCS16) {
|
|
dprintf(" IO116Bit");
|
|
}
|
|
if (pExCARegs->bIOControl & IOC_IO1_ZEROWS) {
|
|
dprintf(" IO1ZeroWS");
|
|
}
|
|
if (pExCARegs->bIOControl & IOC_IO1_WAITSTATE) {
|
|
dprintf(" IO1WS");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%02lx: IOWin0Start %02lx %02lx\n",
|
|
FIELD_OFFSET(EXCAREGS, bIO0StartLo),
|
|
pExCARegs->bIO0StartHi, pExCARegs->bIO0StartLo);
|
|
dprintf("%02lx: IOWin0Stop %02lx %02lx\n",
|
|
FIELD_OFFSET(EXCAREGS, bIO0StopLo),
|
|
pExCARegs->bIO0StopHi, pExCARegs->bIO0StopLo);
|
|
dprintf("%02lx: IOWin1Start %02lx %02lx\n",
|
|
FIELD_OFFSET(EXCAREGS, bIO1StartLo),
|
|
pExCARegs->bIO1StartHi, pExCARegs->bIO1StartLo);
|
|
dprintf("%02lx: IOWin1Stop %02lx %02lx\n",
|
|
FIELD_OFFSET(EXCAREGS, bIO1StopLo),
|
|
pExCARegs->bIO1StopHi, pExCARegs->bIO1StopLo);
|
|
|
|
pMemWin = (struct _MEMWIN_EXCA*) &pExCARegs->bMem0StartLo;
|
|
for (int i=0;
|
|
i<5;
|
|
i++, pMemWin++) {
|
|
|
|
dprintf("%02lx: MemWin%lxStart %04lx",
|
|
FIELD_OFFSET(EXCAREGS, bMem0StartLo) + i*sizeof(_MEMWIN_EXCA),
|
|
i, pMemWin->Start & MEMBASE_ADDR_MASK);
|
|
if (pMemWin->Start & MEMBASE_ZEROWS) {
|
|
dprintf(" ZeroWs");
|
|
} else if (pMemWin->Start & MEMBASE_16BIT) {
|
|
dprintf(" 16Bit");
|
|
}
|
|
dprintf("\n");
|
|
|
|
dprintf("%02lx: MemWin%lxStop %04lx, WaitState:%lx\n",
|
|
FIELD_OFFSET(EXCAREGS, bMem0StopLo) + i*sizeof(_MEMWIN_EXCA),
|
|
i,
|
|
(pMemWin->Stop & MEMEND_ADDR_MASK),
|
|
(pMemWin->Stop & MEMEND_WS_MASK));
|
|
dprintf("%02lx: MemWin%lxOffset %04lx %s%s\n",
|
|
FIELD_OFFSET(EXCAREGS, bMem0OffsetLo) + i*sizeof(_MEMWIN_EXCA),
|
|
i,
|
|
(pMemWin->Offset & MEMOFF_ADDR_MASK),
|
|
((pMemWin->Offset & MEMOFF_REG_ACTIVE) ? " RegActive" : ""),
|
|
((pMemWin->Offset & MEMOFF_WP) ? " WP" : "")
|
|
);
|
|
|
|
}
|
|
}
|
|
|
|
VOID
|
|
PrintExCAHiRegs(
|
|
PUCHAR pExCaReg,
|
|
PCHAR Pad
|
|
)
|
|
{
|
|
ULONG Off = sizeof(EXCAREGS);
|
|
dprintf("%s%02lx: MemWin0High %02lx\n", Pad, Off++, *(pExCaReg++));
|
|
dprintf("%s%02lx: MemWin1High %02lx\n", Pad, Off++, *(pExCaReg++));
|
|
dprintf("%s%02lx: MemWin2High %02lx\n", Pad, Off++, *(pExCaReg++));
|
|
dprintf("%s%02lx: MemWin3High %02lx\n", Pad, Off++, *(pExCaReg++));
|
|
dprintf("%s%02lx: MemWin4High %02lx\n", Pad, Off++, *(pExCaReg++));
|
|
dprintf("%s%02lx: CLIOWin0High %02lx\n", Pad, Off++, *(pExCaReg++));
|
|
dprintf("%s%02lx: CLIOWin1High %02lx\n", Pad, Off++, *(pExCaReg++));
|
|
|
|
}
|
|
|
|
/***LP ReadExCAByte - Read ExCA byte register
|
|
*
|
|
* ENTRY
|
|
* dwBaseAddr - Base port address
|
|
* dwReg - register offset
|
|
*
|
|
* EXIT
|
|
* returns data read
|
|
*/
|
|
|
|
BYTE
|
|
ReadExCAByte(ULONG64 dwBaseAddr, DWORD dwReg)
|
|
{
|
|
BYTE bData=0;
|
|
ULONG ulSize;
|
|
|
|
ulSize = sizeof(BYTE);
|
|
WriteIoSpace64(dwBaseAddr, dwReg, &ulSize);
|
|
ulSize = sizeof(BYTE);
|
|
ReadIoSpace64(dwBaseAddr + 1, (PULONG)&bData, &ulSize);
|
|
|
|
return bData;
|
|
} //ReadExCAByte
|
|
|
|
/***LP GetClassDesc - Get class description string
|
|
*
|
|
* ENTRY
|
|
* BaseClass - Base Class code
|
|
* SubClass - Sub Class code
|
|
* ProgIF - Program Interface code
|
|
* ClassDesc - Which string call wants
|
|
*
|
|
* EXIT-SUCCESS
|
|
* returns pointer to description string
|
|
* EXIT-FAILURE
|
|
* returns NULL
|
|
*/
|
|
|
|
PCHAR
|
|
GetClassDesc(
|
|
IN UCHAR BaseClass,
|
|
IN UCHAR SubClass,
|
|
IN UCHAR ProgIf,
|
|
IN PCI_CLASSCODEDESC ClassDesc
|
|
)
|
|
{
|
|
ULONG i;
|
|
|
|
if ((BaseClass == 1) && (SubClass == 1)){
|
|
//
|
|
// IDE progIf is special. Ignore it here.
|
|
//
|
|
ProgIf = 0;;
|
|
}
|
|
|
|
i = 0;
|
|
while (PciClassCodeTable[i].BaseDesc){
|
|
|
|
if ((PciClassCodeTable[i].BaseClass == BaseClass) &&
|
|
(PciClassCodeTable[i].SubClass == SubClass) &&
|
|
(PciClassCodeTable[i].ProgIf == ProgIf)) {
|
|
|
|
switch (ClassDesc) {
|
|
case BaseClassDescription:
|
|
return PciClassCodeTable[i].BaseDesc;
|
|
break;
|
|
case SubClassDescription:
|
|
return PciClassCodeTable[i].SubDesc;
|
|
break;
|
|
case ProgIfDescription:
|
|
return PciClassCodeTable[i].ProgDesc;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
return NULL;
|
|
|
|
} //GetClassDesc
|
|
|
|
|
|
/*** GetVendorDesc - Get Vendor ID Description string.
|
|
*
|
|
* ENTRY
|
|
* VendorID -> Device's Vendor ID
|
|
* FullVenDesc - Flag to determine which string to return
|
|
*
|
|
* EXIT
|
|
* None
|
|
*/
|
|
PCHAR
|
|
GetVendorDesc(
|
|
IN USHORT VendorID,
|
|
IN BOOL FullVenDesc
|
|
)
|
|
{
|
|
|
|
ULONG i;
|
|
|
|
i = 0;
|
|
while (PciVenTable[i].VenId != 0xFFFF) {
|
|
|
|
if (PciVenTable[i].VenId == VendorID) {
|
|
|
|
if (FullVenDesc) {
|
|
return PciVenTable[i].VenFull;
|
|
}
|
|
|
|
if (PciVenTable[i].VenShort) {
|
|
return PciVenTable[i].VenShort;
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
|
|
i++;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/***LP PrintClassInfo - Print device class info.
|
|
*
|
|
* ENTRY
|
|
* Config -> ConfigSpace
|
|
* Reg - ConfigSpace register
|
|
*
|
|
* EXIT
|
|
* None
|
|
*/
|
|
|
|
VOID
|
|
PrintClassInfo(
|
|
IN PUCHAR Config,
|
|
IN ULONG Reg
|
|
)
|
|
{
|
|
PPCI_COMMON_CONFIG pcc = (PPCI_COMMON_CONFIG) Config;
|
|
PCI_CLASSCODEDESC classDesc;
|
|
UCHAR baseClass, subClass, progIF;
|
|
PCHAR pch;
|
|
|
|
baseClass = pcc->BaseClass;
|
|
subClass = pcc->SubClass;
|
|
progIF = pcc->ProgIf;
|
|
|
|
if (Reg == CONFIG_OFFSET(BaseClass)){
|
|
classDesc = BaseClassDescription;
|
|
}else if (Reg == CONFIG_OFFSET(SubClass)){
|
|
classDesc = SubClassDescription;
|
|
}else{
|
|
|
|
classDesc = ProgIfDescription;
|
|
|
|
//
|
|
// ProgIf for IDE gets extra attention
|
|
//
|
|
if ((pcc->BaseClass == 0x01) &&
|
|
(pcc->SubClass == 0x01) &&
|
|
(pcc->ProgIf != 0)){
|
|
|
|
dprintf(" ");
|
|
if (pcc->ProgIf & 0x80)
|
|
dprintf("MasterIDE ");
|
|
if (pcc->ProgIf & 0x02)
|
|
dprintf("PriNativeCapable ");
|
|
if (pcc->ProgIf & 0x01)
|
|
dprintf("PriNativeMode ");
|
|
if (pcc->ProgIf & 0x08)
|
|
dprintf("SecNativeCapable ");
|
|
if (pcc->ProgIf & 0x04)
|
|
dprintf("SecNativeMode");
|
|
|
|
dprintf("\n");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ((pch = GetClassDesc(baseClass, subClass, progIF, classDesc)) != NULL){
|
|
dprintf(" %s", pch);
|
|
}
|
|
|
|
dprintf("\n");
|
|
} //PrintClassInfo
|
|
|
|
VOID
|
|
DumpCfgSpace (
|
|
IN PPCI_TYPE1_CFG_BITS PciCfg1
|
|
)
|
|
{
|
|
PCI_COMMON_CONFIG commonConfig;
|
|
PPCI_COMMON_CONFIG pcs;
|
|
BYTE bHeaderType;
|
|
DWORD dwOffset, devicePrivateStart;
|
|
|
|
dwOffset = 0;
|
|
|
|
ReadPci(PciCfg1, (PUCHAR)&commonConfig, 0, sizeof(commonConfig));
|
|
pcs = &commonConfig;
|
|
bHeaderType = pcs->HeaderType & ~PCI_MULTIFUNCTION;
|
|
|
|
if (PrintCommonConfigSpace(pcs, " ")) {
|
|
switch (bHeaderType)
|
|
{
|
|
case PCI_DEVICE_TYPE:
|
|
PrintCfgSpaceType0(pcs, " ");
|
|
break;
|
|
|
|
case PCI_BRIDGE_TYPE:
|
|
PrintCfgSpaceType1(pcs, " ");
|
|
break;
|
|
|
|
case PCI_CARDBUS_BRIDGE_TYPE:
|
|
PrintCfgSpaceType2(pcs, " ");
|
|
break;
|
|
|
|
default:
|
|
dprintf(" TypeUnknown:\n");
|
|
PrintDataRange((PCHAR) &pcs->u, 12, CONFIG_OFFSET(u), " ");
|
|
}
|
|
|
|
if (bHeaderType == PCI_DEVICE_TYPE) {
|
|
dwOffset = pcs->u.type0.CapabilitiesPtr;
|
|
}
|
|
else if (bHeaderType == PCI_BRIDGE_TYPE) {
|
|
dwOffset = pcs->u.type1.CapabilitiesPtr;
|
|
}
|
|
else if (bHeaderType == PCI_CARDBUS_BRIDGE_TYPE) {
|
|
dwOffset = pcs->u.type2.CapabilitiesPtr;
|
|
}
|
|
else {
|
|
dwOffset = 0;
|
|
}
|
|
|
|
// dprintf("Status : %lx Offset %lx\n", pcs->Status, dwOffset);
|
|
if ((pcs->Status & PCI_STATUS_CAPABILITIES_LIST) &&
|
|
(dwOffset >= PCI_COMMON_HDR_LENGTH)) {
|
|
|
|
dprintf(" Capabilities:\n");
|
|
while ((dwOffset != 0)) {
|
|
PPCI_CAPABILITIES_HEADER pCap;
|
|
|
|
pCap = (PPCI_CAPABILITIES_HEADER)&((PBYTE)pcs)[dwOffset];
|
|
|
|
if (PrintPciCapHeader(pCap, dwOffset, " ")) {
|
|
switch (pCap->CapabilityID) {
|
|
case PCI_CAPABILITY_ID_POWER_MANAGEMENT:
|
|
PrintPciPowerManagement(((PCHAR)pCap), dwOffset, " ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_AGP_TARGET:
|
|
case PCI_CAPABILITY_ID_AGP:
|
|
PrintPciAGP(((PCHAR)pCap), dwOffset, " ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_MSI:
|
|
PrintPciMSICaps(((PCHAR)pCap), dwOffset, " ");
|
|
break;
|
|
|
|
case PCI_CAPABILITY_ID_HYPERTRANSPORT:
|
|
PrintPciHtCaps(PciCfg1, ((PCHAR)pCap), dwOffset, " ");
|
|
break;
|
|
}
|
|
dwOffset = pCap->Next;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
dprintf(" Device Private:\n");
|
|
|
|
devicePrivateStart = CONFIG_OFFSET(DeviceSpecific);
|
|
devicePrivateStart += (bHeaderType == PCI_CARDBUS_BRIDGE_TYPE ? sizeof(PCI_TYPE2_HEADER_EXTRAS) : 0);
|
|
|
|
PrintDataRange((PCHAR) pcs+devicePrivateStart,
|
|
(sizeof(PCI_COMMON_CONFIG) - devicePrivateStart)/4, devicePrivateStart, " ");
|
|
}
|
|
|
|
/***LP DumpCBRegs - Dump CardBus registers
|
|
*
|
|
* ENTRY
|
|
* pbBuff -> register base
|
|
*
|
|
* EXIT
|
|
* None
|
|
*/
|
|
|
|
VOID DumpCBRegs(PBYTE pbBuff)
|
|
{
|
|
PrintCBRegs((PCHAR) pbBuff, "");
|
|
} //DumpCBRegs
|
|
|
|
/***LP DumpExCARegs - Dump ExCA registers
|
|
*
|
|
* ENTRY
|
|
* pbBuff -> buffer
|
|
* dwSize - size of buffer
|
|
*
|
|
* EXIT
|
|
* None
|
|
*/
|
|
|
|
VOID DumpExCARegs(PBYTE pbBuff, DWORD dwSize)
|
|
{
|
|
PrintExCARegs((PEXCAREGS) pbBuff);
|
|
PrintExCAHiRegs(pbBuff + sizeof(EXCAREGS), "");
|
|
} //DumpExCARegs
|
|
|
|
DECLARE_API( dcs )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps PCI ConfigSpace
|
|
|
|
Arguments:
|
|
|
|
args - Supplies the Bus.Dev.Fn numbers
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
LONG lcArgs;
|
|
DWORD dwBus = 0;
|
|
DWORD dwDev = 0;
|
|
DWORD dwFn = 0;
|
|
|
|
|
|
lcArgs = sscanf(args, "%lx.%lx.%lx", &dwBus, &dwDev, &dwFn);
|
|
|
|
dprintf("!dcs now integrated into !pci 1xx (flag 100).\n"
|
|
"Use !pci 100 %lx %lx %lx to dump PCI config space.\n",
|
|
dwBus, dwDev, dwFn);
|
|
return E_INVALIDARG;
|
|
|
|
|
|
if (lcArgs != 3)
|
|
{
|
|
dprintf("invalid command syntax\n"
|
|
"Usage: dcs <Bus>.<Dev>.<Func>\n");
|
|
}
|
|
else
|
|
{
|
|
PCI_TYPE1_CFG_BITS PciCfg1;
|
|
|
|
PciCfg1.u.AsULONG = 0;
|
|
PciCfg1.u.bits.BusNumber = dwBus;
|
|
PciCfg1.u.bits.DeviceNumber = dwDev;
|
|
PciCfg1.u.bits.FunctionNumber = dwFn;
|
|
PciCfg1.u.bits.Enable = TRUE;
|
|
|
|
DumpCfgSpace(&PciCfg1);
|
|
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
DECLARE_API( ecs )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Edit PCI ConfigSpace
|
|
|
|
Arguments:
|
|
|
|
args - Bus.Dev.Fn
|
|
Dword Offset
|
|
Data
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
|
|
dprintf("Edit PCI ConfigSpace - must use one of the following:\n"
|
|
"!ecd - edit dword\n"
|
|
"!ecw - edit word\n"
|
|
"!ecb - edit byte\n");
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
DECLARE_API( ecb )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Edit PCI ConfigSpace BYTE
|
|
|
|
Arguments:
|
|
|
|
args - Bus.Dev.Fn Offset Data
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
LONG lcArgs;
|
|
DWORD bus = 0, dev = 0, fn = 0;
|
|
DWORD offset = 0, data = 0;
|
|
PCI_TYPE1_CFG_BITS pcicfg;
|
|
|
|
lcArgs = sscanf(args, "%lx.%lx.%lx %lx %lx", &bus, &dev, &fn, &offset, &data);
|
|
if (lcArgs != 5)
|
|
{
|
|
dprintf("invalid command syntax\n"
|
|
"Usage: ecb <Bus>.<Dev>.<Func> Offset Data\n");
|
|
}else{
|
|
|
|
//
|
|
// Init for PCI config.
|
|
//
|
|
pcicfg.u.AsULONG = 0;
|
|
pcicfg.u.bits.BusNumber = bus;
|
|
pcicfg.u.bits.DeviceNumber = dev;
|
|
pcicfg.u.bits.FunctionNumber = fn;
|
|
pcicfg.u.bits.Enable = TRUE;
|
|
|
|
if (!(WritePci (&pcicfg, (PUCHAR)&data, offset, sizeof(UCHAR)))){
|
|
dprintf("write operation failed!\n");
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
DECLARE_API( ecw )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Edit PCI ConfigSpace WORD
|
|
|
|
Arguments:
|
|
|
|
args - Bus.Dev.Fn Offset Data
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
LONG lcArgs;
|
|
DWORD bus = 0, dev = 0, fn = 0;
|
|
DWORD offset = 0, data = 0;
|
|
PCI_TYPE1_CFG_BITS pcicfg;
|
|
|
|
lcArgs = sscanf(args, "%lx.%lx.%lx %lx %lx", &bus, &dev, &fn, &offset, &data);
|
|
if (lcArgs != 5)
|
|
{
|
|
dprintf("invalid command syntax\n"
|
|
"Usage: ecw <Bus>.<Dev>.<Func> Offset Data\n");
|
|
}else{
|
|
|
|
if ((offset & 0x1) || (offset > 0xfe)) {
|
|
//
|
|
// not word aligned.
|
|
//
|
|
dprintf("offset must be word aligned and no greater than 0xfe\n");
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Init for PCI config.
|
|
//
|
|
pcicfg.u.AsULONG = 0;
|
|
pcicfg.u.bits.BusNumber = bus;
|
|
pcicfg.u.bits.DeviceNumber = dev;
|
|
pcicfg.u.bits.FunctionNumber = fn;
|
|
pcicfg.u.bits.Enable = TRUE;
|
|
|
|
if (!(WritePci (&pcicfg, (PUCHAR)&data, offset, sizeof(USHORT)))){
|
|
dprintf("write operation failed!\n");
|
|
return S_FALSE;
|
|
}
|
|
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
DECLARE_API( ecd )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Edit PCI ConfigSpace DWORD
|
|
|
|
Arguments:
|
|
|
|
args - Bus.Dev.Fn Offset Data
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
LONG lcArgs;
|
|
DWORD bus = 0, dev = 0, fn = 0;
|
|
DWORD offset = 0, data = 0;
|
|
PCI_TYPE1_CFG_BITS pcicfg;
|
|
|
|
lcArgs = sscanf(args, "%lx.%lx.%lx %lx %lx", &bus, &dev, &fn, &offset, &data);
|
|
if (lcArgs != 5)
|
|
{
|
|
dprintf("invalid command syntax\n"
|
|
"Usage: ecd <Bus>.<Dev>.<Func> Offset Data\n");
|
|
}else{
|
|
|
|
if ((offset & 0x3) || (offset > 0xfc)) {
|
|
//
|
|
// not dword aligned.
|
|
//
|
|
dprintf("offset must be dword aligned and no greater than 0xfc\n");
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Init for PCI config.
|
|
//
|
|
pcicfg.u.AsULONG = 0;
|
|
pcicfg.u.bits.BusNumber = bus;
|
|
pcicfg.u.bits.DeviceNumber = dev;
|
|
pcicfg.u.bits.FunctionNumber = fn;
|
|
pcicfg.u.bits.Enable = TRUE;
|
|
|
|
if (!(WritePci (&pcicfg, (PUCHAR)&data, offset, sizeof(ULONG)))){
|
|
dprintf("write operation failed!\n");
|
|
return S_FALSE;
|
|
}
|
|
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
DECLARE_API( cbreg )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps CardBus registers
|
|
|
|
Arguments:
|
|
|
|
args - Supplies the address in hex.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
BOOL rc = TRUE;
|
|
LONG lcArgs;
|
|
BOOL fPhysical = FALSE;
|
|
DWORD dwAddr = 0;
|
|
|
|
if (args == NULL)
|
|
{
|
|
dprintf("invalid command syntax\n"
|
|
"Usage: cbreg <RegBaseAddr>\n");
|
|
rc = FALSE;
|
|
}
|
|
else if ((args[0] == '%') && (args[1] == '%'))
|
|
{
|
|
lcArgs = sscanf(&args[2], "%lx", &dwAddr);
|
|
fPhysical = TRUE;
|
|
}
|
|
else
|
|
{
|
|
lcArgs = sscanf(args, "%lx", &dwAddr);
|
|
}
|
|
|
|
if ((rc == TRUE) && (lcArgs == 1))
|
|
{
|
|
BYTE abCBRegs[0x14];
|
|
BYTE abExCARegs[0x47];
|
|
DWORD dwSize;
|
|
|
|
if (fPhysical)
|
|
{
|
|
ULONG64 phyaddr = 0;
|
|
|
|
phyaddr = dwAddr;
|
|
ReadPhysicalWithFlags(phyaddr, abCBRegs, sizeof(abCBRegs), PHYS_FLAG_UNCACHED, &dwSize);
|
|
if (dwSize != sizeof(abCBRegs))
|
|
{
|
|
dprintf("failed to read physical CBRegs (SizeRead=%x)\n",
|
|
dwSize);
|
|
rc = FALSE;
|
|
}
|
|
else
|
|
{
|
|
phyaddr += 0x800;
|
|
ReadPhysicalWithFlags(phyaddr, abExCARegs, sizeof(abExCARegs), PHYS_FLAG_UNCACHED, &dwSize);
|
|
if (dwSize != sizeof(abExCARegs))
|
|
{
|
|
dprintf("failed to read physical ExCARegs (SizeRead=%x)\n",
|
|
dwSize);
|
|
rc = FALSE;
|
|
}
|
|
}
|
|
}
|
|
else if (!ReadMemory(dwAddr, abCBRegs, sizeof(abCBRegs), &dwSize) ||
|
|
(dwSize != sizeof(abCBRegs)))
|
|
{
|
|
dprintf("failed to read CBRegs (SizeRead=%x)\n", dwSize);
|
|
rc = FALSE;
|
|
}
|
|
else if (!ReadMemory(dwAddr + 0x800, abExCARegs, sizeof(abExCARegs),
|
|
&dwSize) ||
|
|
(dwSize != sizeof(abExCARegs)))
|
|
{
|
|
dprintf("failed to read CBRegs (SizeRead=%x)\n", dwSize);
|
|
rc = FALSE;
|
|
}
|
|
|
|
if (rc == TRUE)
|
|
{
|
|
dprintf("\nCardBus Registers:\n");
|
|
DumpCBRegs(abCBRegs);
|
|
dprintf("\nExCA Registers:\n");
|
|
DumpExCARegs(abExCARegs, sizeof(abExCARegs));
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
DECLARE_API( exca )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps CardBus ExCA registers
|
|
|
|
Arguments:
|
|
|
|
args - Supplies <BasePort>.<SktNum>
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
LONG lcArgs;
|
|
DWORD dwBasePort = 0;
|
|
DWORD dwSktNum = 0;
|
|
|
|
if (TargetMachine != IMAGE_FILE_MACHINE_I386) {
|
|
dprintf("X86 target only API.\n");
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
lcArgs = sscanf(args, "%lx.%lx", &dwBasePort, &dwSktNum);
|
|
if (lcArgs != 2)
|
|
{
|
|
dprintf("invalid command syntax\n"
|
|
"Usage: exca <BasePort>.<SocketNum>\n");
|
|
}
|
|
else
|
|
{
|
|
int i;
|
|
BYTE abExCARegs[0x40];
|
|
|
|
for (i = 0; i < sizeof(abExCARegs); ++i)
|
|
{
|
|
abExCARegs[i] = ReadExCAByte(dwBasePort,
|
|
(ULONG)(dwSktNum*0x40 + i));
|
|
}
|
|
|
|
DumpExCARegs(abExCARegs, sizeof(abExCARegs));
|
|
}
|
|
return S_OK;
|
|
}
|