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

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

?? core_tsunami.c

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? C
字號:
/* *	linux/arch/alpha/kernel/core_tsunami.c * * Based on code written by David A. Rusling (david.rusling@reo.mts.dec.com). * * Code common to all TSUNAMI core logic chips. */#include <linux/kernel.h>#include <linux/types.h>#include <linux/pci.h>#include <linux/sched.h>#include <linux/init.h>#include <asm/ptrace.h>#include <asm/system.h>#include <asm/smp.h>#define __EXTERN_INLINE inline#include <asm/io.h>#include <asm/core_tsunami.h>#undef __EXTERN_INLINE#include <linux/bootmem.h>#include "proto.h"#include "pci_impl.h"static struct {	unsigned long wsba[4];	unsigned long wsm[4];	unsigned long tba[4];} saved_pchip[2];/* * NOTE: Herein lie back-to-back mb instructions.  They are magic.  * One plausible explanation is that the I/O controller does not properly * handle the system transaction.  Another involves timing.  Ho hum. *//* * BIOS32-style PCI interface: */#define DEBUG_MCHECK 0		/* 0 = minimal, 1 = debug, 2 = debug+dump.  */#define DEBUG_CONFIG 0#if DEBUG_CONFIG# define DBG_CFG(args)	printk args#else# define DBG_CFG(args)#endif/* * Given a bus, device, and function number, compute resulting * configuration space address * accordingly.  It is therefore not safe to have concurrent * invocations to configuration space access routines, but there * really shouldn't be any need for this. * * Note that all config space accesses use Type 1 address format. * * Note also that type 1 is determined by non-zero bus number. * * Type 1: * *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1  *  3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * *	31:24	reserved *	23:16	bus number (8 bits = 128 possible buses) *	15:11	Device number (5 bits) *	10:8	function number *	 7:2	register number *   * Notes: *	The function number selects which function of a multi-function device  *	(e.g., SCSI and Ethernet). *  *	The register selects a DWORD (32 bit) register offset.  Hence it *	doesn't get shifted by 2 bits as we want to "drop" the bottom two *	bits. */static intmk_conf_addr(struct pci_dev *dev, int where, unsigned long *pci_addr,	     unsigned char *type1){	struct pci_controller *hose = dev->sysdata;	unsigned long addr;	u8 bus = dev->bus->number;	u8 device_fn = dev->devfn;	DBG_CFG(("mk_conf_addr(bus=%d ,device_fn=0x%x, where=0x%x, "		 "pci_addr=0x%p, type1=0x%p)\n",		 bus, device_fn, where, pci_addr, type1));	if (hose->first_busno == dev->bus->number)		bus = 0;	*type1 = (bus != 0);	addr = (bus << 16) | (device_fn << 8) | where;	addr |= hose->config_space_base;			*pci_addr = addr;	DBG_CFG(("mk_conf_addr: returning pci_addr 0x%lx\n", addr));	return 0;}static int tsunami_read_config_byte(struct pci_dev *dev, int where, u8 *value){	unsigned long addr;	unsigned char type1;	if (mk_conf_addr(dev, where, &addr, &type1))		return PCIBIOS_DEVICE_NOT_FOUND;	*value = __kernel_ldbu(*(vucp)addr);	return PCIBIOS_SUCCESSFUL;}static inttsunami_read_config_word(struct pci_dev *dev, int where, u16 *value){	unsigned long addr;	unsigned char type1;	if (mk_conf_addr(dev, where, &addr, &type1))		return PCIBIOS_DEVICE_NOT_FOUND;	*value = __kernel_ldwu(*(vusp)addr);	return PCIBIOS_SUCCESSFUL;}static inttsunami_read_config_dword(struct pci_dev *dev, int where, u32 *value){	unsigned long addr;	unsigned char type1;	if (mk_conf_addr(dev, where, &addr, &type1))		return PCIBIOS_DEVICE_NOT_FOUND;	*value = *(vuip)addr;	return PCIBIOS_SUCCESSFUL;}static int tsunami_write_config_byte(struct pci_dev *dev, int where, u8 value){	unsigned long addr;	unsigned char type1;	if (mk_conf_addr(dev, where, &addr, &type1))		return PCIBIOS_DEVICE_NOT_FOUND;	__kernel_stb(value, *(vucp)addr);	mb();	__kernel_ldbu(*(vucp)addr);	return PCIBIOS_SUCCESSFUL;}static int tsunami_write_config_word(struct pci_dev *dev, int where, u16 value){	unsigned long addr;	unsigned char type1;	if (mk_conf_addr(dev, where, &addr, &type1))		return PCIBIOS_DEVICE_NOT_FOUND;	__kernel_stw(value, *(vusp)addr);	mb();	__kernel_ldwu(*(vusp)addr);	return PCIBIOS_SUCCESSFUL;}static inttsunami_write_config_dword(struct pci_dev *dev, int where, u32 value){	unsigned long addr;	unsigned char type1;	if (mk_conf_addr(dev, where, &addr, &type1))		return PCIBIOS_DEVICE_NOT_FOUND;	*(vuip)addr = value;	mb();	*(vuip)addr;	return PCIBIOS_SUCCESSFUL;}struct pci_ops tsunami_pci_ops = {	read_byte:	tsunami_read_config_byte,	read_word:	tsunami_read_config_word,	read_dword:	tsunami_read_config_dword,	write_byte:	tsunami_write_config_byte,	write_word:	tsunami_write_config_word,	write_dword:	tsunami_write_config_dword};voidtsunami_pci_tbi(struct pci_controller *hose, dma_addr_t start, dma_addr_t end){	tsunami_pchip *pchip = hose->index ? TSUNAMI_pchip1 : TSUNAMI_pchip0;	volatile unsigned long *csr;	unsigned long value;	/* We can invalidate up to 8 tlb entries in a go.  The flush	   matches against <31:16> in the pci address.  */	csr = &pchip->tlbia.csr;	if (((start ^ end) & 0xffff0000) == 0)		csr = &pchip->tlbiv.csr;	/* For TBIA, it doesn't matter what value we write.  For TBI, 	   it's the shifted tag bits.  */	value = (start & 0xffff0000) >> 12;	*csr = value;	mb();	*csr;}#ifdef NXM_MACHINE_CHECKS_ON_TSUNAMIstatic long __inittsunami_probe_read(volatile unsigned long *vaddr){	long dont_care, probe_result;	int cpu = smp_processor_id();	int s = swpipl(IPL_MCHECK - 1);	mcheck_taken(cpu) = 0;	mcheck_expected(cpu) = 1;	mb();	dont_care = *vaddr;	draina();	mcheck_expected(cpu) = 0;	probe_result = !mcheck_taken(cpu);	mcheck_taken(cpu) = 0;	setipl(s);	printk("dont_care == 0x%lx\n", dont_care);	return probe_result;}static long __inittsunami_probe_write(volatile unsigned long *vaddr){	long true_contents, probe_result = 1;	TSUNAMI_cchip->misc.csr |= (1L << 28); /* clear NXM... */	true_contents = *vaddr;	*vaddr = 0;	draina();	if (TSUNAMI_cchip->misc.csr & (1L << 28)) {		int source = (TSUNAMI_cchip->misc.csr >> 29) & 7;		TSUNAMI_cchip->misc.csr |= (1L << 28); /* ...and unlock NXS. */		probe_result = 0;		printk("tsunami_probe_write: unit %d at 0x%016lx\n", source,		       (unsigned long)vaddr);	}	if (probe_result)		*vaddr = true_contents;	return probe_result;}#else#define tsunami_probe_read(ADDR) 1#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */#define FN __FUNCTION__static void __inittsunami_init_one_pchip(tsunami_pchip *pchip, int index){	struct pci_controller *hose;	if (tsunami_probe_read(&pchip->pctl.csr) == 0)		return;	hose = alloc_pci_controller();	if (index == 0)		pci_isa_hose = hose;	hose->io_space = alloc_resource();	hose->mem_space = alloc_resource();	/* This is for userland consumption.  For some reason, the 40-bit	   PIO bias that we use in the kernel through KSEG didn't work for	   the page table based user mappings.  So make sure we get the	   43-bit PIO bias.  */	hose->sparse_mem_base = 0;	hose->sparse_io_base = 0;	hose->dense_mem_base	  = (TSUNAMI_MEM(index) & 0xffffffffff) | 0x80000000000;	hose->dense_io_base	  = (TSUNAMI_IO(index) & 0xffffffffff) | 0x80000000000;	hose->config_space_base = TSUNAMI_CONF(index);	hose->index = index;	hose->io_space->start = TSUNAMI_IO(index) - TSUNAMI_IO_BIAS;	hose->io_space->end = hose->io_space->start + TSUNAMI_IO_SPACE - 1;	hose->io_space->name = pci_io_names[index];	hose->io_space->flags = IORESOURCE_IO;	hose->mem_space->start = TSUNAMI_MEM(index) - TSUNAMI_MEM_BIAS;	hose->mem_space->end = hose->mem_space->start + 0xffffffff;	hose->mem_space->name = pci_mem_names[index];	hose->mem_space->flags = IORESOURCE_MEM;	if (request_resource(&ioport_resource, hose->io_space) < 0)		printk(KERN_ERR "Failed to request IO on hose %d\n", index);	if (request_resource(&iomem_resource, hose->mem_space) < 0)		printk(KERN_ERR "Failed to request MEM on hose %d\n", index);	/*	 * Save the existing PCI window translations.  SRM will 	 * need them when we go to reboot.	 */	saved_pchip[index].wsba[0] = pchip->wsba[0].csr;	saved_pchip[index].wsm[0] = pchip->wsm[0].csr;	saved_pchip[index].tba[0] = pchip->tba[0].csr;	saved_pchip[index].wsba[1] = pchip->wsba[1].csr;	saved_pchip[index].wsm[1] = pchip->wsm[1].csr;	saved_pchip[index].tba[1] = pchip->tba[1].csr;	saved_pchip[index].wsba[2] = pchip->wsba[2].csr;	saved_pchip[index].wsm[2] = pchip->wsm[2].csr;	saved_pchip[index].tba[2] = pchip->tba[2].csr;	saved_pchip[index].wsba[3] = pchip->wsba[3].csr;	saved_pchip[index].wsm[3] = pchip->wsm[3].csr;	saved_pchip[index].tba[3] = pchip->tba[3].csr;	/*	 * Set up the PCI to main memory translation windows.	 *	 * Note: Window 3 is scatter-gather only	 * 	 * Window 0 is scatter-gather 8MB at 8MB (for isa)	 * Window 1 is scatter-gather (up to) 1GB at 1GB	 * Window 2 is direct access 2GB at 2GB	 */	hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, 0);	hose->sg_pci = iommu_arena_new(hose, 0x40000000,				       size_for_memory(0x40000000), 0);	__direct_map_base = 0x80000000;	__direct_map_size = 0x80000000;	pchip->wsba[0].csr = hose->sg_isa->dma_base | 3;	pchip->wsm[0].csr  = (hose->sg_isa->size - 1) & 0xfff00000;	pchip->tba[0].csr  = virt_to_phys(hose->sg_isa->ptes);	pchip->wsba[1].csr = hose->sg_pci->dma_base | 3;	pchip->wsm[1].csr  = (hose->sg_pci->size - 1) & 0xfff00000;	pchip->tba[1].csr  = virt_to_phys(hose->sg_pci->ptes);	pchip->wsba[2].csr = 0x80000000 | 1;	pchip->wsm[2].csr  = (0x80000000 - 1) & 0xfff00000;	pchip->tba[2].csr  = 0;	pchip->wsba[3].csr = 0;	/* Enable the Monster Window to make DAC pci64 possible. */	pchip->pctl.csr |= pctl_m_mwin;	tsunami_pci_tbi(hose, 0, -1);}void __inittsunami_init_arch(void){#ifdef NXM_MACHINE_CHECKS_ON_TSUNAMI	extern asmlinkage void entInt(void);	unsigned long tmp;		/* Ho hum.. init_arch is called before init_IRQ, but we need to be	   able to handle machine checks.  So install the handler now.  */	wrent(entInt, 0);	/* NXMs just don't matter to Tsunami--unless they make it	   choke completely. */	tmp = (unsigned long)(TSUNAMI_cchip - 1);	printk("%s: probing bogus address:  0x%016lx\n", FN, bogus_addr);	printk("\tprobe %s\n",	       tsunami_probe_write((unsigned long *)bogus_addr)	       ? "succeeded" : "failed");#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */#if 0	printk("%s: CChip registers:\n", FN);	printk("%s: CSR_CSC 0x%lx\n", FN, TSUNAMI_cchip->csc.csr);	printk("%s: CSR_MTR 0x%lx\n", FN, TSUNAMI_cchip.mtr.csr);	printk("%s: CSR_MISC 0x%lx\n", FN, TSUNAMI_cchip->misc.csr);	printk("%s: CSR_DIM0 0x%lx\n", FN, TSUNAMI_cchip->dim0.csr);	printk("%s: CSR_DIM1 0x%lx\n", FN, TSUNAMI_cchip->dim1.csr);	printk("%s: CSR_DIR0 0x%lx\n", FN, TSUNAMI_cchip->dir0.csr);	printk("%s: CSR_DIR1 0x%lx\n", FN, TSUNAMI_cchip->dir1.csr);	printk("%s: CSR_DRIR 0x%lx\n", FN, TSUNAMI_cchip->drir.csr);	printk("%s: DChip registers:\n");	printk("%s: CSR_DSC 0x%lx\n", FN, TSUNAMI_dchip->dsc.csr);	printk("%s: CSR_STR 0x%lx\n", FN, TSUNAMI_dchip->str.csr);	printk("%s: CSR_DREV 0x%lx\n", FN, TSUNAMI_dchip->drev.csr);#endif	/* With multiple PCI busses, we play with I/O as physical addrs.  */	ioport_resource.end = ~0UL;	iomem_resource.end = ~0UL;	/* Find how many hoses we have, and initialize them.  TSUNAMI	   and TYPHOON can have 2, but might only have 1 (DS10).  */	tsunami_init_one_pchip(TSUNAMI_pchip0, 0);	if (TSUNAMI_cchip->csc.csr & 1L<<14)		tsunami_init_one_pchip(TSUNAMI_pchip1, 1);}static voidtsunami_kill_one_pchip(tsunami_pchip *pchip, int index){	pchip->wsba[0].csr = saved_pchip[index].wsba[0];	pchip->wsm[0].csr = saved_pchip[index].wsm[0];	pchip->tba[0].csr = saved_pchip[index].tba[0];	pchip->wsba[1].csr = saved_pchip[index].wsba[1];	pchip->wsm[1].csr = saved_pchip[index].wsm[1];	pchip->tba[1].csr = saved_pchip[index].tba[1];	pchip->wsba[2].csr = saved_pchip[index].wsba[2];	pchip->wsm[2].csr = saved_pchip[index].wsm[2];	pchip->tba[2].csr = saved_pchip[index].tba[2];	pchip->wsba[3].csr = saved_pchip[index].wsba[3];	pchip->wsm[3].csr = saved_pchip[index].wsm[3];	pchip->tba[3].csr = saved_pchip[index].tba[3];}voidtsunami_kill_arch(int mode){	tsunami_kill_one_pchip(TSUNAMI_pchip0, 0);	if (TSUNAMI_cchip->csc.csr & 1L<<14)		tsunami_kill_one_pchip(TSUNAMI_pchip1, 1);}static inline voidtsunami_pci_clr_err_1(tsunami_pchip *pchip){	pchip->perror.csr;	pchip->perror.csr = 0x040;	mb();	pchip->perror.csr;}static inline voidtsunami_pci_clr_err(void){	tsunami_pci_clr_err_1(TSUNAMI_pchip0);	/* TSUNAMI and TYPHOON can have 2, but might only have 1 (DS10) */	if (TSUNAMI_cchip->csc.csr & 1L<<14)		tsunami_pci_clr_err_1(TSUNAMI_pchip1);}voidtsunami_machine_check(unsigned long vector, unsigned long la_ptr,		      struct pt_regs * regs){	/* Clear error before any reporting.  */	mb();	mb();  /* magic */	draina();	tsunami_pci_clr_err();	wrmces(0x7);	mb();	process_mcheck_info(vector, la_ptr, regs, "TSUNAMI",			    mcheck_expected(smp_processor_id()));}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
风间由美性色一区二区三区| 国产成人免费视频| 国产最新精品精品你懂的| 成人黄色小视频| 欧美r级在线观看| 亚洲一区二区美女| proumb性欧美在线观看| 精品剧情v国产在线观看在线| 亚洲色图一区二区| 国产久卡久卡久卡久卡视频精品| 欧美视频一区在线观看| 国产精品美女久久久久久| 日韩电影在线观看网站| 日本道免费精品一区二区三区| 国产欧美一区二区精品久导航| 日本三级亚洲精品| 欧美日韩国产综合一区二区 | 国产精品99久久久久久似苏梦涵 | 高清免费成人av| 日韩精品一区二| 日韩精彩视频在线观看| 欧美色成人综合| 亚洲国产一区二区在线播放| 91影视在线播放| 国产精品青草综合久久久久99| 激情综合色综合久久| 欧美videos中文字幕| 奇米色一区二区| 欧美一区二区三区免费大片| 亚洲国产成人va在线观看天堂| 日本高清视频一区二区| 亚洲免费观看高清在线观看| 99精品偷自拍| 亚洲男同1069视频| 欧美性欧美巨大黑白大战| 亚洲综合色视频| 欧美日韩一区二区在线观看| 午夜精品久久久久久久蜜桃app| 一本一本久久a久久精品综合麻豆| 国产精品国产三级国产aⅴ原创 | 在线精品视频一区二区| 亚洲精品免费播放| 欧美日韩高清一区二区不卡 | 亚洲乱码国产乱码精品精可以看| 91丝袜美腿高跟国产极品老师| 亚洲天堂中文字幕| 欧日韩精品视频| 日韩av电影天堂| 久久综合精品国产一区二区三区 | 国产精品网友自拍| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲精品亚洲人成人网| 欧美美女一区二区三区| 六月丁香婷婷色狠狠久久| 国产亚洲精品bt天堂精选| av电影在线不卡| 午夜视频在线观看一区| 精品粉嫩aⅴ一区二区三区四区| 国产成人啪免费观看软件| 亚洲色欲色欲www| 欧美日韩aaa| 国产精品1024| 亚洲高清免费观看高清完整版在线观看| 欧美酷刑日本凌虐凌虐| 国产麻豆午夜三级精品| 亚洲欧美激情插| 欧美不卡一二三| 色婷婷久久99综合精品jk白丝 | 黄色成人免费在线| 亚洲色欲色欲www在线观看| 这里只有精品免费| av一本久道久久综合久久鬼色| 香蕉加勒比综合久久| 国产精品视频yy9299一区| 欧美军同video69gay| 成人免费视频国产在线观看| 日韩在线一二三区| 国产婷婷精品av在线| 欧美日韩久久一区二区| 国产成人精品一区二| 日韩专区欧美专区| 国产精品白丝在线| 精品第一国产综合精品aⅴ| 日本精品一级二级| 国产精品一区不卡| 蜜臀久久99精品久久久久宅男| 成人欧美一区二区三区视频网页| 日韩欧美一区电影| 欧美色综合网站| 9l国产精品久久久久麻豆| 久久国产精品99久久久久久老狼| 亚洲另类中文字| 国产精品成人在线观看| 国产亚洲成av人在线观看导航| 欧美日韩aaaaa| 欧美亚洲综合另类| 一本久久a久久免费精品不卡| 国产麻豆精品在线观看| 另类的小说在线视频另类成人小视频在线 | 麻豆免费精品视频| 亚洲国产综合色| 亚洲精品免费在线播放| 亚洲欧美一区二区在线观看| 中文字幕乱码亚洲精品一区 | 亚洲欧洲制服丝袜| 中文字幕免费观看一区| 国产三级久久久| 欧美激情一区二区三区| 久久毛片高清国产| 2欧美一区二区三区在线观看视频| 欧美日本在线播放| 在线视频一区二区三区| 91视视频在线观看入口直接观看www | 蓝色福利精品导航| 免费成人小视频| 美女在线视频一区| 久久精品72免费观看| 激情成人综合网| 高清不卡在线观看av| 成人国产电影网| 91年精品国产| 在线国产亚洲欧美| 欧美理论片在线| 日韩午夜精品视频| 久久九九久精品国产免费直播| 久久日韩粉嫩一区二区三区| 久久久久久毛片| 久久亚洲精品小早川怜子| 国产欧美日本一区视频| 国产精品免费网站在线观看| 国产精品无圣光一区二区| 一区二区三区日韩在线观看| 性欧美疯狂xxxxbbbb| 国产一区二区在线影院| 福利一区在线观看| 色吊一区二区三区| 911精品国产一区二区在线| 2020国产精品自拍| 中文字幕日韩一区| 日韩福利视频导航| 国产精品1024久久| 精品视频在线看| 日韩欧美区一区二| 国产精品传媒入口麻豆| 婷婷夜色潮精品综合在线| 国模套图日韩精品一区二区| 91视频.com| 精品美女一区二区| 成人欧美一区二区三区1314| 亚洲va国产va欧美va观看| 久久国产综合精品| 99re这里只有精品首页| 欧美丰满高潮xxxx喷水动漫| 亚洲国产综合色| 国产伦精一区二区三区| 在线观看亚洲成人| 欧美成人官网二区| 一区二区三区四区视频精品免费| 日韩二区三区四区| 91视频xxxx| 久久免费美女视频| 五月天亚洲婷婷| yourporn久久国产精品| 欧美日高清视频| 亚洲人成网站色在线观看| 久久99精品一区二区三区三区| 91麻豆swag| 国产女人18毛片水真多成人如厕| 午夜av一区二区三区| 成人免费毛片app| 欧美zozo另类异族| 午夜精品在线视频一区| 99re这里只有精品视频首页| 精品人伦一区二区色婷婷| 午夜私人影院久久久久| 色视频成人在线观看免| 国产精品私人影院| 国产资源精品在线观看| 日韩一区二区在线播放| 亚洲一区在线看| 日本精品一区二区三区四区的功能| 国产婷婷色一区二区三区四区| 免费在线观看日韩欧美| 欧美日韩的一区二区| 亚洲小说春色综合另类电影| 99久久久无码国产精品| 欧美激情中文字幕一区二区| 精品一区二区在线免费观看| 7777女厕盗摄久久久| 亚洲va欧美va人人爽| 欧美日韩国产经典色站一区二区三区 | 国产精品久久久久久久久免费丝袜| 蜜臀av一区二区在线免费观看| 欧美电影在线免费观看| 婷婷一区二区三区| 91精品国产色综合久久不卡电影| 亚洲国产欧美在线| 欧美日本韩国一区二区三区视频| 亚洲一区二区欧美| 欧美日韩免费在线视频|