| plan 9 kernel history: overview | file list | diff list |
1995/0721/pc/pci.c (diff list | history)
| pc/pci.c on 1995/0517 | ||
| 1995/0517 | #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "../port/error.h" static Lock pcicfglock; /* * Read a chunk of PCI configuration space. * Assumes arguments are within limits and regno and * nbytes are DWORD aligned. */ void | |
| 1995/0721 | pcicfgr(int busno, int devno, int funcno, int regno, void* data, int nbytes) | |
| 1995/0517 | { | |
| 1995/0721 | ulong* p; int base, len; | |
| 1995/0517 | lock(&pcicfglock); outb(PCIcse, 0x80|((funcno & 0x07)<<1)); outb(PCIforward, busno); base = (0xC000|(devno<<8)) + regno; p = data; for(len = nbytes/sizeof(ulong); len > 0; len--){ *p = inl(base); p++; | |
| 1995/0721 | base += sizeof(*p); | |
| 1995/0517 | } outb(PCIcse, 0x00); unlock(&pcicfglock); } | |
| 1995/0721 | void pcicfgw(int busno, int devno, int funcno, int regno, void* data, int nbytes) { ulong* p; int base, len; lock(&pcicfglock); outb(PCIcse, 0x80|((funcno & 0x07)<<1)); outb(PCIforward, busno); base = (0xC000|(devno<<8)) + regno; p = data; for(len = nbytes/sizeof(ulong); len > 0; len--){ outl(base, *p); p++; base += sizeof(*p); } outb(PCIcse, 0x00); unlock(&pcicfglock); } | |
| 1995/0517 | int | |
| 1995/0721 | pcimatch(int busno, int devno, PCIcfg* pcicfg) | |
| 1995/0517 | { ulong l; | |
| 1995/0721 | while(devno < MaxPCI){ l = 0; pcicfgr(busno, devno, 0, 0, &l, sizeof(ulong)); devno++; if((l & 0xFFFF) != pcicfg->vid) continue; if(pcicfg->did && ((l>>16) & 0xFFFF) != pcicfg->did) continue; pcicfgr(busno, devno-1, 0, 0, pcicfg, sizeof(PCIcfg)); return devno; } return -1; | |
| 1995/0517 | } | |