-gather (up to) 1GB at 1GB * Window 2 is direct access 2GB at 2GB * * NOTE: we need the align_entry settings for Acer devices on ES40, * specifically floppy and IDE when memory is larger than 2GB. */ hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, SMP_CACHE_BYTES); /* Initially set for 4 PTEs, but will be overridden to 64K for ISA. */ hose->sg_isa->align_entry = 4; hose->sg_pci = iommu_arena_new(hose, 0x40000000, size_for_memory(0x40000000), SMP_CACHE_BYTES); hose->sg_pci->align_entry = 4; /* Tsunami caches 4 PTEs at a time */ __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 __iomem * tsunami_ioportmap(unsigned long addr) { FIXUP_IOADDR_VGA(addr); return (void __iomem *)(addr + TSUNAMI_IO_BIAS); } void __iomem * tsunami_ioremap(unsigned long addr, unsigned long size) { FIXUP_MEMADDR_VGA(addr); return (void __iomem *)(addr + TSUNAMI_MEM_BIAS); } #ifndef CONFIG_ALPHA_GENERIC EXPORT_SYMBOL(tsunami_ioportmap); EXPORT_SYMBOL(tsunami_ioremap); #endif void __init tsunami_init_arch(void) { #ifdef NXM_MACHINE_CHECKS_ON_TSUNAMI 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", __func__, 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", __func__); printk("%s: CSR_CSC 0x%lx\n", __func__, TSUNAMI_cchip->csc.csr); printk("%s: CSR_MTR 0x%lx\n", __func__, TSUNAMI_cchip.mtr.csr); printk("%s: CSR_MISC 0x%lx\n", __func__, TSUNAMI_cchip->misc.csr); printk("%s: CSR_DIM0 0x%lx\n", __func__, TSUNAMI_cchip->dim0.csr); printk("%s: CSR_DIM1 0x%lx\n", __func__, TSUNAMI_cchip->dim1.csr); printk("%s: CSR_DIR0 0x%lx\n", __func__, TSUNAMI_cchip->dir0.csr); printk("%s: CSR_DIR1 0x%lx\n", __func__, TSUNAMI_cchip->dir1.csr); printk("%s: CSR_DRIR 0x%lx\n", __func__, TSUNAMI_cchip->drir.csr); printk("%s: DChip registers:\n"); printk("%s: CSR_DSC 0x%lx\n", __func__, TSUNAMI_dchip->dsc.csr); printk("%s: CSR_STR 0x%lx\n", __func__, TSUNAMI_dchip->str.csr); printk("%s: CSR_DREV 0x%lx\n", __func__, TSUNAMI_dchip->drev.csr); #endif /* With multiple PCI busses, we play with I/O as physical addrs. */ ioport_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); /* Check for graphic console location (if any). */ find_console_vga_hose(); } static void tsunami_kill_one_pchip(tsunami_pchip *pchip, int index) { pchip->wsba[0].csr = saved_config[index].wsba[0]; pchip->wsm[0].csr = saved_config[index].wsm[0]; pchip->tba[0].csr = saved_config[index].tba[0]; pchip->wsba[1].csr = saved_config[index].wsba[1]; pchip->wsm[1].csr = saved_config[index].wsm[1]; pchip->tba[1].csr = saved_config[index].tba[1]; pchip->wsba[2].csr = saved_config[index].wsba[2]; pchip->wsm[2].csr = saved_config[index].wsm[2]; pchip->tba[2].csr = saved_config[index].tba[2]; pchip->wsba[3].csr = saved_config[index].wsba[3]; pchip->wsm[3].csr = saved_config[index].wsm[3]; pchip->tba[3].csr = saved_config[index].tba[3]; } void tsunami_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 void tsunami_pci_clr_err_1(tsunami_pchip *pchip) { pchip->perror.csr; pchip->perror.csr = 0x040; mb(); pchip->perror.csr; } static inline void tsunami_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); } void tsunami_machine_check(unsigned long vector, unsigned long la_ptr) { /* Clear error before any reporting. */ mb(); mb(); /* magic */ draina(); tsunami_pci_clr_err(); wrmces(0x7); mb(); process_mcheck_info(vector, la_ptr, "TSUNAMI", mcheck_expected(smp_processor_id())); }