⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ht-irq.c

📁 linux-2.4.29操作系统的源码
💻 C
字号:
/* * Copyright 2003 PMC-Sierra * Author: Manish Lachwani (lachwani@pmc-sierra.com) * * This program is free software; you can redistribute  it and/or modify it * under  the terms of  the GNU General  Public License as published by the * Free Software Foundation;  either version 2 of the  License, or (at your * option) any later version. * *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT, *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *  You should have received a copy of the  GNU General Public License along *  with this program; if not, write  to the Free Software Foundation, Inc., *  675 Mass Ave, Cambridge, MA 02139, USA. *//* * Currently there is support for: *  Alliance Sipackets HT-PCI bridge *  PLX HT-PCI bridge *  Altera Hypertransport device */#include <linux/types.h>#include <linux/pci.h>#include <linux/kernel.h>#include <linux/version.h>#include <linux/init.h>#include <linux/pci_ids.h>#include <asm/pci.h>/* PLX Specific Defines */#ifdef CONFIG_PLX_HT_BRIDGE#define AMD_VENDOR_ID           0x1022#define AMD_DEVICE_ID           0x7450#define AMD_IOAPIC_ID           0x7451/* RDR Registers and Index */#define AMD_RDR_INDEX           0xb8#define AMD_RDR_VALUE           0xbc/* AMD RDR Index for INTX# */#define AMD_RDR_INTA            0x80100008#define AMD_RDR_INTB            0x80120008#define AMD_RDR_INTC            0x80140008#define AMD_RDR_INTD            0x80160008#endif/* * HT Bus fixup for the Titan */void __init titan_ht_pcibios_fixup_bus(struct pci_bus *bus){        struct pci_bus *current_bus = bus;        struct pci_dev *devices;        struct list_head *devices_link;	unsigned long cmd;	list_for_each(devices_link, &(current_bus->devices)) {                devices = pci_dev_b(devices_link);                if (devices == NULL)                        continue;		/*		 * Set the device IRQ to 3. This coressponds to 		 * hardware interrupt line 0 and processor 		 * interrupt line 0		 */		devices->irq = 3;	}	/*         * Turn on IO SPACE, MEM SPACE and BUS MASTER among         * other things         */	if (devices->vendor == PCI_VENDOR_ID_SIPACKETS) {		bus->ops->read_word(devices, PCI_COMMAND, &cmd);	        cmd |= 0x17;        	bus->ops->write_word(devices, PCI_COMMAND, cmd); #ifdef CONFIG_SPKT_HT_BRIDGE		/*        	 * Configure the Block #0, #1, #2 and #3 		 * for interrupt routing        	 */		printk(KERN_INFO "Fixing SiPKT HT-PCI IOAPIC \n");#if 0 		/* Interrupt Routing Diagnostics */		bus->ops->write_byte(devices, 0xc2, 0x48); #endif		/* 		 * The following are the config options:		 * Polarity is active low		 * Destination mode is logical		 * Destination processor is core 0		 * Message type is Fixed		 * Interrupt Vector configured to PIRQ 0		 */		bus->ops->write_dword(devices, 0xa0, 0xc0c1c0c0);		bus->ops->write_dword(devices, 0xa4, 0xc0c3c0c2);		bus->ops->write_dword(devices, 0xa8, 0xc0c1c0c0);		bus->ops->write_dword(devices, 0xac, 0xc0c3c0c2);		bus->ops->write_dword(devices, 0xb0, 0xc0c1c0c0);		bus->ops->write_dword(devices, 0xb4, 0xc0c3c0c2);		bus->ops->write_dword(devices, 0xb8, 0xc0c1c0c0);		bus->ops->write_dword(devices, 0xbc, 0xc0c3c0c2);		bus->ops->write_byte(devices, 0xc3, 0x47);		bus->ops->write_byte(devices, 0xc4, 0x47);		bus->ops->write_byte(devices, 0xc5, 0x47);		bus->ops->write_byte(devices, 0xc6, 0x47);		printk(KERN_ERR "Done configuring interrupts \n");#ifdef CONFIG_HT_LEVEL_TRIGGER		/*		 * Support for Level Triggered mode 		 */		bus->ops->write_dword(devices, 0xa0, 0xc0c5c0c4);		bus->ops->write_dword(devices, 0xa4, 0xc0c7c0c6);		bus->ops->write_dword(devices, 0xa8, 0xc0c5c0c4);		bus->ops->write_dword(devices, 0xaC, 0xc0c7c0c6);#endif		/* Set the cacheline size to 8 */		bus->ops->write_byte(devices, 0x0c, 0x08); 		/* Set the Prefetch related configuration */		bus->ops->write_dword(devices, 0x60, 0x0f3f0cff); 		bus->ops->read_dword(devices, 0x60, &cmd);		printk(KERN_ERR "Done configuring the Read Prefetch \n");#endif	#ifdef CONFIG_PLX_HT_BRIDGE		/*	         * For the HT-PCIX bridge, we need to make changes to        	 * the IO space limits. Note that this is valid only for	         * the AMD 7450 PLX bridge. Hence we need to compare with        	 * that	         */		if (devices->vendor == AMD_VENDOR_ID &&			devices->device == AMD_DEVICE_ID) {			printk(KERN_INFO "AMD HT-PCIX bridge found  ");			/*			 * These are the RDR (Redirection Registers) for the 			 * AMD 8131 IOAPIC			 */				/* INTA# */			bus->ops->write_dword(devices, AMD_RDR_INDEX, AMD_RDR_INTA);			bus->ops->write_dword(devices, AMD_RDR_VALUE, 0xf8200140);			/* INTB# */			bus->ops->write_dword(devices, AMD_RDR_INDEX, AMD_RDR_INTB);			bus->ops->write_dword(devices, AMD_RDR_VALUE, 0xf8200140);			/* INTC# */			bus->ops->write_dword(devices, AMD_RDR_INDEX, AMD_RDR_INTC);			bus->ops->write_dword(devices, AMD_RDR_VALUE, 0xf8200140);			/* INTD# */			bus->ops->write_dword(devices, AMD_RDR_INDEX, AMD_RDR_INTD);			bus->ops->write_dword(devices, AMD_RDR_VALUE, 0xf8200140);			/* Enable the Prefetching, MRM and MRL */			bus->ops->read_dword(devices, 0x4c, &val);			val |= 0x00001dc0;			bus->ops->write_dword(devices, 0x4c, val);		}		if (devices->vendor == AMD_VENDOR_ID &&			devices->device == AMD_IOAPIC_ID) {			printk("AMD 8131 IO APIC Fixup \n");			/* Turn the IOAPIC ON */			bus->ops->write_dword(devices, 0x44, 0x00000003);		}#endif /* CONFIG_PLX_HT_BRIDGE */#ifdef CONFIG_ALTERA_HT_BRIDGE		if ( (devices->vendor == PCI_VENDOR_ID_ALTERA) &&			(devices->device == PCI_DEVICE_ID_ALTERA_HT_BRIDGE)) {			printk(KERN_INFO "Found an Altera HT device, fixing up \n");		}		/* Check if the Link Initialization completed successfully */		bus->ops->read_dword(devices, 0x44, &val);		if (!(val & 0x20))			printk(KERN_ERR "Link Initialization Error !! \n");#endif /* CONFIG_ALTERA_HT_BRIDGE */		/* enable master */		if (((current_bus->number != 0) && (current_bus->number != 1))				|| (PCI_SLOT(devices->devfn) != 0)) {			bus->ops->read_word(devices, PCI_COMMAND, &cmd);			cmd |= PCI_COMMAND_MASTER;			bus->ops->write_word(devices, PCI_COMMAND, cmd);		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -