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

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

?? lba_pci.c

?? MIZI Research, Inc.發(fā)布的嵌入式Linux內(nèi)核源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
#define LBA_CFG_TR4_ADDR_SETUP(d, addr) \    WRITE_REG32(((addr) & ~3), (d)->hba.base_addr + LBA_PCI_CFG_ADDR)#define LBA_CFG_ADDR_SETUP(d, addr) {				\    WRITE_REG32(((addr) & ~3), (d)->hba.base_addr + LBA_PCI_CFG_ADDR);	\    /*									\     * HPREVISIT:							\     *       --	Potentially could skip this once DMA bug fixed.		\     *									\     * Read address register to ensure that LBA is the bus master,	\     * which implies that DMA traffic has stopped when DMA arb is off.	\     */									\    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);		\}#define LBA_CFG_RESTORE(d, base) {					\    /*									\     * Restore status control register (turn off clear enable).		\     */									\    WRITE_REG32(status_control, base + LBA_STAT_CTL);			\    /*									\     * Restore error config register (turn off smart mode).		\     */									\    WRITE_REG32(error_config, base + LBA_ERROR_CONFIG);			\    if (LBA_DMA_DURING_CFG_DISABLED(d)) {				\	/*								\	 * Restore arb mask register (reenables DMA arbitration).	\	 */								\	WRITE_REG32(arb_mask, base + LBA_ARB_MASK);			\    }									\}static unsigned intlba_rd_cfg( struct lba_device *d, u32 tok, u8 reg, u32 size){	u32 data = ~0;	int error = 0;	u32 arb_mask = 0;	/* used by LBA_CFG_SETUP/RESTORE */	u32 error_config = 0;	/* used by LBA_CFG_SETUP/RESTORE */	u32 status_control = 0;	/* used by LBA_CFG_SETUP/RESTORE */	ASSERT((size == sizeof(u8)) ||		(size == sizeof(u16)) ||		(size == sizeof(u32)));	if ((size != sizeof(u8)) &&		(size != sizeof(u16)) &&		(size != sizeof(u32))) {		return(data);	}	LBA_CFG_SETUP(d, tok);	LBA_CFG_PROBE(d, tok);	LBA_CFG_MASTER_ABORT_CHECK(d, d->hba.base_addr, tok, error);	if (!error) {		LBA_CFG_ADDR_SETUP(d, tok | reg);		switch (size) {		case sizeof(u8):			data = (u32) READ_REG8(d->hba.base_addr + LBA_PCI_CFG_DATA + (reg & 3));			break;		case sizeof(u16):			data = (u32) READ_REG16(d->hba.base_addr + LBA_PCI_CFG_DATA + (reg & 2));			break;		case sizeof(u32):			data = READ_REG32(d->hba.base_addr + LBA_PCI_CFG_DATA);			break;		default:			break; /* leave data as -1 */		}	}	LBA_CFG_RESTORE(d, d->hba.base_addr);	return(data);}#define LBA_CFG_RD(size, mask) \static int lba_cfg_read##size (struct pci_dev *dev, int pos, u##size *data) \{ \	struct lba_device *d = LBA_DEV(dev->bus->sysdata); \	u32 local_bus = (dev->bus->parent == NULL) ? 0 : dev->bus->secondary; \	u32 tok = LBA_CFG_TOK(local_bus,dev->devfn); \ \	if ((!LBA_TR4PLUS(d)) && (!LBA_SKIP_PROBE(d))) { \		/* original - Generate config cycle on broken elroy \		  with risk we will miss PCI bus errors. */ \		*data = (u##size) lba_rd_cfg(d, tok, pos, sizeof(u##size)); \		DBG_CFG(KERN_DEBUG "%s(%s+%2x) -> 0x%x (a)\n", __FUNCTION__, dev->slot_name, pos, *data); \		return(*data == (u##size) -1); \	} \ \	if (LBA_SKIP_PROBE(d) && (!lba_device_present(dev->bus->secondary, dev->devfn, d))) \	{ \		DBG_CFG(KERN_DEBUG "%s(%s+%2x) -> -1 (b)\n", __FUNCTION__, dev->slot_name, pos, *data); \		/* either don't want to look or know device isn't present. */ \		*data = (u##size) -1; \		return(0); \	} \ \	/* Basic Algorithm \	** Should only get here on fully working LBA rev. \	** This is how simple the code should have been. \	*/ \	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos); \	*data = READ_REG##size(d->hba.base_addr + LBA_PCI_CFG_DATA + (pos & mask));\	DBG_CFG(KERN_DEBUG "%s(%s+%2x) -> 0x%x (c)\n", __FUNCTION__, dev->slot_name, pos, *data);\	return(*data == (u##size) -1); \}LBA_CFG_RD( 8, 3) LBA_CFG_RD(16, 2) LBA_CFG_RD(32, 0) static voidlba_wr_cfg( struct lba_device *d, u32 tok, u8 reg, u32 data, u32 size){	int error = 0;	u32 arb_mask = 0;	u32 error_config = 0;	u32 status_control = 0;	ASSERT((size == sizeof(u8)) ||		(size == sizeof(u16)) ||		(size == sizeof(u32)));	if ((size != sizeof(u8)) &&		(size != sizeof(u16)) &&		(size != sizeof(u32))) {			return;	}	LBA_CFG_SETUP(d, tok);	LBA_CFG_ADDR_SETUP(d, tok | reg);	switch (size) {	case sizeof(u8):		WRITE_REG8((u8) data, d->hba.base_addr + LBA_PCI_CFG_DATA + (reg&3));		break;	case sizeof(u16):		WRITE_REG16((u8) data, d->hba.base_addr + LBA_PCI_CFG_DATA +(reg&2));		break;	case sizeof(u32):		WRITE_REG32(data, d->hba.base_addr + LBA_PCI_CFG_DATA);		break;	default:		break;	}	LBA_CFG_MASTER_ABORT_CHECK(d, d->hba.base_addr, tok, error);	LBA_CFG_RESTORE(d, d->hba.base_addr);}/* * LBA 4.0 config write code implements non-postable semantics * by doing a read of CONFIG ADDR after the write. */#define LBA_CFG_WR(size, mask) \static int lba_cfg_write##size (struct pci_dev *dev, int pos, u##size data) \{ \	struct lba_device *d = LBA_DEV(dev->bus->sysdata); \	u32 local_bus = (dev->bus->parent == NULL) ? 0 : dev->bus->secondary; \	u32 tok = LBA_CFG_TOK(local_bus,dev->devfn); \ \ 	ASSERT((tok & 0xff) == 0); \	ASSERT(pos < 0x100); \ \	if ((!LBA_TR4PLUS(d)) && (!LBA_SKIP_PROBE(d))) { \		/* Original Workaround */ \		lba_wr_cfg(d, tok, pos, (u32) data, sizeof(u##size)); \		DBG_CFG(KERN_DEBUG "%s(%s+%2x) = 0x%x (a)\n", __FUNCTION__, dev->slot_name, pos, data); \		return 0; \	} \ \	if (LBA_SKIP_PROBE(d) && (!lba_device_present(dev->bus->secondary, dev->devfn, d))) { \		DBG_CFG(KERN_DEBUG "%s(%s+%2x) = 0x%x (b)\n", __FUNCTION__, dev->slot_name, pos, data); \		return 1; /* New Workaround */ \	} \ \	DBG_CFG(KERN_DEBUG "%s(%s+%2x) = 0x%x (c)\n", __FUNCTION__, dev->slot_name, pos, data); \	/* Basic Algorithm */ \	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos); \	WRITE_REG##size(data, d->hba.base_addr + LBA_PCI_CFG_DATA + (pos & mask)); \	lba_t32 = READ_REG32(d->hba.base_addr + LBA_PCI_CFG_ADDR); \	return 0; \}LBA_CFG_WR( 8, 3) LBA_CFG_WR(16, 2) LBA_CFG_WR(32, 0) static struct pci_ops lba_cfg_ops = {        lba_cfg_read8, lba_cfg_read16, lba_cfg_read32,	lba_cfg_write8, lba_cfg_write16, lba_cfg_write32};static voidlba_bios_init(void){	DBG(KERN_DEBUG MODULE_NAME ": lba_bios_init\n");}#ifdef __LP64__/*** Determine if a device is already configured.** If so, reserve it resources.**** Read PCI cfg command register and see if I/O or MMIO is enabled.** PAT has to enable the devices it's using.**** Note: resources are fixed up before we try to claim them.*/static voidlba_claim_dev_resources(struct pci_dev *dev){	u16 cmd;	int i, srch_flags;	(void) lba_cfg_read16(dev, PCI_COMMAND, &cmd);	srch_flags  = (cmd & PCI_COMMAND_IO) ? IORESOURCE_IO : 0;	if (cmd & PCI_COMMAND_MEMORY)		srch_flags |= IORESOURCE_MEM;	if (!srch_flags)		return;	for (i = 0; i <= PCI_ROM_RESOURCE; i++) {		if (dev->resource[i].flags & srch_flags) {			pci_claim_resource(dev, i);			DBG("   claimed %s %d [%lx,%lx]/%x\n",				dev->slot_name, i,				dev->resource[i].start,				dev->resource[i].end,				(int) dev->resource[i].flags				);		}	}}#endif/*** The algorithm is generic code.** But it needs to access local data structures to get the IRQ base.** Could make this a "pci_fixup_irq(bus, region)" but not sure** it's worth it.**** Called by do_pci_scan_bus() immediately after each PCI bus is walked.** Resources aren't allocated until recursive buswalk below HBA is completed.*/static voidlba_fixup_bus(struct pci_bus *bus){	struct list_head *ln;        struct pci_dev *dev;	u16 fbb_enable = PCI_STATUS_FAST_BACK;	u16 status;	struct lba_device *ldev = LBA_DEV(bus->sysdata);#ifdef __LP64__	int i;#endif	DBG("lba_fixup_bus(0x%p) bus %d sysdata 0x%p\n",				bus, bus->secondary, bus->sysdata);	/*	** Properly Setup MMIO resources for this bus.	** pci_alloc_primary_bus() mangles this.	*/	if (NULL == bus->self) {		int err;		DBG("lba_fixup_bus() %s [%lx/%lx]/%x\n",			ldev->hba.io_space.name,			ldev->hba.io_space.start,			ldev->hba.io_space.end,			(int) ldev->hba.io_space.flags);		DBG("lba_fixup_bus() %s [%lx/%lx]/%x\n",			ldev->hba.mem_space.name,			ldev->hba.mem_space.start,			ldev->hba.mem_space.end,			(int) ldev->hba.mem_space.flags);		err = request_resource(&ioport_resource, &(ldev->hba.io_space));		if (err < 0) {			BUG();			lba_dump_res(&ioport_resource, 2);		}		err = request_resource(&iomem_resource, &(ldev->hba.mem_space));		if (err < 0) {			BUG();			lba_dump_res(&iomem_resource, 2);		}		bus->resource[0] = &(ldev->hba.io_space);		bus->resource[1] = &(ldev->hba.mem_space);	}	list_for_each(ln, &bus->devices) {		dev = pci_dev_b(ln);#ifdef __LP64__		/*		** 0-5 are the "standard PCI regions"		** (see comments near PCI_NUM_RESOURCES in include/linux/pci.h)		*/		for (i = 0; i <= PCI_ROM_RESOURCE; i++) {			struct resource *res = &(dev->resource[i]);			if (res->flags & IORESOURCE_MEM) {				/* "Globalize" PCI address */				res->start |= ldev->lmmio_base;				res->end   |= ldev->lmmio_base;			}		}#endif		/*		** If one device does not support FBB transfers,		** No one on the bus can be allowed to use them.		*/		(void) lba_cfg_read16(dev, PCI_STATUS, &status);		fbb_enable &= status;#ifdef __LP64__		if (pdc_pat) {			/* Claim resources for PDC's devices */			lba_claim_dev_resources(dev);		}#endif	/* __LP64__ */                /*		** P2PB's have no IRQs. ignore them.		*/		if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)			continue;		/* Adjust INTERRUPT_LINE for this dev */		iosapic_fixup_irq(LBA_DEV(bus->sysdata)->iosapic_obj, dev);	}#if 0/* FIXME/REVISIT - finish figuring out to set FBB on both** pbus_set_ranges() clobbers PCI_BRIDGE_CONTROL.** Can't fixup here anyway....garr...*/	if (fbb_enable) {		if (bus->self) {			u8 control;			/* enable on PPB */			(void) lba_cfg_read8(bus->self, PCI_BRIDGE_CONTROL, &control);			(void) lba_cfg_write8(bus->self, PCI_BRIDGE_CONTROL, control | PCI_STATUS_FAST_BACK);		} else {			/* enable on LBA */		}		fbb_enable = PCI_COMMAND_FAST_BACK;	}	/* Lastly enable FBB/PERR/SERR on all devices too */	list_for_each(ln, &bus->devices) {		(void) lba_cfg_read16(dev, PCI_COMMAND, &status);		status |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR | fbb_enable;		(void) lba_cfg_write16(dev, PCI_COMMAND, status);	}#endif}struct pci_bios_ops lba_bios_ops = {	lba_bios_init,	lba_fixup_bus  /* void lba_fixup_bus(struct pci_bus *bus) */};/*********************************************************** LBA Sprockets "I/O Port" Space Accessor Functions**** This set of accessor functions is intended for use with** "legacy firmware" (ie Sprockets on Allegro/Forte boxes).**** Many PCI devices don't require use of I/O port space (eg Tulip,** NCR720) since they export the same registers to both MMIO and** I/O port space. In general I/O port space is slower than** MMIO since drivers are designed so PIO writes can be posted.**********************************************************/#define LBA_PORT_IN(size, mask) \static u##size lba_astro_in##size (struct pci_hba_data *d, u16 addr) \{ \	u##size t; \	ASSERT(bus != NULL); \	DBG_PORT(KERN_DEBUG "%s(0x%p, 0x%x) ->", __FUNCTION__, bus, addr); \	t = READ_REG##size(LBA_ASTRO_PORT_BASE + addr); \	DBG_PORT(" 0x%x\n", t); \	return (t); \}LBA_PORT_IN( 8, 3)LBA_PORT_IN(16, 2)LBA_PORT_IN(32, 0)/*** BUG X4107:  Ordering broken - DMA RD return can bypass PIO WR**** Fixed in Elroy 2.2. The READ_U32(..., LBA_FUNC_ID) below is** guarantee non-postable completion semantics - not avoid X4107.** The READ_U32 only guarantees the write data gets to elroy but** out to the PCI bus. We can't read stuff from I/O port space** since we don't know what has side-effects. Attempting to read** from configuration space would be suicidal given the number of** bugs in that elroy functionality.****      Description:**          DMA read results can improperly pass PIO writes (X4107).  The**          result of this bug is that if a processor modifies a location in**          memory after having issued PIO writes, the PIO writes are not**          guaranteed to be completed before a PCI device is allowed to see**          the modified data in a DMA read.****          Note that IKE bug X3719 in TR1 IKEs will result in the same**          symptom.****      Workaround:**          The workaround for this bug is to always follow a PIO write with**          a PIO read to the same bus before starting DMA on that PCI bus.***/#define LBA_PORT_OUT(size, mask) \static void lba_astro_out##size (struct pci_hba_data *d, u16 addr, u##size val) \{ \	ASSERT(bus != NULL); \

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲愉拍一区二区| 精品剧情在线观看| 中文字幕va一区二区三区| 日韩高清一级片| 欧美日韩在线电影| 亚洲一区二区黄色| 色哟哟在线观看一区二区三区| 国产三级欧美三级日产三级99 | 亚洲国产日韩一区二区| 91免费观看国产| 亚洲精品综合在线| 在线观看日韩国产| 亚洲bdsm女犯bdsm网站| 欧美精品99久久久**| 蜜臀a∨国产成人精品| 精品卡一卡二卡三卡四在线| 国产麻豆一精品一av一免费| 久久久99精品免费观看| 成人av资源网站| 亚洲欧美色图小说| 欧美日韩情趣电影| 久久99热这里只有精品| 26uuu精品一区二区| 国产超碰在线一区| 一区二区在线看| 精品视频在线视频| 老汉av免费一区二区三区| 久久亚洲综合av| 91在线观看成人| 亚洲图片欧美色图| 精品女同一区二区| 福利视频网站一区二区三区| 亚洲欧美日韩国产另类专区| 欧美日韩一级片网站| 毛片不卡一区二区| 国产精品激情偷乱一区二区∴| 91福利视频久久久久| 免费高清成人在线| 国产亚洲一本大道中文在线| 国产美女视频一区| 日韩美女视频一区二区| 欧美绝品在线观看成人午夜影视| 激情综合网天天干| 亚洲精品网站在线观看| 欧美精品久久99| 成人黄色国产精品网站大全在线免费观看 | 欧美精品视频www在线观看| 九九精品视频在线看| 亚洲色图20p| 欧美成人a在线| 色婷婷综合久久久中文一区二区 | 99久久婷婷国产| 日韩电影免费在线看| 国产精品免费久久| 欧美一区二区三区免费视频| 成人激情免费网站| 日本v片在线高清不卡在线观看| 欧美国产精品中文字幕| 欧美日韩卡一卡二| 91在线无精精品入口| 日韩在线观看一区二区| 国产精品久久久久久久久免费丝袜 | 麻豆91在线观看| 亚洲日本一区二区| 精品久久久久久久人人人人传媒| 91国模大尺度私拍在线视频| 国产乱对白刺激视频不卡 | 亚洲高清中文字幕| 中文字幕欧美国产| 欧美一区二区三区四区视频| 成人av网在线| 国产乱一区二区| 奇米综合一区二区三区精品视频| 亚洲欧美日韩一区| 国产精品日日摸夜夜摸av| 欧美大胆一级视频| 欧美精品第一页| 欧美日韩国产成人在线免费| 91浏览器在线视频| 99久久精品国产一区二区三区| 狠狠色狠狠色综合系列| 日本视频中文字幕一区二区三区| 亚洲一区二区在线观看视频| 国产精品久久久久久久久免费樱桃 | 69久久99精品久久久久婷婷| 在线免费精品视频| 成人高清免费观看| 久久99日本精品| 午夜成人在线视频| 亚洲成人av福利| 性做久久久久久免费观看欧美| 亚洲精品乱码久久久久久久久| 亚洲精品日韩专区silk| 亚洲猫色日本管| 一区二区三区视频在线看| 亚洲特黄一级片| 一区二区三区国产精品| 亚洲成人一二三| 日本欧美一区二区在线观看| 蜜臀精品久久久久久蜜臀| 爽好久久久欧美精品| 免费在线观看一区| 天涯成人国产亚洲精品一区av| 日日欢夜夜爽一区| 免费在线看一区| 国产福利视频一区二区三区| 国产不卡在线视频| 99久久免费精品高清特色大片| 91丨九色porny丨蝌蚪| 在线免费不卡视频| 欧美一区二区三区视频免费| 亚洲精品一线二线三线无人区| 正在播放亚洲一区| 欧美一二三四区在线| 精品日产卡一卡二卡麻豆| 日本一区二区免费在线观看视频| 国产精品国产三级国产aⅴ原创| 一区二区三区日韩| 亚洲激情在线播放| 日韩av网站在线观看| 国产专区欧美精品| 91小视频在线观看| 在线播放国产精品二区一二区四区 | 日韩一卡二卡三卡国产欧美| 日韩精品一区二区在线| 欧美极品另类videosde| 亚洲精品成人悠悠色影视| 日本不卡在线视频| 国产成人自拍高清视频在线免费播放| 成人激情黄色小说| 正在播放亚洲一区| 国产精品午夜电影| 日韩国产欧美在线播放| 国产精品一级片| 99精品国产热久久91蜜凸| 欧美一区二区三区喷汁尤物| 国产精品私房写真福利视频| 日韩精品一区第一页| 国产成人av电影在线| 欧美性感一区二区三区| 久久嫩草精品久久久精品| 亚洲狠狠丁香婷婷综合久久久| 麻豆免费看一区二区三区| heyzo一本久久综合| 欧美性一二三区| 国产精品情趣视频| 蜜桃av一区二区在线观看| 日本丶国产丶欧美色综合| 久久久久97国产精华液好用吗| 一区二区三区免费在线观看| 国产酒店精品激情| 91精品久久久久久久91蜜桃| 日韩你懂的电影在线观看| 91精品国产手机| 亚洲国产日韩综合久久精品| 色一情一伦一子一伦一区| 国产免费观看久久| 国产69精品一区二区亚洲孕妇 | 日本电影亚洲天堂一区| 最新欧美精品一区二区三区| 国产999精品久久| 国产日韩三级在线| 国产激情视频一区二区在线观看| 欧美不卡视频一区| 精品一区中文字幕| 精品国产伦一区二区三区观看体验| 三级一区在线视频先锋| 在线播放中文字幕一区| 日韩av成人高清| 91精品婷婷国产综合久久性色| 天天综合日日夜夜精品| 欧美精品亚洲二区| 日韩av电影天堂| 2欧美一区二区三区在线观看视频| 美女脱光内衣内裤视频久久影院| 日韩女优电影在线观看| 国产精品一线二线三线| 久久久久久综合| 97精品国产97久久久久久久久久久久 | 亚洲免费观看视频| 在线一区二区视频| 日韩国产欧美一区二区三区| 欧美一级国产精品| 国产精品自拍av| 亚洲欧洲国产专区| 欧美午夜影院一区| 日韩电影一区二区三区四区| 91精品在线免费观看| 狠狠色狠狠色综合| |精品福利一区二区三区| 欧美性高清videossexo| 免费精品视频最新在线| 国产三级精品视频| 色成年激情久久综合| 日韩精品视频网| 久久免费看少妇高潮| av电影在线观看一区| 偷拍一区二区三区四区| 亚洲精品在线免费播放| 色先锋资源久久综合|