patch-2.4.22 linux-2.4.22/arch/alpha/kernel/core_cia.c
Next file: linux-2.4.22/arch/alpha/kernel/core_lca.c
Previous file: linux-2.4.22/arch/alpha/kernel/Makefile
Back to the patch index
Back to the overall index
- Lines: 150
- Date:
2003-08-25 04:44:39.000000000 -0700
- Orig file:
linux-2.4.21/arch/alpha/kernel/core_cia.c
- Orig date:
2003-06-13 07:51:29.000000000 -0700
diff -urN linux-2.4.21/arch/alpha/kernel/core_cia.c linux-2.4.22/arch/alpha/kernel/core_cia.c
@@ -47,15 +47,6 @@
#define vip volatile int *
-/* Save CIA configuration data as the console had it set up. */
-
-struct
-{
- unsigned int w_base;
- unsigned int w_mask;
- unsigned int t_base;
-} saved_config[4] __attribute((common));
-
/*
* Given a bus, device, and function number, compute resulting
* configuration space address. It is therefore not safe to have
@@ -610,6 +601,74 @@
goto exit;
}
+#ifdef 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;
+ 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;
+
+ saved_config.cia_cnfg = is_pyxis ? *(vip)CIA_IOC_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)
{
@@ -620,6 +679,9 @@
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
@@ -689,24 +751,6 @@
hose->dense_io_base = CIA_BW_IO - IDENT_ADDR;
}
- /* Save CIA configuration data as the console had it set up. */
-
- saved_config[0].w_base = *(vip)CIA_IOC_PCI_W0_BASE;
- saved_config[0].w_mask = *(vip)CIA_IOC_PCI_W0_MASK;
- saved_config[0].t_base = *(vip)CIA_IOC_PCI_T0_BASE;
-
- saved_config[1].w_base = *(vip)CIA_IOC_PCI_W1_BASE;
- saved_config[1].w_mask = *(vip)CIA_IOC_PCI_W1_MASK;
- saved_config[1].t_base = *(vip)CIA_IOC_PCI_T1_BASE;
-
- saved_config[2].w_base = *(vip)CIA_IOC_PCI_W2_BASE;
- saved_config[2].w_mask = *(vip)CIA_IOC_PCI_W2_MASK;
- saved_config[2].t_base = *(vip)CIA_IOC_PCI_T2_BASE;
-
- saved_config[3].w_base = *(vip)CIA_IOC_PCI_W3_BASE;
- saved_config[3].w_mask = *(vip)CIA_IOC_PCI_W3_MASK;
- saved_config[3].t_base = *(vip)CIA_IOC_PCI_T3_BASE;
-
/*
* Set up the PCI to main memory translation windows.
*
@@ -804,21 +848,8 @@
void
cia_kill_arch(int mode)
{
- *(vip)CIA_IOC_PCI_W0_BASE = saved_config[0].w_base;
- *(vip)CIA_IOC_PCI_W0_MASK = saved_config[0].w_mask;
- *(vip)CIA_IOC_PCI_T0_BASE = saved_config[0].t_base;
-
- *(vip)CIA_IOC_PCI_W1_BASE = saved_config[1].w_base;
- *(vip)CIA_IOC_PCI_W1_MASK = saved_config[1].w_mask;
- *(vip)CIA_IOC_PCI_T1_BASE = saved_config[1].t_base;
-
- *(vip)CIA_IOC_PCI_W2_BASE = saved_config[2].w_base;
- *(vip)CIA_IOC_PCI_W2_MASK = saved_config[2].w_mask;
- *(vip)CIA_IOC_PCI_T2_BASE = saved_config[2].t_base;
-
- *(vip)CIA_IOC_PCI_W3_BASE = saved_config[3].w_base;
- *(vip)CIA_IOC_PCI_W3_MASK = saved_config[3].w_mask;
- *(vip)CIA_IOC_PCI_T3_BASE = saved_config[3].t_base;
+ if (alpha_using_srm)
+ cia_restore_srm_settings();
}
void __init
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)