void pcihinv(Pcidev* p) { pcicfginit(); lock(&pcicfginitlock); if(p == nil){ p = pciroot; print("bus dev type vid did intl memory\n"); } pcilhinv(p); unlock(&pcicfginitlock); }
Pcidev* pcimatch(Pcidev* prev, int vid, int did) { pcicfginit(); prev = prev? prev->list: pcilist; for(; prev != nil; prev = prev->list){ if((vid == 0 || prev->vid == vid) && (did == 0 || prev->did == did)) break; } return prev; }
static int pcicfgrw(int tbdf, int r, int data, int rw, int w) { int o, x, er; pcicfginit(); if(pcicfgmode != 1) return -1; if(BUSDNO(tbdf) > Maxdev) return -1; lock(&pcicfglock); o = r & 4-w; er = r&0xfc | (r & 0xf00)<<16; outl(PciADDR, 0x80000000|BUSBDF(tbdf)|er); if(rw == Read){ x = -1; switch(w){ case 1: x = inb(PciDATA+o); break; case 2: x = ins(PciDATA+o); break; case 4: x = inl(PciDATA+o); break; } }else{ x = 0; switch(w){ case 1: outb(PciDATA+o, data); break; case 2: outs(PciDATA+o, data); break; case 4: outl(PciDATA+o, data); break; } } // outl(PciADDR, 0); unlock(&pcicfglock); return x; }
Pcidev* pcimatch(Pcidev* prev, int vid, int did) { if(pcilist == nil) pcicfginit(); if(prev == nil) prev = pcilist; else prev = prev->list; while(prev != nil) { if(prev->vid == vid && (did == 0 || prev->did == did)) break; prev = prev->list; } return prev; }