FreeBSD/sys/dev/pci/pci_subr.c
/*
 * Try to read the bus number of a host-PCI bridge using appropriate config
 * registers.
 */
Try to read the bus number of a host-PCI bridge using appropriate config
registers.
Try to read the bus number of a host - PCI bridge using appropriate config registers .
int
host_pcib_get_busno(pci_read_config_fn read_config, int bus, int slot, int func,
    uint8_t *busnum)
{
	uint32_t id;
	id = read_config(bus, slot, func, PCIR_DEVVENDOR, 4);
	if (id == 0xffffffff)
		return (0);
	switch (id) {
	case 0x12258086:
		*busnum = bus;
		break;
	case 0x84c48086:
		*busnum = read_config(bus, slot, func, 0x4a, 1);
		break;
	case 0x84ca8086:
		return (0);
	case 0x84cb8086:
		switch (slot) {
		case 0x12:
			*busnum = read_config(bus, 0x10, func, 0xd0, 1);
			break;
		case 0x13:
			*busnum = read_config(bus, 0x10, func, 0xd1, 1) + 1;
			break;
		case 0x14:
			*busnum = read_config(bus, 0x10, func, 0xd3, 1);
			break;
		case 0x15:
			*busnum = read_config(bus, 0x10, func, 0xd4, 1) + 1;
			break;
		}
		break;
	case 0x00051166:
	case 0x00061166:
	case 0x00081166:
	case 0x00091166:
	case 0x00101166:
	case 0x00111166:
	case 0x00171166:
	case 0x01011166:
	case 0x010f1014:
	case 0x01101166:
	case 0x02011166:
	case 0x02251166:
	case 0x03021014:
		*busnum = read_config(bus, slot, func, 0x44, 1);
		break;
	case 0x60100e11:
		*busnum = read_config(bus, slot, func, 0xc8, 1);
		break;
	default:
		return 0;
	}
	return 1;
}
int host_pcib_get_busno ( pci_read_config_fn read_config , int bus , int slot , int func , uint8_t * busnum ) { uint32_t id ; id = read_config ( bus , slot , func , PCIR_DEVVENDOR , 4 ) ; if ( id == 0xffffffff ) return ( 0 ) ; switch ( id ) { case 0x12258086 : * busnum = bus ; break ; case 0x84c48086 : * busnum = read_config ( bus , slot , func , 0x4a , 1 ) ; break ; case 0x84ca8086 : return ( 0 ) ; case 0x84cb8086 : switch ( slot ) { case 0x12 : * busnum = read_config ( bus , 0x10 , func , 0xd0 , 1 ) ; break ; case 0x13 : * busnum = read_config ( bus , 0x10 , func , 0xd1 , 1 ) + 1 ; break ; case 0x14 : * busnum = read_config ( bus , 0x10 , func , 0xd3 , 1 ) ; break ; case 0x15 : * busnum = read_config ( bus , 0x10 , func , 0xd4 , 1 ) + 1 ; break ; } break ; case 0x00051166 : case 0x00061166 : case 0x00081166 : case 0x00091166 : case 0x00101166 : case 0x00111166 : case 0x00171166 : case 0x01011166 : case 0x010f1014 : case 0x01101166 : case 0x02011166 : case 0x02251166 : case 0x03021014 : * busnum = read_config ( bus , slot , func , 0x44 , 1 ) ; break ; case 0x60100e11 : * busnum = read_config ( bus , slot , func , 0xc8 , 1 ) ; break ; default : return 0 ; } return 1 ; }
Try to read the bus number of a host-PCI bridge using appropriate config
 registers.
Try to read the bus number of a host - PCI bridge using appropriate config registers .
/* Intel 824?? */ /* XXX This is a guess */ /* *busnum = read_config(bus, slot, func, 0x41, 1); */ /* Intel 82454KX/GX (Orion) */ /*
		 * For the 450nx chipset, there is a whole bundle of
		 * things pretending to be host bridges. The MIOC will 
		 * be seen first and isn't really a pci bridge (the
		 * actual busses are attached to the PXB's). We need to 
		 * read the registers of the MIOC to figure out the
		 * bus numbers for the PXB channels.
		 *
		 * Since the MIOC doesn't have a pci bus attached, we
		 * pretend it wasn't there.
		 */ /* Intel 82454NX PXB#0, Bus#A */ /* Intel 82454NX PXB#0, Bus#B */ /* Intel 82454NX PXB#1, Bus#A */ /* Intel 82454NX PXB#1, Bus#B */ /* ServerWorks -- vendor 0x1166 */ /* Compaq/HP -- vendor 0x0e11 */ /* Don't know how to read bus number. */