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    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)