diff --git a/arch/alpha/kernel/core_cia.c b/arch/alpha/kernel/core_cia.c index b8c7a5e694f331f39dcd53a435d24519223a1988..d57bd86f0b8696317ec4e134b0f3e15fc6537fb9 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 eef1c29c7a9b232f1dfa39d161be0c489f98edbf..b90d64c3c90fdc1e3d0e446eb31ae3e62f92354f 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 7628bc241085b22aa6fe9829284db9a4ea4ee3aa..23bcd4c426ec90eae66f0271e5b50bba516ec994 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 f27e767155c3f7ec538b5832254652b282c7f098..62ba3f89553a702212ff0ce6bc2ed801a5bb29df 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 fa32465ab44f36e52fc9800150abb35caa145df1..92403133b53a4900d19298acb8d2f3c0acde42fd 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 618cd340a31c7259620c97bc55d04cf9e769a86a..1b606c3661a4603d22e8cccbc953ad281d2ec3a5 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 fefda1f8dd6a5730698c74cfd60c255359745cf1..53a706fbf85e7bb66fc3fe3b6f1da240e61f2b05 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 fb7bf56c367d76371f4a984ad0b9b0bf4a0b7c28..00e7d05a42e9fea4d28fc7414dce7875587edb49 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 16ea1329f3e178ed1f31d4e29fac92c180f4eef4..d3e556c1c46385bd337b0b54e78c1a2299cf7be4 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 a1966a07b8b3f932d4d708d617da39804d208392..490c41f1eb5b780cc25264fc9295dfea74c6c85a 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 efcf059d3d8cbe4f30974297d58f9ee7dbe79955..a46a19a143dfd7e104ba9eccd5c3f29255fb0eb9 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 6af89e81b028e50d496e4f0958306db09a4da0dd..f8cfefc02c062727e1dd7e4849b85f71ddfbc516 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, };