summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@dot.sfbay.redhat.com>2002-11-02 21:58:06 -0800
committerRichard Henderson <rth@are.twiddle.net>2002-11-02 21:58:06 -0800
commit2e95d1fa79a38ef28d9adffa6cea2fdccb2cc25a (patch)
tree32dbf8c055cf8a552e1c040ebb2b20a283861c51
parent96d803da326d8c9c0026d44c7fb530b4bfa91a3b (diff)
parenta70c0c042166ecc6648031da05fccc3ecd2e8fc1 (diff)
Merge with c99 initializers patch.
-rw-r--r--arch/alpha/kernel/core_cia.c47
-rw-r--r--arch/alpha/kernel/core_titan.c54
-rw-r--r--arch/alpha/kernel/core_tsunami.c53
-rw-r--r--arch/alpha/kernel/proto.h1
-rw-r--r--arch/alpha/kernel/sys_alcor.c2
-rw-r--r--arch/alpha/kernel/sys_cabriolet.c4
-rw-r--r--arch/alpha/kernel/sys_miata.c2
-rw-r--r--arch/alpha/kernel/sys_mikasa.c2
-rw-r--r--arch/alpha/kernel/sys_noritake.c2
-rw-r--r--arch/alpha/kernel/sys_ruffian.c1
-rw-r--r--arch/alpha/kernel/sys_sx164.c2
-rw-r--r--arch/alpha/kernel/sys_takara.c2
-rw-r--r--arch/alpha/lib/dbg_current.S29
13 files changed, 144 insertions, 57 deletions
diff --git a/arch/alpha/kernel/core_cia.c b/arch/alpha/kernel/core_cia.c
index 06db35e459c6..4663c75f00ca 100644
--- a/arch/alpha/kernel/core_cia.c
+++ b/arch/alpha/kernel/core_cia.c
@@ -47,6 +47,15 @@
#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
@@ -648,6 +657,24 @@ do_init_arch(int is_pyxis)
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.
*
@@ -736,6 +763,26 @@ pyxis_init_arch(void)
do_init_arch(1);
}
+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;
+}
+
void __init
cia_init_pci(void)
{
diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c
index eef1c29c7a9b..b90d64c3c90f 100644
--- a/arch/alpha/kernel/core_titan.c
+++ b/arch/alpha/kernel/core_titan.c
@@ -27,12 +27,14 @@
unsigned TITAN_agp = 0;
-static struct
+/* Save Titan configuration data as the console had it set up. */
+
+struct
{
unsigned long wsba[4];
unsigned long wsm[4];
unsigned long tba[4];
-} saved_pachip_port[4];
+} saved_config[4] __attribute__((common));
/*
* BIOS32-style PCI interface:
@@ -289,21 +291,21 @@ titan_init_one_pachip_port(titan_pachip_port *port, int index)
* Save the existing PCI window translations. SRM will
* need them when we go to reboot.
*/
- saved_pachip_port[index].wsba[0] = port->wsba[0].csr;
- saved_pachip_port[index].wsm[0] = port->wsm[0].csr;
- saved_pachip_port[index].tba[0] = port->tba[0].csr;
+ saved_config[index].wsba[0] = port->wsba[0].csr;
+ saved_config[index].wsm[0] = port->wsm[0].csr;
+ saved_config[index].tba[0] = port->tba[0].csr;
- saved_pachip_port[index].wsba[1] = port->wsba[1].csr;
- saved_pachip_port[index].wsm[1] = port->wsm[1].csr;
- saved_pachip_port[index].tba[1] = port->tba[1].csr;
+ saved_config[index].wsba[1] = port->wsba[1].csr;
+ saved_config[index].wsm[1] = port->wsm[1].csr;
+ saved_config[index].tba[1] = port->tba[1].csr;
- saved_pachip_port[index].wsba[2] = port->wsba[2].csr;
- saved_pachip_port[index].wsm[2] = port->wsm[2].csr;
- saved_pachip_port[index].tba[2] = port->tba[2].csr;
+ saved_config[index].wsba[2] = port->wsba[2].csr;
+ saved_config[index].wsm[2] = port->wsm[2].csr;
+ saved_config[index].tba[2] = port->tba[2].csr;
- saved_pachip_port[index].wsba[3] = port->wsba[3].csr;
- saved_pachip_port[index].wsm[3] = port->wsm[3].csr;
- saved_pachip_port[index].tba[3] = port->tba[3].csr;
+ saved_config[index].wsba[3] = port->wsba[3].csr;
+ saved_config[index].wsm[3] = port->wsm[3].csr;
+ saved_config[index].tba[3] = port->tba[3].csr;
/*
* Set up the PCI to main memory translation windows.
@@ -392,21 +394,21 @@ titan_init_arch(void)
static void
titan_kill_one_pachip_port(titan_pachip_port *port, int index)
{
- port->wsba[0].csr = saved_pachip_port[index].wsba[0];
- port->wsm[0].csr = saved_pachip_port[index].wsm[0];
- port->tba[0].csr = saved_pachip_port[index].tba[0];
+ port->wsba[0].csr = saved_config[index].wsba[0];
+ port->wsm[0].csr = saved_config[index].wsm[0];
+ port->tba[0].csr = saved_config[index].tba[0];
- port->wsba[1].csr = saved_pachip_port[index].wsba[1];
- port->wsm[1].csr = saved_pachip_port[index].wsm[1];
- port->tba[1].csr = saved_pachip_port[index].tba[1];
+ port->wsba[1].csr = saved_config[index].wsba[1];
+ port->wsm[1].csr = saved_config[index].wsm[1];
+ port->tba[1].csr = saved_config[index].tba[1];
- port->wsba[2].csr = saved_pachip_port[index].wsba[2];
- port->wsm[2].csr = saved_pachip_port[index].wsm[2];
- port->tba[2].csr = saved_pachip_port[index].tba[2];
+ port->wsba[2].csr = saved_config[index].wsba[2];
+ port->wsm[2].csr = saved_config[index].wsm[2];
+ port->tba[2].csr = saved_config[index].tba[2];
- port->wsba[3].csr = saved_pachip_port[index].wsba[3];
- port->wsm[3].csr = saved_pachip_port[index].wsm[3];
- port->tba[3].csr = saved_pachip_port[index].tba[3];
+ port->wsba[3].csr = saved_config[index].wsba[3];
+ port->wsm[3].csr = saved_config[index].wsm[3];
+ port->tba[3].csr = saved_config[index].tba[3];
}
static void
diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c
index 7628bc241085..23bcd4c426ec 100644
--- a/arch/alpha/kernel/core_tsunami.c
+++ b/arch/alpha/kernel/core_tsunami.c
@@ -26,13 +26,14 @@
#include "proto.h"
#include "pci_impl.h"
+/* Save Tsunami configuration data as the console had it set up. */
-static struct
+struct
{
unsigned long wsba[4];
unsigned long wsm[4];
unsigned long tba[4];
-} saved_pchip[2];
+} saved_config[2] __attribute__((common));
/*
* NOTE: Herein lie back-to-back mb instructions. They are magic.
@@ -293,21 +294,21 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index)
* need them when we go to reboot.
*/
- saved_pchip[index].wsba[0] = pchip->wsba[0].csr;
- saved_pchip[index].wsm[0] = pchip->wsm[0].csr;
- saved_pchip[index].tba[0] = pchip->tba[0].csr;
+ saved_config[index].wsba[0] = pchip->wsba[0].csr;
+ saved_config[index].wsm[0] = pchip->wsm[0].csr;
+ saved_config[index].tba[0] = pchip->tba[0].csr;
- saved_pchip[index].wsba[1] = pchip->wsba[1].csr;
- saved_pchip[index].wsm[1] = pchip->wsm[1].csr;
- saved_pchip[index].tba[1] = pchip->tba[1].csr;
+ saved_config[index].wsba[1] = pchip->wsba[1].csr;
+ saved_config[index].wsm[1] = pchip->wsm[1].csr;
+ saved_config[index].tba[1] = pchip->tba[1].csr;
- saved_pchip[index].wsba[2] = pchip->wsba[2].csr;
- saved_pchip[index].wsm[2] = pchip->wsm[2].csr;
- saved_pchip[index].tba[2] = pchip->tba[2].csr;
+ saved_config[index].wsba[2] = pchip->wsba[2].csr;
+ saved_config[index].wsm[2] = pchip->wsm[2].csr;
+ saved_config[index].tba[2] = pchip->tba[2].csr;
- saved_pchip[index].wsba[3] = pchip->wsba[3].csr;
- saved_pchip[index].wsm[3] = pchip->wsm[3].csr;
- saved_pchip[index].tba[3] = pchip->tba[3].csr;
+ saved_config[index].wsba[3] = pchip->wsba[3].csr;
+ saved_config[index].wsm[3] = pchip->wsm[3].csr;
+ saved_config[index].tba[3] = pchip->tba[3].csr;
/*
* Set up the PCI to main memory translation windows.
@@ -403,21 +404,21 @@ tsunami_init_arch(void)
static void
tsunami_kill_one_pchip(tsunami_pchip *pchip, int index)
{
- pchip->wsba[0].csr = saved_pchip[index].wsba[0];
- pchip->wsm[0].csr = saved_pchip[index].wsm[0];
- pchip->tba[0].csr = saved_pchip[index].tba[0];
+ 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_pchip[index].wsba[1];
- pchip->wsm[1].csr = saved_pchip[index].wsm[1];
- pchip->tba[1].csr = saved_pchip[index].tba[1];
+ 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_pchip[index].wsba[2];
- pchip->wsm[2].csr = saved_pchip[index].wsm[2];
- pchip->tba[2].csr = saved_pchip[index].tba[2];
+ 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_pchip[index].wsba[3];
- pchip->wsm[3].csr = saved_pchip[index].wsm[3];
- pchip->tba[3].csr = saved_pchip[index].tba[3];
+ 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
diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h
index f27e767155c3..62ba3f89553a 100644
--- a/arch/alpha/kernel/proto.h
+++ b/arch/alpha/kernel/proto.h
@@ -24,6 +24,7 @@ extern struct pci_ops cia_pci_ops;
extern void cia_init_pci(void);
extern void cia_init_arch(void);
extern void pyxis_init_arch(void);
+extern void cia_kill_arch(int);
extern void cia_machine_check(u64, u64, struct pt_regs *);
extern void cia_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c
index 9eda25b63086..7da7ce9b8b8d 100644
--- a/arch/alpha/kernel/sys_alcor.c
+++ b/arch/alpha/kernel/sys_alcor.c
@@ -221,6 +221,8 @@ alcor_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
static void
alcor_kill_arch(int mode)
{
+ cia_kill_arch(mode);
+
switch(mode) {
case LINUX_REBOOT_CMD_RESTART:
/* Who said DEC engineer's have no sense of humor? ;-) */
diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c
index 68fb947bb057..a92fd306982e 100644
--- a/arch/alpha/kernel/sys_cabriolet.c
+++ b/arch/alpha/kernel/sys_cabriolet.c
@@ -338,7 +338,6 @@ struct alpha_machine_vector cabriolet_mv __initmv = {
.init_irq = cabriolet_init_irq,
.init_rtc = common_init_rtc,
.init_pci = cabriolet_init_pci,
- .kill_arch = NULL,
.pci_map_irq = cabriolet_map_irq,
.pci_swizzle = common_swizzle,
};
@@ -366,6 +365,7 @@ struct alpha_machine_vector eb164_mv __initmv = {
.init_irq = cabriolet_init_irq,
.init_rtc = common_init_rtc,
.init_pci = cia_cab_init_pci,
+ .kill_arch = cia_kill_arch,
.pci_map_irq = cabriolet_map_irq,
.pci_swizzle = common_swizzle,
};
@@ -417,6 +417,7 @@ struct alpha_machine_vector lx164_mv __initmv = {
.init_irq = cabriolet_init_irq,
.init_rtc = common_init_rtc,
.init_pci = alphapc164_init_pci,
+ .kill_arch = cia_kill_arch,
.pci_map_irq = alphapc164_map_irq,
.pci_swizzle = common_swizzle,
};
@@ -442,6 +443,7 @@ struct alpha_machine_vector pc164_mv __initmv = {
.init_irq = pc164_init_irq,
.init_rtc = common_init_rtc,
.init_pci = alphapc164_init_pci,
+ .kill_arch = cia_kill_arch,
.pci_map_irq = alphapc164_map_irq,
.pci_swizzle = common_swizzle,
};
diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c
index e2c7ddbeef2f..1a2070a7ca3e 100644
--- a/arch/alpha/kernel/sys_miata.c
+++ b/arch/alpha/kernel/sys_miata.c
@@ -238,6 +238,8 @@ miata_init_pci(void)
static void
miata_kill_arch(int mode)
{
+ cia_kill_arch(mode);
+
switch(mode) {
case LINUX_REBOOT_CMD_RESTART:
/* Who said DEC engineers have no sense of humor? ;-) */
diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c
index f06e342c71d9..336ba38b63ff 100644
--- a/arch/alpha/kernel/sys_mikasa.c
+++ b/arch/alpha/kernel/sys_mikasa.c
@@ -234,7 +234,6 @@ struct alpha_machine_vector mikasa_mv __initmv = {
.init_irq = mikasa_init_irq,
.init_rtc = common_init_rtc,
.init_pci = common_init_pci,
- .kill_arch = NULL,
.pci_map_irq = mikasa_map_irq,
.pci_swizzle = common_swizzle,
};
@@ -260,6 +259,7 @@ struct alpha_machine_vector mikasa_primo_mv __initmv = {
.init_irq = mikasa_init_irq,
.init_rtc = common_init_rtc,
.init_pci = cia_init_pci,
+ .kill_arch = cia_kill_arch,
.pci_map_irq = mikasa_map_irq,
.pci_swizzle = common_swizzle,
};
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c
index 3e3aecf94b36..5f5d58f0d09e 100644
--- a/arch/alpha/kernel/sys_noritake.c
+++ b/arch/alpha/kernel/sys_noritake.c
@@ -316,7 +316,6 @@ struct alpha_machine_vector noritake_mv __initmv = {
.init_irq = noritake_init_irq,
.init_rtc = common_init_rtc,
.init_pci = common_init_pci,
- .kill_arch = NULL,
.pci_map_irq = noritake_map_irq,
.pci_swizzle = noritake_swizzle,
};
@@ -342,6 +341,7 @@ struct alpha_machine_vector noritake_primo_mv __initmv = {
.init_irq = noritake_init_irq,
.init_rtc = common_init_rtc,
.init_pci = cia_init_pci,
+ .kill_arch = cia_kill_arch,
.pci_map_irq = noritake_map_irq,
.pci_swizzle = noritake_swizzle,
};
diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c
index 7f7977c20ecd..81408dbd2b27 100644
--- a/arch/alpha/kernel/sys_ruffian.c
+++ b/arch/alpha/kernel/sys_ruffian.c
@@ -85,6 +85,7 @@ ruffian_init_rtc(void)
static void
ruffian_kill_arch (int mode)
{
+ cia_kill_arch(mode);
#if 0
/* This only causes re-entry to ARCSBIOS */
/* Perhaps this works for other PYXIS as well? */
diff --git a/arch/alpha/kernel/sys_sx164.c b/arch/alpha/kernel/sys_sx164.c
index ebd4d89e8f5b..9609a2a450a1 100644
--- a/arch/alpha/kernel/sys_sx164.c
+++ b/arch/alpha/kernel/sys_sx164.c
@@ -172,7 +172,7 @@ struct alpha_machine_vector sx164_mv __initmv = {
.init_irq = sx164_init_irq,
.init_rtc = common_init_rtc,
.init_pci = sx164_init_pci,
- .kill_arch = NULL,
+ .kill_arch = cia_kill_arch,
.pci_map_irq = sx164_map_irq,
.pci_swizzle = common_swizzle,
};
diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c
index 6159efaf6386..56f184417bf4 100644
--- a/arch/alpha/kernel/sys_takara.c
+++ b/arch/alpha/kernel/sys_takara.c
@@ -286,7 +286,7 @@ struct alpha_machine_vector takara_mv __initmv = {
.init_irq = takara_init_irq,
.init_rtc = common_init_rtc,
.init_pci = takara_init_pci,
- .kill_arch = NULL,
+ .kill_arch = cia_kill_arch,
.pci_map_irq = takara_map_irq,
.pci_swizzle = takara_swizzle,
};
diff --git a/arch/alpha/lib/dbg_current.S b/arch/alpha/lib/dbg_current.S
new file mode 100644
index 000000000000..e6d071015f9b
--- /dev/null
+++ b/arch/alpha/lib/dbg_current.S
@@ -0,0 +1,29 @@
+/*
+ * arch/alpha/lib/dbg_current.S
+ * Contributed by Richard Henderson (rth@cygnus.com)
+ *
+ * Trap if we find current not correct.
+ */
+
+#include <asm/pal.h>
+
+ .text
+ .set noat
+
+ .globl _mcount
+ .ent _mcount
+_mcount:
+ .frame $30, 0, $28, 0
+ .prologue 0
+
+ lda $0, -0x4000($30)
+ cmpult $8, $30, $1
+ cmpule $0, $30, $2
+ and $1, $2, $3
+ bne $3, 1f
+
+ call_pal PAL_bugchk
+
+1: ret $31, ($28), 1
+
+ .end _mcount