|
@@ -579,3 +579,84 @@ cia_save_srm_settings(int is_pyxis)
|
|
|
|
|
|
/* Save some important registers. */
|
|
|
saved_config.err_mask = *(vip)CIA_IOC_ERR_MASK;
|
|
|
+ saved_config.cia_ctrl = *(vip)CIA_IOC_CIA_CTRL;
|
|
|
+ saved_config.hae_mem = *(vip)CIA_IOC_HAE_MEM;
|
|
|
+ saved_config.hae_io = *(vip)CIA_IOC_HAE_IO;
|
|
|
+ saved_config.pci_dac_offset = *(vip)CIA_IOC_PCI_W_DAC;
|
|
|
+
|
|
|
+ if (is_pyxis)
|
|
|
+ saved_config.cia_cnfg = *(vip)CIA_IOC_CIA_CNFG;
|
|
|
+ else
|
|
|
+ saved_config.cia_cnfg = 0;
|
|
|
+
|
|
|
+ /* Save DMA windows configuration. */
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
|
+ saved_config.window[i].w_base = *(vip)CIA_IOC_PCI_Wn_BASE(i);
|
|
|
+ saved_config.window[i].w_mask = *(vip)CIA_IOC_PCI_Wn_MASK(i);
|
|
|
+ saved_config.window[i].t_base = *(vip)CIA_IOC_PCI_Tn_BASE(i);
|
|
|
+ }
|
|
|
+ mb();
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+cia_restore_srm_settings(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
|
+ *(vip)CIA_IOC_PCI_Wn_BASE(i) = saved_config.window[i].w_base;
|
|
|
+ *(vip)CIA_IOC_PCI_Wn_MASK(i) = saved_config.window[i].w_mask;
|
|
|
+ *(vip)CIA_IOC_PCI_Tn_BASE(i) = saved_config.window[i].t_base;
|
|
|
+ }
|
|
|
+
|
|
|
+ *(vip)CIA_IOC_HAE_MEM = saved_config.hae_mem;
|
|
|
+ *(vip)CIA_IOC_HAE_IO = saved_config.hae_io;
|
|
|
+ *(vip)CIA_IOC_PCI_W_DAC = saved_config.pci_dac_offset;
|
|
|
+ *(vip)CIA_IOC_ERR_MASK = saved_config.err_mask;
|
|
|
+ *(vip)CIA_IOC_CIA_CTRL = saved_config.cia_ctrl;
|
|
|
+
|
|
|
+ if (saved_config.cia_cnfg) /* Must be pyxis. */
|
|
|
+ *(vip)CIA_IOC_CIA_CNFG = saved_config.cia_cnfg;
|
|
|
+
|
|
|
+ mb();
|
|
|
+}
|
|
|
+#else /* ALPHA_RESTORE_SRM_SETUP */
|
|
|
+#define cia_save_srm_settings(p) do {} while (0)
|
|
|
+#define cia_restore_srm_settings() do {} while (0)
|
|
|
+#endif /* ALPHA_RESTORE_SRM_SETUP */
|
|
|
+
|
|
|
+
|
|
|
+static void __init
|
|
|
+do_init_arch(int is_pyxis)
|
|
|
+{
|
|
|
+ struct pci_controller *hose;
|
|
|
+ int temp, cia_rev, tbia_window;
|
|
|
+
|
|
|
+ cia_rev = *(vip)CIA_IOC_CIA_REV & CIA_REV_MASK;
|
|
|
+ printk("pci: cia revision %d%s\n",
|
|
|
+ cia_rev, is_pyxis ? " (pyxis)" : "");
|
|
|
+
|
|
|
+ if (alpha_using_srm)
|
|
|
+ cia_save_srm_settings(is_pyxis);
|
|
|
+
|
|
|
+ /* Set up error reporting. */
|
|
|
+ temp = *(vip)CIA_IOC_ERR_MASK;
|
|
|
+ temp &= ~(CIA_ERR_CPU_PE | CIA_ERR_MEM_NEM | CIA_ERR_PA_PTE_INV
|
|
|
+ | CIA_ERR_RCVD_MAS_ABT | CIA_ERR_RCVD_TAR_ABT);
|
|
|
+ *(vip)CIA_IOC_ERR_MASK = temp;
|
|
|
+
|
|
|
+ /* Clear all currently pending errors. */
|
|
|
+ temp = *(vip)CIA_IOC_CIA_ERR;
|
|
|
+ *(vip)CIA_IOC_CIA_ERR = temp;
|
|
|
+
|
|
|
+ /* Turn on mchecks. */
|
|
|
+ temp = *(vip)CIA_IOC_CIA_CTRL;
|
|
|
+ temp |= CIA_CTRL_FILL_ERR_EN | CIA_CTRL_MCHK_ERR_EN;
|
|
|
+ *(vip)CIA_IOC_CIA_CTRL = temp;
|
|
|
+
|
|
|
+ /* Clear the CFG register, which gets used for PCI config space
|
|
|
+ accesses. That is the way we want to use it, and we do not
|
|
|
+ want to depend on what ARC or SRM might have left behind. */
|
|
|
+ *(vip)CIA_IOC_CFG = 0;
|
|
|
+
|
|
|
+ /* Zero the HAEs. */
|