|  | @@ -423,3 +423,159 @@ verify_tb_operation(void)
 | 
											
												
													
														|  |  	page[0] = data0;
 |  |  	page[0] = data0;
 | 
											
												
													
														|  |  	mcheck_expected(0) = 1;
 |  |  	mcheck_expected(0) = 1;
 | 
											
												
													
														|  |  	mcheck_taken(0) = 0;
 |  |  	mcheck_taken(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	temp = cia_readl(bus_addr);
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	mcheck_expected(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	if (mcheck_taken(0)) {
 | 
											
												
													
														|  | 
 |  | +		printk("pci: failed sg loopback i/o read test (mcheck)\n");
 | 
											
												
													
														|  | 
 |  | +		goto failed;
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	if (temp != data0) {
 | 
											
												
													
														|  | 
 |  | +		printk("pci: failed sg loopback i/o read test "
 | 
											
												
													
														|  | 
 |  | +		       "(%#x != %#x)\n", temp, data0);
 | 
											
												
													
														|  | 
 |  | +		goto failed;
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	printk("pci: passed sg loopback i/o read test\n");
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	/* Third, try to invalidate the TLB.  */
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	if (! use_tbia_try2) {
 | 
											
												
													
														|  | 
 |  | +		cia_pci_tbi(arena->hose, 0, -1);
 | 
											
												
													
														|  | 
 |  | +		temp = *(vip)CIA_IOC_TB_TAGn(0);
 | 
											
												
													
														|  | 
 |  | +		if (temp & 1) {
 | 
											
												
													
														|  | 
 |  | +			use_tbia_try2 = 1;
 | 
											
												
													
														|  | 
 |  | +			printk("pci: failed tbia test; workaround available\n");
 | 
											
												
													
														|  | 
 |  | +		} else {
 | 
											
												
													
														|  | 
 |  | +			printk("pci: passed tbia test\n");
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	/* Fourth, verify the TLB snoops the EV5's caches when
 | 
											
												
													
														|  | 
 |  | +	   doing a tlb fill.  */
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	data0 = 0x5adda15e;
 | 
											
												
													
														|  | 
 |  | +	page[0] = data0;
 | 
											
												
													
														|  | 
 |  | +	arena->ptes[4] = pte0;
 | 
											
												
													
														|  | 
 |  | +	mcheck_expected(0) = 1;
 | 
											
												
													
														|  | 
 |  | +	mcheck_taken(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	temp = cia_readl(bus_addr + 4*PAGE_SIZE);
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	mcheck_expected(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	if (mcheck_taken(0)) {
 | 
											
												
													
														|  | 
 |  | +		printk("pci: failed pte write cache snoop test (mcheck)\n");
 | 
											
												
													
														|  | 
 |  | +		goto failed;
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	if (temp != data0) {
 | 
											
												
													
														|  | 
 |  | +		printk("pci: failed pte write cache snoop test "
 | 
											
												
													
														|  | 
 |  | +		       "(%#x != %#x)\n", temp, data0);
 | 
											
												
													
														|  | 
 |  | +		goto failed;
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	printk("pci: passed pte write cache snoop test\n");
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	/* Fifth, verify that a previously invalid PTE entry gets
 | 
											
												
													
														|  | 
 |  | +	   filled from the page table.  */
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	data0 = 0xabcdef12;
 | 
											
												
													
														|  | 
 |  | +	page[0] = data0;
 | 
											
												
													
														|  | 
 |  | +	arena->ptes[5] = pte0;
 | 
											
												
													
														|  | 
 |  | +	mcheck_expected(0) = 1;
 | 
											
												
													
														|  | 
 |  | +	mcheck_taken(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	temp = cia_readl(bus_addr + 5*PAGE_SIZE);
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	mcheck_expected(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	if (mcheck_taken(0)) {
 | 
											
												
													
														|  | 
 |  | +		printk("pci: failed valid tag invalid pte reload test "
 | 
											
												
													
														|  | 
 |  | +		       "(mcheck; workaround available)\n");
 | 
											
												
													
														|  | 
 |  | +		/* Work around this bug by aligning new allocations
 | 
											
												
													
														|  | 
 |  | +		   on 4 page boundaries.  */
 | 
											
												
													
														|  | 
 |  | +		arena->align_entry = 4;
 | 
											
												
													
														|  | 
 |  | +	} else if (temp != data0) {
 | 
											
												
													
														|  | 
 |  | +		printk("pci: failed valid tag invalid pte reload test "
 | 
											
												
													
														|  | 
 |  | +		       "(%#x != %#x)\n", temp, data0);
 | 
											
												
													
														|  | 
 |  | +		goto failed;
 | 
											
												
													
														|  | 
 |  | +	} else {
 | 
											
												
													
														|  | 
 |  | +		printk("pci: passed valid tag invalid pte reload test\n");
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	/* Sixth, verify machine checks are working.  Test invalid
 | 
											
												
													
														|  | 
 |  | +	   pte under the same valid tag as we used above.  */
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	mcheck_expected(0) = 1;
 | 
											
												
													
														|  | 
 |  | +	mcheck_taken(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	temp = cia_readl(bus_addr + 6*PAGE_SIZE);
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	mcheck_expected(0) = 0;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	printk("pci: %s pci machine check test\n",
 | 
											
												
													
														|  | 
 |  | +	       mcheck_taken(0) ? "passed" : "failed");
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	/* Clean up after the tests.  */
 | 
											
												
													
														|  | 
 |  | +	arena->ptes[4] = 0;
 | 
											
												
													
														|  | 
 |  | +	arena->ptes[5] = 0;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	if (use_tbia_try2) {
 | 
											
												
													
														|  | 
 |  | +		alpha_mv.mv_pci_tbi = cia_pci_tbi_try2;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		/* Tags 0-3 must be disabled if we use this workaraund. */
 | 
											
												
													
														|  | 
 |  | +		wmb();
 | 
											
												
													
														|  | 
 |  | +		*(vip)CIA_IOC_TB_TAGn(0) = 2;
 | 
											
												
													
														|  | 
 |  | +		*(vip)CIA_IOC_TB_TAGn(1) = 2;
 | 
											
												
													
														|  | 
 |  | +		*(vip)CIA_IOC_TB_TAGn(2) = 2;
 | 
											
												
													
														|  | 
 |  | +		*(vip)CIA_IOC_TB_TAGn(3) = 2;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		printk("pci: tbia workaround enabled\n");
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	alpha_mv.mv_pci_tbi(arena->hose, 0, -1);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +exit:
 | 
											
												
													
														|  | 
 |  | +	/* unmap the bus addr */
 | 
											
												
													
														|  | 
 |  | +	cia_iounmap(bus_addr);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	/* Restore normal PCI operation.  */
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	*(vip)CIA_IOC_CIA_CTRL = ctrl;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	*(vip)CIA_IOC_CIA_CTRL;
 | 
											
												
													
														|  | 
 |  | +	mb();
 | 
											
												
													
														|  | 
 |  | +	return;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +failed:
 | 
											
												
													
														|  | 
 |  | +	printk("pci: disabling sg translation window\n");
 | 
											
												
													
														|  | 
 |  | +	*(vip)CIA_IOC_PCI_W0_BASE = 0;
 | 
											
												
													
														|  | 
 |  | +	*(vip)CIA_IOC_PCI_W1_BASE = 0;
 | 
											
												
													
														|  | 
 |  | +	pci_isa_hose->sg_isa = NULL;
 | 
											
												
													
														|  | 
 |  | +	alpha_mv.mv_pci_tbi = NULL;
 | 
											
												
													
														|  | 
 |  | +	goto exit;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +#if defined(ALPHA_RESTORE_SRM_SETUP)
 | 
											
												
													
														|  | 
 |  | +/* Save CIA configuration data as the console had it set up.  */
 | 
											
												
													
														|  | 
 |  | +struct 
 | 
											
												
													
														|  | 
 |  | +{
 | 
											
												
													
														|  | 
 |  | +    unsigned int hae_mem;
 | 
											
												
													
														|  | 
 |  | +    unsigned int hae_io;
 | 
											
												
													
														|  | 
 |  | +    unsigned int pci_dac_offset;
 | 
											
												
													
														|  | 
 |  | +    unsigned int err_mask;
 | 
											
												
													
														|  | 
 |  | +    unsigned int cia_ctrl;
 | 
											
												
													
														|  | 
 |  | +    unsigned int cia_cnfg;
 | 
											
												
													
														|  | 
 |  | +    struct {
 | 
											
												
													
														|  | 
 |  | +	unsigned int w_base;
 | 
											
												
													
														|  | 
 |  | +	unsigned int w_mask;
 | 
											
												
													
														|  | 
 |  | +	unsigned int t_base;
 | 
											
												
													
														|  | 
 |  | +    } window[4];
 | 
											
												
													
														|  | 
 |  | +} saved_config __attribute((common));
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +void
 | 
											
												
													
														|  | 
 |  | +cia_save_srm_settings(int is_pyxis)
 | 
											
												
													
														|  | 
 |  | +{
 | 
											
												
													
														|  | 
 |  | +	int i;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	/* Save some important registers. */
 | 
											
												
													
														|  | 
 |  | +	saved_config.err_mask       = *(vip)CIA_IOC_ERR_MASK;
 |