diff options
| author | Richard Henderson <rth@dot.sfbay.redhat.com> | 2002-11-02 21:58:06 -0800 |
|---|---|---|
| committer | Richard Henderson <rth@are.twiddle.net> | 2002-11-02 21:58:06 -0800 |
| commit | 2e95d1fa79a38ef28d9adffa6cea2fdccb2cc25a (patch) | |
| tree | 32dbf8c055cf8a552e1c040ebb2b20a283861c51 | |
| parent | 96d803da326d8c9c0026d44c7fb530b4bfa91a3b (diff) | |
| parent | a70c0c042166ecc6648031da05fccc3ecd2e8fc1 (diff) | |
Merge with c99 initializers patch.
| -rw-r--r-- | arch/alpha/kernel/core_cia.c | 47 | ||||
| -rw-r--r-- | arch/alpha/kernel/core_titan.c | 54 | ||||
| -rw-r--r-- | arch/alpha/kernel/core_tsunami.c | 53 | ||||
| -rw-r--r-- | arch/alpha/kernel/proto.h | 1 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_alcor.c | 2 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_cabriolet.c | 4 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_miata.c | 2 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_mikasa.c | 2 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_noritake.c | 2 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_ruffian.c | 1 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_sx164.c | 2 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_takara.c | 2 | ||||
| -rw-r--r-- | arch/alpha/lib/dbg_current.S | 29 |
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 |
