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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pci.c

?? 這個(gè)linux源代碼是很全面的~基本完整了~使用c編譯的~由于時(shí)間問題我沒有親自測試~但就算用來做參考資料也是非常好的
?? C
字號(hào):
/* *	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, unsigned long align){	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, align);		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;	}	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;/* FIXME: On older alphas we could use dense memory space	  to access prefetchable resources. */	ranges->prefetch_start -= hose->mem_space->start;	ranges->prefetch_end -= hose->mem_space->start;}intpcibios_enable_device(struct pci_dev *dev, int mask){	/* 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);}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区在线播放| 欧美视频中文字幕| 国产精品一区二区久久精品爱涩| 日韩精品视频网站| 三级在线观看一区二区| 亚洲一二三四久久| 亚洲一区二区成人在线观看| 亚洲高清免费观看高清完整版在线观看| 亚洲欧美经典视频| 一级做a爱片久久| 亚洲午夜三级在线| 午夜欧美视频在线观看| 丝袜脚交一区二区| 久久国产精品99精品国产| 精品综合免费视频观看| 国产一区二区调教| 成人丝袜18视频在线观看| av在线播放不卡| 色老头久久综合| 欧美日韩另类一区| 7777精品伊人久久久大香线蕉最新版| 欧美一区二区三区系列电影| 日韩一二三四区| 久久影院视频免费| 国产精品麻豆一区二区| 亚洲综合清纯丝袜自拍| 丝袜国产日韩另类美女| 国产一区二区在线看| 9i看片成人免费高清| 精品视频资源站| 欧美va亚洲va香蕉在线| 中文一区在线播放| 亚洲电影视频在线| 久久国产免费看| 99久久伊人久久99| 777奇米四色成人影色区| 久久久亚洲欧洲日产国码αv| 国产精品美日韩| 首页国产欧美日韩丝袜| 国产福利一区二区三区| 欧美在线视频不卡| 26uuu另类欧美| 亚洲欧美日韩国产综合| 日韩精品午夜视频| 成人国产精品免费观看视频| 欧美自拍偷拍午夜视频| 久久久久久免费网| 一级日本不卡的影视| 国产精品自拍av| 欧美三区免费完整视频在线观看| 精品91自产拍在线观看一区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 一区二区三区四区在线播放| 精品影院一区二区久久久| 色哟哟在线观看一区二区三区| 欧美一区二区三区四区在线观看 | 欧洲一区二区三区在线| 日韩免费视频线观看| 亚洲欧美另类图片小说| 激情图区综合网| 欧美色精品在线视频| 国产精品久久三| 久久精品久久久精品美女| 在线免费观看不卡av| 国产喷白浆一区二区三区| 日本在线播放一区二区三区| 91麻豆免费看| 国产欧美精品在线观看| 蜜臀av在线播放一区二区三区| 97se狠狠狠综合亚洲狠狠| 久久综合色播五月| 午夜精品久久久久久久| 99久久伊人精品| www成人在线观看| 日本v片在线高清不卡在线观看| 99re在线精品| 国产精品美女一区二区三区| 捆绑变态av一区二区三区 | 18涩涩午夜精品.www| 老司机精品视频导航| 欧美日韩国产综合草草| 亚洲欧美日韩在线| bt欧美亚洲午夜电影天堂| 亚洲精品在线观| 麻豆成人久久精品二区三区红| 欧美在线观看视频一区二区三区| 国产精品麻豆欧美日韩ww| 国产一区欧美二区| 2020国产精品自拍| 精品在线你懂的| 日韩欧美第一区| 日本不卡一区二区三区高清视频| 欧美吞精做爰啪啪高潮| 亚洲精品国产一区二区精华液 | 国产欧美一区二区精品婷婷| 日韩中文字幕一区二区三区| 欧洲一区二区三区在线| 亚洲欧洲99久久| 91丨九色丨尤物| 亚洲欧美日韩国产手机在线| 99国产精品久久久久久久久久| 中文av一区特黄| 波多野结衣视频一区| 国产精品国产三级国产aⅴ无密码| 国产成人激情av| 欧美国产日韩精品免费观看| 国产69精品久久99不卡| 欧美激情在线观看视频免费| 国产成人亚洲综合a∨婷婷| 国产欧美一区二区在线观看| 国产98色在线|日韩| 国产精品久久三| 色综合中文综合网| 国产精品久久久久久久浪潮网站 | 国产精品一二三区在线| 精品国产91久久久久久久妲己| 国内精品国产三级国产a久久| 欧美mv日韩mv| 国产精品一区二区男女羞羞无遮挡| 久久久久9999亚洲精品| 丁香婷婷综合网| 亚洲欧洲av一区二区三区久久| 99视频国产精品| 亚洲黄色免费网站| 在线电影欧美成精品| 久久超碰97中文字幕| 国产亚洲一区二区在线观看| www.欧美日韩国产在线| 亚洲最大成人综合| 欧美一区二区黄色| 国产美女av一区二区三区| 欧美精彩视频一区二区三区| 91污在线观看| 国内国产精品久久| 中文字幕一区二区不卡| 欧美日韩三级视频| 狠狠色狠狠色综合系列| 国产精品国产a级| 欧美手机在线视频| 免费在线观看一区| 国产精品欧美极品| 欧美亚洲日本国产| 国产一区二区毛片| 亚洲欧美色图小说| 日韩一级成人av| 成人在线视频一区| 亚洲国产精品久久久久婷婷884 | 成人美女视频在线观看| 亚洲午夜私人影院| 久久色在线观看| 色天天综合色天天久久| 日本不卡一二三区黄网| 国产欧美日韩不卡| 欧洲国内综合视频| 国产尤物一区二区在线| 亚洲人成在线观看一区二区| 成人在线综合网站| 日日摸夜夜添夜夜添国产精品 | 一区二区久久久久久| 日韩免费电影一区| 色哟哟欧美精品| 国内成人精品2018免费看| 一区二区不卡在线视频 午夜欧美不卡在| 日韩欧美一级特黄在线播放| 91免费版在线| 国产中文一区二区三区| 亚洲国产日产av| 中文字幕欧美一| 精品国产91九色蝌蚪| 欧美最猛黑人xxxxx猛交| 国产乱码精品1区2区3区| 亚洲成人av一区| 综合久久国产九一剧情麻豆| 精品美女一区二区| 欧美三级韩国三级日本一级| 成人av网址在线观看| 精品一区二区免费| 天堂精品中文字幕在线| 亚洲精品一二三区| 国产精品色婷婷久久58| 欧美大胆人体bbbb| 欧美绝品在线观看成人午夜影视| 99re66热这里只有精品3直播 | 日韩成人精品在线| 亚洲精品久久嫩草网站秘色| 国产精品热久久久久夜色精品三区| 日韩一级二级三级| 717成人午夜免费福利电影| 成人av网站在线观看免费| 极品少妇xxxx精品少妇偷拍 | 成人av在线播放网站| 国产一区亚洲一区| 玖玖九九国产精品| 日韩一区精品视频| 亚洲18色成人| 亚洲成人精品一区二区| 一二三四社区欧美黄| 亚洲桃色在线一区| 亚洲欧洲日韩av| 最新久久zyz资源站|