⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 core_t2.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	conf_write(addr, value << ((where & 3) * 8), type1);	return PCIBIOS_SUCCESSFUL;}struct pci_ops t2_pci_ops = {	.read =		t2_read_config,	.write =	t2_write_config,};static void __initt2_direct_map_window1(unsigned long base, unsigned long length){	unsigned long temp;	__direct_map_base = base;	__direct_map_size = length;	temp = (base & 0xfff00000UL) | ((base + length - 1) >> 20);	*(vulp)T2_WBASE1 = temp | 0x80000UL; /* OR in ENABLE bit */	temp = (length - 1) & 0xfff00000UL;	*(vulp)T2_WMASK1 = temp;	*(vulp)T2_TBASE1 = 0;#if DEBUG_PRINT_FINAL_SETTINGS	printk("%s: setting WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n",	       __FUNCTION__,	       *(vulp)T2_WBASE1,	       *(vulp)T2_WMASK1,	       *(vulp)T2_TBASE1);#endif}static void __initt2_sg_map_window2(struct pci_controller *hose,		  unsigned long base,		  unsigned long length){	unsigned long temp;	/* Note we can only do 1 SG window, as the other is for direct, so	   do an ISA SG area, especially for the floppy. */	hose->sg_isa = iommu_arena_new(hose, base, length, 0);	hose->sg_pci = NULL;	temp = (base & 0xfff00000UL) | ((base + length - 1) >> 20);	*(vulp)T2_WBASE2 = temp | 0xc0000UL; /* OR in ENABLE/SG bits */	temp = (length - 1) & 0xfff00000UL;	*(vulp)T2_WMASK2 = temp;	*(vulp)T2_TBASE2 = virt_to_phys(hose->sg_isa->ptes) >> 1;	mb();	t2_pci_tbi(hose, 0, -1); /* flush TLB all */#if DEBUG_PRINT_FINAL_SETTINGS	printk("%s: setting WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n",	       __FUNCTION__,	       *(vulp)T2_WBASE2,	       *(vulp)T2_WMASK2,	       *(vulp)T2_TBASE2);#endif}static void __initt2_save_configuration(void){#if DEBUG_PRINT_INITIAL_SETTINGS	printk("%s: HAE_1 was 0x%lx\n", __FUNCTION__, srm_hae); /* HW is 0 */	printk("%s: HAE_2 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_2);	printk("%s: HAE_3 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_3);	printk("%s: HAE_4 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_4);	printk("%s: HBASE was 0x%lx\n", __FUNCTION__, *(vulp)T2_HBASE);	printk("%s: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", __FUNCTION__, 	       *(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);	printk("%s: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", __FUNCTION__, 	       *(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);#endif	/*	 * Save the DMA Window registers.	 */	t2_saved_config.window[0].wbase = *(vulp)T2_WBASE1;	t2_saved_config.window[0].wmask = *(vulp)T2_WMASK1;	t2_saved_config.window[0].tbase = *(vulp)T2_TBASE1;	t2_saved_config.window[1].wbase = *(vulp)T2_WBASE2;	t2_saved_config.window[1].wmask = *(vulp)T2_WMASK2;	t2_saved_config.window[1].tbase = *(vulp)T2_TBASE2;	t2_saved_config.hae_1 = srm_hae; /* HW is already set to 0 */	t2_saved_config.hae_2 = *(vulp)T2_HAE_2;	t2_saved_config.hae_3 = *(vulp)T2_HAE_3;	t2_saved_config.hae_4 = *(vulp)T2_HAE_4;	t2_saved_config.hbase = *(vulp)T2_HBASE;}void __initt2_init_arch(void){	struct pci_controller *hose;	unsigned long temp;	unsigned int i;	for (i = 0; i < NR_CPUS; i++) {		mcheck_expected(i) = 0;		mcheck_taken(i) = 0;	}	t2_mcheck_any_expected = 0;	t2_mcheck_last_taken = 0;	/* Enable scatter/gather TLB use.  */	temp = *(vulp)T2_IOCSR;	if (!(temp & (0x1UL << 26))) {		printk("t2_init_arch: enabling SG TLB, IOCSR was 0x%lx\n",		       temp);		*(vulp)T2_IOCSR = temp | (0x1UL << 26);		mb();			*(vulp)T2_IOCSR; /* read it back to make sure */	}	t2_save_configuration();	/*	 * Create our single hose.	 */	pci_isa_hose = hose = alloc_pci_controller();	hose->io_space = &ioport_resource;	hose->mem_space = &iomem_resource;	hose->index = 0;	hose->sparse_mem_base = T2_SPARSE_MEM - IDENT_ADDR;	hose->dense_mem_base = T2_DENSE_MEM - IDENT_ADDR;	hose->sparse_io_base = T2_IO - IDENT_ADDR;	hose->dense_io_base = 0;	/*	 * Set up the PCI->physical memory translation windows.	 *	 * Window 1 is direct mapped.	 * Window 2 is scatter/gather (for ISA).	 */	t2_direct_map_window1(T2_DIRECTMAP_START, T2_DIRECTMAP_LENGTH);	/* Always make an ISA DMA window. */	t2_sg_map_window2(hose, T2_ISA_SG_START, T2_ISA_SG_LENGTH);	*(vulp)T2_HBASE = 0x0; /* Disable HOLES. */	/* Zero HAE.  */	*(vulp)T2_HAE_1 = 0; mb(); /* Sparse MEM HAE */	*(vulp)T2_HAE_2 = 0; mb(); /* Sparse I/O HAE */	*(vulp)T2_HAE_3 = 0; mb(); /* Config Space HAE */	/*	 * We also now zero out HAE_4, the dense memory HAE, so that	 * we need not account for its "offset" when accessing dense	 * memory resources which we allocated in our normal way. This	 * HAE would need to stay untouched were we to keep the SRM	 * resource settings.	 *	 * Thus we can now run standard X servers on SABLE/LYNX. :-)	 */	*(vulp)T2_HAE_4 = 0; mb();}voidt2_kill_arch(int mode){	/*	 * Restore the DMA Window registers.	 */	*(vulp)T2_WBASE1 = t2_saved_config.window[0].wbase;	*(vulp)T2_WMASK1 = t2_saved_config.window[0].wmask;	*(vulp)T2_TBASE1 = t2_saved_config.window[0].tbase;	*(vulp)T2_WBASE2 = t2_saved_config.window[1].wbase;	*(vulp)T2_WMASK2 = t2_saved_config.window[1].wmask;	*(vulp)T2_TBASE2 = t2_saved_config.window[1].tbase;	mb();	*(vulp)T2_HAE_1 = srm_hae;	*(vulp)T2_HAE_2 = t2_saved_config.hae_2;	*(vulp)T2_HAE_3 = t2_saved_config.hae_3;	*(vulp)T2_HAE_4 = t2_saved_config.hae_4;	*(vulp)T2_HBASE = t2_saved_config.hbase;	mb();	*(vulp)T2_HBASE; /* READ it back to ensure WRITE occurred. */}voidt2_pci_tbi(struct pci_controller *hose, dma_addr_t start, dma_addr_t end){	unsigned long t2_iocsr;	t2_iocsr = *(vulp)T2_IOCSR;	/* set the TLB Clear bit */	*(vulp)T2_IOCSR = t2_iocsr | (0x1UL << 28);	mb();	*(vulp)T2_IOCSR; /* read it back to make sure */	/* clear the TLB Clear bit */	*(vulp)T2_IOCSR = t2_iocsr & ~(0x1UL << 28);	mb();	*(vulp)T2_IOCSR; /* read it back to make sure */}#define SIC_SEIC (1UL << 33)    /* System Event Clear */static voidt2_clear_errors(int cpu){	struct sable_cpu_csr *cpu_regs;	cpu_regs = (struct sable_cpu_csr *)T2_CPUn_BASE(cpu);			cpu_regs->sic &= ~SIC_SEIC;	/* Clear CPU errors.  */	cpu_regs->bcce |= cpu_regs->bcce;	cpu_regs->cbe  |= cpu_regs->cbe;	cpu_regs->bcue |= cpu_regs->bcue;	cpu_regs->dter |= cpu_regs->dter;	*(vulp)T2_CERR1 |= *(vulp)T2_CERR1;	*(vulp)T2_PERR1 |= *(vulp)T2_PERR1;	mb();	mb();  /* magic */}/* * SABLE seems to have a "broadcast" style machine check, in that all * CPUs receive it. And, the issuing CPU, in the case of PCI Config * space read/write faults, will also receive a second mcheck, upon * lowering IPL during completion processing in pci_read_config_byte() * et al. * * Hence all the taken/expected/any_expected/last_taken stuff... */voidt2_machine_check(unsigned long vector, unsigned long la_ptr,		 struct pt_regs * regs){	int cpu = smp_processor_id();#ifdef CONFIG_VERBOSE_MCHECK	struct el_common *mchk_header = (struct el_common *)la_ptr;#endif	/* Clear the error before any reporting.  */	mb();	mb();  /* magic */	draina();	t2_clear_errors(cpu);	/* This should not actually be done until the logout frame is	   examined, but, since we don't do that, go on and do this... */	wrmces(0x7);	mb();	/* Now, do testing for the anomalous conditions. */	if (!mcheck_expected(cpu) && t2_mcheck_any_expected) {		/*		 * FUNKY: Received mcheck on a CPU and not		 * expecting it, but another CPU is expecting one.		 *		 * Just dismiss it for now on this CPU...		 */#ifdef CONFIG_VERBOSE_MCHECK		if (alpha_verbose_mcheck > 1) {			printk("t2_machine_check(cpu%d): any_expected 0x%x -"			       " (assumed) spurious -"			       " code 0x%x\n", cpu, t2_mcheck_any_expected,			       (unsigned int)mchk_header->code);		}#endif		return;	}	if (!mcheck_expected(cpu) && !t2_mcheck_any_expected) {		if (t2_mcheck_last_taken & (1 << cpu)) {#ifdef CONFIG_VERBOSE_MCHECK		    if (alpha_verbose_mcheck > 1) {			printk("t2_machine_check(cpu%d): last_taken 0x%x - "			       "unexpected mcheck - code 0x%x\n",			       cpu, t2_mcheck_last_taken,			       (unsigned int)mchk_header->code);		    }#endif		    t2_mcheck_last_taken = 0;		    mb();		    return;		} else {			t2_mcheck_last_taken = 0;			mb();		}	}#ifdef CONFIG_VERBOSE_MCHECK	if (alpha_verbose_mcheck > 1) {		printk("%s t2_mcheck(cpu%d): last_taken 0x%x - "		       "any_expected 0x%x - code 0x%x\n",		       (mcheck_expected(cpu) ? "EX" : "UN"), cpu,		       t2_mcheck_last_taken, t2_mcheck_any_expected,		       (unsigned int)mchk_header->code);	}#endif	process_mcheck_info(vector, la_ptr, regs, "T2", mcheck_expected(cpu));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -