xref: /openbmc/linux/arch/mips/pci/fixup-malta.c (revision 19df0d1169b3ddcc84933794d1401aaafe2f0000)
11da177e4SLinus Torvalds #include <linux/init.h>
21da177e4SLinus Torvalds #include <linux/pci.h>
31da177e4SLinus Torvalds 
41da177e4SLinus Torvalds /* PCI interrupt pins */
51da177e4SLinus Torvalds #define PCIA		1
61da177e4SLinus Torvalds #define PCIB		2
71da177e4SLinus Torvalds #define PCIC		3
81da177e4SLinus Torvalds #define PCID		4
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds /* This table is filled in by interrogating the PIIX4 chip */
111da177e4SLinus Torvalds static char pci_irq[5] __initdata;
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds static char irq_tab[][5] __initdata = {
141da177e4SLinus Torvalds 	/*      INTA    INTB    INTC    INTD */
151da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  0: GT64120 PCI bridge */
161da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  1: Unused */
171da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  2: Unused */
181da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  3: Unused */
191da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  4: Unused */
201da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  5: Unused */
211da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  6: Unused */
221da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  7: Unused */
231da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  8: Unused */
241da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/*  9: Unused */
251da177e4SLinus Torvalds 	{0,	0,	0,	0,	PCID },	/* 10: PIIX4 USB */
261da177e4SLinus Torvalds 	{0,	PCIB,	0,	0,	0 },	/* 11: AMD 79C973 Ethernet */
271da177e4SLinus Torvalds 	{0,	PCIC,	0,	0,	0 },	/* 12: Crystal 4281 Sound */
281da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/* 13: Unused */
291da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/* 14: Unused */
301da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/* 15: Unused */
311da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/* 16: Unused */
321da177e4SLinus Torvalds 	{0,	0,	0,	0,	0 },	/* 17: Bonito/SOC-it PCI Bridge*/
331da177e4SLinus Torvalds 	{0,	PCIA,	PCIB,	PCIC,	PCID },	/* 18: PCI Slot 1 */
341da177e4SLinus Torvalds 	{0,	PCIB,	PCIC,	PCID,	PCIA },	/* 19: PCI Slot 2 */
351da177e4SLinus Torvalds 	{0,	PCIC,	PCID,	PCIA,	PCIB },	/* 20: PCI Slot 3 */
361da177e4SLinus Torvalds 	{0,	PCID,	PCIA,	PCIB,	PCIC }	/* 21: PCI Slot 4 */
371da177e4SLinus Torvalds };
381da177e4SLinus Torvalds 
39*19df0d11SRalf Baechle int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
401da177e4SLinus Torvalds {
411da177e4SLinus Torvalds 	int virq;
421da177e4SLinus Torvalds 	virq = irq_tab[slot][pin];
431da177e4SLinus Torvalds 	return pci_irq[virq];
441da177e4SLinus Torvalds }
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds /* Do platform specific device initialization at pci_enable_device() time */
471da177e4SLinus Torvalds int pcibios_plat_dev_init(struct pci_dev *dev)
481da177e4SLinus Torvalds {
491da177e4SLinus Torvalds 	return 0;
501da177e4SLinus Torvalds }
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds static void __init malta_piix_func0_fixup(struct pci_dev *pdev)
531da177e4SLinus Torvalds {
541da177e4SLinus Torvalds 	unsigned char reg_val;
551da177e4SLinus Torvalds 	static int piixirqmap[16] __initdata = {  /* PIIX PIRQC[A:D] irq mappings */
561da177e4SLinus Torvalds 		0,  0, 	0,  3,
571da177e4SLinus Torvalds 		4,  5,  6,  7,
581da177e4SLinus Torvalds 		0,  9, 10, 11,
591da177e4SLinus Torvalds 		12, 0, 14, 15
601da177e4SLinus Torvalds 	};
611da177e4SLinus Torvalds 	int i;
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds 	/* Interrogate PIIX4 to get PCI IRQ mapping */
641da177e4SLinus Torvalds 	for (i = 0; i <= 3; i++) {
651da177e4SLinus Torvalds 		pci_read_config_byte(pdev, 0x60+i, &reg_val);
661da177e4SLinus Torvalds 		if (reg_val & 0x80)
671da177e4SLinus Torvalds 			pci_irq[PCIA+i] = 0;	/* Disabled */
681da177e4SLinus Torvalds 		else
691da177e4SLinus Torvalds 			pci_irq[PCIA+i] = piixirqmap[reg_val & 15];
701da177e4SLinus Torvalds 	}
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	/* Done by YAMON 2.00 onwards */
731da177e4SLinus Torvalds 	if (PCI_SLOT(pdev->devfn) == 10) {
741da177e4SLinus Torvalds 		/*
751da177e4SLinus Torvalds 		 * Set top of main memory accessible by ISA or DMA
761da177e4SLinus Torvalds 		 * devices to 16 Mb.
771da177e4SLinus Torvalds 		 */
781da177e4SLinus Torvalds 		pci_read_config_byte(pdev, 0x69, &reg_val);
791da177e4SLinus Torvalds 		pci_write_config_byte(pdev, 0x69, reg_val | 0xf0);
801da177e4SLinus Torvalds 	}
811da177e4SLinus Torvalds }
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0,
841da177e4SLinus Torvalds 	 malta_piix_func0_fixup);
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds static void __init malta_piix_func1_fixup(struct pci_dev *pdev)
871da177e4SLinus Torvalds {
881da177e4SLinus Torvalds 	unsigned char reg_val;
891da177e4SLinus Torvalds 
901da177e4SLinus Torvalds 	/* Done by YAMON 2.02 onwards */
911da177e4SLinus Torvalds 	if (PCI_SLOT(pdev->devfn) == 10) {
921da177e4SLinus Torvalds 		/*
931da177e4SLinus Torvalds 		 * IDE Decode enable.
941da177e4SLinus Torvalds 		 */
951da177e4SLinus Torvalds 		pci_read_config_byte(pdev, 0x41, &reg_val);
961da177e4SLinus Torvalds 		pci_write_config_byte(pdev, 0x41, reg_val|0x80);
971da177e4SLinus Torvalds 		pci_read_config_byte(pdev, 0x43, &reg_val);
981da177e4SLinus Torvalds 		pci_write_config_byte(pdev, 0x43, reg_val|0x80);
991da177e4SLinus Torvalds 	}
1001da177e4SLinus Torvalds }
1011da177e4SLinus Torvalds 
1021da177e4SLinus Torvalds DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB,
1031da177e4SLinus Torvalds 	 malta_piix_func1_fixup);
104