* [PATCH v5 0/5] alpha: improve Tsunami machine check reporting
@ 2026-10-09 11:54 Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 1/5] alpha: move Tsunami machine check handling to err_tsunami.c Magnus Lindholm
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Magnus Lindholm @ 2026-10-09 11:54 UTC (permalink / raw)
To: richard.henderson, mattst88, linux-kernel, linux-alpha; +Cc: linmag7
This series adds system-error diagnostics for Tsunami/Typhoon and live
ES40 environmental diagnostics for Clipper. It applies to v7.3-rc1
on the Alpha for-next branch (33465f6ab697).
The first two patches move the existing handler unchanged and describe
the system logout frame. A separate EV6 prerequisite handles the short
correctable CPU frame safely. The final two patches add Tsunami system
handling, Clipper live environmental decoding and console-log reporting.
PERRMASK is left as configured by firmware. Enabling more checking needs
separate justification and hardware testing. Inverted SMIR halt/reset
signals remain undecoded; PSU tests do not establish their polarity.
ES40 Service Guide Table D-18 gives sys_offset=0x20 in its console header,
but places the summary at frame+0x18. Console environmental packets are
therefore printed raw until an actual SRM record can resolve the layout.
Live environmental decoding follows Tables D-20 and D-21; QW8 is not used.
Changes since v4:
- Split the implementation into five patches; build error objects for
CONFIG_ALPHA_TSUNAMI, covering non-generic Shark, DP264 and Eiger.
- Correct PCI/system addresses, ECC commands and syndrome, INV/SERR
handling, DAC/MWIN selection, and SGE page granularity.
- Remove the unsupported Titan master-abort dismissal policy and leave
PERRMASK as configured by firmware.
- Snapshot each live PERROR and MISC before acknowledging defined W1C
bits; report additional live status without combining transaction fields.
- Check saved and live UECC/PERR before expected-probe dismissal and panic
on either; retain expected NXM probe handling.
- Add an EV6 prerequisite to validate CPU-area bounds, including short
correctable frames, before decoding extended registers.
- Restrict ES40 environmental decoding to Clipper; fix masks, fan input,
print suppression, context-only status, and PSU warning source.
- Leave inverted SMIR halt/reset bits undecoded pending polarity checks.
- Preserve console environmental packets as raw data pending verification.
- Register console handling on all Tsunami boards; bound subpacket decode
and terminate extended-register annotation arrays.
- Remove duplicate definitions and the private header; use shared IDs.
Link to v4
https://lore.kernel.org/linux-alpha/20251125224352.32034-1-linmag7@gmail.com/
Validation:
- Fresh vmlinux builds for minimal GENERIC, SHARK, DP264 and EIGER
configurations, using GCC 15.0.1.
- Native ASan/UBSan tests of the actual EV6/Tsunami handlers, console
dispatch and raw-dump helpers, including short/truncated frames, saved
fatal errors during expected probes, and separate live snapshots.
- git am of the five exported patches on the base produces the exact
branch tree; git diff --check passes.
- checkpatch reports zero errors. Its remaining warnings include the
Alpha err_print_prefix convention, existing split printk strings,
moved barrier code and the new-file MAINTAINERS prompt.
This version was boot-tested on an AlphaServer ES40 using my ES40
configuration. Unplugging and reconnecting a PSU power cable produced
correctable environmental events (code 206): PSU 0 was reported failed,
then enabled again with its individual failure indication cleared. SMIR
bit 0 remained set in all three reports; this does not establish whether
it describes current status or a latched event.
Earlier v4 testing was on the same ES40, using PSU power-cable changes,
opened hatches and a CALLSYS-based software trigger with modified
handling. PALcode clearing behavior and halt/reset polarity remain
unverified.
Magnus Lindholm (5):
alpha: move Tsunami machine check handling to err_tsunami.c
alpha: describe the Tsunami system machine check frame
alpha: bound EV6 logout decoding by the processor area
alpha: decode and acknowledge Tsunami system machine checks
alpha: decode Clipper environmental events and retain Tsunami console
logs
arch/alpha/include/asm/core_tsunami.h | 5 +
arch/alpha/include/asm/err_common.h | 2 +
arch/alpha/kernel/Makefile | 4 +-
arch/alpha/kernel/core_tsunami.c | 34 --
arch/alpha/kernel/err_ev6.c | 36 +-
arch/alpha/kernel/err_tsunami.c | 595 ++++++++++++++++++++++++++
arch/alpha/kernel/proto.h | 2 +
arch/alpha/kernel/sys_dp264.c | 12 +-
arch/alpha/kernel/sys_eiger.c | 2 +-
9 files changed, 640 insertions(+), 52 deletions(-)
create mode 100644 arch/alpha/kernel/err_tsunami.c
base-commit: 33465f6ab697abceafd9a340067a544d551c4412
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 1/5] alpha: move Tsunami machine check handling to err_tsunami.c
2026-10-09 11:54 [PATCH v5 0/5] alpha: improve Tsunami machine check reporting Magnus Lindholm
@ 2026-10-09 11:54 ` Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 2/5] alpha: describe the Tsunami system machine check frame Magnus Lindholm
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Magnus Lindholm @ 2026-10-09 11:54 UTC (permalink / raw)
To: richard.henderson, mattst88, linux-kernel, linux-alpha; +Cc: linmag7
Move the existing handler and PCI error clearing helpers without changing
their behavior. Build the error objects for ALPHA_TSUNAMI so that all
Tsunami configurations, including non-generic Shark, can use them.
Signed-off-by: Magnus Lindholm <linmag7@gmail.com>
---
arch/alpha/kernel/Makefile | 4 ++-
arch/alpha/kernel/core_tsunami.c | 34 -----------------------
arch/alpha/kernel/err_tsunami.c | 47 ++++++++++++++++++++++++++++++++
3 files changed, 50 insertions(+), 35 deletions(-)
create mode 100644 arch/alpha/kernel/err_tsunami.c
diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile
index 4ea5c189e60e..0178f6a5bdb8 100644
--- a/arch/alpha/kernel/Makefile
+++ b/arch/alpha/kernel/Makefile
@@ -39,7 +39,7 @@ obj-y += err_ev7.o err_titan.o err_marvel.o
endif
obj-y += irq_pyxis.o irq_i8259.o irq_srm.o
-obj-y += err_ev6.o
+obj-y += err_ev6.o err_tsunami.o
obj-y += es1888.o smc37c669.o smc37c93x.o pc873xx.o gct.o
obj-y += srmcons.o
@@ -89,4 +89,6 @@ obj-$(CONFIG_ALPHA_MARVEL) += err_ev7.o err_marvel.o
obj-$(CONFIG_ALPHA_NAUTILUS) += err_ev6.o
obj-$(CONFIG_ALPHA_TITAN) += err_ev6.o err_titan.o
+obj-$(CONFIG_ALPHA_TSUNAMI) += err_ev6.o err_tsunami.o
+
endif # GENERIC
diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c
index fc1ab73f23de..d435ec9fb828 100644
--- a/arch/alpha/kernel/core_tsunami.c
+++ b/arch/alpha/kernel/core_tsunami.c
@@ -448,37 +448,3 @@ tsunami_kill_arch(int mode)
if (TSUNAMI_cchip->csc.csr & 1L<<14)
tsunami_kill_one_pchip(TSUNAMI_pchip1, 1);
}
-
-static inline void
-tsunami_pci_clr_err_1(tsunami_pchip *pchip)
-{
- pchip->perror.csr;
- pchip->perror.csr = 0x040;
- mb();
- pchip->perror.csr;
-}
-
-static inline void
-tsunami_pci_clr_err(void)
-{
- tsunami_pci_clr_err_1(TSUNAMI_pchip0);
-
- /* TSUNAMI and TYPHOON can have 2, but might only have 1 (DS10) */
- if (TSUNAMI_cchip->csc.csr & 1L<<14)
- tsunami_pci_clr_err_1(TSUNAMI_pchip1);
-}
-
-void
-tsunami_machine_check(unsigned long vector, unsigned long la_ptr)
-{
- /* Clear error before any reporting. */
- mb();
- mb(); /* magic */
- draina();
- tsunami_pci_clr_err();
- wrmces(0x7);
- mb();
-
- process_mcheck_info(vector, la_ptr, "TSUNAMI",
- mcheck_expected(smp_processor_id()));
-}
diff --git a/arch/alpha/kernel/err_tsunami.c b/arch/alpha/kernel/err_tsunami.c
new file mode 100644
index 000000000000..1045b920fa6b
--- /dev/null
+++ b/arch/alpha/kernel/err_tsunami.c
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Machine check handling for Tsunami/Typhoon systems. */
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/sched.h>
+#include <asm/io.h>
+#include <asm/core_tsunami.h>
+#include <asm/smp.h>
+#include <asm/err_common.h>
+#include <asm/irq_regs.h>
+#include "err_impl.h"
+#include "proto.h"
+#include "pci_impl.h"
+
+static inline void
+tsunami_pci_clr_err_1(tsunami_pchip *pchip)
+{
+ pchip->perror.csr;
+ pchip->perror.csr = 0x040;
+ mb();
+ pchip->perror.csr;
+}
+
+static inline void
+tsunami_pci_clr_err(void)
+{
+ tsunami_pci_clr_err_1(TSUNAMI_pchip0);
+
+ /* TSUNAMI and TYPHOON can have 2, but might only have 1 (DS10) */
+ if (TSUNAMI_cchip->csc.csr & 1L<<14)
+ tsunami_pci_clr_err_1(TSUNAMI_pchip1);
+}
+
+void
+tsunami_machine_check(unsigned long vector, unsigned long la_ptr)
+{
+ /* Clear error before any reporting. */
+ mb();
+ mb(); /* magic */
+ draina();
+ tsunami_pci_clr_err();
+ wrmces(0x7);
+ mb();
+
+ process_mcheck_info(vector, la_ptr, "TSUNAMI",
+ mcheck_expected(smp_processor_id()));
+}
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 2/5] alpha: describe the Tsunami system machine check frame
2026-10-09 11:54 [PATCH v5 0/5] alpha: improve Tsunami machine check reporting Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 1/5] alpha: move Tsunami machine check handling to err_tsunami.c Magnus Lindholm
@ 2026-10-09 11:54 ` Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 3/5] alpha: bound EV6 logout decoding by the processor area Magnus Lindholm
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Magnus Lindholm @ 2026-10-09 11:54 UTC (permalink / raw)
To: richard.henderson, mattst88, linux-kernel, linux-alpha; +Cc: linmag7
Define the five system-specific quadwords in the SRM logout frame,
as documented in the AlphaServer ES40 Service Guide, Table D-19.
Signed-off-by: Magnus Lindholm <linmag7@gmail.com>
---
arch/alpha/include/asm/core_tsunami.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/alpha/include/asm/core_tsunami.h b/arch/alpha/include/asm/core_tsunami.h
index 3391e95754f2..fe3fd4570fac 100644
--- a/arch/alpha/include/asm/core_tsunami.h
+++ b/arch/alpha/include/asm/core_tsunami.h
@@ -283,6 +283,11 @@ union TPchipPERRMASK {
* Data structure for handling TSUNAMI machine checks:
*/
struct el_TSUNAMI_sysdata_mcheck {
+ u64 sesf;
+ u64 dir;
+ u64 misc;
+ u64 p0_perror;
+ u64 p1_perror;
};
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 3/5] alpha: bound EV6 logout decoding by the processor area
2026-10-09 11:54 [PATCH v5 0/5] alpha: improve Tsunami machine check reporting Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 1/5] alpha: move Tsunami machine check handling to err_tsunami.c Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 2/5] alpha: describe the Tsunami system machine check frame Magnus Lindholm
@ 2026-10-09 11:54 ` Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 4/5] alpha: decode and acknowledge Tsunami system machine checks Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 5/5] alpha: decode Clipper environmental events and retain Tsunami console logs Magnus Lindholm
4 siblings, 0 replies; 6+ messages in thread
From: Magnus Lindholm @ 2026-10-09 11:54 UTC (permalink / raw)
To: richard.henderson, mattst88, linux-kernel, linux-alpha; +Cc: linmag7
The ES40 correctable logout frame has only the common CPU registers before
its system area at offset 0x58. The EV6 decoder treats those system words
as extra CPU registers and reads beyond the 0x80-byte frame.
Validate the CPU and system boundaries before decoding or dumping data.
Print the additional CPU registers only when the processor area contains
them. This also rejects truncated processor frames passed by console-log
handlers. See the ES40 Service Guide EK-ES240-SV A01, Table D-19.
Signed-off-by: Magnus Lindholm <linmag7@gmail.com>
---
arch/alpha/kernel/err_ev6.c | 36 ++++++++++++++++++++++++++----------
1 file changed, 26 insertions(+), 10 deletions(-)
diff --git a/arch/alpha/kernel/err_ev6.c b/arch/alpha/kernel/err_ev6.c
index 8144f2045b5b..ec0b63b0f377 100644
--- a/arch/alpha/kernel/err_ev6.c
+++ b/arch/alpha/kernel/err_ev6.c
@@ -190,6 +190,23 @@ ev6_process_logout_frame(struct el_common *mchk_header, int print)
(struct el_common_EV6_mcheck *)mchk_header;
int status = MCHK_DISPOSITION_UNKNOWN_ERROR;
+ /*
+ * ES40 correctable frames end the CPU area before EXC_ADDR (Table
+ * D-19). Validate both regions before decoding or dumping any data.
+ */
+ if (mchk_header->proc_offset != offsetof(struct el_common_EV6_mcheck,
+ I_STAT) ||
+ mchk_header->sys_offset < offsetof(struct el_common_EV6_mcheck,
+ EXC_ADDR) ||
+ mchk_header->sys_offset > mchk_header->size ||
+ ((mchk_header->sys_offset | mchk_header->size) & 7)) {
+ if (print)
+ printk("%s Invalid EV6 logout frame: size %x, CPU %x, system %x\n",
+ err_print_prefix, mchk_header->size,
+ mchk_header->proc_offset, mchk_header->sys_offset);
+ return MCHK_DISPOSITION_UNKNOWN_ERROR;
+ }
+
status |= ev6_parse_ibox(ev6mchk->I_STAT, print);
status |= ev6_parse_mbox(ev6mchk->MM_STAT, ev6mchk->DC_STAT,
ev6mchk->C_STAT, print);
@@ -203,16 +220,15 @@ ev6_process_logout_frame(struct el_common *mchk_header, int print)
if (status != MCHK_DISPOSITION_DISMISS) {
char *saved_err_prefix = err_print_prefix;
- /*
- * Dump some additional information from the frame
- */
- printk("%s EXC_ADDR: 0x%016lx IER_CM: 0x%016lx"
- " ISUM: 0x%016lx\n"
- " PAL_BASE: 0x%016lx I_CTL: 0x%016lx"
- " PCTX: 0x%016lx\n",
- err_print_prefix,
- ev6mchk->EXC_ADDR, ev6mchk->IER_CM, ev6mchk->ISUM,
- ev6mchk->PAL_BASE, ev6mchk->I_CTL, ev6mchk->PCTX);
+ /* These registers are absent from short correctable frames. */
+ if (mchk_header->sys_offset >= sizeof(*ev6mchk))
+ printk("%s EXC_ADDR: 0x%016lx IER_CM: 0x%016lx"
+ " ISUM: 0x%016lx\n"
+ " PAL_BASE: 0x%016lx I_CTL: 0x%016lx"
+ " PCTX: 0x%016lx\n",
+ err_print_prefix,
+ ev6mchk->EXC_ADDR, ev6mchk->IER_CM, ev6mchk->ISUM,
+ ev6mchk->PAL_BASE, ev6mchk->I_CTL, ev6mchk->PCTX);
if (status == MCHK_DISPOSITION_UNKNOWN_ERROR) {
printk("%s UNKNOWN error, frame follows:\n",
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 4/5] alpha: decode and acknowledge Tsunami system machine checks
2026-10-09 11:54 [PATCH v5 0/5] alpha: improve Tsunami machine check reporting Magnus Lindholm
` (2 preceding siblings ...)
2026-10-09 11:54 ` [PATCH v5 3/5] alpha: bound EV6 logout decoding by the processor area Magnus Lindholm
@ 2026-10-09 11:54 ` Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 5/5] alpha: decode Clipper environmental events and retain Tsunami console logs Magnus Lindholm
4 siblings, 0 replies; 6+ messages in thread
From: Magnus Lindholm @ 2026-10-09 11:54 UTC (permalink / raw)
To: richard.henderson, mattst88, linux-kernel, linux-alpha; +Cc: linmag7
Decode PCI and ECC transactions separately, honor invalid transaction
information, and select Pchip errors using the logout summary. Report
master aborts until a Tsunami-specific dismissal policy can be justified.
Delegate processor vectors to the bounded EV6 decoder.
Capture each live PERROR and MISC value before acknowledging their defined
W1C bits. Report live status not already represented in the saved frame,
retaining the Pchip identity, transaction and NXM source. Do not assume
that PALcode cleared the registers or that its frame captures later errors.
Check saved and live UECC/PERR before expected-probe dismissal and panic
on either. Preserve expected NXM probes, but report coincident Pchip
errors before consuming the probe exception. Leave PERRMASK unchanged.
Signed-off-by: Magnus Lindholm <linmag7@gmail.com>
---
arch/alpha/kernel/err_tsunami.c | 260 +++++++++++++++++++++++++++++---
1 file changed, 242 insertions(+), 18 deletions(-)
diff --git a/arch/alpha/kernel/err_tsunami.c b/arch/alpha/kernel/err_tsunami.c
index 1045b920fa6b..bdaa39d6242a 100644
--- a/arch/alpha/kernel/err_tsunami.c
+++ b/arch/alpha/kernel/err_tsunami.c
@@ -1,5 +1,10 @@
// SPDX-License-Identifier: GPL-2.0
-/* Machine check handling for Tsunami/Typhoon systems. */
+/*
+ * Machine check handling for Tsunami/Typhoon systems.
+ * Author: Magnus Lindholm <linmag7@gmail.com>
+ * Based on Titan error handling by Jeff Wiedemeier (Compaq).
+ * Register definitions: 21272 Hardware Reference Manual, revision 4.0.
+ */
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/sched.h>
@@ -12,36 +17,255 @@
#include "proto.h"
#include "pci_impl.h"
-static inline void
-tsunami_pci_clr_err_1(tsunami_pchip *pchip)
+#define TSUNAMI_PERROR_ERRMASK 0xdffUL
+#define TSUNAMI_PERROR_ECCMASK (perror_m_uecc | perror_m_cre)
+#define TSUNAMI_PERROR_FATAL (perror_m_uecc | perror_m_perr)
+#define TSUNAMI_PERROR_INV (1UL << 51)
+#define TSUNAMI_MISC_NXM (1UL << 28)
+
+static int
+tsunami_frame_valid(struct el_common *header, size_t size)
{
- pchip->perror.csr;
- pchip->perror.csr = 0x040;
+ return !((header->sys_offset | header->size) & 7) &&
+ header->sys_offset >= sizeof(*header) &&
+ header->sys_offset <= header->size &&
+ size <= header->size - header->sys_offset;
+}
+
+static int
+tsunami_parse_p_perror(int which, u64 perror, int print)
+{
+ static const char * const errors[] = {
+ "Lost error", "SERR asserted", "PERR asserted",
+ "Delayed-completion retry timeout", "Invalid scatter-gather PTE",
+ "Address parity error", "Target abort", "Read data parity error",
+ "No DEVSEL (master abort)", NULL,
+ "Uncorrectable ECC error", "Correctable ECC error"
+ };
+ static const char * const pci_cmd[] = {
+ "Interrupt acknowledge", "Special cycle", "I/O read", "I/O write",
+ "Reserved", "Reserved", "Memory read", "Memory write",
+ "Reserved", "Reserved", "Configuration read", "Configuration write",
+ "Memory read multiple", "Dual address cycle",
+ "Memory read line", "Memory write and invalidate"
+ };
+ unsigned long addr;
+ unsigned int cmd;
+ int i;
+
+ if (!(perror & TSUNAMI_PERROR_ERRMASK))
+ return MCHK_DISPOSITION_UNKNOWN_ERROR;
+ /* Do not import Titan's BIOS master-abort dismissal policy. */
+ if (!print)
+ return MCHK_DISPOSITION_REPORT;
+
+ printk("%s Pchip %d PERROR: %016llx\n", err_print_prefix, which, perror);
+ for (i = 0; i < ARRAY_SIZE(errors); i++)
+ if ((perror & TSUNAMI_PERROR_ERRMASK & (1UL << i)) && errors[i])
+ printk("%s %s\n", err_print_prefix, errors[i]);
+
+ /* INV invalidates SYN, CMD and ADDR; SERR has no command/address. */
+ if (perror & (TSUNAMI_PERROR_INV | perror_m_serr)) {
+ printk("%s Transaction information unavailable\n", err_print_prefix);
+ return MCHK_DISPOSITION_REPORT;
+ }
+ cmd = (perror & perror_m_cmd) >> 52;
+ if (perror & TSUNAMI_PERROR_ECCMASK) {
+ const char *command = "Reserved";
+
+ if (cmd == 0)
+ command = "DMA read";
+ else if (cmd == 1)
+ command = "DMA RMW";
+ else if (cmd == 3)
+ command = "SGTE read";
+ addr = ((perror >> 19) & 0xffffffffUL) << 3;
+ printk("%s Command: %s (%x), syndrome: %02llx\n",
+ err_print_prefix, command, cmd, (perror & perror_m_syn) >> 56);
+ printk("%s System address: %lx\n", err_print_prefix, addr);
+ } else {
+ addr = ((perror >> 18) & 0x3fffffffUL) << 2;
+ /* SGE captures only PCI address bits <31:13> (8KB page). */
+ if (perror & perror_m_sge)
+ addr &= ~0x1fffUL;
+ printk("%s Command: %s (%x), PCI address: %lx%s\n",
+ err_print_prefix, pci_cmd[cmd], cmd, addr,
+ (perror & perror_m_sge) ? " (8KB page)" : "");
+ if (perror & (1UL << 17))
+ printk("%s Monster window\n", err_print_prefix);
+ else if (perror & (1UL << 16))
+ printk("%s DAC scatter-gather window 3\n", err_print_prefix);
+ }
+ return MCHK_DISPOSITION_REPORT;
+}
+
+/* SESF bits 0/1 identify PCI errors, bit 2 covers ECC on either Pchip/CPU. */
+static u64
+tsunami_pchip_error(struct el_TSUNAMI_sysdata_mcheck *frame, int which)
+{
+ u64 perror = which ? frame->p1_perror : frame->p0_perror;
+
+ if (frame->sesf & (1UL << which))
+ return perror;
+ if ((frame->sesf & 4) && (perror & TSUNAMI_PERROR_ECCMASK))
+ return perror;
+ return 0;
+}
+
+static struct el_TSUNAMI_sysdata_mcheck *
+tsunami_system_frame(struct el_common *header)
+{
+ if ((header->code != 0x202 && header->code != 0x204) ||
+ !tsunami_frame_valid(header, sizeof(struct el_TSUNAMI_sysdata_mcheck)))
+ return NULL;
+ return (void *)header + header->sys_offset;
+}
+
+static int
+tsunami_process_logout_frame(struct el_common *header, int print)
+{
+ struct el_TSUNAMI_sysdata_mcheck *frame = tsunami_system_frame(header);
+ int status = MCHK_DISPOSITION_UNKNOWN_ERROR;
+ int i;
+
+ if (!frame) {
+ if (print)
+ printk("%s Unknown or truncated Tsunami system frame\n", err_print_prefix);
+ return MCHK_DISPOSITION_UNKNOWN_ERROR;
+ }
+ if (print)
+ printk("%s SESF: %016llx DIR: %016llx MISC: %016llx\n",
+ err_print_prefix, frame->sesf, frame->dir, frame->misc);
+ if (frame->misc & TSUNAMI_MISC_NXM) {
+ status = MCHK_DISPOSITION_REPORT;
+ if (print)
+ printk("%s Non-existent memory, NXS: %llu\n",
+ err_print_prefix, (frame->misc >> 29) & 7);
+ }
+ for (i = 0; i < 2; i++)
+ status |= tsunami_parse_p_perror(i, tsunami_pchip_error(frame, i), print);
+ return status;
+}
+
+struct tsunami_error_state {
+ u64 perror[2];
+ u64 misc;
+};
+
+static void
+tsunami_ack_pchip(tsunami_pchip *pchip, u64 perror)
+{
+ if (!(perror & TSUNAMI_PERROR_ERRMASK))
+ return;
+ pchip->perror.csr = perror & TSUNAMI_PERROR_ERRMASK;
+ /* Complete the W1C write before releasing the logout frame. */
mb();
pchip->perror.csr;
}
-static inline void
-tsunami_pci_clr_err(void)
+static void
+tsunami_clear_errors(struct tsunami_error_state *state)
+{
+ bool pchip1 = TSUNAMI_cchip->csc.csr & (1UL << 14);
+
+ /* Preserve each chip's transaction and the NXM source before clearing. */
+ state->perror[0] = TSUNAMI_pchip0->perror.csr;
+ state->perror[1] = pchip1 ? TSUNAMI_pchip1->perror.csr : 0;
+ state->misc = TSUNAMI_cchip->misc.csr;
+
+ tsunami_ack_pchip(TSUNAMI_pchip0, state->perror[0]);
+ /* Do not access the second Pchip on single-Pchip systems. */
+ if (pchip1)
+ tsunami_ack_pchip(TSUNAMI_pchip1, state->perror[1]);
+ if (state->misc & TSUNAMI_MISC_NXM) {
+ /* Zero writes leave the other MISC fields unchanged. */
+ TSUNAMI_cchip->misc.csr = TSUNAMI_MISC_NXM;
+ /* Complete the NXM acknowledgment before releasing the frame. */
+ mb();
+ TSUNAMI_cchip->misc.csr;
+ }
+}
+
+static void
+tsunami_report_live_errors(struct tsunami_error_state *state,
+ struct el_TSUNAMI_sysdata_mcheck *frame)
{
- tsunami_pci_clr_err_1(TSUNAMI_pchip0);
+ int i;
- /* TSUNAMI and TYPHOON can have 2, but might only have 1 (DS10) */
- if (TSUNAMI_cchip->csc.csr & 1L<<14)
- tsunami_pci_clr_err_1(TSUNAMI_pchip1);
+ /* PALcode's frame may predate these errors, or describe another chip. */
+ for (i = 0; i < 2; i++) {
+ if (!(state->perror[i] & TSUNAMI_PERROR_ERRMASK) ||
+ (frame && state->perror[i] == tsunami_pchip_error(frame, i)))
+ continue;
+ printk("%s Live Pchip status before acknowledgment:\n", err_print_prefix);
+ tsunami_parse_p_perror(i, state->perror[i], 1);
+ }
+ if ((state->misc & TSUNAMI_MISC_NXM) &&
+ (!frame || ((state->misc ^ frame->misc) & (0xfUL << 28))))
+ printk("%s Live MISC: %016llx, non-existent memory, NXS: %llu\n",
+ err_print_prefix, state->misc, (state->misc >> 29) & 7);
}
void
tsunami_machine_check(unsigned long vector, unsigned long la_ptr)
{
- /* Clear error before any reporting. */
+ struct el_common *header = (void *)la_ptr;
+ struct el_TSUNAMI_sysdata_mcheck *frame = NULL;
+ struct tsunami_error_state live;
+ char *saved_err_prefix = err_print_prefix;
+ u64 perror;
+ bool fatal, expected;
+
+ /* Synchronize pending accesses before inspecting the chipset. */
mb();
- mb(); /* magic */
- draina();
- tsunami_pci_clr_err();
- wrmces(0x7);
mb();
+ draina();
+ tsunami_clear_errors(&live);
+ perror = live.perror[0] | live.perror[1];
+ if (vector == SCB_Q_SYSMCHK || vector == SCB_Q_SYSERR) {
+ frame = tsunami_system_frame(header);
+ if (frame)
+ perror |= tsunami_pchip_error(frame, 0) |
+ tsunami_pchip_error(frame, 1);
+ }
+ /* Saved fatal errors matter even if PALcode already cleared PERROR. */
+ fatal = perror & TSUNAMI_PERROR_FATAL;
+ expected = vector != SCB_Q_SYSEVENT && mcheck_expected(smp_processor_id());
+ if (expected && !(perror & TSUNAMI_PERROR_ERRMASK)) {
+ wrmces(0x7);
+ /* Complete acknowledgment before returning to the probe. */
+ mb();
+ process_mcheck_info(vector, la_ptr, "TSUNAMI", 1);
+ return;
+ }
+
+ err_print_prefix = KERN_CRIT;
+ if (vector == SCB_Q_SYSMCHK || vector == SCB_Q_SYSERR) {
+ printk("%sSystem %s error (vector %lx, code %x) on CPU %d:\n",
+ err_print_prefix, vector == SCB_Q_SYSERR ? "correctable" :
+ "uncorrectable", vector, header->code, smp_processor_id());
+ if (tsunami_process_logout_frame(header, 0) == MCHK_DISPOSITION_UNKNOWN_ERROR)
+ printk("%s Unrecognized system error\n", err_print_prefix);
+ tsunami_process_logout_frame(header, 1);
+ } else if (vector == SCB_Q_SYSEVENT) {
+ printk("%sTsunami environmental event (code %x): layout unknown\n",
+ err_print_prefix, header->code);
+ }
+ tsunami_report_live_errors(&live, frame);
+ err_print_prefix = saved_err_prefix;
- process_mcheck_info(vector, la_ptr, "TSUNAMI",
- mcheck_expected(smp_processor_id()));
+ if (vector != SCB_Q_SYSMCHK && vector != SCB_Q_SYSERR &&
+ vector != SCB_Q_SYSEVENT) {
+ /* EV6 decoding also releases the logout frame. */
+ ev6_machine_check(vector, la_ptr);
+ } else {
+ wrmces(0x7);
+ /* Complete acknowledgment before resuming or panicking. */
+ mb();
+ }
+ if (fatal)
+ panic("Tsunami: uncorrectable ECC or PCI write parity error");
+ /* An expected probe may coincide with a separately reported error. */
+ if (expected)
+ process_mcheck_info(vector, la_ptr, "TSUNAMI", 1);
}
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 5/5] alpha: decode Clipper environmental events and retain Tsunami console logs
2026-10-09 11:54 [PATCH v5 0/5] alpha: improve Tsunami machine check reporting Magnus Lindholm
` (3 preceding siblings ...)
2026-10-09 11:54 ` [PATCH v5 4/5] alpha: decode and acknowledge Tsunami system machine checks Magnus Lindholm
@ 2026-10-09 11:54 ` Magnus Lindholm
4 siblings, 0 replies; 6+ messages in thread
From: Magnus Lindholm @ 2026-10-09 11:54 UTC (permalink / raw)
To: richard.henderson, mattst88, linux-kernel, linux-alpha; +Cc: linmag7
Restrict ES40 live environmental decoding to Clipper. Honor the print
argument, bound each string table, and classify only fault bits; enabled
supplies, closed doors and fan speeds are context. Leave inverted
halt/reset signals undecoded pending hardware confirmation.
Table D-18 in the ES40 Service Guide gives a console system offset that
conflicts with its field positions. Print console environmental packets
as raw data until the firmware layout can be verified. Do not interpret
those packets using the live layout from Table D-20.
Register console handling for every Tsunami board. Validate packet lengths
before decoding, keep shared subpacket identifiers with the Regatta types,
and terminate annotation arrays for safe raw dumps of longer packets.
Signed-off-by: Magnus Lindholm <linmag7@gmail.com>
---
arch/alpha/include/asm/err_common.h | 2 +
arch/alpha/kernel/err_tsunami.c | 324 ++++++++++++++++++++++++++++
arch/alpha/kernel/proto.h | 2 +
arch/alpha/kernel/sys_dp264.c | 12 +-
arch/alpha/kernel/sys_eiger.c | 2 +-
5 files changed, 335 insertions(+), 7 deletions(-)
diff --git a/arch/alpha/include/asm/err_common.h b/arch/alpha/include/asm/err_common.h
index 610e01fe73ab..63d4320581e2 100644
--- a/arch/alpha/include/asm/err_common.h
+++ b/arch/alpha/include/asm/err_common.h
@@ -47,6 +47,8 @@
# define EL_TYPE__REGATTA__PROCESSOR_ERROR_FRAME (1)
# define EL_TYPE__REGATTA__SYSTEM_ERROR_FRAME (2)
# define EL_TYPE__REGATTA__ENVIRONMENTAL_FRAME (3)
+# define EL_TYPE__REGATTA__TSUNAMI_PCHIP0_EXTENDED (6)
+# define EL_TYPE__REGATTA__TSUNAMI_PCHIP1_EXTENDED (7)
# define EL_TYPE__REGATTA__TITAN_PCHIP0_EXTENDED (8)
# define EL_TYPE__REGATTA__TITAN_PCHIP1_EXTENDED (9)
# define EL_TYPE__REGATTA__TITAN_MEMORY_EXTENDED (10)
diff --git a/arch/alpha/kernel/err_tsunami.c b/arch/alpha/kernel/err_tsunami.c
index bdaa39d6242a..cd8a93de79f0 100644
--- a/arch/alpha/kernel/err_tsunami.c
+++ b/arch/alpha/kernel/err_tsunami.c
@@ -269,3 +269,327 @@ tsunami_machine_check(unsigned long vector, unsigned long la_ptr)
if (expected)
process_mcheck_info(vector, la_ptr, "TSUNAMI", 1);
}
+
+static const char * const CLIPPER_EnvQW1SMIR[] = {
+ "System Power Supply failure detected",
+ "OCP or RMC halt detected",
+ "Sys_DC_Notok failure detected",
+ "",
+ "System temperature over 50 degrees C failure",
+ "PCI Bus #0 is in reset",
+ "PCI Bus #1 is in reset",
+ "System is being reset"
+};
+
+static const char * const CLIPPER_EnvQW2CPUIR[] = {
+ "CPU0 regulator is enabled",
+ "CPU1 regulator is enabled",
+ "CPU2 regulator is enabled",
+ "CPU3 regulator is enabled",
+ "CPU0 regulator or configuration sequence fail",
+ "CPU1 regulator or configuration sequence fail",
+ "CPU2 regulator or configuration sequence fail",
+ "CPU3 regulator or configuration sequence fail"
+};
+
+static const char * const CLIPPER_EnvQW3PSIR[] = {
+ "Power Supply 0 is enabled",
+ "Power Supply 1 is enabled",
+ "Power Supply 2 is enabled",
+ "",
+ "Power Supply 0 was enabled but failed",
+ "Power Supply 1 was enabled but failed",
+ "Power Supply 2 was enabled but failed"
+};
+
+static const char * const CLIPPER_EnvQW4LM78ISR[] = {
+ "PS +3.3V out of tolerance",
+ "PS +5V out of tolerance",
+ "PS +12V out of tolerance",
+ "VTERM out of tolerance",
+ "Temperature zone 0 (PCI Backplane slots 1-3 area) over limit failure",
+ "LM75 CPU0-3 Temperature over limit failure",
+ "System Fan 1 failure",
+ "System Fan 2 failure",
+ "CTERM out of tolerance",
+ "",
+ "-12V out of tolerance",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "CPU0_VCORE +2V out of tolerance",
+ "CPU0_VIO +1.5V out of tolerance",
+ "CPU1_VCORE +2V out of tolerance",
+ "CPU1_VIO +1.5V out of tolerance",
+ "Temperature zone 1 (PCI Backplane slots 7-10 area) over limit failure",
+ "",
+ "System Fan 4 failure",
+ "System Fan 5 failure",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "CPU2_VCORE +2V out of tolerance",
+ "CPU2_VIO +1.5V out of tolerance",
+ "CPU3_VCORE +2V out of tolerance",
+ "CPU3_VIO +1.5V out of tolerance",
+ "Temperature zone 2 (PCI Backplane slots 4-6 area) over limit failure",
+ "",
+ "System Fan 3 failure",
+ "System Fan 6 failure",
+ "",
+ "",
+ "Power supply 3.3V rail above high amperage warning",
+ "Power supply 5.0V rail above high amperage warning",
+ "Power supply 12V rail above high amperage warning",
+ "Power supply high temperature warning",
+ "Power supply AC input low limit warning",
+ "Power supply AC input high limit warning"
+};
+
+static const char * const CLIPPER_EnvQW5DOOR[] = {
+ "",
+ "Set = System CPU door is open",
+ "Set = System Fan door is open",
+ "Set = System PCI door is open",
+ "",
+ "Set = System CPU door is closed",
+ "Set = System Fan door is closed",
+ "Set = System PCI door is closed"
+};
+
+static const char * const CLIPPER_EnvQW6TEMP[] = {
+ "CPU0 temperature warning fault has occurred",
+ "CPU1 temperature warning fault has occurred",
+ "CPU2 temperature warning fault has occurred",
+ "CPU3 temperature warning fault has occurred",
+ "System temperature zone 0 warning fault has occurred",
+ "System temperature zone 1 warning fault has occurred",
+ "System temperature zone 2 warning fault has occurred"
+};
+
+static const char * const CLIPPER_EnvQW7FAN[] = {
+ "System Fan 1 is not responding to RMC Commands",
+ "System Fan 2 is not responding to RMC Commands",
+ "System Fan 3 is not responding to RMC Commands",
+ "System Fan 4 is not responding to RMC Commands",
+ "System Fan 5 is not responding to RMC Commands",
+ "System Fan 6 is not responding to RMC Commands",
+ "",
+ "",
+ "CPU fans 5/6 at maximum speed",
+ "CPU fans 5/6 reduced speed from maximum",
+ "PCI fans 1-4 at maximum speed",
+ "PCI fans 1-4 reduced speed from maximum"
+};
+
+#define CLIPPER_ENV_LM78ISR_MASK 0xfcdf00df05ffUL
+
+static char *el_tsunami_pchip0_extended_annotation[] = {
+"Subpacket Header", "P0_PCTL", "P0_PERRMASK",
+"P0_WSBA0", "P0_WSBA1", "P0_WSBA2", "P0_WSBA3",
+"P0_WSM0", "P0_WSM1", "P0_WSM2", "P0_WSM3",
+"P0_TBA0", "P0_TBA1", "P0_TBA2", "P0_TBA3", NULL
+};
+
+static char *el_tsunami_pchip1_extended_annotation[] = {
+"Subpacket Header", "P1_PCTL", "P1_PERRMASK",
+"P1_WSBA0", "P1_WSBA1", "P1_WSBA2", "P1_WSBA3",
+"P1_WSM0", "P1_WSM1", "P1_WSM2", "P1_WSM3",
+"P1_TBA0", "P1_TBA1", "P1_TBA2", "P1_TBA3", NULL
+};
+
+
+static struct el_subpacket_annotation el_tsunami_annotations[] = {
+ SUBPACKET_ANNOTATION(EL_CLASS__REGATTA_FAMILY,
+ EL_TYPE__REGATTA__TSUNAMI_PCHIP0_EXTENDED,
+ 1,
+ "Tsunami PChip 0 Extended Frame",
+ el_tsunami_pchip0_extended_annotation),
+ SUBPACKET_ANNOTATION(EL_CLASS__REGATTA_FAMILY,
+ EL_TYPE__REGATTA__TSUNAMI_PCHIP1_EXTENDED,
+ 1,
+ "Tsunami PChip 1 Extended Frame",
+ el_tsunami_pchip1_extended_annotation),
+ SUBPACKET_ANNOTATION(EL_CLASS__REGATTA_FAMILY,
+ EL_TYPE__TERMINATION__TERMINATION,
+ 1,
+ "Termination Subpacket",
+ NULL)
+};
+
+/* ES40 Service Guide EK-ES240-SV A01, live frame: Tables D-20 and D-21. */
+struct el_clipper_envdata {
+ u64 summary;
+ u64 dir;
+ u64 smir;
+ u64 cpuir;
+ u64 psir;
+ u64 fault;
+ u64 doors;
+ u64 temp_warn;
+ u64 fan_ctrl;
+ u64 fatal_power_down;
+ u64 reserved;
+};
+
+static int
+clipper_print_bits(const char * const *messages, size_t count,
+ u64 value, u64 mask, int print)
+{
+ size_t i;
+
+ if (!(value & mask))
+ return MCHK_DISPOSITION_DISMISS;
+ if (print)
+ for (i = 0; i < count; i++)
+ if (value & mask & (1UL << i))
+ printk("%s %s\n", err_print_prefix, messages[i]);
+ return MCHK_DISPOSITION_REPORT;
+}
+
+#define CLIPPER_BITS(table, value, mask) \
+ clipper_print_bits(table, ARRAY_SIZE(table), value, mask, print)
+
+static int
+clipper_process_environment(struct el_common *header, int print)
+{
+ struct el_clipper_envdata *frame;
+ int status = 0;
+
+ if (!tsunami_frame_valid(header, sizeof(*frame))) {
+ if (print)
+ printk("%s Truncated Clipper environmental frame\n", err_print_prefix);
+ return MCHK_DISPOSITION_UNKNOWN_ERROR;
+ }
+ frame = (void *)header + header->sys_offset;
+ /* Only QW1 through QW7 carry error state in the live 680 frame. */
+ /* Inverted halt/reset signals remain raw context until verified. */
+ status |= CLIPPER_BITS(CLIPPER_EnvQW1SMIR, frame->smir, 0x15);
+ status |= CLIPPER_BITS(CLIPPER_EnvQW2CPUIR, frame->cpuir, 0xf0);
+ status |= CLIPPER_BITS(CLIPPER_EnvQW3PSIR, frame->psir, 0x70);
+ status |= CLIPPER_BITS(CLIPPER_EnvQW4LM78ISR,
+ frame->fault, CLIPPER_ENV_LM78ISR_MASK);
+ status |= CLIPPER_BITS(CLIPPER_EnvQW5DOOR, frame->doors, 0x0e);
+ status |= CLIPPER_BITS(CLIPPER_EnvQW6TEMP, frame->temp_warn, 0x7f);
+ status |= CLIPPER_BITS(CLIPPER_EnvQW7FAN, frame->fan_ctrl, 0x3f);
+ if (!(status & MCHK_DISPOSITION_REPORT))
+ return MCHK_DISPOSITION_DISMISS;
+ if (print) {
+ printk("%s Environmental summary: %016llx DIR: %016llx\n",
+ err_print_prefix, frame->summary, frame->dir);
+ printk("%s SMIR: %016llx (inverted halt/reset bits undecoded)\n",
+ err_print_prefix, frame->smir);
+ CLIPPER_BITS(CLIPPER_EnvQW2CPUIR, frame->cpuir, 0x0f);
+ CLIPPER_BITS(CLIPPER_EnvQW3PSIR, frame->psir, 0x07);
+ CLIPPER_BITS(CLIPPER_EnvQW5DOOR, frame->doors, 0xe0);
+ CLIPPER_BITS(CLIPPER_EnvQW7FAN, frame->fan_ctrl, 0xf00);
+ if (frame->fault & (0x3fUL << 42))
+ printk("%s Power supply warning source: %llu (3 = reserved)\n",
+ err_print_prefix, (frame->fault >> 40) & 3);
+ }
+ return MCHK_DISPOSITION_REPORT;
+}
+
+void
+clipper_machine_check(unsigned long vector, unsigned long la_ptr)
+{
+ struct el_common *header = (void *)la_ptr;
+ char *saved_err_prefix = err_print_prefix;
+
+ if (vector != SCB_Q_SYSEVENT) {
+ tsunami_machine_check(vector, la_ptr);
+ return;
+ }
+ /* Drain pending accesses before inspecting the environmental frame. */
+ mb();
+ draina();
+ if (header->code != 0x206 ||
+ clipper_process_environment(header, 0) != MCHK_DISPOSITION_DISMISS) {
+ err_print_prefix = KERN_CRIT;
+ printk("%sSystem correctable environmental event (code %x) on CPU %d:\n",
+ err_print_prefix, header->code, smp_processor_id());
+ if (header->code == 0x206)
+ clipper_process_environment(header, 1);
+ else
+ printk("%s Unrecognized environmental event\n", err_print_prefix);
+ err_print_prefix = saved_err_prefix;
+ }
+ wrmces(0x7);
+ /* Complete acknowledgment before returning from the event. */
+ mb();
+}
+
+static struct el_subpacket *
+tsunami_process_subpacket(struct el_subpacket *packet)
+{
+ struct el_common *frame;
+ size_t offset = offsetof(struct el_subpacket, by_type.regatta_frame.data_start);
+ int status;
+
+ /* Raw dumps consume whole quadwords, and the next packet must advance. */
+ if (packet->length < offsetof(struct el_subpacket, by_type) ||
+ (packet->length & 7))
+ return NULL;
+ if (packet->revision != 1) {
+ el_annotate_subpacket(packet);
+ return (void *)packet + packet->length;
+ }
+
+ switch (packet->type) {
+ case EL_TYPE__REGATTA__PROCESSOR_ERROR_FRAME:
+ case EL_TYPE__REGATTA__PROCESSOR_DBL_ERROR_HALT:
+ case EL_TYPE__REGATTA__SYSTEM_ERROR_FRAME:
+ case EL_TYPE__REGATTA__SYSTEM_DBL_ERROR_HALT:
+ if (packet->length < offset + sizeof(*frame))
+ return NULL;
+ frame = (void *)packet + offset;
+ if (frame->size > packet->length - offset || frame->size < sizeof(*frame))
+ return NULL;
+ if (packet->type == EL_TYPE__REGATTA__PROCESSOR_ERROR_FRAME ||
+ packet->type == EL_TYPE__REGATTA__PROCESSOR_DBL_ERROR_HALT) {
+ status = ev6_process_logout_frame(frame, 0);
+ if (status != MCHK_DISPOSITION_DISMISS)
+ ev6_process_logout_frame(frame, 1);
+ } else {
+ tsunami_process_logout_frame(frame, 1);
+ }
+ break;
+ case EL_TYPE__REGATTA__ENVIRONMENTAL_FRAME:
+ /*
+ * ES40 Table D-18 gives sys_offset=0x20, but places the
+ * summary at frame+0x18. Preserve the complete packet until
+ * the console layout is verified; do not apply the live layout.
+ */
+ printk("%s Console environmental layout unverified; raw packet follows\n",
+ err_print_prefix);
+ el_annotate_subpacket(packet);
+ break;
+ default:
+ el_annotate_subpacket(packet);
+ break;
+ }
+ return (void *)packet + packet->length;
+}
+
+static struct el_subpacket_handler tsunami_subpacket_handler =
+ SUBPACKET_HANDLER_INIT(EL_CLASS__REGATTA_FAMILY, tsunami_process_subpacket);
+
+void __init
+tsunami_init_pci(void)
+{
+ size_t i;
+
+ for (i = 0; i < ARRAY_SIZE(el_tsunami_annotations); i++)
+ cdl_register_subpacket_annotation(&el_tsunami_annotations[i]);
+ cdl_register_subpacket_handler(&tsunami_subpacket_handler);
+ ev6_register_error_handlers();
+ cdl_check_console_data_log();
+ common_init_pci();
+}
diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h
index f138bd494628..9f3d77d9d8bc 100644
--- a/arch/alpha/kernel/proto.h
+++ b/arch/alpha/kernel/proto.h
@@ -78,6 +78,8 @@ extern struct _alpha_agp_info *titan_agp_info(void);
extern struct pci_ops tsunami_pci_ops;
extern void tsunami_init_arch(void);
extern void tsunami_kill_arch(int);
+extern void tsunami_init_pci(void);
+extern void clipper_machine_check(unsigned long vector, unsigned long la_ptr);
extern void tsunami_machine_check(unsigned long vector, unsigned long la_ptr);
extern void tsunami_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c
index 0a2d319bb1c8..961902a1da03 100644
--- a/arch/alpha/kernel/sys_dp264.c
+++ b/arch/alpha/kernel/sys_dp264.c
@@ -516,7 +516,7 @@ clipper_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
static void __init
dp264_init_pci(void)
{
- common_init_pci();
+ tsunami_init_pci();
SMC669_Init(0);
locate_and_init_vga(NULL);
}
@@ -524,7 +524,7 @@ dp264_init_pci(void)
static void __init
monet_init_pci(void)
{
- common_init_pci();
+ tsunami_init_pci();
SMC669_Init(1);
es1888_init();
locate_and_init_vga(NULL);
@@ -533,7 +533,7 @@ monet_init_pci(void)
static void __init
clipper_init_pci(void)
{
- common_init_pci();
+ tsunami_init_pci();
locate_and_init_vga(NULL);
}
@@ -616,7 +616,7 @@ struct alpha_machine_vector webbrick_mv __initmv = {
.init_arch = webbrick_init_arch,
.init_irq = dp264_init_irq,
.init_rtc = common_init_rtc,
- .init_pci = common_init_pci,
+ .init_pci = tsunami_init_pci,
.kill_arch = tsunami_kill_arch,
.pci_map_irq = webbrick_map_irq,
.pci_swizzle = common_swizzle,
@@ -627,7 +627,7 @@ struct alpha_machine_vector clipper_mv __initmv = {
DO_EV6_MMU,
DO_DEFAULT_RTC,
DO_TSUNAMI_IO,
- .machine_check = tsunami_machine_check,
+ .machine_check = clipper_machine_check,
.max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS,
.min_io_address = DEFAULT_IO_BASE,
.min_mem_address = DEFAULT_MEM_BASE,
@@ -667,7 +667,7 @@ struct alpha_machine_vector shark_mv __initmv = {
.init_arch = tsunami_init_arch,
.init_irq = clipper_init_irq,
.init_rtc = common_init_rtc,
- .init_pci = common_init_pci,
+ .init_pci = tsunami_init_pci,
.kill_arch = tsunami_kill_arch,
.pci_map_irq = clipper_map_irq,
.pci_swizzle = common_swizzle,
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c
index aea8a54da4bc..c53c5006ea81 100644
--- a/arch/alpha/kernel/sys_eiger.c
+++ b/arch/alpha/kernel/sys_eiger.c
@@ -217,7 +217,7 @@ struct alpha_machine_vector eiger_mv __initmv = {
.init_arch = tsunami_init_arch,
.init_irq = eiger_init_irq,
.init_rtc = common_init_rtc,
- .init_pci = common_init_pci,
+ .init_pci = tsunami_init_pci,
.kill_arch = tsunami_kill_arch,
.pci_map_irq = eiger_map_irq,
.pci_swizzle = eiger_swizzle,
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-10-09 11:58 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-09 11:54 [PATCH v5 0/5] alpha: improve Tsunami machine check reporting Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 1/5] alpha: move Tsunami machine check handling to err_tsunami.c Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 2/5] alpha: describe the Tsunami system machine check frame Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 3/5] alpha: bound EV6 logout decoding by the processor area Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 4/5] alpha: decode and acknowledge Tsunami system machine checks Magnus Lindholm
2026-10-09 11:54 ` [PATCH v5 5/5] alpha: decode Clipper environmental events and retain Tsunami console logs Magnus Lindholm
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®