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

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

?? setup-bus.c

?? ep9315平臺下PCI總線驅動的源碼
?? C
字號:
/* *	drivers/pci/setup-bus.c * * Extruded from code written by *      Dave Rusling (david.rusling@reo.mts.dec.com) *      David Mosberger (davidm@cs.arizona.edu) *	David Miller (davem@redhat.com) * * Support routines for initializing a PCI subsystem. *//* * Nov 2000, Ivan Kokshaysky <ink@jurassic.park.msu.ru> *	     PCI-PCI bridges cleanup, sorted resource allocation. * May 2001, Russell King <rmk@arm.linux.org.uk> *           Allocate prefetchable memory regions where available. * Feb 2002, Ivan Kokshaysky <ink@jurassic.park.msu.ru> *	     Converted to allocation in 3 passes, which gives *	     tighter packing. Prefetchable range support. */#include <linux/init.h>#include <linux/kernel.h>#include <linux/pci.h>#include <linux/errno.h>#include <linux/ioport.h>#include <linux/cache.h>#include <linux/slab.h>#define DEBUG_CONFIG 1#if DEBUG_CONFIG# define DBGC(args)     printk args#else# define DBGC(args)#endif#define ROUND_UP(x, a)		(((x) + (a) - 1) & ~((a) - 1))static int __initpbus_assign_resources_sorted(struct pci_bus *bus){	struct list_head *ln;	struct resource *res;	struct resource_list head, *list, *tmp;	int idx, found_vga = 0;	head.next = NULL;	for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {		struct pci_dev *dev = pci_dev_b(ln);		u16 class = dev->class >> 8;		u16 cmd;		/* First, disable the device to avoid side		   effects of possibly overlapping I/O and		   memory ranges.		   Leave VGA enabled - for obvious reason. :-)		   Same with all sorts of bridges - they may		   have VGA behind them.  */		if (class == PCI_CLASS_DISPLAY_VGA				|| class == PCI_CLASS_NOT_DEFINED_VGA)			found_vga = 1;		else if (class >> 8 != PCI_BASE_CLASS_BRIDGE) {			pci_read_config_word(dev, PCI_COMMAND, &cmd);			cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY						| PCI_COMMAND_MASTER);			pci_write_config_word(dev, PCI_COMMAND, cmd);		}		pdev_sort_resources(dev, &head);	}	for (list = head.next; list;) {		res = list->res;		idx = res - &list->dev->resource[0];		pci_assign_resource(list->dev, idx);		tmp = list;		list = list->next;		kfree(tmp);	}	return found_vga;}/* Initialize bridges with base/limit values we have collected.   PCI-to-PCI Bridge Architecture Specification rev. 1.1 (1998)   requires that if there is no I/O ports or memory behind the   bridge, corresponding range must be turned off by writing base   value greater than limit to the bridge's base/limit registers.  */static void __initpci_setup_bridge(struct pci_bus *bus){	struct pbus_set_ranges_data ranges;	struct pci_dev *bridge = bus->self;	u32 l;	if (!bridge || (bridge->class >> 8) != PCI_CLASS_BRIDGE_PCI)		return;	ranges.io_start = bus->resource[0]->start;	ranges.io_end = bus->resource[0]->end;	ranges.mem_start = bus->resource[1]->start;	ranges.mem_end = bus->resource[1]->end;	ranges.prefetch_start = bus->resource[2]->start;	ranges.prefetch_end = bus->resource[2]->end;	pcibios_fixup_pbus_ranges(bus, &ranges);	DBGC((KERN_INFO "PCI: Bus %d, bridge: %s\n",			bus->number, bridge->name));	/* Set up the top and bottom of the PCI I/O segment for this bus. */	if (bus->resource[0]->flags & IORESOURCE_IO) {		pci_read_config_dword(bridge, PCI_IO_BASE, &l);		l &= 0xffff0000;		l |= (ranges.io_start >> 8) & 0x00f0;		l |= ranges.io_end & 0xf000;		/* Set up upper 16 bits of I/O base/limit. */		pci_write_config_word(bridge, PCI_IO_BASE_UPPER16,				      ranges.io_start >> 16);		pci_write_config_word(bridge, PCI_IO_LIMIT_UPPER16,				      ranges.io_end >> 16);		DBGC((KERN_INFO "  IO window: %04lx-%04lx\n",				ranges.io_start, ranges.io_end));	}	else {		/* Clear upper 16 bits of I/O base/limit. */		pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, 0);		l = 0x00f0;		DBGC((KERN_INFO "  IO window: disabled.\n"));	}	pci_write_config_dword(bridge, PCI_IO_BASE, l);	/* Set up the top and bottom of the PCI Memory segment	   for this bus. */	if (bus->resource[1]->flags & IORESOURCE_MEM) {		l = (ranges.mem_start >> 16) & 0xfff0;		l |= ranges.mem_end & 0xfff00000;		DBGC((KERN_INFO "  MEM window: %08lx-%08lx\n",				ranges.mem_start, ranges.mem_end));	}	else {		l = 0x0000fff0;		DBGC((KERN_INFO "  MEM window: disabled.\n"));	}	pci_write_config_dword(bridge, PCI_MEMORY_BASE, l);	/* Clear out the upper 32 bits of PREF base/limit. */	pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, 0);	pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, 0);	/* Set up PREF base/limit. */	if (bus->resource[2]->flags & IORESOURCE_PREFETCH) {		l = (ranges.prefetch_start >> 16) & 0xfff0;		l |= ranges.prefetch_end & 0xfff00000;		DBGC((KERN_INFO "  PREFETCH window: %08lx-%08lx\n",				ranges.prefetch_start, ranges.prefetch_end));	}	else {		l = 0x0000fff0;		DBGC((KERN_INFO "  PREFETCH window: disabled.\n"));	}	pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, l);	/* Check if we have VGA behind the bridge.	   Enable ISA in either case. */	l = (bus->resource[0]->flags & IORESOURCE_BUS_HAS_VGA) ?		PCI_BRIDGE_CTL_VGA | PCI_BRIDGE_CTL_NO_ISA :		PCI_BRIDGE_CTL_NO_ISA;	pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, l);}/* Check whether the bridge supports optional I/O and   prefetchable memory ranges. If not, the respective   base/limit registers must be read-only and read as 0. */static void __initpci_bridge_check_ranges(struct pci_bus *bus){	u16 io;	u32 pmem;	struct pci_dev *bridge = bus->self;	struct resource *b_res;	if (!bridge || (bridge->class >> 8) != PCI_CLASS_BRIDGE_PCI)		return;	b_res = &bridge->resource[PCI_BRIDGE_RESOURCES];	b_res[1].flags |= IORESOURCE_MEM;	pci_read_config_word(bridge, PCI_IO_BASE, &io);	if (!io) {		pci_write_config_word(bridge, PCI_IO_BASE, 0xf0f0);		pci_read_config_word(bridge, PCI_IO_BASE, &io); 		pci_write_config_word(bridge, PCI_IO_BASE, 0x0); 	} 	if (io)		b_res[0].flags |= IORESOURCE_IO;	/*  DECchip 21050 pass 2 errata: the bridge may miss an address	    disconnect boundary by one PCI data phase.	    Workaround: do not use prefetching on this device. */	if (bridge->vendor == PCI_VENDOR_ID_DEC && bridge->device == 0x0001)		return;	pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem);	if (!pmem) {		pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE,					       0xfff0fff0);		pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem);		pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, 0x0);	}	if (pmem)		b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH;}/* Sizing the IO windows of the PCI-PCI bridge is trivial,   since these windows have 4K granularity and the IO ranges   of non-bridge PCI devices are limited to 256 bytes.   We must be careful with the ISA aliasing though. */static void __initpbus_size_io(struct pci_bus *bus){	struct list_head *ln;	struct resource *b_res = bus->resource[0];	unsigned long size = 0, size1 = 0;	if (!(b_res->flags & IORESOURCE_IO))		return;	for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {		struct pci_dev *dev = pci_dev_b(ln);		int i;				for (i = 0; i < PCI_NUM_RESOURCES; i++) {			struct resource *r = &dev->resource[i];			unsigned long r_size;			if (r->parent || !(r->flags & IORESOURCE_IO))				continue;			r_size = r->end - r->start + 1;			if (r_size < 0x400)				/* Might be re-aligned for ISA */				size += r_size;			else				size1 += r_size;		}		/* ??? Reserve some resources for CardBus. */		if ((dev->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS)			size1 += 4*1024;	}/* To be fixed in 2.5: we should have sort of HAVE_ISA   flag in the struct pci_bus. */#if defined(CONFIG_ISA) || defined(CONFIG_EISA)	size = (size & 0xff) + ((size & ~0xffUL) << 2);#endif	size = ROUND_UP(size + size1, 4096);	if (!size) {		b_res->flags = 0;		return;	}	/* Alignment of the IO window is always 4K */	b_res->start = 4096;	b_res->end = b_res->start + size - 1;}/* Calculate the size of the bus and minimal alignment which   guarantees that all child resources fit in this size. */static void __initpbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long type){	struct list_head *ln;	unsigned long min_align, align, size;	unsigned long aligns[12];	/* Alignments from 1Mb to 2Gb */	int order, max_order;	struct resource *b_res = (type & IORESOURCE_PREFETCH) ?				 bus->resource[2] : bus->resource[1];	memset(aligns, 0, sizeof(aligns));	max_order = 0;	size = 0;	for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) {		struct pci_dev *dev = pci_dev_b(ln);		int i;				for (i = 0; i < PCI_NUM_RESOURCES; i++) {			struct resource *r = &dev->resource[i];			unsigned long r_size;			if (r->parent || (r->flags & mask) != type)				continue;			r_size = r->end - r->start + 1;			/* For bridges size != alignment */			align = (i < PCI_BRIDGE_RESOURCES) ? r_size : r->start;			order = ffz(~align) - 20;			if (order > 11) {				printk(KERN_WARNING "PCI: region %s/%d "				       "too large: %lx-%lx\n",				       dev->slot_name, i, r->start, r->end);				r->flags = 0;				continue;			}			size += r_size;			if (order < 0)				order = 0;			/* Exclude ranges with size > align from			   calculation of the alignment. */			if (r_size == align)				aligns[order] += align;			if (order > max_order)				max_order = order;		}		/* ??? Reserve some resources for CardBus. */		if ((dev->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) {			size += 1UL << 24;		/* 16 Mb */			aligns[24 - 20] += 1UL << 24;		}	}	align = 0;	min_align = 0;	for (order = 0; order <= max_order; order++) {		unsigned long align1 = 1UL << (order + 20);		if (!align)			min_align = align1;		else if (ROUND_UP(align + min_align, min_align) < align1)			min_align = align1 >> 1;		align += aligns[order];	}	size = ROUND_UP(size, min_align);	if (!size) {		b_res->flags = 0;		return;	}	b_res->start = min_align;	b_res->end = size + min_align - 1;}void __initpbus_size_bridges(struct pci_bus *bus){	struct list_head *ln;	unsigned long mask, type;	for (ln=bus->children.next; ln != &bus->children; ln=ln->next)		pbus_size_bridges(pci_bus_b(ln));	/* The root bus? */	if (!bus->self)		return;	pci_bridge_check_ranges(bus);	pbus_size_io(bus);	mask = type = IORESOURCE_MEM;	/* If the bridge supports prefetchable range, size it separately. */	if (bus->resource[2] &&	    bus->resource[2]->flags & IORESOURCE_PREFETCH) {		pbus_size_mem(bus, IORESOURCE_PREFETCH, IORESOURCE_PREFETCH);		mask |= IORESOURCE_PREFETCH;	/* Size non-prefetch only. */	}	pbus_size_mem(bus, mask, type);}void __initpbus_assign_resources(struct pci_bus *bus){	struct list_head *ln;	int found_vga = pbus_assign_resources_sorted(bus);	if (found_vga) {		struct pci_bus *b;		/* Propagate presence of the VGA to upstream bridges */		for (b = bus; b->parent; b = b->parent) {			b->resource[0]->flags |= IORESOURCE_BUS_HAS_VGA;		}	}	for (ln=bus->children.next; ln != &bus->children; ln=ln->next) {		struct pci_bus *b = pci_bus_b(ln);		pbus_assign_resources(b);		pci_setup_bridge(b);	}}void __initpci_assign_unassigned_resources(void){	struct list_head *ln;	struct pci_dev *dev;	/* Depth first, calculate sizes and alignments of all	   subordinate buses. */	for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next)		pbus_size_bridges(pci_bus_b(ln));	/* Depth last, allocate resources and update the hardware. */	for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next)		pbus_assign_resources(pci_bus_b(ln));	pci_for_each_dev(dev) {		pdev_enable_device(dev);	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日产欧美一区| 久久免费视频色| 99在线精品观看| 丰满少妇在线播放bd日韩电影| 久久国产生活片100| 久久精品国产精品亚洲精品| 日本aⅴ免费视频一区二区三区| 亚洲成年人影院| 欧美a级一区二区| 国产美女精品人人做人人爽| 国产成人免费9x9x人网站视频| 国产裸体歌舞团一区二区| 国产99久久久精品| 99国产精品久| 欧美另类变人与禽xxxxx| 国产精品毛片大码女人| 久久精品人人做| 日本欧美久久久久免费播放网| 精品一区二区三区香蕉蜜桃| 国产主播一区二区| 欧美一区二区三区成人| 亚洲一区二区三区四区在线免费观看| 成人一级黄色片| 国产香蕉久久精品综合网| 美女一区二区在线观看| 91精品国产综合久久福利软件| 夜夜揉揉日日人人青青一国产精品| 成人av影院在线| 国产精品青草综合久久久久99| 国产精品一区专区| 国产色91在线| 国产在线精品不卡| 久久亚洲综合色| 风间由美一区二区三区在线观看 | 亚洲国产日韩一区二区| 99久久er热在这里只有精品15 | 欧美日韩一级二级| 亚欧色一区w666天堂| 欧美猛男超大videosgay| 性久久久久久久久| 日韩一级欧美一级| 国产麻豆日韩欧美久久| 国产精品污网站| 日本高清不卡视频| 无吗不卡中文字幕| 日韩免费性生活视频播放| 精品午夜一区二区三区在线观看| 精品国产91洋老外米糕| 成人精品免费视频| 亚洲欧美日韩久久| 欧美日韩免费一区二区三区视频| 丝袜亚洲另类欧美| www久久精品| av一区二区三区在线| 亚洲精品老司机| 欧美老女人在线| 91福利社在线观看| 午夜精品国产更新| 久久婷婷综合激情| www.久久精品| 日韩电影在线一区二区三区| 精品国产乱码久久久久久影片| 成人av综合一区| 图片区小说区区亚洲影院| www欧美成人18+| 在线观看欧美精品| 国内精品伊人久久久久av一坑| 国产精品欧美久久久久一区二区| 在线一区二区视频| 国产最新精品精品你懂的| 国产精品另类一区| 日韩一区二区三区免费看| 国产99久久久国产精品免费看| 亚洲一区二区三区三| 2017欧美狠狠色| 欧美日韩视频在线第一区 | 亚洲综合色丁香婷婷六月图片| 日韩免费成人网| 在线观看成人小视频| 国内精品免费在线观看| 亚洲午夜久久久久| 欧美极品少妇xxxxⅹ高跟鞋 | 日韩欧美中文字幕公布| 一本久久精品一区二区| 国产乱码精品一区二区三区五月婷| 一区二区成人在线| 亚洲国产精华液网站w| 日韩视频免费直播| 欧洲视频一区二区| 99久久免费视频.com| 精品一区二区久久久| 天堂资源在线中文精品| 亚洲品质自拍视频网站| 中文字幕乱码一区二区免费| 日韩精品中文字幕在线不卡尤物 | 亚洲欧美日韩国产综合| 欧美国产精品久久| 久久久亚洲高清| 日韩免费视频一区二区| 欧美精品三级在线观看| 欧美丝袜第三区| 色婷婷av一区二区三区之一色屋| 粉嫩一区二区三区在线看| 精品一区二区免费在线观看| 日韩成人一级片| 婷婷国产v国产偷v亚洲高清| 亚洲最大色网站| 一区二区三区在线视频免费| 亚洲欧美日韩国产中文在线| 国产精品国产三级国产| 国产精品污www在线观看| 国产日产欧美精品一区二区三区| 久久久久久一二三区| 亚洲精品一线二线三线无人区| 91精品国产综合久久蜜臀| 91精品免费在线观看| 制服丝袜亚洲精品中文字幕| 91精选在线观看| 国产精品久久久久影视| 亚洲三级久久久| 亚洲久草在线视频| 一区二区三区中文字幕精品精品| 亚洲色图第一区| 亚洲综合图片区| 亚洲bt欧美bt精品| 日韩av午夜在线观看| 美女在线视频一区| 国产乱码一区二区三区| 成人午夜电影小说| 色婷婷国产精品| 在线综合视频播放| 精品成人在线观看| 国产精品国产精品国产专区不蜜 | 欧美大片一区二区三区| 精品盗摄一区二区三区| 国产精品色在线观看| 亚洲精品国产一区二区精华液 | 91行情网站电视在线观看高清版| 日本道免费精品一区二区三区| 欧美日韩一区二区三区高清 | 国产清纯美女被跳蛋高潮一区二区久久w | 国产精品亚洲第一区在线暖暖韩国| 国产传媒久久文化传媒| av不卡在线观看| 亚洲色图视频网| 日本vs亚洲vs韩国一区三区二区 | 精品动漫一区二区三区在线观看| 国产视频一区不卡| 亚洲一二三区不卡| 激情久久五月天| 欧洲生活片亚洲生活在线观看| 日韩一区国产二区欧美三区| 国产欧美久久久精品影院| 亚洲一区二区三区国产| 国产一区二区福利视频| 91九色最新地址| 久久无码av三级| 亚洲午夜久久久久久久久久久| 寂寞少妇一区二区三区| 91成人看片片| 国产日韩欧美精品一区| 午夜激情综合网| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 色综合中文字幕国产| 欧美日韩一区视频| 中文一区二区在线观看| 青青草97国产精品免费观看| 91在线精品一区二区三区| 日韩精品专区在线| 亚洲在线视频一区| 粉嫩久久99精品久久久久久夜| 欧美精品乱码久久久久久按摩 | 亚洲精品视频在线观看免费 | 精品sm捆绑视频| 丝袜诱惑亚洲看片| 91久久线看在观草草青青| 国产精品视频你懂的| 九九视频精品免费| 欧美日韩高清一区二区三区| 国产精品传媒入口麻豆| 国产麻豆一精品一av一免费| 在线播放一区二区三区| 一区二区成人在线| 91亚洲精品久久久蜜桃网站| 久久精品亚洲国产奇米99| 蜜桃在线一区二区三区| 在线不卡中文字幕| 亚洲国产日韩综合久久精品| 91福利国产精品| 亚洲综合图片区| 91福利小视频| 亚洲一二三四久久| 在线视频一区二区免费| 最新中文字幕一区二区三区 | 在线一区二区三区| 日韩理论在线观看| 91九色最新地址| 亚洲一区在线电影| 欧美日韩精品免费| 日韩高清电影一区|