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

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

?? lba_pci.c

?? MIZI Research, Inc.發布的嵌入式Linux內核源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/***  PCI Lower Bus Adapter (LBA) manager****	(c) Copyright 1999,2000 Grant Grundler**	(c) Copyright 1999,2000 Hewlett-Packard Company****	This program is free software; you can redistribute it and/or modify**	it under the terms of the GNU General Public License as published by**      the Free Software Foundation; either version 2 of the License, or**      (at your option) any later version.****** This module primarily provides access to PCI bus (config/IOport** spaces) on platforms with an SBA/LBA chipset. A/B/C/J/L/N-class** with 4 digit model numbers - eg C3000 (and A400...sigh).**** LBA driver isn't as simple as the Dino driver because:**   (a) this chip has substantial bug fixes between revisions**       (Only one Dino bug has a software workaround :^(  )**   (b) has more options which we don't (yet) support (DMA hints, OLARD)**   (c) IRQ support lives in the I/O SAPIC driver (not with PCI driver)**   (d) play nicely with both PAT and "Legacy" PA-RISC firmware (PDC).**       (dino only deals with "Legacy" PDC)**** LBA driver passes the I/O SAPIC HPA to the I/O SAPIC driver.** (I/O SAPIC is integratd in the LBA chip).**** FIXME: Add support to SBA and LBA drivers for DMA hint sets** FIXME: Add support for PCI card hot-plug (OLARD).*/#include <linux/delay.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/spinlock.h>#include <linux/init.h>		/* for __init and __devinit */#include <linux/pci.h>#include <linux/ioport.h>#include <linux/slab.h>#include <linux/smp_lock.h>#include <asm/byteorder.h>#include <asm/irq.h>		/* for struct irq_region support */#include <asm/pdc.h>#include <asm/pdcpat.h>#include <asm/page.h>#include <asm/segment.h>#include <asm/system.h>#include <asm/hardware.h>	/* for register_driver() stuff */#include <asm/iosapic.h>	/* for iosapic_register() */#include <asm/gsc.h>		/* gsc_read/write stuff */#ifndef TRUE#define TRUE (1 == 1)#define FALSE (1 == 0)#endif#undef DEBUG_LBA	/* general stuff */#undef DEBUG_LBA_PORT	/* debug I/O Port access */#undef DEBUG_LBA_CFG	/* debug Config Space Access (ie PCI Bus walk) */#undef DEBUG_LBA_PAT	/* debug PCI Resource Mgt code - PDC PAT only */#ifdef DEBUG_LBA#define DBG(x...)	printk(x)#else#define DBG(x...)#endif#ifdef DEBUG_LBA_PORT#define DBG_PORT(x...)	printk(x)#else#define DBG_PORT(x...)#endif#ifdef DEBUG_LBA_CFG#define DBG_CFG(x...)	printk(x)#else#define DBG_CFG(x...)#endif#ifdef DEBUG_LBA_PAT#define DBG_PAT(x...)	printk(x)#else#define DBG_PAT(x...)#endif/*** Config accessor functions only pass in the 8-bit bus number and not** the 8-bit "PCI Segment" number. Each LBA will be assigned a PCI bus** number based on what firmware wrote into the scratch register.**** The "secondary" bus number is set to this before calling** pci_register_ops(). If any PPB's are present, the scan will** discover them and update the "secondary" and "subordinate"** fields in the pci_bus structure.**** Changes in the configuration *may* result in a different** bus number for each LBA depending on what firmware does.*/#define MODULE_NAME "lba"static int lba_driver_callback(struct hp_device *, struct pa_iodc_driver *);static struct pa_iodc_driver lba_drivers_for[]= {   {HPHW_BRIDGE, 0x782, 0x0, 0xa, 0,0,		DRIVER_CHECK_HVERSION + 		DRIVER_CHECK_SVERSION + DRIVER_CHECK_HWTYPE,                MODULE_NAME, "tbd", (void *) lba_driver_callback},   {0,0,0,0,0,0,   0,   (char *) NULL, (char *) NULL, (void *) NULL}};#define LBA_FUNC_ID	0x0000	/* function id */#define LBA_FCLASS	0x0008	/* function class, bist, header, rev... */#define LBA_CAPABLE	0x0030	/* capabilities register */#define LBA_PCI_CFG_ADDR	0x0040	/* poke CFG address here */#define LBA_PCI_CFG_DATA	0x0048	/* read or write data here */#define LBA_PMC_MTLT	0x0050	/* Firmware sets this - read only. */#define LBA_FW_SCRATCH	0x0058	/* Firmware writes the PCI bus number here. */#define LBA_ERROR_ADDR	0x0070	/* On error, address gets logged here */#define LBA_ARB_MASK	0x0080	/* bit 0 enable arbitration. PAT/PDC enables */#define LBA_ARB_PRI	0x0088	/* firmware sets this. */#define LBA_ARB_MODE	0x0090	/* firmware sets this. */#define LBA_ARB_MTLT	0x0098	/* firmware sets this. */#define LBA_MOD_ID	0x0100	/* Module ID. PDC_PAT_CELL reports 4 */#define LBA_STAT_CTL	0x0108	/* Status & Control */#define   HF_ENABLE	0x40	/*    enable HF mode (default is -1 mode) */#define LBA_LMMIO_BASE	0x0200	/* < 4GB I/O address range */#define LBA_LMMIO_MASK	0x0208#define LBA_GMMIO_BASE	0x0210	/* > 4GB I/O address range */#define LBA_GMMIO_MASK	0x0218#define LBA_WLMMIO_BASE	0x0220	/* All < 4GB ranges under the same *SBA* */#define LBA_WLMMIO_MASK	0x0228#define LBA_WGMMIO_BASE	0x0230	/* All > 4GB ranges under the same *SBA* */#define LBA_WGMMIO_MASK	0x0238#define LBA_IOS_BASE	0x0240	/* I/O port space for this LBA */#define LBA_IOS_MASK	0x0248#define LBA_ELMMIO_BASE	0x0250	/* Extra LMMIO range */#define LBA_ELMMIO_MASK	0x0258#define LBA_EIOS_BASE	0x0260	/* Extra I/O port space */#define LBA_EIOS_MASK	0x0268#define LBA_DMA_CTL	0x0278	/* firmware sets this *//* RESET: ignore DMA stuff until we can measure performance */#define LBA_IBASE	0x0300	/* DMA support */#define LBA_IMASK	0x0308#define LBA_HINT_CFG	0x0310#define LBA_HINT_BASE	0x0380	/* 14 registers at every 8 bytes. *//* ERROR regs are needed for config cycle kluges */#define LBA_ERROR_CONFIG 0x0680#define LBA_ERROR_STATUS 0x0688#define LBA_IOSAPIC_BASE	0x800 /* Offset of IRQ logic *//* non-postable I/O port space, densely packed */#ifdef __LP64__#define LBA_ASTRO_PORT_BASE	(0xfffffffffee00000UL)#else#define LBA_ASTRO_PORT_BASE	(0xfee00000UL)#endif/*** lba_device: Per instance Elroy data structure*/struct lba_device {	struct pci_hba_data hba;	spinlock_t	lba_lock;	void		*iosapic_obj;#ifdef __LP64__	unsigned long	lmmio_base;  /* PA_VIEW - fixup MEM addresses */	unsigned long	gmmio_base;  /* PA_VIEW - Not used (yet) */	unsigned long	iop_base;    /* PA_VIEW - for IO port accessor funcs */#endif	int		flags;       /* state/functionality enabled */	int		hw_rev;      /* HW revision of chip */};static u32 lba_t32;/*** lba "flags"*/#define LBA_FLAG_NO_DMA_DURING_CFG	0x01#define LBA_FLAG_SKIP_PROBE	0x10/* Tape Release 4 == hw_rev 5 */#define LBA_TR4PLUS(d)      ((d)->hw_rev > 0x4)#define LBA_DMA_DURING_CFG_DISABLED(d) ((d)->flags & LBA_FLAG_NO_DMA_DURING_CFG)#define LBA_SKIP_PROBE(d) ((d)->flags & LBA_FLAG_SKIP_PROBE)/* Looks nice and keeps the compiler happy */#define LBA_DEV(d) ((struct lba_device *) (d))/*** Only allow 8 subsidiary busses per LBA** Problem is the PCI bus numbering is globally shared.*/#define LBA_MAX_NUM_BUSES 8/************************************ * LBA register read and write support * * BE WARNED: register writes are posted. *  (ie follow writes which must reach HW with a read) */#define READ_U8(addr)  gsc_readb(addr)#define READ_U16(addr) gsc_readw((u16 *) (addr))#define READ_U32(addr) gsc_readl((u32 *) (addr))#define WRITE_U8(value, addr) gsc_writeb(value, addr)#define WRITE_U16(value, addr) gsc_writew(value, (u16 *) (addr))#define WRITE_U32(value, addr) gsc_writel(value, (u32 *) (addr))#define READ_REG8(addr)  gsc_readb(addr)#define READ_REG16(addr) le16_to_cpu(gsc_readw((u16 *) (addr)))#define READ_REG32(addr) le32_to_cpu(gsc_readl((u32 *) (addr)))#define WRITE_REG8(value, addr) gsc_writeb(value, addr)#define WRITE_REG16(value, addr) gsc_writew(cpu_to_le16(value), (u16 *) (addr))#define WRITE_REG32(value, addr) gsc_writel(cpu_to_le32(value), (u32 *) (addr))#define LBA_CFG_TOK(bus,dfn) ((u32) ((bus)<<16 | (dfn)<<8))#define LBA_CFG_BUS(tok)  ((u8) ((tok)>>16))#define LBA_CFG_DEV(tok)  ((u8) ((tok)>>11) & 0x1f)#define LBA_CFG_FUNC(tok) ((u8) ((tok)>>8 ) & 0x7)#ifdef DEBUG_LBA/* Extract LBA (Rope) number from HPA */#define LBA_NUM(x)    ((((uintptr_t) x) >> 13) & 0xf)#endif /* DEBUG_LBA */#ifdef __LP64__/* PDC_PAT */static  unsigned long pdc_result[32] __attribute__ ((aligned (8))) = {0,0,0,0};#endif/*** One time initialization to let the world know the LBA was found.** This is the only routine which is NOT static.** Must be called exactly once before pci_init().*/void __init lba_init(void){	register_driver(lba_drivers_for);}static voidlba_dump_res(struct resource *r, int d){	int i;	if (NULL == r)		return;	printk("(%p)", r->parent);	for (i = d; i ; --i) printk(" ");	printk("%p [%lx,%lx]/%x\n", r, r->start, r->end, (int) r->flags);	lba_dump_res(r->child, d+2);	lba_dump_res(r->sibling, d);}/*** LBA rev 2.0, 2.1, 2.2, and 3.0 bus walks require a complex** workaround for cfg cycles:**	-- preserve  LBA state**	-- LBA_FLAG_NO_DMA_DURING_CFG workaround**	-- turn on smart mode**	-- probe with config writes before doing config reads**	-- check ERROR_STATUS**	-- clear ERROR_STATUS**	-- restore LBA state**** The workaround is only used for device discovery.*/static intlba_device_present( u8 bus, u8 dfn, struct lba_device *d){	u8 first_bus = d->hba.hba_bus->secondary;	u8 last_sub_bus = d->hba.hba_bus->subordinate;#if 0/* FIXME - see below in this function */        u8 dev = PCI_SLOT(dfn);        u8 func = PCI_FUNC(dfn);#endif	ASSERT(bus >= first_bus);	ASSERT(bus <= last_sub_bus);	ASSERT((bus - first_bus) < LBA_MAX_NUM_BUSES);	if ((bus < first_bus) ||	    (bus > last_sub_bus) ||	    ((bus - first_bus) >= LBA_MAX_NUM_BUSES))	{	    /* devices that fall into any of these cases won't get claimed */	    return(FALSE);	}#if 0/*** FIXME: Need to implement code to fill the devices bitmap based** on contents of the local pci_bus tree "data base".** pci_register_ops() walks the bus for us and builds the tree.** For now, always do the config cycle.*/	bus -= first_bus;	return (((d->devices[bus][dev]) >> func) & 0x1);#else	return TRUE;#endif}#define LBA_CFG_SETUP(d, tok) {				\    /* Save contents of error config register.  */			\    error_config = READ_REG32(d->hba.base_addr + LBA_ERROR_CONFIG);		\\    /* Save contents of status control register.  */			\    status_control = READ_REG32(d->hba.base_addr + LBA_STAT_CTL);		\\    /* For LBA rev 2.0, 2.1, 2.2, and 3.0, we must disable DMA		\    ** arbitration for full bus walks.					\    */									\    if (LBA_DMA_DURING_CFG_DISABLED(d)) {				\	/* Save contents of arb mask register. */			\	arb_mask = READ_REG32(d->hba.base_addr + LBA_ARB_MASK);		\\	/*								\	 * Turn off all device arbitration bits (i.e. everything	\	 * except arbitration enable bit).				\	 */								\	WRITE_REG32(0x1, d->hba.base_addr + LBA_ARB_MASK);			\    }									\\    /*									\     * Set the smart mode bit so that master aborts don't cause		\     * LBA to go into PCI fatal mode (required).			\     */									\    WRITE_REG32(error_config | 0x20, d->hba.base_addr + LBA_ERROR_CONFIG);	\}#define LBA_CFG_PROBE(d, tok) {				\    /*									\     * Setup Vendor ID write and read back the address register		\     * to make sure that LBA is the bus master.				\     */									\    WRITE_REG32(tok | PCI_VENDOR_ID, (d)->hba.base_addr + LBA_PCI_CFG_ADDR);\    /*									\     * 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);		\    /*									\     * Generate a cfg write cycle (will have no affect on		\     * Vendor ID register since read-only).				\     */									\    WRITE_REG32(~0, (d)->hba.base_addr + LBA_PCI_CFG_DATA);		\    /*									\     * Make sure write has completed before proceeding further,		\     * i.e. before setting clear enable.				\     */									\    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);		\}/* * HPREVISIT: *   -- Can't tell if config cycle got the error. * *		OV bit is broken until rev 4.0, so can't use OV bit and *		LBA_ERROR_LOG_ADDR to tell if error belongs to config cycle. * *		As of rev 4.0, no longer need the error check. * *   -- Even if we could tell, we still want to return -1 *	for **ANY** error (not just master abort). * *   -- Only clear non-fatal errors (we don't want to bring *	LBA out of pci-fatal mode). * *		Actually, there is still a race in which *		we could be clearing a fatal error.  We will *		live with this during our real mode bus walk *		until rev 4.0 (no driver activity during *		real mode bus walk).  The real mode bus walk *		has race conditions concerning the use of *		smart mode as well. */#define LBA_MASTER_ABORT_ERROR 0xc#define LBA_FATAL_ERROR 0x10#define LBA_CFG_MASTER_ABORT_CHECK(d, base, tok, error) {		\    u32 error_status = 0;						\    /*									\     * Set clear enable (CE) bit. Unset by HW when new			\     * errors are logged -- LBA HW ERS section 14.3.3).		\     */									\    WRITE_REG32(status_control | 0x20, base + LBA_STAT_CTL);	\    error_status = READ_REG32(base + LBA_ERROR_STATUS);		\    if ((error_status & 0x1f) != 0) {					\	/*								\	 * Fail the config read request.				\	 */								\	error = 1;							\	if ((error_status & LBA_FATAL_ERROR) == 0) {			\	    /*								\	     * Clear error status (if fatal bit not set) by setting	\	     * clear error log bit (CL).				\	     */								\	    WRITE_REG32(status_control | 0x10, base + LBA_STAT_CTL);	\	}								\    }									\}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产经典色站一区二区三区| 国产一区二区三区电影在线观看| 国产精品久久久久久久久免费丝袜 | 国产又粗又猛又爽又黄91精品| 国产一区二区美女| 91在线观看美女| 在线播放国产精品二区一二区四区| 欧美一区二区人人喊爽| 国产欧美综合在线观看第十页| 亚洲视频一区二区免费在线观看| 视频一区欧美精品| av不卡在线播放| 久久综合久久综合亚洲| 一区二区三区日韩欧美精品| 久久成人免费网| 精品视频在线免费看| 国产午夜精品一区二区三区视频| 亚洲高清不卡在线| 99精品欧美一区二区蜜桃免费| 欧美成人a在线| 日日摸夜夜添夜夜添亚洲女人| 久久99久久精品| 欧美日韩久久一区二区| 亚洲视频一区二区免费在线观看| 国内外成人在线视频| 91精品国产欧美一区二区18| 一区二区在线观看不卡| 成人高清在线视频| 久久久一区二区三区捆绑**| 国内精品不卡在线| 日韩一二三区不卡| 日本午夜一区二区| 日韩午夜中文字幕| 极品少妇xxxx精品少妇偷拍| 欧美mv和日韩mv的网站| 免费观看日韩av| 久久综合久久99| 国产69精品久久久久777| 久久蜜臀中文字幕| 99re这里只有精品首页| 婷婷激情综合网| 日韩欧美一级二级三级| 91精品国产综合久久精品性色| 6080yy午夜一二三区久久| 欧美一区二区久久| 26uuu成人网一区二区三区| 成人动漫精品一区二区| 欧美国产在线观看| 久久综合色天天久久综合图片| 欧美三级电影一区| 色综合色综合色综合| 91色综合久久久久婷婷| 一本一道久久a久久精品| 91蜜桃网址入口| 91视频.com| 欧美日韩一区二区三区高清| 91在线无精精品入口| 日本午夜精品视频在线观看| 欧美一级夜夜爽| 成人app在线观看| 人人狠狠综合久久亚洲| 亚洲欧洲性图库| 欧美一区二区三区在线| 91丨国产丨九色丨pron| 久久精品国产在热久久| 亚洲日本一区二区| 337p日本欧洲亚洲大胆色噜噜| 色综合天天天天做夜夜夜夜做| 日韩激情视频在线观看| 最新不卡av在线| 久久蜜臀精品av| 538prom精品视频线放| 99久免费精品视频在线观看| 国内偷窥港台综合视频在线播放| 亚洲午夜视频在线观看| 亚洲柠檬福利资源导航| 国产精品成人免费| 中文字幕欧美一区| 中文字幕五月欧美| 国产精品久久久久四虎| 国产精品五月天| 国产精品三级在线观看| 国产午夜精品久久久久久久| 日韩视频中午一区| 久久综合九色欧美综合狠狠| 99精品视频一区二区三区| 免费欧美在线视频| 丝瓜av网站精品一区二区| 成人一区二区三区中文字幕| 国产成人亚洲综合a∨猫咪| 高清国产一区二区| 欧美色爱综合网| 久久久国产精品午夜一区ai换脸| 午夜精品123| 不卡免费追剧大全电视剧网站| 91精品欧美久久久久久动漫| 中文子幕无线码一区tr| 韩国视频一区二区| 色94色欧美sute亚洲线路一ni | 欧美伦理电影网| 久久精品人人做人人综合| 亚洲成人av一区二区三区| 丁香亚洲综合激情啪啪综合| 日韩欧美一级二级| 亚洲成人免费av| 91麻豆福利精品推荐| 国产人久久人人人人爽| 国产一区二区三区四区五区美女| 欧美日韩一级片在线观看| 亚洲精品视频在线| 99精品欧美一区| 国产精品成人免费在线| 成人黄页毛片网站| 中文字幕精品一区| 国产福利91精品一区二区三区| 欧美成人女星排名| 精品午夜久久福利影院 | 美女视频网站黄色亚洲| 精品欧美一区二区在线观看| 精品一区二区三区免费视频| 久久综合999| av激情成人网| 亚洲电影一区二区| 91精品婷婷国产综合久久| 黄色日韩三级电影| 中文字幕在线不卡一区| 在线视频你懂得一区二区三区| 轻轻草成人在线| 国产精品你懂的在线欣赏| 欧美日精品一区视频| 韩国欧美一区二区| 亚洲国产一区视频| 久久一区二区视频| 欧美日韩免费高清一区色橹橹| 美女尤物国产一区| 一区二区三区四区乱视频| 久久国内精品自在自线400部| 欧美精品一区二区三区久久久 | www.av精品| 国产精品综合一区二区| 日韩一区精品字幕| 亚洲自拍另类综合| 国产精品黄色在线观看| www国产亚洲精品久久麻豆| 欧美丰满嫩嫩电影| 欧美私模裸体表演在线观看| 一本到三区不卡视频| 99久久婷婷国产综合精品| 国产高清精品网站| 成人影视亚洲图片在线| 懂色av一区二区三区免费看| 国产伦理精品不卡| 国产不卡视频在线播放| 国产成人亚洲综合a∨猫咪| 春色校园综合激情亚洲| 99国产精品99久久久久久| 99这里都是精品| 91久久精品日日躁夜夜躁欧美| 国产乱码精品一品二品| 美女性感视频久久| 奇米色一区二区| 日本午夜精品一区二区三区电影| 亚洲最大成人网4388xx| 1区2区3区国产精品| 亚洲免费成人av| 亚洲综合无码一区二区| 亚洲午夜在线视频| 午夜免费久久看| 看片的网站亚洲| 国产一区二区0| 成人app网站| 欧美午夜精品久久久| 91精品国产一区二区三区蜜臀| 欧美哺乳videos| 国产精品护士白丝一区av| 一区二区三区在线视频观看58| 一区二区在线免费观看| 久久国产成人午夜av影院| 亚洲免费观看高清完整版在线观看 | 久久精品国产亚洲一区二区三区| 亚洲国产三级在线| 久久99热这里只有精品| 国产99久久精品| 欧美精三区欧美精三区| 精品国产乱码久久久久久1区2区 | 欧美一区二区三区人| 久久网站最新地址| 亚洲不卡av一区二区三区| 国内精品国产成人国产三级粉色 | 日韩不卡在线观看日韩不卡视频| 激情综合色综合久久综合| 色噜噜狠狠色综合中国| 3atv在线一区二区三区| 一区二区中文字幕在线| 免费成人在线播放| 色婷婷香蕉在线一区二区| 国产日韩欧美激情| 日韩黄色免费电影| 色婷婷综合久久久中文一区二区 | 国产成人精品三级麻豆|