|
@@ -347,3 +347,135 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index)
|
|
pchip->pctl.csr |= pctl_m_mwin;
|
|
pchip->pctl.csr |= pctl_m_mwin;
|
|
|
|
|
|
tsunami_pci_tbi(hose, 0, -1);
|
|
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()));
|
|
|
|
+}
|