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

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

?? setup-bus.c

?? 講述linux的初始化過程
?? 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 */#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 pbus_set_ranges_data *ranges){	struct list_head *ln;	struct resource *res;	struct resource_list head_io, head_mem, *list, *tmp;	unsigned long io_reserved = 0, mem_reserved = 0;	int idx, found_vga = 0;	head_io.next = head_mem.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);		}		/* Reserve some resources for CardBus.		   Are these values reasonable? */		if (class == PCI_CLASS_BRIDGE_CARDBUS) {			io_reserved += 8*1024;			mem_reserved += 32*1024*1024;			continue;		}		pdev_sort_resources(dev, &head_io, IORESOURCE_IO);		pdev_sort_resources(dev, &head_mem, IORESOURCE_MEM);	}	for (list = head_io.next; list;) {		res = list->res;		idx = res - &list->dev->resource[0];		if (pci_assign_resource(list->dev, idx) == 0		    && ranges->io_end < res->end)			ranges->io_end = res->end;		tmp = list;		list = list->next;		kfree(tmp);	}	for (list = head_mem.next; list;) {		res = list->res;		idx = res - &list->dev->resource[0];		if (pci_assign_resource(list->dev, idx) == 0		    && ranges->mem_end < res->end)			ranges->mem_end = res->end;		tmp = list;		list = list->next;		kfree(tmp);	}	ranges->io_end += io_reserved;	ranges->mem_end += mem_reserved;	/* 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.  */#if 1	/* But assuming that some hardware designed before 1998 might	   not support this (very unlikely - at least all DEC bridges	   are ok and I believe that was standard de-facto. -ink), we	   must allow for at least one unit.  */	if (ranges->io_end == ranges->io_start)		ranges->io_end += 1;	if (ranges->mem_end == ranges->mem_start)		ranges->mem_end += 1;#endif	ranges->io_end = ROUND_UP(ranges->io_end, 4*1024);	ranges->mem_end = ROUND_UP(ranges->mem_end, 1024*1024);	return found_vga;}/* Initialize bridges with base/limit values we have collected */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;	pcibios_fixup_pbus_ranges(bus, &ranges);	DBGC(("PCI: Bus %d, bridge: %s\n", bus->number, bridge->name));	DBGC(("  IO window: %04lx-%04lx\n", ranges.io_start, ranges.io_end));	DBGC(("  MEM window: %08lx-%08lx\n", ranges.mem_start, ranges.mem_end));	/* Set up the top and bottom of the PCI I/O segment for this bus. */	pci_read_config_dword(bridge, PCI_IO_BASE, &l);	l &= 0xffff0000;	l |= (ranges.io_start >> 8) & 0x00f0;	l |= ranges.io_end & 0xf000;	pci_write_config_dword(bridge, PCI_IO_BASE, l);	/* Clear upper 16 bits of I/O base/limit. */	pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, 0);	/* 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 the top and bottom of the PCI Memory segment	   for this bus. */	l = (ranges.mem_start >> 16) & 0xfff0;	l |= ranges.mem_end & 0xfff00000;	pci_write_config_dword(bridge, PCI_MEMORY_BASE, l);	/* Set up PREF base/limit. */	l = (bus->resource[2]->start >> 16) & 0xfff0;	l |= bus->resource[2]->end & 0xfff00000;	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) ? 0x0c : 0x04;	pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, l);}static void __initpbus_assign_resources(struct pci_bus *bus, struct pbus_set_ranges_data *ranges){	struct list_head *ln;	int found_vga = pbus_assign_resources_sorted(bus, ranges);	if (!ranges->found_vga && found_vga) {		struct pci_bus *b;		ranges->found_vga = 1;		/* Propogate presence of the VGA to upstream bridges */		for (b = bus; b->parent; b = b->parent) {#if 0			/* ? Do we actually need to enable PF memory? */			b->resource[2]->start = 0;#endif			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);		b->resource[0]->start = ranges->io_start = ranges->io_end;		b->resource[1]->start = ranges->mem_start = ranges->mem_end;		pbus_assign_resources(b, ranges);		b->resource[0]->end = ranges->io_end - 1;		b->resource[1]->end = ranges->mem_end - 1;		pci_setup_bridge(b);	}}void __initpci_assign_unassigned_resources(void){	struct pbus_set_ranges_data ranges;	struct list_head *ln;	struct pci_dev *dev;	for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next) {		struct pci_bus *b = pci_bus_b(ln);		ranges.io_start = b->resource[0]->start + PCIBIOS_MIN_IO;		ranges.mem_start = b->resource[1]->start + PCIBIOS_MIN_MEM;		ranges.io_end = ranges.io_start;		ranges.mem_end = ranges.mem_start;		ranges.found_vga = 0;		pbus_assign_resources(b, &ranges);	}	pci_for_each_dev(dev) {		pdev_enable_device(dev);	}}/* Check whether the bridge supports I/O forwarding.   If not, its I/O base/limit register must be   read-only and read as 0. */unsigned long __initpci_bridge_check_io(struct pci_dev *bridge){	u16 io;	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)		return IORESOURCE_IO;	printk(KERN_WARNING "PCI: bridge %s does not support I/O forwarding!\n",				bridge->name);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av一二三| 欧美一二三四区在线| 欧美经典一区二区| 大美女一区二区三区| 国产精品三级在线观看| 成人激情免费视频| 亚洲综合色噜噜狠狠| 欧美喷潮久久久xxxxx| 蜜臀国产一区二区三区在线播放| 制服丝袜日韩国产| 久久99精品久久久久久| 国产亚洲短视频| 99久久免费精品高清特色大片| 亚洲欧美激情插| 欧美一区二区三区视频在线| 国产一区欧美日韩| 最新久久zyz资源站| 欧美日韩国产综合久久| 韩国女主播成人在线| 18欧美乱大交hd1984| 欧美日韩大陆在线| 国产成人在线观看免费网站| 亚洲激情六月丁香| 欧美一卡2卡3卡4卡| 成人福利在线看| 日韩av不卡在线观看| 国产精品美女视频| 欧美日本一区二区三区| 国产精品亚洲а∨天堂免在线| 夜夜嗨av一区二区三区中文字幕| 色综合久久综合网97色综合 | 99精品视频在线播放观看| 日韩三级免费观看| 国产麻豆成人精品| 亚洲一区自拍偷拍| 久久一区二区三区四区| 91麻豆免费观看| 日韩av网站免费在线| 国产精品九色蝌蚪自拍| 91精品欧美福利在线观看| 成人污污视频在线观看| 美女国产一区二区| 一区二区欧美国产| 中文字幕在线不卡视频| 日韩视频一区二区三区| 日本乱人伦一区| 成人性生交大片免费| 奇米影视一区二区三区| 亚洲乱码国产乱码精品精98午夜 | 亚洲欧洲日韩一区二区三区| 欧美一级视频精品观看| 91麻豆免费在线观看| 国产成人综合视频| 久久国产精品露脸对白| 亚洲成人免费av| 亚洲人妖av一区二区| 国产亚洲精品aa午夜观看| 欧美变态tickling挠脚心| 欧美日韩一区三区四区| 91亚洲精品一区二区乱码| 国产成人精品免费一区二区| 毛片一区二区三区| 日韩精品三区四区| 亚洲午夜国产一区99re久久| 亚洲私人影院在线观看| 国产三级三级三级精品8ⅰ区| 日韩久久久精品| 91精品啪在线观看国产60岁| 欧美日韩成人在线一区| 91久久国产综合久久| 91亚洲国产成人精品一区二区三| 国产麻豆视频一区二区| 久久国内精品自在自线400部| 日一区二区三区| 日韩在线观看一区二区| 亚洲第一福利一区| 三级欧美韩日大片在线看| 日韩av一二三| 精品一区二区三区免费播放| 美国欧美日韩国产在线播放| 精品一区二区三区在线观看| 久久99精品久久久久| 国产在线看一区| 国产一区二区三区日韩 | 青青草原综合久久大伊人精品优势| 亚洲国产欧美日韩另类综合| 亚洲午夜久久久久久久久电影院 | 日本一区二区视频在线| 欧美高清一级片在线观看| 国产欧美一区二区三区鸳鸯浴| 日本一区二区综合亚洲| 18成人在线观看| 亚洲成a人片在线观看中文| 亚洲午夜影视影院在线观看| 日日夜夜一区二区| 激情av综合网| 国产传媒一区在线| 91蝌蚪porny| 欧美日韩另类国产亚洲欧美一级| 欧美日韩国产区一| 精品久久一区二区| 国产精品色呦呦| 亚洲永久精品国产| 免费在线看成人av| 懂色一区二区三区免费观看| 91在线精品秘密一区二区| 欧美亚一区二区| 精品国产精品网麻豆系列| 国产精品天美传媒| 香蕉成人伊视频在线观看| 美日韩一区二区三区| 从欧美一区二区三区| 欧美视频一区二区三区在线观看| 日韩欧美国产综合| 亚洲人精品一区| 精品一区二区三区免费视频| 99精品热视频| 91精品国产综合久久久久久漫画| 久久久蜜桃精品| 亚洲精品国产视频| 国产乱人伦精品一区二区在线观看| 91免费看`日韩一区二区| 欧美va亚洲va在线观看蝴蝶网| 日韩一区日韩二区| 老司机午夜精品99久久| caoporen国产精品视频| 日韩区在线观看| 亚洲精品欧美综合四区| 黑人巨大精品欧美黑白配亚洲| 色偷偷成人一区二区三区91| 精品国产凹凸成av人网站| 亚洲乱码国产乱码精品精小说 | 久久精品亚洲麻豆av一区二区| 亚洲人成影院在线观看| 国精产品一区一区三区mba桃花 | 日韩欧美国产三级| 亚洲美女少妇撒尿| 国产成人丝袜美腿| 日韩视频国产视频| 午夜久久久久久久久| 99精品久久久久久| 国产婷婷色一区二区三区| 免费人成网站在线观看欧美高清| 91蜜桃网址入口| 国产精品麻豆一区二区| 精品一区二区三区在线观看国产| 欧美日韩国产精选| 亚洲图片欧美综合| 一本色道久久综合亚洲91| 国产精品无人区| 国产成a人亚洲| 久久精品一区二区三区不卡 | 国产精品久久久久久久久果冻传媒 | 91影视在线播放| 久久精品无码一区二区三区| 麻豆专区一区二区三区四区五区| 欧美色电影在线| 亚洲va欧美va人人爽| 91福利资源站| 亚洲午夜久久久久久久久电影网 | voyeur盗摄精品| 久久久精品日韩欧美| 激情小说欧美图片| 精品国免费一区二区三区| 蜜臀99久久精品久久久久久软件| 欧美日韩成人综合在线一区二区| 亚洲成人资源在线| 欧美日韩免费观看一区二区三区| 一区二区三区不卡在线观看| 色婷婷久久久综合中文字幕| 亚洲女爱视频在线| 91国偷自产一区二区三区观看| 一区二区三区中文字幕| 欧美最新大片在线看| 亚洲色图视频免费播放| 色婷婷综合久久久久中文 | 国产成人亚洲综合a∨婷婷 | 精品国产91洋老外米糕| 精品一区二区三区免费观看 | 欧美videos大乳护士334| 麻豆精品视频在线观看免费| 精品奇米国产一区二区三区| 国产一区不卡视频| 亚洲国产精品国自产拍av| 成人激情av网| 亚洲午夜在线视频| 精品国产乱码久久久久久免费| 国产一区二区调教| 中文字幕在线一区免费| 在线视频国内自拍亚洲视频| 亚洲va韩国va欧美va精品| 欧美一级黄色录像| 国产91在线|亚洲| 一区二区三区日韩欧美精品| 欧美绝品在线观看成人午夜影视| 久久精品国产亚洲a| 欧美国产日韩一二三区| 欧美最新大片在线看| 国内精品久久久久影院一蜜桃| 国产精品热久久久久夜色精品三区 |