📄 pci.c
字号:
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
pci.c
Revision History:
26th April 1999 Released
*/
#include <windows.h>
#include "s1.h"
#define PHYSICAL_PCI_MEM (PCI_BASE + PCI_MEM_OFFSET) // PCI memory mapped area.
#define PHYSICAL_PCI_IO (PCI_BASE + PCI_IO_OFFSET) // PCI I/O area
#define PHYSICAL_PCI_CONTROL (PCI_BASE + PCI_CONTROL_OFFSET) // PCI control register.
#define PHYSICAL_FPG_CONTROL P_FPGA_BASE // FPGA control register.
#define PCI_FIRST_INSTANCE 0x0
struct PciBaseAddresses_Type {
unsigned PciIoReg;
unsigned PciMemReg;
unsigned PciControlReg;
};
struct PciDeviceType {
USHORT VendorID;
USHORT DeviceID;
USHORT Command;
USHORT Status;
UCHAR RevisionID;
UCHAR ProgrammingInterfaceCode;
UCHAR SubClassCode;
UCHAR BaseClassCode;
UCHAR CacheLineSize;
UCHAR LatencyTimer;
UCHAR HeaderType;
UCHAR BIST;
ULONG BaseAddressRegister[6];
ULONG CardBusInfoStructPointer;
USHORT SubsystemVendorID;
USHORT SubsystemID;
ULONG ExpansionROMBaseAddress;
ULONG PciReserve1;
ULONG PciReserve2;
UCHAR InterruptLine;
UCHAR InterruptPin;
UCHAR Min_Gnt;
UCHAR Max_Lat;
ULONG PhysicalPciIoReg;
ULONG PhysicalPciMemReg;
ULONG PhysicalPciControlReg;
USHORT LogInterrupt;
ULONG Size[6];
};
#define NO_PCI_SLOTS 3 // No of PCI slots for S1.
int PciEnumerated = FALSE;
struct PciDeviceType PciDevice[NO_PCI_SLOTS] = { 0 };
#if 1
struct PciDeviceType *PciScan(unsigned Type, unsigned Instance)
{
unsigned int pci_wait;
unsigned int curInstance = PCI_FIRST_INSTANCE;
unsigned int Slot;
unsigned int Found = FALSE;
volatile BYTE *Cnt_vptrl;
volatile BYTE *Mem_vptrl;
volatile BYTE *Fpg_vptrl;
Cnt_vptrl = (volatile BYTE *)VirtualAlloc(0,0x00800, MEM_RESERVE, PAGE_NOACCESS);
if ( Cnt_vptrl == NULL ) {
RETAILMSG(1, (TEXT(" Cnt_vptrl's VirtualAlloc failed !!! \r\n")));
}else {
if ( !VirtualCopy((PVOID)Cnt_vptrl, (PVOID)PHYSICAL_PCI_CONTROL,0x00800, PAGE_READWRITE|PAGE_NOCACHE) ) {
RETAILMSG(1, (TEXT("!!!failed Physical Address( 0x%08x) assinged to Virtual Address(Cnt_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_CONTROL,Cnt_vptrl));
}else {
RETAILMSG(1, (TEXT("!!!Success Physical Address( 0x%08x) assinged to Virtual Address(Cnt_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_CONTROL,Cnt_vptrl));
}
}
Mem_vptrl = (volatile BYTE *)VirtualAlloc(0,0x01000000, MEM_RESERVE, PAGE_NOACCESS);
if ( Mem_vptrl == NULL ) {
RETAILMSG(1, (TEXT("*Mem_vptrl's VirtualAlloc failed !!! \r\n")));
}else {
if ( !VirtualCopy((PVOID)Mem_vptrl, (PVOID)PHYSICAL_PCI_MEM,0x01000000, PAGE_READWRITE|PAGE_NOCACHE) ) {
RETAILMSG(1, (TEXT("!!!failed Physical Address( 0x%08x) assinged to Virtual Address(Mem_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_MEM,Mem_vptrl));
}else {
RETAILMSG(1, (TEXT("!!!Success Physical Address( 0x%08x) assinged to Virtual Address(Mem_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_MEM,Mem_vptrl));
}
}
Fpg_vptrl = (volatile BYTE *)VirtualAlloc(0,0x00100, MEM_RESERVE, PAGE_NOACCESS);
if ( Fpg_vptrl == NULL ) {
RETAILMSG(1, (TEXT("*Fpg_vptrl's VirtualAlloc failed !!! \r\n")));
}else {
if ( !VirtualCopy((PVOID)Fpg_vptrl, (PVOID)PHYSICAL_FPG_CONTROL,0x00100, PAGE_READWRITE|PAGE_NOCACHE) ) {
RETAILMSG(1, (TEXT("!!!failed Physical Address( 0x%08x) assinged to Virtual Address(Fpg_vptrl:0x%08x)\r\n"),PHYSICAL_FPG_CONTROL,Fpg_vptrl));
}else {
RETAILMSG(1, (TEXT("!!!Success Physical Address( 0x%08x) assinged to Virtual Address(Fpg_vptrl:0x%08x)\r\n"),PHYSICAL_FPG_CONTROL,Fpg_vptrl));
}
}
if(!PciEnumerated) {
PciEnumerated = TRUE;
RETAILMSG(1, (TEXT("Write reg Address:0x%08x <--- DATAL:0x%08x)\r\n"),(Cnt_vptrl+0x005c),*(volatile unsigned long *)(Cnt_vptrl+0x005c)));
*(volatile unsigned long *)(Cnt_vptrl+0x005c) = (unsigned long)0x000a0000;
RETAILMSG(1, (TEXT("Write reg Address:0x%08x <--- DATAL:0x%08x)\r\n"),(volatile unsigned long *)(Cnt_vptrl+0x005c),*(volatile unsigned long *)(Cnt_vptrl+0x005c)));
for(Slot = 0;Slot <3;Slot++)
{
RETAILMSG(1, (TEXT("-------------- PCI SCAN LOOP Slot =:0x%04x -------------------\r\n"),Slot));
if( Slot == 0 ){
*(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0x90FF;/* idsel0:9 idsel1:a idsel0:c */
}else if( Slot == 1 ){
*(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0xa0FF;/* idsel0:9 idsel1:a idsel0:c */
}else if( Slot == 2 ){
*(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0xc0FF;/* idsel0:9 idsel1:a idsel0:c */
}else{
*(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0x80FF;/* idsel0:9 idsel1:a idsel0:c */
}
#if 1
pci_wait = 0x00000030;
while ( --pci_wait )
{
*(volatile unsigned long *)(Cnt_vptrl);
}
#endif
PciDevice[Slot].VendorID = *(volatile WORD *)(Mem_vptrl+0x0000);
PciDevice[Slot].DeviceID = *(volatile WORD *)(Mem_vptrl+0x0002);
PciDevice[Slot].Command = *(volatile WORD *)(Mem_vptrl+0x0004);
PciDevice[Slot].Status = *(volatile WORD *)(Mem_vptrl+0x0006);
PciDevice[Slot].RevisionID = *(volatile BYTE *)(Mem_vptrl+0x0008);
PciDevice[Slot].ProgrammingInterfaceCode = *(volatile BYTE *)(Mem_vptrl+0x0009);
PciDevice[Slot].SubClassCode = *(volatile BYTE *)(Mem_vptrl+0x000a);
PciDevice[Slot].BaseClassCode = *(volatile BYTE *)(Mem_vptrl+0x000b);
PciDevice[Slot].CacheLineSize = *(volatile BYTE *)(Mem_vptrl+0x000c);
PciDevice[Slot].LatencyTimer = *(volatile BYTE *)(Mem_vptrl+0x000d);
PciDevice[Slot].HeaderType = *(volatile BYTE *)(Mem_vptrl+0x000e);
PciDevice[Slot].BIST = *(volatile BYTE *)(Mem_vptrl+0x000f);
PciDevice[Slot].BaseAddressRegister[1] = *(volatile ULONG *)(Mem_vptrl+0x0010);
PciDevice[Slot].BaseAddressRegister[2] = *(volatile ULONG *)(Mem_vptrl+0x0014);
PciDevice[Slot].BaseAddressRegister[3] = *(volatile ULONG *)(Mem_vptrl+0x0018);
PciDevice[Slot].BaseAddressRegister[4] = *(volatile ULONG *)(Mem_vptrl+0x001c);
PciDevice[Slot].BaseAddressRegister[5] = *(volatile ULONG *)(Mem_vptrl+0x0020);
PciDevice[Slot].BaseAddressRegister[6] = *(volatile ULONG *)(Mem_vptrl+0x0024);
PciDevice[Slot].CardBusInfoStructPointer = *(volatile ULONG *)(Mem_vptrl+0x0028);
PciDevice[Slot].SubsystemVendorID = *(volatile USHORT *)(Mem_vptrl+0x002c);
PciDevice[Slot].SubsystemID = *(volatile USHORT *)(Mem_vptrl+0x002e);
PciDevice[Slot].ExpansionROMBaseAddress = *(volatile ULONG *)(Mem_vptrl+0x0030);
PciDevice[Slot].PciReserve1 = *(volatile ULONG *)(Mem_vptrl+0x0034);
PciDevice[Slot].PciReserve2 = *(volatile ULONG *)(Mem_vptrl+0x0038);
PciDevice[Slot].InterruptLine = *(volatile BYTE *)(Mem_vptrl+0x003c);
PciDevice[Slot].InterruptPin = *(volatile BYTE *)(Mem_vptrl+0x003d);
PciDevice[Slot].Min_Gnt = *(volatile BYTE *)(Mem_vptrl+0x003e);
PciDevice[Slot].Max_Lat = *(volatile BYTE *)(Mem_vptrl+0x003f);
PciDevice[Slot].PhysicalPciIoReg = PHYSICAL_PCI_IO;
PciDevice[Slot].PhysicalPciMemReg = PHYSICAL_PCI_MEM;
PciDevice[Slot].PhysicalPciControlReg = PHYSICAL_PCI_CONTROL;
}
*(volatile unsigned long *)(Cnt_vptrl+0x005c) = (unsigned long)0x00060000;
*(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0xF0FF;/* idsel0:9 idsel1:a idsel0:c */
#if 1
pci_wait = 0x00000030;
while ( --pci_wait )
{
*(volatile unsigned long *)(Cnt_vptrl);
}
#endif
}
for(Slot = 0; Slot < NO_PCI_SLOTS; Slot ++) {
DEBUGMSG(1, (TEXT("PCI: 1PciScan called. DevId = 0x%x\r\n"), PciDevice[Slot].DeviceID));
if(PciDevice[Slot].BaseClassCode == Type) {
if(curInstance == Instance) {
Found = TRUE;
DEBUGMSG(1, (TEXT("PCI: Found Instance %d of Pci Class 0x%x in Slot %d\r\n"), curInstance, Type, Slot));
return &PciDevice[Slot];
}
else {
curInstance ++;
}
}
}
DEBUGMSG(1, (TEXT("PCI: Unable to locate Instance %d of Pci Class 0x%x in all Slots.\r\n"), Instance, Type));
return (struct PciDeviceType *)NULL;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -