SCAN_STATUS PcieCommClkCfgCallback ( IN PCI_ADDR Device, IN OUT GNB_PCI_SCAN_DATA *ScanData ) { SCAN_STATUS ScanStatus; PCIE_DEVICE_TYPE DeviceType; PCIE_COMM_CLK_DATA *PcieCommClkData; ScanStatus = SCAN_SUCCESS; IDS_HDT_CONSOLE (GNB_TRACE, " Enter PcieCommClkCfgCallback for Device = %d:%d:%d\n", Device.Address.Bus, Device.Address.Device, Device.Address.Function ); PcieCommClkData = (PCIE_COMM_CLK_DATA *) ScanData; ScanStatus = SCAN_SUCCESS; DeviceType = GnbLibGetPcieDeviceType (Device, ScanData->StdHeader); switch (DeviceType) { case PcieDeviceRootComplex: IDS_HDT_CONSOLE (GNB_TRACE, " PCI Scan Root port..\n"); PcieCommClkData->DownstreamPort = Device; GnbLibPciScanSecondaryBus (Device, &PcieCommClkData->ScanData); IDS_HDT_CONSOLE (GNB_TRACE, " PCI Scan Root port back.\n"); break; case PcieDeviceDownstreamPort: IDS_HDT_CONSOLE (GNB_TRACE, " PCI Scan Downstream port..\n"); PcieCommClkData->DownstreamPort = Device; GnbLibPciScanSecondaryBus (Device, &PcieCommClkData->ScanData); IDS_HDT_CONSOLE (GNB_TRACE, " PCI Scan Downstream back.\n"); break; case PcieDeviceUpstreamPort: IDS_HDT_CONSOLE (GNB_TRACE, " PCI Scan Upstream port..\n"); PcieProgramCommClkCfgOnLink (PcieCommClkData->DownstreamPort, Device, ScanData->StdHeader); GnbLibPciScanSecondaryBus (Device, &PcieCommClkData->ScanData); IDS_HDT_CONSOLE (GNB_TRACE, " PCI Scan upstream back.\n"); ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; case PcieDeviceEndPoint: case PcieDeviceLegacyEndPoint: IDS_HDT_CONSOLE (GNB_TRACE, " PCI Scan found End-Point device.\n"); PcieProgramCommClkCfgOnLink (PcieCommClkData->DownstreamPort, Device, ScanData->StdHeader); ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; default: break; } return ScanStatus; }
SCAN_STATUS STATIC GnbTopologyInfoScanCallback ( IN PCI_ADDR Device, IN OUT GNB_PCI_SCAN_DATA *ScanData ) { SCAN_STATUS ScanStatus; GNB_TOPOLOGY_INFO_DATA *GnbTopologyInfo; PCIE_DEVICE_TYPE DeviceType; ScanStatus = SCAN_SUCCESS; IDS_HDT_CONSOLE (GNB_TRACE, " GnbIommuInfoScanCallback for Device = %d:%d:%d\n", Device.Address.Bus, Device.Address.Device, Device.Address.Function ); GnbTopologyInfo = (GNB_TOPOLOGY_INFO_DATA *)ScanData; ScanStatus = SCAN_SUCCESS; DeviceType = GnbLibGetPcieDeviceType (Device, ScanData->StdHeader); switch (DeviceType) { case PcieDeviceRootComplex: case PcieDeviceDownstreamPort: GnbLibPciScanSecondaryBus (Device, &GnbTopologyInfo->ScanData); break; case PcieDeviceUpstreamPort: GnbLibPciScanSecondaryBus (Device, &GnbTopologyInfo->ScanData); ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; case PcieDevicePcieToPcix: GnbTopologyInfo->TopologyInfo->PcieToPciexBridge = TRUE; ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; case PcieDeviceEndPoint: case PcieDeviceLegacyEndPoint: if (GnbCheckPhantomFuncSupport (Device, ScanData->StdHeader)) { GnbTopologyInfo->TopologyInfo->PhantomFunction = TRUE; } ScanStatus = SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; default: break; } return ScanStatus; }
SCAN_STATUS GfxScanPcieDevice ( IN PCI_ADDR Device, IN OUT GNB_PCI_SCAN_DATA *ScanData ) { UINT8 ClassCode; UINT32 VendorId; IDS_HDT_CONSOLE (GFX_MISC, " Evaluate device [%d:%d:%d]\n", Device.Address.Bus, Device.Address.Device, Device.Address.Function ); if (GnbLibPciIsBridgeDevice (Device.AddressValue, ScanData->StdHeader)) { UINT32 SaveBusConfiguration; UINT32 Value; if (Device.Address.Bus == 0) { ((GFX_SCAN_DATA *) ScanData)->BaseBridge = Device; } GnbLibPciRead (Device.AddressValue | 0x18, AccessWidth32, &SaveBusConfiguration, ScanData->StdHeader); Value = (((0xFF << 8) | ((GFX_SCAN_DATA *) ScanData)->BusNumber) << 8) | Device.Address.Bus; GnbLibPciWrite (Device.AddressValue | 0x18, AccessWidth32, &Value, ScanData->StdHeader); ((GFX_SCAN_DATA *) ScanData)->BusNumber++; GnbLibPciScanSecondaryBus (Device, ScanData); ((GFX_SCAN_DATA *) ScanData)->BusNumber--; GnbLibPciWrite (Device.AddressValue | 0x18, AccessWidth32, &SaveBusConfiguration, ScanData->StdHeader); return 0; } GnbLibPciRead (Device.AddressValue | 0x0b, AccessWidth8, &ClassCode, ScanData->StdHeader); if (ClassCode == 3) { IDS_HDT_CONSOLE (GFX_MISC, " Found GFX Card\n" ); GnbLibPciRead (Device.AddressValue | 0x00, AccessWidth32, &VendorId, ScanData->StdHeader); if (!GnbLibPciIsPcieDevice (Device.AddressValue, ScanData->StdHeader)) { IDS_HDT_CONSOLE (GFX_MISC, " GFX Card is PCI device\n" ); ((GFX_SCAN_DATA *) ScanData)->GfxCardInfo->PciGfxCardBitmap |= (1 << ((GFX_SCAN_DATA *) ScanData)->BaseBridge.Address.Device); return 0; } if ((UINT16) VendorId == 0x1002) { IDS_HDT_CONSOLE (GFX_MISC, " GFX Card is AMD PCIe device\n" ); ((GFX_SCAN_DATA *) ScanData)->GfxCardInfo->AmdPcieGfxCardBitmap |= (1 << ((GFX_SCAN_DATA *) ScanData)->BaseBridge.Address.Device); } ((GFX_SCAN_DATA *) ScanData)->GfxCardInfo->PcieGfxCardBitmap |= (1 << ((GFX_SCAN_DATA *) ScanData)->BaseBridge.Address.Device); } return 0; }
SCAN_STATUS STATIC PcieClkPmCallback ( IN PCI_ADDR Device, IN OUT GNB_PCI_SCAN_DATA *ScanData ) { SCAN_STATUS ScanStatus; PCIE_DEVICE_TYPE DeviceType; ScanStatus = SCAN_SUCCESS; IDS_HDT_CONSOLE (GNB_TRACE, " PcieClkPmCallback for Device = %d:%d:%d\n", Device.Address.Bus, Device.Address.Device, Device.Address.Function ); ScanStatus = SCAN_SUCCESS; DeviceType = GnbLibGetPcieDeviceType (Device, ScanData->StdHeader); switch (DeviceType) { case PcieDeviceRootComplex: case PcieDeviceDownstreamPort: GnbLibPciRMW (Device.AddressValue | 0x18, AccessS3SaveWidth32, 0xffffffffull, 0x0, ScanData->StdHeader); GnbLibPciScanSecondaryBus (Device, ScanData); break; case PcieDeviceUpstreamPort: PcieClkPmEnableOnDevice (Device, ScanData->StdHeader); GnbLibPciRMW (Device.AddressValue | 0x18, AccessS3SaveWidth32, 0xffffffffull, 0x0, ScanData->StdHeader); GnbLibPciScanSecondaryBus (Device, ScanData); ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; case PcieDeviceEndPoint: case PcieDeviceLegacyEndPoint: PcieClkPmEnableOnDevice (Device, ScanData->StdHeader); ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; default: break; } return ScanStatus; }
SCAN_STATUS PcieAspmCallback ( IN PCI_ADDR Device, IN OUT GNB_PCI_SCAN_DATA *ScanData ) { SCAN_STATUS ScanStatus; PCIE_ASPM_DATA *PcieAspmData; PCIE_DEVICE_TYPE DeviceType; ScanStatus = SCAN_SUCCESS; IDS_HDT_CONSOLE (GNB_TRACE, " PcieAspmCallback for Device = %d:%d:%d\n", Device.Address.Bus, Device.Address.Device, Device.Address.Function ); PcieAspmData = (PCIE_ASPM_DATA *) ScanData; ScanStatus = SCAN_SUCCESS; DeviceType = GnbLibGetPcieDeviceType (Device, ScanData->StdHeader); switch (DeviceType) { case PcieDeviceRootComplex: case PcieDeviceDownstreamPort: PcieAspmData->DownstreamPort = Device; //PcieExitLatencyData->LinkCount++; GnbLibPciRMW (Device.AddressValue | 0x18, AccessS3SaveWidth32, 0xffffffffull, 0x0, ScanData->StdHeader); GnbLibPciScanSecondaryBus (Device, &PcieAspmData->ScanData); //PcieExitLatencyData->LinkCount--; //Pcie ASPM Black List for L0s with HW method change if ((DeviceType == PcieDeviceRootComplex) && (PcieAspmData->AspmL0sBlackList == TRUE)) { IDS_HDT_CONSOLE (GNB_TRACE, " Black List L0s disabled = %d:%d:%d\n", Device.Address.Bus, Device.Address.Device, Device.Address.Function); GnbLibPciIndirectRMW (Device.AddressValue | 0xE0, 0xA0, AccessS3SaveWidth32, 0xfffff0ff, 0, ScanData->StdHeader); } break; case PcieDeviceUpstreamPort: excel950_fun0 ( PcieAspmData->DownstreamPort, Device, PcieAspmData->Aspm, &PcieAspmData->AspmL0sBlackList, ScanData->StdHeader ); GnbLibPciRMW (Device.AddressValue | 0x18, AccessS3SaveWidth32, 0xffffffffull, 0x0, ScanData->StdHeader); GnbLibPciScanSecondaryBus (Device, &PcieAspmData->ScanData); ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; case PcieDeviceEndPoint: case PcieDeviceLegacyEndPoint: excel950_fun0 ( PcieAspmData->DownstreamPort, Device, PcieAspmData->Aspm, &PcieAspmData->AspmL0sBlackList, ScanData->StdHeader ); ScanStatus = SCAN_SKIP_FUNCTIONS | SCAN_SKIP_DEVICES | SCAN_SKIP_BUSES; break; default: break; } return ScanStatus; }