mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-04 05:50:17 +00:00 
			
		
		
		
	x86: pci: Assign pci irqs to all functions
We need walk through all functions within a PCI device and assign their IRQs accordingly. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									93f8a31186
								
							
						
					
					
						commit
						31a2dc6955
					
				@ -152,23 +152,30 @@ int pci_x86_write_config(struct udevice *bus, pci_dev_t bdf, uint offset,
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pci_assign_irqs(int bus, int device, int func, u8 irq[4])
 | 
			
		||||
void pci_assign_irqs(int bus, int device, u8 irq[4])
 | 
			
		||||
{
 | 
			
		||||
	pci_dev_t bdf;
 | 
			
		||||
	int func;
 | 
			
		||||
	u16 vendor;
 | 
			
		||||
	u8 pin, line;
 | 
			
		||||
 | 
			
		||||
	bdf = PCI_BDF(bus, device, func);
 | 
			
		||||
	for (func = 0; func < 8; func++) {
 | 
			
		||||
		bdf = PCI_BDF(bus, device, func);
 | 
			
		||||
		vendor = x86_pci_read_config16(bdf, PCI_VENDOR_ID);
 | 
			
		||||
		if (vendor == 0xffff || vendor == 0x0000)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
	pin = x86_pci_read_config8(bdf, PCI_INTERRUPT_PIN);
 | 
			
		||||
		pin = x86_pci_read_config8(bdf, PCI_INTERRUPT_PIN);
 | 
			
		||||
 | 
			
		||||
	/* PCI spec says all values except 1..4 are reserved */
 | 
			
		||||
	if ((pin < 1) || (pin > 4))
 | 
			
		||||
		return;
 | 
			
		||||
		/* PCI spec says all values except 1..4 are reserved */
 | 
			
		||||
		if ((pin < 1) || (pin > 4))
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
	line = irq[pin - 1];
 | 
			
		||||
		line = irq[pin - 1];
 | 
			
		||||
 | 
			
		||||
	debug("Assigning IRQ %d to PCI device %d.%x.%d (INT%c)\n",
 | 
			
		||||
	      line, bus, device, func, 'A' + pin - 1);
 | 
			
		||||
		debug("Assigning IRQ %d to PCI device %d.%x.%d (INT%c)\n",
 | 
			
		||||
		      line, bus, device, func, 'A' + pin - 1);
 | 
			
		||||
 | 
			
		||||
	x86_pci_write_config8(bdf, PCI_INTERRUPT_LINE, line);
 | 
			
		||||
		x86_pci_write_config8(bdf, PCI_INTERRUPT_LINE, line);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -72,11 +72,10 @@ int pci_x86_write_config(struct udevice *bus, pci_dev_t bdf, uint offset,
 | 
			
		||||
 *
 | 
			
		||||
 * @bus:	PCI bus number
 | 
			
		||||
 * @device:	PCI device number
 | 
			
		||||
 * @func:	PCI function number
 | 
			
		||||
 * @irq:	An array of IRQ numbers that are assigned to INTA through
 | 
			
		||||
 *		INTD of this PCI device.
 | 
			
		||||
 */
 | 
			
		||||
void pci_assign_irqs(int bus, int device, int func, u8 irq[4]);
 | 
			
		||||
void pci_assign_irqs(int bus, int device, u8 irq[4]);
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -98,8 +98,7 @@ void pirq_route_irqs(struct irq_info *irq, int num)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Bus, device, slots IRQs for {A,B,C,D} */
 | 
			
		||||
		pci_assign_irqs(irq->bus, irq->devfn >> 3, irq->devfn & 7,
 | 
			
		||||
				irq_slot);
 | 
			
		||||
		pci_assign_irqs(irq->bus, irq->devfn >> 3, irq_slot);
 | 
			
		||||
 | 
			
		||||
		irq++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user