Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
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);
}
Beispiel #6
0
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
}