亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pci.c

?? 優龍2410linux2.6.8內核源代碼
?? C
字號:
/* * Port for PPC64 David Engebretsen, IBM Corp. * Contains common pci routines for ppc64 platform, pSeries and iSeries brands. *  * Copyright (C) 2003 Anton Blanchard <anton@au.ibm.com>, IBM *   Rework, based on alpha PCI code. * *      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/config.h>#include <linux/kernel.h>#include <linux/pci.h>#include <linux/delay.h>#include <linux/string.h>#include <linux/init.h>#include <linux/capability.h>#include <linux/sched.h>#include <linux/errno.h>#include <linux/bootmem.h>#include <linux/module.h>#include <linux/mm.h>#include <asm/processor.h>#include <asm/io.h>#include <asm/prom.h>#include <asm/pci-bridge.h>#include <asm/byteorder.h>#include <asm/irq.h>#include <asm/uaccess.h>#include <asm/ppcdebug.h>#include <asm/naca.h>#include <asm/iommu.h>#include <asm/machdep.h>#include "pci.h"unsigned long pci_probe_only = 1;unsigned long pci_assign_all_buses = 0;unsigned int pcibios_assign_all_busses(void){	return pci_assign_all_buses;}/* pci_io_base -- the base address from which io bars are offsets. * This is the lowest I/O base address (so bar values are always positive), * and it *must* be the start of ISA space if an ISA bus exists because * ISA drivers use hard coded offsets.  If no ISA bus exists a dummy * page is mapped and isa_io_limit prevents access to it. */unsigned long isa_io_base;	/* NULL if no ISA bus */unsigned long pci_io_base;void pcibios_name_device(struct pci_dev* dev);void pcibios_final_fixup(void);static void fixup_broken_pcnet32(struct pci_dev* dev);static void fixup_windbond_82c105(struct pci_dev* dev);extern void fixup_k2_sata(struct pci_dev* dev);void iSeries_pcibios_init(void);struct pci_controller *hose_head;struct pci_controller **hose_tail = &hose_head;struct pci_dma_ops pci_dma_ops;EXPORT_SYMBOL(pci_dma_ops);int global_phb_number;		/* Global phb counter *//* Cached ISA bridge dev. */struct pci_dev *ppc64_isabridge_dev = NULL;struct pci_fixup pcibios_fixups[] = {	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_TRIDENT,		PCI_ANY_ID,	  fixup_broken_pcnet32 },	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_WINBOND,		PCI_DEVICE_ID_WINBOND_82C105,	  fixup_windbond_82c105 },	{ PCI_FIXUP_HEADER,	PCI_ANY_ID,    			PCI_ANY_ID,	  pcibios_name_device },#ifdef CONFIG_PPC_PMAC	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_SERVERWORKS,	0x0240,	  fixup_k2_sata },#endif	{ 0 }};static void fixup_broken_pcnet32(struct pci_dev* dev){	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {		dev->vendor = PCI_VENDOR_ID_AMD;		pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);		pci_name_device(dev);	}}static void fixup_windbond_82c105(struct pci_dev* dev){	/* Assume the windbond 82c105 is the IDE controller on a	 * p610.  We should probably be more careful in case	 * someone tries to plug in a similar adapter.	 */	int i;	unsigned int reg;	printk("Using INTC for W82c105 IDE controller.\n");	pci_read_config_dword(dev, 0x40, &reg);	/* Enable LEGIRQ to use INTC instead of ISA interrupts */	pci_write_config_dword(dev, 0x40, reg | (1<<11));	for (i = 0; i < DEVICE_COUNT_RESOURCE; ++i) {		/* zap the 2nd function of the winbond chip */		if (dev->resource[i].flags & IORESOURCE_IO		    && dev->bus->number == 0 && dev->devfn == 0x81)			dev->resource[i].flags &= ~IORESOURCE_IO;	}}void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,			struct resource *res){	unsigned long offset = 0;	struct pci_controller *hose = PCI_GET_PHB_PTR(dev);	if (!hose)		return;	if (res->flags & IORESOURCE_IO)	        offset = (unsigned long)hose->io_base_virt - pci_io_base;	if (res->flags & IORESOURCE_MEM)		offset = hose->pci_mem_offset;	region->start = res->start - offset;	region->end = res->end - offset;}#ifdef CONFIG_HOTPLUGEXPORT_SYMBOL(pcibios_resource_to_bus);#endif/* * We need to avoid collisions with `mirrored' VGA ports * and other strange ISA hardware, so we always want the * addresses to be allocated in the 0x000-0x0ff region * modulo 0x400. * * Why? Because some silly external IO cards only decode * the low 10 bits of the IO address. The 0x00-0xff region * is reserved for motherboard devices that decode all 16 * bits, so it's ok to allocate at, say, 0x2800-0x28ff, * but we want to try to avoid allocating at 0x2900-0x2bff * which might have be mirrored at 0x0100-0x03ff.. */void pcibios_align_resource(void *data, struct resource *res,			    unsigned long size, unsigned long align){	struct pci_dev *dev = data;	struct pci_controller *hose = PCI_GET_PHB_PTR(dev);	unsigned long start = res->start;	unsigned long alignto;	if (res->flags & IORESOURCE_IO) {	        unsigned long offset = (unsigned long)hose->io_base_virt -					pci_io_base;		/* Make sure we start at our min on all hoses */		if (start - offset < PCIBIOS_MIN_IO)			start = PCIBIOS_MIN_IO + offset;		/*		 * Put everything into 0x00-0xff region modulo 0x400		 */		if (start & 0x300)			start = (start + 0x3ff) & ~0x3ff;	} else if (res->flags & IORESOURCE_MEM) {		/* Make sure we start at our min on all hoses */		if (start - hose->pci_mem_offset < PCIBIOS_MIN_MEM)			start = PCIBIOS_MIN_MEM + hose->pci_mem_offset;		/* Align to multiple of size of minimum base.  */		alignto = max(0x1000UL, align);		start = ALIGN(start, alignto);	}	res->start = start;}/*  * Allocate pci_controller(phb) initialized common variables.  */struct pci_controller * __initpci_alloc_pci_controller(enum phb_types controller_type){        struct pci_controller *hose;	char *model;#ifdef CONFIG_PPC_ISERIES        hose = (struct pci_controller *)kmalloc(sizeof(struct pci_controller), GFP_KERNEL);#else        hose = (struct pci_controller *)alloc_bootmem(sizeof(struct pci_controller));#endif        if(hose == NULL) {                printk(KERN_ERR "PCI: Allocate pci_controller failed.\n");                return NULL;        }        memset(hose, 0, sizeof(struct pci_controller));	switch(controller_type) {#ifdef CONFIG_PPC_ISERIES	case phb_type_hypervisor:		model = "PHB HV";		break;#endif	case phb_type_python:		model = "PHB PY";		break;	case phb_type_speedwagon:		model = "PHB SW";		break;	case phb_type_winnipeg:		model = "PHB WP";		break;	case phb_type_apple:		model = "PHB APPLE";		break;	default:		model = "PHB UK";		break;	}        if(strlen(model) < 8)		strcpy(hose->what,model);        else		memcpy(hose->what,model,7);        hose->type = controller_type;        hose->global_number = global_phb_number++;                *hose_tail = hose;        hose_tail = &hose->next;        return hose;}static void __init pcibios_claim_one_bus(struct pci_bus *b){	struct list_head *ld;	struct pci_bus *child_bus;	for (ld = b->devices.next; ld != &b->devices; ld = ld->next) {		struct pci_dev *dev = pci_dev_b(ld);		int i;		for (i = 0; i < PCI_NUM_RESOURCES; i++) {			struct resource *r = &dev->resource[i];			if (r->parent || !r->start || !r->flags)				continue;			pci_claim_resource(dev, i);		}	}	list_for_each_entry(child_bus, &b->children, node)		pcibios_claim_one_bus(child_bus);}#ifndef CONFIG_PPC_ISERIESstatic void __init pcibios_claim_of_setup(void){	struct list_head *lb;	for (lb = pci_root_buses.next; lb != &pci_root_buses; lb = lb->next) {		struct pci_bus *b = pci_bus_b(lb);		pcibios_claim_one_bus(b);	}}#endifstatic int __init pcibios_init(void){	struct pci_controller *hose;	struct pci_bus *bus;#ifdef CONFIG_PPC_ISERIES	iSeries_pcibios_init(); #endif	//ppc64_boot_msg(0x40, "PCI Probe");	printk("PCI: Probing PCI hardware\n");	/* Scan all of the recorded PCI controllers.  */	for (hose = hose_head; hose; hose = hose->next) {		hose->last_busno = 0xff;		bus = pci_scan_bus(hose->first_busno, hose->ops,				   hose->arch_data);		hose->bus = bus;		hose->last_busno = bus->subordinate;	}#ifndef CONFIG_PPC_ISERIES	if (pci_probe_only)		pcibios_claim_of_setup();	else		/* FIXME: `else' will be removed when		   pci_assign_unassigned_resources() is able to work		   correctly with [partially] allocated PCI tree. */		pci_assign_unassigned_resources();#endif	/* Call machine dependent final fixup */	if (ppc_md.pcibios_fixup)		ppc_md.pcibios_fixup();	/* Cache the location of the ISA bridge (if we have one) */	ppc64_isabridge_dev = pci_find_class(PCI_CLASS_BRIDGE_ISA << 8, NULL);	if (ppc64_isabridge_dev != NULL)		printk("ISA bridge at %s\n", pci_name(ppc64_isabridge_dev));	printk("PCI: Probing PCI hardware done\n");	//ppc64_boot_msg(0x41, "PCI Done");#ifdef CONFIG_PPC_PSERIES	pci_addr_cache_build();#endif	return 0;}subsys_initcall(pcibios_init);char __init *pcibios_setup(char *str){	return str;}int pcibios_enable_device(struct pci_dev *dev, int mask){	u16 cmd, oldcmd;	int i;	pci_read_config_word(dev, PCI_COMMAND, &cmd);	oldcmd = cmd;	for (i = 0; i < PCI_NUM_RESOURCES; i++) {		struct resource *res = &dev->resource[i];		/* Only set up the requested stuff */		if (!(mask & (1<<i)))			continue;		if (res->flags & IORESOURCE_IO)			cmd |= PCI_COMMAND_IO;		if (res->flags & IORESOURCE_MEM)			cmd |= PCI_COMMAND_MEMORY;	}	if (cmd != oldcmd) {		printk(KERN_DEBUG "PCI: Enabling device: (%s), cmd %x\n",		       pci_name(dev), cmd);                /* Enable the appropriate bits in the PCI command register.  */		pci_write_config_word(dev, PCI_COMMAND, cmd);	}	return 0;}/* * Return the domain number for this bus. */int pci_domain_nr(struct pci_bus *bus){#ifdef CONFIG_PPC_ISERIES	return 0;#else	struct pci_controller *hose = PCI_GET_PHB_PTR(bus);	return hose->global_number;#endif}EXPORT_SYMBOL(pci_domain_nr);/* Set the name of the bus as it appears in /proc/bus/pci */int pci_name_bus(char *name, struct pci_bus *bus){#ifndef CONFIG_PPC_ISERIES	struct pci_controller *hose = PCI_GET_PHB_PTR(bus);	if (hose->buid)		sprintf(name, "%04x:%02x", pci_domain_nr(bus), bus->number);	else#endif		sprintf(name, "%02x", bus->number);	return 0;}/* * Platform support for /proc/bus/pci/X/Y mmap()s, * modelled on the sparc64 implementation by Dave Miller. *  -- paulus. *//* * Adjust vm_pgoff of VMA such that it is the physical page offset * corresponding to the 32-bit pci bus offset for DEV requested by the user. * * Basically, the user finds the base address for his device which he wishes * to mmap.  They read the 32-bit value from the config space base register, * add whatever PAGE_SIZE multiple offset they wish, and feed this into the * offset parameter of mmap on /proc/bus/pci/XXX for that device. * * Returns negative error code on failure, zero on success. */static __inline__ int__pci_mmap_make_offset(struct pci_dev *dev, struct vm_area_struct *vma,		       enum pci_mmap_state mmap_state){	struct pci_controller *hose = PCI_GET_PHB_PTR(dev);	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;	unsigned long io_offset = 0;	int i, res_bit;	if (hose == 0)		return -EINVAL;		/* should never happen */	/* If memory, add on the PCI bridge address offset */	if (mmap_state == pci_mmap_mem) {		offset += hose->pci_mem_offset;		res_bit = IORESOURCE_MEM;	} else {		io_offset = (unsigned long)hose->io_base_virt;		offset += io_offset;		res_bit = IORESOURCE_IO;	}	/*	 * Check that the offset requested corresponds to one of the	 * resources of the device.	 */	for (i = 0; i <= PCI_ROM_RESOURCE; i++) {		struct resource *rp = &dev->resource[i];		int flags = rp->flags;		/* treat ROM as memory (should be already) */		if (i == PCI_ROM_RESOURCE)			flags |= IORESOURCE_MEM;		/* Active and same type? */		if ((flags & res_bit) == 0)			continue;		/* In the range of this resource? */		if (offset < (rp->start & PAGE_MASK) || offset > rp->end)			continue;		/* found it! construct the final physical address */		if (mmap_state == pci_mmap_io)			offset += hose->io_base_phys - io_offset;		vma->vm_pgoff = offset >> PAGE_SHIFT;		return 0;	}	return -EINVAL;}/* * Set vm_flags of VMA, as appropriate for this architecture, for a pci device * mapping. */static __inline__ void__pci_mmap_set_flags(struct pci_dev *dev, struct vm_area_struct *vma,		     enum pci_mmap_state mmap_state){	vma->vm_flags |= VM_SHM | VM_LOCKED | VM_IO;}/* * Set vm_page_prot of VMA, as appropriate for this architecture, for a pci * device mapping. */static __inline__ void__pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vma,		      enum pci_mmap_state mmap_state, int write_combine){	long prot = pgprot_val(vma->vm_page_prot);	/* XXX would be nice to have a way to ask for write-through */	prot |= _PAGE_NO_CACHE;	if (!write_combine)		prot |= _PAGE_GUARDED;	vma->vm_page_prot = __pgprot(prot);}/* * Perform the actual remap of the pages for a PCI device mapping, as * appropriate for this architecture.  The region in the process to map * is described by vm_start and vm_end members of VMA, the base physical * address is found in vm_pgoff. * The pci device structure is provided so that architectures may make mapping * decisions on a per-device or per-bus basis. * * Returns a negative error code on failure, zero on success. */int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,			enum pci_mmap_state mmap_state,			int write_combine){	int ret;	ret = __pci_mmap_make_offset(dev, vma, mmap_state);	if (ret < 0)		return ret;	__pci_mmap_set_flags(dev, vma, mmap_state);	__pci_mmap_set_pgprot(dev, vma, mmap_state, write_combine);	ret = remap_page_range(vma, vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,			       vma->vm_end - vma->vm_start, vma->vm_page_prot);	return ret;}#ifdef CONFIG_PPC_PSERIESstatic ssize_t pci_show_devspec(struct device *dev, char *buf){	struct pci_dev *pdev;	struct device_node *np;	pdev = to_pci_dev (dev);	np = pci_device_to_OF_node(pdev);	if (np == NULL || np->full_name == NULL)		return 0;	return sprintf(buf, "%s", np->full_name);}static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL);#endif /* CONFIG_PPC_PSERIES */void pcibios_add_platform_entries(struct pci_dev *pdev){#ifdef CONFIG_PPC_PSERIES	device_create_file(&pdev->dev, &dev_attr_devspec);#endif /* CONFIG_PPC_PSERIES */}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区激情在线| 26uuu精品一区二区| 亚洲精品欧美综合四区| av电影天堂一区二区在线| 欧美激情一区三区| 97久久超碰国产精品| 亚洲乱码中文字幕| 在线播放中文一区| 日本三级韩国三级欧美三级| 欧美一级视频精品观看| 久久精工是国产品牌吗| 久久久久久久久久美女| 成人免费视频网站在线观看| 亚洲色图一区二区三区| 欧美日韩大陆一区二区| 毛片av一区二区| 国产色婷婷亚洲99精品小说| gogogo免费视频观看亚洲一| 亚洲美女少妇撒尿| 欧美成人国产一区二区| 成人免费观看av| 亚洲午夜av在线| 日韩精品中午字幕| 91视频在线观看| 青椒成人免费视频| 国产日韩精品一区二区浪潮av| av在线一区二区| 婷婷国产v国产偷v亚洲高清| 欧美精品一区二区三区蜜桃视频| 成人aa视频在线观看| 亚洲成人综合在线| 久久影院视频免费| 欧美性一级生活| 国产精品一二三四| 亚洲国产精品综合小说图片区| 精品国产青草久久久久福利| 99精品久久久久久| 另类小说视频一区二区| 亚洲欧美在线另类| 日韩三级电影网址| 欧洲色大大久久| 国产91露脸合集magnet | 久久看人人爽人人| 欧美亚一区二区| 成人黄色av电影| 日本不卡的三区四区五区| 综合欧美一区二区三区| 精品少妇一区二区三区在线播放| 日本韩国精品一区二区在线观看| 国产一区二区三区精品视频 | 日韩中文字幕亚洲一区二区va在线| 精品国产一区二区在线观看| 欧美性做爰猛烈叫床潮| 成人福利视频网站| 国产在线观看免费一区| 日本vs亚洲vs韩国一区三区二区| 专区另类欧美日韩| 欧美国产精品一区| 久久综合久久鬼色| 26uuuu精品一区二区| 日韩三级中文字幕| 制服视频三区第一页精品| 色婷婷精品久久二区二区蜜臀av| 成人精品一区二区三区四区| 国内精品国产三级国产a久久| 日本视频在线一区| 日本中文字幕不卡| 美女视频黄 久久| 日韩高清在线电影| 日韩二区三区四区| 视频一区免费在线观看| 亚洲午夜久久久久| 亚洲自拍偷拍网站| 亚洲日本在线天堂| 中文字幕av一区二区三区| 久久先锋影音av鲁色资源| 成人精品免费视频| 成人午夜av在线| 国产一区二区在线看| 视频一区二区三区入口| 亚洲综合偷拍欧美一区色| 国产精品美女一区二区三区| 欧美tk丨vk视频| 色菇凉天天综合网| 欧美午夜精品一区二区蜜桃| 91玉足脚交白嫩脚丫在线播放| 久久国产精品露脸对白| 男人的天堂亚洲一区| 亚洲成人免费av| 亚洲一区二区精品3399| 亚洲影院久久精品| 亚洲国产欧美日韩另类综合 | 精品第一国产综合精品aⅴ| 欧美日韩中文另类| 制服丝袜中文字幕一区| 欧美日韩国产综合一区二区| 在线精品视频免费播放| 日本精品一区二区三区四区的功能| bt欧美亚洲午夜电影天堂| 久久精品免费观看| 久久国产人妖系列| 激情久久久久久久久久久久久久久久| 麻豆精品一区二区三区| 久久成人麻豆午夜电影| 精品一区精品二区高清| 首页国产欧美日韩丝袜| 国产揄拍国内精品对白| 国产成人在线观看免费网站| 国产精品白丝jk黑袜喷水| 国产精品一二三区在线| 不卡av在线免费观看| 成人高清免费观看| 一本一本久久a久久精品综合麻豆| 99精品久久只有精品| 色播五月激情综合网| 欧美日韩精品免费观看视频 | 国产精品国产三级国产aⅴ中文| 国产欧美va欧美不卡在线| 国产欧美综合在线| 午夜精品成人在线视频| 麻豆成人av在线| 国产成人激情av| 欧洲av一区二区嗯嗯嗯啊| 51精品秘密在线观看| 久久这里只有精品首页| 欧美激情中文字幕一区二区| 亚洲 欧美综合在线网络| 激情文学综合网| 91在线无精精品入口| 欧美日韩免费一区二区三区视频 | 日韩电影在线免费观看| 国产精品99久久久久久宅男| 91小视频在线观看| 91精品免费在线| 国产亚洲成aⅴ人片在线观看| 亚洲欧美日韩一区二区三区在线观看| 午夜精品国产更新| 国产制服丝袜一区| 91精品国产日韩91久久久久久| 国产欧美日本一区二区三区| 亚洲国产一区二区三区| 国产福利91精品| 亚洲国产一区二区三区| 国产精品123区| 日韩区在线观看| 精品在线你懂的| 日韩一级大片在线| 在线综合+亚洲+欧美中文字幕| 91精品国产综合久久久久久久久久 | 色综合久久99| 欧美本精品男人aⅴ天堂| 最新日韩av在线| 久久国产精品无码网站| 91久久人澡人人添人人爽欧美| 久久久综合网站| 性欧美疯狂xxxxbbbb| 丁香五精品蜜臀久久久久99网站 | 亚洲成人av在线电影| 成人av网在线| 久久影院视频免费| 日韩激情在线观看| 91福利资源站| 中文字幕中文字幕一区二区 | 偷窥少妇高潮呻吟av久久免费| 国产999精品久久| 欧美大片国产精品| 亚洲午夜久久久久久久久电影网 | 成人美女视频在线观看18| 91麻豆精品国产自产在线| 亚洲永久精品大片| 91免费看`日韩一区二区| 久久久久久久性| 久久电影网电视剧免费观看| av成人老司机| 亚洲狠狠丁香婷婷综合久久久| 国产精品一区二区不卡| 久久影音资源网| 久久疯狂做爰流白浆xx| 91精品视频网| 奇米在线7777在线精品 | 国产一区二区三区免费| 国产三级一区二区| 国产精品91一区二区| 精品噜噜噜噜久久久久久久久试看 | 美女在线视频一区| 在线综合亚洲欧美在线视频 | 亚洲图片欧美一区| 色婷婷av一区二区三区大白胸| 亚洲婷婷综合久久一本伊一区| 成人午夜私人影院| 国产精品丝袜久久久久久app| 成人开心网精品视频| 国产精品久久久久久久久久久免费看 | 中文字幕制服丝袜一区二区三区 | 91麻豆国产香蕉久久精品| 亚洲一区二区在线免费观看视频| 在线免费观看视频一区| 亚洲国产va精品久久久不卡综合| 在线观看日韩一区| 爽好多水快深点欧美视频|