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

📄 mpc85xx_cds_common.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * MPC85xx CDS board specific routines * * Maintainer: Kumar Gala <galak@kernel.crashing.org> * * Copyright 2004 Freescale Semiconductor, Inc * * 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. */#include <linux/stddef.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/errno.h>#include <linux/reboot.h>#include <linux/pci.h>#include <linux/kdev_t.h>#include <linux/major.h>#include <linux/console.h>#include <linux/delay.h>#include <linux/seq_file.h>#include <linux/serial.h>#include <linux/module.h>#include <linux/root_dev.h>#include <linux/initrd.h>#include <linux/tty.h>#include <linux/serial_core.h>#include <linux/fsl_devices.h>#include <asm/system.h>#include <asm/pgtable.h>#include <asm/page.h>#include <asm/atomic.h>#include <asm/time.h>#include <asm/todc.h>#include <asm/io.h>#include <asm/machdep.h>#include <asm/open_pic.h>#include <asm/i8259.h>#include <asm/bootinfo.h>#include <asm/pci-bridge.h>#include <asm/mpc85xx.h>#include <asm/irq.h>#include <asm/immap_85xx.h>#include <asm/cpm2.h>#include <asm/ppc_sys.h>#include <asm/kgdb.h>#include <mm/mmu_decl.h>#include <syslib/cpm2_pic.h>#include <syslib/ppc85xx_common.h>#include <syslib/ppc85xx_setup.h>#ifndef CONFIG_PCIunsigned long isa_io_base = 0;unsigned long isa_mem_base = 0;#endifextern unsigned long total_memory;      /* in mm/init */unsigned char __res[sizeof (bd_t)];static int cds_pci_slot = 2;static volatile u8 * cadmus;/* Internal interrupts are all Level Sensitive, and Positive Polarity */static u_char mpc85xx_cds_openpic_initsenses[] __initdata = {	MPC85XX_INTERNAL_IRQ_SENSES,#if defined(CONFIG_PCI)	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* External 0: PCI1 slot */	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* External 1: PCI1 slot */	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* External 2: PCI1 slot */	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* External 3: PCI1 slot */#else	0x0,						/* External  0: */	0x0,						/* External  1: */	0x0,						/* External  2: */	0x0,						/* External  3: */#endif	0x0,						/* External  4: */	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* External  5: PHY */	0x0,						/* External  6: */	0x0,						/* External  7: */	0x0,						/* External  8: */	0x0,						/* External  9: */	0x0,						/* External 10: */#if defined(CONFIG_85xx_PCI2) && defined(CONFIG_PCI)	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* External 11: PCI2 slot 0 */#else	0x0,						/* External 11: */#endif};/* ************************************************************************ */intmpc85xx_cds_show_cpuinfo(struct seq_file *m){	uint pvid, svid, phid1;	uint memsize = total_memory;	bd_t *binfo = (bd_t *) __res;	unsigned int freq;	/* get the core frequency */	freq = binfo->bi_intfreq;	pvid = mfspr(SPRN_PVR);	svid = mfspr(SPRN_SVR);	seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n");	seq_printf(m, "Machine\t\t: CDS - MPC%s (%x)\n", cur_ppc_sys_spec->ppc_sys_name, cadmus[CM_VER]);	seq_printf(m, "clock\t\t: %dMHz\n", freq / 1000000);	seq_printf(m, "PVR\t\t: 0x%x\n", pvid);	seq_printf(m, "SVR\t\t: 0x%x\n", svid);	/* Display cpu Pll setting */	phid1 = mfspr(SPRN_HID1);	seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f));	/* Display the amount of memory */	seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));	return 0;}#ifdef CONFIG_CPM2static irqreturn_t cpm2_cascade(int irq, void *dev_id){	while((irq = cpm2_get_irq()) >= 0)		__do_IRQ(irq);	return IRQ_HANDLED;}static struct irqaction cpm2_irqaction = {	.handler = cpm2_cascade,	.flags = IRQF_DISABLED,	.mask = CPU_MASK_NONE,	.name = "cpm2_cascade",};#endif /* CONFIG_CPM2 */void __initmpc85xx_cds_init_IRQ(void){	bd_t *binfo = (bd_t *) __res;	int i;	/* Determine the Physical Address of the OpenPIC regs */	phys_addr_t OpenPIC_PAddr = binfo->bi_immr_base + MPC85xx_OPENPIC_OFFSET;	OpenPIC_Addr = ioremap(OpenPIC_PAddr, MPC85xx_OPENPIC_SIZE);	OpenPIC_InitSenses = mpc85xx_cds_openpic_initsenses;	OpenPIC_NumInitSenses = sizeof (mpc85xx_cds_openpic_initsenses);	/* Skip reserved space and internal sources */#ifdef CONFIG_MPC8548	openpic_set_sources(0, 48, OpenPIC_Addr + 0x10200);#else	openpic_set_sources(0, 32, OpenPIC_Addr + 0x10200);#endif	/* Map PIC IRQs 0-11 */	openpic_set_sources(48, 12, OpenPIC_Addr + 0x10000);	/* we let openpic interrupts starting from an offset, to	 * leave space for cascading interrupts underneath.	 */	openpic_init(MPC85xx_OPENPIC_IRQ_OFFSET);#ifdef CONFIG_PCI	openpic_hookup_cascade(PIRQ0A, "82c59 cascade", i8259_irq);	i8259_init(0, 0);#endif#ifdef CONFIG_CPM2	/* Setup CPM2 PIC */        cpm2_init_IRQ();	setup_irq(MPC85xx_IRQ_CPM, &cpm2_irqaction);#endif	return;}#ifdef CONFIG_PCI/* * interrupt routing */intmpc85xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin){	struct pci_controller *hose = pci_bus_to_hose(dev->bus->number);	if (!hose->index)	{		/* Handle PCI1 interrupts */		char pci_irq_table[][4] =			/*			 *      PCI IDSEL/INTPIN->INTLINE			 *        A      B      C      D			 */			/* Note IRQ assignment for slots is based on which slot the elysium is			 * in -- in this setup elysium is in slot #2 (this PIRQA as first			 * interrupt on slot */		{			{ 0, 1, 2, 3 }, /* 16 - PMC */			{ 0, 1, 2, 3 }, /* 17 P2P (Tsi320) */			{ 0, 1, 2, 3 }, /* 18 - Slot 1 */			{ 1, 2, 3, 0 }, /* 19 - Slot 2 */			{ 2, 3, 0, 1 }, /* 20 - Slot 3 */			{ 3, 0, 1, 2 }, /* 21 - Slot 4 */		};		const long min_idsel = 16, max_idsel = 21, irqs_per_slot = 4;		int i, j;		for (i = 0; i < 6; i++)			for (j = 0; j < 4; j++)				pci_irq_table[i][j] =					((pci_irq_table[i][j] + 5 -					  cds_pci_slot) & 0x3) + PIRQ0A;		return PCI_IRQ_TABLE_LOOKUP;	} else {		/* Handle PCI2 interrupts (if we have one) */		char pci_irq_table[][4] =		{			/*			 * We only have one slot and one interrupt			 * going to PIRQA - PIRQD */			{ PIRQ1A, PIRQ1A, PIRQ1A, PIRQ1A }, /* 21 - slot 0 */		};		const long min_idsel = 21, max_idsel = 21, irqs_per_slot = 4;		return PCI_IRQ_TABLE_LOOKUP;	}}#define ARCADIA_HOST_BRIDGE_IDSEL	17#define ARCADIA_2ND_BRIDGE_IDSEL	3extern int mpc85xx_pci1_last_busno;intmpc85xx_exclude_device(u_char bus, u_char devfn){	if (bus == 0 && PCI_SLOT(devfn) == 0)		return PCIBIOS_DEVICE_NOT_FOUND;#ifdef CONFIG_85xx_PCI2	if (mpc85xx_pci1_last_busno)		if (bus == (mpc85xx_pci1_last_busno + 1) && PCI_SLOT(devfn) == 0)			return PCIBIOS_DEVICE_NOT_FOUND;#endif	/* We explicitly do not go past the Tundra 320 Bridge */	if ((bus == 1) && (PCI_SLOT(devfn) == ARCADIA_2ND_BRIDGE_IDSEL))		return PCIBIOS_DEVICE_NOT_FOUND;	if ((bus == 0) && (PCI_SLOT(devfn) == ARCADIA_2ND_BRIDGE_IDSEL))		return PCIBIOS_DEVICE_NOT_FOUND;	else		return PCIBIOS_SUCCESSFUL;}void __initmpc85xx_cds_enable_via(struct pci_controller *hose){	u32 pci_class;	u16 vid, did;	early_read_config_dword(hose, 0, 0x88, PCI_CLASS_REVISION, &pci_class);	if ((pci_class >> 16) != PCI_CLASS_BRIDGE_PCI)		return;	/* Configure P2P so that we can reach bus 1 */	early_write_config_byte(hose, 0, 0x88, PCI_PRIMARY_BUS, 0);	early_write_config_byte(hose, 0, 0x88, PCI_SECONDARY_BUS, 1);	early_write_config_byte(hose, 0, 0x88, PCI_SUBORDINATE_BUS, 0xff);	early_read_config_word(hose, 1, 0x10, PCI_VENDOR_ID, &vid);	early_read_config_word(hose, 1, 0x10, PCI_DEVICE_ID, &did);	if ((vid != PCI_VENDOR_ID_VIA) ||			(did != PCI_DEVICE_ID_VIA_82C686))		return;	/* Enable USB and IDE functions */	early_write_config_byte(hose, 1, 0x10, 0x48, 0x08);}void __initmpc85xx_cds_fixup_via(struct pci_controller *hose){	u32 pci_class;	u16 vid, did;	early_read_config_dword(hose, 0, 0x88, PCI_CLASS_REVISION, &pci_class);	if ((pci_class >> 16) != PCI_CLASS_BRIDGE_PCI)		return;

⌨️ 快捷键说明

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