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

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

?? pci.c

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? 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一区二区三区免费野_久草精品视频
日韩**一区毛片| 亚洲欧美一区二区在线观看| 欧美在线色视频| 欧美最猛黑人xxxxx猛交| 国产精品九色蝌蚪自拍| 中文字幕亚洲成人| 亚洲欧洲精品一区二区三区不卡| 国产精品女同一区二区三区| 国产精品久久久久9999吃药| 国产精品久久久久久久午夜片| 97久久精品人人爽人人爽蜜臀| 国产sm精品调教视频网站| www.一区二区| 欧美日韩视频在线观看一区二区三区 | 亚洲欧美日韩久久精品| 高清视频一区二区| 亚洲一区二区三区中文字幕| 天堂午夜影视日韩欧美一区二区| 日本午夜精品视频在线观看| 国产成人一区在线| 色综合久久中文字幕| 日韩欧美高清dvd碟片| 久久先锋资源网| 亚洲妇女屁股眼交7| 久久99久久精品欧美| 99在线精品观看| 精品日本一线二线三线不卡| 中文字幕久久午夜不卡| 偷窥少妇高潮呻吟av久久免费| 亚洲精品伦理在线| 欧美蜜桃一区二区三区 | 国产一区二区91| 欧美色男人天堂| 欧美在线观看你懂的| 久久综合久久鬼色| 亚洲国产精品久久人人爱蜜臀| 国产毛片一区二区| 欧美一区二区视频在线观看| 1000精品久久久久久久久| 久久福利视频一区二区| 色8久久精品久久久久久蜜| 成人精品免费看| 久久综合国产精品| 美腿丝袜亚洲综合| 欧美精品乱码久久久久久| 亚洲视频一区在线| 97se狠狠狠综合亚洲狠狠| 精品国产乱码久久久久久夜甘婷婷 | 久久国产成人午夜av影院| 色哟哟在线观看一区二区三区| 日本一区二区在线不卡| 国产精品综合二区| 欧美精品一区二区三区在线播放| 天天色天天操综合| 日韩午夜在线观看视频| 日本在线不卡视频一二三区| 欧美色偷偷大香| 一区二区高清在线| 欧美日韩亚洲综合| 日韩不卡手机在线v区| 欧美一区二区啪啪| 久久精品国产亚洲a| 欧美精品一级二级三级| 午夜精品久久久久久久久| 欧美一区二区网站| 国产一区二区久久| 久久久91精品国产一区二区三区| 成人欧美一区二区三区1314 | 日日欢夜夜爽一区| 日韩亚洲欧美高清| 国产成人在线电影| 亚洲色图19p| 日韩一区二区在线观看视频| 国产成人夜色高潮福利影视| 亚洲欧美偷拍卡通变态| 91精品一区二区三区在线观看| 免费观看久久久4p| 亚洲色图丝袜美腿| 日韩精品影音先锋| av午夜精品一区二区三区| 亚洲一区二区美女| 欧美韩国一区二区| 日韩亚洲欧美一区| 久久久91精品国产一区二区三区| 日本va欧美va精品发布| 中文成人综合网| 日韩一区二区影院| 91色porny| 国产精品66部| 成人动漫视频在线| 亚洲靠逼com| 国产午夜亚洲精品午夜鲁丝片| 在线观看日韩精品| 成人视屏免费看| 国内精品第一页| 奇米影视一区二区三区| 欧美日韩三级在线| 亚洲另类中文字| 欧美日韩精品三区| 色视频成人在线观看免| 激情六月婷婷久久| 另类人妖一区二区av| 天堂影院一区二区| 日本人妖一区二区| 日日摸夜夜添夜夜添精品视频| 亚洲一区二区在线免费观看视频| 国产精品不卡在线观看| 欧美成人一区二区三区| 日韩精品一区二区三区视频在线观看| 欧美亚洲图片小说| 欧美在线播放高清精品| 蜜桃av一区二区在线观看| 日韩精品亚洲一区| 久久精品国产999大香线蕉| 久热成人在线视频| 国产一区二区福利| 成人白浆超碰人人人人| av中文字幕在线不卡| 91久久国产综合久久| 在线观看一区日韩| 日韩欧美在线网站| 国产视频一区二区在线| 国产精品久久久久久久岛一牛影视 | 日韩成人精品视频| 久久99国内精品| 国产制服丝袜一区| 色婷婷精品大在线视频| 欧美一区二区视频网站| 中文字幕乱码亚洲精品一区| 在线播放/欧美激情| 精品88久久久久88久久久| 亚洲天堂精品视频| 精品一区二区在线观看| 成人夜色视频网站在线观看| 91福利在线免费观看| 国产日韩欧美制服另类| 日韩中文字幕不卡| 成人免费看的视频| 欧美一区二区三区免费观看视频| 国产精品色眯眯| 国内精品免费**视频| 国产精品一级在线| 精品视频免费在线| 中文字幕巨乱亚洲| 国产精品亚洲а∨天堂免在线| 欧美亚洲一区三区| 亚洲女人的天堂| 懂色av中文一区二区三区| 精品免费99久久| 日韩激情一二三区| 色综合视频在线观看| 欧美国产丝袜视频| 男女性色大片免费观看一区二区 | 91成人免费在线视频| 一本大道久久a久久综合 | 亚洲精品国产无套在线观| 国产成人午夜99999| 精品国产精品一区二区夜夜嗨| 午夜精品影院在线观看| 欧美性色欧美a在线播放| 中文字幕一区视频| 成人美女在线视频| 欧美一区二区久久| 国产午夜精品一区二区| 久久国产三级精品| 欧美精品三级日韩久久| 天堂va蜜桃一区二区三区漫画版| 在线国产电影不卡| 日本欧美在线观看| 91麻豆精品国产91久久久久久久久| 亚洲r级在线视频| 亚洲第一电影网| 3d动漫精品啪啪| 国产美女在线精品| 又紧又大又爽精品一区二区| 色先锋aa成人| 中文字幕中文字幕一区二区| 丁香另类激情小说| 国产精品久久久久久久久久久免费看 | 另类综合日韩欧美亚洲| 久久综合九色综合欧美亚洲| 欧美日韩一区二区三区视频| 欧美综合一区二区| 亚洲第一搞黄网站| 久久久久久久久久久久久女国产乱 | 懂色av中文字幕一区二区三区| 久久精品久久精品| 亚洲国产欧美日韩另类综合| 伊人婷婷欧美激情| 日本一区二区三区在线不卡| 国产欧美一区二区精品忘忧草| 久久综合一区二区| 亚洲午夜羞羞片| 亚洲国产一二三| 制服丝袜中文字幕亚洲| 石原莉奈一区二区三区在线观看| 成人av在线网| 国产日韩三级在线| 日韩三级在线观看| 日本高清免费不卡视频|