DMPAPI(void*) pci_Find(unsigned short vid, unsigned short did) { unsigned long pciid = ((unsigned long)did << 16) + (unsigned long)vid; unsigned long tmpid, pciaddr; unsigned char tmpht; int bus, dev, fun; if (pciid == 0xffffffffUL) return NULL; for (bus=0; bus<256; bus++) for (dev=0; dev<32; dev++) for (fun=0; fun<8; fun++) { pciaddr = PCI_GET_CF8(bus, dev, fun); io_DisableINT(); tmpid = pci_indw(pciaddr); io_RestoreINT(); if (tmpid == pciid) return pci_Alloc((unsigned char)bus, (unsigned char)dev, (unsigned char)fun); if (fun == 0) { if (tmpid == 0xffffffffUL) break; // invalid PCI device (note: shouldn't do this optimization for Vortex86DX2's internal PCI devices) io_DisableINT(); tmpht = pci_inb(pciaddr + 0x0eL); io_RestoreINT(); if ((tmpht & 0x80) == 0) break; // single-function PCI device } } // end for (fun=... return NULL; }
DMPAPI(void*) pci_Find(unsigned short vid, unsigned short did) { // don't use this function in the init of io system unsigned long pciid = ((unsigned long)did << 16) + (unsigned long)vid; unsigned long tmpid, pciaddr; int bus, dev, fun; if (pciid == 0xffffffffUL) return NULL; for (bus=0; bus<256; bus++) for (dev=0; dev<32; dev++) for (fun=0; fun<8; fun++) { pciaddr = PCI_GET_CF8(bus, dev, fun); tmpid = pci_indw(pciaddr); if (tmpid == pciid) return pci_Alloc((unsigned char)bus, (unsigned char)dev, (unsigned char)fun); if (fun == 0) { if (tmpid == 0xffffffffUL) // invalid PCI device { // NOTE: shouldn't do this optimization for Vortex86DX2/DX3/EX's internal PCI devices (where fun0 may be shutdown but fun1 is still enabled) if ((vx86_CpuID() == CPU_VORTEX86DX2) || (vx86_CpuID() == CPU_VORTEX86DX3) || (vx86_CpuID() == CPU_VORTEX86EX)) { /* do nothing ... */ } else break; } if ((pci_inb(pciaddr + 0x0eL) & 0x80) == 0) break; // single-function PCI device } } // end for (fun=... return NULL; }
DMPAPI(unsigned long) pci_In32(void* handle, unsigned char offset) { PCI_BASE_t* base = (PCI_BASE_t*)handle; unsigned long tmp; io_DisableINT(); //tmp = pci_indw(base->addr + (unsigned long)(offset & 0xfc)); tmp = pci_indw(base->addr + (unsigned long)offset); // assume offset % 4 == 0 io_RestoreINT(); return tmp; }
DMPAPI(void*) pci_Alloc(unsigned char bus, unsigned char dev, unsigned char fun) { // just ignore wrong dev & fun :p dev = dev & 0x1f; fun = fun & 0x07; // check VID & DID if (pci_indw(PCI_GET_CF8(bus, dev, fun)) == 0xffffffffUL) //&& if (fun == 0) { err_print("%s: invalid PCI device!\n", __FUNCTION__); return NULL; } return alloc_pci(bus, dev, fun); }
DMPAPI(void*) pci_Alloc(unsigned char bus, unsigned char dev, unsigned char fun) { unsigned long tmpid; // just ignore wrong dev & fun :p dev = dev & 0x1f; fun = fun & 0x07; // get VID & DID io_DisableINT(); tmpid = pci_indw(PCI_GET_CF8(bus, dev, fun)); io_RestoreINT(); if (tmpid == 0xffffffffUL) if (fun == 0) { err_print((char*)"%s: invalid PCI device!\n", __FUNCTION__); return NULL; } return alloc_pci(bus, dev, fun); }
DMPAPI(unsigned long) pci_In32(void* handle, unsigned char offset) { PCI_BASE_t* base = (PCI_BASE_t*)handle; //return pci_indw(base->addr + (unsigned long)(offset & 0xfc)); return pci_indw(base->addr + (unsigned long)offset); // assume offset % 4 == 0 }