Esempio n. 1
0
static u8 __init
monet_swizzle(struct pci_dev *dev, u8 *pinp)
{
	struct pci_controller *hose = dev->sysdata;
	int slot, pin = *pinp;

	if (!dev->bus->parent) {
		slot = PCI_SLOT(dev->devfn);
	}
	/* Check for the built-in bridge on hose 1. */
	else if (hose->index == 1 && PCI_SLOT(dev->bus->self->devfn) == 8) {
		slot = PCI_SLOT(dev->devfn);
	} else {
		/* Must be a card-based bridge.  */
		do {
			/* Check for built-in bridge on hose 1. */
			if (hose->index == 1 &&
			    PCI_SLOT(dev->bus->self->devfn) == 8) {
				slot = PCI_SLOT(dev->devfn);
				break;
			}
			pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ;

			/* Move up the chain of bridges.  */
			dev = dev->bus->self;
			/* Slot of the next bridge.  */
			slot = PCI_SLOT(dev->devfn);
		} while (dev->bus->self);
	}
	*pinp = pin;
	return slot;
}
Esempio n. 2
0
static u8 __init
ruffian_swizzle(struct pci_dev *dev, u8 *pinp)
{
	int slot, pin = *pinp;

	if (dev->bus->number == 0) {
		slot = PCI_SLOT(dev->devfn);
	}		
	/* Check for the built-in bridge.  */
	else if (PCI_SLOT(dev->bus->self->devfn) == 13) {
		slot = PCI_SLOT(dev->devfn) + 10;
	}
	else 
	{
		/* Must be a card-based bridge.  */
		do {
			if (PCI_SLOT(dev->bus->self->devfn) == 13) {
				slot = PCI_SLOT(dev->devfn) + 10;
				break;
			}
			pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));

			/* Move up the chain of bridges.  */
			dev = dev->bus->self;
			/* Slot of the next bridge.  */
			slot = PCI_SLOT(dev->devfn);
		} while (dev->bus->self);
	}
	*pinp = pin;
	return slot;
}
Esempio n. 3
0
static u8 __init visws_swizzle(struct pci_dev *dev, u8 *pinp)
{
	u8 pin = *pinp;

	while (dev->bus->self) {	/* Move up the chain of bridges. */
		pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));
		dev = dev->bus->self;
	}
	*pinp = pin;

	return PCI_SLOT(dev->devfn);
}
Esempio n. 4
0
/*
 * This routine handles multiple bridges.
 */
static u8 __init integrator_swizzle(struct pci_dev *dev, u8 *pinp)
{
	int pin = *pinp;

	if (pin == 0)
		pin = 1;

	pin -= 1;
	while (dev->bus->self) {
		pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));
		/*
		 * move up the chain of bridges, swizzling as we go.
		 */
		dev = dev->bus->self;
	}
	*pinp = pin + 1;

	return PCI_SLOT(dev->devfn);
}
Esempio n. 5
0
u8 __init
common_swizzle(struct pci_dev *dev, u8 *pinp)
{
	struct pci_controller *hose;
	
	hose = pci_bus_to_hose(dev->bus->number);

	if (dev->bus->number != hose->first_busno) {
		u8 pin = *pinp;
		do {
			pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));
			/* Move up the chain of bridges. */
			dev = dev->bus->self;
		} while (dev->bus->self);
		*pinp = pin;

		/* The slot is the slot of the last bridge. */
	}

	return PCI_SLOT(dev->devfn);
}
Esempio n. 6
0
int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
    int result = -1;

    /* The complication here is that the PCI IRQ lines from the Cayman's 2
       5V slots get into the CPU via a different path from the IRQ lines
       from the 3 3.3V slots.  Thus, we have to detect whether the card's
       interrupts go via the 5V or 3.3V path, i.e. the 'bridge swizzling'
       at the point where we cross from 5V to 3.3V is not the normal case.

       The added complication is that we don't know that the 5V slots are
       always bus 2, because a card containing a PCI-PCI bridge may be
       plugged into a 3.3V slot, and this changes the bus numbering.

       Also, the Cayman has an intermediate PCI bus that goes a custom
       expansion board header (and to the secondary bridge).  This bus has
       never been used in practice.

       The 1ary onboard PCI-PCI bridge is device 3 on bus 0
       The 2ary onboard PCI-PCI bridge is device 0 on the 2ary bus of
       the 1ary bridge.
       */

    struct slot_pin {
        int slot;
        int pin;
    } path[4];
    int i=0;

    while (dev->bus->number > 0) {

        slot = path[i].slot = PCI_SLOT(dev->devfn);
        pin = path[i].pin = bridge_swizzle(pin, slot);
        dev = dev->bus->self;
        i++;
        if (i > 3) panic("PCI path to root bus too long!\n");
    }

    slot = PCI_SLOT(dev->devfn);
    /* This is the slot on bus 0 through which the device is eventually
       reachable. */

    /* Now work back up. */
    if ((slot < 3) || (i == 0)) {
        /* Bus 0 (incl. PCI-PCI bridge itself) : perform the final
           swizzle now. */
        result = IRQ_INTA + bridge_swizzle(pin, slot) - 1;
    } else {
        i--;
        slot = path[i].slot;
        pin  = path[i].pin;
        if (slot > 0) {
            panic("PCI expansion bus device found - not handled!\n");
        } else {
            if (i > 0) {
                /* 5V slots */
                i--;
                slot = path[i].slot;
                pin  = path[i].pin;
                /* 'pin' was swizzled earlier wrt slot, don't do it again. */
                result = IRQ_P2INTA + (pin - 1);
            } else {
                /* IRQ for 2ary PCI-PCI bridge : unused */
                result = -1;
            }
        }
    }

    return result;
}