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

📄 prep_pci.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 3 页
字号:
        0, /* Slot 10 - unused */        0, /* Slot 11 - FireCoral */        4, /* Slot 12 - Ethernet  PCIINTD# */        2, /* Slot 13 - PCI Slot #2 */        2, /* Slot 14 - S3 Video PCIINTD# */        0, /* Slot 15 - onboard SCSI (INDI) [1] */        3, /* Slot 16 - NCR58C810 RS6000 Only PCIINTC# */        0, /* Slot 17 - unused */        2, /* Slot 18 - PCI Slot 2 PCIINTx# (See below) */        0, /* Slot 19 - unused */        0, /* Slot 20 - unused */        0, /* Slot 21 - unused */        2, /* Slot 22 - PCI slot 1 PCIINTx# (See below) */};static char ibm8xx_pci_IRQ_routes[] __prepdata = {        0,      /* Line 0 - unused */        15,     /* Line 1 */        15,     /* Line 2 */        15,     /* Line 3 */        15,     /* Line 4 */};/* * a 6015 ibm board * -- Cort */static char ibm6015_pci_IRQ_map[23] __prepdata = {        0, /* Slot 0  - unused */        0, /* Slot 1  - unused */        0, /* Slot 2  - unused */        0, /* Slot 3  - unused */        0, /* Slot 4  - unused */        0, /* Slot 5  - unused */        0, /* Slot 6  - unused */        0, /* Slot 7  - unused */        0, /* Slot 8  - unused */        0, /* Slot 9  - unused */        0, /* Slot 10 - unused */        0, /* Slot 11 -  */        1, /* Slot 12 - SCSI */        2, /* Slot 13 -  */        2, /* Slot 14 -  */        1, /* Slot 15 -  */        1, /* Slot 16 -  */        0, /* Slot 17 -  */        2, /* Slot 18 -  */        0, /* Slot 19 -  */        0, /* Slot 20 -  */        0, /* Slot 21 -  */        2, /* Slot 22 -  */};static char ibm6015_pci_IRQ_routes[] __prepdata = {        0,      /* Line 0 - unused */        13,     /* Line 1 */        15,     /* Line 2 */        15,     /* Line 3 */        15,     /* Line 4 */};/* IBM Nobis and Thinkpad 850 */static char Nobis_pci_IRQ_map[23] __prepdata ={        0, /* Slot 0  - unused */        0, /* Slot 1  - unused */        0, /* Slot 2  - unused */        0, /* Slot 3  - unused */        0, /* Slot 4  - unused */        0, /* Slot 5  - unused */        0, /* Slot 6  - unused */        0, /* Slot 7  - unused */        0, /* Slot 8  - unused */        0, /* Slot 9  - unused */        0, /* Slot 10 - unused */        0, /* Slot 11 - unused */        3, /* Slot 12 - SCSI */        0, /* Slot 13 - unused */        0, /* Slot 14 - unused */        0, /* Slot 15 - unused */};static char Nobis_pci_IRQ_routes[] __prepdata = {        0, /* Line 0 - Unused */        13, /* Line 1 */        13, /* Line 2 */        13, /* Line 3 */        13      /* Line 4 */};/* * IBM RS/6000 43p/140  -- paulus * XXX we should get all this from the residual data */static char ibm43p_pci_IRQ_map[23] __prepdata = {        0, /* Slot 0  - unused */        0, /* Slot 1  - unused */        0, /* Slot 2  - unused */        0, /* Slot 3  - unused */        0, /* Slot 4  - unused */        0, /* Slot 5  - unused */        0, /* Slot 6  - unused */        0, /* Slot 7  - unused */        0, /* Slot 8  - unused */        0, /* Slot 9  - unused */        0, /* Slot 10 - unused */        0, /* Slot 11 - FireCoral ISA bridge */        6, /* Slot 12 - Ethernet  */        0, /* Slot 13 - openpic */        0, /* Slot 14 - unused */        0, /* Slot 15 - unused */        7, /* Slot 16 - NCR58C825a onboard scsi */        0, /* Slot 17 - unused */        2, /* Slot 18 - PCI Slot 2 PCIINTx# (See below) */        0, /* Slot 19 - unused */        0, /* Slot 20 - unused */        0, /* Slot 21 - unused */        1, /* Slot 22 - PCI slot 1 PCIINTx# (See below) */};static char ibm43p_pci_IRQ_routes[] __prepdata = {        0,      /* Line 0 - unused */        15,     /* Line 1 */        15,     /* Line 2 */        15,     /* Line 3 */        15,     /* Line 4 */};/* Motorola PowerPlus architecture PCI IRQ tables *//* Interrupt line values for INTA-D on primary/secondary MPIC inputs */struct powerplus_irq_list{	unsigned char primary[4];       /* INT A-D */	unsigned char secondary[4];     /* INT A-D */};/* * For standard PowerPlus boards, bus 0 PCI INTs A-D are routed to * OpenPIC inputs 9-12.  PCI INTs A-D from the on board P2P bridge * are routed to OpenPIC inputs 5-8.  These values are offset by * 16 in the table to reflect the Linux kernel interrupt value. */struct powerplus_irq_list Powerplus_pci_IRQ_list __prepdata ={	{25, 26, 27, 28},	{21, 22, 23, 24}};/* * For the MCP750 (system slot board), cPCI INTs A-D are routed to * OpenPIC inputs 8-11 and the PMC INTs A-D are routed to OpenPIC * input 3.  On a hot swap MCP750, the companion card PCI INTs A-D * are routed to OpenPIC inputs 12-15. These values are offset by * 16 in the table to reflect the Linux kernel interrupt value. */struct powerplus_irq_list Mesquite_pci_IRQ_list __prepdata ={	{24, 25, 26, 27},	{28, 29, 30, 31}};/* * This table represents the standard PCI swizzle defined in the * PCI bus specification. */static unsigned char prep_pci_intpins[4][4] __prepdata ={	{ 1, 2, 3, 4},  /* Buses 0, 4, 8, ... */	{ 2, 3, 4, 1},  /* Buses 1, 5, 9, ... */	{ 3, 4, 1, 2},  /* Buses 2, 6, 10 ... */	{ 4, 1, 2, 3},  /* Buses 3, 7, 11 ... */};/* We have to turn on LEVEL mode for changed IRQ's *//* All PCI IRQ's need to be level mode, so this should be something * other than hard-coded as well... IRQ's are individually mappable * to either edge or level. *//* * 8259 edge/level control definitions */#define ISA8259_M_ELCR 0x4d0#define ISA8259_S_ELCR 0x4d1#define ELCRS_INT15_LVL         0x80#define ELCRS_INT14_LVL         0x40#define ELCRS_INT12_LVL         0x10#define ELCRS_INT11_LVL         0x08#define ELCRS_INT10_LVL         0x04#define ELCRS_INT9_LVL          0x02#define ELCRS_INT8_LVL          0x01#define ELCRM_INT7_LVL          0x80#define ELCRM_INT5_LVL          0x20#define CFGPTR(dev) (0x80800000 | (1<<(dev>>3)) | ((dev&7)<<8) | offset)#define DEVNO(dev)  (dev>>3)                                  #define cfg_read(val, addr, type, op)	*val = op((type)(addr))#define cfg_write(val, addr, type, op)	op((type *)(addr), (val))#define cfg_read_bad(val, size)		*val = bad_##size;#define cfg_write_bad(val, size)#define bad_byte	0xff#define bad_word	0xffff#define bad_dword	0xffffffffU#define PREP_PCI_OP(rw, size, type, op)					\static int __prep							\prep_##rw##_config_##size(struct pci_dev *dev, int offset, type val)	\{									\	if ((dev->bus->number != 0) || (DEVNO(dev->devfn) > MAX_DEVNR))	\	{                   						\		cfg_##rw##_bad(val, size)				\		return PCIBIOS_DEVICE_NOT_FOUND;    			\	}								\	cfg_##rw(val, CFGPTR(dev->devfn), type, op);			\	return PCIBIOS_SUCCESSFUL;					\}PREP_PCI_OP(read, byte, u8 *, in_8)PREP_PCI_OP(read, word, u16 *, in_le16)PREP_PCI_OP(read, dword, u32 *, in_le32)PREP_PCI_OP(write, byte, u8, out_8)PREP_PCI_OP(write, word, u16, out_le16)PREP_PCI_OP(write, dword, u32, out_le32)static struct pci_ops prep_pci_ops ={	prep_read_config_byte,	prep_read_config_word,	prep_read_config_dword,	prep_write_config_byte,	prep_write_config_word,	prep_write_config_dword};#define MOTOROLA_CPUTYPE_REG	0x800#define MOTOROLA_BASETYPE_REG	0x803#define MPIC_RAVEN_ID		0x48010000#define	MPIC_HAWK_ID		0x48030000#define	MOT_PROC2_BIT		0x800static u_char mvme2600_openpic_initsenses[] __initdata = {    1,	/* MVME2600_INT_SIO */    0,	/* MVME2600_INT_FALCN_ECC_ERR */    1,	/* MVME2600_INT_PCI_ETHERNET */    1,	/* MVME2600_INT_PCI_SCSI */    1,	/* MVME2600_INT_PCI_GRAPHICS */    1,	/* MVME2600_INT_PCI_VME0 */    1,	/* MVME2600_INT_PCI_VME1 */    1,	/* MVME2600_INT_PCI_VME2 */    1,	/* MVME2600_INT_PCI_VME3 */    1,	/* MVME2600_INT_PCI_INTA */    1,	/* MVME2600_INT_PCI_INTB */    1,	/* MVME2600_INT_PCI_INTC */    1,	/* MVME2600_INT_PCI_INTD */    1,	/* MVME2600_INT_LM_SIG0 */    1,	/* MVME2600_INT_LM_SIG1 */};#define MOT_RAVEN_PRESENT	0x1#define MOT_HAWK_PRESENT	0x2int mot_entry = -1;int prep_keybd_present = 1;int MotMPIC;int mot_multi;int __initraven_init(void){	unsigned int	devid;	unsigned int	pci_membase;	unsigned char	base_mod;	/* Check to see if the Raven chip exists. */	if ( _prep_type != _PREP_Motorola) {		OpenPIC_Addr = NULL;		return 0;	}	/* Check to see if this board is a type that might have a Raven. */	if ((inb(MOTOROLA_CPUTYPE_REG) & 0xF0) != 0xE0) {		OpenPIC_Addr = NULL;		return 0;	}	/* Check the first PCI device to see if it is a Raven. */	early_read_config_dword(0, 0, 0, PCI_VENDOR_ID, &devid);	switch (devid & 0xffff0000) {	case MPIC_RAVEN_ID:		MotMPIC = MOT_RAVEN_PRESENT;		break;	case MPIC_HAWK_ID:		MotMPIC = MOT_HAWK_PRESENT;		break;	default:		OpenPIC_Addr = NULL;		return 0;	}	/* Read the memory base register. */	early_read_config_dword(0, 0, 0, PCI_BASE_ADDRESS_1, &pci_membase);	if (pci_membase == 0) {		OpenPIC_Addr = NULL;		return 0;	}	/* Map the Raven MPIC registers to virtual memory. */	OpenPIC_Addr = ioremap(pci_membase+0xC0000000, 0x22000);	OpenPIC_InitSenses = mvme2600_openpic_initsenses;	OpenPIC_NumInitSenses = sizeof(mvme2600_openpic_initsenses);	ppc_md.get_irq = openpic_get_irq;		/* If raven is present on Motorola store the system config register	 * for later use.	 */	ProcInfo = (unsigned long *)ioremap(0xfef80400, 4);	/* Indicate to system if this is a multiprocessor board */	if (!(*ProcInfo & MOT_PROC2_BIT)) {		mot_multi = 1;	}	/* This is a hack.  If this is a 2300 or 2400 mot board then there is	 * no keyboard controller and we have to indicate that.	 */	base_mod = inb(MOTOROLA_BASETYPE_REG);	if ((MotMPIC == MOT_HAWK_PRESENT) || (base_mod == 0xF9) ||	    (base_mod == 0xFA) || (base_mod == 0xE1))		prep_keybd_present = 0;	return 1;}struct mot_info {	int		cpu_type;	/* 0x100 mask assumes for Raven and Hawk boards that the level/edge are set */					/* 0x200 if this board has a Hawk chip. */	int		base_type;	int		max_cpu;	/* ored with 0x80 if this board should be checked for multi CPU */	const char	*name;	unsigned char	*map;	unsigned char	*routes;	void            (*map_non0_bus)(struct pci_dev *);      /* For boards with more than bus 0 devices. */	struct powerplus_irq_list *pci_irq_list; /* List of PCI MPIC inputs */	unsigned char   secondary_bridge_devfn; /* devfn of secondary bus transparent bridge */} mot_info[] __prepdata = {	{0x300, 0x00, 0x00, "MVME 2400",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x010, 0x00, 0x00, "Genesis",				Genesis_pci_IRQ_map,	Genesis_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},	{0x020, 0x00, 0x00, "Powerstack (Series E)",		Comet_pci_IRQ_map,	Comet_pci_IRQ_routes, NULL, NULL, 0x00},	{0x040, 0x00, 0x00, "Blackhawk (Powerstack)",		Blackhawk_pci_IRQ_map,	Blackhawk_pci_IRQ_routes, NULL, NULL, 0x00},	{0x050, 0x00, 0x00, "Omaha (PowerStack II Pro3000)",	Omaha_pci_IRQ_map,	Omaha_pci_IRQ_routes, NULL, NULL, 0x00},	{0x060, 0x00, 0x00, "Utah (Powerstack II Pro4000)",	Utah_pci_IRQ_map,	Utah_pci_IRQ_routes, NULL, NULL, 0x00},	{0x0A0, 0x00, 0x00, "Powerstack (Series EX)",		Comet2_pci_IRQ_map,	Comet2_pci_IRQ_routes, NULL, NULL, 0x00},	{0x1E0, 0xE0, 0x00, "Mesquite cPCI (MCP750)",		Mesquite_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Mesquite_pci_IRQ_list, 0xFF},	{0x1E0, 0xE1, 0x00, "Sitka cPCI (MCPN750)",		Sitka_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xE2, 0x00, "Mesquite cPCI (MCP750) w/ HAC",	Mesquite_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Mesquite_pci_IRQ_list, 0xC0},	{0x1E0, 0xF6, 0x80, "MTX Plus",				MTXplus_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xA0},	{0x1E0, 0xF6, 0x81, "Dual MTX Plus",			MTXplus_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xA0},	{0x1E0, 0xF7, 0x80, "MTX wo/ Parallel Port",		MTX_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},	{0x1E0, 0xF7, 0x81, "Dual MTX wo/ Parallel Port",	MTX_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},	{0x1E0, 0xF8, 0x80, "MTX w/ Parallel Port",		MTX_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},	{0x1E0, 0xF8, 0x81, "Dual MTX w/ Parallel Port",	MTX_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},	{0x1E0, 0xF9, 0x00, "MVME 2300",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xFA, 0x00, "MVME 2300SC/2600",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xFB, 0x00, "MVME 2600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xFC, 0x00, "MVME 2600/2700 with MVME761",	Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xFD, 0x80, "MVME 3600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},	{0x1E0, 0xFD, 0x81, "MVME 4600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xFE, 0x80, "MVME 3600 with MVME761",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xFE, 0x81, "MVME 4600 with MVME761",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x1E0, 0xFF, 0x00, "MVME 1600-001 or 1600-011",	Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},	{0x000, 0x00, 0x00, "",					NULL,			NULL, NULL, NULL, 0x00}};void __initibm_prep_init(void){	u32 addr;#ifdef CONFIG_PREP_RESIDUAL	PPC_DEVICE *mpic;#endif	if (inb(0x0852) == 0xd5) {		/* This is for the 43p-140 */		early_read_config_dword(0, 0, PCI_DEVFN(13, 0),					PCI_BASE_ADDRESS_0, &addr);		if (addr != 0xffffffff		    && !(addr & PCI_BASE_ADDRESS_SPACE_IO)		    && (addr &= PCI_BASE_ADDRESS_MEM_MASK) != 0) {			addr += PREP_ISA_MEM_BASE;			OpenPIC_Addr = ioremap(addr, 0x40000);			ppc_md.get_irq = openpic_get_irq;		}	}#ifdef CONFIG_PREP_RESIDUAL	mpic = residual_find_device(-1, NULL, SystemPeripheral,				    ProgrammableInterruptController, MPIC, 0);	if (mpic != NULL)		printk("mpic = %p\n", mpic);#endif}static void __initibm43p_pci_map_non0(struct pci_dev *dev){	unsigned char intpin;	static unsigned char bridge_intrs[4] = { 3, 4, 5, 8 };	if (dev == NULL)		return;	pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &intpin);	if (intpin < 1 || intpin > 4)		return;	intpin = (PCI_SLOT(dev->devfn) + intpin - 1) & 3;

⌨️ 快捷键说明

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