Ejemplo n.º 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;
}
Ejemplo n.º 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;
}
Ejemplo n.º 3
0
static void* alloc_pci(unsigned char bus, unsigned char dev, unsigned char fun) {
    PCI_BASE_t* base;

    if ((base = get_pci_base()) == NULL)
        err_print((char*)"%s: no free pci handle!\n", __FUNCTION__);
    else
    {
        base->bus  = bus;
        base->dev  = dev;
        base->fun  = fun;
        base->addr = PCI_GET_CF8(bus, dev, fun);
    }

    return (void*)base;
}
Ejemplo n.º 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);
}
Ejemplo n.º 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);
}