zx4500_pci.c
来自「是关于linux2.5.1的完全源码」· C语言 代码 · 共 141 行
C
141 行
/* * arch/ppc/platforms/zx4500_pci.c * * PCI setup routines for Znyx ZX4500 cPCI boards. * * Author: Mark A. Greer * mgreer@mvista.com * * Copyright 2000, 2001 MontaVista Software 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/kernel.h>#include <linux/init.h>#include <linux/pci.h>#include <linux/slab.h>#include <asm/byteorder.h>#include <asm/io.h>#include <asm/uaccess.h>#include <asm/machdep.h>#include <asm/mpc10x.h>#include <asm/pci-bridge.h>#include "zx4500.h"/* * Znyx ZX4500 interrupt routes. */static inline intzx4500_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin){ static char pci_irq_table[][4] = /* * PCI IDSEL/INTPIN->INTLINE * A B C D */ { { 19, 0, 0, 0 }, /* IDSEL 21 - 21554 PCI-cPCI bridge */ { 18, 0, 0, 0 }, /* IDSEL 22 - BCM5600 INTA */ { 16, 20, 16, 20 }, /* IDSEL 23 - PPMC Slot */ }; const long min_idsel = 21, max_idsel = 23, irqs_per_slot = 4; return PCI_IRQ_TABLE_LOOKUP;}void __initzx4500_board_init(struct pci_controller *hose){ uint val; u_char sysctl; /* * CPLD Registers are mapped in by BAT 3 in zx4500_setup_arch(). * * Turn off all interrupts routed through the CPLD. * Also, turn off watchdog timer and drive PMC EREADY low. */ sysctl = in_8((volatile u_char *)ZX4500_CPLD_SYSCTL); sysctl &= ~(ZX4500_CPLD_SYSCTL_PMC | ZX4500_CPLD_SYSCTL_BCM | ZX4500_CPLD_SYSCTL_SINTA | ZX4500_CPLD_SYSCTL_WD | ZX4500_CPLD_SYSCTL_PMC_TRI); out_8((volatile u_char *)ZX4500_CPLD_SYSCTL, sysctl); /* * Kludge the size that BAR2 of the 21554 asks for * (i.e., set Upstream I/O or Memory 0 Setup Register). * Old versions of SROM wants 1 GB which is too large, make it ask * for 256 MB. */ early_read_config_dword(hose, 0, PCI_DEVFN(21,0), 0xc4, &val); if (val != 0) { early_write_config_dword(hose, 0, PCI_DEVFN(21,0), 0xc4, val | 0xf0000000); } return;}static int zx4500_exclude_device(u_char bus, u_char devfn){ if ((bus == 0) && (PCI_SLOT(devfn) == ZX4500_HOST_BRIDGE_IDSEL)) { return PCIBIOS_DEVICE_NOT_FOUND; } else { return PCIBIOS_SUCCESSFUL; }}void __initzx4500_find_bridges(void){ struct pci_controller *hose; hose = pcibios_alloc_controller(); if (!hose) return; hose->first_busno = 0; hose->last_busno = 0xff; if (mpc10x_bridge_init(hose, MPC10X_MEM_MAP_B, MPC10X_MEM_MAP_B, MPC10X_MAPB_EUMB_BASE) == 0) { hose->mem_resources[0].end = 0xffffffff; /* Initialize the board */ zx4500_board_init(hose); /* scan PCI bus */ ppc_md.pci_exclude_device = zx4500_exclude_device; hose->last_busno = pciauto_bus_scan(hose, hose->first_busno); ppc_md.pcibios_fixup = NULL; ppc_md.pcibios_fixup_bus = NULL; ppc_md.pci_swizzle = common_swizzle; ppc_md.pci_map_irq = zx4500_map_irq; } else { if (ppc_md.progress) ppc_md.progress("Bridge init failed", 0x100); printk("Host bridge init failed\n"); } return;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?