www.pudn.com > Demo C.rar > IDpciDevices.c
/* IDpciDevices */ /* From: Darnold, Joel R*/ /* Show information on PCI devices including vendor and parameters */ /* See PCIvenCodes.txt for additional information */ #include "vxWorks.h" #include "stdio.h" #include "sysLib.h" #include "drv/pci/pciLocalBus.h" #include "drv/pci/pciIomapLib.h" #include "MyPCI.h" STATUS pciDevConfig ( int pciBusNo, /* PCI bus number */ int pciDevNo, /* PCI device number */ int pciFuncNo, /* PCI function number */ ULONG devIoBaseAdrs, /* device IO base address */ ULONG devMemBaseAdrs, /* device memory base address */ ULONG command /* command to issue */ ); struct ID_PCI_DEVICES { int PciVenId; int PciDevId; char VendorName[20]; char DeviceName[40]; }; /* externs */ IMPORT int pciLibInitDone; IMPORT int pciLibInitStatus; IMPORT int pciConfigMech; STATUS IDpciDevices(int busNo) { int i=0; int deviceNo; int devices; union { int classCode; char array[4]; } u; struct pciHeaderDevice DeviceInfo;=20 struct ID_PCI_DEVICES IDpciDevices[NUM_IDS_DEFINED]; IDpciDevices[i].PciVenId = MOTOROLA_VEN_ID; IDpciDevices[i].PciDevId = RAVEN_DEV_ID; sprintf(IDpciDevices[i].VendorName,"Motorola"); sprintf(IDpciDevices[i].DeviceName,"Raven MPC/PCI Bridge"); i++; IDpciDevices[i].PciVenId = SYMPHONY_VEN_ID; IDpciDevices[i].PciDevId = W83C533_DEV_ID; sprintf(IDpciDevices[i].VendorName,"Symphony"); sprintf(IDpciDevices[i].DeviceName,"W83C533 PCI/ISA Bridge"); i++; IDpciDevices[i].PciVenId = TUNDRA_VEN_ID; IDpciDevices[i].PciDevId = CA91C042_DEV_ID; sprintf(IDpciDevices[i].VendorName,"Tundra"); sprintf(IDpciDevices[i].DeviceName,"CA91C042 Universe PCI/VME Bridge"); i++; IDpciDevices[i].PciVenId = DEC_VEN_ID; IDpciDevices[i].PciDevId = _21140_DEV_ID; sprintf(IDpciDevices[i].VendorName,"Digital"); sprintf(IDpciDevices[i].DeviceName,"21140 Ethernet"); i++; IDpciDevices[i].PciVenId = PLX_VEN_ID; IDpciDevices[i].PciDevId = PCI9050_DEV_ID; sprintf(IDpciDevices[i].VendorName,"PLX Technology"); sprintf(IDpciDevices[i].DeviceName,"PCI9050 PCI Interface (CLIB)"); i++; IDpciDevices[i].PciVenId = PENTEK_VEN_ID; IDpciDevices[i].PciDevId = _7110_DEV_ID; sprintf(IDpciDevices[i].VendorName,"Pentek"); sprintf(IDpciDevices[i].DeviceName,"7110 C44 DSP PMC Module"); if (pciLibInitStatus != OK) /* sanity check */ return (ERROR); printf ("Scanning function 0 of each PCI device on bus %d\n", busNo); printf ("Using configuration mechanism %d\n", pciConfigMech); printf ("bus dev func venID devID class description\n"); if (pciConfigMech == PCI_MECHANISM_1) devices = 0x1f; else devices = 0x0f; for (deviceNo=0; deviceNo < devices; deviceNo++) { pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_VENDOR_ID, &DeviceInfo.vendorId); pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_DEVICE_ID, &DeviceInfo.deviceId); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_PROGRAMMING_IF,&u.array[3]); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_SUBCLASS, &u.array[2]); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_CLASS, &u.array[1]); u.array[0] = 0; /* There are two ways to find out an empty device. * 1. check Master Abort bit after the access. * 2. check whether the read value is 0xffff. * Since I didn't see the Master Abort bit of the host/PCI bridge * changing, I use the second method. */ if ((unsigned short)DeviceInfo.vendorId != 0xffff) { pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_VENDOR_ID, &DeviceInfo.vendorId); pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_DEVICE_ID, &DeviceInfo.deviceId); pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_COMMAND, &DeviceInfo.command); pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_STATUS, &DeviceInfo.status); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_REVISION, &DeviceInfo.revisionId); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_PROGRAMMING_IF, &DeviceInfo.classCode); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_SUBCLASS, &DeviceInfo.progIf); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_CLASS, &DeviceInfo.cacheLine); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_CACHE_LINE_SIZE, &DeviceInfo.cacheLine); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_LATENCY_TIMER, &DeviceInfo.latency); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_HEADER_TYPE, &DeviceInfo.headerType); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_BIST, &DeviceInfo.bist); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_BASE_ADDRESS_0, &DeviceInfo.base0); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_BASE_ADDRESS_1, &DeviceInfo.base1); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_BASE_ADDRESS_2, &DeviceInfo.base2); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_BASE_ADDRESS_3, &DeviceInfo.base3); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_BASE_ADDRESS_4, &DeviceInfo.base4); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_BASE_ADDRESS_5, &DeviceInfo.base5); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_CIS, &DeviceInfo.cis); pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_SUB_VENDER_ID, &DeviceInfo.subVendorId); pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_SUB_SYSTEM_ID, &DeviceInfo.subSystemId); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_EXPANSION_ROM, &DeviceInfo.romBase); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_RESERVED_0, &DeviceInfo.reserved0); pciConfigInLong (busNo, deviceNo, 0, PCI_CFG_RESERVED_1, &DeviceInfo.reserved1); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_DEV_INT_LINE, &DeviceInfo.intLine); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_DEV_INT_PIN, &DeviceInfo.intPin); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_MIN_GRANT, &DeviceInfo.minGrant); pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_MAX_LATENCY, &DeviceInfo.maxLatency); /* printf("Found device VendorID %x DeviceID %x\n",DeviceInfo.vendorId,DeviceInfo.deviceId); */ for(i=0; i \n", busNo, deviceNo, 0,(unsigned short)DeviceInfo.vendorId, (unsigned short)DeviceInfo.deviceId, u.classCode, IDpciDevices[i].VendorName,IDpciDevices[i].DeviceName); } } printf("vendorId 0x%.5x\n",(unsigned short)DeviceInfo.vendorId); /* vendor ID */ printf("deviceId 0x%.5x\n",(unsigned short)DeviceInfo.deviceId); /* device ID */ printf("command 0x%.5x\n",(unsigned short)DeviceInfo.command); /* command register */ printf("status 0x%.5x\n",(unsigned short)DeviceInfo.status); /* status register */ printf("revisionrId 0x%.3x\n",(unsigned char )DeviceInfo.revisionId); /* revision ID */ printf("classCode 0x%.3x\n",(unsigned char )DeviceInfo.classCode); /* class code */ printf("subClass 0x%.3x\n",(unsigned char )DeviceInfo.subClass); /* sub class code */ printf("progIf 0x%.3x\n",(unsigned char )DeviceInfo.progIf); /* programming interface */ printf("cacheLine 0x%.3x\n",(unsigned char )DeviceInfo.cacheLine); /* cache line */ printf("latency 0x%.3x\n",(unsigned char )DeviceInfo.latency); /* latency time */ printf("headerType 0x%.3x\n",(unsigned char )DeviceInfo.headerType); /* header type */ printf("bist 0x%.3x\n",(unsigned char )DeviceInfo.bist); /* BIST */ printf("base0 0x%.8x\n",(unsigned int )DeviceInfo.base0); /* base address 0 */ printf("base1 0x%.8x\n",(unsigned int )DeviceInfo.base1); /* base address 1 */ printf("base2 0x%.8x\n",(unsigned int )DeviceInfo.base2); /* base address 2 */ printf("base3 0x%.8x\n",(unsigned int )DeviceInfo.base3); /* base address 3 */ printf("base4 0x%.8x\n",(unsigned int )DeviceInfo.base4); /* base address 4 */ printf("base5 0x%.8x\n",(unsigned int )DeviceInfo.base5); /* base address 5 */ printf("cis 0x%.8x\n",(unsigned int )DeviceInfo.cis); /* cardBus CIS pointer */ printf("subVendorId 0x%.5x\n",(unsigned short)DeviceInfo.subVendorId); /* sub system vendor ID */ printf("subSystemId 0x%.5x\n",(unsigned short)DeviceInfo.subSystemId); /* sub system ID */ printf("romBase 0x%.8x\n",(unsigned int )DeviceInfo.romBase); /* expansion ROM base address */ printf("reserved0 0x%.8x\n",(unsigned int )DeviceInfo.reserved0); /* reserved */ printf("reserved1 0x%.8x\n",(unsigned int )DeviceInfo.reserved1); /* reserved */ printf("intLine 0x%.3x\n",(unsigned char )DeviceInfo.intLine); /* interrupt line */ printf("intPin 0x%.3x\n",(unsigned char )DeviceInfo.intPin); /* interrupt pin */ printf("minGrant 0x%.3x\n",(unsigned char )DeviceInfo.minGrant); /* min Grant */ printf("maxLatency 0x%.3x\n",(unsigned char )DeviceInfo.maxLatency); /* max Latency */ } } return (OK); } /* This routine writes data to PLX's local configuration */ /* registers. The data is written as little endian so we do */ /* a 32 bit endian swap before we write the data */ /* Remember.... eprom data requires no data swappage */ void PciDevWriteLocCfgReg(int PCIBase,int RegAddress, int Data) { int SwapData=0; SwapData = (Data & 0xff) << 24; SwapData |= (Data & 0xff00) << 8; SwapData |= (Data & 0xff0000) >> 8; SwapData |= (Data & 0xff000000) >> 24; *(volatile int *)(PCIBase+RegAddress) = SwapData; } int PciDevReadLocCfgReg(int PCIBase, int RegAddress) { int SwapData=0,Data; Data = *(volatile int *)(PCIBase+RegAddress); SwapData = (Data & 0xff) << 24; SwapData |= (Data & 0xff00) << 8; SwapData |= (Data & 0xff0000) >> 8; SwapData |= (Data & 0xff000000) >> 24; return(SwapData); } /* The following are general purpose memory reading routines */ void Peek8(int Address) { char cData; cData = *(volatile char *)Address; printf("0x%x = 0x%x\n",Address, (0xff & (int)cData)); } void Peek16(int Address) { short sData; sData = *(volatile short *)Address; printf("0x%x = 0x%x\n",Address, (0xffff & (int)sData)); } void Peek32(int Address) { int iData; iData = *(volatile int *)Address; printf("0x%x = 0x%x\n",Address, iData); } void Poke8(int Address, int cData) { *(volatile char *)Address = (char)cData; printf("0x%x = 0x%x\n",Address, (0xff & (int)cData)); } void Poke16(int Address, int sData) { *(volatile short *)Address = (short)sData; printf("0x%x = 0x%x\n",Address, (0xffff & (int)sData)); } void Poke32(int Address, int iData) { *(volatile int *)Address = iData; printf("0x%x = 0x%x\n",Address, iData); } void Init7110(void) { int pciBusNo,pciDevNo,pciFuncNo; int iDummy,i; short sDummy; printf("\n\n"); printf("CPU_PCI_IO_ADRS 0x%x PCI_IO_ADRS 0x%x\n",CPU_PCI_IO_ADRS,PCI_IO_ADRS); printf("CPU_PCI_MEM_ADRS 0x%x PCI_MEM_ADRS 0x%x\n\n",CPU_PCI_MEM_ADRS,PCI_MEM_ADRS); /* printf("CLIB_PCI_FIFO_ADRS 0x%x CLIB_PCI_ALTERA_ADRS 0x%x\n",CLIB_PCI_FIFO_ADRS,CLIB_PCI_ALTERA_ADRS); printf("CLIB_CPU_FIFO_ADRS 0x%x CLIB_CPU_ALTERA_ADRS 0x%x\n\n",CLIB_CPU_FIFO_ADRS|CPU_PCI_MEM_ADRS,CLIB_CPU_ALTERA_ADRS|CPU_PCI_IO_ADRS); */ if((pciFindDevice(C44_PCI_DEVICE_ID&0xffff, (C44_PCI_DEVICE_ID>>16)&0xffff, 0,&pciBusNo,&pciDevNo,&pciFuncNo) != ERROR)) { /* Initialize PCI Configuration Registers enough to access Local Configuration Registers */ pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_0, C44_PCI_MEM0_ADRS); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_0, &iDummy); printf("PCI_CFG_BASE_ADDRESS_0 = 0x%x\n",iDummy); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_1, C44_PCI_IO0_ADRS); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_1, &iDummy); printf("PCI_CFG_BASE_ADDRESS_1 = 0x%x\n",iDummy); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_2, 0); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_2, &iDummy); printf("PCI_CFG_BASE_ADDRESS_2 = 0x%x\n",iDummy); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_3, 0); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_3, &iDummy); printf("PCI_CFG_BASE_ADDRESS_3 = 0x%x\n",iDummy); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_4, 0); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_4, &iDummy); printf("PCI_CFG_BASE_ADDRESS_4 = 0x%x\n",iDummy); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_5, 0); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_5, &iDummy); printf("PCI_CFG_BASE_ADDRESS_5 = 0x%x\n",iDummy); pciConfigOutWord (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_COMMAND, ( PCI_CMD_MEM_ENABLE | PCI_CMD_IO_ENABLE)); pciConfigInWord (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_COMMAND, &sDummy ); printf("PCI_CFG_COMMAND = 0x%x\n",sDummy); /* Now we can access Local Configuration Registers so begin to do so */ /* Register settings to enable basic communication to PLX9080 has been */ /* initialized from EEPROM at 7110 power on */ #ifdef SETUP_LOCAL_CONFIG_REGISTERS PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, CNTRL, 0x00ff7580);/*0x00ff7580*//*0x00ff3580*//*0x00fd3580*/ /* Control */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, LAS0RR, 0x0ffffff0); /* Fifo mapping */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, LAS0BA, 0x000003c1); /* A0 & A1 of Local bus aren't used */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, LAS0BRD,0x0180003f); /*0x01800022*//*0x0180003f*//*0x0180003a*//*0x0180001a*//* Fifo A0 = Local A2 */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, CS0BASE, 0x000003c5); /* Fifo A1 = Local A3 */ /* Shift Address bits accordingly */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, LAS1RR, 0x0fffffe1); /* Altera mapping */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, LAS1BA, 0x00000141); /* A0 & A1 of Local bus aren't used */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, LAS1BRD, 0x014060c2); /* Altera A0 = Local A2 */ PciDevWriteLocCfgReg(C44_PCI_MEM0_ADRS, CS1BASE, 0x00000000); /* Altera A1 = Local A3 */ /* Shift Address bits accordingly */ /* Now we can enable these memory maps in the PCI Configuration Registers */ pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_2, C44_PCI_FIFO_ADRS); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_2, &iDummy); printf("PCI_CFG_BASE_ADDRESS_2 = 0x%x\n",iDummy); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_3, CLIB_PCI_ALTERA_ADRS); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_3, &iDummy); printf("PCI_CFG_BASE_ADDRESS_3 = 0x%x\n",iDummy); #endif } else { printf("Error initializing Pentek 7110\n"); } printf(" 7110 setup: pciBusNo = %d\n",pciBusNo); printf(" pciDevNo = %d\n",pciDevNo); printf(" pciFuncNo = %d\n",pciFuncNo); printf(" C44_PCI_IO0_ADRS 0x%x\n",C44_PCI_IO0_ADRS); printf(" C44_PCI_MEM0_ADRS 0x%x\n",C44_PCI_MEM0_ADRS); printf("\nLocal configuration registers\n"); for(i=0; i<12; i++) { iDummy = PciDevReadLocCfgReg(C44_PCI_MEM0_ADRS,(i*4)); printf("0x%x = 0x%x\n",(i*4), iDummy); } =09 for(i=16; i<20; i++) { iDummy = PciDevReadLocCfgReg(C44_PCI_MEM0_ADRS,(i*4)); printf("0x%x = 0x%x\n",(i*4), iDummy); } =09 for(i=24; i<29; i++) { iDummy = PciDevReadLocCfgReg(C44_PCI_MEM0_ADRS,(i*4)); printf("0x%x = 0x%x\n",(i*4), iDummy); } =09 } void PCIReadBack7110(void) { int pciBusNo,pciDevNo,pciFuncNo; int Bar0,Bar1,Bar2,Bar3,Bar4,Bar5; if((pciFindDevice(C44_PCI_DEVICE_ID&0xffff, (C44_PCI_DEVICE_ID>>16)&0xffff, 0,&pciBusNo,&pciDevNo,&pciFuncNo) != ERROR)) { pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_0, 0xffffffff); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_1, 0xffffffff); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_2, 0xffffffff); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_3, 0xffffffff); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_4, 0xffffffff); pciConfigOutLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_5, 0xffffffff); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_0, &Bar0); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_1, &Bar1); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_2, &Bar2); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_3, &Bar3); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_4, &Bar4); pciConfigInLong (pciBusNo, pciDevNo, pciFuncNo, PCI_CFG_BASE_ADDRESS_5, &Bar5); printf(" 7110 PCI Readback Base Address Registers\n"); printf(" PCI_CFG_BASE_ADDRESS_0 = 0x%x\n",Bar0); printf(" PCI_CFG_BASE_ADDRESS_1 = 0x%x\n",Bar1); printf(" PCI_CFG_BASE_ADDRESS_2 = 0x%x\n",Bar2); printf(" PCI_CFG_BASE_ADDRESS_3 = 0x%x\n",Bar3); printf(" PCI_CFG_BASE_ADDRESS_4 = 0x%x\n",Bar4); } else { printf("Error initializing CLIB\n"); } }