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

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

?? pci.c

?? MIZI Research, Inc.發布的嵌入式Linux內核源碼
?? C
字號:
/* *	linux/arch/alpha/kernel/pci.c * * Extruded from code written by *	Dave Rusling (david.rusling@reo.mts.dec.com) *	David Mosberger (davidm@cs.arizona.edu) *//* 2.3.x PCI/resources, 1999 Andrea Arcangeli <andrea@suse.de> *//* * Nov 2000, Ivan Kokshaysky <ink@jurassic.park.msu.ru> *	     PCI-PCI bridges cleanup */#include <linux/string.h>#include <linux/pci.h>#include <linux/init.h>#include <linux/ioport.h>#include <linux/kernel.h>#include <linux/bootmem.h>#include <asm/machvec.h>#include "proto.h"#include "pci_impl.h"/* * Some string constants used by the various core logics.  */const char *const pci_io_names[] = {  "PCI IO bus 0", "PCI IO bus 1", "PCI IO bus 2", "PCI IO bus 3",  "PCI IO bus 4", "PCI IO bus 5", "PCI IO bus 6", "PCI IO bus 7"};const char *const pci_mem_names[] = {  "PCI mem bus 0", "PCI mem bus 1", "PCI mem bus 2", "PCI mem bus 3",  "PCI mem bus 4", "PCI mem bus 5", "PCI mem bus 6", "PCI mem bus 7"};const char pci_hae0_name[] = "HAE0";/* * The PCI controller list. */struct pci_controller *hose_head, **hose_tail = &hose_head;struct pci_controller *pci_isa_hose;/* * Quirks. */static void __initquirk_eisa_bridge(struct pci_dev *dev){	dev->class = PCI_CLASS_BRIDGE_EISA << 8;}static void __initquirk_isa_bridge(struct pci_dev *dev){	dev->class = PCI_CLASS_BRIDGE_ISA << 8;}static void __initquirk_ali_ide_ports(struct pci_dev *dev){	if (dev->resource[0].end == 0xffff)		dev->resource[0].end = dev->resource[0].start + 7;	if (dev->resource[2].end == 0xffff)		dev->resource[2].end = dev->resource[2].start + 7;	if (dev->resource[3].end == 0xffff)		dev->resource[3].end = dev->resource[3].start + 7;}static void __initquirk_cypress(struct pci_dev *dev){	/* The Notorious Cy82C693 chip.  */	/* The Cypress IDE controller doesn't support native mode, but it	   has programmable addresses of IDE command/control registers.	   This violates PCI specifications, confuses the IDE subsystem and	   causes resource conflicts between the primary HD_CMD register and	   the floppy controller.  Ugh.  Fix that.  */	if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE) {		dev->resource[0].flags = 0;		dev->resource[1].flags = 0;	}	/* The Cypress bridge responds on the PCI bus in the address range	   0xffff0000-0xffffffff (conventional x86 BIOS ROM).  There is no	   way to turn this off.  The bridge also supports several extended	   BIOS ranges (disabled after power-up), and some consoles do turn	   them on.  So if we use a large direct-map window, or a large SG	   window, we must avoid entire 0xfff00000-0xffffffff region.  */	else if (dev->class >> 8 == PCI_CLASS_BRIDGE_ISA) {		if (__direct_map_base + __direct_map_size >= 0xfff00000)			__direct_map_size = 0xfff00000 - __direct_map_base;		else {			struct pci_controller *hose = dev->sysdata;			struct pci_iommu_arena *pci = hose->sg_pci;			if (pci && pci->dma_base + pci->size >= 0xfff00000)				pci->size = 0xfff00000 - pci->dma_base;		}	}}struct pci_fixup pcibios_fixups[] __initdata = {	{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375,	  quirk_eisa_bridge },	{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378,	  quirk_isa_bridge },	{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5229,	  quirk_ali_ide_ports },	{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693,	  quirk_cypress },	{ 0 }};#define MAX(val1, val2)		((val1) > (val2) ? (val1) : (val2))#define ALIGN(val,align)	(((val) + ((align) - 1)) & ~((align) - 1))#define KB			1024#define MB			(1024*KB)#define GB			(1024*MB)voidpcibios_align_resource(void *data, struct resource *res, unsigned long size){	struct pci_dev *dev = data;	struct pci_controller *hose = dev->sysdata;	unsigned long alignto;	unsigned long start = res->start;	if (res->flags & IORESOURCE_IO) {		/* Make sure we start at our min on all hoses */		if (start - hose->io_space->start < PCIBIOS_MIN_IO)			start = PCIBIOS_MIN_IO + hose->io_space->start;		/*		 * 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->mem_space->start < PCIBIOS_MIN_MEM)			start = PCIBIOS_MIN_MEM + hose->mem_space->start;		/*		 * The following holds at least for the Low Cost		 * Alpha implementation of the PCI interface:		 *		 * In sparse memory address space, the first		 * octant (16MB) of every 128MB segment is		 * aliased to the very first 16 MB of the		 * address space (i.e., it aliases the ISA		 * memory address space).  Thus, we try to		 * avoid allocating PCI devices in that range.		 * Can be allocated in 2nd-7th octant only.		 * Devices that need more than 112MB of		 * address space must be accessed through		 * dense memory space only!		 */		/* Align to multiple of size of minimum base.  */		alignto = MAX(0x1000, size);		start = ALIGN(start, alignto);		if (hose->sparse_mem_base && size <= 7 * 16*MB) {			if (((start / (16*MB)) & 0x7) == 0) {				start &= ~(128*MB - 1);				start += 16*MB;				start  = ALIGN(start, alignto);			}			if (start/(128*MB) != (start + size - 1)/(128*MB)) {				start &= ~(128*MB - 1);				start += (128 + 16)*MB;				start  = ALIGN(start, alignto);			}		}	}	res->start = start;}#undef MAX#undef ALIGN#undef KB#undef MB#undef GBvoid __initpcibios_init(void){	if (!alpha_mv.init_pci)		return;	alpha_mv.init_pci();}char * __initpcibios_setup(char *str){	return str;}void __initpcibios_fixup_resource(struct resource *res, struct resource *root){	res->start += root->start;	res->end += root->start;}void __initpcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus){	/* Update device resources.  */	struct pci_controller *hose = (struct pci_controller *)bus->sysdata;	int i;	for (i = 0; i < PCI_NUM_RESOURCES; i++) {		if (!dev->resource[i].start)			continue;		if (dev->resource[i].flags & IORESOURCE_IO)			pcibios_fixup_resource(&dev->resource[i],					       hose->io_space);		else if (dev->resource[i].flags & IORESOURCE_MEM)			pcibios_fixup_resource(&dev->resource[i],					       hose->mem_space);	}}void __initpcibios_fixup_bus(struct pci_bus *bus){	/* Propogate hose info into the subordinate devices.  */	struct pci_controller *hose = bus->sysdata;	struct list_head *ln;	struct pci_dev *dev = bus->self;	if (!dev) {		/* Root bus */		bus->resource[0] = hose->io_space;		bus->resource[1] = hose->mem_space;	} else {		/* This is a bridge. Do not care how it's initialized,		   just link its resources to the bus ones */		int i;		for(i=0; i<3; i++) {			bus->resource[i] =				&dev->resource[PCI_BRIDGE_RESOURCES+i];			bus->resource[i]->name = bus->name;		}		bus->resource[0]->flags |= pci_bridge_check_io(dev);		bus->resource[1]->flags |= IORESOURCE_MEM;		/* For now, propogate hose limits to the bus;		   we'll adjust them later. */		bus->resource[0]->end = hose->io_space->end;		bus->resource[1]->end = hose->mem_space->end;		/* Turn off downstream PF memory address range by default */		bus->resource[2]->start = 1024*1024;		bus->resource[2]->end = bus->resource[2]->start - 1;	}	for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) {		struct pci_dev *dev = pci_dev_b(ln);		if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)			pcibios_fixup_device_resources(dev, bus);	}}voidpcibios_update_resource(struct pci_dev *dev, struct resource *root,			struct resource *res, int resource){	struct pci_controller *hose = dev->sysdata;	int where;	u32 reg;	if (resource < PCI_ROM_RESOURCE) 		where = PCI_BASE_ADDRESS_0 + (resource * 4);	else if (resource == PCI_ROM_RESOURCE)		where = dev->rom_base_reg;	else {		return; /* Don't update non-standard resources here. */	}	/* Point root at the hose root. */	if (res->flags & IORESOURCE_IO)		root = hose->io_space;	if (res->flags & IORESOURCE_MEM)		root = hose->mem_space;	reg = (res->start - root->start) | (res->flags & 0xf);	pci_write_config_dword(dev, where, reg);	if ((res->flags & (PCI_BASE_ADDRESS_SPACE			   | PCI_BASE_ADDRESS_MEM_TYPE_MASK))	    == (PCI_BASE_ADDRESS_SPACE_MEMORY		| PCI_BASE_ADDRESS_MEM_TYPE_64)) {		pci_write_config_dword(dev, where+4, 0);		printk(KERN_WARNING "PCI: dev %s type 64-bit\n", dev->name);	}	/* ??? FIXME -- record old value for shutdown.  */}void __initpcibios_update_irq(struct pci_dev *dev, int irq){	pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);	/* ??? FIXME -- record old value for shutdown.  */}/* Most Alphas have straight-forward swizzling needs.  */u8 __initcommon_swizzle(struct pci_dev *dev, u8 *pinp){	struct pci_controller *hose = dev->sysdata;	if (dev->bus->number != hose->first_busno) {		u8 pin = *pinp;		do {			pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));			/* Move up the chain of bridges. */			dev = dev->bus->self;		} while (dev->bus->self);		*pinp = pin;		/* The slot is the slot of the last bridge. */	}	return PCI_SLOT(dev->devfn);}void __initpcibios_fixup_pbus_ranges(struct pci_bus * bus,			  struct pbus_set_ranges_data * ranges){	struct pci_controller *hose = (struct pci_controller *)bus->sysdata;	ranges->io_start -= hose->io_space->start;	ranges->io_end -= hose->io_space->start;	ranges->mem_start -= hose->mem_space->start;	ranges->mem_end -= hose->mem_space->start;}intpcibios_enable_device(struct pci_dev *dev){	/* Nothing to do, since we enable all devices at startup.  */	return 0;}/* *  If we set up a device for bus mastering, we need to check the latency *  timer as certain firmware forgets to set it properly, as seen *  on SX164 and LX164 with SRM. */voidpcibios_set_master(struct pci_dev *dev){	u8 lat;	pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);	if (lat >= 16) return;	printk("PCI: Setting latency timer of device %s to 64\n",							dev->slot_name);	pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);}void __initcommon_init_pci(void){	struct pci_controller *hose;	struct pci_bus *bus;	int next_busno;	/* Scan all of the recorded PCI controllers.  */	for (next_busno = 0, hose = hose_head; hose; hose = hose->next) {		hose->first_busno = next_busno;		hose->last_busno = 0xff;		bus = pci_scan_bus(next_busno, alpha_mv.pci_ops, hose);		hose->bus = bus;		next_busno = hose->last_busno = bus->subordinate;		next_busno += 1;	}	pci_assign_unassigned_resources();	pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq);}struct pci_controller * __initalloc_pci_controller(void){	struct pci_controller *hose;	hose = alloc_bootmem(sizeof(*hose));	*hose_tail = hose;	hose_tail = &hose->next;	return hose;}struct resource * __initalloc_resource(void){	struct resource *res;	res = alloc_bootmem(sizeof(*res));	return res;}/* Provide information on locations of various I/O regions in physical   memory.  Do this on a per-card basis so that we choose the right hose.  */asmlinkage longsys_pciconfig_iobase(long which, unsigned long bus, unsigned long dfn){	struct pci_controller *hose;	struct pci_dev *dev;	/* from hose or from bus.devfn */	if (which & IOBASE_FROM_HOSE) {		for(hose = hose_head; hose; hose = hose->next) 			if (hose->index == bus) break;		if (!hose) return -ENODEV;	} else {		/* Special hook for ISA access.  */		if (bus == 0 && dfn == 0) {			hose = pci_isa_hose;		} else {			dev = pci_find_slot(bus, dfn);			if (!dev)				return -ENODEV;			hose = dev->sysdata;		}	}	switch (which & ~IOBASE_FROM_HOSE) {	case IOBASE_HOSE:		return hose->index;	case IOBASE_SPARSE_MEM:		return hose->sparse_mem_base;	case IOBASE_DENSE_MEM:		return hose->dense_mem_base;	case IOBASE_SPARSE_IO:		return hose->sparse_io_base;	case IOBASE_DENSE_IO:		return hose->dense_io_base;	case IOBASE_ROOT_BUS:		return hose->bus->number;	}	return -EOPNOTSUPP;}/* Return the index of the PCI controller for device PDEV. */intpci_controller_num(struct pci_dev *pdev){        struct pci_controller *hose = pdev->sysdata;	return (hose ? hose->index : -ENXIO);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人avav在线| 捆绑紧缚一区二区三区视频| 国产寡妇亲子伦一区二区| 精品久久久久久久久久久久久久久| 午夜精品久久一牛影视| 欧美日产国产精品| 免费久久99精品国产| 欧美一区二区三区四区高清| 日本美女一区二区三区视频| 欧美成人a视频| 国产精品影视天天线| 国产精品不卡在线观看| 欧美亚男人的天堂| 婷婷六月综合网| 欧美一级一区二区| 粉嫩一区二区三区性色av| 国产精品福利一区| 欧美性大战xxxxx久久久| 毛片一区二区三区| 欧美激情中文字幕一区二区| 91视频免费观看| 日韩av中文字幕一区二区 | 秋霞影院一区二区| www国产成人免费观看视频 深夜成人网| 国产麻豆一精品一av一免费| 最新国产精品久久精品| 日本福利一区二区| 蜜桃av一区二区| 中文字幕一区二区三区不卡| 欧美卡1卡2卡| 成人性色生活片| 首页国产丝袜综合| 欧美国产日韩一二三区| 欧美日韩亚洲国产综合| 国产麻豆成人精品| 亚洲不卡在线观看| 国产欧美视频在线观看| 欧美日韩亚洲综合| 成人免费观看视频| 日韩1区2区3区| 亚洲日本va午夜在线影院| 欧美成人激情免费网| 欧美综合视频在线观看| 国产精品亚洲综合一区在线观看| 一区二区在线观看不卡| 国产亚洲精品超碰| 4438亚洲最大| 91首页免费视频| 国内不卡的二区三区中文字幕| 亚洲男人电影天堂| 国产日韩欧美激情| 欧美变态tickle挠乳网站| 欧美优质美女网站| jizz一区二区| 国产在线国偷精品免费看| 香蕉影视欧美成人| 一区二区三区电影在线播| 欧美国产日本韩| 欧美一二三四区在线| 在线视频观看一区| 国产91高潮流白浆在线麻豆 | 日本亚洲最大的色成网站www| 日韩久久一区二区| 欧美韩国日本不卡| 久久久亚洲高清| 日韩欧美一二区| 制服丝袜日韩国产| 欧美日韩日日骚| 一本大道久久a久久综合| 懂色av一区二区三区免费观看| 国内精品在线播放| 精品一区二区精品| 国产最新精品免费| 久久99这里只有精品| 六月丁香综合在线视频| 日韩二区三区四区| 日韩影院精彩在线| 三级欧美在线一区| 五月婷婷久久综合| 亚洲.国产.中文慕字在线| 亚洲一区二区欧美日韩| 亚洲一卡二卡三卡四卡五卡| 亚洲福利视频三区| 亚洲一区二区综合| 亚洲电影一区二区| 五月天丁香久久| 日韩高清不卡一区| 免费观看在线色综合| 精品一区二区三区免费| 激情综合网最新| 国产一区二区不卡在线| 国产高清无密码一区二区三区| 久久99精品网久久| 国产成人综合视频| 91美女片黄在线观看91美女| 欧美性极品少妇| 欧美精品一二三| 日韩一级免费观看| 久久久久久久网| 亚洲日本韩国一区| 亚洲va韩国va欧美va精品| 日产欧产美韩系列久久99| 狠狠色丁香婷婷综合久久片| 国产馆精品极品| 91在线视频在线| 欧美精品在线观看播放| 久久综合久久99| 国产精品乱码久久久久久| 亚洲日本va在线观看| 日韩影视精彩在线| 狠狠色综合日日| va亚洲va日韩不卡在线观看| 日本电影亚洲天堂一区| 日韩西西人体444www| 国产色91在线| 亚洲一区二区三区四区在线| 久久福利视频一区二区| 国产精品一二三区| 在线看日韩精品电影| 日韩欧美精品在线| 亚洲欧美日韩国产手机在线 | 美女脱光内衣内裤视频久久影院| 国产在线不卡一区| 色综合天天视频在线观看| 91麻豆精品国产91久久久久久| 欧美国产精品一区二区三区| 亚洲一级二级三级| 国产成人免费av在线| 欧美日韩免费电影| 久久精品网站免费观看| 亚洲国产一区二区在线播放| 国产xxx精品视频大全| 欧美色涩在线第一页| 国产女主播一区| 日韩精品亚洲一区| 91影视在线播放| 欧美精品一区二区高清在线观看| 亚洲激情在线激情| 国产精品538一区二区在线| 欧美日韩国产在线播放网站| 国产欧美va欧美不卡在线| 奇米影视在线99精品| 在线视频欧美区| 国产精品久久三| 久久国产麻豆精品| 51精品国自产在线| 亚洲综合视频网| 成人18视频在线播放| 精品电影一区二区| 天堂精品中文字幕在线| 在线观看国产一区二区| 国产精品沙发午睡系列990531| 日韩高清不卡一区二区三区| 色拍拍在线精品视频8848| 久久久亚洲高清| 美国毛片一区二区三区| 欧美一区二区三区免费大片| 亚洲动漫第一页| 欧美色综合久久| 夜色激情一区二区| 日本韩国精品在线| 亚洲色图色小说| av男人天堂一区| 国产精品久久精品日日| 国产精品亚洲第一区在线暖暖韩国| 日韩一区二区三区视频在线观看| 亚洲成人av电影| 欧美精品高清视频| 午夜av一区二区三区| 欧美午夜影院一区| 亚洲一区二区偷拍精品| 欧美亚洲综合一区| 亚洲永久精品国产| 欧美日韩国产三级| 奇米色一区二区三区四区| 日韩欧美不卡在线观看视频| 老司机精品视频在线| 精品国产亚洲一区二区三区在线观看| 午夜精品久久久久久久| 欧美三级视频在线| 亚洲精品国产视频| 欧美四级电影在线观看| 一区二区三区中文免费| 91美女福利视频| 亚洲国产精品久久人人爱蜜臀| 色8久久精品久久久久久蜜| 国产精品二区一区二区aⅴ污介绍| 国产91精品一区二区麻豆网站| 久久久久久久久久久久久夜| 国产一区二区在线观看免费| 日韩欧美一二三区| 粗大黑人巨茎大战欧美成人| 国产欧美日韩久久| 成人免费视频一区| 一区二区三区国产精华| 精品污污网站免费看| 日本伊人色综合网| 国产免费成人在线视频| aa级大片欧美| 亚洲综合精品自拍|