84 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * This file contains the glue necessary for support of SGI's Altix chipset.
 | 
						|
 */
 | 
						|
#ifdef HAVE_XORG_CONFIG_H
 | 
						|
#include <xorg-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include "altixPCI.h"
 | 
						|
#include "xf86.h"
 | 
						|
#include "Pci.h"
 | 
						|
 | 
						|
void xf86PreScanAltix(void)
 | 
						|
{
 | 
						|
	/* Nothing to see here... */
 | 
						|
}
 | 
						|
 | 
						|
void xf86PostScanAltix(void)
 | 
						|
{
 | 
						|
	pciConfigPtr *pdev;
 | 
						|
	int idx, free_idx;
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Some altix pci chipsets do not expose themselves as host
 | 
						|
	 * bridges.
 | 
						|
	 *
 | 
						|
	 * Walk the devices looking for buses for which there is not a
 | 
						|
	 * corresponding pciDevice entry (ie. pciBusInfo[]->bridge is NULL).
 | 
						|
	 *
 | 
						|
	 * It is assumed that this indicates a root bridge for which we will
 | 
						|
	 * construct a fake pci host bridge device.
 | 
						|
	 */
 | 
						|
 | 
						|
	pdev = xf86scanpci(0);
 | 
						|
	for (idx = 0; pdev[idx] != NULL; idx++)
 | 
						|
		;
 | 
						|
 | 
						|
	free_idx = idx;
 | 
						|
 | 
						|
	for (idx = 0; idx < free_idx; idx++) {
 | 
						|
		pciConfigPtr dev, fakedev;
 | 
						|
		pciBusInfo_t *businfo;
 | 
						|
 | 
						|
		dev = pdev[idx];
 | 
						|
		businfo = pciBusInfo[dev->busnum];
 | 
						|
 | 
						|
		if (! businfo) {
 | 
						|
			/* device has no bus ... should this be an error? */
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
 | 
						|
		if (businfo->bridge) {
 | 
						|
			/* bus has a device ... no need for fixup */
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
 | 
						|
		if (free_idx >= MAX_PCI_DEVICES)
 | 
						|
			FatalError("SN: No room for fake root bridge device\n");
 | 
						|
 | 
						|
		/*
 | 
						|
		 * Construct a fake device and stick it at the end of the
 | 
						|
		 * pdev array.  Make it look like a host bridge.
 | 
						|
		 */
 | 
						|
		fakedev = xnfcalloc(1, sizeof(pciDevice));
 | 
						|
		fakedev->tag = PCI_MAKE_TAG(dev->busnum, 0, 0);;
 | 
						|
		fakedev->busnum = dev->busnum;
 | 
						|
		fakedev->devnum = 0;
 | 
						|
		fakedev->funcnum = 0;
 | 
						|
		fakedev->fakeDevice = 1;
 | 
						|
		/* should figure out a better DEVID */
 | 
						|
		fakedev->pci_device_vendor = DEVID(VENDOR_GENERIC, CHIP_VGA);
 | 
						|
		fakedev->pci_base_class = PCI_CLASS_BRIDGE;
 | 
						|
 | 
						|
		businfo->secondary = 0;
 | 
						|
		businfo->primary_bus = dev->busnum;
 | 
						|
		businfo->bridge = fakedev;
 | 
						|
 | 
						|
		fakedev->businfo = businfo;
 | 
						|
 | 
						|
		pdev[free_idx++] = fakedev;
 | 
						|
	}
 | 
						|
}
 |