* Re: [PATCH net v3] net: dpaa: fix mode setting
From: Sean Anderson @ 2026-07-17 21:10 UTC (permalink / raw)
To: Michael Walle, Madalin Bucur, Andrew Lunn, David S . Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Christian Zigotzky
Cc: netdev, linux-kernel, linuxppc-dev
In-Reply-To: <20260717132401.2653252-1-mwalle@kernel.org>
On 7/17/26 09:20, Michael Walle wrote:
> Before converting to the phylink interface, the init function would have
> set a non-reserved I/F mode in the maccfg2 register. After converting to
> phylink, 0 is written as mode, which is a reserved value (although it's
> the hardware default). Without a valid mode, a SGMII link is never
> established between the MAC and the PHY and thus .link_up() is never
> called which could set the correct mode according to the actual speed.
>
> Fix it by setting the maximum speed of the phy_interface_t in use in
> .mac_config() - just like the driver did before the phylink conversion.
>
> Fixes: 5d93cfcf7360 ("net: dpaa: Convert to phylink")
> Suggested-by: Sean Anderson <sean.anderson@linux.dev>
> Signed-off-by: Michael Walle <mwalle@kernel.org>
> ---
> I didn't grab Sean's Rb tag as this is somewhat different.
>
> Changes in v3:
> - keep the mode setting also in .adjust_link().
> - reword the commit message, to be (hopefully) more precise
> - Link to v2: https://lore.kernel.org/r/20260710143430.2276141-1-mwalle@kernel.org/
>
> Changes in v2:
> - the setting is/was based on the maximum speed, not the current
> speed. thus, move the setting into mac_config().
> - Link to v1: https://lore.kernel.org/r/20260706121011.1948906-1-mwalle@kernel.org/
>
> .../net/ethernet/freescale/fman/fman_dtsec.c | 17 ++++++++++++-----
> 1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.c b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
> index fe35703c509e..b8d70c0ecb6c 100644
> --- a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
> +++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
> @@ -900,22 +900,28 @@ static void dtsec_mac_config(struct phylink_config *config, unsigned int mode,
> {
> struct mac_device *mac_dev = fman_config_to_mac(config);
> struct dtsec_regs __iomem *regs = mac_dev->fman_mac->regs;
> - u32 tmp;
> + u32 ecntrl, maccfg2;
> +
> + maccfg2 = ioread32be(®s->maccfg2);
> + maccfg2 &= ~(MACCFG2_NIBBLE_MODE | MACCFG2_BYTE_MODE);
>
> switch (state->interface) {
> case PHY_INTERFACE_MODE_RMII:
> - tmp = DTSEC_ECNTRL_RMM;
> + ecntrl = DTSEC_ECNTRL_RMM;
> + maccfg2 |= MACCFG2_NIBBLE_MODE;
> break;
> case PHY_INTERFACE_MODE_RGMII:
> case PHY_INTERFACE_MODE_RGMII_ID:
> case PHY_INTERFACE_MODE_RGMII_RXID:
> case PHY_INTERFACE_MODE_RGMII_TXID:
> - tmp = DTSEC_ECNTRL_GMIIM | DTSEC_ECNTRL_RPM;
> + ecntrl = DTSEC_ECNTRL_GMIIM | DTSEC_ECNTRL_RPM;
> + maccfg2 |= MACCFG2_BYTE_MODE;
> break;
> case PHY_INTERFACE_MODE_SGMII:
> case PHY_INTERFACE_MODE_1000BASEX:
> case PHY_INTERFACE_MODE_2500BASEX:
> - tmp = DTSEC_ECNTRL_TBIM | DTSEC_ECNTRL_SGMIIM;
> + ecntrl = DTSEC_ECNTRL_TBIM | DTSEC_ECNTRL_SGMIIM;
> + maccfg2 |= MACCFG2_BYTE_MODE;
> break;
> default:
> dev_warn(mac_dev->dev, "cannot configure dTSEC for %s\n",
> @@ -923,7 +929,8 @@ static void dtsec_mac_config(struct phylink_config *config, unsigned int mode,
> return;
> }
>
> - iowrite32be(tmp, ®s->ecntrl);
> + iowrite32be(ecntrl, ®s->ecntrl);
> + iowrite32be(maccfg2, ®s->maccfg2);
> }
>
> static void dtsec_link_up(struct phylink_config *config, struct phy_device *phy,
Reviewed-by: Sean Anderson <sean.anderson@linux.dev>
Christian, can you test this patch with ethernet at 100/1G speed if you still have
access to those P5020/P5040 boards?
https://lore.kernel.org/all/0bfc8f3d-cb62-25f4-2590-ff424adbe48a@xenosoft.de/
^ permalink raw reply
* [PATCH v18 01/13] cxl/ras: Fix cxl_rch_get_aer_severity() wrong severity register
From: Terry Bowman @ 2026-07-17 22:26 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
cxl_rch_get_aer_severity() classifies RCH Downstream Port uncorrectable
errors as fatal or non-fatal by ANDing uncorrectable status with
PCI_ERR_ROOT_FATAL_RCV. This is wrong because PCI_ERR_ROOT_FATAL_RCV is a
Root Error Status register bit (bit 6), not a severity bit. ANDing it
against uncorrectable status tests a reserved bit and produces incorrect
severity classification.
Fix by ANDing the unmasked uncor_status against uncor_severity. Per
PCIe Base Spec r6.0 Section 7.8.4.4, each bit in the Uncorrectable
Error Severity register indicates whether the corresponding error is
fatal (1) or non-fatal (0).
Fixes: 6ac07883dbb5 ("cxl/pci: Add RCH downstream port error logging")
Cc: stable@vger.kernel.org
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17 -> v18:
- New patch.
---
drivers/cxl/core/ras_rch.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/cxl/core/ras_rch.c b/drivers/cxl/core/ras_rch.c
index 0a8b3b9b63884..44b335d560708 100644
--- a/drivers/cxl/core/ras_rch.c
+++ b/drivers/cxl/core/ras_rch.c
@@ -80,7 +80,8 @@ static bool cxl_rch_get_aer_severity(struct aer_capability_regs *aer_regs,
int *severity)
{
if (aer_regs->uncor_status & ~aer_regs->uncor_mask) {
- if (aer_regs->uncor_status & PCI_ERR_ROOT_FATAL_RCV)
+ if ((aer_regs->uncor_status & ~aer_regs->uncor_mask) &
+ aer_regs->uncor_severity)
*severity = AER_FATAL;
else
*severity = AER_NONFATAL;
--
2.34.1
^ permalink raw reply related
* [PATCH v18 00/13] Enable CXL PCIe Port Protocol Error handling and logging
From: Terry Bowman @ 2026-07-17 22:26 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
This patch series enables CXL protocol error handling for both CXL Ports
and CXL Endpoints (EP). The previous revision is available at:
https://lore.kernel.org/linux-cxl/20260505173029.2718246-1-terry.bowman@amd.com/
Today the kernel handles native CXL.cachemem RAS only for Endpoints and
Restricted CXL Host (RCH) Downstream Ports. Root Ports, Upstream Switch
Ports, and Downstream Switch Ports are uncovered. This series introduces
a unified CXL protocol error path for all CXL device types, in both VH
and RCH topologies.
CXL protocol errors are layered as a distinct error plane on top of PCIe
AER. CXL RAS conditions are signaled as PCIe correctable (CE) and
uncorrectable (UCE) Internal AER Errors. The AER driver classifies these
events using pcie_is_cxl() and hands them off to cxl_core through the
AER-CXL kfifo.
The cxl_core driver dequeues each event, resolves the cxl_port topology,
and dispatches to the CE or UCE handler. RCD Endpoints are handled
slightly differently: the RCH Downstream Port's RAS state is processed
first, then the Endpoint's own RAS follows the common path.
PCIe AER errors remain a separate plane and are handled independently.
This series updates the CXL Endpoint AER UCE handler and removes the
Endpoint AER CE handler, which is now redundant since the AER driver
clears and logs CE status itself.
PCI_ERS_RESULT_PANIC, introduced in earlier revisions, has been dropped.
The panic decision is made directly in cxl_do_recovery(): the kernel
panics on any uncorrectable CXL RAS error reported by cxl_handle_ras(),
or earlier on link disconnect.
A fatal UCE on an Upstream Switch Port or Endpoint surfaces through the
AER path rather than the CXL RAS path. USP devices are bound to the PCIe
portdrv driver, so when a USP reports a fatal UCE, the PCIe error handler
provided by portdrv is invoked. PCI config reads to the source device are
expected to fail in this scenario, so the AER core never retrieves
UNCOR_STATUS, and the event cannot be classified as CXL. See the fatal
and non-fatal log excerpts for USP and EP below.
== Patch Details ==
Patch 1 - cxl/ras: Fix cxl_rch_get_aer_severity() wrong severity register
Fix RCH Downstream Port severity classification. Was using
PCI_ERR_ROOT_FATAL_RCV (a Root Error Status bit) instead of uncor_severity
to classify fatal vs non-fatal.
Patch 2 - acpi/apei/ghes: Use raw_spinlock_t for CXL CPER work locks
Convert cxl_cper_work_lock and cxl_cper_prot_err_work_lock from spinlock_t
to raw_spinlock_t to avoid sleeping-in-hardirq deadlock on PREEMPT_RT kernels.
Patch 3 - cxl: Tighten CPER kfifo registration API and symbol visibility
Replace EXPORT_SYMBOL_NS_GPL() with EXPORT_SYMBOL_FOR_MODULES() for CPER
kfifo helpers. Simplify register/unregister return types to void.
Patch 4 - cxl: Rename find_cxl_port() to find_cxl_port_by_dport()
Renames find_cxl_port() to find_cxl_port_by_dport() to make the lookup
method explicit and consistent with the existing find_cxl_port_by_uport().
Patch 5 - PCI/AER: Introduce AER-CXL protocol error kfifo
Adds the AER-CXL kfifo in drivers/pci/pcie/aer_cxl_vh.c along with the
producer helper cxl_forward_error() and the consumer registration helpers
cxl_register_proto_err_work() and cxl_unregister_proto_err_work(). The
kfifo delivers CXL VH protocol errors from the AER driver to cxl_core.
Patch 6 - PCI: Establish common CXL Port protocol error flow
Dequeues work from the AER-CXL kfifo and establishes a common flow for all
CXL Port protocol error handling. Panics on any uncorrectable CXL RAS
error. The producer dispatch and consumer go live atomically.
Patch 7 - PCI/CXL: Add RCH support to CXL handlers
Folds Restricted CXL Host (RCH) error handling into the common Port flow. An
RCD uncorrectable CXL RAS error now panics, matching the policy applied to
all other CXL devices.
Patch 8 - cxl/pci: Thread port and dport through RAS handling helpers
Refactors cxl_handle_ras() and cxl_handle_cor_ras() to accept struct
cxl_port * and struct cxl_dport * directly, eliminating redundant bus walks on
the error path.
Patch 9 - cxl: Update CXL Endpoint AER handler
Replaces cxl_error_detected() with cxl_pci_error_detected(). Reads CXL RAS
unconditionally; panics on UCE regardless of channel state.
Patch 10 - cxl: Add port and dport identifiers to CXL AER trace events
Passes struct cxl_port * and struct cxl_dport * to trace events. Adds new
"port" and "dport" string fields for all CXL device classes.
Patch 11 - PCI: Cache PCI DSN into pci_dev->dsn during probe
Caches the PCI Device Serial Number at probe time so error handlers and
panic paths avoid live config-space reads.
Patch 12 - PCI/CXL: Mask/Unmask CXL protocol errors
Enables CXL Internal Error reporting on CXL Ports and Endpoints. The unmask
is paired with RAS register block mapping; the mask is registered as a devres
action.
Patch 13 - Documentation: cxl: Document CXL protocol error handling
Adds protocol-error-handling.rst describing the end-to-end CXL protocol
error path.
== Notes ==
- @Bjorn, I kindly request your review for the following patches. Many
of the changes are to CXL-specific files in the PCI tree:
Patch 5 - PCI/AER: Introduce AER-CXL protocol error kfifo
Patch 6 - PCI: Establish common CXL Port protocol error flow
Patch 7 - PCI/CXL: Add RCH support to CXL handlers
Patch 11 - PCI: Cache PCI DSN into pci_dev->dsn during probe
Patch 12 - PCI/CXL: Mask/Unmask CXL protocol errors
- USP/EP fatal UCE follows the AER path because of how the AER core collects
status. aer_get_device_error_info() only reads PCI_ERR_UNCOR_STATUS for
Root Ports/RCECs/Downstream Ports or non-fatal severities, where config
reads to the source are still expected to succeed. For a fatal UCE
signaled by an upstream component, config reads to that device are
expected to fail, so UNCOR_STATUS is never retrieved. Without the status
word, is_cxl_error() cannot classify the event as CXL and the AER path
handles it.
- Dan's related series addressing RAS setup has more details:
https://lore.kernel.org/linux-cxl/20260131000403.2135324-1-dan.j.williams@intel.com/
- TODOs for future series:
- Move aer_cxl_rch.c to cxl/core/ras_rch.c
- Move RCH traversing for handling from AER driver into CXL driver
- Support user-defined status masks
- Add CXL Port traversing in cxl_do_recovery()
== Testing ==
Testing included the following:
- cxl-test
- RCH/RCD AER error injection
- CPER GHES (firmware first)
- VH AER error injection
** The AER error injection is not included in this series but will be posted
as an RFC for review and for others to use. The error injection using AER
will be posted separately as ("cxl: Device protocol AER injection").
Below are the testing results.
=== cxl_test ===
The cxl_test CXL testsuite passed on QEMU with no issues.
This required changes in patch 12 ("PCI/CXL: Mask/Unmask CXL protocol errors").
__wrap_devm_cxl_dport_rch_ras_setup() is introduced to prevent cxl_test from
trying to map the RCH AER/RAS registers.
=== CPER Tests ===
CPER/firmware first error injection was run and passed on real HW using AMD
RAS tool for protocol error injection at the CXL Root Port.
==== Restricted CXL Host (RCH) ====
Error injection tests for RCH devices were run using CXL2.0 Endpoint that enumerate
as a RCiEP.
echo "0000:7f:00.0 CE 00000000 00000002 RCH" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:40:00.3: aer_inject: Injecting errors 00004000/00000000 into device 0000:40:00.3
pcieport 0000:40:00.3: AER: Correctable error message received from 0000:40:00.3
pcieport 0000:40:00.3: PCIe Bus Error: severity=Correctable, type=Transaction Layer, (Receiver ID)
pcieport 0000:40:00.3: device [1022:14a6] error status/mask=00004000/00002000
pcieport 0000:40:00.3: [14] CorrIntErr
cxl_aer_correctable_error: memdev= port=root0 dport=pci0000:7f host=ACPI0017:00 serial=0: status: 'Memory Data ECC Error'
echo "0000:7f:00.0 UCE 00000000 00000002 RCH" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:40:00.3: aer_inject: Injecting errors 00000000/00400000 into device 0000:40:00.3
pcieport 0000:40:00.3: AER: Uncorrectable (Non-Fatal) error message received from 0000:40:00.3
pcieport 0000:40:00.3: PCIe Bus Error: severity=Uncorrectable (Non-Fatal), type=Transaction Layer, (Receiver ID)
pcieport 0000:40:00.3: device [1022:14a6] error status/mask=00400000/00000000
pcieport 0000:40:00.3: [22] UncorrIntErr
cxl_aer_uncorrectable_error: memdev= port=root0 dport=pci0000:7f host=ACPI0017:00 serial=0: status: 'Cache Address Parity Error' first_error: 'Cache Address Parity Error'
Kernel panic - not syncing: CXL cachemem error
CPU: 26 UID: 0 PID: 396 Comm: kworker/26:1 Kdump: loaded Not tainted 7.2.0-rc3-tb-00014-g6346be30306a #1363 PREEMPT(lazy)
Hardware name: AMD Corporation ONYX/ONYX, BIOS TOX100HB 12/03/2025
Workqueue: events cxl_proto_err_work_fn [cxl_core]
Call Trace:
<TASK>
vpanic+0x453/0x4b0
panic+0x56/0x60
cxl_do_recovery+0x66/0x70 [cxl_core]
cxl_handle_rdport_errors+0x176/0x190 [cxl_core]
? srso_alias_return_thunk+0x5/0xfbef5
? update_load_avg+0x5c/0x2b0
? srso_alias_return_thunk+0x5/0xfbef5
? dequeue_entities+0x160/0xb40
? srso_alias_return_thunk+0x5/0xfbef5
? pick_task_fair+0x164/0x670
? __pfx___cxl_proto_err_work_fn+0x10/0x10 [cxl_core]
__cxl_proto_err_work_fn+0xea/0x1b0 [cxl_core]
? __pfx___cxl_proto_err_work_fn+0x10/0x10 [cxl_core]
for_each_cxl_proto_err+0x5a/0x80
cxl_proto_err_work_fn+0x26/0x50 [cxl_core]
process_one_work+0x16e/0x3a0
worker_thread+0x172/0x2e0
? __pfx_worker_thread+0x10/0x10
kthread+0xe5/0x120
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1bd/0x220
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
</TASK>
==== Restricted CXL Device (RCD) ====
Error injection tests for RCD devices were run using CXL2.0 Endpoint that enumerate
as a RCiEP.
echo "0000:7f:00.0 CE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:40:00.3: aer_inject: Injecting errors 00004000/00000000 into device 0000:40:00.3
pcieport 0000:40:00.3: AER: Correctable error message received from 0000:40:00.3
pcieport 0000:40:00.3: PCIe Bus Error: severity=Correctable, type=Transaction Layer, (Receiver ID)
pcieport 0000:40:00.3: device [1022:14a6] error status/mask=00004000/00002000
pcieport 0000:40:00.3: [14] CorrIntErr
cxl_aer_correctable_error: memdev=mem0 port=endpoint1 dport= host=0000:7f:00.0 serial=0: status: 'Memory Data ECC Error'
echo "0000:7f:00.0 UCE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:40:00.3: aer_inject: Injecting errors 00000000/00400000 into device 0000:40:00.3
pcieport 0000:40:00.3: AER: Uncorrectable (Non-Fatal) error message received from 0000:40:00.3
pcieport 0000:40:00.3: PCIe Bus Error: severity=Uncorrectable (Non-Fatal), type=Transaction Layer, (Receiver ID)
pcieport 0000:40:00.3: device [1022:14a6] error status/mask=00400000/00000000
pcieport 0000:40:00.3: [22] UncorrIntErr
cxl_aer_uncorrectable_error: memdev=mem0 port=endpoint1 dport= host=0000:7f:00.0 serial=0: status: 'Cache Address Parity Error' first_error: 'Cache Address Parity Error'
Kernel panic - not syncing: CXL cachemem error
CPU: 26 UID: 0 PID: 394 Comm: kworker/26:1 Kdump: loaded Not tainted 7.2.0-rc3-tb-00014-g6346be30306a #1363 PREEMPT(lazy)
Hardware name: AMD Corporation ONYX/ONYX, BIOS TOX100HB 12/03/2025
Workqueue: events cxl_proto_err_work_fn [cxl_core]
Call Trace:
<TASK>
vpanic+0x453/0x4b0
panic+0x56/0x60
cxl_do_recovery+0x66/0x70 [cxl_core]
__cxl_proto_err_work_fn+0xa0/0x1b0 [cxl_core]
? __pfx___cxl_proto_err_work_fn+0x10/0x10 [cxl_core]
for_each_cxl_proto_err+0x5a/0x80
cxl_proto_err_work_fn+0x26/0x50 [cxl_core]
process_one_work+0x16e/0x3a0
worker_thread+0x172/0x2e0
? __pfx_worker_thread+0x10/0x10
kthread+0xe5/0x120
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1bd/0x220
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
</TASK>
=== Virtual Hierarchy ===
Below are the VH error injection test results using QEMU with CXL AER error
injection via /sys/kernel/debug/cxl/aer_einj_inject on kernel 7.2.0-rc3 based
kernel.
The below QEMU testing uses a CXL Root Port, a CXL Upstream Switch Port, a
CXL Downstream Switch Port, and a CXL Type3 Endpoint as given below.
The sub-topology for the QEMU testing is:
---------------------
| CXL RP - 0C:00.0 |
---------------------
|
---------------------
| CXL USP - 0D:00.0 |
---------------------
|
--------------------
| CXL DSP - 0E:00.0 |
--------------------
|
---------------------
| CXL EP - 0F:00.0 |
---------------------
Error Injection Test Results Summary:
| # | Device Type | BDF | Test | Result | AER | RAS | Verdict |
|---|------------------|---------|------|-----------|-----|-----|------------------|
| 1 | Root Port | 0c:00.0 | CE | Recovered | OK | OK | PASS |
| 2 | Root Port | 0c:00.0 | UCE | Panic | OK | OK | PASS |
| 3 | Upstream Port | 0d:00.0 | CE | Recovered | OK | OK | PASS |
| 4 | Upstream Port | 0d:00.0 | UCE | Recovered | OK | -- | PASS (Known Lim) |
| 5 | Downstream Port | 0e:00.0 | CE | Recovered | OK | OK | PASS |
| 6 | Downstream Port | 0e:00.0 | UCE | Panic | OK | OK | PASS |
| 7 | Endpoint | 0f:00.0 | CE | Recovered | OK | OK | PASS |
| 8 | Endpoint | 0f:00.0 | UCE | Panic | OK | OK | PASS |
Overall: 8/8 PASS
=== Root Port - CE ===
echo "0000:0c:00.0 CE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00004000/00000000 into device 0000:0c:00.0
pcieport 0000:0c:00.0: AER: Correctable error message received from 0000:0c:00.0
pcieport 0000:0c:00.0: CXL Bus Error: severity=Correctable, type=Transaction Layer, (Receiver ID)
pcieport 0000:0c:00.0: device [8086:7075] error status/mask=00004000/0000a000
pcieport 0000:0c:00.0: [14] CorrIntErr
cxl_aer_correctable_error: memdev= port=port1 dport=0000:0c:00.0 host=pci0000:0c serial=0: status: 'Memory Data ECC Error'
=== Root Port - UCE ===
echo "0000:0c:00.0 UCE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00000000/00400000 into device 0000:0c:00.0
pcieport 0000:0c:00.0: AER: Uncorrectable (Fatal) error message received from 0000:0c:00.0
pcieport 0000:0c:00.0: CXL Bus Error: severity=Uncorrectable (Fatal), type=Transaction Layer, (Receiver ID)
pcieport 0000:0c:00.0: device [8086:7075] error status/mask=00400000/02000000
pcieport 0000:0c:00.0: [22] UncorrIntErr
cxl_aer_uncorrectable_error: memdev= port=port1 dport=0000:0c:00.0 host=pci0000:0c serial=0: status: 'Cache Address Parity Error' first_error: 'Cache Address Parity Error'
Kernel panic - not syncing: CXL cachemem error
CPU: 58 UID: 0 PID: 409 Comm: kworker/58:1 Not tainted 7.2.0-rc3-tb-00014-g23418142f421 #1291 PREEMPT(lazy)
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
Workqueue: events cxl_proto_err_work_fn [cxl_core]
Call Trace:
<TASK>
vpanic+0x453/0x4b0
panic+0x56/0x60
cxl_do_recovery+0x66/0x70 [cxl_core]
__cxl_proto_err_work_fn+0x9e/0x1b0 [cxl_core]
? __pfx___cxl_proto_err_work_fn+0x10/0x10 [cxl_core]
for_each_cxl_proto_err+0x5a/0x80
cxl_proto_err_work_fn+0x26/0x50 [cxl_core]
process_one_work+0x16e/0x3a0
worker_thread+0x172/0x2e0
? __pfx_worker_thread+0x10/0x10
kthread+0xe5/0x120
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1bd/0x220
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
</TASK>
Kernel Offset: disabled
---[ end Kernel panic - not syncing: CXL cachemem error ]---
=== Upstream Switch Port - CE ===
echo "0000:0d:00.0 CE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00004000/00000000 into device 0000:0d:00.0
pcieport 0000:0c:00.0: AER: Correctable error message received from 0000:0d:00.0
pcieport 0000:0d:00.0: CXL Bus Error: severity=Correctable, type=Transaction Layer, (Receiver ID)
pcieport 0000:0d:00.0: device [19e5:a128] error status/mask=00004000/0000a000
pcieport 0000:0d:00.0: [14] CorrIntErr
cxl_aer_correctable_error: memdev= port=port2 dport= host=0000:0d:00.0 serial=0: status: 'Memory Data ECC Error'
=== Upstream Switch Port - UCE (fatal - AER recovery, known limitation) ===
echo "0000:0d:00.0 UCE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00000000/00400000 into device 0000:0d:00.0
pcieport 0000:0c:00.0: AER: Uncorrectable (Fatal) error message received from 0000:0d:00.0
pcieport 0000:0d:00.0: AER: CXL Bus Error: severity=Uncorrectable (Fatal), type=Inaccessible, (Unregistered Agent ID)
cxl_pci 0000:0f:00.0: mem0: frozen state error detected, disable CXL.mem
pcieport 0000:0c:00.0: AER: Root Port link has been reset (0)
cxl_pci 0000:0f:00.0: mem0: restart CXL.mem after slot reset
cxl_pci 0000:0f:00.0: mem0: error resume successful
pcieport 0000:0c:00.0: AER: device recovery successful
=== Downstream Port - CE ===
echo "0000:0e:00.0 CE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00004000/00000000 into device 0000:0e:00.0
pcieport 0000:0c:00.0: AER: Correctable error message received from 0000:0e:00.0
pcieport 0000:0e:00.0: CXL Bus Error: severity=Correctable, type=Transaction Layer, (Receiver ID)
pcieport 0000:0e:00.0: device [19e5:a129] error status/mask=00004000/0000a000
pcieport 0000:0e:00.0: [14] CorrIntErr
cxl_aer_correctable_error: memdev= port=port2 dport=0000:0e:00.0 host=0000:0d:00.0 serial=0: status: 'Memory Data ECC Error'
=== Downstream Port - UCE ===
echo "0000:0e:00.0 UCE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00000000/00400000 into device 0000:0e:00.0
pcieport 0000:0c:00.0: AER: Uncorrectable (Fatal) error message received from 0000:0e:00.0
pcieport 0000:0e:00.0: CXL Bus Error: severity=Uncorrectable (Fatal), type=Transaction Layer, (Receiver ID)
pcieport 0000:0e:00.0: device [19e5:a129] error status/mask=00400000/02000000
pcieport 0000:0e:00.0: [22] UncorrIntErr
cxl_aer_uncorrectable_error: memdev= port=port2 dport=0000:0e:00.0 host=0000:0d:00.0 serial=0: status: 'Cache Address Parity Error' first_error: 'Cache Address Parity Error'
Kernel panic - not syncing: CXL cachemem error
CPU: 7 UID: 0 PID: 299 Comm: kworker/7:1 Not tainted 7.2.0-rc3-tb-00014-g832c50e87f10 #1364 PREEMPT(lazy)
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
Workqueue: events cxl_proto_err_work_fn [cxl_core]
Call Trace:
<TASK>
vpanic+0x453/0x4b0
panic+0x56/0x60
cxl_do_recovery+0x66/0x70 [cxl_core]
__cxl_proto_err_work_fn+0xa0/0x1b0 [cxl_core]
? __pfx___cxl_proto_err_work_fn+0x10/0x10 [cxl_core]
for_each_cxl_proto_err+0x5a/0x80
cxl_proto_err_work_fn+0x26/0x50 [cxl_core]
process_one_work+0x16e/0x3a0
worker_thread+0x172/0x2e0
? __pfx_worker_thread+0x10/0x10
kthread+0xe5/0x120
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1bd/0x220
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
</TASK>
Kernel Offset: disabled
---[ end Kernel panic - not syncing: CXL cachemem error ]---
=== Endpoint - CE ===
echo "0000:0f:00.0 CE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00004000/00000000 into device 0000:0f:00.0
pcieport 0000:0c:00.0: AER: Correctable error message received from 0000:0f:00.0
cxl_pci 0000:0f:00.0: CXL Bus Error: severity=Correctable, type=Transaction Layer, (Receiver ID)
cxl_pci 0000:0f:00.0: device [8086:0d93] error status/mask=00004000/0000a000
cxl_pci 0000:0f:00.0: [14] CorrIntErr
cxl_aer_correctable_error: memdev=mem1 port=endpoint4 dport= host=0000:0f:00.0 serial=0: status: 'Memory Data ECC Error'
=== Endpoint - UCE ===
echo "0000:0f:00.0 UCE 00000000 00000002" > /sys/kernel/debug/cxl/aer_einj_inject
pcieport 0000:0c:00.0: aer_inject: Injecting errors 00000000/00400000 into device 0000:0f:00.0
pcieport 0000:0c:00.0: AER: Uncorrectable (Fatal) error message received from 0000:0f:00.0
cxl_pci 0000:0f:00.0: AER: CXL Bus Error: severity=Uncorrectable (Fatal), type=Inaccessible, (Unregistered Agent ID)
cxl_aer_uncorrectable_error: memdev=mem1 port=endpoint4 dport= host=0000:0f:00.0 serial=0: status: 'Cache Address Parity Error' first_error: 'Cache Address Parity Error'
Kernel panic - not syncing: CXL cachemem error
CPU: 58 UID: 0 PID: 430 Comm: irq/24-aerdrv Not tainted 7.2.0-rc3-tb-00014-g23418142f421 #1291 PREEMPT(lazy)
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
Call Trace:
<TASK>
vpanic+0x453/0x4b0
panic+0x56/0x60
cxl_pci_error_detected+0x15c/0x160 [cxl_core]
report_error_detected+0xc7/0x1c0
? __pfx_report_frozen_detected+0x10/0x10
__pci_walk_bus+0x47/0x70
? __pfx_report_frozen_detected+0x10/0x10
pci_walk_bus+0x2c/0x40
? __pfx_aer_root_reset+0x10/0x10
pcie_do_recovery+0x234/0x330
? __pfx_irq_thread_fn+0x10/0x10
aer_isr_one_error_type+0x333/0x340
aer_isr_one_error+0x112/0x140
aer_isr+0x47/0x80
irq_thread_fn+0x1f/0x60
irq_thread+0x123/0x220
? __pfx_irq_thread_dtor+0x10/0x10
? __pfx_irq_thread+0x10/0x10
kthread+0xe5/0x120
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1bd/0x220
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
</TASK>
Kernel Offset: disabled
---[ end Kernel panic - not syncing: CXL cachemem error ]---
== Changes ==
Changes in v17->v18:
acpi/apei/ghes: Use raw_spinlock_t for CXL CPER work locks
- New commit
- Convert cxl_cper_work_lock and cxl_cper_prot_err_work_lock from
spinlock_t to raw_spinlock_t; use guard(raw_spinlock_irqsave) at
all call sites to avoid sleeping-in-hardirq on PREEMPT_RT.
- Add kfifo_reset(&cxl_cper_fifo) to cxl_cper_unregister_work()
- Add WARN_ONCE to cxl_cper_register_work() for double-registration consistency
- Fix cxl_cper_unregister_work() to clear global pointer before cancel_work_sync()
- Remove redundant cancel_work_sync() from cxl_ras_exit()
cxl: Tighten CPER kfifo registration API and symbol visibility
- New commit (split/rework of v17 "Limit CXL-CPER kfifo registration functions scope")
cxl: Rename find_cxl_port() to find_cxl_port_by_dport()
- None
PCI/AER: Introduce AER-CXL protocol error kfifo
- Remove correctable status clear from cxl_forward_error(); the AER core
clears all status bits via pci_aer_handle_error() info->status writeback
- Schedule consumer on kfifo overflow so existing entries can be drained
PCI: Establish common CXL Port protocol error flow
- Fix handle_error_source() to call pci_aer_handle_error() unconditionally
so AER handling always runs after cxl_forward_error()
- Add cxl_proto_err_flush() call for CXL UCE to drain kfifo before AER
recovery tears down the device
- Fix NULL dereference of dport->dport_dev in cxl_handle_cor_ras() and
cxl_handle_ras() for UPSTREAM/ENDPOINT port types: use dport->dport_dev
when dport is non-NULL, else fall back to port->uport_dev
- Remove duplicate pcie_clear_device_status() call from
cxl_handle_proto_error() CE path; pci_aer_handle_error() already clears it
- Clarify panic policy: panic only on confirmed UCE via RAS status read
- Document kfifo consumer serialization against driver unbind via
guard(device)(&port->dev) and port->dev.driver check
PCI/CXL: Add RCH support to CXL handlers
- Pass &pdev->dev instead of dport->port->uport_dev in
cxl_handle_rdport_errors() to avoid dropping RCH trace events.
- Document trace event attribution change.
- Document removal of cxl_cor_error_detected() and cxlds->rcd branches.
- Capitalize Endpoint per PCI spec convention.
- Use to_ras_base() in cxl_handle_rdport_errors() to centralize RAS base
address lookup in preparation for error injection testing.
cxl/pci: Thread port and dport through RAS handling helpers
- New commit
cxl: Update CXL Endpoint AER handler
- Fix cxl_pci_error_detected() to use find_cxl_port_by_uport() and port->uport_dev
- Read CXL RAS unconditionally; panic on UCE regardless of channel state
- Document unconditional read policy and 0xFFFFFFFF behavior in comment
cxl: Add port and dport identifiers to CXL AER trace events
- Consolidate double find_cxl_port_by_dev() in cxl_cper_handle_prot_err()
- Add comment noting dport is NULL for endpoint and upstream port devices
PCI: Cache PCI DSN into pci_dev->dsn during probe
- New commit
PCI/CXL: Mask/Unmask CXL protocol errors
- Make cxl_unmask_proto_interrupts() and cxl_mask_proto_interrupts() static
- Remove dev_is_pci() guard from devm_cxl_dport_rch_ras_setup(); the guard
blocked real RCH hardware because pci_host_bridge is not on pci_bus_type
Documentation: cxl: Document CXL protocol error handling
- Simplify document for readability (Jonathan)
- Drop historical context that goes stale (Jonathan)
- Shorten ASCII flow diagram (Jonathan)
- Drop manual backtick markup, use automarkup (Jonathan)
- Clarify USP/DSP as single switch component (Dave)
- Fix line wrapping to 80 chars (Jonathan)
Changes in v16->v17:
PCI/AER: Introduce AER-CXL Kfifo
- Reword "kfifo semaphore" to "kfifo spinlock" to match fifo_lock.
- Defer the handle_error_source() is_cxl_error() switch to the patch that
registers the kfifo consumer to keep each commit bisect-safe.
- Rename rwsema to rwsem
- Change CPER exports to use EXPORT_SYMBOL_FOR_MODULES.
- Add work cancel function.
- Replace kfifo_put() with kfifo_in_spinlocked() for multiple producers
- Add fifo_lock spinlock for concurrent producer serialisation
- Initialize the embedded kfifo with INIT_KFIFO() in a subsys_initcall so
kfifo->mask, ->esize and ->data are set before first use.
- Clear PCI_ERR_COR_STATUS in cxl_forward_error() before enqueue so the
device is acked for correctable events even when the consumer drops the
event. Uncorrectable status is left for cxl_do_recovery() to clear after
recovery completes, mirroring the AER core convention.
- WARN on double-registration in cxl_register_proto_err_work() to make an
unintended second consumer visible at runtime.
- Add direct rwsem.h, cleanup.h and workqueue.h includes for symbols used
in aer_cxl_vh.c
- Add MAINTAINERS entries for drivers/pci/pcie/aer_cxl_*.c
- Update message
cxl/ras: Unify Endpoint and Port AER trace events
- Replace cxlds->serial with pci_get_dsn()
- Change 'memdev' to 'device' (Dan)
- Updated Commit message
cxl: Use common CPER handling for all CXL devices
- New commit
cxl: Rename find_cxl_port() to find_cxl_port_by_dport()
- New commit
- Drop the de-staticisation of find_cxl_port_by_uport() and the
core.h declarations from this prep patch; both move to the patch
that introduces the first cross-file caller.
cxl: Limit CXL-CPER kfifo registration functions scope
- Split from v16 02/10 ("Update unregistration for AER-CXL and
CPER-CXL kfifos"); AER-CXL half folded into v17 01/10.
- Convert exports to EXPORT_SYMBOL_FOR_MODULES("cxl_core").
- Change register/unregister return type from int to void.
- Drop work_struct argument from cxl_cper_unregister_prot_err_work();
it now cancels its own work.
- Remove now-redundant cancel_work_sync() from cxl_ras_exit().
- Add WARN_ONCE() in cxl_cper_register_prot_err_work() for
double-registration.
PCI: Establish common CXL Port protocol error flow
- get_cxl_port() -> find_cxl_port_by_dev()
- Simplified find_cxl_port_by_dev()
- Replace and remove cxl_serial_number() w/ pci_get_dsn()
- cxl_get_ras_base() -> to_ras_base()
- Drop dependency on PCI_ERS_RESULT_PANIC; cxl_do_recovery() panics
directly. (PANIC enum patch dropped from series.)
- Clarify panic semantics: panic on any uncorrectable CXL RAS error, not
only AER-FATAL severities.
- Drop the redundant PCI_ERR_COR_STATUS RMW in cxl_handle_proto_error();
cxl_forward_error() already acks the correctable AER status.
- Add is_cxl_error() switch in handle_error_source() here, paired with the
kfifo consumer registration, to keep each commit bisect-safe.
- Drop pcie_aer_is_native() guard in cxl_do_recovery() (always native).
- Swap order with the "Limit" patch for bisectability w/ cxl_ras_exit()
- Reword for "any uncorrectable" CXL RAS error panics.
- Restore log messages for port-not-found and port-unbound cases.
- Whitespace cleanup (Jonathan)
- Update to get_cxl_port() documentation (Terry)
- Fix __cxl_proto_err_work_fn() to return 0 for transient errors.
- Drop !port check in cxl_do_recovery(), caller already validated
- Fix kerneldoc @pdev -> @dev in find_cxl_port_by_dev()
- Fix missing space in pr_err_ratelimited()
- Add disconnect check before access
- Made pcie_clear_device_status() and pci_aer_clear_fatal_status()
EXPORT_SYMBOL_FOR_MODULES("cxl_core") (Dan)
- Move find_cxl_port_by_dport() and find_cxl_port_by_uport()
de-staticisation and core.h declarations from the rename patch to
here, where the first cross-file callers in find_cxl_port_by_dev()
land.
PCI/CXL: Add RCH support to CXL handlers
- Drop now-dead cxlds->rcd branches from cxl_{cor_,}error_detected().
- Drop duplicate subject line from commit body.
- Document panic-on-uncorrectable behavior change for RCD path.
- Document trace event device-name change (memN -> PCI BDF) for RCH path.
- Rewrite cxl_handle_proto_error() RC_END comment to clarify RCD/RCH shared
interrupt relationship
- Rewrite commit message
cxl: Remove Endpoint AER correctable handler
- Update commit message
- Add Reviewed-by from Jonathan and DaveJ
cxl: Update Endpoint AER uncorrectable handler
- Rename pci_error_handlers struct instance to cxl_pci_error_handlers to
avoid shadowing the struct type tag.
- Restore scoped_guard(device) and dev->driver check around AER read.
- NULL-check find_cxl_port_by_dev() before deref of port->uport_dev.
- Updated commit message. (Terry)
- Add scope cleanup for port variable in cxl_pci_error_detected() (Terry)
- Drop cxl_uncor_aer_present(), rely on AER state
PCI/CXL: Mask/Unmask CXL protocol errors
- Drop redundant cxl_mask_proto_interrupts() calls from unregister_port()
and cxl_dport_remove(); the devres action registered alongside the unmask
is the sole mask path.
- Update title
- Remove unnecessary check for aer_capabilities
- Gate cxl_unmask_proto_interrupts() on pcie_aer_is_native()
- Add pci_aer_mask_internal_errors() and cxl_mask_proto_interrupts()
- Only unmask on successful cxl_map_component_regs()
- NULL-check @dev in cxl_{un,}mask_proto_interrupts()
- Drop static and declare in core/core.h
Documentation: cxl: Document CXL protocol error handling
- New commit
Changes in v15->v16:
PCI/AER: Introduce AER-CXL Kfifo
- Add pci_dev_put() and comment at pci_dev_get() (Dan)
- /rw_sema/rwsema/ (Dan)
- Split validation checks in cxl_forward_error() to allow
for meaningful reason in log (Terry)
- Shortened commit title to remove wordiness (Terry)
PCI/CXL: Update unregistration for AER-CXL and CPER-CXL kfifos
- New commit
cxl: Update CXL Endpoint tracing
- Add Dan's review-by
- Incorporate Dan's comment into commit message:
"Add the serial number at the end to preserve compatibility with
libtraceevent parsing of the parameters."
PCI/ERR: Introduce PCI_ERS_RESULT_PANIC
- None
PCI: Establish common CXL Port protocol error flow
- get_ras_base(), initialize dport to NULL (Jonathan)
- Remove guard(device)(&cxlmd->dev) (Jonathan)
- Fix dev_warns() (Jonathan)
- Remove comment in cxl_port_error_detected() (Dan)
- Made pcie_clear_device_status() and pci_aer_clear_fatal_status()
"CXL" Export namespace (Dan)
- Update switch-case brackets to follow clang-format (Dan)
- Add PCI_EXP_TYPE_RC_END for cxl_get_ras_base() (Terry)
- Add NULL port check in cxl_serial_number() (Terry)
PCI/CXL: Add RCH support to CXL handlers
- New commit
cxl: Update error handlers to support CXL Port devices
- None
cxl: Update Endpoint AER uncorrectable handler
- Update commit message (DaveJ)
- s/cxl_handle_aer()/cxl_uncor_aer_present()/g (Jonathan)
- cxl_uncor_aer_present(): Leave original result calculation based on
if a UCE is present and the provided state (Terry)
- Add call to pci_print_aer(). AER fails to log because is upstream
link (Terry)
cxl: Remove Endpoint AER correctable handler
- None
cxl: Enable CXL protocol error reporting
- None
Changes in v14->v15:
PCI/AER: Introduce AER-CXL Kfifo in new file, pcie/aer_cxl_vh.c
- Move pci_dev_get() call to this patch (Dave)
cxl: Update CXL Endpoint tracing
- Update commit message
- Moved cxl_handle_ras/cxl_handle_cor_ras() changes to future patch (Terry)
PCI/ERR: Introduce PCI_ERS_RESULT_PANIC
- None
PCI/AER: Dequeue forwarded CXL error
- Move pci_dev_get() to cxl_forward_error() (Dave)
- Move in is_cxl_error() change from later patch (Terry)
PCI: Establish common CXL Port protocol error flow
- Update commit message and title. Added Bjorn's ack.
- Move CE and UCE handling logic here (Terry)
cxl: Update error handlers to support CXL Port protocol errors
- New commit (Terry)
cxl: Update Endpoint AER uncorrectable handler
- Title update (Terry)
- Change cxl_pci_error-detected() to handle & log AER (Terry)
- Update commit message (Terry)
- Moved cxl_handle_ras()/cxl_handle_cor_ras() to earlier patch (Terry)
cxl: Remove Endpoint AER correctable handler
- Remove cxl_pci_cor_error_detected(). Is not needed. AER is logged
in the AER driver. (Dan)
- Update commit message
Changes in v13->v14:
PCI: Move CXL DVSEC definitions into uapi/linux/pci_regs.h
- Add Jonathan's and Dan's review-by
- Update commit title prefix (Bjorn)
- Revert format fix for cxl_sbr_masked() (Jonathan)
- Update 'Compute Express Link' comment block (Jonathan)
- Move PCI_DVSEC_CXL_FLEXBUS definitions to later patch where
used (Jonathan)
- Removed stray change (Bjorn)
PCI: Update CXL DVSEC definitions
- New patch. Split from previous patch such that there is now a separate
move patch and a format fix patch.
- Formatting update requested (Bjorn)
- Remove PCI_DVSEC_HEADER1_LENGTH_MASK because it duplicates
PCI_DVSEC_HEADER1_LEN() (Bjorn)
- Add Dan's review-by
PCI: Introduce pcie_is_cxl()
- Move FLEXBUS_STATUS DVSEC here (Jonathan)
- Remove check for EP and USP (Dan)
- Update commit message (Bjorn)
- Fix writing past 80 columns (Bjorn)
- Add pci_is_pcie() parent bridge check at beginning of function (Bjorn)
PCI: Replace cxl_error_is_native() with pcie_aer_is_native()
- New commit
cxl/pci: Move CXL driver's RCH error handling into core/ras_rch.c
- Add sign-off for Dan and Jonathan
- Revert inadvertent formatting of cxl_dport_map_rch_aer() (Jonathan)
- Remove default value for CXL_RCH_RAS (Dan)
- Remove unnecessary pci.h include in core.h & ras_rch.c (Jonathan)
- Add linux/types.h include in ras_rch.c (Jonathan)
- Change CONFIG_CXL_RCH_RAS -> CONFIG_CXL_RAS (Dan)
PCI/AER: Export pci_aer_unmask_internal_errors
- New commit. Bjorn requested separating out and adding immediatetly
before being used. This is called from cxl_rch_enable_rcec() in
following patch.
PCI/AER: Update is_internal_error() to be non-static is_aer_internal_error()
- New commit
PCI/AER: Move CXL RCH error handling to aer_cxl_rch.c
- Add review-by and signed-off for Dan
- Commit message fixup (Dan)
- Update commit message with use-case description (Dan, Lukas)
- Make cxl_error_is_native() static (Dan)
- Make is_internal_error() non-static, non-export (Terry)
PCI/AER: Use guard() in cxl_rch_handle_error_iter()
- Add review-by for Jonathan, Dave Jiang, Dan WIlliams, and Bjorn
- Remove cleanup.h (Jonathan)
- Reverted comment removal (Bjorn)
- Move this patch after pci/pcie/aer_cxl_rch.c creation (Bjorn)
PCI/AER: Replace PCIEAER_CXL symbol with CXL_RAS
- New commit
PCI/AER: Report CXL or PCIe bus type in AER trace logging
- Merged with Dan's commit. Changes are moving bus_type the last
parameter in function calls (Dan)
- Removed all DCOs because of changes (Terry)
- Update commit message (Bjorn)
- Add Bjorn's ack-by
PCI/AER: Update struct aer_err_info with kernel-doc formatting
- New commit
cxl/mem: Clarify @host for devm_cxl_add_nvdimm()
- New commit
cxl/port: Remove "enumerate dports" helpers
- New commit
cxl/port: Fix devm resource leaks around with dport management
- New commit
cxl/port: Move dport operations to a driver event
- New commit
cxl/port: Move dport RAS reporting to a port resource
- New commit
cxl: Map CXL Endpoint Port and CXL Switch Port RAS registers
- Correct message spelling (Terry)
cxl/port: Move endpoint component register management to cxl_port
- Correct message spelling (Terry)
cxl/port: Map Port component registers before switchport init
- Updates to use cxl_port_setup_regs() (Dan)
cxl: Change CXL handlers to use guard() instead of scoped_guard()
- Add reviewed-by for Jonathan and Dave Jiang
PCI/ERR: Introduce PCI_ERS_RESULT_PANIC
- Add review-by for Dan
- Update Title prefix (Bjorn)
- Removed merge_result. Only logging error for device reporting the
error (Dan)
- Remove PCI_ERS_RESULT_PANIC paragraph in pci-error-recovery.rst (Bjorn)
PCI/AER: Move AER driver's CXL VH handling to pcie/aer_cxl_vh.c
- Replaced workqueue_types.h include with 'struct work_struct'
predeclaration (Bjorn)
- Update error message (Bjorn)
- Reordered 'struct cxl_proto_err_work_data' (Bjorn)
- Remove export of cxl_error_is_native() here (Bjorn)
cxl/port: Unify endpoint and switch port lookup
- New patch
PCI/AER: Dequeue forwarded CXL error
- Update commit title's prefix (Bjorn)
- Add pdev ref get in AER driver before enqueue and add pdev ref put in
CXL driver after dequeue and handling (Dan)
- Removed handling to simplify patch context (Terry)
PCI: Introduce CXL Port protocol error handlers
- Add Dave Jiang's review-by
- Update commit message & headline (Bjorn)
- Refactor cxl_port_error_detected()/cxl_port_cor_error_detected() to
one line (Jonathan)
- Remove cxl_walk_port(). Only log the erroring device. No port walking. (Dan)
- Remove cxl_pci_drv_bound(). Check for 'is_cxl' parent port is
sufficient (Dan)
- Remove device_lock_if()
- Combine CE and UCE here (Terry)
cxl: Update Endpoint uncorrectable protocol error handling
- Update commit headline (Bjorn)
- Rename pci_error_detected()/pci_cor_error_detected() ->
cxl_pci_error_detected/cxl_pci_cor_error_detected() (Jonathan)
- Remove now-invalid comment in cxl_error_detected() (Jonathan)
- Split into separate patches for UCE and CE (Terry)
cxl: Update Endpoint correctable protocol error handling
- New commit
- Change cxl_cor_error_detected() parameter to &pdev->dev device from
memdev device. (Terry)
cxl: Enable CXL protocol errors during CXL Port probe
- Update commit title's prefix (Bjorn)
Changes in v12->v13:
CXL/PCI: Move CXL DVSEC definitions into uapi/linux/pci_regs.h
- Add Dave Jiang's reviewed-by
- Remove changes to existing PCI_DVSEC_CXL_PORT* defines. Update commit
message. (Jonathan)
PCI/CXL: Introduce pcie_is_cxl()
- Add Ben's "reviewed-by"
cxl/pci: Remove unnecessary CXL Endpoint handling helper functions
- None
cxl/pci: Remove unnecessary CXL RCH handling helper functions
- None
cxl: Remove CXL VH handling in CONFIG_PCIEAER_CXL conditional blocks from core
- None
cxl: Move CXL driver's RCH error handling into core/ras_rch.c
- None
CXL/AER: Replace device_lock() in cxl_rch_handle_error_iter() with guard() lock
- New patch
CXL/AER: Move AER drivers RCH error handling into pcie/aer_cxl_rch.c
- Add forward declararation of 'struct aer_err_info' in pci/pci.h (Terry)
- Changed copyright date from 2025 to 2023 (Jonathan)
- Add David Jiang's, Jonathan's, and Ben's review-by
- Readd 'struct aer_err_info' (Bot)
PCI/AER: Report CXL or PCIe bus error type in trace logging
- Remove duplicated aer_err_info inline comments. Is already in the
kernel-doc header (Ben)
cxl/pci: Update RAS handler interfaces to also support CXL Ports
- None
cxl/pci: Log message if RAS registers are unmapped
- Added Bens review-by
cxl/pci: Unify CXL trace logging for CXL Endpoints and CXL Ports
- Added Dave Jiang's review-by
cxl/pci: Update cxl_handle_cor_ras() to return early if no RAS errors
- Add Ben's review-by
cxl/pci: Map CXL Endpoint Port and CXL Switch Port RAS registers
- Change as result of dport delay fix. No longer need switchport and
endport approach. Refactor. (Terry)
CXL/PCI: Introduce PCI_ERS_RESULT_PANIC
- Add Dave Jiang's, Jonathan's, Ben's review-by
- Typo fix (Ben)
CXL/AER: Introduce pcie/aer_cxl_vh.c in AER driver for forwarding CXL errors
- Add Dave Jiang's review-by
- Update error message (Ben)
cxl: Introduce cxl_pci_drv_bound() to check for bound driver
- Add Dave Jiang's review-by.
cxl: Change CXL handlers to use guard() instead of scoped_guard()
- New patch
cxl/pci: Introduce CXL protocol error handlers for endpoints
- Updated all the implemetnation and commit message. (Terry)
- Refactored cxl_cor_error_detected()/cxl_error_detected() to remove
pdev (Dave Jiang)
CXL/PCI: Introduce CXL Port protocol error handlers
- Move get_pci_cxl_host_dev() and cxl_handle_proto_error() to Dequeue
patch (Terry)
- Remove EP case in cxl_get_ras_base(), not used. (Terry)
- Remove check for dport->dport_dev (Dave)
- Remove whitespace (Terry)
PCI/AER: Dequeue forwarded CXL error
- Rewrite cxl_handle_proto_error() and cxl_proto_err_work_fn() (Terry)
- Rename get_cxl_host dev() to be get_cxl_port() (Terry)
- Remove exporting of unused function, pci_aer_clear_fatal_status() (Dave Jiang)
- Change pr_err() calls to ratelimited. (Terry)
- Update commit message. (Terry)
- Remove namespace qualifier from pcie_clear_device_status()
export (Dave Jiang)
- Move locks into cxl_proto_err_work_fn() (Dave)
- Update log messages in cxl_forward_error() (Ben)
CXL/PCI: Export and rename merge_result() to pci_ers_merge_result()
- Renamed pci_ers_merge_result() to pcie_ers_merge_result().
pci_ers_merge_result() is already used in eeh driver. (Bot)
CXL/PCI: Introduce CXL uncorrectable protocol error recovery
- Rewrite report_error_detected() and cxl_walk_port (Terry)
- Add guard() before calling cxl_pci_drv_bound() (Dave Jiang)
- Add guard() calls for EP (cxlds->cxlmd->dev & pdev->dev) and ports
(pdev->dev & parent cxl_port) in cxl_report_error_detected() and
cxl_handle_proto_error() (Terry)
- Remove unnecessary check for endpoint port. (Dave Jiang)
- Remove check for RCIEP EP in cxl_report_error_detected() (Terry)
CXL/PCI: Enable CXL protocol errors during CXL Port probe
- Add dev and dev_is_pci() NULL checks in cxl_unmask_proto_interrupts() (Terry)
- Add Dave Jiang's and Ben's review-by
CXL/PCI: Disable CXL protocol error interrupts during CXL Port cleanup
- Added dev and dev_is_pci() checks in cxl_mask_proto_interrupts() (Terry)
Changes in v11 -> v12:
cxl/pci: Remove unnecessary CXL Endpoint handling helper functions
- Added Dave Jiang's review by
- Moved to front of series
cxl/pci: Remove unnecessary CXL RCH handling helper functions
- Add reviewed-by for Alejandro & Dave Jiang
- Moved to front of series
cxl: Remove ifdef blocks of CONFIG_PCIEAER_CXL from core/pci.c
- Update CONFIG_CXL_RAS in CXL Kconfig to have CXL_PCI dependency (Terry)
CXL/AER: Remove CONFIG_PCIEAER_CXL and replace with CONFIG_CXL_RAS
- Added review-by for Sathyanarayanan
- Changed Kconfig dependency from PCIEAER_CXL to PCIEAER. Moved
this backwards into this patch.
cxl: Move CXL driver RCH error handling into CONFIG_CXL_RCH_RAS conditio
- Moved CXL_RCH_RAS Kconfig definition here from following commit
CXL/AER: Introduce aer_cxl_rch.c into AER driver for handling CXL RCH errors
- Rename drivers/pci/pcie/cxl_rch.c to drivers/pci/pcie/aer_cxl_rch.c (Lukas)
- Removed forward declararation of 'struct aer_err_info' in pci/pci.h (Terry)
CXL/PCI: Move CXL DVSEC definitions into uapi/linux/pci_regs.h
- Change formatting to be same as existing definitions
- Change GENMASK() -> __GENMASK() and BIT() to _BITUL()
PCI/CXL: Introduce pcie_is_cxl()
- Add review-by for Alejandro
- Add comment in set_pcie_cxl() explaining why updating parent status.
PCI/AER: Report CXL or PCIe bus error type in trace logging
- Change aer_err_info::is_cxl to be bool a bitfield. Update structure padding. (Lukas)
- Add kernel-doc for 'struct aer_err_info' (Lukas)
cxl/pci: Unify CXL trace logging for CXL Endpoints and CXL Ports
- Correct parameters to call trace_cxl_aer_correctable_error() (Shiju)
- Add reviewed-by for Jonathan and Shiju
cxl/pci: Map CXL Endpoint Port and CXL Switch Port RAS registers
- Add check for dport_parent->rch before calling cxl_dport_init_ras_reporting().
- RCH dports are initialized from cxl_dport_init_ras_reporting cxl_mem_probe().
CXL/PCI: Introduce PCI_ERS_RESULT_PANIC
- Documentation requested by (Lukas)
CXL/AER: Introduce aer_cxl_vh.c in AER driver for forwarding CXL errors
- Rename drivers/pci/pcie/cxl_aer.c to drivers/pci/pcie/aer_cxl_vh.c (Lukas)
cxl: Introduce cxl_pci_drv_bound() to check for bound driver
- New patch
PCI/AER: Dequeue forwarded CXL error
- Add guard for CE case in cxl_handle_proto_error() (Dave)
- Updated commit message (Terry)
CXL/PCI: Introduce CXL Port protocol error handlers
- Add call to cxl_pci_drv_bound() in cxl_handle_proto_error() and
pci_to_cxl_dev() (Lukas)
- Change cxl_error_detected() -> cxl_cor_error_detected() (Terry)
- Remove NULL variable assignments (Jonathan)
- Replace bus_find_device() with find_cxl_port_by_uport() for upstream
port searches. (Dave)
CXL/PCI: Export and rename merge_result() to pci_ers_merge_result()
- Remove static inline pci_ers_merge_result() definition for !CONFIG_PCIEAER.
Is not needed. (Lukas)
CXL/PCI: Introduce CXL uncorrectable protocol error recovery
- Clean up port discovery in cxl_do_recovery() (Dave)
- Add PCI_EXP_TYPE_RC_END to type check in cxl_report_error_detected()
Changes in v10 -> v11:
cxl: Remove ifdef blocks of CONFIG_PCIEAER_CXL from core/pci.c
- New patch
CXL/AER: Remove CONFIG_PCIEAER_CXL and replace with CONFIG_CXL_RAS
- New patch
cxl/pci: Remove unnecessary CXL RCH handling helper functions
- New patch
cxl: Move CXL driver RCH error handling into CONFIG_CXL_RCH_RAS conditional block
- New patch
CXL/AER: Introduce rch_aer.c into AER driver for handling CXL RCH errors
- Remove changes in code-split and move to earlier, new patch
- Add #include <linux/bitfield.h> to cxl_ras.c
- Move cxl_rch_handle_error() & cxl_rch_enable_rcec() declarations from pci.h
to aer.h, more localized.
- Introduce CONFIG_CXL_RCH_RAS, includes Makefile changes, ras.c ifdef changes
CXL/PCI: Move CXL DVSEC definitions into uapi/linux/pci_regs.h
- New patch
PCI/CXL: Introduce pcie_is_cxl()
- Amended set_pcie_cxl() to check for Upstream Port's and EP's parent
downstream port by calling set_pcie_cxl(). (Dan)
- Retitle patch: 'Add' -> 'Introduce'
- Add check for CXL.mem and CXL.cache (Alejandro, Dan)
PCI/AER: Report CXL or PCIe bus error type in trace logging
- Remove duplicate call to trace_aer_event() (Shiju)
- Added Dan William's and Dave Jiang's reviewed-by
CXL/AER: Update PCI class code check to use FIELD_GET()
- Add #include <linux/bitfield.h> to cxl_ras.c (Terry)
- Removed line wrapping at "(CXL 3.2, 8.1.12.1)". (Jonathan)
cxl/pci: Log message if RAS registers are unmapped
- Added Dave Jiang's review-by (Terry)
cxl/pci: Unify CXL trace logging for CXL Endpoints and CXL Ports
- Updated CE and UCE trace routines to maintian consistent TP_Struct ABI
and unchanged TP_printk() logging. (Shiju, Alison)
cxl/pci: Update cxl_handle_cor_ras() to return early if no RAS errors
- Added Dave Jiang and Jonathan Cameron's review-by
- Changes moved to core/ras.c
cxl/pci: Map CXL Endpoint Port and CXL Switch Port RAS registers
- Use local pointer for readability in cxl_switch_port_init_ras() (Jonathan Cameron)
- Rename port to be ep in cxl_endpoint_port_init_ras() (Dave Jiang)
- Rename dport to be parent_dport in cxl_endpoint_port_init_ras()
and cxl_switch_port_init_ras() (Dave Jiang)
- Port helper changes were in cxl/port.c, now in core/ras.c (Dave Jiang)
cxl/pci: Introduce CXL Endpoint protocol error handlers
- cxl_error_detected() - Change handlers' scoped_guard() to guard() (Jonathan)
- cxl_error_detected() - Remove extra line (Shiju)
- Changes moved to core/ras.c (Terry)
- cxl_error_detected(), remove 'ue' and return with function call. (Jonathan)
- Remove extra space in documentation for PCI_ERS_RESULT_PANIC definition
- Move #include "pci.h from cxl.h to core.h (Terry)
- Remove unnecessary includes of cxl.h and core.h in mem.c (Terry)
CXL/AER: Introduce cxl_aer.c into AER driver for forwarding CXL errors
- Move RCH implementation to cxl_rch.c and RCH declarations to pci/pci.h. (Terry)
- Introduce 'struct cxl_proto_err_kfifo' containing semaphore, fifo,
and work struct. (Dan)
- Remove embedded struct from cxl_proto_err_work (Dan)
- Make 'struct work_struct *cxl_proto_err_work' definition static (Jonathan)
- Add check for NULL cxl_proto_err_kfifo to determine if CXL driver is
not registered for workqueue. (Dan)
PCI/AER: Dequeue forwarded CXL error
- Reword patch commit message to remove RCiEP details (Jonathan)
- Add #include <linux/bitfield.h> (Terry)
- is_cxl_rcd() - Fix short comment message wrap (Jonathan)
- is_cxl_rcd() - Combine return calls into 1 (Jonathan)
- cxl_handle_proto_error() - Move comment earlier (Jonathan)
- Usse FIELD_GET() in discovering class code (Jonathan)
- Remove BDF from cxl_proto_err_work_data. Use 'struct pci_dev *' (Dan)
CXL/PCI: Introduce CXL Port protocol error handlers
- Removed check for PCI_EXP_TYPE_RC_END in cxl_report_error_detected() (Terry)
- Update is_cxl_error() to check for acceptable PCI EP and port types
CXL/PCI: Export and rename merge_result() to pci_ers_merge_result()
- pci_ers_merge_result() - Change export to non-namespace and rename
to be pci_ers_merge_result() (Jonathan)
- Move pci_ers_merge_result() definition to pci.h. Needs pci_ers_result (Terry)
CXL/PCI: Introduce CXL uncorrectable protocol error recovery
- pci_ers_merge_results() - Move to earlier patch
CXL/PCI: Disable CXL protocol error interrupts during CXL Port cleanup
- Remove guard() in cxl_mask_proto_interrupts(). Observed device lockup/block
during testing. (Terry)
Changes in v9 -> v10:
- Add drivers/pci/pcie/cxl_aer.c
- Add drivers/cxl/core/native_ras.c
- Change cxl_register_prot_err_work()/cxl_unregister_prot_err_work to return void
- Check for pcie_ports_native in cxl_do_recovery()
- Remove debug logging in cxl_do_recovery()
- Update PCI_ERS_RESULT_PANIC definition to indicate is CXL specific
- Revert trace logging changes: name,parent -> memdev,host.
- Use FIELD_GET() to check for EP class code (cxl_aer.c & native_ras.c).
- Change _prot_ to _proto_ everywhere
- cxl_rch_handle_error_iter(), check if driver is cxl_pci_driver
- Remove cxl_create_prot_error_info(). Move logic into forward_cxl_error()
- Remove sbdf_to_pci() and move logic into cxl_handle_proto_error()
- Simplify/refactor get_pci_cxl_host_dev()
- Simplify/refactor cxl_get_ras_base()
- Move patch 'Remove unnecessary CXL Endpoint handling helper functions' to front
- Update description for 'CXL/PCI: Introduce CXL Port protocol error
handlers' with why state is not used to determine handling
- Introduce cxl_pci_drv_bound() and call from cxl_rch_handle_error_iter()
Changes in v8 -> v9:
- Updated reference counting to use pci_get_device()/pci_put_device() in
cxl_disable_prot_errors()/cxl_enable_prot_errors
- Refactored cxl_create_prot_err_info() to fix reference counting
- Removed 'struct cxl_port' driver changes for error handler. Instead
check for CXL device type (EP or Port device) and call handler
- Make pcie_is_cxl() static inline in include/linux/linux.h
- Remove NULL check in create_prot_err_info()
- Change success return in cxl_ras_init() to use hardcoded 0
- Changed 'struct work_struct cxl_prot_err_work' declaration to static
- Change to use rate limited log with dev anchor in forward_cxl_error()
- Refactored forward-cxl_error() to remove severity auto variable
- Changed pci_aer_clear_nonfatal_status() to be static inline for
!(CONFIG_PCIEAER)
- Renamed merge_result() to be cxl_merge_result()
- Removed 'ue' condition in cxl_error_detected()
- Updated 2nd parameter in call to __cxl_handle_cor_ras()/__cxl_handle_ras()
in unify patch
- Added log message for failure while assigning interrupt disable callback
- Updated pci_aer_mask_internal_errors() to use pci_clear_and_set_config_dword()
- Simplified patch titles for clarity
- Moved CXL error interrupt disabling into cxl/core/port.c with CXL Port
teardown
- Updated 'struct cxl_port_err_info' to only contain sbdf and severity
Removed everything else.
- Added pdev and CXL device get_device()/put_device() before calling handlers
Changes in v7 -> v8:
[Dan] Use kfifo. Move handling to CXL driver. AER forwards error to CXL
driver
[Dan] Add device reference incrementors where needed throughout
[Dan] Initiate CXL Port RAS init from Switch Port and Endpoint Port init
[Dan] Combine CXL Port and CXL Endpoint trace routine
[Dan] Introduce aer_info::is_cxl. Use to indicate CXL or PCI errors
[Jonathan] Add serial number for all devices in trace
[DaveJ] Move find_cxl_port() change into patch using it
[Terry] Move CXL Port RAS init into cxl/port.c
[Terry] Moved kfifo functions into cxl/core/ras.c
Changes in v6 -> v7:
[Terry] Move updated trace routine call to later patch. Was causing build
error.
Changes in v5 -> v6:
[Ira] Move pcie_is_cxl(dev) define to a inline function
[Ira] Update returning value from pcie_is_cxl_port() to bool w/o cast
[Ira] Change cxl_report_error_detected() cleanup to return correct bool
[Ira] Introduce and use PCI_ERS_RESULT_PANIC
[Ira] Reuse comment for PCIe and CXL recovery paths
[Jonathan] Add type check in for cxl_handle_cor_ras() and cxl_handle_ras()
[Jonathan] cxl_uport/dport_init_ras_reporting(), added a mutex.
[Jonathan] Add logging example to patches updating trace output
[Jonathan] Make parameter 'const' to eliminate for cast in match_uport()
[Jonathan] Use __free() in cxl_pci_port_ras()
[Terry] Add patch to log the PCIe SBDF along with CXL device name
[Terry] Add patch to handle CXL endpoint and RCH DP errors as CXL errors
[Terry] Remove patch w USP UCE fatal support @ aer_get_device_error_info()
[Terry] Rebase to cxl/next commit 5585e342e8d3 ("cxl/memdev: Remove unused partition values")
[Gregory] Pre-initialize pointer to NULL in cxl_pci_port_ras()
[Gregory] Move AER driver bus name detection to a static function
Changes in v4 -> v5:
[Alejandro] Refactor cxl_walk_bridge to simplify 'status' variable usage
[Alejandro] Add WARN_ONCE() in __cxl_handle_ras() and cxl_handle_cor_ras()
[Ming] Remove unnecessary NULL check in cxl_pci_port_ras()
[Terry] Add failure check for call to to_cxl_port() in cxl_pci_port_ras()
[Ming] Use port->dev for call to devm_add_action_or_reset() in
cxl_dport_init_ras_reporting() and cxl_uport_init_ras_reporting()
[Jonathan] Use get_device()/put_device() to prevent race condition in
cxl_clear_port_error_handlers() and cxl_clear_port_error_handlers()
[Terry] Commit message cleanup. Capitalize keywords from CXL and PCI
specifications
Changes in v3 -> v4:
[Lukas] Capitalize PCIe and CXL device names as in specifications
[Lukas] Move call to pcie_is_cxl() into cxl_port_devsec()
[Lukas] Correct namespace spelling
[Lukas] Removed export from pcie_is_cxl_port()
[Lukas] Simplify 'if' blocks in cxl_handle_error()
[Lukas] Change panic message to remove redundant 'panic' text
[Ming] Update to call cxl_dport_init_ras_reporting() in RCH case
[lkp@intel] 'host' parameter is already removed. Remove parameter description too.
[Terry] Added field description for cxl_err_handlers in pci.h comment block
Changes in v1 -> v2:
[Jonathan] Remove extra NULL check and cleanup in cxl_pci_port_ras()
[Jonathan] Update description to DSP map patch description
[Jonathan] Update cxl_pci_port_ras() to check for NULL port
[Jonathan] Dont call handler before handler port changes are present (patch order)
[Bjorn] Fix linebreak in cover sheet URL
[Bjorn] Remove timestamps from test logs in cover sheet
[Bjorn] Retitle AER commits to use "PCI/AER:"
[Bjorn] Retitle patch#3 to use renaming instead of refactoring
[Bjorn] Fix base commit-id on cover sheet
[Bjorn] Add VH spec reference/citation
[Terry] Removed last 2 patches to enable internal errors. Is not needed
because internal errors are enabled in AER driver.
[Dan] Create cxl_do_recovery() and pci_driver::cxl_err_handlers.
[Dan] Use kernel panic in CXL recovery
[Dan] cxl_port_hndlrs -> cxl_port_error_handlers
Dan Williams (4):
cxl: Tighten CPER kfifo registration API and symbol visibility
cxl: Rename find_cxl_port() to find_cxl_port_by_dport()
cxl/pci: Thread port and dport through RAS handling helpers
cxl: Add port and dport identifiers to CXL AER trace events
Terry Bowman (9):
cxl/ras: Fix cxl_rch_get_aer_severity() wrong severity register
acpi/apei/ghes: Use raw_spinlock_t for CXL CPER work locks
PCI/AER: Introduce AER-CXL protocol error kfifo
PCI: Establish common CXL Port protocol error flow
PCI/CXL: Add RCH support to CXL handlers
cxl: Update CXL Endpoint AER handler
PCI: Cache PCI DSN into pci_dev->dsn during probe
PCI/CXL: Mask/Unmask CXL protocol errors
Documentation: cxl: Document CXL protocol error handling
Documentation/driver-api/cxl/index.rst | 1 +
.../cxl/linux/protocol-error-handling.rst | 222 ++++++++++
MAINTAINERS | 2 +
drivers/acpi/apei/ghes.c | 66 +--
drivers/cxl/core/core.h | 36 +-
drivers/cxl/core/port.c | 28 +-
drivers/cxl/core/ras.c | 395 ++++++++++++------
drivers/cxl/core/ras_rch.c | 20 +-
drivers/cxl/core/trace.c | 35 ++
drivers/cxl/core/trace.h | 91 ++--
drivers/cxl/cxlmem.h | 7 +
drivers/cxl/cxlpci.h | 11 +-
drivers/cxl/pci.c | 16 +-
drivers/pci/pci.h | 1 -
drivers/pci/pcie/Makefile | 1 +
drivers/pci/pcie/aer.c | 45 +-
drivers/pci/pcie/aer_cxl_rch.c | 39 +-
drivers/pci/pcie/aer_cxl_vh.c | 235 +++++++++++
drivers/pci/pcie/portdrv.h | 10 +-
drivers/pci/probe.c | 14 +
include/cxl/event.h | 17 +-
include/linux/aer.h | 26 ++
include/linux/pci.h | 1 +
tools/testing/cxl/Kbuild | 1 +
tools/testing/cxl/test/mock.c | 12 +
25 files changed, 1013 insertions(+), 319 deletions(-)
create mode 100644 Documentation/driver-api/cxl/linux/protocol-error-handling.rst
create mode 100644 drivers/pci/pcie/aer_cxl_vh.c
base-commit: a13c140cc289c0b7b3770bce5b3ad42ab35074aa
--
2.34.1
^ permalink raw reply
* [PATCH v18 02/13] acpi/apei/ghes: Use raw_spinlock_t for CXL CPER work locks
From: Terry Bowman @ 2026-07-17 22:26 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
The CXL CPER work registration and unregistration helpers in
drivers/acpi/apei/ghes.c acquire cxl_cper_work_lock and
cxl_cper_prot_err_work_lock with guard(spinlock), which leaves local
interrupts enabled. The corresponding post paths
(cxl_cper_post_event(), cxl_cper_post_prot_err()) execute in hard IRQ
context (they are called from the GHES error notification path) and
acquire the same locks via guard(spinlock_irqsave).
If a CPU is holding one of these locks via guard(spinlock) when a
GHES interrupt arrives on the same CPU, the IRQ handler spins on the
held lock waiting for it to release, while the lock holder is
preempted by the IRQ. The result is a deadlock.
Convert both locks from spinlock_t to raw_spinlock_t and use
guard(raw_spinlock_irqsave) at all call sites. On PREEMPT_RT kernels
spinlock_t is backed by rt_mutex and sleeping from hard IRQ context is
not permitted; raw_spinlock_t is safe in both contexts.
Add WARN_ONCE to both register functions to surface double-registration
bugs at runtime.
Restructure both unregister functions to clear the global work pointer
under the lock before calling cancel_work_sync(), closing the window
where a CPER interrupt could schedule work on a pointer about to be
freed. Add kfifo_reset() after cancel_work_sync() so stale entries
are not replayed on next module load.
Both kfifos are single-consumer: only one work_struct is registered at
a time, enforced by the WARN_ONCE guard in the register functions.
kfifo_reset() is safe outside the lock because cancel_work_sync() has
already quiesced the consumer, and no new consumer can register until
the current module exit completes and a fresh module init runs.
Remove the now-redundant cancel_work_sync() call from
cxl_pci_driver_exit() - cxl_cper_unregister_work() handles quiescing
internally.
Reported-by: Sashiko <sashiko@linuxfoundation.org>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
Fixes: 5e4a264bf8b5 ("acpi/ghes: Process CXL Component Events")
Fixes: 36f257e3b0ba ("acpi/ghes, cxl/pci: Process CXL CPER Protocol Errors")
Cc: stable@vger.kernel.org
---
Changes in v17 -> v18:
- New patch.
---
drivers/acpi/apei/ghes.c | 50 ++++++++++++++++++++++++++--------------
drivers/cxl/pci.c | 1 -
2 files changed, 33 insertions(+), 18 deletions(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index 3236a3ce79d6b..ca7a138c1ff2e 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -749,7 +749,7 @@ static DEFINE_KFIFO(cxl_cper_prot_err_fifo, struct cxl_cper_prot_err_work_data,
CXL_CPER_PROT_ERR_FIFO_DEPTH);
/* Synchronize schedule_work() with cxl_cper_prot_err_work changes */
-static DEFINE_SPINLOCK(cxl_cper_prot_err_work_lock);
+static DEFINE_RAW_SPINLOCK(cxl_cper_prot_err_work_lock);
struct work_struct *cxl_cper_prot_err_work;
static void cxl_cper_post_prot_err(struct cxl_cper_sec_prot_err *prot_err,
@@ -761,7 +761,7 @@ static void cxl_cper_post_prot_err(struct cxl_cper_sec_prot_err *prot_err,
if (cxl_cper_sec_prot_err_valid(prot_err))
return;
- guard(spinlock_irqsave)(&cxl_cper_prot_err_work_lock);
+ guard(raw_spinlock_irqsave)(&cxl_cper_prot_err_work_lock);
if (!cxl_cper_prot_err_work)
return;
@@ -780,10 +780,11 @@ static void cxl_cper_post_prot_err(struct cxl_cper_sec_prot_err *prot_err,
int cxl_cper_register_prot_err_work(struct work_struct *work)
{
- if (cxl_cper_prot_err_work)
- return -EINVAL;
+ guard(raw_spinlock_irqsave)(&cxl_cper_prot_err_work_lock);
- guard(spinlock)(&cxl_cper_prot_err_work_lock);
+ if (WARN_ONCE(cxl_cper_prot_err_work,
+ "CPER-CXL kfifo consumer already registered\n"))
+ return -EINVAL;
cxl_cper_prot_err_work = work;
return 0;
}
@@ -791,11 +792,18 @@ EXPORT_SYMBOL_NS_GPL(cxl_cper_register_prot_err_work, "CXL");
int cxl_cper_unregister_prot_err_work(struct work_struct *work)
{
- if (cxl_cper_prot_err_work != work)
- return -EINVAL;
+ scoped_guard(raw_spinlock_irqsave, &cxl_cper_prot_err_work_lock) {
+ if (WARN_ONCE(cxl_cper_prot_err_work != work,
+ "CPER-CXL kfifo consumer mismatch on unregister\n"))
+ return -EINVAL;
+ cxl_cper_prot_err_work = NULL;
+ }
+
+ cancel_work_sync(work);
+
+ /* Discard stale entries so they are not replayed on next module load */
+ kfifo_reset(&cxl_cper_prot_err_fifo);
- guard(spinlock)(&cxl_cper_prot_err_work_lock);
- cxl_cper_prot_err_work = NULL;
return 0;
}
EXPORT_SYMBOL_NS_GPL(cxl_cper_unregister_prot_err_work, "CXL");
@@ -811,7 +819,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_cper_prot_err_kfifo_get, "CXL");
DEFINE_KFIFO(cxl_cper_fifo, struct cxl_cper_work_data, CXL_CPER_FIFO_DEPTH);
/* Synchronize schedule_work() with cxl_cper_work changes */
-static DEFINE_SPINLOCK(cxl_cper_work_lock);
+static DEFINE_RAW_SPINLOCK(cxl_cper_work_lock);
struct work_struct *cxl_cper_work;
static void cxl_cper_post_event(enum cxl_event_type event_type,
@@ -831,7 +839,7 @@ static void cxl_cper_post_event(enum cxl_event_type event_type,
return;
}
- guard(spinlock_irqsave)(&cxl_cper_work_lock);
+ guard(raw_spinlock_irqsave)(&cxl_cper_work_lock);
if (!cxl_cper_work)
return;
@@ -849,10 +857,11 @@ static void cxl_cper_post_event(enum cxl_event_type event_type,
int cxl_cper_register_work(struct work_struct *work)
{
- if (cxl_cper_work)
+ guard(raw_spinlock_irqsave)(&cxl_cper_work_lock);
+ if (WARN_ONCE(cxl_cper_work,
+ "CXL CPER kfifo consumer already registered\n"))
return -EINVAL;
- guard(spinlock)(&cxl_cper_work_lock);
cxl_cper_work = work;
return 0;
}
@@ -860,11 +869,18 @@ EXPORT_SYMBOL_NS_GPL(cxl_cper_register_work, "CXL");
int cxl_cper_unregister_work(struct work_struct *work)
{
- if (cxl_cper_work != work)
- return -EINVAL;
+ scoped_guard(raw_spinlock_irqsave, &cxl_cper_work_lock) {
+ if (WARN_ONCE(cxl_cper_work != work,
+ "CXL CPER kfifo consumer mismatch on unregister\n"))
+ return -EINVAL;
+ cxl_cper_work = NULL;
+ }
+
+ cancel_work_sync(work);
+
+ /* Discard stale entries so they are not replayed on next module load */
+ kfifo_reset(&cxl_cper_fifo);
- guard(spinlock)(&cxl_cper_work_lock);
- cxl_cper_work = NULL;
return 0;
}
EXPORT_SYMBOL_NS_GPL(cxl_cper_unregister_work, "CXL");
diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
index 267c679b0b3c2..7c6faee7f85ed 100644
--- a/drivers/cxl/pci.c
+++ b/drivers/cxl/pci.c
@@ -1083,7 +1083,6 @@ static int __init cxl_pci_driver_init(void)
static void __exit cxl_pci_driver_exit(void)
{
cxl_cper_unregister_work(&cxl_cper_work);
- cancel_work_sync(&cxl_cper_work);
pci_unregister_driver(&cxl_pci_driver);
}
--
2.34.1
^ permalink raw reply related
* [PATCH v18 03/13] cxl: Tighten CPER kfifo registration API and symbol visibility
From: Terry Bowman @ 2026-07-17 22:26 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
From: Dan Williams <djbw@kernel.org>
Tighten the CPER protocol error kfifo registration API and symbol
visibility.
Use EXPORT_SYMBOL_FOR_MODULES() instead of EXPORT_SYMBOL_NS_GPL() for
the CPER kfifo registration symbols. This names the consuming module
explicitly and gives compile-time enforcement.
Drop the work_struct argument from the unregister path. Change the
WARN_ONCE condition to a NULL check since there is no caller pointer
to compare against anymore.
Change register/unregister return types to void. Flag double registration
with WARN_ONCE() inside the lock instead of returning an error.
Change cxl_ras_init() to void because there is one consumer and one producer
so the error return was unnecessary. Remove the now-dead error check in
cxl_core_init().
Add a diagnostic log when the driver is not bound in
cxl_cper_handle_prot_err().
Co-developed-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Dan Williams <djbw@kernel.org>
---
Changes in v17 -> v18:
- New patch.
---
drivers/acpi/apei/ghes.c | 32 +++++++++++++++-----------------
drivers/cxl/core/core.h | 7 ++-----
drivers/cxl/core/port.c | 6 +-----
drivers/cxl/core/ras.c | 12 +++++++-----
include/cxl/event.h | 17 ++++++-----------
5 files changed, 31 insertions(+), 43 deletions(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index ca7a138c1ff2e..187f54e31c33e 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -778,41 +778,41 @@ static void cxl_cper_post_prot_err(struct cxl_cper_sec_prot_err *prot_err,
#endif
}
-int cxl_cper_register_prot_err_work(struct work_struct *work)
+void cxl_cper_register_prot_err_work(struct work_struct *work)
{
guard(raw_spinlock_irqsave)(&cxl_cper_prot_err_work_lock);
if (WARN_ONCE(cxl_cper_prot_err_work,
"CPER-CXL kfifo consumer already registered\n"))
- return -EINVAL;
+ return;
cxl_cper_prot_err_work = work;
- return 0;
}
-EXPORT_SYMBOL_NS_GPL(cxl_cper_register_prot_err_work, "CXL");
+EXPORT_SYMBOL_FOR_MODULES(cxl_cper_register_prot_err_work, "cxl_core");
-int cxl_cper_unregister_prot_err_work(struct work_struct *work)
+void cxl_cper_unregister_prot_err_work(void)
{
+ struct work_struct *old;
+
scoped_guard(raw_spinlock_irqsave, &cxl_cper_prot_err_work_lock) {
- if (WARN_ONCE(cxl_cper_prot_err_work != work,
- "CPER-CXL kfifo consumer mismatch on unregister\n"))
- return -EINVAL;
+ WARN_ONCE(!cxl_cper_prot_err_work,
+ "CPER-CXL kfifo consumer not registered on unregister\n");
+ old = cxl_cper_prot_err_work;
cxl_cper_prot_err_work = NULL;
}
- cancel_work_sync(work);
+ if (old)
+ cancel_work_sync(old);
/* Discard stale entries so they are not replayed on next module load */
kfifo_reset(&cxl_cper_prot_err_fifo);
-
- return 0;
}
-EXPORT_SYMBOL_NS_GPL(cxl_cper_unregister_prot_err_work, "CXL");
+EXPORT_SYMBOL_FOR_MODULES(cxl_cper_unregister_prot_err_work, "cxl_core");
int cxl_cper_prot_err_kfifo_get(struct cxl_cper_prot_err_work_data *wd)
{
return kfifo_get(&cxl_cper_prot_err_fifo, wd);
}
-EXPORT_SYMBOL_NS_GPL(cxl_cper_prot_err_kfifo_get, "CXL");
+EXPORT_SYMBOL_FOR_MODULES(cxl_cper_prot_err_kfifo_get, "cxl_core");
/* Room for 8 entries for each of the 4 event log queues */
#define CXL_CPER_FIFO_DEPTH 32
@@ -867,12 +867,12 @@ int cxl_cper_register_work(struct work_struct *work)
}
EXPORT_SYMBOL_NS_GPL(cxl_cper_register_work, "CXL");
-int cxl_cper_unregister_work(struct work_struct *work)
+void cxl_cper_unregister_work(struct work_struct *work)
{
scoped_guard(raw_spinlock_irqsave, &cxl_cper_work_lock) {
if (WARN_ONCE(cxl_cper_work != work,
"CXL CPER kfifo consumer mismatch on unregister\n"))
- return -EINVAL;
+ return;
cxl_cper_work = NULL;
}
@@ -880,8 +880,6 @@ int cxl_cper_unregister_work(struct work_struct *work)
/* Discard stale entries so they are not replayed on next module load */
kfifo_reset(&cxl_cper_fifo);
-
- return 0;
}
EXPORT_SYMBOL_NS_GPL(cxl_cper_unregister_work, "CXL");
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index 07555ae638594..23fe40ddf4c6b 100644
--- a/drivers/cxl/core/core.h
+++ b/drivers/cxl/core/core.h
@@ -183,7 +183,7 @@ static inline struct device *dport_to_host(struct cxl_dport *dport)
return &port->dev;
}
#ifdef CONFIG_CXL_RAS
-int cxl_ras_init(void);
+void cxl_ras_init(void);
void cxl_ras_exit(void);
bool cxl_handle_ras(struct device *dev, void __iomem *ras_base);
void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base);
@@ -192,10 +192,7 @@ void cxl_disable_rch_root_ints(struct cxl_dport *dport);
void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds);
void devm_cxl_dport_ras_setup(struct cxl_dport *dport);
#else
-static inline int cxl_ras_init(void)
-{
- return 0;
-}
+static inline void cxl_ras_init(void) { }
static inline void cxl_ras_exit(void) { }
static inline bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
{
diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index 1215ee4f40351..f90f899c31d07 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -2531,14 +2531,10 @@ static __init int cxl_core_init(void)
if (rc)
goto err_region;
- rc = cxl_ras_init();
- if (rc)
- goto err_ras;
+ cxl_ras_init();
return 0;
-err_ras:
- cxl_region_exit();
err_region:
bus_unregister(&cxl_bus_type);
err_bus:
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index 99fb00949c2fa..135f1997e6f4f 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -104,8 +104,11 @@ void cxl_cper_handle_prot_err(struct cxl_cper_prot_err_work_data *data)
}
guard(device)(&pdev->dev);
- if (!pdev->dev.driver)
+ if (!pdev->dev.driver) {
+ dev_warn_ratelimited(&pdev->dev,
+ "Device is unbound, abort CPER error handling\n");
return;
+ }
struct device *mem_dev __free(put_device) = bus_find_device(
&cxl_bus_type, NULL, pdev, match_memdev_by_parent);
@@ -129,15 +132,14 @@ static void cxl_cper_prot_err_work_fn(struct work_struct *work)
}
static DECLARE_WORK(cxl_cper_prot_err_work, cxl_cper_prot_err_work_fn);
-int cxl_ras_init(void)
+void cxl_ras_init(void)
{
- return cxl_cper_register_prot_err_work(&cxl_cper_prot_err_work);
+ cxl_cper_register_prot_err_work(&cxl_cper_prot_err_work);
}
void cxl_ras_exit(void)
{
- cxl_cper_unregister_prot_err_work(&cxl_cper_prot_err_work);
- cancel_work_sync(&cxl_cper_prot_err_work);
+ cxl_cper_unregister_prot_err_work();
}
static void cxl_dport_map_ras(struct cxl_dport *dport)
diff --git a/include/cxl/event.h b/include/cxl/event.h
index ff97fea718d2c..3471d4f75c025 100644
--- a/include/cxl/event.h
+++ b/include/cxl/event.h
@@ -287,10 +287,10 @@ struct cxl_cper_prot_err_work_data {
#ifdef CONFIG_ACPI_APEI_GHES
int cxl_cper_register_work(struct work_struct *work);
-int cxl_cper_unregister_work(struct work_struct *work);
+void cxl_cper_unregister_work(struct work_struct *work);
int cxl_cper_kfifo_get(struct cxl_cper_work_data *wd);
-int cxl_cper_register_prot_err_work(struct work_struct *work);
-int cxl_cper_unregister_prot_err_work(struct work_struct *work);
+void cxl_cper_register_prot_err_work(struct work_struct *work);
+void cxl_cper_unregister_prot_err_work(void);
int cxl_cper_prot_err_kfifo_get(struct cxl_cper_prot_err_work_data *wd);
#else
static inline int cxl_cper_register_work(struct work_struct *work)
@@ -298,21 +298,16 @@ static inline int cxl_cper_register_work(struct work_struct *work)
return 0;
}
-static inline int cxl_cper_unregister_work(struct work_struct *work)
-{
- return 0;
-}
+static inline void cxl_cper_unregister_work(struct work_struct *work) { }
static inline int cxl_cper_kfifo_get(struct cxl_cper_work_data *wd)
{
return 0;
}
-static inline int cxl_cper_register_prot_err_work(struct work_struct *work)
+static inline void cxl_cper_register_prot_err_work(struct work_struct *work)
{
- return 0;
}
-static inline int cxl_cper_unregister_prot_err_work(struct work_struct *work)
+static inline void cxl_cper_unregister_prot_err_work(void)
{
- return 0;
}
static inline int cxl_cper_prot_err_kfifo_get(struct cxl_cper_prot_err_work_data *wd)
{
--
2.34.1
^ permalink raw reply related
* [PATCH v18 04/13] cxl: Rename find_cxl_port() to find_cxl_port_by_dport()
From: Terry Bowman @ 2026-07-17 22:26 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
From: Dan Williams <djbw@kernel.org>
find_cxl_port() and find_cxl_port_by_uport() are internal port lookup
functions that search the CXL bus by dport and uport respectively, but
their names do not make the lookup method clear.
Rename find_cxl_port() to find_cxl_port_by_dport() to make the lookup
method explicit and consistent with find_cxl_port_by_uport(). Both
functions remain static to port.c; the upcoming patch that adds the
first cross-file caller will widen their scope.
Co-developed-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Dan Williams <djbw@kernel.org>
---
Changes in v17 -> v18:
- New commit
---
drivers/cxl/core/port.c | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index f90f899c31d07..cadb51f70f854 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -1379,7 +1379,7 @@ static int match_port_by_dport(struct device *dev, const void *data)
return dport != NULL;
}
-static struct cxl_port *__find_cxl_port(struct cxl_find_port_ctx *ctx)
+static struct cxl_port *__find_cxl_port_by_dport(struct cxl_find_port_ctx *ctx)
{
struct device *dev;
@@ -1392,8 +1392,16 @@ static struct cxl_port *__find_cxl_port(struct cxl_find_port_ctx *ctx)
return NULL;
}
-static struct cxl_port *find_cxl_port(struct device *dport_dev,
- struct cxl_dport **dport)
+/**
+ * find_cxl_port_by_dport - find a cxl_port by one of its targets
+ * @dport_dev: device representing the dport target
+ * @dport: optional output of the 'struct cxl_dport' companion of the @dport_dev
+ *
+ * Return a 'struct cxl_port' with an elevated reference if found. Use
+ * __free(put_cxl_port) to release.
+ */
+static struct cxl_port *find_cxl_port_by_dport(struct device *dport_dev,
+ struct cxl_dport **dport)
{
struct cxl_find_port_ctx ctx = {
.dport_dev = dport_dev,
@@ -1401,7 +1409,7 @@ static struct cxl_port *find_cxl_port(struct device *dport_dev,
};
struct cxl_port *port;
- port = __find_cxl_port(&ctx);
+ port = __find_cxl_port_by_dport(&ctx);
return port;
}
@@ -1895,14 +1903,14 @@ EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_ports, "CXL");
struct cxl_port *cxl_pci_find_port(struct pci_dev *pdev,
struct cxl_dport **dport)
{
- return find_cxl_port(pdev->dev.parent, dport);
+ return find_cxl_port_by_dport(pdev->dev.parent, dport);
}
EXPORT_SYMBOL_NS_GPL(cxl_pci_find_port, "CXL");
struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd,
struct cxl_dport **dport)
{
- return find_cxl_port(grandparent(&cxlmd->dev), dport);
+ return find_cxl_port_by_dport(grandparent(&cxlmd->dev), dport);
}
EXPORT_SYMBOL_NS_GPL(cxl_mem_find_port, "CXL");
--
2.34.1
^ permalink raw reply related
* [PATCH v18 05/13] PCI/AER: Introduce AER-CXL protocol error kfifo
From: Terry Bowman @ 2026-07-17 22:26 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
CXL VH RAS handling requires a path for the AER driver to hand off
CXL protocol errors to cxl_core for logging and recovery before PCIe
AER recovery tears down the device. Add
drivers/pci/pcie/aer_cxl_vh.c to implement this handoff via a kfifo-backed
work item.
Introduce is_aer_internal_error() to identify CXL protocol errors
from AER internal error status bits across both correctable and
uncorrectable severities.
Introduce is_cxl_error() to gate the VH kfifo path.
Introduce struct cxl_proto_err_work_data to carry the error source
PCI device and severity through the kfifo. Encapsulate the kfifo,
per-producer spinlock, registration rwsem, and work pointer in struct
cxl_proto_err_kfifo. Initialize the embedded kfifo via INIT_KFIFO()
from a subsys_initcall so its metadata is populated before any
producer or consumer runs.
Introduce cxl_forward_error() to enqueue a CXL protocol error. A
reference is taken on the PCI device; the consumer releases it via
for_each_cxl_proto_err(). On enqueue failure the reference is
released immediately, the error is dropped, and the consumer is
scheduled to drain existing entries. A subsequent patch wires
cxl_forward_error() into handle_error_source() where correctable and
uncorrectable status clearing is left to pci_aer_handle_error().
Introduce cxl_proto_err_flush() to synchronously wait for the
consumer worker to drain the kfifo. A subsequent patch wires this
into handle_error_source() for UCE events so the CXL plane completes
error handling and panic policy before pci_aer_handle_error() drives
PCIe recovery.
Introduce cxl_register_proto_err_work() and
cxl_unregister_proto_err_work() for cxl_core to register and
deregister its work handler. On unregistration, pending kfifo entries
are drained and their pdev references released before
cancel_work_sync() runs. Export these and for_each_cxl_proto_err()
via EXPORT_SYMBOL_FOR_MODULES restricted to cxl_core.
Protect the work pointer with a rwsem to correctly serialize
registration, deregistration, enqueue, and dequeue against concurrent
AER IRQ threads. Serialize concurrent kfifo writers with a spinlock.
Add MAINTAINERS entries for aer_cxl_vh.c and aer_cxl_rch.c under
the CXL entry so CXL maintainers are CC'd on changes to the AER-CXL
bridging code.
Co-developed-by: Dan Williams <djbw@kernel.org>
Signed-off-by: Dan Williams <djbw@kernel.org>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17->v18:
- Remove correctable status clear from cxl_forward_error(); the AER core
clears all status bits via pci_aer_handle_error() info->status writeback
- Schedule consumer on kfifo overflow so existing entries can be drained
Changes in v16->v17:
- Reword "kfifo semaphore" to "kfifo spinlock" to match fifo_lock.
- Defer the handle_error_source() is_cxl_error() switch to the patch that
registers the kfifo consumer to keep each commit bisect-safe.
- Rename rwsema to rwsem
- Change CPER exports to use EXPORT_SYMBOL_FOR_MODULES.
- Add work cancel function.
- Replace kfifo_put() with kfifo_in_spinlocked() for multiple producers
- Add fifo_lock spinlock for concurrent producer serialisation
- Initialize the embedded kfifo with INIT_KFIFO() in a subsys_initcall so
kfifo->mask, ->esize and ->data are set before first use.
- Clear PCI_ERR_COR_STATUS in cxl_forward_error() after enqueue so the
device is acked for correctable events even when the consumer drops the
event. Uncorrectable status is left for cxl_do_recovery() to clear after
recovery completes, mirroring the AER core convention.
- WARN on double-registration in cxl_register_proto_err_work() to make an
unintended second consumer visible at runtime.
- Add direct rwsem.h, cleanup.h and workqueue.h includes for symbols used
in aer_cxl_vh.c
- Add MAINTAINERS entries for drivers/pci/pcie/aer_cxl_*.c
- Update message
---
MAINTAINERS | 2 +
drivers/pci/pcie/Makefile | 1 +
drivers/pci/pcie/aer.c | 10 --
drivers/pci/pcie/aer_cxl_vh.c | 221 ++++++++++++++++++++++++++++++++++
drivers/pci/pcie/portdrv.h | 6 +
include/linux/aer.h | 24 ++++
6 files changed, 254 insertions(+), 10 deletions(-)
create mode 100644 drivers/pci/pcie/aer_cxl_vh.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 806bd2d80d153..39007aa90b20f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -6526,6 +6526,8 @@ S: Maintained
F: Documentation/driver-api/cxl
F: Documentation/userspace-api/fwctl/fwctl-cxl.rst
F: drivers/cxl/
+F: drivers/pci/pcie/aer_cxl_rch.c
+F: drivers/pci/pcie/aer_cxl_vh.c
F: include/cxl/
F: include/uapi/linux/cxl_mem.h
F: tools/testing/cxl/
diff --git a/drivers/pci/pcie/Makefile b/drivers/pci/pcie/Makefile
index b0b43a18c304b..62d3d3c69a5df 100644
--- a/drivers/pci/pcie/Makefile
+++ b/drivers/pci/pcie/Makefile
@@ -9,6 +9,7 @@ obj-$(CONFIG_PCIEPORTBUS) += pcieportdrv.o bwctrl.o
obj-y += aspm.o
obj-$(CONFIG_PCIEAER) += aer.o err.o tlp.o
obj-$(CONFIG_CXL_RAS) += aer_cxl_rch.o
+obj-$(CONFIG_CXL_RAS) += aer_cxl_vh.o
obj-$(CONFIG_PCIEAER_INJECT) += aer_inject.o
obj-$(CONFIG_PCIE_PME) += pme.o
obj-$(CONFIG_PCIE_DPC) += dpc.o
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index c4fd9c0b2a548..c5bce25df51cb 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1150,16 +1150,6 @@ void pci_aer_unmask_internal_errors(struct pci_dev *dev)
*/
EXPORT_SYMBOL_FOR_MODULES(pci_aer_unmask_internal_errors, "cxl_core");
-#ifdef CONFIG_CXL_RAS
-bool is_aer_internal_error(struct aer_err_info *info)
-{
- if (info->severity == AER_CORRECTABLE)
- return info->status & PCI_ERR_COR_INTERNAL;
-
- return info->status & PCI_ERR_UNC_INTN;
-}
-#endif
-
/**
* pci_aer_handle_error - handle logging error into an event log
* @dev: pointer to pci_dev data structure of error source device
diff --git a/drivers/pci/pcie/aer_cxl_vh.c b/drivers/pci/pcie/aer_cxl_vh.c
new file mode 100644
index 0000000000000..93bed07936100
--- /dev/null
+++ b/drivers/pci/pcie/aer_cxl_vh.c
@@ -0,0 +1,221 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright(c) 2026 AMD Corporation. All rights reserved. */
+
+#include <linux/aer.h>
+#include <linux/atomic.h>
+#include <linux/cleanup.h>
+#include <linux/init.h>
+#include <linux/kfifo.h>
+#include <linux/rwsem.h>
+#include <linux/wait_bit.h>
+#include <linux/workqueue.h>
+#include "../pci.h"
+#include "portdrv.h"
+
+#define CXL_ERROR_SOURCES_MAX 128
+
+struct cxl_proto_err_kfifo {
+ struct work_struct *work;
+ void (*flush)(void);
+ struct rw_semaphore rwsem;
+ spinlock_t fifo_lock;
+ atomic_t flush_inflight;
+ DECLARE_KFIFO(fifo, struct cxl_proto_err_work_data,
+ CXL_ERROR_SOURCES_MAX);
+};
+
+static struct cxl_proto_err_kfifo cxl_proto_err_kfifo = {
+ .rwsem = __RWSEM_INITIALIZER(cxl_proto_err_kfifo.rwsem),
+ .fifo_lock = __SPIN_LOCK_UNLOCKED(cxl_proto_err_kfifo.fifo_lock),
+};
+
+static int __init cxl_proto_err_kfifo_init(void)
+{
+ INIT_KFIFO(cxl_proto_err_kfifo.fifo);
+ return 0;
+}
+subsys_initcall(cxl_proto_err_kfifo_init);
+
+bool is_aer_internal_error(struct aer_err_info *info)
+{
+ if (info->severity == AER_CORRECTABLE)
+ return info->status & PCI_ERR_COR_INTERNAL;
+
+ return info->status & PCI_ERR_UNC_INTN;
+}
+
+bool is_cxl_error(struct pci_dev *pdev, struct aer_err_info *info)
+{
+ if (!info || !info->is_cxl)
+ return false;
+
+ if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ENDPOINT)
+ return false;
+
+ return is_aer_internal_error(info);
+}
+
+/**
+ * cxl_forward_error - Forward a CXL protocol error to the CXL subsystem via kfifo
+ * @pdev: PCI device that reported the AER error
+ * @info: AER error info containing severity and status
+ *
+ * Producer side of the AER-CXL kfifo. Enqueues a CXL protocol error work
+ * item and schedules the consumer workqueue. Takes a reference on @pdev
+ * that the consumer releases after handling.
+ *
+ * Return: true if the caller must flush the kfifo before AER recovery,
+ * false if no CXL error handling was initiated due to early return on
+ * error.
+ */
+bool cxl_forward_error(struct pci_dev *pdev, struct aer_err_info *info)
+{
+ struct cxl_proto_err_work_data wd = {
+ .severity = info->severity,
+ .pdev = pdev,
+ };
+
+ guard(rwsem_read)(&cxl_proto_err_kfifo.rwsem);
+
+ if (!cxl_proto_err_kfifo.work) {
+ dev_err_ratelimited(&pdev->dev, "AER-CXL kfifo reader not registered\n");
+ return false;
+ }
+
+ /*
+ * Reference discipline: the AER caller (handle_error_source())
+ * holds a ref on @pdev for the duration of this call and releases
+ * it on return. Take a fresh ref here so the pdev stays live while
+ * queued in the kfifo; the consumer (for_each_cxl_proto_err())
+ * drops that ref after handling. On enqueue failure below, drop
+ * the ref we just took to avoid a leak.
+ */
+ pci_dev_get(pdev);
+
+ /* Serialize concurrent kfifo writers: multiple AER threaded IRQs */
+ if (!kfifo_in_spinlocked(&cxl_proto_err_kfifo.fifo, &wd, 1,
+ &cxl_proto_err_kfifo.fifo_lock)) {
+ /* Dropped; no panic - UCE unconfirmed without RAS read */
+ dev_err_ratelimited(&pdev->dev, "AER-CXL kfifo add failed\n");
+ pci_dev_put(pdev);
+ schedule_work(cxl_proto_err_kfifo.work);
+ return true;
+ }
+
+ schedule_work(cxl_proto_err_kfifo.work);
+ return true;
+}
+
+void cxl_register_proto_err_work(struct work_struct *work,
+ void (*flush)(void))
+{
+ guard(rwsem_write)(&cxl_proto_err_kfifo.rwsem);
+
+ /*
+ * Warn on double-registration to surface driver bugs (e.g. missing
+ * cxl_unregister_proto_err_work() on module exit)
+ */
+ if (WARN(cxl_proto_err_kfifo.work,
+ "AER-CXL kfifo consumer already registered\n"))
+ return;
+ cxl_proto_err_kfifo.work = work;
+ cxl_proto_err_kfifo.flush = flush;
+}
+EXPORT_SYMBOL_FOR_MODULES(cxl_register_proto_err_work, "cxl_core");
+
+static struct work_struct *cancel_cxl_proto_err(void)
+{
+ struct work_struct *work;
+ struct cxl_proto_err_work_data wd;
+
+ guard(rwsem_write)(&cxl_proto_err_kfifo.rwsem);
+ work = cxl_proto_err_kfifo.work;
+ cxl_proto_err_kfifo.work = NULL;
+ cxl_proto_err_kfifo.flush = NULL;
+
+ /* rwsem_write excludes all producers; fifo_lock not needed */
+ while (kfifo_get(&cxl_proto_err_kfifo.fifo, &wd)) {
+ dev_err_ratelimited(&wd.pdev->dev,
+ "AER-CXL error report canceled\n");
+ pci_dev_put(wd.pdev);
+ }
+ return work;
+}
+
+void cxl_unregister_proto_err_work(void)
+{
+ struct work_struct *work;
+
+ lockdep_assert_not_held(&cxl_proto_err_kfifo.rwsem);
+
+ work = cancel_cxl_proto_err();
+
+ /* Wait for any in-flight cxl_proto_err_flush() calls to complete */
+ wait_var_event(&cxl_proto_err_kfifo.flush_inflight,
+ atomic_read(&cxl_proto_err_kfifo.flush_inflight) == 0);
+
+ if (work)
+ cancel_work_sync(work);
+}
+EXPORT_SYMBOL_FOR_MODULES(cxl_unregister_proto_err_work, "cxl_core");
+
+/**
+ * for_each_cxl_proto_err - Call a function for each kfifo work item
+ *
+ * Single-consumer invariant: this function is only called from
+ * cxl_proto_err_work_fn() via a single DECLARE_WORK.
+ *
+ * Holds rwsem_read internally; fn() must not call cxl_register_proto_err_work()
+ * or cxl_unregister_proto_err_work().
+ */
+void for_each_cxl_proto_err(struct cxl_proto_err_work_data *wd,
+ cxl_proto_err_fn_t fn)
+{
+ guard(rwsem_read)(&cxl_proto_err_kfifo.rwsem);
+ while (kfifo_get(&cxl_proto_err_kfifo.fifo, wd)) {
+ fn(wd);
+ pci_dev_put(wd->pdev);
+ }
+}
+EXPORT_SYMBOL_FOR_MODULES(for_each_cxl_proto_err, "cxl_core");
+
+/**
+ * cxl_proto_err_flush - drain pending AER-CXL kfifo work synchronously
+ *
+ * Wait for the consumer worker to finish processing all entries
+ * currently in the kfifo. Used by handle_error_source() for UCE so
+ * the CXL plane can read CXL RAS, apply panic policy, and clear CXL
+ * state before pci_aer_handle_error() drives PCIe recovery.
+ *
+ * Snapshots the flush callback under rwsem_read and releases the rwsem
+ * before calling it. This avoids holding rwsem_read across flush_work(),
+ * which would deadlock via the rwsem HANDOFF mechanism when a concurrent
+ * rwsem_write waiter (cxl_unregister_proto_err_work) blocks new readers
+ * including the worker's for_each_cxl_proto_err() rwsem_read acquisition.
+ *
+ * The flush_inflight counter prevents cxl_core module unload while a
+ * flush is in progress outside the rwsem. The counter is incremented
+ * under rwsem_read (mutually exclusive with the rwsem_write in
+ * cancel_cxl_proto_err() that NULLs the flush pointer) and decremented
+ * after the flush completes. cxl_unregister_proto_err_work() waits for
+ * the counter to reach zero before proceeding with cancel_work_sync().
+ *
+ * For correctable events the consumer can run asynchronously; AER
+ * does not need to call this helper for AER_CORRECTABLE.
+ */
+void cxl_proto_err_flush(void)
+{
+ void (*flush)(void);
+
+ scoped_guard(rwsem_read, &cxl_proto_err_kfifo.rwsem) {
+ flush = cxl_proto_err_kfifo.flush;
+ if (flush)
+ atomic_inc(&cxl_proto_err_kfifo.flush_inflight);
+ }
+
+ if (flush) {
+ flush();
+ if (atomic_dec_and_test(&cxl_proto_err_kfifo.flush_inflight))
+ wake_up_var(&cxl_proto_err_kfifo.flush_inflight);
+ }
+}
diff --git a/drivers/pci/pcie/portdrv.h b/drivers/pci/pcie/portdrv.h
index cc58bf2f2c844..fd203010877bf 100644
--- a/drivers/pci/pcie/portdrv.h
+++ b/drivers/pci/pcie/portdrv.h
@@ -130,9 +130,15 @@ struct aer_err_info;
bool is_aer_internal_error(struct aer_err_info *info);
void cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info);
void cxl_rch_enable_rcec(struct pci_dev *rcec);
+bool is_cxl_error(struct pci_dev *pdev, struct aer_err_info *info);
+bool cxl_forward_error(struct pci_dev *pdev, struct aer_err_info *info);
+void cxl_proto_err_flush(void);
#else
static inline bool is_aer_internal_error(struct aer_err_info *info) { return false; }
static inline void cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info) { }
static inline void cxl_rch_enable_rcec(struct pci_dev *rcec) { }
+static inline bool is_cxl_error(struct pci_dev *pdev, struct aer_err_info *info) { return false; }
+static inline bool cxl_forward_error(struct pci_dev *pdev, struct aer_err_info *info) { return false; }
+static inline void cxl_proto_err_flush(void) { }
#endif /* CONFIG_CXL_RAS */
#endif /* _PORTDRV_H_ */
diff --git a/include/linux/aer.h b/include/linux/aer.h
index df0f5c382286f..8eba3192e2d15 100644
--- a/include/linux/aer.h
+++ b/include/linux/aer.h
@@ -25,6 +25,7 @@
#define PCIE_STD_MAX_TLP_HEADERLOG (PCIE_STD_NUM_TLP_HEADERLOG + 10)
struct pci_dev;
+struct work_struct;
struct pcie_tlp_log {
union {
@@ -66,6 +67,29 @@ static inline int pcie_aer_is_native(struct pci_dev *dev) { return 0; }
static inline void pci_aer_unmask_internal_errors(struct pci_dev *dev) { }
#endif
+#ifdef CONFIG_CXL_RAS
+/**
+ * struct cxl_proto_err_work_data - Error information used in CXL error handling
+ * @pdev: PCI device detecting the error
+ * @severity: AER severity
+ */
+struct cxl_proto_err_work_data {
+ struct pci_dev *pdev;
+ int severity;
+};
+
+/**
+ * Callback for processing a CXL protocol error from the AER-CXL kfifo.
+ */
+typedef void (*cxl_proto_err_fn_t)(struct cxl_proto_err_work_data *wd);
+
+void cxl_register_proto_err_work(struct work_struct *work,
+ void (*flush)(void));
+void for_each_cxl_proto_err(struct cxl_proto_err_work_data *wd,
+ cxl_proto_err_fn_t fn);
+void cxl_unregister_proto_err_work(void);
+#endif
+
void pci_print_aer(struct pci_dev *dev, int aer_severity,
struct aer_capability_regs *aer);
int cper_severity_to_aer(int cper_severity);
--
2.34.1
^ permalink raw reply related
* [PATCH v18 06/13] PCI: Establish common CXL Port protocol error flow
From: Terry Bowman @ 2026-07-17 22:26 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
Add CXL protocol error dispatch in handle_error_source() using
is_cxl_error() and cxl_forward_error() to route errors through the
AER-CXL kfifo. Expand is_cxl_error() from Endpoint-only to include
Root Port, Upstream Port, and Downstream Port device types. The
producer and consumer go live in the same commit to avoid silently
dropping CXL errors during bisect.
For uncorrectable events, call cxl_proto_err_flush() to ensure CXL RAS
registers are read, panic policy is applied, and CXL state is cleared
before pci_aer_handle_error() drives PCIe recovery. Without the flush,
AER recovery can tear down drivers and unmap the CXL RAS iomaps while
the kfifo consumer is still reading them. Correctable events do not
need the flush and run asynchronously. RCH kfifo support is added in
the following patch ("PCI/CXL: Add RCH support to CXL handlers").
Add cxl_handle_proto_error() to dispatch correctable and uncorrectable
errors through the CXL RAS helpers. Add cxl_do_recovery() to coordinate
uncorrectable recovery. Panic when a UCE is confirmed by a successful
CXL RAS status register read. If the RAS registers cannot be read the
UCE cannot be confirmed and panic is not triggered. Gate error handling
on the port driver being bound to avoid processing errors on disabled
devices.
The kfifo consumer holds guard(device)(&port->dev) and checks
port->dev.driver before accessing RAS registers, serializing against
driver unbind and devm iomap teardown. For UCE, cxl_proto_err_flush()
runs the worker synchronously before AER recovery, ensuring the device
is present during RAS register access.
Add to_ras_base() to centralize RAS base lookup: dport->regs.ras for
Root/Downstream Ports, port->regs.ras for Upstream Ports and Endpoints.
Use to_ras_base() to access the CXL devices' RAS registers as it will
provide an avenue to inject status simulation during testing.
Add CXL RAS logging in cxl_handle_cor_ras() and cxl_handle_ras(). The
existing cxl_cor_error_detected() and cxl_error_detected() AER
callbacks remain for all Endpoints and are reworked to use
find_cxl_port_by_uport() and to_ras_base(), with UCE now triggering
panic unconditionally. These callbacks are further updated in the
following patch ("PCI/CXL: Add RCH support to CXL handlers").
Fix a pre-existing race for cxlds between cxl_handle_rdport_errors() and
cxl_memdev_shutdown() by holding a cxlmd device scoped_guard() around
the rdport call. Release the lock before taking the Port lock to avoid
the lock inversion.
Co-developed-by: Dan Williams <djbw@kernel.org>
Signed-off-by: Dan Williams <djbw@kernel.org>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17->v18:
- Fix pre-existing race: hold memdev device lock around
cxl_handle_rdport_errors(), release before port lock
- Fix handle_error_source() to call pci_aer_handle_error() unconditionally
so AER handling always runs after cxl_forward_error()
- Add cxl_proto_err_flush() call for CXL UCE to drain kfifo before AER
recovery tears down the device
- Fix NULL dereference of dport->dport_dev in cxl_handle_cor_ras() and
cxl_handle_ras() for UPSTREAM/ENDPOINT port types: use dport->dport_dev
when dport is non-NULL, else fall back to port->uport_dev
- Remove duplicate pcie_clear_device_status() call from
cxl_handle_proto_error() CE path; pci_aer_handle_error() already clears it
- Clarify panic policy: panic only on confirmed UCE via RAS status read
- Document kfifo consumer serialization against driver unbind via
guard(device)(&port->dev) and port->dev.driver check
Changes in v16->v17:
- get_cxl_port() -> find_cxl_port_by_dev()
- Simplified find_cxl_port_by_dev()
- Replace and remove cxl_serial_number() w/ pci_get_dsn()
- cxl_get_ras_base() -> to_ras_base()
- Drop dependency on PCI_ERS_RESULT_PANIC; cxl_do_recovery() panics
directly. (PANIC enum patch dropped from series.)
- Clarify panic semantics: panic on any uncorrectable CXL RAS error, not
only AER-FATAL severities.
- Add is_cxl_error() switch in handle_error_source() here, paired with the
kfifo consumer registration, to keep each commit bisect-safe.
- Drop pcie_aer_is_native() guard in cxl_do_recovery() (always native).
- Swap order with the "Limit" patch for bisectability w/ cxl_ras_exit()
- Reword for "any uncorrectable" CXL RAS error panics.
- Restore log messages for port-not-found and port-unbound cases.
- Whitespace cleanup (Jonathan)
- Update to get_cxl_port() documentation (Terry)
- Fix __cxl_proto_err_work_fn() to return 0 for transient errors.
- Drop !port check in cxl_do_recovery(), caller already validated
- Fix kerneldoc @pdev -> @dev in find_cxl_port_by_dev()
- Fix missing space in pr_err_ratelimited()
- Made pcie_clear_device_status() and pci_aer_clear_fatal_status()
EXPORT_SYMBOL_FOR_MODULES("cxl_core") (Dan)
- Move find_cxl_port_by_dport() and find_cxl_port_by_uport()
de-staticisation and core.h declarations from the rename patch to
here, where the first cross-file callers in find_cxl_port_by_dev()
land.
Changes in v15->v16:
- get_ras_base(), initialize dport to NULL (Jonathan)
- Remove guard(device)(&cxlmd->dev) (Jonathan)
- Fix dev_warns() (Jonathan)
- Remove comment in cxl_port_error_detected() (Dan)
- Update switch-case brackets to follow clang-format (Dan)
- Add PCI_EXP_TYPE_RC_END for cxl_get_ras_base() (Terry)
- Add NULL port check in cxl_serial_number() (Terry)
Changes in v14->v15:
- Update commit message and title. Added Bjorn's ack.
- Move CE and UCE handling logic here
Changes in v13->v14:
- Add Dave Jiang's review-by
- Update commit message & headline (Bjorn)
- Refactor cxl_port_error_detected()/cxl_port_cor_error_detected() to
one line (Jonathan)
- Remove cxl_walk_port() (Dan)
- Remove cxl_pci_drv_bound(). Check for 'is_cxl' parent port is
sufficient (Dan)
- Remove device_lock_if()
- Combined CE and UCE here (Terry)
Changes in v12->v13:
- Move get_pci_cxl_host_dev() and cxl_handle_proto_error() to Dequeue
patch (Terry)
- Remove EP case in cxl_get_ras_base(), not used. (Terry)
- Remove check for dport->dport_dev (Dave)
- Remove whitespace (Terry)
Changes in v11->v12:
- Add call to cxl_pci_drv_bound() in cxl_handle_proto_error() and
pci_to_cxl_dev()
- Change cxl_error_detected() -> cxl_cor_error_detected()
- Remove NULL variable assignments
- Replace bus_find_device() with find_cxl_port_by_uport() for upstream
port searches.
Changes in v10->v11:
- None
---
drivers/cxl/core/core.h | 7 ++
drivers/cxl/core/port.c | 6 +-
drivers/cxl/core/ras.c | 223 +++++++++++++++++++++++++++-------
drivers/pci/pci.h | 1 -
drivers/pci/pcie/aer.c | 13 ++
drivers/pci/pcie/aer_cxl_vh.c | 16 ++-
6 files changed, 220 insertions(+), 46 deletions(-)
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index 23fe40ddf4c6b..7c70bea06c2db 100644
--- a/drivers/cxl/core/core.h
+++ b/drivers/cxl/core/core.h
@@ -186,6 +186,8 @@ static inline struct device *dport_to_host(struct cxl_dport *dport)
void cxl_ras_init(void);
void cxl_ras_exit(void);
bool cxl_handle_ras(struct device *dev, void __iomem *ras_base);
+void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
+ struct cxl_dport *dport);
void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base);
void cxl_dport_map_rch_aer(struct cxl_dport *dport);
void cxl_disable_rch_root_ints(struct cxl_dport *dport);
@@ -198,6 +200,8 @@ static inline bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
{
return false;
}
+static inline void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
+ struct cxl_dport *dport) { }
static inline void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base) { }
static inline void cxl_dport_map_rch_aer(struct cxl_dport *dport) { }
static inline void cxl_disable_rch_root_ints(struct cxl_dport *dport) { }
@@ -206,6 +210,9 @@ static inline void devm_cxl_dport_ras_setup(struct cxl_dport *dport) { }
#endif /* CONFIG_CXL_RAS */
int cxl_gpf_port_setup(struct cxl_dport *dport);
+struct cxl_port *find_cxl_port_by_dport(struct device *dport_dev,
+ struct cxl_dport **dport);
+struct cxl_port *find_cxl_port_by_uport(struct device *uport_dev);
struct cxl_hdm;
int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm,
diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index cadb51f70f854..a76f3ee05cba8 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -1400,8 +1400,8 @@ static struct cxl_port *__find_cxl_port_by_dport(struct cxl_find_port_ctx *ctx)
* Return a 'struct cxl_port' with an elevated reference if found. Use
* __free(put_cxl_port) to release.
*/
-static struct cxl_port *find_cxl_port_by_dport(struct device *dport_dev,
- struct cxl_dport **dport)
+struct cxl_port *find_cxl_port_by_dport(struct device *dport_dev,
+ struct cxl_dport **dport)
{
struct cxl_find_port_ctx ctx = {
.dport_dev = dport_dev,
@@ -1596,7 +1596,7 @@ static int match_port_by_uport(struct device *dev, const void *data)
* Function takes a device reference on the port device. Caller should do a
* put_device() when done.
*/
-static struct cxl_port *find_cxl_port_by_uport(struct device *uport_dev)
+struct cxl_port *find_cxl_port_by_uport(struct device *uport_dev)
{
struct device *dev;
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index 135f1997e6f4f..b190e69c2d415 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -77,6 +77,36 @@ static int match_memdev_by_parent(struct device *dev, const void *uport)
return 0;
}
+
+/**
+ * find_cxl_port_by_dev - Use @dev as hint to do a _by_dport or _by_uport lookup
+ * @dev: generic device that may either be a companion of port or target dport
+ * @dport: output parameter; set to the matched dport for dport-class
+ * lookups (Root Port, Downstream Port), NULL otherwise.
+ *
+ * Return a 'struct cxl_port' with an elevated reference if found. Use
+ * __free(put_cxl_port) to release.
+ */
+static struct cxl_port *find_cxl_port_by_dev(struct device *dev, struct cxl_dport **dport)
+{
+ if (dport)
+ *dport = NULL;
+ if (!dev_is_pci(dev))
+ return NULL;
+
+ switch (pci_pcie_type(to_pci_dev(dev))) {
+ case PCI_EXP_TYPE_ROOT_PORT:
+ case PCI_EXP_TYPE_DOWNSTREAM:
+ return find_cxl_port_by_dport(dev, dport);
+ case PCI_EXP_TYPE_UPSTREAM:
+ case PCI_EXP_TYPE_ENDPOINT:
+ case PCI_EXP_TYPE_RC_END:
+ return find_cxl_port_by_uport(dev);
+ }
+
+ return NULL;
+}
+
void cxl_cper_handle_prot_err(struct cxl_cper_prot_err_work_data *data)
{
unsigned int devfn = PCI_DEVFN(data->prot_err.agent_addr.device,
@@ -132,16 +162,6 @@ static void cxl_cper_prot_err_work_fn(struct work_struct *work)
}
static DECLARE_WORK(cxl_cper_prot_err_work, cxl_cper_prot_err_work_fn);
-void cxl_ras_init(void)
-{
- cxl_cper_register_prot_err_work(&cxl_cper_prot_err_work);
-}
-
-void cxl_ras_exit(void)
-{
- cxl_cper_unregister_prot_err_work();
-}
-
static void cxl_dport_map_ras(struct cxl_dport *dport)
{
struct cxl_register_map *map = &dport->reg_map;
@@ -198,10 +218,39 @@ void devm_cxl_port_ras_setup(struct cxl_port *port)
}
EXPORT_SYMBOL_NS_GPL(devm_cxl_port_ras_setup, "CXL");
+static void __iomem *to_ras_base(struct cxl_port *port, struct cxl_dport *dport)
+{
+ if (!port)
+ return NULL;
+
+ if (dport)
+ return dport->regs.ras;
+
+ return port->regs.ras;
+}
+
+void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port, struct cxl_dport *dport)
+{
+ struct device *dev = dport ? dport->dport_dev : port->uport_dev;
+ void __iomem *ras_base = to_ras_base(port, dport);
+
+ if (!ras_base) {
+ dev_err(&pdev->dev,
+ "CXL UCE signaled but RAS registers not mapped\n");
+ return;
+ }
+
+ if (cxl_handle_ras(dev, ras_base))
+ panic("CXL cachemem error");
+
+ dev_dbg(&pdev->dev,
+ "CXL UCE signaled but no CXL RAS status bits set\n");
+}
+
void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base)
{
- void __iomem *addr;
u32 status;
+ void __iomem *addr;
if (!ras_base)
return;
@@ -210,7 +259,10 @@ void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base)
status = readl(addr);
if (status & CXL_RAS_CORRECTABLE_STATUS_MASK) {
writel(status & CXL_RAS_CORRECTABLE_STATUS_MASK, addr);
- trace_cxl_aer_correctable_error(to_cxl_memdev(dev), status);
+ if (is_cxl_memdev(dev))
+ trace_cxl_aer_correctable_error(to_cxl_memdev(dev), status);
+ else
+ trace_cxl_port_aer_correctable_error(dev, status);
}
}
@@ -262,7 +314,11 @@ bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
}
header_log_copy(ras_base, hl);
- trace_cxl_aer_uncorrectable_error(to_cxl_memdev(dev), status, fe, hl);
+ if (is_cxl_memdev(dev))
+ trace_cxl_aer_uncorrectable_error(to_cxl_memdev(dev), status, fe, hl);
+ else
+ trace_cxl_port_aer_uncorrectable_error(dev, status, fe, hl);
+
writel(status & CXL_RAS_UNCORRECTABLE_STATUS_MASK, addr);
return true;
@@ -270,22 +326,32 @@ bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
void cxl_cor_error_detected(struct pci_dev *pdev)
{
- struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
- struct cxl_memdev *cxlmd = cxlds->cxlmd;
- struct device *dev = &cxlds->cxlmd->dev;
+ guard(device)(&pdev->dev);
+ if (!pdev->dev.driver)
+ return;
+
+ struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_uport(&pdev->dev);
+ if (!port)
+ return;
+
+ if (is_cxl_restricted(pdev)) {
+ struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
+ struct cxl_memdev *cxlmd = cxlds->cxlmd;
- scoped_guard(device, dev) {
- if (!dev->driver) {
+ scoped_guard(device, &cxlmd->dev) {
+ cxl_handle_rdport_errors(cxlds);
+ }
+ }
+
+ scoped_guard(device, &port->dev) {
+ if (!port->dev.driver) {
dev_warn(&pdev->dev,
- "%s: memdev disabled, abort error handling\n",
- dev_name(dev));
+ "%s: port disabled, abort error handling\n",
+ dev_name(&port->dev));
return;
}
- if (cxlds->rcd)
- cxl_handle_rdport_errors(cxlds);
-
- cxl_handle_cor_ras(&cxlds->cxlmd->dev, cxlmd->endpoint->regs.ras);
+ cxl_handle_cor_ras(port->uport_dev, to_ras_base(port, NULL));
}
}
EXPORT_SYMBOL_NS_GPL(cxl_cor_error_detected, "CXL");
@@ -293,42 +359,53 @@ EXPORT_SYMBOL_NS_GPL(cxl_cor_error_detected, "CXL");
pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
pci_channel_state_t state)
{
- struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
- struct cxl_memdev *cxlmd = cxlds->cxlmd;
- struct device *dev = &cxlmd->dev;
- bool ue;
+ struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_uport(&pdev->dev);
+ bool ue = false;
- scoped_guard(device, dev) {
- if (!dev->driver) {
+ if (!port)
+ return PCI_ERS_RESULT_DISCONNECT;
+
+ if (is_cxl_restricted(pdev)) {
+ struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
+ struct cxl_memdev *cxlmd = cxlds->cxlmd;
+
+ scoped_guard(device, &cxlmd->dev) {
+ cxl_handle_rdport_errors(cxlds);
+ }
+ }
+
+ scoped_guard(device, &port->dev) {
+ if (!port->dev.driver) {
dev_warn(&pdev->dev,
- "%s: memdev disabled, abort error handling\n",
- dev_name(dev));
+ "%s: port disabled, abort error handling\n",
+ dev_name(&port->dev));
return PCI_ERS_RESULT_DISCONNECT;
}
- if (cxlds->rcd)
- cxl_handle_rdport_errors(cxlds);
/*
* A frozen channel indicates an impending reset which is fatal to
* CXL.mem operation, and will likely crash the system. On the off
* chance the situation is recoverable dump the status of the RAS
* capability registers and bounce the active state of the memdev.
*/
- ue = cxl_handle_ras(&cxlds->cxlmd->dev, cxlmd->endpoint->regs.ras);
+ ue = cxl_handle_ras(port->uport_dev, to_ras_base(port, NULL));
}
+ /*
+ * CXL.mem UCE means cache coherency is lost. Continuing risks
+ * silent data corruption across interleaved HDM regions.
+ */
+ if (ue)
+ panic("CXL cachemem error");
+
switch (state) {
case pci_channel_io_normal:
- if (ue) {
- device_release_driver(dev);
- return PCI_ERS_RESULT_NEED_RESET;
- }
return PCI_ERS_RESULT_CAN_RECOVER;
case pci_channel_io_frozen:
dev_warn(&pdev->dev,
"%s: frozen state error detected, disable CXL.mem\n",
- dev_name(dev));
- device_release_driver(dev);
+ dev_name(port->uport_dev));
+ device_release_driver(port->uport_dev);
return PCI_ERS_RESULT_NEED_RESET;
case pci_channel_io_perm_failure:
dev_warn(&pdev->dev,
@@ -338,3 +415,67 @@ pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
return PCI_ERS_RESULT_NEED_RESET;
}
EXPORT_SYMBOL_NS_GPL(cxl_error_detected, "CXL");
+
+static void cxl_handle_proto_error(struct pci_dev *pdev, struct cxl_port *port,
+ struct cxl_dport *dport, int severity)
+{
+ struct device *dev = dport ? dport->dport_dev : port->uport_dev;
+
+ if (severity == AER_CORRECTABLE)
+ cxl_handle_cor_ras(dev, to_ras_base(port, dport));
+ else
+ cxl_do_recovery(pdev, port, dport);
+}
+
+static void __cxl_proto_err_work_fn(struct cxl_proto_err_work_data *wd)
+{
+ struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_dev(&wd->pdev->dev, NULL);
+ if (!port) {
+ dev_err_ratelimited(&wd->pdev->dev,
+ "Failed to find parent port device in CXL topology\n");
+ return;
+ }
+ guard(device)(&port->dev);
+ if (!port->dev.driver) {
+ dev_err_ratelimited(&port->dev,
+ "Port device is unbound, abort error handling\n");
+ return;
+ }
+
+ struct cxl_dport *dport = cxl_find_dport_by_dev(port, &wd->pdev->dev);
+ if (!dport && (pci_pcie_type(wd->pdev) == PCI_EXP_TYPE_ROOT_PORT ||
+ pci_pcie_type(wd->pdev) == PCI_EXP_TYPE_DOWNSTREAM)) {
+ dev_err_ratelimited(&wd->pdev->dev,
+ "Failed to find dport device in CXL topology\n");
+ return;
+ }
+
+ cxl_handle_proto_error(wd->pdev, port, dport, wd->severity);
+}
+
+static void cxl_proto_err_work_fn(struct work_struct *work)
+{
+ struct cxl_proto_err_work_data wd;
+
+ for_each_cxl_proto_err(&wd, __cxl_proto_err_work_fn);
+}
+
+static DECLARE_WORK(cxl_proto_err_work, cxl_proto_err_work_fn);
+
+static void cxl_proto_err_do_flush(void)
+{
+ flush_work(&cxl_proto_err_work);
+}
+
+void cxl_ras_init(void)
+{
+ cxl_cper_register_prot_err_work(&cxl_cper_prot_err_work);
+ cxl_register_proto_err_work(&cxl_proto_err_work,
+ cxl_proto_err_do_flush);
+}
+
+void cxl_ras_exit(void)
+{
+ cxl_unregister_proto_err_work();
+ cxl_cper_unregister_prot_err_work();
+}
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 4469e1a77f3c1..a83e2aef75912 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -1296,7 +1296,6 @@ void pci_restore_aer_state(struct pci_dev *dev);
static inline void pci_no_aer(void) { }
static inline void pci_aer_init(struct pci_dev *d) { }
static inline void pci_aer_exit(struct pci_dev *d) { }
-static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { }
static inline int pci_aer_clear_status(struct pci_dev *dev) { return -EINVAL; }
static inline int pci_aer_raw_clear_status(struct pci_dev *dev) { return -EINVAL; }
static inline void pci_save_aer_state(struct pci_dev *dev) { }
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index c5bce25df51cb..2d9d40528e709 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1185,7 +1185,20 @@ static void pci_aer_handle_error(struct pci_dev *dev, struct aer_err_info *info)
static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info)
{
+ bool cxl_pending = false;
+
cxl_rch_handle_error(dev, info);
+
+ if (is_cxl_error(dev, info))
+ cxl_pending |= cxl_forward_error(dev, info);
+
+ /*
+ * Wait for UCE CXL work to complete before AER recovery
+ * tears down the device. CE can run asynchronously.
+ */
+ if (cxl_pending && info->severity != AER_CORRECTABLE)
+ cxl_proto_err_flush();
+
pci_aer_handle_error(dev, info);
pci_dev_put(dev);
}
diff --git a/drivers/pci/pcie/aer_cxl_vh.c b/drivers/pci/pcie/aer_cxl_vh.c
index 93bed07936100..ecf47bba0c9d4 100644
--- a/drivers/pci/pcie/aer_cxl_vh.c
+++ b/drivers/pci/pcie/aer_cxl_vh.c
@@ -49,8 +49,22 @@ bool is_cxl_error(struct pci_dev *pdev, struct aer_err_info *info)
if (!info || !info->is_cxl)
return false;
- if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ENDPOINT)
+ /*
+ * RC_END (Restricted CXL Device) is not included here because RC_END
+ * reports errors on behalf of upstream RCH Downstream Port and thus
+ * requires a unique discovery detailed in CXL4.0 spec (12.2.1.1).
+ * The RCH device error discovery and RC_END forwarding flow begins
+ * in cxl_rch_handle_error().
+ */
+ switch (pci_pcie_type(pdev)) {
+ case PCI_EXP_TYPE_ENDPOINT:
+ case PCI_EXP_TYPE_ROOT_PORT:
+ case PCI_EXP_TYPE_UPSTREAM:
+ case PCI_EXP_TYPE_DOWNSTREAM:
+ break;
+ default:
return false;
+ }
return is_aer_internal_error(info);
}
--
2.34.1
^ permalink raw reply related
* [PATCH v18 07/13] PCI/CXL: Add RCH support to CXL handlers
From: Terry Bowman @ 2026-07-17 22:27 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
Restricted CXL Host (RCH) error handling is a separate path from the
new CXL Port error handling flow. Fold RCH error handling into the
Port flow so both share a common entry point.
Update cxl_rch_handle_error_iter() to forward RCH protocol errors
through the AER-CXL kfifo. Change cxl_rch_handle_error() return type
from void to bool so handle_error_source() can determine whether work
was enqueued and call cxl_proto_err_flush() before AER recovery
proceeds.
For RC_END devices, __cxl_proto_err_work_fn() calls
cxl_handle_rdport_errors() to process RCH Downstream Port errors,
then falls through to the VH path for RC_END Endpoint handling.
An RCD uncorrectable CXL RAS error now panics via cxl_do_recovery().
Before this patch the RCH Downstream Port UCE path called
cxl_handle_ras() but ignored its return value - no panic. After this
patch the same condition calls cxl_do_recovery() which panics on
confirmed UCE. The Endpoint UCE path already panicked at the parent
commit. This matches the panic policy added in the common CXL Port
protocol error flow.
Remove cxl_cor_error_detected() and its .cor_error_detected
registration in cxl_error_handlers. Correctable Endpoint errors are
now routed through the AER-CXL kfifo like all other CXL protocol
errors.
Drop the cxlds->rcd / cxl_handle_rdport_errors(cxlds) branches from
cxl_error_detected(). RCH downstream port error handling is now
performed by __cxl_proto_err_work_fn() via the kfifo path, which
calls cxl_handle_rdport_errors(pdev) before the common dispatch.
Change cxl_handle_rdport_errors() to take a struct pci_dev * instead
of a struct cxl_dev_state *, matching the new caller context. Re-fetch
dport under guard() to close the TOCTOU window between
cxl_pci_find_port()'s lockless xa_load() and the first dereference of
the returned pointer.
Change find_cxl_port_by_dev() RC_END lookup from
find_cxl_port_by_dport(dev->parent) to find_cxl_port_by_uport(dev),
matching the Endpoint lookup path. RC_END Endpoint port resolution
uses the uport (the RC_END device itself), while the separate RCH
Downstream Port lookup is handled by cxl_handle_rdport_errors().
The RCH Downstream Port and the RCD Endpoint (RC_END) are separate
devices with independent RAS register blocks. cxl_handle_rdport_errors()
handles the RCH Downstream Port RAS. RCD Endpoint (RC_END) is handled in
cxl_handle_proto_error().
Use to_ras_base() in cxl_handle_rdport_errors() instead of referencing
dport->regs.ras directly. Make to_ras_base() non-static in ras.c and
declare it in core.h so ras_rch.c can access it. Route all RAS base address lookups
through a single helper to prepare for CXL RAS error injection testing
that follows this series.
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17->v18:
- Pass &pdev->dev instead of dport->port->uport_dev in
cxl_handle_rdport_errors() to avoid dropping RCH trace events.
- Document trace event attribution change.
- Document removal of cxl_cor_error_detected() and cxlds->rcd branches.
- Capitalize Endpoint per PCI spec convention.
- Use to_ras_base() in cxl_handle_rdport_errors() to centralize RAS base
address lookup in preparation for error injection testing.
Changes in v16->v17:
- Drop now-dead cxlds->rcd branches from cxl_{cor_,}error_detected().
- Drop duplicate subject line from commit body.
- Document panic-on-uncorrectable behavior change for RCD path.
- Document trace event device-name change (memN -> PCI BDF) for RCH path.
- Rewrite cxl_handle_proto_error() RC_END comment to clarify RCD/RCH shared
interrupt relationship
- Rewrite commit message
Changes in v16:
- New commit
---
drivers/cxl/core/core.h | 10 +++++--
drivers/cxl/core/ras.c | 50 ++++++++--------------------------
drivers/cxl/core/ras_rch.c | 16 ++++++-----
drivers/cxl/cxlpci.h | 3 --
drivers/cxl/pci.c | 1 -
drivers/pci/pcie/aer.c | 4 +--
drivers/pci/pcie/aer_cxl_rch.c | 39 ++++++++++++--------------
drivers/pci/pcie/portdrv.h | 4 +--
8 files changed, 48 insertions(+), 79 deletions(-)
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index 7c70bea06c2db..272634ff2615b 100644
--- a/drivers/cxl/core/core.h
+++ b/drivers/cxl/core/core.h
@@ -191,7 +191,8 @@ void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base);
void cxl_dport_map_rch_aer(struct cxl_dport *dport);
void cxl_disable_rch_root_ints(struct cxl_dport *dport);
-void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds);
+void cxl_handle_rdport_errors(struct pci_dev *pdev);
+void __iomem *to_ras_base(struct cxl_port *port, struct cxl_dport *dport);
void devm_cxl_dport_ras_setup(struct cxl_dport *dport);
#else
static inline void cxl_ras_init(void) { }
@@ -205,7 +206,12 @@ static inline void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
static inline void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base) { }
static inline void cxl_dport_map_rch_aer(struct cxl_dport *dport) { }
static inline void cxl_disable_rch_root_ints(struct cxl_dport *dport) { }
-static inline void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds) { }
+static inline void cxl_handle_rdport_errors(struct pci_dev *pdev) { }
+static inline void __iomem *to_ras_base(struct cxl_port *port,
+ struct cxl_dport *dport)
+{
+ return NULL;
+}
static inline void devm_cxl_dport_ras_setup(struct cxl_dport *dport) { }
#endif /* CONFIG_CXL_RAS */
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index b190e69c2d415..9a142abcf4f8b 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -218,7 +218,8 @@ void devm_cxl_port_ras_setup(struct cxl_port *port)
}
EXPORT_SYMBOL_NS_GPL(devm_cxl_port_ras_setup, "CXL");
-static void __iomem *to_ras_base(struct cxl_port *port, struct cxl_dport *dport)
+
+void __iomem *to_ras_base(struct cxl_port *port, struct cxl_dport *dport)
{
if (!port)
return NULL;
@@ -324,37 +325,7 @@ bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
return true;
}
-void cxl_cor_error_detected(struct pci_dev *pdev)
-{
- guard(device)(&pdev->dev);
- if (!pdev->dev.driver)
- return;
-
- struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_uport(&pdev->dev);
- if (!port)
- return;
-
- if (is_cxl_restricted(pdev)) {
- struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
- struct cxl_memdev *cxlmd = cxlds->cxlmd;
- scoped_guard(device, &cxlmd->dev) {
- cxl_handle_rdport_errors(cxlds);
- }
- }
-
- scoped_guard(device, &port->dev) {
- if (!port->dev.driver) {
- dev_warn(&pdev->dev,
- "%s: port disabled, abort error handling\n",
- dev_name(&port->dev));
- return;
- }
-
- cxl_handle_cor_ras(port->uport_dev, to_ras_base(port, NULL));
- }
-}
-EXPORT_SYMBOL_NS_GPL(cxl_cor_error_detected, "CXL");
pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
pci_channel_state_t state)
@@ -365,14 +336,6 @@ pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
if (!port)
return PCI_ERS_RESULT_DISCONNECT;
- if (is_cxl_restricted(pdev)) {
- struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
- struct cxl_memdev *cxlmd = cxlds->cxlmd;
-
- scoped_guard(device, &cxlmd->dev) {
- cxl_handle_rdport_errors(cxlds);
- }
- }
scoped_guard(device, &port->dev) {
if (!port->dev.driver) {
@@ -429,6 +392,15 @@ static void cxl_handle_proto_error(struct pci_dev *pdev, struct cxl_port *port,
static void __cxl_proto_err_work_fn(struct cxl_proto_err_work_data *wd)
{
+ /*
+ * For RC_END (RCD) devices, handle RCH Downstream Port errors
+ * first. cxl_handle_rdport_errors() does its own port lookup
+ * and locking, keeping the Downstream Port lock separate from the
+ * Endpoint Port lock taken below.
+ */
+ if (is_cxl_restricted(wd->pdev))
+ cxl_handle_rdport_errors(wd->pdev);
+
struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_dev(&wd->pdev->dev, NULL);
if (!port) {
dev_err_ratelimited(&wd->pdev->dev,
diff --git a/drivers/cxl/core/ras_rch.c b/drivers/cxl/core/ras_rch.c
index 44b335d560708..f2d2fb83758b9 100644
--- a/drivers/cxl/core/ras_rch.c
+++ b/drivers/cxl/core/ras_rch.c
@@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright(c) 2025 AMD Corporation. All rights reserved. */
-#include <linux/types.h>
#include <linux/aer.h>
#include "cxl.h"
#include "core.h"
@@ -96,18 +95,21 @@ static bool cxl_rch_get_aer_severity(struct aer_capability_regs *aer_regs,
return false;
}
-void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds)
+void cxl_handle_rdport_errors(struct pci_dev *pdev)
{
- struct pci_dev *pdev = to_pci_dev(cxlds->dev);
struct aer_capability_regs aer_regs;
struct cxl_dport *dport;
int severity;
- struct cxl_port *port __free(put_cxl_port) =
- cxl_pci_find_port(pdev, &dport);
+ struct cxl_port *port __free(put_cxl_port) = cxl_pci_find_port(pdev, NULL);
if (!port)
return;
+ guard(device)(&port->dev);
+ dport = cxl_find_dport_by_dev(port, pdev->dev.parent);
+ if (!dport)
+ return;
+
if (!cxl_rch_get_aer_info(dport->regs.dport_aer, &aer_regs))
return;
@@ -116,7 +118,7 @@ void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds)
pci_print_aer(pdev, severity, &aer_regs);
if (severity == AER_CORRECTABLE)
- cxl_handle_cor_ras(&cxlds->cxlmd->dev, dport->regs.ras);
+ cxl_handle_cor_ras(&pdev->dev, to_ras_base(port, dport));
else
- cxl_handle_ras(&cxlds->cxlmd->dev, dport->regs.ras);
+ cxl_do_recovery(pdev, dport->port, dport);
}
diff --git a/drivers/cxl/cxlpci.h b/drivers/cxl/cxlpci.h
index b826eb53cf7ba..06c46adcf0f6c 100644
--- a/drivers/cxl/cxlpci.h
+++ b/drivers/cxl/cxlpci.h
@@ -89,14 +89,11 @@ struct cxl_dev_state;
void read_cdat_data(struct cxl_port *port);
#ifdef CONFIG_CXL_RAS
-void cxl_cor_error_detected(struct pci_dev *pdev);
pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
pci_channel_state_t state);
void devm_cxl_dport_rch_ras_setup(struct cxl_dport *dport);
void devm_cxl_port_ras_setup(struct cxl_port *port);
#else
-static inline void cxl_cor_error_detected(struct pci_dev *pdev) { }
-
static inline pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
pci_channel_state_t state)
{
diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
index 7c6faee7f85ed..5c21db36073fe 100644
--- a/drivers/cxl/pci.c
+++ b/drivers/cxl/pci.c
@@ -1004,7 +1004,6 @@ static const struct pci_error_handlers cxl_error_handlers = {
.error_detected = cxl_error_detected,
.slot_reset = cxl_slot_reset,
.resume = cxl_error_resume,
- .cor_error_detected = cxl_cor_error_detected,
.reset_done = cxl_reset_done,
};
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index 2d9d40528e709..0bd23a65e7ebc 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1185,9 +1185,7 @@ static void pci_aer_handle_error(struct pci_dev *dev, struct aer_err_info *info)
static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info)
{
- bool cxl_pending = false;
-
- cxl_rch_handle_error(dev, info);
+ bool cxl_pending = cxl_rch_handle_error(dev, info);
if (is_cxl_error(dev, info))
cxl_pending |= cxl_forward_error(dev, info);
diff --git a/drivers/pci/pcie/aer_cxl_rch.c b/drivers/pci/pcie/aer_cxl_rch.c
index e471eefec9c40..683712fc965ff 100644
--- a/drivers/pci/pcie/aer_cxl_rch.c
+++ b/drivers/pci/pcie/aer_cxl_rch.c
@@ -34,42 +34,37 @@ static bool cxl_error_is_native(struct pci_dev *dev)
return (pcie_ports_native || host->native_aer);
}
+struct cxl_rch_error_ctx {
+ struct aer_err_info *info;
+ bool enqueued;
+};
+
static int cxl_rch_handle_error_iter(struct pci_dev *dev, void *data)
{
- struct aer_err_info *info = (struct aer_err_info *)data;
- const struct pci_error_handlers *err_handler;
+ struct cxl_rch_error_ctx *ctx = data;
if (!is_cxl_mem_dev(dev) || !cxl_error_is_native(dev))
return 0;
- guard(device)(&dev->dev);
-
- err_handler = dev->driver ? dev->driver->err_handler : NULL;
- if (!err_handler)
- return 0;
-
- if (info->severity == AER_CORRECTABLE) {
- if (err_handler->cor_error_detected)
- err_handler->cor_error_detected(dev);
- } else if (err_handler->error_detected) {
- if (info->severity == AER_NONFATAL)
- err_handler->error_detected(dev, pci_channel_io_normal);
- else if (info->severity == AER_FATAL)
- err_handler->error_detected(dev, pci_channel_io_frozen);
- }
+ if (cxl_forward_error(dev, ctx->info))
+ ctx->enqueued = true;
return 0;
}
-void cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info)
+bool cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info)
{
+ struct cxl_rch_error_ctx ctx = { .info = info };
+
/*
- * Internal errors of an RCEC indicate an AER error in an
- * RCH's downstream port. Check and handle them in the CXL.mem
- * device driver.
+ * An RCEC AER internal error indicates an error in an
+ * associated RCH Downstream Port or RC_END device or both.
+ * Forward to the cxl_core module for handling.
*/
if (pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC &&
is_aer_internal_error(info))
- pcie_walk_rcec(dev, cxl_rch_handle_error_iter, info);
+ pcie_walk_rcec(dev, cxl_rch_handle_error_iter, &ctx);
+
+ return ctx.enqueued;
}
static int handles_cxl_error_iter(struct pci_dev *dev, void *data)
diff --git a/drivers/pci/pcie/portdrv.h b/drivers/pci/pcie/portdrv.h
index fd203010877bf..807bca90dee0e 100644
--- a/drivers/pci/pcie/portdrv.h
+++ b/drivers/pci/pcie/portdrv.h
@@ -128,14 +128,14 @@ struct aer_err_info;
#ifdef CONFIG_CXL_RAS
bool is_aer_internal_error(struct aer_err_info *info);
-void cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info);
+bool cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info);
void cxl_rch_enable_rcec(struct pci_dev *rcec);
bool is_cxl_error(struct pci_dev *pdev, struct aer_err_info *info);
bool cxl_forward_error(struct pci_dev *pdev, struct aer_err_info *info);
void cxl_proto_err_flush(void);
#else
static inline bool is_aer_internal_error(struct aer_err_info *info) { return false; }
-static inline void cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info) { }
+static inline bool cxl_rch_handle_error(struct pci_dev *dev, struct aer_err_info *info) { return false; }
static inline void cxl_rch_enable_rcec(struct pci_dev *rcec) { }
static inline bool is_cxl_error(struct pci_dev *pdev, struct aer_err_info *info) { return false; }
static inline bool cxl_forward_error(struct pci_dev *pdev, struct aer_err_info *info) { return false; }
--
2.34.1
^ permalink raw reply related
* [PATCH v18 08/13] cxl/pci: Thread port and dport through RAS handling helpers
From: Terry Bowman @ 2026-07-17 22:27 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
From: Dan Williams <djbw@kernel.org>
The callers of cxl_handle_ras() and cxl_handle_cor_ras() already hold
a struct cxl_port * and struct cxl_dport * for the device being
handled. Passing a generic struct device * requires is_cxl_memdev()
to distinguish Endpoints from ports at trace emission time. Threading
port and dport directly enables is_cxl_endpoint(port) and explicit
dport/port branching for cleaner trace dispatch.
Refactor cxl_handle_ras() and cxl_handle_cor_ras() to accept struct
cxl_port * and struct cxl_dport * directly. The CXL RAS trace event
emission logic is split into three branches: Endpoint events are
identified via is_cxl_endpoint(port) and emit with the memdev, dport
events emit with dport->dport_dev, and Upstream Port events fall back
to port->uport_dev.
Update cxl_handle_rdport_errors() in ras_rch.c and
cxl_handle_proto_error() in ras.c to pass port and dport to the
refactored functions.
RCH Downstream Port correctable trace events now report the dport
device (dport->dport_dev) as a consequence of threading port and dport
through the RAS helpers. The following trace event rework ("cxl: Add
port and dport identifiers to CXL AER trace events") adds explicit
memdev, port, dport, and host fields that provide full context for
all device types.
Co-developed-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Dan Williams <djbw@kernel.org>
---
Changes in v17 -> v18:
- New patch.
---
drivers/cxl/core/core.h | 12 ++++++++----
drivers/cxl/core/ras.c | 29 +++++++++++++++--------------
drivers/cxl/core/ras_rch.c | 2 +-
3 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index 272634ff2615b..5ca1275fd8f35 100644
--- a/drivers/cxl/core/core.h
+++ b/drivers/cxl/core/core.h
@@ -185,10 +185,12 @@ static inline struct device *dport_to_host(struct cxl_dport *dport)
#ifdef CONFIG_CXL_RAS
void cxl_ras_init(void);
void cxl_ras_exit(void);
-bool cxl_handle_ras(struct device *dev, void __iomem *ras_base);
+bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport,
+ void __iomem *ras_base);
void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport);
-void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base);
+void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport,
+ void __iomem *ras_base);
void cxl_dport_map_rch_aer(struct cxl_dport *dport);
void cxl_disable_rch_root_ints(struct cxl_dport *dport);
void cxl_handle_rdport_errors(struct pci_dev *pdev);
@@ -197,13 +199,15 @@ void devm_cxl_dport_ras_setup(struct cxl_dport *dport);
#else
static inline void cxl_ras_init(void) { }
static inline void cxl_ras_exit(void) { }
-static inline bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
+static inline bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport,
+ void __iomem *ras_base)
{
return false;
}
static inline void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport) { }
-static inline void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base) { }
+static inline void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport,
+ void __iomem *ras_base) { }
static inline void cxl_dport_map_rch_aer(struct cxl_dport *dport) { }
static inline void cxl_disable_rch_root_ints(struct cxl_dport *dport) { }
static inline void cxl_handle_rdport_errors(struct pci_dev *pdev) { }
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index 9a142abcf4f8b..6f4a3c1b0bb85 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -232,7 +232,6 @@ void __iomem *to_ras_base(struct cxl_port *port, struct cxl_dport *dport)
void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port, struct cxl_dport *dport)
{
- struct device *dev = dport ? dport->dport_dev : port->uport_dev;
void __iomem *ras_base = to_ras_base(port, dport);
if (!ras_base) {
@@ -241,14 +240,14 @@ void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port, struct cxl_dpo
return;
}
- if (cxl_handle_ras(dev, ras_base))
+ if (cxl_handle_ras(port, dport, ras_base))
panic("CXL cachemem error");
dev_dbg(&pdev->dev,
"CXL UCE signaled but no CXL RAS status bits set\n");
}
-void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base)
+void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport, void __iomem *ras_base)
{
u32 status;
void __iomem *addr;
@@ -260,10 +259,12 @@ void cxl_handle_cor_ras(struct device *dev, void __iomem *ras_base)
status = readl(addr);
if (status & CXL_RAS_CORRECTABLE_STATUS_MASK) {
writel(status & CXL_RAS_CORRECTABLE_STATUS_MASK, addr);
- if (is_cxl_memdev(dev))
- trace_cxl_aer_correctable_error(to_cxl_memdev(dev), status);
+ if (is_cxl_endpoint(port))
+ trace_cxl_aer_correctable_error(to_cxl_memdev(port->uport_dev), status);
+ else if (dport)
+ trace_cxl_port_aer_correctable_error(dport->dport_dev, status);
else
- trace_cxl_port_aer_correctable_error(dev, status);
+ trace_cxl_port_aer_correctable_error(port->uport_dev, status);
}
}
@@ -288,7 +289,7 @@ static void header_log_copy(void __iomem *ras_base, u32 *log)
* Log the state of the RAS status registers and prepare them to log the
* next error status. Return 1 if reset needed.
*/
-bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
+bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport, void __iomem *ras_base)
{
u32 hl[CXL_HEADERLOG_TRACE_SIZE_U32] = {};
void __iomem *addr;
@@ -315,10 +316,12 @@ bool cxl_handle_ras(struct device *dev, void __iomem *ras_base)
}
header_log_copy(ras_base, hl);
- if (is_cxl_memdev(dev))
- trace_cxl_aer_uncorrectable_error(to_cxl_memdev(dev), status, fe, hl);
+ if (is_cxl_endpoint(port))
+ trace_cxl_aer_uncorrectable_error(to_cxl_memdev(port->uport_dev), status, fe, hl);
+ else if (dport)
+ trace_cxl_port_aer_uncorrectable_error(dport->dport_dev, status, fe, hl);
else
- trace_cxl_port_aer_uncorrectable_error(dev, status, fe, hl);
+ trace_cxl_port_aer_uncorrectable_error(port->uport_dev, status, fe, hl);
writel(status & CXL_RAS_UNCORRECTABLE_STATUS_MASK, addr);
@@ -351,7 +354,7 @@ pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
* chance the situation is recoverable dump the status of the RAS
* capability registers and bounce the active state of the memdev.
*/
- ue = cxl_handle_ras(port->uport_dev, to_ras_base(port, NULL));
+ ue = cxl_handle_ras(port, NULL, to_ras_base(port, NULL));
}
/*
@@ -382,10 +385,8 @@ EXPORT_SYMBOL_NS_GPL(cxl_error_detected, "CXL");
static void cxl_handle_proto_error(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport, int severity)
{
- struct device *dev = dport ? dport->dport_dev : port->uport_dev;
-
if (severity == AER_CORRECTABLE)
- cxl_handle_cor_ras(dev, to_ras_base(port, dport));
+ cxl_handle_cor_ras(port, dport, to_ras_base(port, dport));
else
cxl_do_recovery(pdev, port, dport);
}
diff --git a/drivers/cxl/core/ras_rch.c b/drivers/cxl/core/ras_rch.c
index f2d2fb83758b9..f4b98f2c11a1c 100644
--- a/drivers/cxl/core/ras_rch.c
+++ b/drivers/cxl/core/ras_rch.c
@@ -118,7 +118,7 @@ void cxl_handle_rdport_errors(struct pci_dev *pdev)
pci_print_aer(pdev, severity, &aer_regs);
if (severity == AER_CORRECTABLE)
- cxl_handle_cor_ras(&pdev->dev, to_ras_base(port, dport));
+ cxl_handle_cor_ras(dport->port, dport, to_ras_base(port, dport));
else
cxl_do_recovery(pdev, dport->port, dport);
}
--
2.34.1
^ permalink raw reply related
* [PATCH v18 09/13] cxl: Update CXL Endpoint AER handler
From: Terry Bowman @ 2026-07-17 22:27 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
Rename cxl_error_detected() to cxl_pci_error_detected() and rename
the struct pci_error_handlers instance to cxl_pci_error_handlers to
avoid shadowing the struct type tag.
Document the unconditional CXL RAS read policy: on a dead link,
readl() returns 0xFFFFFFFF which is interpreted as UCE bits set and
triggers a panic. If RAS registers are not mapped the read is
skipped and the frozen/perm_failure switch cases defer to AER
recovery for devices without active CXL.mem traffic.
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17->v18:
- Fix cxl_pci_error_detected() to use find_cxl_port_by_uport() and port->uport_dev
- Read CXL RAS unconditionally; panic on UCE regardless of channel state
- Document unconditional read policy and 0xFFFFFFFF behavior in comment
- Drop guard removal paragraph from commit message (not in this diff)
- Drop Reviewed-by tags pending re-review after message change
Changes in v16->v17:
- Rename pci_error_handlers struct instance to cxl_pci_error_handlers to
avoid shadowing the struct type tag.
- Restore scoped_guard(device) and dev->driver check around AER read.
- NULL-check find_cxl_port_by_dev() before deref of port->uport_dev.
- Updated commit message. (Terry)
- Add scope cleanup for port variable in cxl_pci_error_detected() (Terry)
- Drop cxl_uncor_aer_present(), rely on AER state
Changes in v15->v16:
- Update commit message (DaveJ)
- s/cxl_handle_aer()/cxl_uncor_aer_present()/g (Jonathan)
- cxl_uncor_aer_present(): Leave original result calculation based on
if a UCE is present and the provided state (Terry)
- Add call to pci_print_aer(). AER fails to log because is upstream
link (Terry)
Changes in v14->v15:
- Update commit message and title. Added Bjorn's ack.
- Move CE and UCE handling logic here
Changes in v13->v14:
- Add Dave Jiang's review-by
- Update commit message & headline (Bjorn)
- Refactor cxl_port_error_detected()/cxl_port_cor_error_detected() to
one line (Jonathan)
- Remove cxl_walk_port() (Dan)
- Remove cxl_pci_drv_bound(). Check for 'is_cxl' parent port is
sufficient (Dan)
- Remove device_lock_if()
- Combined CE and UCE here (Terry)
Changes in v12->v13:
- Move get_pci_cxl_host_dev() and cxl_handle_proto_error() to Dequeue
patch (Terry)
- Remove EP case in cxl_get_ras_base(), not used. (Terry)
- Remove check for dport->dport_dev (Dave)
- Remove whitespace (Terry)
Changes in v11->v12:
- Add call to cxl_pci_drv_bound() in cxl_handle_proto_error() and
pci_to_cxl_dev()
- Change cxl_error_detected() -> cxl_cor_error_detected()
- Remove NULL variable assignments
- Replace bus_find_device() with find_cxl_port_by_uport() for upstream
port searches.
Changes in v10->v11:
- None
---
drivers/cxl/core/ras.c | 24 +++++++++++++++---------
drivers/cxl/cxlpci.h | 8 ++++----
drivers/cxl/pci.c | 12 ++++++------
3 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index 6f4a3c1b0bb85..d5dc2c22565da 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -328,10 +328,8 @@ bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport, void __iomem
return true;
}
-
-
-pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
- pci_channel_state_t state)
+pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
+ pci_channel_state_t state)
{
struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_uport(&pdev->dev);
bool ue = false;
@@ -349,10 +347,18 @@ pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
}
/*
- * A frozen channel indicates an impending reset which is fatal to
- * CXL.mem operation, and will likely crash the system. On the off
- * chance the situation is recoverable dump the status of the RAS
- * capability registers and bounce the active state of the memdev.
+ * The CXL RAS read is unconditional regardless of channel
+ * state. Any uncorrectable error bit set in the CXL RAS
+ * status register triggers a panic because CXL.mem cache
+ * coherency is already lost; continuing risks silent data
+ * corruption across interleaved HDM regions.
+ *
+ * On a dead link readl() returns 0xFFFFFFFF which sets all
+ * UCE bits and also triggers the panic - this is intentional.
+ * If RAS registers are not mapped the read is skipped, the
+ * panic is not reached, and the frozen/perm_failure switch
+ * cases below handle AER recovery for devices without active
+ * CXL.mem traffic.
*/
ue = cxl_handle_ras(port, NULL, to_ras_base(port, NULL));
}
@@ -380,7 +386,7 @@ pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
}
return PCI_ERS_RESULT_NEED_RESET;
}
-EXPORT_SYMBOL_NS_GPL(cxl_error_detected, "CXL");
+EXPORT_SYMBOL_NS_GPL(cxl_pci_error_detected, "CXL");
static void cxl_handle_proto_error(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport, int severity)
diff --git a/drivers/cxl/cxlpci.h b/drivers/cxl/cxlpci.h
index 06c46adcf0f6c..8aeb80a4e5732 100644
--- a/drivers/cxl/cxlpci.h
+++ b/drivers/cxl/cxlpci.h
@@ -89,13 +89,13 @@ struct cxl_dev_state;
void read_cdat_data(struct cxl_port *port);
#ifdef CONFIG_CXL_RAS
-pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
- pci_channel_state_t state);
+pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
+ pci_channel_state_t state);
void devm_cxl_dport_rch_ras_setup(struct cxl_dport *dport);
void devm_cxl_port_ras_setup(struct cxl_port *port);
#else
-static inline pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,
- pci_channel_state_t state)
+static inline pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
+ pci_channel_state_t state)
{
return PCI_ERS_RESULT_NONE;
}
diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
index 5c21db36073fe..6cf1db7b85020 100644
--- a/drivers/cxl/pci.c
+++ b/drivers/cxl/pci.c
@@ -1000,18 +1000,18 @@ static void cxl_reset_done(struct pci_dev *pdev)
}
}
-static const struct pci_error_handlers cxl_error_handlers = {
- .error_detected = cxl_error_detected,
- .slot_reset = cxl_slot_reset,
- .resume = cxl_error_resume,
- .reset_done = cxl_reset_done,
+static const struct pci_error_handlers cxl_pci_error_handlers = {
+ .error_detected = cxl_pci_error_detected,
+ .slot_reset = cxl_slot_reset,
+ .resume = cxl_error_resume,
+ .reset_done = cxl_reset_done,
};
static struct pci_driver cxl_pci_driver = {
.name = KBUILD_MODNAME,
.id_table = cxl_mem_pci_tbl,
.probe = cxl_pci_probe,
- .err_handler = &cxl_error_handlers,
+ .err_handler = &cxl_pci_error_handlers,
.dev_groups = cxl_rcd_groups,
.driver = {
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
--
2.34.1
^ permalink raw reply related
* [PATCH v18 10/13] cxl: Add port and dport identifiers to CXL AER trace events
From: Terry Bowman @ 2026-07-17 22:27 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
From: Dan Williams <djbw@kernel.org>
Pass struct cxl_port * and struct cxl_dport * to the cxl_aer_*
trace events instead of a plain struct device * derived at the
caller. The trace event helpers then derive the right strings for
endpoints, switch ports, root ports, and RCH downstream ports
consistently across the CPER and native AER paths.
The unified cxl_aer_* events keep "memdev" as the legacy field
(endpoint events populate it with the memdev name; non-endpoint
events emit memdev="") and add new "port" and "dport" string fields
populated for all CXL device classes. Updated userspace can key
off "port" and "dport" without a parallel set of events.
Remove the separate cxl_port_aer_uncorrectable_error and
cxl_port_aer_correctable_error trace events. All CXL AER events now
use the unified cxl_aer_* events with port and dport fields.
Rework cxl_cper_handle_prot_err() to use find_cxl_port_by_dev() and
the unified trace helpers, replacing the per-port-type branching and
bus_find_device() memdev lookup.
The TP_printk format string places "port=%s dport=%s" between
"memdev=%s" and "host=%s", changing the text-mode field order from
the pre-patch output. This does not affect consumers such as
rasdaemon that use libtraceevent to parse fields by name rather than
by fixed text position.
For non-endpoint events (switch port, root port, RCH dport),
"memdev" is empty and "port"/"dport" carry the topology information.
The serial number is retrieved via pci_get_dsn() which performs live
PCI configuration space reads. A following patch ("PCI: Cache PCI
DSN into pci_dev->dsn during probe") replaces these with a cached
serial number to avoid config space access in error handlers and panic
paths.
Below are examples of the different CXL devices' error trace logs
after this patch:
---------------------
| CXL RP - 0C:00.0 |
---------------------
|
---------------------
| CXL USP - 0D:00.0 |
---------------------
|
--------------------
| CXL DSP - 0E:00.0 |
--------------------
|
---------------------
| CXL EP - 0F:00.0 |
---------------------
Root Port:
cxl_aer_correctable_error: memdev= port=port1 dport=0000:0c:00.0 \
host=pci0000:0c serial=0: status: 'Memory Data ECC Error'
cxl_aer_uncorrectable_error: memdev= port=port1 dport=0000:0c:00.0 \
host=pci0000:0c serial=0: status: 'Cache Address Parity Error' \
first_error: 'Cache Address Parity Error'
Upstream Switch Port:
cxl_aer_correctable_error: memdev= port=port2 dport= host=0000:0d:00.0 \
serial=0: status: 'Memory Data ECC Error'
UCE NA - Upstream Switch Port UCE's are handled in the portdrv driver's
PCI AER callbacks that are not CXL aware.
Downstream Switch Port:
cxl_aer_correctable_error: memdev= port=port2 dport=0000:0e:00.0 \
host=0000:0d:00.0 serial=0: status: 'Memory Data ECC Error'
cxl_aer_uncorrectable_error: memdev= port=port2 dport=0000:0e:00.0 \
host=0000:0d:00.0 serial=0: status: 'Cache Address Parity Error' \
first_error: 'Cache Address Parity Error'
Endpoint:
cxl_aer_uncorrectable_error: memdev=mem1 port=endpoint4 dport= \
host=0000:0f:00.0 serial=0: status: 'Cache Address Parity Error' \
first_error: 'Cache Address Parity Error'
cxl_aer_correctable_error: memdev=mem1 port=endpoint4 dport= host=0000:0f:00.0 \
serial=0: status: 'Memory Data ECC Error'
Co-developed-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
Signed-off-by: Dan Williams <djbw@kernel.org>
---
Changes in v17->v18:
- Consolidate double find_cxl_port_by_dev() in cxl_cper_handle_prot_err()
- Add comment noting dport is NULL for Endpoint and Upstream Port devices
- Add cxl_trace_* helpers
- Add CPER refactor
Changes in v16->v17:
- Replace cxlds->serial with pci_get_dsn()
- Change 'memdev' to 'device' (Dan)
- Updated Commit message
Changes in v15->v16:
- Add Dan's review-by
- Incorporate Dan's comment into commit message:
"Add the serial number at the end to preserve compatibility with
libtraceevent parsing of the parameters."
Changes in v14->v15:
- Update commit message.
- Moved cxl_handle_ras/cxl_handle_cor_ras() changes to future patch (terry)
Changes in v13->v14:
- Update commit headline (Bjorn)
Changes in v12->v13:
- Added Dave Jiang's review-by
Changes in v11 -> v12:
- Correct parameters to call trace_cxl_aer_correctable_error()
- Add reviewed-by for Jonathan and Shiju
Changes in v10->v11:
- Updated CE and UCE trace routines to maintain consistent TP_Struct ABI
and unchanged TP_printk() logging.
---
drivers/cxl/core/core.h | 8 +--
drivers/cxl/core/ras.c | 131 +++++++++++--------------------------
drivers/cxl/core/ras_rch.c | 3 +-
drivers/cxl/core/trace.c | 35 ++++++++++
drivers/cxl/core/trace.h | 91 ++++++++------------------
drivers/cxl/cxlmem.h | 7 ++
6 files changed, 113 insertions(+), 162 deletions(-)
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index 5ca1275fd8f35..a55a4e409feda 100644
--- a/drivers/cxl/core/core.h
+++ b/drivers/cxl/core/core.h
@@ -186,11 +186,11 @@ static inline struct device *dport_to_host(struct cxl_dport *dport)
void cxl_ras_init(void);
void cxl_ras_exit(void);
bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport,
- void __iomem *ras_base);
+ void __iomem *ras_base, u64 serial);
void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport);
void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport,
- void __iomem *ras_base);
+ void __iomem *ras_base, u64 serial);
void cxl_dport_map_rch_aer(struct cxl_dport *dport);
void cxl_disable_rch_root_ints(struct cxl_dport *dport);
void cxl_handle_rdport_errors(struct pci_dev *pdev);
@@ -200,14 +200,14 @@ void devm_cxl_dport_ras_setup(struct cxl_dport *dport);
static inline void cxl_ras_init(void) { }
static inline void cxl_ras_exit(void) { }
static inline bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport,
- void __iomem *ras_base)
+ void __iomem *ras_base, u64 serial)
{
return false;
}
static inline void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport) { }
static inline void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport,
- void __iomem *ras_base) { }
+ void __iomem *ras_base, u64 serial) { }
static inline void cxl_dport_map_rch_aer(struct cxl_dport *dport) { }
static inline void cxl_disable_rch_root_ints(struct cxl_dport *dport) { }
static inline void cxl_handle_rdport_errors(struct pci_dev *pdev) { }
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index d5dc2c22565da..acf40b2396c3b 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -12,69 +12,37 @@
static_assert(CXL_HEADERLOG_TRACE_SIZE_U32 == 128,
"rasdaemon ABI requires exactly 128 u32s");
-static void cxl_cper_trace_corr_port_prot_err(struct pci_dev *pdev,
- struct cxl_ras_capability_regs ras_cap)
-{
- u32 status = ras_cap.cor_status & ~ras_cap.cor_mask;
-
- trace_cxl_port_aer_correctable_error(&pdev->dev, status);
-}
-
-static void cxl_cper_trace_uncorr_port_prot_err(struct pci_dev *pdev,
- struct cxl_ras_capability_regs ras_cap)
+static void cxl_cper_trace_uncorr_prot_err(struct cxl_port *port, struct cxl_dport *dport,
+ u64 serial, struct cxl_ras_capability_regs *ras_cap)
{
u32 hl[CXL_HEADERLOG_TRACE_SIZE_U32] = {};
- u32 status = ras_cap.uncor_status & ~ras_cap.uncor_mask;
+ u32 status = ras_cap->uncor_status & ~ras_cap->uncor_mask;
u32 fe;
if (hweight32(status) > 1)
fe = BIT(FIELD_GET(CXL_RAS_CAP_CONTROL_FE_MASK,
- ras_cap.cap_control));
- else
- fe = status;
-
- memcpy(hl, ras_cap.header_log, CXL_HEADERLOG_SIZE);
- trace_cxl_port_aer_uncorrectable_error(&pdev->dev, status, fe, hl);
-}
-
-static void cxl_cper_trace_corr_prot_err(struct cxl_memdev *cxlmd,
- struct cxl_ras_capability_regs ras_cap)
-{
- u32 status = ras_cap.cor_status & ~ras_cap.cor_mask;
-
- trace_cxl_aer_correctable_error(cxlmd, status);
-}
-
-static void
-cxl_cper_trace_uncorr_prot_err(struct cxl_memdev *cxlmd,
- struct cxl_ras_capability_regs ras_cap)
-{
- u32 hl[CXL_HEADERLOG_TRACE_SIZE_U32] = {};
- u32 status = ras_cap.uncor_status & ~ras_cap.uncor_mask;
- u32 fe;
-
- if (hweight32(status) > 1)
- fe = BIT(FIELD_GET(CXL_RAS_CAP_CONTROL_FE_MASK,
- ras_cap.cap_control));
+ ras_cap->cap_control));
else
fe = status;
/*
- * ras_cap.header_log[] holds CXL_HEADERLOG_SIZE_U32 (16) hardware
+ * ras_cap->header_log[] holds CXL_HEADERLOG_SIZE_U32 (16) hardware
* dwords. Copy them into the front of a zero-filled
* CXL_HEADERLOG_TRACE_SIZE_U32 (128) u32 staging buffer so the trace
* event memcpy sees a full 512-byte source and the userspace ABI
* (rasdaemon) is preserved.
*/
- memcpy(hl, ras_cap.header_log, CXL_HEADERLOG_SIZE);
- trace_cxl_aer_uncorrectable_error(cxlmd, status, fe, hl);
+ memcpy(hl, ras_cap->header_log, CXL_HEADERLOG_SIZE);
+ trace_cxl_aer_uncorrectable_error(port, dport, status, fe,
+ hl, serial);
}
-static int match_memdev_by_parent(struct device *dev, const void *uport)
+static void cxl_cper_trace_corr_prot_err(struct cxl_port *port, struct cxl_dport *dport,
+ u64 serial, struct cxl_ras_capability_regs *ras_cap)
{
- if (is_cxl_memdev(dev) && dev->parent == uport)
- return 1;
- return 0;
+ u32 status = ras_cap->cor_status & ~ras_cap->cor_mask;
+
+ trace_cxl_aer_correctable_error(port, dport, status, serial);
}
@@ -109,47 +77,34 @@ static struct cxl_port *find_cxl_port_by_dev(struct device *dev, struct cxl_dpor
void cxl_cper_handle_prot_err(struct cxl_cper_prot_err_work_data *data)
{
+ struct cxl_dport *dport;
unsigned int devfn = PCI_DEVFN(data->prot_err.agent_addr.device,
data->prot_err.agent_addr.function);
- struct pci_dev *pdev __free(pci_dev_put) =
- pci_get_domain_bus_and_slot(data->prot_err.agent_addr.segment,
- data->prot_err.agent_addr.bus,
- devfn);
- struct cxl_memdev *cxlmd;
- int port_type;
-
- if (!pdev)
- return;
-
- port_type = pci_pcie_type(pdev);
- if (port_type == PCI_EXP_TYPE_ROOT_PORT ||
- port_type == PCI_EXP_TYPE_DOWNSTREAM ||
- port_type == PCI_EXP_TYPE_UPSTREAM) {
- if (data->severity == AER_CORRECTABLE)
- cxl_cper_trace_corr_port_prot_err(pdev, data->ras_cap);
- else
- cxl_cper_trace_uncorr_port_prot_err(pdev, data->ras_cap);
-
+ struct pci_dev *pdev __free(pci_dev_put) = pci_get_domain_bus_and_slot(
+ data->prot_err.agent_addr.segment, data->prot_err.agent_addr.bus, devfn);
+ if (!pdev) {
+ pr_err_ratelimited("Failed to find CPER device in CXL topology\n");
return;
}
- guard(device)(&pdev->dev);
- if (!pdev->dev.driver) {
- dev_warn_ratelimited(&pdev->dev,
- "Device is unbound, abort CPER error handling\n");
+ struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_dev(&pdev->dev, NULL);
+ if (!port) {
+ dev_err_ratelimited(&pdev->dev,
+ "Failed to find parent port device in CXL topology\n");
return;
}
- struct device *mem_dev __free(put_device) = bus_find_device(
- &cxl_bus_type, NULL, pdev, match_memdev_by_parent);
- if (!mem_dev)
- return;
+ guard(device)(&port->dev);
+
+ /* dport is NULL for Endpoint and Upstream Port devices */
+ dport = cxl_find_dport_by_dev(port, &pdev->dev);
- cxlmd = to_cxl_memdev(mem_dev);
if (data->severity == AER_CORRECTABLE)
- cxl_cper_trace_corr_prot_err(cxlmd, data->ras_cap);
+ cxl_cper_trace_corr_prot_err(port, dport, pci_get_dsn(pdev),
+ &data->ras_cap);
else
- cxl_cper_trace_uncorr_prot_err(cxlmd, data->ras_cap);
+ cxl_cper_trace_uncorr_prot_err(port, dport, pci_get_dsn(pdev),
+ &data->ras_cap);
}
EXPORT_SYMBOL_GPL(cxl_cper_handle_prot_err);
@@ -240,14 +195,14 @@ void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port, struct cxl_dpo
return;
}
- if (cxl_handle_ras(port, dport, ras_base))
+ if (cxl_handle_ras(port, dport, ras_base, pci_get_dsn(pdev)))
panic("CXL cachemem error");
dev_dbg(&pdev->dev,
"CXL UCE signaled but no CXL RAS status bits set\n");
}
-void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport, void __iomem *ras_base)
+void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport, void __iomem *ras_base, u64 serial)
{
u32 status;
void __iomem *addr;
@@ -259,12 +214,7 @@ void cxl_handle_cor_ras(struct cxl_port *port, struct cxl_dport *dport, void __i
status = readl(addr);
if (status & CXL_RAS_CORRECTABLE_STATUS_MASK) {
writel(status & CXL_RAS_CORRECTABLE_STATUS_MASK, addr);
- if (is_cxl_endpoint(port))
- trace_cxl_aer_correctable_error(to_cxl_memdev(port->uport_dev), status);
- else if (dport)
- trace_cxl_port_aer_correctable_error(dport->dport_dev, status);
- else
- trace_cxl_port_aer_correctable_error(port->uport_dev, status);
+ trace_cxl_aer_correctable_error(port, dport, status, serial);
}
}
@@ -289,7 +239,8 @@ static void header_log_copy(void __iomem *ras_base, u32 *log)
* Log the state of the RAS status registers and prepare them to log the
* next error status. Return 1 if reset needed.
*/
-bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport, void __iomem *ras_base)
+bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport,
+ void __iomem *ras_base, u64 serial)
{
u32 hl[CXL_HEADERLOG_TRACE_SIZE_U32] = {};
void __iomem *addr;
@@ -316,12 +267,7 @@ bool cxl_handle_ras(struct cxl_port *port, struct cxl_dport *dport, void __iomem
}
header_log_copy(ras_base, hl);
- if (is_cxl_endpoint(port))
- trace_cxl_aer_uncorrectable_error(to_cxl_memdev(port->uport_dev), status, fe, hl);
- else if (dport)
- trace_cxl_port_aer_uncorrectable_error(dport->dport_dev, status, fe, hl);
- else
- trace_cxl_port_aer_uncorrectable_error(port->uport_dev, status, fe, hl);
+ trace_cxl_aer_uncorrectable_error(port, dport, status, fe, hl, serial);
writel(status & CXL_RAS_UNCORRECTABLE_STATUS_MASK, addr);
@@ -360,7 +306,8 @@ pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
* cases below handle AER recovery for devices without active
* CXL.mem traffic.
*/
- ue = cxl_handle_ras(port, NULL, to_ras_base(port, NULL));
+ ue = cxl_handle_ras(port, NULL, to_ras_base(port, NULL),
+ pci_get_dsn(pdev));
}
/*
@@ -392,7 +339,7 @@ static void cxl_handle_proto_error(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport, int severity)
{
if (severity == AER_CORRECTABLE)
- cxl_handle_cor_ras(port, dport, to_ras_base(port, dport));
+ cxl_handle_cor_ras(port, dport, to_ras_base(port, dport), pci_get_dsn(pdev));
else
cxl_do_recovery(pdev, port, dport);
}
diff --git a/drivers/cxl/core/ras_rch.c b/drivers/cxl/core/ras_rch.c
index f4b98f2c11a1c..0385d2f4a2f66 100644
--- a/drivers/cxl/core/ras_rch.c
+++ b/drivers/cxl/core/ras_rch.c
@@ -118,7 +118,8 @@ void cxl_handle_rdport_errors(struct pci_dev *pdev)
pci_print_aer(pdev, severity, &aer_regs);
if (severity == AER_CORRECTABLE)
- cxl_handle_cor_ras(dport->port, dport, to_ras_base(port, dport));
+ cxl_handle_cor_ras(dport->port, dport, to_ras_base(port, dport),
+ pci_get_dsn(pdev));
else
cxl_do_recovery(pdev, dport->port, dport);
}
diff --git a/drivers/cxl/core/trace.c b/drivers/cxl/core/trace.c
index 7f2a9dd0d0e3f..df42d119c53dd 100644
--- a/drivers/cxl/core/trace.c
+++ b/drivers/cxl/core/trace.c
@@ -2,7 +2,42 @@
/* Copyright(c) 2022 Intel Corporation. All rights reserved. */
#include <cxl.h>
+#include <cxlmem.h>
#include "core.h"
+const char *cxl_trace_memdev_name(struct cxl_port *port)
+{
+ if (is_cxl_endpoint(port)) {
+ struct cxl_memdev *cxlmd = to_cxl_memdev(port->uport_dev);
+
+ return dev_name(&cxlmd->dev);
+ }
+
+ return "";
+}
+
+const char *cxl_trace_host_name(struct cxl_port *port)
+{
+ if (is_cxl_endpoint(port)) {
+ struct cxl_memdev *cxlmd = to_cxl_memdev(port->uport_dev);
+
+ return dev_name(cxlmd->dev.parent);
+ }
+
+ return dev_name(port->uport_dev);
+}
+
+const char *cxl_trace_port_name(struct cxl_port *port)
+{
+ return dev_name(&port->dev);
+}
+
+const char *cxl_trace_dport_name(struct cxl_dport *dport)
+{
+ if (dport)
+ return dev_name(dport->dport_dev);
+ return "";
+}
+
#define CREATE_TRACE_POINTS
#include "trace.h"
diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h
index d37876096dd7c..910aceb2ca3ab 100644
--- a/drivers/cxl/core/trace.h
+++ b/drivers/cxl/core/trace.h
@@ -48,44 +48,15 @@
{ CXL_RAS_UC_IDE_RX_ERR, "IDE Rx Error" } \
)
-TRACE_EVENT(cxl_port_aer_uncorrectable_error,
- TP_PROTO(struct device *dev, u32 status, u32 fe, u32 *hl),
- TP_ARGS(dev, status, fe, hl),
- TP_STRUCT__entry(
- __string(device, dev_name(dev))
- __string(host, dev_name(dev->parent))
- __field(u32, status)
- __field(u32, first_error)
- __array(u32, header_log, CXL_HEADERLOG_TRACE_SIZE_U32)
- ),
- TP_fast_assign(
- __assign_str(device);
- __assign_str(host);
- __entry->status = status;
- __entry->first_error = fe;
- /*
- * Embed headerlog data for user app retrieval and parsing,
- * but no need to print in the trace buffer. Only
- * CXL_HEADERLOG_SIZE_U32 (16) dwords are hardware data;
- * the remaining entries preserve the 512-byte ABI layout
- * rasdaemon depends on and are zero-filled by the caller.
- */
- memcpy(__entry->header_log, hl,
- CXL_HEADERLOG_TRACE_SIZE_U32 * sizeof(u32));
- ),
- TP_printk("device=%s host=%s status: '%s' first_error: '%s'",
- __get_str(device), __get_str(host),
- show_uc_errs(__entry->status),
- show_uc_errs(__entry->first_error)
- )
-);
-
TRACE_EVENT(cxl_aer_uncorrectable_error,
- TP_PROTO(const struct cxl_memdev *cxlmd, u32 status, u32 fe, u32 *hl),
- TP_ARGS(cxlmd, status, fe, hl),
+ TP_PROTO(struct cxl_port *port, struct cxl_dport *dport,
+ u32 status, u32 fe, u32 *hl, u64 serial),
+ TP_ARGS(port, dport, status, fe, hl, serial),
TP_STRUCT__entry(
- __string(memdev, dev_name(&cxlmd->dev))
- __string(host, dev_name(cxlmd->dev.parent))
+ __string(memdev, cxl_trace_memdev_name(port))
+ __string(port, cxl_trace_port_name(port))
+ __string(dport, cxl_trace_dport_name(dport))
+ __string(host, cxl_trace_host_name(port))
__field(u64, serial)
__field(u32, status)
__field(u32, first_error)
@@ -93,8 +64,10 @@ TRACE_EVENT(cxl_aer_uncorrectable_error,
),
TP_fast_assign(
__assign_str(memdev);
+ __assign_str(port);
+ __assign_str(dport);
__assign_str(host);
- __entry->serial = cxlmd->cxlds->serial;
+ __entry->serial = serial;
__entry->status = status;
__entry->first_error = fe;
/*
@@ -107,8 +80,9 @@ TRACE_EVENT(cxl_aer_uncorrectable_error,
memcpy(__entry->header_log, hl,
CXL_HEADERLOG_TRACE_SIZE_U32 * sizeof(u32));
),
- TP_printk("memdev=%s host=%s serial=%lld: status: '%s' first_error: '%s'",
- __get_str(memdev), __get_str(host), __entry->serial,
+ TP_printk("memdev=%s port=%s dport=%s host=%s serial=%lld: status: '%s' first_error: '%s'",
+ __get_str(memdev), __get_str(port), __get_str(dport),
+ __get_str(host), __entry->serial,
show_uc_errs(__entry->status),
show_uc_errs(__entry->first_error)
)
@@ -132,42 +106,29 @@ TRACE_EVENT(cxl_aer_uncorrectable_error,
{ CXL_RAS_CE_PHYS_LAYER_ERR, "Received Error From Physical Layer" } \
)
-TRACE_EVENT(cxl_port_aer_correctable_error,
- TP_PROTO(struct device *dev, u32 status),
- TP_ARGS(dev, status),
- TP_STRUCT__entry(
- __string(device, dev_name(dev))
- __string(host, dev_name(dev->parent))
- __field(u32, status)
- ),
- TP_fast_assign(
- __assign_str(device);
- __assign_str(host);
- __entry->status = status;
- ),
- TP_printk("device=%s host=%s status='%s'",
- __get_str(device), __get_str(host),
- show_ce_errs(__entry->status)
- )
-);
-
TRACE_EVENT(cxl_aer_correctable_error,
- TP_PROTO(const struct cxl_memdev *cxlmd, u32 status),
- TP_ARGS(cxlmd, status),
+ TP_PROTO(struct cxl_port *port, struct cxl_dport *dport,
+ u32 status, u64 serial),
+ TP_ARGS(port, dport, status, serial),
TP_STRUCT__entry(
- __string(memdev, dev_name(&cxlmd->dev))
- __string(host, dev_name(cxlmd->dev.parent))
+ __string(memdev, cxl_trace_memdev_name(port))
+ __string(port, cxl_trace_port_name(port))
+ __string(dport, cxl_trace_dport_name(dport))
+ __string(host, cxl_trace_host_name(port))
__field(u64, serial)
__field(u32, status)
),
TP_fast_assign(
__assign_str(memdev);
+ __assign_str(port);
+ __assign_str(dport);
__assign_str(host);
- __entry->serial = cxlmd->cxlds->serial;
+ __entry->serial = serial;
__entry->status = status;
),
- TP_printk("memdev=%s host=%s serial=%lld: status: '%s'",
- __get_str(memdev), __get_str(host), __entry->serial,
+ TP_printk("memdev=%s port=%s dport=%s host=%s serial=%lld: status: '%s'",
+ __get_str(memdev), __get_str(port), __get_str(dport),
+ __get_str(host), __entry->serial,
show_ce_errs(__entry->status)
)
);
diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h
index ed419d0c59f2f..f1ef8b78db18a 100644
--- a/drivers/cxl/cxlmem.h
+++ b/drivers/cxl/cxlmem.h
@@ -125,6 +125,13 @@ static inline int cxl_memdev_attach_region(struct cxl_memdev *cxlmd)
#endif
struct cxl_memdev *devm_cxl_add_classdev(struct cxl_dev_state *cxlds);
+
+/* trace-event helpers */
+const char *cxl_trace_memdev_name(struct cxl_port *port);
+const char *cxl_trace_host_name(struct cxl_port *port);
+const char *cxl_trace_port_name(struct cxl_port *port);
+const char *cxl_trace_dport_name(struct cxl_dport *dport);
+
struct cxl_memdev *__devm_cxl_add_memdev(struct cxl_dev_state *cxlds,
const struct cxl_memdev_attach *attach);
int devm_cxl_sanitize_setup_notifier(struct device *host,
--
2.34.1
^ permalink raw reply related
* [PATCH v18 11/13] PCI: Cache PCI DSN into pci_dev->dsn during probe
From: Terry Bowman @ 2026-07-17 22:27 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
Subsequent CXL error-reporting code paths need to log the PCI Device
Serial Number (DSN) as part of trace events emitted from interrupt or
panic context. Computing the DSN there via pci_get_dsn() requires PCI
configuration space reads, which are slow, can fail when the link is
down or frozen, and may not be safe in some contexts.
Add a u64 dsn field to struct pci_dev and populate it from pci_get_dsn()
during pci_init_capabilities() at probe time via pci_dsn_init(). Only
write dev->dsn when the read succeeds. The zero initial value from
pci_dev allocation already represents 'no DSN available.'
pci_get_dsn() is not modified because it remains a pure config-space read
with no side effects on pci_dev. The cache is written exclusively by
pci_dsn_init() at probe time.
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17->v18:
- New commit.
---
drivers/cxl/core/ras.c | 11 ++++++-----
drivers/cxl/core/ras_rch.c | 4 ++--
drivers/cxl/pci.c | 2 +-
drivers/pci/probe.c | 14 ++++++++++++++
include/linux/pci.h | 1 +
5 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index acf40b2396c3b..69b320c74469c 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -100,10 +100,10 @@ void cxl_cper_handle_prot_err(struct cxl_cper_prot_err_work_data *data)
dport = cxl_find_dport_by_dev(port, &pdev->dev);
if (data->severity == AER_CORRECTABLE)
- cxl_cper_trace_corr_prot_err(port, dport, pci_get_dsn(pdev),
+ cxl_cper_trace_corr_prot_err(port, dport, pdev->dsn,
&data->ras_cap);
else
- cxl_cper_trace_uncorr_prot_err(port, dport, pci_get_dsn(pdev),
+ cxl_cper_trace_uncorr_prot_err(port, dport, pdev->dsn,
&data->ras_cap);
}
EXPORT_SYMBOL_GPL(cxl_cper_handle_prot_err);
@@ -195,7 +195,7 @@ void cxl_do_recovery(struct pci_dev *pdev, struct cxl_port *port, struct cxl_dpo
return;
}
- if (cxl_handle_ras(port, dport, ras_base, pci_get_dsn(pdev)))
+ if (cxl_handle_ras(port, dport, ras_base, pdev->dsn))
panic("CXL cachemem error");
dev_dbg(&pdev->dev,
@@ -307,7 +307,7 @@ pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
* CXL.mem traffic.
*/
ue = cxl_handle_ras(port, NULL, to_ras_base(port, NULL),
- pci_get_dsn(pdev));
+ pdev->dsn);
}
/*
@@ -339,7 +339,8 @@ static void cxl_handle_proto_error(struct pci_dev *pdev, struct cxl_port *port,
struct cxl_dport *dport, int severity)
{
if (severity == AER_CORRECTABLE)
- cxl_handle_cor_ras(port, dport, to_ras_base(port, dport), pci_get_dsn(pdev));
+ cxl_handle_cor_ras(port, dport, to_ras_base(port, dport),
+ pdev->dsn);
else
cxl_do_recovery(pdev, port, dport);
}
diff --git a/drivers/cxl/core/ras_rch.c b/drivers/cxl/core/ras_rch.c
index 0385d2f4a2f66..14bb3bdb2d092 100644
--- a/drivers/cxl/core/ras_rch.c
+++ b/drivers/cxl/core/ras_rch.c
@@ -118,8 +118,8 @@ void cxl_handle_rdport_errors(struct pci_dev *pdev)
pci_print_aer(pdev, severity, &aer_regs);
if (severity == AER_CORRECTABLE)
- cxl_handle_cor_ras(dport->port, dport, to_ras_base(port, dport),
- pci_get_dsn(pdev));
+ cxl_handle_cor_ras(dport->port, dport,
+ to_ras_base(port, dport), pdev->dsn);
else
cxl_do_recovery(pdev, dport->port, dport);
}
diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
index 6cf1db7b85020..45a994cc782a9 100644
--- a/drivers/cxl/pci.c
+++ b/drivers/cxl/pci.c
@@ -807,7 +807,7 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (!dvsec)
pci_warn(pdev, "Device DVSEC not present, skip CXL.mem init\n");
- mds = cxl_memdev_state_create(&pdev->dev, pci_get_dsn(pdev), dvsec);
+ mds = cxl_memdev_state_create(&pdev->dev, pdev->dsn, dvsec);
if (IS_ERR(mds))
return PTR_ERR(mds);
cxlds = &mds->cxlds;
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index dd0abbc63e18d..92ece5ec211f8 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2638,6 +2638,19 @@ void pcie_report_downtraining(struct pci_dev *dev)
__pcie_print_link_status(dev, false);
}
+/*
+ * Cache the Device Serial Number for use in contexts where config-space
+ * reads are unsafe (interrupt, panic). Process-context callers that
+ * need a fresh value (e.g. hotplug device replacement) use pci_get_dsn().
+ */
+static void pci_dsn_init(struct pci_dev *dev)
+{
+ u64 dsn = pci_get_dsn(dev);
+
+ if (dsn)
+ dev->dsn = dsn;
+}
+
static void pci_imm_ready_init(struct pci_dev *dev)
{
u16 status;
@@ -2674,6 +2687,7 @@ static void pci_init_capabilities(struct pci_dev *dev)
pci_rebar_init(dev); /* Resizable BAR */
pci_dev3_init(dev); /* Device 3 capabilities */
pci_ide_init(dev); /* Link Integrity and Data Encryption */
+ pci_dsn_init(dev); /* Serial number */
pcie_report_downtraining(dev);
pci_init_reset_methods(dev);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 64b308b6e61c1..48a1622639190 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -386,6 +386,7 @@ struct pci_dev {
unsigned long *dma_alias_mask;/* Mask of enabled devfn aliases */
struct pci_driver *driver; /* Driver bound to this device */
+ u64 dsn; /* PCI Device Serial Number */
u64 dma_mask; /* Mask of the bits of bus address this
device implements. Normally this is
0xffffffff. You only need to change
--
2.34.1
^ permalink raw reply related
* [PATCH v18 12/13] PCI/CXL: Mask/Unmask CXL protocol errors
From: Terry Bowman @ 2026-07-17 22:27 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
CXL protocol errors are not enabled for all CXL devices after boot.
They must be enabled in order to process CXL protocol errors. Provide
matching teardown helpers so the masks are restored when a CXL Port
or dport goes away.
Add pci_aer_mask_internal_errors() as the symmetric counterpart to
pci_aer_unmask_internal_errors() and export both for the cxl_core
module.
Introduce cxl_unmask_proto_interrupts() and cxl_mask_proto_interrupts()
in cxl_core to wrap the PCI helpers with the dev_is_pci() and
pcie_aer_is_native() gating CXL needs. Both helpers tolerate a NULL
or non-PCI @dev so callers do not have to special-case it.
Wire cxl_unmask_proto_interrupts() into the success path of
cxl_dport_map_ras() and devm_cxl_port_ras_setup() so the unmask
only runs when the RAS register block was actually mapped. Pair each
unmask with a devm_add_action_or_reset() registration of
cxl_mask_proto_irqs() scoped to the host device so the mask is
restored when devres is released. This applies to dports, Endpoints,
Upstream Switch Ports, Downstream Switch Ports, and Root Ports.
Remove the dev_is_pci(dport->dport_dev) guard in
devm_cxl_dport_rch_ras_setup(). On RCH systems dport->dport_dev is the
pci_host_bridge device, which is not on pci_bus_type, so this guard
caused the function to return early on real hardware without mapping
dport RAS or AER registers. The caller already gates on dport->rch,
which is sufficient to exclude cxl_test mock devices.
Co-developed-by: Dan Williams <djbw@kernel.org>
Signed-off-by: Dan Williams <djbw@kernel.org>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17->v18:
- Make cxl_unmask_proto_interrupts() and cxl_mask_proto_interrupts() static
- Remove dev_is_pci() guard from devm_cxl_dport_rch_ras_setup(); the guard
blocked real RCH hardware because pci_host_bridge is not on pci_bus_type
Changes in v16->v17:
- Drop redundant cxl_mask_proto_interrupts() calls from unregister_port()
and cxl_dport_remove(); the devres action registered alongside the unmask
is the sole mask path.
- Update title
- Remove unnecessary check for aer_capabilities
- Gate cxl_unmask_proto_interrupts() on pcie_aer_is_native()
- Add pci_aer_mask_internal_errors() and cxl_mask_proto_interrupts()
- Only unmask on successful cxl_map_component_regs()
- NULL-check @dev in cxl_{un,}mask_proto_interrupts()
- Drop static and declare in core/core.h
Change in v15 -> v16:
- None
Change in v14 -> v15:
- None
Changes in v13->v14:
- Update commit title's prefix (Bjorn)
Changes in v12->v13:
- Add dev and dev_is_pci() NULL checks in cxl_unmask_proto_interrupts() (Terry)
- Add Dave Jiang's and Ben's review-by
Changes in v11->v12:
- None
---
drivers/cxl/core/ras.c | 73 +++++++++++++++++++++++++++++++----
drivers/pci/pcie/aer.c | 28 ++++++++++++--
include/linux/aer.h | 2 +
tools/testing/cxl/Kbuild | 1 +
tools/testing/cxl/test/mock.c | 12 ++++++
5 files changed, 105 insertions(+), 11 deletions(-)
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index 69b320c74469c..d77208af41e03 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -117,16 +117,64 @@ static void cxl_cper_prot_err_work_fn(struct work_struct *work)
}
static DECLARE_WORK(cxl_cper_prot_err_work, cxl_cper_prot_err_work_fn);
+static void cxl_unmask_proto_interrupts(struct device *dev)
+{
+ struct pci_dev *pdev;
+
+ if (!dev || !dev_is_pci(dev))
+ return;
+
+ pdev = to_pci_dev(dev);
+ if (!pcie_aer_is_native(pdev))
+ return;
+
+ pci_aer_unmask_internal_errors(pdev);
+}
+
+static void cxl_mask_proto_interrupts(struct device *dev)
+{
+ struct pci_dev *pdev;
+
+ if (!dev || !dev_is_pci(dev))
+ return;
+
+ pdev = to_pci_dev(dev);
+ if (!pcie_aer_is_native(pdev))
+ return;
+
+ pci_aer_mask_internal_errors(pdev);
+}
+
+static void cxl_mask_proto_irqs(void *dev)
+{
+ cxl_mask_proto_interrupts(dev);
+}
+
static void cxl_dport_map_ras(struct cxl_dport *dport)
{
struct cxl_register_map *map = &dport->reg_map;
struct device *dev = dport->dport_dev;
- if (!map->component_map.ras.valid)
+ if (!map->component_map.ras.valid) {
dev_dbg(dev, "RAS registers not found\n");
- else if (cxl_map_component_regs(map, &dport->regs.component,
- BIT(CXL_CM_CAP_CAP_ID_RAS)))
+ return;
+ }
+
+ if (cxl_map_component_regs(map, &dport->regs.component,
+ BIT(CXL_CM_CAP_CAP_ID_RAS))) {
dev_dbg(dev, "Failed to map RAS capability.\n");
+ return;
+ }
+
+ if (!dev_is_pci(dev))
+ return;
+
+ cxl_unmask_proto_interrupts(dev);
+ if (devm_add_action_or_reset(dport_to_host(dport),
+ cxl_mask_proto_irqs, dev)) {
+ dev_warn(dev, "failed to defer CXL proto-irq mask; CXL protocol error reporting disabled\n");
+ dport->regs.component.ras = NULL;
+ }
}
/**
@@ -143,9 +191,6 @@ void devm_cxl_dport_rch_ras_setup(struct cxl_dport *dport)
{
struct pci_host_bridge *host_bridge;
- if (!dev_is_pci(dport->dport_dev))
- return;
-
devm_cxl_dport_ras_setup(dport);
host_bridge = to_pci_host_bridge(dport->dport_dev);
@@ -160,6 +205,7 @@ EXPORT_SYMBOL_NS_GPL(devm_cxl_dport_rch_ras_setup, "CXL");
void devm_cxl_port_ras_setup(struct cxl_port *port)
{
struct cxl_register_map *map = &port->reg_map;
+ struct device *dev;
if (!map->component_map.ras.valid) {
dev_dbg(&port->dev, "RAS registers not found\n");
@@ -168,8 +214,21 @@ void devm_cxl_port_ras_setup(struct cxl_port *port)
map->host = &port->dev;
if (cxl_map_component_regs(map, &port->regs,
- BIT(CXL_CM_CAP_CAP_ID_RAS)))
+ BIT(CXL_CM_CAP_CAP_ID_RAS))) {
dev_dbg(&port->dev, "Failed to map RAS capability\n");
+ return;
+ }
+
+ dev = is_cxl_endpoint(port) ? port->uport_dev->parent : port->uport_dev;
+ if (!dev_is_pci(dev))
+ return;
+
+ cxl_unmask_proto_interrupts(dev);
+ if (devm_add_action_or_reset(&port->dev, cxl_mask_proto_irqs, dev)) {
+ dev_warn(&port->dev,
+ "failed to defer CXL proto-irq mask; CXL protocol error reporting disabled\n");
+ port->regs.ras = NULL;
+ }
}
EXPORT_SYMBOL_NS_GPL(devm_cxl_port_ras_setup, "CXL");
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index 0bd23a65e7ebc..be6dc2cbd4491 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1143,12 +1143,32 @@ void pci_aer_unmask_internal_errors(struct pci_dev *dev)
mask &= ~PCI_ERR_COR_INTERNAL;
pci_write_config_dword(dev, aer + PCI_ERR_COR_MASK, mask);
}
+EXPORT_SYMBOL_FOR_MODULES(pci_aer_unmask_internal_errors, "cxl_core");
-/*
- * Internal errors are too device-specific to enable generally, however for CXL
- * their behavior is standardized for conveying CXL protocol errors.
+/**
+ * pci_aer_mask_internal_errors - mask internal errors
+ * @dev: pointer to the pci_dev data structure
+ *
+ * Mask internal errors in the Uncorrectable and Correctable Error
+ * Mask registers.
+ *
+ * Note: AER must be enabled and supported by the device which must be
+ * checked in advance, e.g. with pcie_aer_is_native().
*/
-EXPORT_SYMBOL_FOR_MODULES(pci_aer_unmask_internal_errors, "cxl_core");
+void pci_aer_mask_internal_errors(struct pci_dev *dev)
+{
+ int aer = dev->aer_cap;
+ u32 mask;
+
+ pci_read_config_dword(dev, aer + PCI_ERR_UNCOR_MASK, &mask);
+ mask |= PCI_ERR_UNC_INTN;
+ pci_write_config_dword(dev, aer + PCI_ERR_UNCOR_MASK, mask);
+
+ pci_read_config_dword(dev, aer + PCI_ERR_COR_MASK, &mask);
+ mask |= PCI_ERR_COR_INTERNAL;
+ pci_write_config_dword(dev, aer + PCI_ERR_COR_MASK, mask);
+}
+EXPORT_SYMBOL_FOR_MODULES(pci_aer_mask_internal_errors, "cxl_core");
/**
* pci_aer_handle_error - handle logging error into an event log
diff --git a/include/linux/aer.h b/include/linux/aer.h
index 8eba3192e2d15..b3657b80564b9 100644
--- a/include/linux/aer.h
+++ b/include/linux/aer.h
@@ -58,6 +58,7 @@ struct aer_capability_regs {
int pci_aer_clear_nonfatal_status(struct pci_dev *dev);
int pcie_aer_is_native(struct pci_dev *dev);
void pci_aer_unmask_internal_errors(struct pci_dev *dev);
+void pci_aer_mask_internal_errors(struct pci_dev *dev);
#else
static inline int pci_aer_clear_nonfatal_status(struct pci_dev *dev)
{
@@ -65,6 +66,7 @@ static inline int pci_aer_clear_nonfatal_status(struct pci_dev *dev)
}
static inline int pcie_aer_is_native(struct pci_dev *dev) { return 0; }
static inline void pci_aer_unmask_internal_errors(struct pci_dev *dev) { }
+static inline void pci_aer_mask_internal_errors(struct pci_dev *dev) { }
#endif
#ifdef CONFIG_CXL_RAS
diff --git a/tools/testing/cxl/Kbuild b/tools/testing/cxl/Kbuild
index 2be1df80fcc93..957945201f04d 100644
--- a/tools/testing/cxl/Kbuild
+++ b/tools/testing/cxl/Kbuild
@@ -6,6 +6,7 @@ ldflags-y += --wrap=acpi_pci_find_root
ldflags-y += --wrap=nvdimm_bus_register
ldflags-y += --wrap=cxl_await_media_ready
ldflags-y += --wrap=devm_cxl_add_rch_dport
+ldflags-y += --wrap=devm_cxl_dport_rch_ras_setup
ldflags-y += --wrap=cxl_endpoint_parse_cdat
ldflags-y += --wrap=devm_cxl_endpoint_decoders_setup
ldflags-y += --wrap=hmat_get_extended_linear_cache_size
diff --git a/tools/testing/cxl/test/mock.c b/tools/testing/cxl/test/mock.c
index 6454b868b122c..5ad3243da8d29 100644
--- a/tools/testing/cxl/test/mock.c
+++ b/tools/testing/cxl/test/mock.c
@@ -220,6 +220,18 @@ struct cxl_dport *__wrap_devm_cxl_add_rch_dport(struct cxl_port *port,
}
EXPORT_SYMBOL_NS_GPL(__wrap_devm_cxl_add_rch_dport, "CXL");
+void __wrap_devm_cxl_dport_rch_ras_setup(struct cxl_dport *dport)
+{
+ int index;
+ struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
+
+ if (!ops || !ops->is_mock_port(dport->dport_dev))
+ devm_cxl_dport_rch_ras_setup(dport);
+
+ put_cxl_mock_ops(index);
+}
+EXPORT_SYMBOL_NS_GPL(__wrap_devm_cxl_dport_rch_ras_setup, "CXL");
+
void __wrap_cxl_endpoint_parse_cdat(struct cxl_port *port)
{
int index;
--
2.34.1
^ permalink raw reply related
* [PATCH v18 13/13] Documentation: cxl: Document CXL protocol error handling
From: Terry Bowman @ 2026-07-17 22:27 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
In-Reply-To: <20260717222706.3540281-1-terry.bowman@amd.com>
Add Documentation/driver-api/cxl/linux/protocol-error-handling.rst
describing the end-to-end CXL protocol error path: AER ingress, the
AER-CXL kfifo handoff, the cxl_core consumer worker, RCD/RCH special
cases, severity policy, trace events, and a source code map.
This documents the architecture introduced by the preceding patches in
this series.
Assisted-by: Claude:claude-opus-4.7
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
Changes in v17->v18:
- Simplify document for readability (Jonathan)
- Drop historical context that goes stale (Jonathan)
- Shorten ASCII flow diagram (Jonathan)
- Drop manual backtick markup, use automarkup (Jonathan)
- Clarify USP/DSP as single switch component (Dave)
- Fix line wrapping to 80 chars (Jonathan)
---
Documentation/driver-api/cxl/index.rst | 1 +
.../cxl/linux/protocol-error-handling.rst | 222 ++++++++++++++++++
2 files changed, 223 insertions(+)
create mode 100644 Documentation/driver-api/cxl/linux/protocol-error-handling.rst
diff --git a/Documentation/driver-api/cxl/index.rst b/Documentation/driver-api/cxl/index.rst
index 3dfae1d310ca5..6861b2e5726a3 100644
--- a/Documentation/driver-api/cxl/index.rst
+++ b/Documentation/driver-api/cxl/index.rst
@@ -42,6 +42,7 @@ that have impacts on each other. The docs here break up configurations steps.
linux/dax-driver
linux/memory-hotplug
linux/access-coordinates
+ linux/protocol-error-handling
.. toctree::
:maxdepth: 2
diff --git a/Documentation/driver-api/cxl/linux/protocol-error-handling.rst b/Documentation/driver-api/cxl/linux/protocol-error-handling.rst
new file mode 100644
index 0000000000000..67f0492e56702
--- /dev/null
+++ b/Documentation/driver-api/cxl/linux/protocol-error-handling.rst
@@ -0,0 +1,222 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+==============================
+CXL Protocol Error Handling
+==============================
+
+CXL devices report protocol-layer failures (CXL.cachemem RAS) as PCIe
+AER Internal Errors: PCI_ERR_COR_INTERNAL for correctable events and
+PCI_ERR_UNC_INTN for uncorrectable events. The actual fault
+information lives in CXL RAS capability registers, not in the PCIe AER
+status registers.
+
+The kernel routes every CXL Internal Error through a producer/consumer
+pipeline shared by all CXL device types: Root Ports, Upstream/Downstream
+Switch Ports, Endpoints, and Restricted CXL Devices (RCDs).
+
+
+Architecture
+============
+
+Two error planes run side by side:
+
+* The **PCIe AER plane** handles native PCIe errors (receiver
+ overflows, malformed TLPs, completion timeouts, etc.).
+* The **CXL protocol error plane** handles CXL Internal Errors.
+ The AER core forwards them to cxl_core via a dedicated kfifo;
+ cxl_core reads the CXL RAS registers, emits trace events, and
+ applies recovery/panic policy.
+
+The boundary between the two planes is enforced by is_cxl_error() in
+aer_cxl_vh.c. It checks info->is_cxl, the PCIe device type
+(Endpoint, Root Port, Upstream, or Downstream), and whether the AER
+status word indicates an internal error. RC_END devices are excluded
+from is_cxl_error() because they reach the kfifo via the separate
+cxl_rch_handle_error() path instead.
+
+The pipeline:
+
+1. **Producer** (aer_cxl_vh.c, aer_cxl_rch.c) - AER threaded
+ handler context. Classifies and enqueues a
+ struct cxl_proto_err_work_data into the kfifo.
+2. **Queue** - the AER-CXL kfifo plus a backing work_struct.
+3. **Consumer** (cxl_core/ras.c) - workqueue context. Resolves
+ the CXL port topology and dispatches to CE/UE handlers.
+
+
+Topologies
+==========
+
+Virtual Hierarchy (VH)
+----------------------
+
+Standard PCIe topology: Root Port, optional switch (Upstream Port with
+one or more Downstream Ports), and Endpoints. Each component raises
+Internal Errors directly via the Root Port's AER interrupt.
+
+Producer: cxl_forward_error() in aer_cxl_vh.c.
+
+Restricted CXL Host (RCH)
+--------------------------
+
+A Root Complex Event Collector (RCEC) aggregates errors from RCDs
+attached as Root Complex Integrated Endpoints. The AER driver
+iterates RCDs beneath the RCEC via pcie_walk_rcec() and forwards
+each qualifying device through cxl_forward_error() into the same
+kfifo.
+
+Producer: cxl_forward_error() in aer_cxl_vh.c, called from
+cxl_rch_handle_error_iter() via pcie_walk_rcec().
+
+
+Error flow
+==========
+
+.. code-block:: text
+
+ CXL device raises AER Internal Error
+ (PCI_ERR_COR_INTERNAL or PCI_ERR_UNC_INTN)
+ |
+ v
+ +--------------------------------------+
+ | AER core (aer.c) |
+ | aer_irq() -> aer_isr() |
+ | -> find_source_device() |
+ | -> handle_error_source(dev, info) |
+ +--------------------------------------+
+ |
+ v
+ +--------------------------------------+
+ | handle_error_source() dispatch |
+ | |
+ | 1. cxl_rch_handle_error() |
+ | [always; filters internally] |
+ | |
+ | 2. if is_cxl_error(): |
+ | cxl_forward_error() |
+ | [enqueue to kfifo] |
+ | |
+ | 3. if cxl_pending && non-CE: |
+ | cxl_proto_err_flush() |
+ | [sync drain before recovery] |
+ | |
+ | 4. pci_aer_handle_error() [always] |
+ +--------------------------------------+
+ |
+ (kfifo -> workqueue)
+ |
+ v
+ +--------------------------------------+
+ | __cxl_proto_err_work_fn() consumer |
+ | |
+ | if is_cxl_restricted(pdev): |
+ | cxl_handle_rdport_errors() |
+ | [RCH dport RAS first] |
+ | |
+ | port = find_cxl_port_by_dev( |
+ | &pdev->dev, NULL) |
+ | dport = cxl_find_dport_by_dev( |
+ | port, &pdev->dev) |
+ | [dport NULL for EP/USP; set RP/DSP] |
+ | |
+ | cxl_handle_proto_error() |
+ +--------------------------------------+
+ | |
+ v v
+ +-----------------+ +--------------------+
+ | CE | | UCE |
+ | cxl_handle_ | | cxl_do_recovery() |
+ | cor_ras() | | read RAS status |
+ | trace + clear | | trace + panic |
+ +-----------------+ +--------------------+
+
+cxl_do_recovery() reads the CXL RAS uncorrectable status register.
+If UE bits are set, it emits the trace event and panics. If no bits
+are set (e.g. RAS mapped but error already cleared), it logs a
+diagnostic and defers to AER recovery.
+
+
+Severity policy
+===============
+
+**CE** - cxl_handle_cor_ras() reads the CXL RAS correctable status
+register, clears set bits, and emits a cxl_aer_correctable_error
+trace event. No recovery action.
+
+**UCE (non-fatal, and fatal on Root Port/Downstream Port)** - cxl_do_recovery() reads the CXL RAS
+uncorrectable status register. If UE bits are set, the kernel panics.
+CXL.cachemem traffic cannot be safely recovered once an uncorrectable
+error is signaled; continuing risks silent data corruption across
+interleaved HDM regions. This panic policy applies to the native AER
+path. On firmware-first (CPER/GHES) platforms the CPER handler emits
+trace events only and does not call cxl_do_recovery().
+
+**Fatal UCE on EP/USP** - The AER core driver does not read AER status
+registers for Endpoint and Upstream Ports with fatal events because the
+link is down. Without AER status, is_cxl_error() cannot classify
+the event as a CXL protocol error and it falls through to standard
+AER recovery.
+
+RCH special case
+================
+
+When the consumer sees is_cxl_restricted(pdev), it calls
+cxl_handle_rdport_errors() first to process the RCH Downstream
+Port's RAS registers (accessed via RCRB, not standard config space).
+It then continues to process the RCD Endpoint's own RAS registers
+via the common path. Both register blocks are checked because
+errors can appear in either independently.
+
+cxl_handle_rdport_errors() acquires the port lock internally.
+Callers must not hold it.
+
+
+Trace events
+============
+
+Two trace events cover all device types and both the native AER and
+CPER/GHES firmware-first paths:
+
+* cxl_aer_correctable_error
+* cxl_aer_uncorrectable_error
+
+Fields:
+
+* ``memdev`` - memdev name for Endpoints; empty for non-Endpoints.
+* ``port`` - CXL port device name.
+* ``dport`` - Downstream Port device name; empty when not applicable.
+* ``host`` - parent host bridge or uport device name.
+* ``serial`` - PCI Device Serial Number from pdev->dsn (cached at
+ enumeration; no config-space read in the error path).
+
+
+Interrupt masking
+=================
+
+CXL Internal Error bits (PCI_ERR_UNC_INTN and PCI_ERR_COR_INTERNAL)
+are unmasked in the AER capability only after the CXL RAS register
+block is successfully mapped. A devm teardown action restores the
+mask when the port or dport is removed, ensuring clean state after
+driver removal.
+
+
+Source files
+============
+
+.. list-table::
+ :header-rows: 1
+
+ * - File
+ - Role
+ * - drivers/pci/pcie/aer.c
+ - AER core; IRQ, dispatch
+ * - drivers/pci/pcie/aer_cxl_vh.c
+ - VH producer; kfifo
+ * - drivers/pci/pcie/aer_cxl_rch.c
+ - RCH dispatch; RCEC walk
+ * - drivers/cxl/core/ras.c
+ - Consumer; CE/UE handlers; CPER
+ * - drivers/cxl/core/ras_rch.c
+ - RCH dport RAS handling
+ * - drivers/acpi/apei/ghes.c
+ - CPER/GHES kfifo producer
--
2.34.1
^ permalink raw reply related
* [RFC] cxl: Device protocol AER injection
From: Terry Bowman @ 2026-07-17 22:57 UTC (permalink / raw)
To: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter
Cc: linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Terry Bowman, Tony Luck,
Vishal Verma
This patch is intended to provide a method of testing the recently submitted
cxl series "cxl: Enable CXL PCIe Port Protocol Error handling and logging" found
here:
https://lore.kernel.org/linux-cxl/20260717222706.3540281-1-terry.bowman@amd.com/T/#md90ec1fdd1b374bf1e32e7736e2b3e34b328c701
The changes in this patch will allow CXL RAS protocol testing by injecting
AER errors using AER EINJ. The RAS register block status is updated
using a central function to augment RAS register block returned by
to_ras_base(). This supports all CXL devices including Root Ports,
Upstream Switch Ports, Downstream Switch Ports, Endpoints, and RCH
Downstream Ports.
Add debugfs-based CXL protocol error injection for testing CXL RAS
error handling paths. Injects CXL RAS protocol errors using AER internal
error inject interface via /sys/kernel/debug/cxl/aer_einj_inject.
RAS CXL status is set using to_ras_base() function override when kernel config
CONFIG_CXL_PROTO_AER_EINJ is enabled.
Usage:
echo "DDDD:BB:DD.F [UCE|CE] AER_STATUS RAS_STATUS [RCH]" > \
/sys/kernel/debug/cxl/aer_einj_inject
Move struct aer_error_inj and aer_inject() to linux/aer.h so CXL
can invoke AER injection directly. Export aer_inject() with
EXPORT_SYMBOL_GPL.
Make cxl_debugfs non-static in port.c and declare it extern in
core.h so the debugfs file can be created under the existing CXL
debugfs root.
Co-developed-by: Ben Cheatham <Benjamin.Cheatham@amd.com>
Signed-off-by: Ben Cheatham <Benjamin.Cheatham@amd.com>
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
drivers/cxl/Kconfig | 13 +++
drivers/cxl/core/core.h | 21 ++++
drivers/cxl/core/port.c | 2 +-
drivers/cxl/core/ras.c | 208 ++++++++++++++++++++++++++++++++++
drivers/cxl/core/ras_rch.c | 12 ++
drivers/pci/pcie/aer_inject.c | 29 ++---
include/linux/aer.h | 15 +++
7 files changed, 281 insertions(+), 19 deletions(-)
diff --git a/drivers/cxl/Kconfig b/drivers/cxl/Kconfig
index 80aeb0d556bd7..ef449228b2549 100644
--- a/drivers/cxl/Kconfig
+++ b/drivers/cxl/Kconfig
@@ -238,6 +238,19 @@ config CXL_RAS
def_bool y
depends on ACPI_APEI_GHES && PCIEAER && CXL_BUS
+config CXL_PROTO_AER_EINJ
+ bool "CXL: RAS Protocol Error Injection using AER EINJ"
+ depends on CXL_RAS
+ depends on PCIEAER_INJECT
+ help
+ Enable debugfs-based CXL protocol error injection. Writes to
+ /sys/kernel/debug/cxl/aer_einj_inject inject CXL RAS protocol
+ errors using the AER internal error inject interface.
+
+ This is a debug/test facility. Say N for production kernels.
+
+ If unsure say N.
+
config CXL_ATL
def_bool y
depends on CXL_REGION
diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
index a55a4e409feda..91910d2bb5d39 100644
--- a/drivers/cxl/core/core.h
+++ b/drivers/cxl/core/core.h
@@ -182,6 +182,9 @@ static inline struct device *dport_to_host(struct cxl_dport *dport)
return port->uport_dev;
return &port->dev;
}
+
+extern struct dentry *cxl_debugfs;
+
#ifdef CONFIG_CXL_RAS
void cxl_ras_init(void);
void cxl_ras_exit(void);
@@ -244,4 +247,22 @@ int cxl_set_feature(struct cxl_mailbox *cxl_mbox, const uuid_t *feat_uuid,
resource_size_t cxl_rcd_component_reg_phys(struct device *dev,
struct cxl_dport *dport);
+
+#ifdef CONFIG_CXL_PROTO_AER_EINJ
+
+#define AER_REGISTER_SIZE 5
+#define RAS_REGISTER_SIZE (CXL_RAS_CAPABILITY_LENGTH / sizeof(u32))
+
+struct cxl_aer_einj {
+ int correctable;
+ bool is_rch;
+ struct mutex *lock;
+ struct device *dev;
+ u32 aer_registers[AER_REGISTER_SIZE];
+ u32 ras_registers[RAS_REGISTER_SIZE];
+};
+
+extern struct cxl_aer_einj cxl_aer_einj;
+#endif
+
#endif /* __CXL_CORE_H__ */
diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index a76f3ee05cba8..79657e5fddaac 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -2501,7 +2501,7 @@ const struct bus_type cxl_bus_type = {
};
EXPORT_SYMBOL_NS_GPL(cxl_bus_type, "CXL");
-static struct dentry *cxl_debugfs;
+struct dentry *cxl_debugfs;
struct dentry *cxl_debugfs_create_dir(const char *dir)
{
diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c
index d77208af41e03..d41deea899d30 100644
--- a/drivers/cxl/core/ras.c
+++ b/drivers/cxl/core/ras.c
@@ -3,6 +3,7 @@
#include <linux/pci.h>
#include <linux/aer.h>
+#include <linux/debugfs.h>
#include <cxl/event.h>
#include <cxlmem.h>
#include <cxlpci.h>
@@ -117,6 +118,195 @@ static void cxl_cper_prot_err_work_fn(struct work_struct *work)
}
static DECLARE_WORK(cxl_cper_prot_err_work, cxl_cper_prot_err_work_fn);
+#if IS_ENABLED(CONFIG_CXL_PROTO_AER_EINJ)
+
+static DEFINE_MUTEX(cxl_aer_einj_mutex);
+
+struct cxl_aer_einj cxl_aer_einj = {
+ .lock = &cxl_aer_einj_mutex,
+};
+
+static const char cxl_aer_einj_usage[] =
+ "ssss:bb:dd.f [UCE|CE] AER_STATUS RAS_STATUS [RCH]\n";
+
+static int cxl_aer_inject_error(struct pci_dev *pdev, bool correctable,
+ u32 aer_status, u32 ras_status)
+{
+ /* RCD errors are signaled as internal errors on the associated RCEC */
+ if (pci_pcie_type(pdev) == PCI_EXP_TYPE_RC_END) {
+ if (!pdev->rcec)
+ return -ENODEV;
+ pdev = pdev->rcec;
+ }
+
+ struct aer_error_inj einj = {
+ .bus = pdev->bus->number,
+ .dev = PCI_SLOT(pdev->devfn),
+ .fn = PCI_FUNC(pdev->devfn),
+ .domain = pci_domain_nr(pdev->bus),
+ };
+ int ret;
+ int aer_offset;
+ int ras_offset;
+
+ if (correctable) {
+ einj.cor_status = aer_status | PCI_ERR_COR_INTERNAL;
+ aer_offset = PCI_ERR_COR_STATUS / sizeof(u32);
+ ras_offset = CXL_RAS_CORRECTABLE_STATUS_OFFSET / sizeof(u32);
+ } else {
+ einj.uncor_status = aer_status | PCI_ERR_UNC_INTN;
+ aer_offset = PCI_ERR_UNCOR_STATUS / sizeof(u32);
+ ras_offset = CXL_RAS_UNCORRECTABLE_STATUS_OFFSET / sizeof(u32);
+ }
+
+ cxl_aer_einj.correctable = correctable;
+ cxl_aer_einj.aer_registers[aer_offset] = aer_status;
+ cxl_aer_einj.ras_registers[ras_offset] = ras_status;
+
+ ret = aer_inject(&einj);
+ if (ret) {
+ pr_err("cxl-einj: aer_inject failed: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static ssize_t cxl_aer_einj_write(struct file *file,
+ const char __user *ubuf,
+ size_t count, loff_t *ppos)
+{
+ char sbdf[16], severity[4], topology[4] = "";
+ unsigned int domain, bus, dev, fn;
+ u32 aer_status, ras_status;
+ struct cxl_dport *dport;
+ char buf[128];
+ int nargs;
+ int ret;
+
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
+ if (count >= sizeof(buf)) {
+ pr_err("cxl-einj: input too long (%zu bytes, max %zu)\n", count, sizeof(buf) - 1);
+ return -EINVAL;
+ }
+
+ if (copy_from_user(buf, ubuf, count)) {
+ pr_err("cxl-einj: copy_from_user failed\n");
+ return -EFAULT;
+ }
+ buf[count] = '\0';
+
+ nargs = sscanf(buf, "%15s %3s %x %x %3s", sbdf, severity,
+ &aer_status, &ras_status, topology);
+ if (nargs < 4) {
+ pr_err("cxl-einj: expected format: <SBDF> <UCE|CE> <aer_status> <ras_status>\n");
+ return -EINVAL;
+ }
+
+ if (nargs == 5 && strcmp(topology, "RCH") != 0)
+ return -EINVAL;
+
+ if (strcmp(severity, "UCE") != 0 && strcmp(severity, "CE") != 0) {
+ pr_err("cxl-einj: expected 'UCE' or 'CE', got '%s'\n", severity);
+ return -EINVAL;
+ }
+
+ if (sscanf(sbdf, "%x:%x:%x.%x", &domain, &bus, &dev, &fn) != 4) {
+ pr_err("cxl-einj: invalid SBDF format '%s', expected DDDD:BB:DD.F\n", sbdf);
+ return -EINVAL;
+ }
+
+ struct pci_dev *pdev __free(pci_dev_put) =
+ pci_get_domain_bus_and_slot(domain, bus, PCI_DEVFN(dev, fn));
+ if (!pdev) {
+ pr_err("cxl-einj: device %s not found\n", sbdf);
+ return -ENODEV;
+ }
+
+ guard(mutex)(cxl_aer_einj.lock);
+ cxl_aer_einj.dev = NULL;
+
+ struct cxl_port *port __free(put_cxl_port) = find_cxl_port_by_dev(&pdev->dev, &dport);
+ if (!port) {
+ dev_err(&pdev->dev, "cxl-einj: Failed to find CXL Port.\n");
+ return -ENODEV;
+ }
+
+ if (!to_ras_base(port, dport)) {
+ dev_err(&pdev->dev, "cxl-einj: RAS not initialized.\n");
+ return -ENODEV;
+ }
+
+ cxl_aer_einj.is_rch = (nargs == 5 && strcmp(topology, "RCH") == 0);
+ if (!cxl_aer_einj.is_rch)
+ pci_dev_get(pdev);
+ cxl_aer_einj.dev = cxl_aer_einj.is_rch ? pdev->dev.parent : &pdev->dev;
+ ret = cxl_aer_inject_error(pdev, strcmp(severity, "CE") == 0,
+ aer_status, ras_status);
+ if (ret) {
+ if (!cxl_aer_einj.is_rch)
+ pci_dev_put(pdev);
+ cxl_aer_einj.dev = NULL;
+ pr_err("cxl-einj: injection failed for %s: %d\n", sbdf, ret);
+ return ret;
+ }
+
+ return count;
+}
+
+static ssize_t cxl_aer_einj_read(struct file *file, char __user *ubuf,
+ size_t count, loff_t *ppos)
+{
+ return simple_read_from_buffer(ubuf, count, ppos,
+ cxl_aer_einj_usage,
+ sizeof(cxl_aer_einj_usage) - 1);
+}
+
+static const struct file_operations cxl_ras_error_fops = {
+ .owner = THIS_MODULE,
+ .read = cxl_aer_einj_read,
+ .write = cxl_aer_einj_write,
+ .llseek = default_llseek,
+};
+
+static void cxl_ras_create_debugfs(struct dentry *dir)
+{
+ debugfs_create_file("aer_einj_inject", 0600, dir, NULL,
+ &cxl_ras_error_fops);
+}
+
+static void __iomem *to_einj_ras_base(struct cxl_port *port, struct cxl_dport *dport)
+{
+ if (dport) {
+ if (cxl_aer_einj.is_rch) {
+ if (cxl_aer_einj.dev == dport->dport_dev) {
+ cxl_aer_einj.dev = NULL;
+ return (__force void __iomem *)cxl_aer_einj.ras_registers;
+ }
+ } else {
+ if (cxl_aer_einj.dev == dport->dport_dev) {
+ pci_dev_put(to_pci_dev(cxl_aer_einj.dev));
+ cxl_aer_einj.dev = NULL;
+ return (__force void __iomem *)cxl_aer_einj.ras_registers;
+ }
+ }
+ } else if (!cxl_aer_einj.is_rch) {
+ struct device *dev = is_cxl_endpoint(port) ?
+ port->uport_dev->parent : port->uport_dev;
+
+ if (dev_is_pci(dev) && cxl_aer_einj.dev == dev) {
+ pci_dev_put(to_pci_dev(cxl_aer_einj.dev));
+ cxl_aer_einj.dev = NULL;
+ return (__force void __iomem *)cxl_aer_einj.ras_registers;
+ }
+ }
+
+ return NULL;
+}
+#endif
+
static void cxl_unmask_proto_interrupts(struct device *dev)
{
struct pci_dev *pdev;
@@ -238,6 +428,14 @@ void __iomem *to_ras_base(struct cxl_port *port, struct cxl_dport *dport)
if (!port)
return NULL;
+#if IS_ENABLED(CONFIG_CXL_PROTO_AER_EINJ)
+ if (cxl_aer_einj.dev) {
+ void __iomem *einj = to_einj_ras_base(port, dport);
+ if (einj)
+ return einj;
+ }
+#endif
+
if (dport)
return dport->regs.ras;
@@ -458,10 +656,20 @@ void cxl_ras_init(void)
cxl_cper_register_prot_err_work(&cxl_cper_prot_err_work);
cxl_register_proto_err_work(&cxl_proto_err_work,
cxl_proto_err_do_flush);
+#if IS_ENABLED(CONFIG_CXL_PROTO_AER_EINJ)
+ cxl_ras_create_debugfs(cxl_debugfs);
+#endif
}
void cxl_ras_exit(void)
{
cxl_unregister_proto_err_work();
cxl_cper_unregister_prot_err_work();
+#if IS_ENABLED(CONFIG_CXL_PROTO_AER_EINJ)
+ if (cxl_aer_einj.dev) {
+ if (!cxl_aer_einj.is_rch)
+ pci_dev_put(to_pci_dev(cxl_aer_einj.dev));
+ cxl_aer_einj.dev = NULL;
+ }
+#endif
}
diff --git a/drivers/cxl/core/ras_rch.c b/drivers/cxl/core/ras_rch.c
index 14bb3bdb2d092..5071cf86e4a68 100644
--- a/drivers/cxl/core/ras_rch.c
+++ b/drivers/cxl/core/ras_rch.c
@@ -110,6 +110,14 @@ void cxl_handle_rdport_errors(struct pci_dev *pdev)
if (!dport)
return;
+#if IS_ENABLED(CONFIG_CXL_PROTO_AER_EINJ)
+ if (cxl_aer_einj.is_rch && cxl_aer_einj.dev) {
+ severity = cxl_aer_einj.correctable ?
+ AER_CORRECTABLE : AER_FATAL;
+ goto handle_ras;
+ }
+#endif
+
if (!cxl_rch_get_aer_info(dport->regs.dport_aer, &aer_regs))
return;
@@ -117,6 +125,10 @@ void cxl_handle_rdport_errors(struct pci_dev *pdev)
return;
pci_print_aer(pdev, severity, &aer_regs);
+
+#if IS_ENABLED(CONFIG_CXL_PROTO_AER_EINJ)
+handle_ras:
+#endif
if (severity == AER_CORRECTABLE)
cxl_handle_cor_ras(dport->port, dport,
to_ras_base(port, dport), pdev->dsn);
diff --git a/drivers/pci/pcie/aer_inject.c b/drivers/pci/pcie/aer_inject.c
index 09bfc7194ef31..b313adef680ae 100644
--- a/drivers/pci/pcie/aer_inject.c
+++ b/drivers/pci/pcie/aer_inject.c
@@ -14,6 +14,7 @@
#define dev_fmt(fmt) "aer_inject: " fmt
+#include <linux/aer.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
@@ -31,19 +32,6 @@
static bool aer_mask_override;
module_param(aer_mask_override, bool, 0);
-struct aer_error_inj {
- u8 bus;
- u8 dev;
- u8 fn;
- u32 uncor_status;
- u32 cor_status;
- u32 header_log0;
- u32 header_log1;
- u32 header_log2;
- u32 header_log3;
- u32 domain;
-};
-
struct aer_error {
struct list_head list;
u32 domain;
@@ -316,7 +304,7 @@ static int pci_bus_set_aer_ops(struct pci_bus *bus)
return 0;
}
-static int aer_inject(struct aer_error_inj *einj)
+int aer_inject(struct aer_error_inj *einj)
{
struct aer_error *err, *rperr;
struct aer_error *err_alloc = NULL, *rperr_alloc = NULL;
@@ -332,10 +320,14 @@ static int aer_inject(struct aer_error_inj *einj)
dev = pci_get_domain_bus_and_slot(einj->domain, einj->bus, devfn);
if (!dev)
return -ENODEV;
- rpdev = pcie_find_root_port(dev);
- /* If Root Port not found, try to find an RCEC */
- if (!rpdev)
- rpdev = dev->rcec;
+ if (pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC)
+ rpdev = dev;
+ else {
+ rpdev = pcie_find_root_port(dev);
+ /* If Root Port not found, try to find an RCEC */
+ if (!rpdev)
+ rpdev = dev->rcec;
+ }
if (!rpdev) {
pci_err(dev, "Neither Root Port nor RCEC found\n");
ret = -ENODEV;
@@ -482,6 +474,7 @@ static int aer_inject(struct aer_error_inj *einj)
pci_dev_put(dev);
return ret;
}
+EXPORT_SYMBOL_GPL(aer_inject);
static ssize_t aer_inject_write(struct file *filp, const char __user *ubuf,
size_t usize, loff_t *off)
diff --git a/include/linux/aer.h b/include/linux/aer.h
index b3657b80564b9..65c22ba597657 100644
--- a/include/linux/aer.h
+++ b/include/linux/aer.h
@@ -27,6 +27,21 @@
struct pci_dev;
struct work_struct;
+struct aer_error_inj {
+ u8 bus;
+ u8 dev;
+ u8 fn;
+ u32 uncor_status;
+ u32 cor_status;
+ u32 header_log0;
+ u32 header_log1;
+ u32 header_log2;
+ u32 header_log3;
+ u32 domain;
+};
+
+int aer_inject(struct aer_error_inj *einj);
+
struct pcie_tlp_log {
union {
u32 dw[PCIE_STD_MAX_TLP_HEADERLOG];
--
2.34.1
^ permalink raw reply related
* Re: [PATCH 35/60] kvm: Add VCPU plane-scheduling state and helpers
From: Saenz Julienne, Nicolas @ 2026-07-17 17:33 UTC (permalink / raw)
To: James Bottomley, Saenz Julienne, Nicolas, Jörg Rödel,
Paolo Bonzini
Cc: Sean Christopherson, Tom Lendacky, ashish.kalra@amd.com,
michael.roth@amd.com, Orazgaliyeva, Anel, Melody Wang,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
kvmarm@lists.linux.dev, loongarch@lists.linux.dev,
linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
kvm-riscv@lists.infradead.org, x86@kernel.org,
coconut-svsm@lists.linux.dev, joerg.roedel@amd.com
In-Reply-To: <976f1a8316438d5b7c2f446a0369dcda3289cc92.camel@HansenPartnership.com>
On Fri Jul 17, 2026 at 5:56 PM CEST, James Bottomley wrote:
>> > > The idea of the userspace scheduling was that you're not forced
>> > > to use it - the kernel can always choose to override it if it's
>> > > using an accelerated implementation of planes (and of plane
>> > > switching). But it also leaves some leeway to different
>> > > accelerated implementations, each of which can pick their own
>> > > algorithm.
>> > >
>> > > Conceptually I'd rather keep the possibility of userspace
>> > > scheduling. But maybe it doesn't add much.
>> >
>> > My preference is to keep plane scheduling at one place (in the
>> > kernel) to keep it simple. But if you see a need for user-mode to
>> > interact there as well (only really works for VSM), then I can add
>> > it.
>>
>> The responsibility split we had in mind when we built a VSM emulation
>> prototype [1] was to keep all VTL policing in user-space. This
>> includes VTL switching, Cross VTL IPIs, Intercepts (Memory, MSRs,
>> Insns, CPU regs), VTL aware SMP bring-up, etc. Even with KVM Planes
>> in place, my thinking was to keep it as such. While all this could be
>> implemented in the kernel, in practical terms, I think it'll be
>> easier to get VSM support upstream the more we move the
>> implementation into user-space.
>
> I looked at the kernel bit. The vsm/dev branch contains 72 patches
> over 6.12 which is quite a lot ...
Yes, and on top punting most of VSM's implementation into user-space,
it's incomplete.
> However, from a quick skim, the main thing is that you used multiple
> KVM structures to manage the planes which means each plane naturally
> gets its own address space. In the current planes model so far there's
> only one address space (or two if you have SMM). SNP doesn't need
> anything above this because the VMPL protection is naturally managed
> inside the guest (so not really visible to the host) but a VTL
> implementation will. So I think the big question becomes how are we
> going to achieve address space separation for planes? It's tempting to
> say simply one address space per plane and make SMM its own plane with
> different switching but it's an awful lot of overhead especially as
> most VMs won't even use planes, so it looks like there has to be a more
> opportunistic model for planes address spaces.
While adress spaces are per VM, KVM memory attributes are per plane. It
should be enough to implement VSM's memory protections as well as the
enclaves design you mentioned. We have a series in-flux implementing RWX
memory attributes [1].
The only thing that's not feasible "naturally" with attributes are
memory overlays or any situation where we'd need to change the backing
memory of a guest physical address range just for a single plane. From a
VSM perspective it's fine. The only use-case from a VSM perspective are
memory overlays (and those, from my experience, are useless). I don't
know that's a deal-breaker the mutually distrusting model.
Nicolas
[1] https://lore.kernel.org/kvm/20260716181456.402786-1-pbonzini@redhat.com/
^ permalink raw reply
* Re: [PATCH v18 11/13] PCI: Cache PCI DSN into pci_dev->dsn during probe
From: Lukas Wunner @ 2026-07-18 7:02 UTC (permalink / raw)
To: Terry Bowman
Cc: Bjorn Helgaas, Dan Williams, Dave Jiang, Ira Weiny,
Jonathan Cameron, Len Brown, Rafael J . Wysocki, Robert Richter,
linux-acpi, linux-cxl, linux-doc, linux-kernel, linux-pci,
linuxppc-dev, Alejandro Lucero, Alison Schofield, Ankit Agrawal,
Ard Biesheuvel, Ben Cheatham, Borislav Petkov, Breno Leitao,
Davidlohr Bueso, Fabio M . De Francesco, Gregory Price,
Hanjun Guo, Jonathan Corbet, Kees Cook,
Kuppuswamy Sathyanarayanan, Li Ming, Mahesh J Salgaonkar,
Mauro Carvalho Chehab, Oliver O'Halloran, Shiju Jose,
Shuah Khan, Shuai Xue, Smita Koralahalli, Tony Luck, Vishal Verma
In-Reply-To: <20260717222706.3540281-12-terry.bowman@amd.com>
On Fri, Jul 17, 2026 at 05:27:04PM -0500, Terry Bowman wrote:
> Add a u64 dsn field to struct pci_dev and populate it from pci_get_dsn()
> during pci_init_capabilities() at probe time via pci_dsn_init(). Only
> write dev->dsn when the read succeeds. The zero initial value from
> pci_dev allocation already represents 'no DSN available.'
The DSN is already cached on (natively handled) PCIe hotplug ports
to detect device replacement during system sleep, see struct controller
in drivers/pci/hotplug/pciehp.h.
Please remove that member from struct controller, remove the two
assignments to the member in pciehp_configure_device() and pcie_init()
and change the comparison in pciehp_device_replaced() to use the new
member in struct pci_dev. You can do this either as part of this patch
or in a separate patch.
Thanks,
Lukas
^ permalink raw reply
* Re: [PATCH net v3] net: dpaa: fix mode setting
From: Christian Zigotzky @ 2026-07-18 7:35 UTC (permalink / raw)
To: Sean Anderson
Cc: Michael Walle, Madalin Bucur, Andrew Lunn, David S Miller,
Eric Dumazet, Jakub Kicinski, Abeni Paolo, Christian Zigotzky,
netdev, linux-kernel, linuxppc-dev, Trevor Dickinson,
mad skateman, hypexed
In-Reply-To: <4f7497cf-83ed-47cd-2e7b-d06ebe319b61@linux.dev>
On 17 July 2026 at 11:11 am, Sean Anderson <sean.anderson@linux.dev> wrote:
On 7/17/26 09:20, Michael Walle wrote:
---
I didn't grab Sean's Rb tag as this is somewhat different.
Changes in v3:
- keep the mode setting also in .adjust_link().
- reword the commit message, to be (hopefully) more precise
- Link to v2: https://lore.kernel.org/r/20260710143430.2276141-1-mwalle@kernel.org/
Changes in v2:
- the setting is/was based on the maximum speed, not the current
speed. thus, move the setting into mac_config().
- Link to v1: https://lore.kernel.org/r/20260706121011.1948906-1-mwalle@kernel.org/
.../net/ethernet/freescale/fman/fman_dtsec.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.c b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
index fe35703c509e..b8d70c0ecb6c 100644
--- a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
+++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
@@ -900,22 +900,28 @@ static void dtsec_mac_config(struct phylink_config *config, unsigned int mode,
{
struct mac_device *mac_dev = fman_config_to_mac(config);
struct dtsec_regs __iomem *regs = mac_dev->fman_mac->regs;
- u32 tmp;
+ u32 ecntrl, maccfg2;
+
+ maccfg2 = ioread32be(®s->maccfg2);
+ maccfg2 &= ~(MACCFG2_NIBBLE_MODE | MACCFG2_BYTE_MODE);
switch (state->interface) {
case PHY_INTERFACE_MODE_RMII:
- tmp = DTSEC_ECNTRL_RMM;
+ ecntrl = DTSEC_ECNTRL_RMM;
+ maccfg2 |= MACCFG2_NIBBLE_MODE;
break;
case PHY_INTERFACE_MODE_RGMII:
case PHY_INTERFACE_MODE_RGMII_ID:
case PHY_INTERFACE_MODE_RGMII_RXID:
case PHY_INTERFACE_MODE_RGMII_TXID:
- tmp = DTSEC_ECNTRL_GMIIM | DTSEC_ECNTRL_RPM;
+ ecntrl = DTSEC_ECNTRL_GMIIM | DTSEC_ECNTRL_RPM;
+ maccfg2 |= MACCFG2_BYTE_MODE;
break;
case PHY_INTERFACE_MODE_SGMII:
case PHY_INTERFACE_MODE_1000BASEX:
case PHY_INTERFACE_MODE_2500BASEX:
- tmp = DTSEC_ECNTRL_TBIM | DTSEC_ECNTRL_SGMIIM;
+ ecntrl = DTSEC_ECNTRL_TBIM | DTSEC_ECNTRL_SGMIIM;
+ maccfg2 |= MACCFG2_BYTE_MODE;
break;
default:
dev_warn(mac_dev->dev, "cannot configure dTSEC for %s\n",
@@ -923,7 +929,8 @@ static void dtsec_mac_config(struct phylink_config *config, unsigned int mode,
return;
}
- iowrite32be(tmp, ®s->ecntrl);
+ iowrite32be(ecntrl, ®s->ecntrl);
+ iowrite32be(maccfg2, ®s->maccfg2);
}
static void dtsec_link_up(struct phylink_config *config, struct phy_device *phy,
Reviewed-by: Sean Anderson <sean.anderson@linux.dev>
Christian, can you test this patch with ethernet at 100/1G speed if you still have
access to those P5020/P5040 boards?
- - -
Yes, I will test it as soon as possible.
- Christian
^ permalink raw reply related
* Re: [PATCH] USB: phy: fsl-usb: fix missing static keywords
From: Manuel Ebner @ 2026-07-18 11:30 UTC (permalink / raw)
To: Johan Hovold, Greg Kroah-Hartman
Cc: linux-next, linux-usb, linuxppc-dev, linux-kernel, stable,
Mark Brown
In-Reply-To: <20260717154957.1853976-1-johan@kernel.org>
On Fri, 2026-07-17 at 17:49 +0200, Johan Hovold wrote:
> A recent change enabling compile testing of a Freescale dual-role
> controller indirectly enabled a USB PHY driver to be built. That driver
> in turn is missing a bunch of static keywords which results in warnings
> like:
>
> drivers/usb/phy/phy-fsl-usb.c:105:5: error: no previous prototype for 'write_ulpi' [-
> Werror=missing-prototypes]
> 105 | int write_ulpi(u8 addr, u8 data)
> | ^~~~~~~~~~
>
> which consequently breaks -Werror builds.
>
> Add the missing static keywords.
>
> Fixes: 0807c500a1a6 ("USB: add Freescale USB OTG Transceiver driver")
> Cc: stable@vger.kernel.org # 3.0
Add linux-next@vger.kernel.org
> Reported-by: Mark Brown <broonie@kernel.org>
> Link: https://lore.kernel.org/r/4f9f5ff9-8eaa-4bd5-9331-37119f78e13f@sirena.org.uk
> Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: Manuel Ebner <manuelebner@mailbox.org>
Thanks
Manuel
> ---
> drivers/usb/phy/phy-fsl-usb.c | 52 +++++++++++++++++------------------
> drivers/usb/phy/phy-fsl-usb.h | 6 ++--
> 2 files changed, 29 insertions(+), 29 deletions(-)
>
> [...]
^ permalink raw reply
* Re: [PATCH net v3] net: dpaa: fix mode setting
From: Christian Zigotzky @ 2026-07-18 16:31 UTC (permalink / raw)
To: Sean Anderson, Michael Walle, Madalin Bucur, Andrew Lunn,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Christian Zigotzky
Cc: netdev, linux-kernel, linuxppc-dev, R.T.Dickinson, mad skateman,
Damien Stewart
In-Reply-To: <4f7497cf-83ed-47cd-2e7b-d06ebe319b61@linux.dev>
On 17/07/26 23:10, Sean Anderson wrote:
> On 7/17/26 09:20, Michael Walle wrote:
>> Before converting to the phylink interface, the init function would have
>> set a non-reserved I/F mode in the maccfg2 register. After converting to
>> phylink, 0 is written as mode, which is a reserved value (although it's
>> the hardware default). Without a valid mode, a SGMII link is never
>> established between the MAC and the PHY and thus .link_up() is never
>> called which could set the correct mode according to the actual speed.
>>
>> Fix it by setting the maximum speed of the phy_interface_t in use in
>> .mac_config() - just like the driver did before the phylink conversion.
>>
>> Fixes: 5d93cfcf7360 ("net: dpaa: Convert to phylink")
>> Suggested-by: Sean Anderson <sean.anderson@linux.dev>
>> Signed-off-by: Michael Walle <mwalle@kernel.org>
>> ---
>> I didn't grab Sean's Rb tag as this is somewhat different.
>>
>> Changes in v3:
>> - keep the mode setting also in .adjust_link().
>> - reword the commit message, to be (hopefully) more precise
>> - Link to v2:
>> https://lore.kernel.org/r/20260710143430.2276141-1-mwalle@kernel.org/
>>
>> Changes in v2:
>> - the setting is/was based on the maximum speed, not the current
>> speed. thus, move the setting into mac_config().
>> - Link to v1:
>> https://lore.kernel.org/r/20260706121011.1948906-1-mwalle@kernel.org/
>>
>> .../net/ethernet/freescale/fman/fman_dtsec.c | 17 ++++++++++++-----
>> 1 file changed, 12 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
>> b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
>> index fe35703c509e..b8d70c0ecb6c 100644
>> --- a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
>> +++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
>> @@ -900,22 +900,28 @@ static void dtsec_mac_config(struct
>> phylink_config *config, unsigned int mode,
>> {
>> struct mac_device *mac_dev = fman_config_to_mac(config);
>> struct dtsec_regs __iomem *regs = mac_dev->fman_mac->regs;
>> - u32 tmp;
>> + u32 ecntrl, maccfg2;
>> +
>> + maccfg2 = ioread32be(®s->maccfg2);
>> + maccfg2 &= ~(MACCFG2_NIBBLE_MODE | MACCFG2_BYTE_MODE);
>> switch (state->interface) {
>> case PHY_INTERFACE_MODE_RMII:
>> - tmp = DTSEC_ECNTRL_RMM;
>> + ecntrl = DTSEC_ECNTRL_RMM;
>> + maccfg2 |= MACCFG2_NIBBLE_MODE;
>> break;
>> case PHY_INTERFACE_MODE_RGMII:
>> case PHY_INTERFACE_MODE_RGMII_ID:
>> case PHY_INTERFACE_MODE_RGMII_RXID:
>> case PHY_INTERFACE_MODE_RGMII_TXID:
>> - tmp = DTSEC_ECNTRL_GMIIM | DTSEC_ECNTRL_RPM;
>> + ecntrl = DTSEC_ECNTRL_GMIIM | DTSEC_ECNTRL_RPM;
>> + maccfg2 |= MACCFG2_BYTE_MODE;
>> break;
>> case PHY_INTERFACE_MODE_SGMII:
>> case PHY_INTERFACE_MODE_1000BASEX:
>> case PHY_INTERFACE_MODE_2500BASEX:
>> - tmp = DTSEC_ECNTRL_TBIM | DTSEC_ECNTRL_SGMIIM;
>> + ecntrl = DTSEC_ECNTRL_TBIM | DTSEC_ECNTRL_SGMIIM;
>> + maccfg2 |= MACCFG2_BYTE_MODE;
>> break;
>> default:
>> dev_warn(mac_dev->dev, "cannot configure dTSEC for %s\n",
>> @@ -923,7 +929,8 @@ static void dtsec_mac_config(struct
>> phylink_config *config, unsigned int mode,
>> return;
>> }
>> - iowrite32be(tmp, ®s->ecntrl);
>> + iowrite32be(ecntrl, ®s->ecntrl);
>> + iowrite32be(maccfg2, ®s->maccfg2);
>> }
>> static void dtsec_link_up(struct phylink_config *config, struct
>> phy_device *phy,
>
> Reviewed-by: Sean Anderson <sean.anderson@linux.dev>
>
> Christian, can you test this patch with ethernet at 100/1G speed if
> you still have
> access to those P5020/P5040 boards?
>
> https://lore.kernel.org/all/0bfc8f3d-cb62-25f4-2590-ff424adbe48a@xenosoft.de/
>
I tested the patch today. I don't see any differences.
Further information:
https://github.com/chzigotzky/kernels/releases/tag/v7.2.0-rc3-fman-dtsec-patch
Christian
--
Sent with BrassMonkey 34.2.2 (https://github.com/chzigotzky/Web-Browsers-and-Suites-for-Linux-PPC/releases/tag/BrassMonkey_34.2.2)
^ permalink raw reply
* Re: powerpc/pseries: EEH detected with xhci_hcd
From: Sourabh Jain @ 2026-07-19 4:17 UTC (permalink / raw)
To: Narayana Murty N, Mahesh J Salgaonkar, linuxppc-dev,
Ritesh Harjani (IBM), Venkat Rao Bagalkote, Nicholas Piggin,
Michael Ellerman, shivang upadhyay, sbhat
In-Reply-To: <ad7eefde-0439-4258-92a7-4ab782a32d42@linux.ibm.com>
On 17/07/26 10:26, Narayana Murty N wrote:
>
>
> On 15/07/26 7:33 PM, Sourabh Jain wrote:
>>
>> This issue only occurs with the Radix MMU.
>> Booting the same kernel with disable_radix=1 does not reproduce the
>> issue.
>>
>> The system also has pmem.
>>
>> +CC Shivang and Shiva
>>
>> - Sourabh Jain
>>
>>
>> On 15/07/26 15:01, Sourabh Jain wrote:
>>> Hello,
>>>
>>> Upstream kernel with head at commit
>>> 3b029c035b34bbc693405ddf759f0e9b920c27f1
>>> hitting EEH with xhci_hcd during kernel boot.
>>>
>>> The issue was not observed on the distro kernel running on the the
>>> same machine.
>>>
>>> Trace:
>>> [ 2.130359] [ C8] ibmvscsi 30000066: SRP_LOGIN succeeded
>>> [ 2.132280] [ T362] xhci_hcd 0014:01:00.0: xHCI Host Controller
>>> [ 2.132289] [ T362] xhci_hcd 0014:01:00.0: new USB bus
>>> registered, assigned bus number 1
>>> [ 2.132449] [ T362] xhci_hcd 0014:01:00.0:
>>> ibm,query-pe-dma-windows(53) 10000 8000000 20000014 returned 0,
>>> lb=1000000 ps=103 wn=1
>>> [ 2.132453] [ T362] xhci_hcd 0014:01:00.0: Skipping ibm,pmemory
>>> [ 2.141861] [ T110] scsi 0:0:1:0: Direct-Access AIX VDASD
>>> 0001 PQ: 0 ANSI: 3
>>> [ 2.143707] [ T362] xhci_hcd 0014:01:00.0:
>>> ibm,create-pe-dma-window(54) 10000 8000000 20000014 15 28 returned 0
>>> (liobn = 0x70000014 starting addr = 8000000 0)
>>> [ 2.147236] [ T362] xhci_hcd 0014:01:00.0: lsa_required: 0,
>>> lsa_enabled: 0, direct mapping: 1
>>> [ 2.147239] [ T362] xhci_hcd 0014:01:00.0: iommu: 64-bit OK
>>> but direct DMA is limited by 800010000000000
>>> [ 2.147250] [ T362] xhci_hcd 0014:01:00.0: lsa_required: 0,
>>> lsa_enabled: 0, direct mapping: 1
>>> [ 2.147252] [ T362] xhci_hcd 0014:01:00.0: iommu: 64-bit OK
>>> but direct DMA is limited by 800010000000000
>>> [ 2.147476] [ T362] xhci_hcd 0014:01:00.0: hcc params
>>> 0x0270f06d hci version 0x96 quirks 0x0000000004000000
>>> [ 2.149530] [ T362] xhci_hcd 0014:01:00.0: xHCI Host Controller
>>> [ 2.149536] [ T362] xhci_hcd 0014:01:00.0: new USB bus
>>> registered, assigned bus number 2
>>> [ 2.149542] [ T362] xhci_hcd 0014:01:00.0: Host supports USB
>>> 3.0 SuperSpeed
>>> [ 2.149638] [ T362] usb usb1: New USB device found,
>>> idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
>>> [ 2.149642] [ T362] usb usb1: New USB device strings: Mfr=3,
>>> Product=2, SerialNumber=1
>>> [ 2.149644] [ T362] usb usb1: Product: xHCI Host Controller
>>> [ 2.149646] [ T362] usb usb1: Manufacturer: Linux
>>> 7.2.0-rc3upstream+ xhci-hcd
>>> [ 2.149647] [ T362] usb usb1: SerialNumber: 0014:01:00.0
>>> [ 2.149817] [ T362] hub 1-0:1.0: USB hub found
>>> [ 2.149937] [ T362] hub 1-0:1.0: 4 ports detected
>>> [ 2.150020] [ T362] xhci_hcd 0014:01:00.0: xHCI host
>>> controller not responding, assume dead
>>> [ 2.150044] [ T362] xhci_hcd 0014:01:00.0: HC died; cleaning up
>>> [ 2.150125] [ T118] EEH: Recovering PHB#14-PE#10000
>>> [ 2.150135] [ T118] EEH: PE location: N/A, PHB location: N/A
>>> [ 2.150143] [ T118] EEH: Frozen PHB#14-PE#10000 detected
>>> [ 2.150149] [ T118] EEH: Call Trace:
>>> [ 2.150154] [ T362] xhci_hcd 0014:01:00.0: HC died; cleaning up
>>> [ 2.150154] [ T118] EEH: [0000000066e7b6f8]
>>> __eeh_send_failure_event+0xa8/0x190
>>> [ 2.150167] [ T362] xhci_hcd 0014:01:00.0: USB bus 2 deregistered
>>> [ 2.150171] [ T362] xhci_hcd 0014:01:00.0: remove, state 1
>>> [ 2.150174] [ T118] EEH: [000000004754a593]
>>> eeh_dev_check_failure+0x408/0x7a0
>>> [ 2.150177] [ T362] usb usb1: USB disconnect, device number 1
>>> [ 2.150185] [ T118] EEH: [00000000063df7cc]
>>> xhci_portsc_readl+0x64/0x90 [xhci_hcd]
>>> [ 2.150216] [ T118] EEH: [00000000593ad484]
>>> xhci_hub_control+0xe28/0x27f0 [xhci_hcd]
>>> [ 2.150244] [ T118] EEH: [00000000190f1012]
>>> usb_hcd_submit_urb+0x508/0xd30 [usbcore]
>>> [ 2.150276] [ T118] EEH: [0000000072d7c35d]
>>> usb_submit_urb+0x254/0x840 [usbcore]
>>> [ 2.150303] [ T118] EEH: [0000000009787909]
>>> usb_start_wait_urb+0x88/0x270 [usbcore]
>>> [ 2.150331] [ T118] EEH: [00000000e6ec433e]
>>> usb_control_msg+0x134/0x1f0 [usbcore]
>>> [ 2.150357] [ T118] EEH: [00000000d77b1b30]
>>> hub_probe+0x570/0x12b8 [usbcore]
>>> [ 2.150385] [ T118] EEH: [0000000091c7d281]
>>> usb_probe_interface+0x124/0x490 [usbcore]
>>> [ 2.150412] [ T118] EEH: [00000000dc656a09]
>>> really_probe+0x118/0x580
>>> [ 2.150425] [ T118] EEH: [00000000131d8dfb]
>>> __driver_probe_device+0xc4/0x270
>>> [ 2.150434] [ T118] EEH: [00000000e26dfd1d]
>>> driver_probe_device+0x5c/0x110
>>> [ 2.150442] [ T118] EEH: [000000006312c397]
>>> __device_attach_driver+0x10c/0x210
>>> [ 2.150451] [ T118] EEH: [000000004edd640b]
>>> bus_for_each_drv+0xb0/0x130
>>> [ 2.150460] [ T118] EEH: [000000009b173e09]
>>> __device_attach+0xdc/0x2a0
>>> [ 2.150467] [ T118] EEH: [000000004588b69c]
>>> device_initial_probe+0x70/0x80
>>> [ 2.150473] [ T118] EEH: [000000003dba8fbb]
>>> bus_probe_device+0x50/0xf0
>>> [ 2.150479] [ T118] EEH: [00000000f1fd4a53]
>>> device_add+0x8f0/0xc00
>>> [ 2.150486] [ T118] EEH: [00000000a74fc843]
>>> usb_set_configuration+0x78c/0xb60 [usbcore]
>>> [ 2.150526] [ T118] EEH: [000000001df4c94f]
>>> usb_generic_driver_probe+0x78/0xd0 [usbcore]
>>> [ 2.150556] [ T118] EEH: [00000000a7086db7]
>>> usb_probe_device+0x60/0x200 [usbcore]
>>> [ 2.150584] [ T118] EEH: [00000000dc656a09]
>>> really_probe+0x118/0x580
>>> [ 2.150591] [ T118] EEH: [00000000131d8dfb]
>>> __driver_probe_device+0xc4/0x270
>>> [ 2.150603] [ T118] EEH: [00000000e26dfd1d]
>>> driver_probe_device+0x5c/0x110
>>> [ 2.150611] [ T118] EEH: [000000006312c397]
>>> __device_attach_driver+0x10c/0x210
>>> [ 2.150620] [ T118] EEH: [000000004edd640b]
>>> bus_for_each_drv+0xb0/0x130
>>> [ 2.150629] [ T118] EEH: [000000009b173e09]
>>> __device_attach+0xdc/0x2a0
>>> [ 2.150636] [ T118] EEH: [000000004588b69c]
>>> device_initial_probe+0x70/0x80
>>> [ 2.150648] [ T118] EEH: [000000003dba8fbb]
>>> bus_probe_device+0x50/0xf0
>>> [ 2.150655] [ T118] EEH: [00000000f1fd4a53]
>>> device_add+0x8f0/0xc00
>>> [ 2.150664] [ T118] EEH: [000000005bca6639]
>>> usb_new_device+0x2f4/0x890 [usbcore]
>>> [ 2.150693] [ T118] EEH: [0000000023d4a3a1]
>>> register_root_hub+0x1e4/0x2a0 [usbcore]
>>> [ 2.150721] [ T118] EEH: [00000000941149db]
>>> usb_add_hcd+0x82c/0x8f0 [usbcore]
>>> [ 2.150749] [ T118] EEH: [00000000f13842f6]
>>> xhci_pci_common_probe+0x1e4/0x3d0 [xhci_pci]
>>> [ 2.150760] [ T118] EEH: [00000000862a8445]
>>> local_pci_probe+0x64/0x100
>>> [ 2.150770] [ T118] EEH: [00000000c124ce3b]
>>> pci_device_probe+0x330/0x370
>>> [ 2.150778] [ T118] EEH: [00000000dc656a09]
>>> really_probe+0x118/0x580
>>> [ 2.150792] [ T118] EEH: [00000000131d8dfb]
>>> __driver_probe_device+0xc4/0x270
>>> [ 2.150800] [ T118] EEH: [00000000e26dfd1d]
>>> driver_probe_device+0x5c/0x110
>>> [ 2.150808] [ T118] EEH: [00000000f3819f2a]
>>> __driver_attach+0x12c/0x2d0
>>> [ 2.150816] [ T118] EEH: [00000000b7c6a37c]
>>> bus_for_each_dev+0xa4/0x130
>>> [ 2.150824] [ T118] EEH: [000000009bdf640c]
>>> driver_attach+0x30/0x50
>>> [ 2.150836] [ T118] EEH: [0000000039921381]
>>> bus_add_driver+0x1c0/0x380
>>> [ 2.150844] [ T118] EEH: [0000000034a0727d]
>>> driver_register+0x9c/0x1b0
>>> [ 2.150852] [ T362] xhci_hcd 0014:01:00.0: USB bus 1 deregistered
>>> [ 2.150851] [ T118] EEH: [000000002faf9b88]
>>> __pci_register_driver+0x64/0x80
>>> [ 2.150861] [ T118] EEH: [000000005142b255]
>>> xhci_pci_init+0x90/0xb0 [xhci_pci]
>>> [ 2.150869] [ T118] EEH: [00000000a9fe4af6]
>>> do_one_initcall+0x5c/0x40c
>>> [ 2.150883] [ T118] EEH: [00000000e2b1b716]
>>> do_init_module+0xac/0x3c0
>>> [ 2.150893] [ T118] EEH: [00000000fc06f562]
>>> init_module_from_file+0x120/0x1b0
>>> [ 2.150902] [ T118] EEH: [000000004ca14a9d]
>>> sys_finit_module+0x1b4/0x4d0
>>> [ 2.150910] [ T118] EEH: [000000005e56c4e5]
>>> system_call_exception+0x184/0x430
>>> [ 2.150919] [ T362] xhci_hcd 0014:01:00.0: probe with driver
>>> xhci_hcd failed with error -108
>>> [ 2.150930] [ T118] EEH: [0000000024ebcbb3]
>>> system_call_vectored_common+0x15c/0x2ec
>>> [ 2.150941] [ T118] EEH: This PCI device has failed 1 times in
>>> the last hour and will be permanently disabled after 5 failures.
>>> [ 2.150943] [ T118] EEH: Notify device drivers to shutdown
>>> [ 2.150947] [ T118] EEH: Beginning: 'error_detected(IO frozen)'
>>>
>>> Snip.....
>>> And after sometime the device is disabled.
>>>
>>> [ 40.450010] [ T118] EEH: PHB#14-PE#10000 has failed 6 times in
>>> the last hour and has been permanently disabled.
>>> [ 40.450027] [ T118] EEH: Unable to recover from failure from
>>> PHB#14-PE#10000.
>>> Please try reseating or replacing it
>>>
>>> Attached the kernel config and dmesg.
>>>
>>> - Sourabh Jain
>>
> Is the device EEH capable? it seems
> error_detected is not invoked any driver
> callbacks.
How to verify that? Is the below data enough to conclude the above
statement?
root> lspci 0014:01:00.0 USB controller: Texas Instruments TUSB73x0
SuperSpeed USB 3.0 xHCI Host Controller (rev 02)
root> cat /sys/bus/pci/devices/0014\:01\:00.0/eeh_mode
0x200
root> cat /sys/bus/pci/devices/0014\:01\:00.0/eeh_pe_config_addr
0x10000
root> cat /sys/bus/pci/devices/0014\:01\:00.0/eeh_pe_state
0x00000000 0x00000003
- Sourabh Jain
^ permalink raw reply
* Re: powerpc/pseries: EEH detected with xhci_hcd
From: Sourabh Jain @ 2026-07-19 4:29 UTC (permalink / raw)
To: Ritesh Harjani (IBM), Narayana Murty N, Mahesh J Salgaonkar,
linuxppc-dev, Venkat Rao Bagalkote, Nicholas Piggin,
Michael Ellerman, shivang upadhyay, sbhat
In-Reply-To: <cxwnv8p4.ritesh.list@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 5574 bytes --]
On 16/07/26 10:21, Ritesh Harjani (IBM) wrote:
> Sourabh Jain <sourabhjain@linux.ibm.com> writes:
>
>> This issue only occurs with the Radix MMU.
>> Booting the same kernel with disable_radix=1 does not reproduce the issue.
>>
>> The system also has pmem.
> @Sourabh,
>
> Few requests -
> 1. Could you also attach the boot logs from the same system with the
> same kernel but with disable_radix=1?
>
> 2. I can't really tell on how is MMU related to this issue? But I think
> if you could share the working dmesg logs from Hash that might give
> some more info. I am suspecting what if the firmware negotiates
> different page sizes even for TCEs for Radix v/s Hash.
Attached the dmesg of the kernel where issue is reproducible with and
without
disable_radix=1
>
> 3. Would it be possible for you to try git bisect and identify the
> culprit commit?
git bisect start
# status: waiting for both good and bad commits
# good: [1471c517cf7dae1a6342fb821d8ed501af956dd0] powerpc/iommu: bypass
DMA APIs for coherent allocations for pre-mapped memory
git bisect good 1471c517cf7dae1a6342fb821d8ed501af956dd0
# status: waiting for bad commit, 1 good commit known
# bad: [328335a79487ec38d6b0e1aa807785b0f75e594d] powerpc/powernv/iommu:
iommu incorrectly bypass DMA APIs
git bisect bad 328335a79487ec38d6b0e1aa807785b0f75e594d
# bad: [939faf71cf7ca9ab3d1bd2912ac0e203d4d7156a] Merge tag
'drm-next-2026-02-11' of https://gitlab.freedesktop.org/drm/kernel
git bisect bad 939faf71cf7ca9ab3d1bd2912ac0e203d4d7156a
# good: [66bbe4a8ed73f1187a4271c58f0ea30f42debe0d] Merge tag
'irq-core-2026-02-09' of
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect good 66bbe4a8ed73f1187a4271c58f0ea30f42debe0d
# bad: [d061251387903e8502843ac983553f0b2e098ef8] Merge tag
'sound-7.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
git bisect bad d061251387903e8502843ac983553f0b2e098ef8
# good: [f51d34065de4f29fd237276a49cad06ac7356a55] Merge tag
'socfpga_dts_updates_for_v6.20_v3' of
git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux into soc/dt
git bisect good f51d34065de4f29fd237276a49cad06ac7356a55
# bad: [e86dda7bde8801d32ffe7d1570fe173cab14d1ba] Merge tag 'spi-v6.20'
of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
git bisect bad e86dda7bde8801d32ffe7d1570fe173cab14d1ba
# good: [bdbddf72a2ab1cfea699959795d70df3931eefe7] Merge tag
'soc-drivers-7.0' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
git bisect good bdbddf72a2ab1cfea699959795d70df3931eefe7
# good: [8ea39d960c9f890e9213cdcfcbe4b3f281acd12f] spi: add multi-lane
support
git bisect good 8ea39d960c9f890e9213cdcfcbe4b3f281acd12f
# bad: [d5cbd9f332c70be9589201474b9477baf9b5a24d] Merge tag
'regmap-v6.20' of
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap
git bisect bad d5cbd9f332c70be9589201474b9477baf9b5a24d
# good: [8ad8d24d962804d3c54b5b7542c4cb7cd6bacb3b] Merge tag
'parisc-for-7.0-rc1' of
git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
git bisect good 8ad8d24d962804d3c54b5b7542c4cb7cd6bacb3b
# bad: [1d72a02d65a733ad124bacc2db3fb90fa81a612b] docs:
trusted-encryped: add PKWM as a new trust source
git bisect bad 1d72a02d65a733ad124bacc2db3fb90fa81a612b
# bad: [11d45eee9f42f7d3f9c9f190a6f79e570d345fe2] powerpc64/bpf:
Additional NVR handling for bpf_throw
git bisect bad 11d45eee9f42f7d3f9c9f190a6f79e570d345fe2
# bad: [2ed2d8f6fb3853daa536d79e0799cbac91fac9f5] powerpc64/bpf: Support
tailcalls with subprogs
git bisect bad 2ed2d8f6fb3853daa536d79e0799cbac91fac9f5
# bad: [815a8d2feb5615ae7f0b5befd206af0b0160614c] powerpc/eeh: fix
recursive pci_lock_rescan_remove locking in EEH event handling
git bisect bad 815a8d2feb5615ae7f0b5befd206af0b0160614c
Reverting commit 815a8d2feb56 ("powerpc/eeh: fix recursive
pci_lock_rescan_remove locking in EEH event handling")
on top of commit fce2dfa773ced15f27d resolves the issue.
- Sourabh Jain
>
>
> Btw, to clarify I think there are two issues here:
> 1. EEH triggered for the USB adapter - I think you meant that with Hash
> you don't even see EEH error being triggered at all.
>
> 2. Second problem is - EEH recovery causing this WARNING.
>
> [ 17.375534] [ T118] WARNING: arch/powerpc/kernel/eeh_pe.c:439 at eeh_pe_tree_remove+0xf8/0x2f0, CPU#10: eehd/118
> <...>
> [ 17.375599] [ T118] CPU: 10 UID: 0 PID: 118 Comm: eehd Tainted: G E 7.2.0-rc3upstream+ #3 PREEMPT(lazy) f29942c1738362234fefd88de0d1ed711f1a557e
> [ 17.375603] [ T118] Tainted: [E]=UNSIGNED_MODULE
> [ 17.375604] [ T118] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1120.00 (NH1120_135) hv:phyp pSeries
> <...>
> [ 17.375650] [ T118] NIP [c00000000004a048] eeh_pe_tree_remove+0xf8/0x2f0
> [ 17.375654] [ T118] LR [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
> [ 17.375658] [ T118] Call Trace:
> [ 17.375659] [ T118] [c00000000a357c90] [c00000000dd32800] 0xc00000000dd32800 (unreliable)
> [ 17.375668] [ T118] [c00000000a357d30] [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
> [ 17.375672] [ T118] [c00000000a357d60] [c0000000000496ec] eeh_pe_traverse+0x6c/0xf0
> [ 17.375676] [ T118] [c00000000a357da0] [c00000000004e100] eeh_reset_device+0x1f8/0x298
> [ 17.375680] [ T118] [c00000000a357e50] [c00000000004ce5c] eeh_handle_normal_event+0x61c/0xa60
> [ 17.375685] [ T118] [c00000000a357f30] [c00000000004e298] eeh_event_handler+0xf8/0x190
> [ 17.375689] [ T118] [c00000000a357f90] [c00000000025dab4] kthread+0x194/0x1b0
>
>
> -ritesh
>
[-- Attachment #2: no-disable-radix.txt --]
[-- Type: text/plain, Size: 112062 bytes --]
[ 0.000000] [ T0] crashkernel reserved: 0x0000000020000000 - 0x000000022cd00000 (8397 MB)
[ 0.000000] [ T0] radix-mmu: Page sizes from device-tree:
[ 0.000000] [ T0] radix-mmu: Page size shift = 12 AP=0x0
[ 0.000000] [ T0] radix-mmu: Page size shift = 16 AP=0x5
[ 0.000000] [ T0] radix-mmu: Page size shift = 21 AP=0x1
[ 0.000000] [ T0] radix-mmu: Page size shift = 30 AP=0x2
[ 0.000000] [ T0] Activating Kernel Userspace Access Prevention
[ 0.000000] [ T0] Activating Kernel Userspace Execution Prevention
[ 0.000000] [ T0] radix-mmu: Mapped 0x0000000000000000-0x0000000002800000 with 2.00 MiB pages (exec)
[ 0.000000] [ T0] radix-mmu: Mapped 0x0000000002800000-0x0000000040000000 with 2.00 MiB pages
[ 0.000000] [ T0] radix-mmu: Mapped 0x0000000040000000-0x0000001900000000 with 1.00 GiB pages
[ 0.000000] [ T0] radix-mmu: Mapped 0x000000c800000000-0x000000d800000000 with 1.00 GiB pages
[ 0.000000] [ T0] lpar: Using radix MMU under hypervisor
[ 0.000000] [ T0] Linux version 7.2.0-rc3+ (root@ltcden10-lp2.ltc.tadn.ibm.com) (gcc (SUSE Linux) 15.2.0, GNU ld (GNU Binutils; SUSE Linux 16) 2.45.0.20251103-1600992) #7 SMP PREEMPT_DYNAMIC Fri Jul 17 11:05:38 IST 2026
[ 0.000000] [ T0] OF: reserved mem: Reserved memory: No reserved-memory node in the DT
[ 0.000000] [ T0] Found initrd at 0xc000000010f00000:0xc00000001246962b
[ 0.000000] [ T0] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1120.00 (NH1120_135) hv:phyp pSeries
[ 0.000000] [ T0] printk: legacy bootconsole [udbg0] enabled
[ 0.000000] [ T0] Partition configured for 16 cpus.
[ 0.000000] [ T0] CPU maps initialized for 8 threads per core
[ 0.000000] [ T0] (thread shift is 3)
[ 0.000000] [ T0] Allocated 3072 bytes for 16 pacas
[ 0.000000] [ T0] numa: Partition configured for 32 NUMA nodes.
[ 0.000000] [ T0] -----------------------------------------------------
[ 0.000000] [ T0] phys_mem_size = 0x2900000000
[ 0.000000] [ T0] dcache_bsize = 0x80
[ 0.000000] [ T0] icache_bsize = 0x80
[ 0.000000] [ T0] cpu_features = 0x003c00eb8f5f9187
[ 0.000000] [ T0] possible = 0x003ffbebcf5fb187
[ 0.000000] [ T0] always = 0x0000000380008181
[ 0.000000] [ T0] cpu_user_features = 0xdc0065c2 0xaef60000
[ 0.000000] [ T0] mmu_features = 0xbc007641
[ 0.000000] [ T0] possible = 0x00000000fe00fe41
[ 0.000000] [ T0] always = 0x0000000000000000
[ 0.000000] [ T0] firmware_features = 0x00001dbfc45bfc57
[ 0.000000] [ T0] vmalloc start = 0xc008000000000000
[ 0.000000] [ T0] IO start = 0xc00a000000000000
[ 0.000000] [ T0] vmemmap start = 0xc00c000000000000
[ 0.000000] [ T0] -----------------------------------------------------
[ 0.000000] [ T0] NODE_DATA(0) allocated [mem 0xd7ffff7200-0xd7ffffefff]
[ 0.000000] [ T0] NODE_DATA(1) allocated [mem 0x18ffec0200-0x18ffec7fff]
[ 0.000000] [ T0] NODE_DATA(2) allocated [mem 0xd3ffff8200-0xd3ffffffff]
[ 0.000000] [ T0] NODE_DATA(3) allocated [mem 0xd7fffb1900-0xd7fffb96ff]
[ 0.000000] [ T0] NODE_DATA(3) on node 0
[ 0.000000] [ T0] rfi-flush: fallback displacement flush available
[ 0.000000] [ T0] rfi-flush: patched 10 locations (no flush)
[ 0.000000] [ T0] count-cache-flush: hardware flush enabled.
[ 0.000000] [ T0] link-stack-flush: software flush enabled.
[ 0.000000] [ T0] entry-flush: patched 61 locations (no flush)
[ 0.000000] [ T0] uaccess-flush: patched 1 locations (no flush)
[ 0.000000] [ T0] stf-barrier: eieio barrier available
[ 0.000000] [ T0] stf-barrier: patched 61 entry locations (no barrier)
[ 0.000000] [ T0] stf-barrier: patched 10 exit locations (no barrier)
[ 0.000000] [ T0] PPC64 nvram contains 15360 bytes
[ 0.000000] [ T0] barrier-nospec: using ORI speculation barrier
[ 0.000000] [ T0] barrier-nospec: patched 162 locations
[ 0.000000] [ T0] Top of RAM: 0xd800000000, Total RAM: 0x2900000000
[ 0.000000] [ T0] Memory hole size: 716800MB
[ 0.000000] [ T0] Zone ranges:
[ 0.000000] [ T0] Normal [mem 0x0000000000000000-0x000000d7ffffffff]
[ 0.000000] [ T0] Device empty
[ 0.000000] [ T0] Movable zone start for each node
[ 0.000000] [ T0] Early memory node ranges
[ 0.000000] [ T0] node 1: [mem 0x0000000000000000-0x00000018ffffffff]
[ 0.000000] [ T0] node 2: [mem 0x000000c800000000-0x000000cbffffffff]
[ 0.000000] [ T0] node 0: [mem 0x000000cc00000000-0x000000cfffffffff]
[ 0.000000] [ T0] node 2: [mem 0x000000d000000000-0x000000d3ffffffff]
[ 0.000000] [ T0] node 0: [mem 0x000000d400000000-0x000000d7ffffffff]
[ 0.000000] [ T0] Initmem setup node 0 [mem 0x000000cc00000000-0x000000d7ffffffff]
[ 0.000000] [ T0] Initmem setup node 1 [mem 0x0000000000000000-0x00000018ffffffff]
[ 0.000000] [ T0] Initmem setup node 2 [mem 0x000000c800000000-0x000000d3ffffffff]
[ 0.000000] [ T0] Initmem setup node 3 as memoryless
[ 0.000000] [ T0] Initmem setup node 4 as memoryless
[ 0.000000] [ T0] Initmem setup node 5 as memoryless
[ 0.000000] [ T0] Initmem setup node 6 as memoryless
[ 0.000000] [ T0] Initmem setup node 7 as memoryless
[ 0.000000] [ T0] Initmem setup node 8 as memoryless
[ 0.000000] [ T0] Initmem setup node 9 as memoryless
[ 0.000000] [ T0] Initmem setup node 10 as memoryless
[ 0.000000] [ T0] Initmem setup node 11 as memoryless
[ 0.000000] [ T0] Initmem setup node 12 as memoryless
[ 0.000000] [ T0] Initmem setup node 13 as memoryless
[ 0.000000] [ T0] Initmem setup node 14 as memoryless
[ 0.000000] [ T0] Initmem setup node 15 as memoryless
[ 0.000000] [ T0] Initmem setup node 16 as memoryless
[ 0.000000] [ T0] Initmem setup node 17 as memoryless
[ 0.000000] [ T0] Initmem setup node 18 as memoryless
[ 0.000000] [ T0] Initmem setup node 19 as memoryless
[ 0.000000] [ T0] Initmem setup node 20 as memoryless
[ 0.000000] [ T0] Initmem setup node 21 as memoryless
[ 0.000000] [ T0] Initmem setup node 22 as memoryless
[ 0.000000] [ T0] Initmem setup node 23 as memoryless
[ 0.000000] [ T0] Initmem setup node 24 as memoryless
[ 0.000000] [ T0] Initmem setup node 25 as memoryless
[ 0.000000] [ T0] Initmem setup node 26 as memoryless
[ 0.000000] [ T0] Initmem setup node 27 as memoryless
[ 0.000000] [ T0] Initmem setup node 28 as memoryless
[ 0.000000] [ T0] Initmem setup node 29 as memoryless
[ 0.000000] [ T0] Initmem setup node 30 as memoryless
[ 0.000000] [ T0] Initmem setup node 31 as memoryless
[ 0.000000] [ T0] percpu: Embedded 4 pages/cpu s126744 r0 d135400 u262144
[ 0.000000] [ T0] pcpu-alloc: s126744 r0 d135400 u262144 alloc=4*65536
[ 0.000000] [ T0] pcpu-alloc: [0] 00 [0] 01 [0] 02 [0] 03 [0] 04 [0] 05 [0] 06 [0] 07
[ 0.000000] [ T0] pcpu-alloc: [0] 08 [0] 09 [0] 10 [0] 11 [0] 12 [0] 13 [0] 14 [0] 15
[ 0.000000] [ T0] Kernel command line: BOOT_IMAGE=/boot/vmlinux-7.2.0-rc3+ root=UUID=89c9257f-1cb4-46d9-bbae-ec812ea746e3 mitigations=auto quiet security=selinux crashkernel=8397M
[ 0.000000] [ T0] random: crng init done
[ 0.000000] [ T0] printk: log_buf_len individual max cpu contribution: 32768 bytes
[ 0.000000] [ T0] printk: log_buf_len total cpu_extra contributions: 491520 bytes
[ 0.000000] [ T0] printk: log_buf_len min size: 524288 bytes
[ 0.000000] [ T0] printk: log buffer data + meta data: 1048576 + 3670016 = 4718592 bytes
[ 0.000000] [ T0] printk: early log buf free: 518040(98%)
[ 0.000000] [ T0] Fallback order for Node 0: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 1: 1 2 0
[ 0.000000] [ T0] Fallback order for Node 2: 2 0 1
[ 0.000000] [ T0] Fallback order for Node 3: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 4: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 5: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 6: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 7: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 8: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 9: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 10: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 11: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 12: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 13: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 14: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 15: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 16: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 17: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 18: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 19: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 20: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 21: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 22: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 23: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 24: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 25: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 26: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 27: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 28: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 29: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 30: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 31: 0 2 1
[ 0.000000] [ T0] Built 4 zonelists, mobility grouping on. Total pages: 2686976
[ 0.000000] [ T0] Policy zone: Normal
[ 0.000000] [ T0] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] [ T0] SLUB: HWalign=128, Order=0-3, MinObjects=0, CPUs=16, Nodes=32
[ 0.000000] [ T0] ftrace: allocating 43701 entries in 17 pages
[ 0.000000] [ T0] ftrace: allocated 17 pages with 2 groups
[ 0.000000] [ T0] Dynamic Preempt: lazy
[ 0.000000] [ T0] rcu: Preemptible hierarchical RCU implementation.
[ 0.000000] [ T0] rcu: RCU event tracing is enabled.
[ 0.000000] [ T0] rcu: RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=16.
[ 0.000000] [ T0] Trampoline variant of Tasks RCU enabled.
[ 0.000000] [ T0] Rude variant of Tasks RCU enabled.
[ 0.000000] [ T0] Tracing variant of Tasks RCU enabled.
[ 0.000000] [ T0] rcu: RCU calculated value of scheduler-enlistment delay is 100 jiffies.
[ 0.000000] [ T0] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=16
[ 0.000000] [ T0] RCU Tasks: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=16.
[ 0.000000] [ T0] RCU Tasks Rude: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=16.
[ 0.000000] [ T0] NR_IRQS: 512, nr_irqs: 512, preallocated irqs: 16
[ 0.000000] [ T0] xive: Using IRQ range [400000-40000f]
[ 0.000000] [ T0] xive: Interrupt handling initialized with spapr backend
[ 0.000000] [ T0] xive: Using priority 7 for all interrupts
[ 0.000000] [ T0] xive: Using 64kB queues
[ 0.000000] [ T0] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.000000] [ T0] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275000 ns
[ 0.000000] [ T0] time_init: decrementer frequency = 512.000000 MHz
[ 0.000000] [ T0] time_init: processor frequency = 3650.000000 MHz
[ 0.000001] [ T0] time_init: 56 bit decrementer (max: 7fffffffffffff)
[ 0.000003] [ T0] clocksource: timebase: mask: 0xffffffffffffffff max_cycles: 0x761537d007, max_idle_ns: 440795202126 ns
[ 0.000005] [ T0] clocksource: timebase mult[1f40000] shift[24] registered
[ 0.000010] [ T0] clockevent: decrementer mult[83126f] shift[24] cpu[0]
[ 0.000182] [ T0] Console: colour dummy device 80x25
[ 0.000187] [ T0] printk: legacy console [hvc0] enabled
[ 0.000189] [ T0] printk: legacy bootconsole [udbg0] disabled
[ 0.000267] [ T0] mempolicy: Enabling automatic NUMA balancing. Configure with numa_balancing= or the kernel.numa_balancing sysctl
[ 0.000278] [ T0] pid_max: default: 32768 minimum: 301
[ 0.000835] [ T0] landlock: Up and running.
[ 0.000836] [ T0] Yama: becoming mindful.
[ 0.000849] [ T0] SELinux: Initializing.
[ 0.001643] [ T0] LSM support for eBPF active
[ 0.013898] [ T0] Dentry cache hash table entries: 16777216 (order: 11, 134217728 bytes, vmalloc hugepage)
[ 0.019659] [ T0] Inode-cache hash table entries: 8388608 (order: 10, 67108864 bytes, vmalloc hugepage)
[ 0.019868] [ T0] Mount-cache hash table entries: 262144 (order: 5, 2097152 bytes, vmalloc hugepage)
[ 0.020009] [ T0] Mountpoint-cache hash table entries: 262144 (order: 5, 2097152 bytes, vmalloc hugepage)
[ 0.020295] [ T0] VFS: Finished mounting rootfs on nullfs
[ 0.021826] [ T1] Power11 performance monitor hardware support registered
[ 0.021876] [ T1] rcu: Hierarchical SRCU implementation.
[ 0.021878] [ T1] rcu: Max phase no-delay instances is 400.
[ 0.021917] [ T1] Timer migration: 2 hierarchy levels; 8 children per group; 0 crossnode level
[ 0.022421] [ T1] smp: Bringing up secondary CPUs ...
[ 0.026866] [ T1] smp: Brought up 4 nodes, 16 CPUs
[ 0.026876] [ T1] numa: Node 0 CPUs:
[ 0.026879] [ T1] numa: Node 1 CPUs: 0-15
[ 0.026882] [ T1] numa: Node 2 CPUs:
[ 0.026884] [ T1] numa: Node 3 CPUs:
[ 0.026885] [ T1] Big cores detected but using small core scheduling
[ 0.034833] [ T103] node 2 deferred pages initialised in 7ms
[ 0.035154] [ T101] node 0 deferred pages initialised in 7ms
[ 0.037065] [ T102] node 1 deferred pages initialised in 9ms
[ 0.037091] [ T1] Memory: 162857216K/171966464K available (19456K kernel code, 4224K rwdata, 13312K rodata, 7616K init, 2129K bss, 8865216K reserved, 0K cma-reserved)
[ 0.041125] [ T1] devtmpfs: initialized
[ 0.043302] [ T1] PCI host bridge /pci@800000020000014 ranges:
[ 0.043311] [ T1] MEM 0x0000040000000000..0x000004007effffff -> 0x0000000080000000
[ 0.043314] [ T1] MEM 0x0000044000000000..0x0000047fffffffff -> 0x0006320000000000
[ 0.043505] [ T1] posixtimers hash table entries: 8192 (order: 1, 131072 bytes, vmalloc)
[ 0.043601] [ T1] futex hash table entries: 128 (16384 bytes on 32 NUMA nodes, total 512 KiB, linear).
[ 0.051414] [ T1] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[ 0.051783] [ T1] audit: initializing netlink subsys (disabled)
[ 0.051865] [ T120] audit: type=2000 audit(1784266833.051:1): state=initialized audit_enabled=0 res=1
[ 0.060886] [ T1] thermal_sys: Registered thermal governor 'fair_share'
[ 0.060889] [ T1] thermal_sys: Registered thermal governor 'bang_bang'
[ 0.060890] [ T1] thermal_sys: Registered thermal governor 'step_wise'
[ 0.060891] [ T1] thermal_sys: Registered thermal governor 'user_space'
[ 0.060929] [ T1] cpuidle: using governor ladder
[ 0.060975] [ T1] cpuidle: using governor menu
[ 0.061060] [ T1] RTAS daemon started
[ 0.061247] [ T1] pstore: Using crash dump compression: deflate
[ 0.061249] [ T1] pstore: Registered nvram as persistent store backend
[ 0.062041] [ T1] EEH: pSeries platform initialized
[ 0.062186] [ T1] plpks: POWER LPAR Platform KeyStore is not supported or enabled
[ 0.064034] [ T1] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[ 0.065434] [ T1] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[ 0.065437] [ T1] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
[ 0.065440] [ T1] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
[ 0.065442] [ T1] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
[ 0.067225] [ T1] iommu: Default domain type: Translated
[ 0.067227] [ T1] iommu: DMA domain TLB invalidation policy: strict mode
[ 0.067836] [ T1] pps_core: LinuxPPS API ver. 1 registered
[ 0.067838] [ T1] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 0.067842] [ T1] PTP clock support registered
[ 0.067856] [ T1] EDAC MC: Ver: 3.0.0
[ 0.068274] [ T1] NetLabel: Initializing
[ 0.068276] [ T1] NetLabel: domain hash size = 128
[ 0.068278] [ T1] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
[ 0.068298] [ T1] NetLabel: unlabeled traffic allowed by default
[ 0.068304] [ T1] mctp: management component transport protocol core
[ 0.068306] [ T1] NET: Registered PF_MCTP protocol family
[ 0.068334] [ T1] PCI: Probing PCI hardware
[ 0.068464] [ T1] PCI host bridge to bus 0014:01
[ 0.068474] [ T1] pci_bus 0014:01: root bus resource [mem 0x40000000000-0x4007effffff] (bus address [0x80000000-0xfeffffff])
[ 0.068479] [ T1] pci_bus 0014:01: root bus resource [mem 0x44000000000-0x47fffffffff 64bit] (bus address [0x6320000000000-0x6323fffffffff])
[ 0.068483] [ T1] pci_bus 0014:01: root bus resource [bus 01-ff]
[ 0.069363] [ T1] pci 0014:01:00.0: No hypervisor support for SR-IOV on this device, IOV BARs disabled.
[ 0.071528] [ T1] pci 0014:01:00.0: supports D1 D2
[ 0.071531] [ T1] pci 0014:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 0.102364] [ T1] IOMMU table initialized, virtual merging enabled
[ 0.102510] [ T1] pci_bus 0014:01: resource 4 [mem 0x40000000000-0x4007effffff]
[ 0.102514] [ T1] pci_bus 0014:01: resource 5 [mem 0x44000000000-0x47fffffffff 64bit]
[ 0.102592] [ T1] pci 0014:01:00.0: ibm,query-pe-dma-windows(53) 10000 8000000 20000014 returned 0, lb=1000000 ps=103 wn=1
[ 0.102606] [ T1] pci 0014:01:00.0: Adding to iommu group 0
[ 0.115694] [ T1] EEH: Capable adapter found: recovery enabled.
[ 0.115696] [ T1] PCI: Probing PCI hardware done
[ 0.115776] [ T1] vgaarb: loaded
[ 0.115940] [ T1] clocksource: Switched to clocksource timebase
[ 0.116484] [ T1] VFS: Disk quotas dquot_6.6.0
[ 0.116516] [ T1] VFS: Dquot-cache hash table entries: 8192 (65536 bytes)
[ 0.118586] [ T1] NET: Registered PF_INET protocol family
[ 0.118758] [ T1] IP idents hash table entries: 262144 (order: 5, 2097152 bytes, vmalloc hugepage)
[ 0.122165] [ T1] tcp_listen_portaddr_hash hash table entries: 65536 (order: 4, 1048576 bytes, vmalloc)
[ 0.122313] [ T1] Table-perturb hash table entries: 65536 (order: 2, 262144 bytes, vmalloc)
[ 0.122332] [ T1] TCP established hash table entries: 524288 (order: 6, 4194304 bytes, vmalloc hugepage)
[ 0.122860] [ T1] TCP bind hash table entries: 65536 (order: 5, 2097152 bytes, vmalloc hugepage)
[ 0.123166] [ T1] TCP: Hash tables configured (established 524288 bind 65536)
[ 0.123419] [ T1] MPTCP token hash table entries: 65536 (order: 5, 1572864 bytes, vmalloc)
[ 0.123533] [ T1] UDP hash table entries: 65536 (order: 6, 4194304 bytes, vmalloc hugepage)
[ 0.124203] [ T1] NET: Registered PF_UNIX/PF_LOCAL protocol family
[ 0.124213] [ T1] NET: Registered PF_XDP protocol family
[ 0.124348] [ T1] pci 0014:01:00.0: enabling device (0144 -> 0146)
[ 0.124710] [ T1] PCI: CLS 128 bytes, default 128
[ 0.124787] [ T96] Unpacking initramfs...
[ 0.125500] [ T1] papr-hvpipe: hvpipe feature is enabled
[ 0.187485] [ T1] vio_register_device_node: node lid missing 'reg'
[ 0.187689] [ T1] vas: GZIP feature is available
[ 0.188481] [ T1] hv-24x7: read 548 catalog entries, created 387 event attrs (0 failures), 387 descs
[ 0.193403] [ T1] Initialise system trusted keyrings
[ 0.193440] [ T1] Key type blacklist registered
[ 0.193582] [ T1] workingset: timestamp_bits=38 (anon: 33) max_order=22 bucket_order=0 (anon: 0)
[ 0.194077] [ T1] integrity: Platform Keyring initialized
[ 0.194081] [ T1] integrity: Machine keyring initialized
[ 0.194082] [ T1] Allocating IMA blacklist keyring.
[ 0.204258] [ T1] Key type asymmetric registered
[ 0.204260] [ T1] Asymmetric key parser 'x509' registered
[ 0.204282] [ T1] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[ 0.204401] [ T1] io scheduler mq-deadline registered
[ 0.204403] [ T1] io scheduler kyber registered
[ 0.204427] [ T1] io scheduler bfq registered
[ 0.207114] [ T1] ledtrig-cpu: registered to indicate activity on CPUs
[ 0.207153] [ T1] rpaphp: RPA HOT Plug PCI Controller Driver version: 0.1
[ 0.207320] [ T1] rpaphp: Slot [U78D8.ND0.FGD004Y-P0-C4-C0] registered
[ 0.207746] [ T1] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[ 0.208190] [ T1] Non-volatile memory driver v1.3
[ 0.208192] [ T1] pseries_rng: Registering IBM pSeries RNG driver
[ 0.208492] [ C2] tpm_ibmvtpm 30000003: CRQ initialization completed
[ 0.293667] [ T96] Freeing initrd memory: 21888K
[ 1.259328] [ T1] mousedev: PS/2 mouse device common for all mice
[ 1.259443] [ T1] xcede: xcede_record_size = 10
[ 1.259445] [ T1] xcede: Record 0 : hint = 1, latency = 0x1800 tb ticks, Wake-on-irq = 1
[ 1.259447] [ T1] xcede: Record 1 : hint = 2, latency = 0x3c00 tb ticks, Wake-on-irq = 0
[ 1.259448] [ T1] cpuidle: Skipping the 2 Extended CEDE idle states
[ 1.259449] [ T1] cpuidle: Fixed up CEDE exit latency to 12 us
[ 1.259659] [ T1] pseries_idle_driver registered
[ 1.259710] [ T1] nx_compress_pseries ibm,compression-v1: nx842_OF_upd: device disabled
[ 1.259842] [ T1] hid: raw HID events driver (C) Jiri Kosina
[ 1.259901] [ T1] drop_monitor: Initializing network drop monitor service
[ 1.260084] [ T1] NET: Registered PF_INET6 protocol family
[ 1.260534] [ T1] Segment Routing with IPv6
[ 1.260536] [ T1] RPL Segment Routing with IPv6
[ 1.260545] [ T1] In-situ OAM (IOAM) with IPv6
[ 1.260567] [ T1] PFKEY is deprecated and scheduled to be removed in 2027, please contact the netdev mailing list
[ 1.260575] [ T1] NET: Registered PF_KEY protocol family
[ 1.260653] [ T1] secvar-sysfs: Failed to retrieve secvar operations
[ 1.262334] [ T1] registered taskstats version 1
[ 1.262744] [ T1] Loading compiled-in X.509 certificates
[ 1.263481] [ T1] Loaded X.509 cert 'Build time autogenerated kernel key: 1bed38dafb8769e8ad27e7b933b25570d07757a0'
[ 1.269475] [ T1] Demotion targets for Node 0: null
[ 1.269477] [ T1] Demotion targets for Node 1: null
[ 1.269478] [ T1] Demotion targets for Node 2: null
[ 1.269490] [ T1] page_owner is disabled
[ 1.269646] [ T1] Key type .fscrypt registered
[ 1.269647] [ T1] Key type fscrypt-provisioning registered
[ 1.281475] [ T1] Key type encrypted registered
[ 1.281504] [ T1] Secure boot mode disabled
[ 1.281514] [ T1] Loading compiled-in module X.509 certificates
[ 1.282069] [ T1] Loaded X.509 cert 'Build time autogenerated kernel key: 1bed38dafb8769e8ad27e7b933b25570d07757a0'
[ 1.282071] [ T1] ima: Allocated hash algorithm: sha256
[ 1.301481] [ T1] Secure boot mode disabled
[ 1.301498] [ T1] Trusted boot mode disabled
[ 1.301499] [ T1] ima: No architecture policies found
[ 1.301521] [ T1] evm: Initialising EVM extended attributes:
[ 1.301523] [ T1] evm: security.selinux
[ 1.301524] [ T1] evm: security.SMACK64 (disabled)
[ 1.301525] [ T1] evm: security.SMACK64EXEC (disabled)
[ 1.301527] [ T1] evm: security.SMACK64TRANSMUTE (disabled)
[ 1.301528] [ T1] evm: security.SMACK64MMAP (disabled)
[ 1.301529] [ T1] evm: security.apparmor
[ 1.301530] [ T1] evm: security.ima
[ 1.301531] [ T1] evm: security.capability
[ 1.301532] [ T1] evm: HMAC attrs: 0x1
[ 1.301543] [ T1] Running certificate verification RSA selftest
[ 1.302075] [ T1] Loaded X.509 cert 'Certificate verification self-testing key: f58703bb33ce1b73ee02eccdee5b8817518fe3db'
[ 1.302620] [ T1] Running certificate verification ECDSA selftest
[ 1.307272] [ T1] Loaded X.509 cert 'Certificate verification ECDSA self-testing key: 2900bcea1deb7bc8479a84a23d758efdfdd2b2d3'
[ 1.309083] [ T1] SED: plpks not available
[ 1.310483] [ T1] clk: Disabling unused clocks
[ 1.312225] [ T1] Freeing unused kernel image (initmem) memory: 7616K
[ 1.312445] [ T1] Checked W+X mappings: passed, no W+X pages found
[ 1.312458] [ T1] Run /init as init process
[ 1.312459] [ T1] with arguments:
[ 1.312461] [ T1] /init
[ 1.312462] [ T1] with environment:
[ 1.312463] [ T1] HOME=/
[ 1.312464] [ T1] TERM=linux
[ 1.327114] [ T1] systemd[1]: Successfully made /usr/ read-only.
[ 1.327254] [ T1] systemd[1]: systemd 257.13+suse.40.g59336000ef running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +IPE -SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK -BTF -XKBCOMMON -UTMP +SYSVINIT +LIBARCHIVE)
[ 1.327259] [ T1] systemd[1]: Detected virtualization powervm.
[ 1.327263] [ T1] systemd[1]: Detected architecture ppc64-le.
[ 1.327266] [ T1] systemd[1]: Running in initrd.
[ 1.327395] [ T1] systemd[1]: No hostname configured, using default hostname.
[ 1.327448] [ T1] systemd[1]: Hostname set to <localhost>.
[ 1.371879] [ T1] systemd[1]: /usr/lib/systemd/system/plymouth-start.service:15: Unit uses KillMode=none. This is unsafe, as it disables systemd's process lifecycle management for the service. Please update the service to use a safer KillMode=, such as 'mixed' or 'control-group'. Support for KillMode=none is deprecated and will eventually be removed.
[ 1.372112] [ T1] systemd[1]: /usr/lib/systemd/system/systemd-ask-password-plymouth.service:10: ConditionPathExists= path is not absolute, ignoring: ${localstatedir}/run/plymouth/pid
[ 1.376032] [ T1] systemd[1]: Queued start job for default target Initrd Default Target.
[ 1.382226] [ T1] systemd[1]: Expecting device /dev/disk/by-uuid/89c9257f-1cb4-46d9-bbae-ec812ea746e3...
[ 1.382273] [ T1] systemd[1]: Reached target Initrd /usr File System.
[ 1.382297] [ T1] systemd[1]: Reached target Slice Units.
[ 1.382315] [ T1] systemd[1]: Reached target Swaps.
[ 1.382329] [ T1] systemd[1]: Reached target Timer Units.
[ 1.382410] [ T1] systemd[1]: Listening on Journal Socket (/dev/log).
[ 1.382478] [ T1] systemd[1]: Listening on Journal Sockets.
[ 1.382541] [ T1] systemd[1]: Listening on udev Control Socket.
[ 1.382582] [ T1] systemd[1]: Listening on udev Kernel Socket.
[ 1.382597] [ T1] systemd[1]: Reached target Socket Units.
[ 1.383531] [ T1] systemd[1]: Starting Create List of Static Device Nodes...
[ 1.385231] [ T1] systemd[1]: Starting Journal Service...
[ 1.385356] [ T1] systemd[1]: Load Kernel Modules skipped, no trigger condition checks were met.
[ 1.385853] [ T1] systemd[1]: Starting Apply Kernel Variables...
[ 1.386404] [ T1] systemd[1]: Starting Virtual Console Setup...
[ 1.387557] [ T1] systemd[1]: Finished Create List of Static Device Nodes.
[ 1.388462] [ T1] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
[ 1.392663] [ T1] systemd[1]: Finished Apply Kernel Variables.
[ 1.394844] [ T1] systemd[1]: Finished Create Static Device Nodes in /dev gracefully.
[ 1.395597] [ T1] systemd[1]: Starting Create Static Device Nodes in /dev...
[ 1.401686] [ T1] systemd[1]: Finished Create Static Device Nodes in /dev.
[ 1.401796] [ T1] systemd[1]: Reached target Preparation for Local File Systems.
[ 1.401813] [ T1] systemd[1]: Reached target Local File Systems.
[ 1.408718] [ T219] systemd-journald[219]: Collecting audit messages is disabled.
[ 1.415349] [ T1] systemd[1]: Started Journal Service.
[ 1.498211] [ T344] raid6_pq: module verification failed: signature and/or required key missing - tainting kernel
[ 1.499319] [ T344] raid6: using intx1 recovery algorithm
[ 1.515996] [ T344] raid6: int64x1 gen() 5343 MB/s
[ 1.533015] [ T344] raid6: int64x2 gen() 6070 MB/s
[ 1.549994] [ T344] raid6: int64x4 gen() 7476 MB/s
[ 1.566980] [ T344] raid6: int64x8 gen() 7945 MB/s
[ 1.583963] [ T344] raid6: altivecx1 gen() 13359 MB/s
[ 1.600961] [ T344] raid6: altivecx2 gen() 17203 MB/s
[ 1.617962] [ T344] raid6: altivecx4 gen() 20085 MB/s
[ 1.634962] [ T344] raid6: altivecx8 gen() 14507 MB/s
[ 1.651963] [ T344] raid6: vpermxor1 gen() 19406 MB/s
[ 1.668954] [ T344] raid6: vpermxor2 gen() 23085 MB/s
[ 1.685962] [ T344] raid6: vpermxor4 gen() 26507 MB/s
[ 1.702943] [ T344] raid6: vpermxor8 gen() 33703 MB/s
[ 1.702946] [ T344] raid6: using algorithm vpermxor8 gen() 33703 MB/s
[ 1.704000] [ T344] xor: measuring software checksum speed
[ 1.704108] [ T344] altivec : 30813 MB/sec
[ 1.704291] [ T344] 32regs_prefetch : 18170 MB/sec
[ 1.704451] [ T344] 32regs : 20616 MB/sec
[ 1.704633] [ T344] 8regs_prefetch : 18170 MB/sec
[ 1.704793] [ T344] 8regs : 20672 MB/sec
[ 1.704795] [ T344] xor: using function: altivec (30813 MB/sec)
[ 1.983515] [ T344] Btrfs loaded, assert=on, zoned=yes, fsverity=yes
[ 2.144357] [ T362] SCSI subsystem initialized
[ 2.144357] [ T366] papr_scm ibm,persistent-memory:ibm,pmemory@44104001: Permission denied while accessing performance stats
[ 2.144628] [ T366] papr_scm ibm,persistent-memory:ibm,pmemory@44104001: nvdimm pmu didn't register rc=-2
[ 2.152682] [ T369] usbcore: registered new interface driver usbfs
[ 2.152697] [ T369] usbcore: registered new interface driver hub
[ 2.152734] [ T369] usbcore: registered new device driver usb
[ 2.158893] [ T362] alua: device handler registered
[ 2.160595] [ T362] rdac: device handler registered
[ 2.161671] [ T362] emc: device handler registered
[ 2.180346] [ T362] ibmvscsi 30000066: SRP_VERSION: 16.a
[ 2.180521] [ T362] ibmvscsi 30000066: Maximum ID: 64 Maximum LUN: 32 Maximum Channel: 3
[ 2.180525] [ T362] scsi host0: IBM POWER Virtual SCSI Adapter 1.5.9
[ 2.180761] [ C8] ibmvscsi 30000066: partner initialization complete
[ 2.180787] [ C8] ibmvscsi 30000066: host srp version: 16.a, host partition ltcden10-vios1 (100), OS 3, max io 262144
[ 2.180830] [ C8] ibmvscsi 30000066: Client reserve enabled
[ 2.180834] [ C8] ibmvscsi 30000066: sent SRP login
[ 2.180858] [ C8] ibmvscsi 30000066: SRP_LOGIN succeeded
[ 2.183407] [ T369] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 2.183422] [ T369] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 1
[ 2.183584] [ T369] xhci_hcd 0014:01:00.0: ibm,query-pe-dma-windows(53) 10000 8000000 20000014 returned 0, lb=1000000 ps=103 wn=1
[ 2.183588] [ T369] xhci_hcd 0014:01:00.0: Skipping ibm,pmemory
[ 2.191270] [ T107] scsi 0:0:1:0: Direct-Access AIX VDASD 0001 PQ: 0 ANSI: 3
[ 2.195131] [ T369] xhci_hcd 0014:01:00.0: ibm,create-pe-dma-window(54) 10000 8000000 20000014 15 28 returned 0 (liobn = 0x70000014 starting addr = 8000000 0)
[ 2.198687] [ T369] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 2.198690] [ T369] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 2.198700] [ T369] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 2.198702] [ T369] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 2.198888] [ T369] xhci_hcd 0014:01:00.0: hcc params 0x0270f06d hci version 0x96 quirks 0x0000000004000000
[ 2.200982] [ T369] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 2.200987] [ T369] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 2
[ 2.200992] [ T369] xhci_hcd 0014:01:00.0: Host supports USB 3.0 SuperSpeed
[ 2.201102] [ T369] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
[ 2.201106] [ T369] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 2.201108] [ T369] usb usb1: Product: xHCI Host Controller
[ 2.201109] [ T369] usb usb1: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 2.201111] [ T369] usb usb1: SerialNumber: 0014:01:00.0
[ 2.201266] [ T369] hub 1-0:1.0: USB hub found
[ 2.201411] [ T369] hub 1-0:1.0: 4 ports detected
[ 2.201499] [ T369] xhci_hcd 0014:01:00.0: xHCI host controller not responding, assume dead
[ 2.201518] [ T369] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 2.201596] [ T121] EEH: Recovering PHB#14-PE#10000
[ 2.201606] [ T121] EEH: PE location: N/A, PHB location: N/A
[ 2.201614] [ T121] EEH: Frozen PHB#14-PE#10000 detected
[ 2.201620] [ T121] EEH: Call Trace:
[ 2.201627] [ T369] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 2.201625] [ T121] EEH: [000000001f1698b1] __eeh_send_failure_event+0xa8/0x190
[ 2.201640] [ T369] xhci_hcd 0014:01:00.0: USB bus 2 deregistered
[ 2.201640] [ T121] EEH: [000000008a51cc61] eeh_dev_check_failure+0x408/0x7a0
[ 2.201646] [ T369] xhci_hcd 0014:01:00.0: remove, state 1
[ 2.201652] [ T369] usb usb1: USB disconnect, device number 1
[ 2.201650] [ T121] EEH: [000000006ec66e06] xhci_portsc_readl+0x64/0x90 [xhci_hcd]
[ 2.201675] [ T121] EEH: [0000000088769cf2] xhci_hub_control+0xe28/0x27f0 [xhci_hcd]
[ 2.201701] [ T121] EEH: [00000000fbba7f7a] usb_hcd_submit_urb+0x508/0xd30 [usbcore]
[ 2.201729] [ T121] EEH: [000000003c3af5d9] usb_submit_urb+0x254/0x840 [usbcore]
[ 2.201752] [ T121] EEH: [00000000636aad98] usb_start_wait_urb+0x88/0x270 [usbcore]
[ 2.201777] [ T121] EEH: [00000000c4b1d0b5] usb_control_msg+0x134/0x1f0 [usbcore]
[ 2.201798] [ T121] EEH: [0000000003f2146d] hub_probe+0x570/0x12b8 [usbcore]
[ 2.201821] [ T121] EEH: [00000000f479c03a] usb_probe_interface+0x124/0x490 [usbcore]
[ 2.201845] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 2.201854] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 2.201862] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 2.201870] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 2.201885] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 2.201897] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 2.201908] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 2.201918] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 2.201928] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 2.201948] [ T121] EEH: [0000000041b13797] usb_set_configuration+0x78c/0xb60 [usbcore]
[ 2.201982] [ T121] EEH: [00000000129fbbb0] usb_generic_driver_probe+0x78/0xd0 [usbcore]
[ 2.202018] [ T121] EEH: [000000006e13a13a] usb_probe_device+0x60/0x200 [usbcore]
[ 2.202064] [ T107] sd 0:0:1:0: Attached scsi generic sg0 type 0
[ 2.202065] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 2.202076] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 2.202090] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 2.202100] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 2.202110] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 2.202122] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 2.202131] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 2.202141] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 2.202150] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 2.202166] [ T121] EEH: [00000000128463eb] usb_new_device+0x2f4/0x890 [usbcore]
[ 2.202206] [ T121] EEH: [0000000042394a64] register_root_hub+0x1e4/0x2a0 [usbcore]
[ 2.202239] [ T121] EEH: [00000000a33afbd1] usb_add_hcd+0x82c/0x8f0 [usbcore]
[ 2.202261] [ T121] EEH: [000000008fafad0e] xhci_pci_common_probe+0x1e4/0x3d0 [xhci_pci]
[ 2.202273] [ T121] EEH: [0000000081280f6e] local_pci_probe+0x64/0x100
[ 2.202281] [ T121] EEH: [00000000e1b257ca] pci_device_probe+0x330/0x370
[ 2.202289] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 2.202296] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 2.202303] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 2.202313] [ T121] EEH: [0000000063fc58c8] __driver_attach+0x12c/0x2d0
[ 2.202321] [ T121] EEH: [000000000b84ceaa] bus_for_each_dev+0xa4/0x130
[ 2.202333] [ T121] EEH: [00000000ea031aa0] driver_attach+0x30/0x50
[ 2.202345] [ T121] EEH: [00000000e52b2823] bus_add_driver+0x1c0/0x380
[ 2.202358] [ T121] EEH: [00000000c6a75ae6] driver_register+0x9c/0x1b0
[ 2.202368] [ T121] EEH: [00000000e0d28c21] __pci_register_driver+0x64/0x80
[ 2.202379] [ T121] EEH: [000000006d96456b] xhci_pci_init+0x90/0xb0 [xhci_pci]
[ 2.202393] [ T121] EEH: [00000000dae68d81] do_one_initcall+0x5c/0x40c
[ 2.202395] [ T110] sd 0:0:1:0: [sda] 26214400 4096-byte logical blocks: (107 GB/100 GiB)
[ 2.202398] [ T121] EEH: [000000007a7e28b5] do_init_module+0xac/0x3c0
[ 2.202409] [ T121] EEH: [00000000f0cf4484] init_module_from_file+0x120/0x1b0
[ 2.202426] [ T121] EEH: [000000008b9a90d5] sys_finit_module+0x1b4/0x4d0
[ 2.202439] [ T110] sd 0:0:1:0: [sda] Write Protect is off
[ 2.202438] [ T121] EEH: [00000000287f1132] system_call_exception+0x184/0x430
[ 2.202442] [ T110] sd 0:0:1:0: [sda] Mode Sense: 17 00 00 08
[ 2.202449] [ T121] EEH: [0000000065a14c5b] system_call_vectored_common+0x15c/0x2ec
[ 2.202462] [ T121] EEH: This PCI device has failed 1 times in the last hour and will be permanently disabled after 5 failures.
[ 2.202471] [ T121] EEH: Notify device drivers to shutdown
[ 2.202473] [ T121] EEH: Beginning: 'error_detected(IO frozen)'
[ 2.202483] [ T110] sd 0:0:1:0: [sda] Cache data unavailable
[ 2.202486] [ T110] sd 0:0:1:0: [sda] Assuming drive cache: write through
[ 2.202867] [ T369] xhci_hcd 0014:01:00.0: USB bus 1 deregistered
[ 2.202943] [ T369] xhci_hcd 0014:01:00.0: probe with driver xhci_hcd failed with error -108
[ 2.214234] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 2.214237] [ T121] EEH: Finished:'error_detected(IO frozen)' with aggregate recovery state:'none'
[ 2.214290] [ T121] EEH: Collect temporary log
[ 2.214800] [ T121] EEH: of node=0014:01:00.0
[ 2.214831] [ T121] EEH: PCI device/vendor: 8241104c
[ 2.214862] [ T121] EEH: PCI cmd/status register: 00100142
[ 2.214864] [ T121] EEH: PCI-E capabilities and status follow:
[ 2.215024] [ T121] EEH: PCI-E 00: 0002c010 000086c3 0010505e 00073c12
[ 2.215141] [ T121] EEH: PCI-E 10: 10120000 00000000 00000000 00000000
[ 2.215143] [ T121] EEH: PCI-E 20: 00000000
[ 2.215144] [ T121] EEH: PCI-E AER capability register set follows:
[ 2.215289] [ T121] EEH: PCI-E AER 00: 15020001 00000000 00000000 00462030
[ 2.215405] [ T121] EEH: PCI-E AER 10: 00000000 00002000 000001e0 00000000
[ 2.215520] [ T121] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000
[ 2.215550] [ T121] EEH: PCI-E AER 30: 00000000 00000000
[ 2.216788] [ T121] RTAS: event: 1, Type: Platform Error (224), Severity: 2
[ 2.216794] [ T121] EEH: Reset with hotplug activity
[ 2.224926] [ T110] sda: sda1 sda2 sda3
[ 2.225083] [ T110] sd 0:0:1:0: [sda] Attached SCSI disk
[ 2.402470] [ T429] BTRFS: device fsid 89c9257f-1cb4-46d9-bbae-ec812ea746e3 devid 1 transid 347013 /dev/sda2 (8:2) scanned by mount (429)
[ 2.403238] [ T429] BTRFS info (device sda2): first mount of filesystem 89c9257f-1cb4-46d9-bbae-ec812ea746e3
[ 2.403242] [ T429] BTRFS info (device sda2): using crc32c checksum algorithm
[ 2.411331] [ T429] BTRFS info (device sda2): enabling ssd optimizations
[ 2.411334] [ T429] BTRFS info (device sda2): enabling free space tree
[ 2.679751] [ T219] systemd-journald[219]: Received SIGTERM from PID 1 (systemd).
[ 2.733981] [ T120] audit: type=1404 audit(1784266835.732:2): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295 enabled=1 old-enabled=1 lsm=selinux res=1
[ 2.871180] [ T1] SELinux: Permission firmware_load in class system not defined in policy.
[ 2.871184] [ T1] SELinux: Permission kexec_image_load in class system not defined in policy.
[ 2.871186] [ T1] SELinux: Permission kexec_initramfs_load in class system not defined in policy.
[ 2.871187] [ T1] SELinux: Permission policy_load in class system not defined in policy.
[ 2.871188] [ T1] SELinux: Permission x509_certificate_load in class system not defined in policy.
[ 2.871252] [ T1] SELinux: Permission map_create_as in class bpf not defined in policy.
[ 2.871254] [ T1] SELinux: Permission prog_load_as in class bpf not defined in policy.
[ 2.871258] [ T1] SELinux: Permission allowed in class io_uring not defined in policy.
[ 2.871260] [ T1] SELinux: Class memfd_file not defined in policy.
[ 2.871261] [ T1] SELinux: the above unknown classes and permissions will be allowed
[ 2.873792] [ T1] SELinux: policy capability network_peer_controls=1
[ 2.873795] [ T1] SELinux: policy capability open_perms=1
[ 2.873796] [ T1] SELinux: policy capability extended_socket_class=1
[ 2.873798] [ T1] SELinux: policy capability always_check_network=0
[ 2.873799] [ T1] SELinux: policy capability cgroup_seclabel=1
[ 2.873800] [ T1] SELinux: policy capability nnp_nosuid_transition=1
[ 2.873801] [ T1] SELinux: policy capability genfs_seclabel_symlinks=1
[ 2.873802] [ T1] SELinux: policy capability ioctl_skip_cloexec=0
[ 2.873803] [ T1] SELinux: policy capability userspace_initial_context=0
[ 2.873804] [ T1] SELinux: policy capability netlink_xperm=0
[ 2.873805] [ T1] SELinux: policy capability netif_wildcard=0
[ 2.873806] [ T1] SELinux: policy capability genfs_seclabel_wildcard=0
[ 2.873807] [ T1] SELinux: policy capability functionfs_seclabel=0
[ 2.873808] [ T1] SELinux: policy capability memfd_class=0
[ 2.873809] [ T1] SELinux: policy capability bpf_token_perms=0
[ 2.913266] [ T120] audit: type=1403 audit(1784266835.911:3): auid=4294967295 ses=4294967295 lsm=selinux res=1
[ 2.914834] [ T1] systemd[1]: Successfully loaded SELinux policy in 181.014ms.
[ 2.967540] [ T1] systemd[1]: Relabeled /dev/, /dev/shm/, /run/ in 21.076ms.
[ 2.970728] [ T1] systemd[1]: systemd 257.13+suse.40.g59336000ef running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +IPE -SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK -BTF -XKBCOMMON -UTMP +SYSVINIT +LIBARCHIVE)
[ 2.970735] [ T1] systemd[1]: Detected virtualization powervm.
[ 2.970740] [ T1] systemd[1]: Detected architecture ppc64-le.
[ 3.059976] [ T1] systemd[1]: bpf-restrict-fs: LSM BPF program attached
[ 3.183916] [ T1] systemd[1]: /usr/lib/systemd/system/plymouth-start.service:15: Unit uses KillMode=none. This is unsafe, as it disables systemd's process lifecycle management for the service. Please update the service to use a safer KillMode=, such as 'mixed' or 'control-group'. Support for KillMode=none is deprecated and will eventually be removed.
[ 3.184382] [ T1] systemd[1]: /usr/lib/systemd/system/systemd-ask-password-plymouth.service:10: ConditionPathExists= path is not absolute, ignoring: ${localstatedir}/run/plymouth/pid
[ 3.259733] [ T1] systemd[1]: initrd-switch-root.service: Deactivated successfully.
[ 3.259856] [ T1] systemd[1]: Stopped Switch Root.
[ 3.260659] [ T1] systemd[1]: systemd-journald.service: Scheduled restart job, restart counter is at 1.
[ 3.261957] [ T1] systemd[1]: Created slice Slice /system/getty.
[ 3.262791] [ T1] systemd[1]: Created slice Slice /system/modprobe.
[ 3.263505] [ T1] systemd[1]: Created slice Slice /system/serial-getty.
[ 3.265806] [ T1] systemd[1]: Created slice User and Session Slice.
[ 3.265860] [ T1] systemd[1]: Dispatch Password Requests to Console Directory Watch skipped, unmet condition check ConditionPathExists=!/run/plymouth/pid
[ 3.265972] [ T1] systemd[1]: Arbitrary Executable File Formats File System Automount Point skipped, unmet condition check ConditionPathExists=/proc/sys/fs/binfmt_misc
[ 3.265988] [ T1] systemd[1]: Expecting device /dev/disk/by-uuid/89c9257f-1cb4-46d9-bbae-ec812ea746e3...
[ 3.266021] [ T1] systemd[1]: Expecting device /dev/disk/by-uuid/e695f9c0-9eab-4fcb-9c70-f18a4f4b6849...
[ 3.266051] [ T1] systemd[1]: Expecting device /dev/hvc0...
[ 3.266082] [ T1] systemd[1]: Reached target Local Encrypted Volumes.
[ 3.266122] [ T1] systemd[1]: Stopped target Switch Root.
[ 3.266157] [ T1] systemd[1]: Stopped target Initrd File Systems.
[ 3.266187] [ T1] systemd[1]: Stopped target Initrd Root File System.
[ 3.266220] [ T1] systemd[1]: Reached target Local Integrity Protected Volumes.
[ 3.266268] [ T1] systemd[1]: Reached target Remote File Systems.
[ 3.266296] [ T1] systemd[1]: Reached target Slice Units.
[ 3.266337] [ T1] systemd[1]: Reached target System Time Set.
[ 3.266389] [ T1] systemd[1]: Reached target Local Verity Protected Volumes.
[ 3.266749] [ T1] systemd[1]: Listening on Device-mapper event daemon FIFOs.
[ 3.267988] [ T1] systemd[1]: Listening on LVM2 poll daemon socket.
[ 3.268504] [ T1] systemd[1]: Listening on Syslog Socket.
[ 3.270113] [ T1] systemd[1]: Listening on Process Core Dump Socket.
[ 3.271144] [ T1] systemd[1]: Listening on Credential Encryption/Decryption.
[ 3.271911] [ T1] systemd[1]: Listening on udev Control Socket.
[ 3.272230] [ T1] systemd[1]: Listening on udev Kernel Socket.
[ 3.275882] [ T1] systemd[1]: Mounting Huge Pages File System...
[ 3.278595] [ T1] systemd[1]: Mounting POSIX Message Queue File System...
[ 3.285510] [ T1] systemd[1]: Mounting Kernel Debug File System...
[ 3.288232] [ T1] systemd[1]: Mounting Kernel Trace File System...
[ 3.289519] [ T1] systemd[1]: Starting Availability of block devices...
[ 3.291148] [ T1] systemd[1]: Starting Create List of Static Device Nodes...
[ 3.292196] [ T1] systemd[1]: Starting Load Kernel Module configfs...
[ 3.293777] [ T1] systemd[1]: Starting Load Kernel Module drm...
[ 3.295119] [ T1] systemd[1]: Starting Load Kernel Module efi_pstore...
[ 3.296617] [ T1] systemd[1]: Starting Load Kernel Module fuse...
[ 3.296763] [ T1] systemd[1]: plymouth-switch-root.service: Deactivated successfully.
[ 3.296846] [ T1] systemd[1]: Stopped Plymouth switch root service.
[ 3.297072] [ T1] systemd[1]: systemd-fsck-root.service: Deactivated successfully.
[ 3.297136] [ T1] systemd[1]: Stopped File System Check on Root Device.
[ 3.300545] [ T1] systemd[1]: Starting Journal Service...
[ 3.301114] [ T1] systemd[1]: Load Kernel Modules skipped, no trigger condition checks were met.
[ 3.301178] [ T1] systemd[1]: Apply Kernel Variables for 7.2.0-rc3+ from /boot skipped, unmet condition check ConditionPathExists=/boot/sysctl.conf-7.2.0-rc3+
[ 3.301197] [ T1] systemd[1]: Apply Kernel Variables for 7.2.0-rc3+ skipped, unmet condition check ConditionPathExists=/usr/lib/modules/7.2.0-rc3+/sysctl.conf
[ 3.302807] [ T1] systemd[1]: Starting Remount Root and Kernel File Systems...
[ 3.304487] [ T1] systemd[1]: Starting Apply Kernel Variables...
[ 3.306168] [ T1] systemd[1]: Starting Load udev Rules from Credentials...
[ 3.307787] [ T1] systemd[1]: Starting Coldplug All udev Devices...
[ 3.311952] [ T1] systemd[1]: Mounted Huge Pages File System.
[ 3.312955] [ T1] systemd[1]: Mounted POSIX Message Queue File System.
[ 3.313256] [ T1] systemd[1]: Mounted Kernel Debug File System.
[ 3.313554] [ T1] systemd[1]: Mounted Kernel Trace File System.
[ 3.314107] [ T1] systemd[1]: Finished Availability of block devices.
[ 3.314609] [ T1] systemd[1]: Finished Create List of Static Device Nodes.
[ 3.315101] [ T1] systemd[1]: modprobe@drm.service: Deactivated successfully.
[ 3.315285] [ T1] systemd[1]: Finished Load Kernel Module drm.
[ 3.315678] [ T1] systemd[1]: modprobe@efi_pstore.service: Deactivated successfully.
[ 3.315839] [ T1] systemd[1]: Finished Load Kernel Module efi_pstore.
[ 3.318116] [ T1] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
[ 3.320418] [ T1] systemd[1]: Finished Remount Root and Kernel File Systems.
[ 3.321328] [ T1] systemd[1]: Rebuild Hardware Database skipped, unmet condition check ConditionNeedsUpdate=/etc
[ 3.321881] [ T1] systemd[1]: modprobe@configfs.service: Deactivated successfully.
[ 3.322067] [ T1] systemd[1]: Finished Load Kernel Module configfs.
[ 3.325388] [ T1] systemd[1]: Mounting Kernel Configuration File System...
[ 3.326093] [ T1] systemd[1]: Finished Apply Kernel Variables.
[ 3.330812] [ T1] systemd[1]: Mounted Kernel Configuration File System.
[ 3.331363] [ T1] systemd[1]: Finished Load udev Rules from Credentials.
[ 3.338069] [ T529] systemd-journald[529]: Collecting audit messages is disabled.
[ 3.341382] [ T1] systemd[1]: Started Journal Service.
[ 3.387219] [ T528] fuse: init (API version 7.45)
[ 3.499955] [ T586] rtc-generic rtc-generic: registered as rtc0
[ 3.500017] [ T586] rtc-generic rtc-generic: setting system clock to 2026-07-17T05:40:36 UTC (1784266836)
[ 3.518129] [ T569] ibmveth: IBM Power Virtual Ethernet Driver 1.06
[ 3.535816] [ T676] ibmveth 30000004 env4: renamed from eth1
[ 3.536021] [ T615] ibmveth 30000002 env2: renamed from eth0
[ 3.536213] [ T609] ibmveth 30000005 env5: renamed from eth2
[ 3.574380] [ T730] Adding 2098048k swap on /dev/sda3. Priority:-1 extents:1 across:2098048k SS
[ 4.313229] [ T529] systemd-journald[529]: Received client request to flush runtime journal.
[ 4.495153] [ T121] EEH: Sleep 5s ahead of complete hotplug
[ 5.267728] [ T857] device-mapper: uevent: version 1.0.3
[ 5.267893] [ T857] device-mapper: ioctl: 4.50.0-ioctl (2025-04-28) initialised: dm-devel@lists.linux.dev
[ 6.643311] [ T1039] NET: Registered PF_PACKET protocol family
[ 6.968503] [ T1159] SELinux: unrecognized netlink message: protocol=4 nlmsg_type=19 sclass=netlink_tcpdiag_socket pid=1159 comm=ss
[ 7.428015] [ T1270] SELinux: unrecognized netlink message: protocol=4 nlmsg_type=19 sclass=netlink_tcpdiag_socket pid=1270 comm=ss
[ 9.697677] [ T121] pci 0014:01:00.0: No hypervisor support for SR-IOV on this device, IOV BARs disabled.
[ 9.698943] [ T121] pci 0014:01:00.0: supports D1 D2
[ 9.698946] [ T121] pci 0014:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 9.700553] [ T121] pci 0014:01:00.0: Adding to iommu group 0
[ 9.724315] [ T121] pci 0014:01:00.0: enabling device (0140 -> 0142)
[ 9.725792] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 9.725807] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 1
[ 9.725903] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 9.725906] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 9.725911] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 9.725913] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 9.726100] [ T121] xhci_hcd 0014:01:00.0: hcc params 0x0270f06d hci version 0x96 quirks 0x0000000004000000
[ 9.728070] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 9.728074] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 2
[ 9.728078] [ T121] xhci_hcd 0014:01:00.0: Host supports USB 3.0 SuperSpeed
[ 9.728139] [ T121] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
[ 9.728142] [ T121] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 9.728144] [ T121] usb usb1: Product: xHCI Host Controller
[ 9.728146] [ T121] usb usb1: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 9.728148] [ T121] usb usb1: SerialNumber: 0014:01:00.0
[ 9.728729] [ T121] hub 1-0:1.0: USB hub found
[ 9.728804] [ T121] hub 1-0:1.0: 4 ports detected
[ 9.728877] [ T121] xhci_hcd 0014:01:00.0: xHCI host controller not responding, assume dead
[ 9.728904] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 9.729022] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 9.729034] [ T121] xhci_hcd 0014:01:00.0: USB bus 2 deregistered
[ 9.729038] [ T121] xhci_hcd 0014:01:00.0: remove, state 1
[ 9.729042] [ T121] usb usb1: USB disconnect, device number 1
[ 9.730016] [ T121] xhci_hcd 0014:01:00.0: USB bus 1 deregistered
[ 9.730082] [ T121] xhci_hcd 0014:01:00.0: probe with driver xhci_hcd failed with error -108
[ 9.742303] [ T121] EEH: Notify device driver to resume
[ 9.742308] [ T121] EEH: Beginning: 'resume'
[ 9.742309] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 9.742312] [ T121] EEH: Finished:'resume'
[ 9.742313] [ T121] EEH: Recovery successful.
[ 9.742506] [ T121] EEH: Recovering PHB#14-PE#10000
[ 9.742519] [ T121] EEH: PE location: N/A, PHB location: N/A
[ 9.742523] [ T121] EEH: Frozen PHB#14-PE#10000 detected
[ 9.742527] [ T121] EEH: Call Trace:
[ 9.742530] [ T121] EEH: [000000001f1698b1] __eeh_send_failure_event+0xa8/0x190
[ 9.742541] [ T121] EEH: [000000008a51cc61] eeh_dev_check_failure+0x408/0x7a0
[ 9.742548] [ T121] EEH: [000000006ec66e06] xhci_portsc_readl+0x64/0x90 [xhci_hcd]
[ 9.742566] [ T121] EEH: [0000000088769cf2] xhci_hub_control+0xe28/0x27f0 [xhci_hcd]
[ 9.742585] [ T121] EEH: [00000000fbba7f7a] usb_hcd_submit_urb+0x508/0xd30 [usbcore]
[ 9.742606] [ T121] EEH: [000000003c3af5d9] usb_submit_urb+0x254/0x840 [usbcore]
[ 9.742625] [ T121] EEH: [00000000636aad98] usb_start_wait_urb+0x88/0x270 [usbcore]
[ 9.742644] [ T121] EEH: [00000000c4b1d0b5] usb_control_msg+0x134/0x1f0 [usbcore]
[ 9.742662] [ T121] EEH: [0000000003f2146d] hub_probe+0x570/0x12b8 [usbcore]
[ 9.742681] [ T121] EEH: [00000000f479c03a] usb_probe_interface+0x124/0x490 [usbcore]
[ 9.742700] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 9.742706] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 9.742712] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 9.742717] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 9.742723] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 9.742729] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 9.742734] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 9.742740] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 9.742745] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 9.742751] [ T121] EEH: [0000000041b13797] usb_set_configuration+0x78c/0xb60 [usbcore]
[ 9.742770] [ T121] EEH: [00000000129fbbb0] usb_generic_driver_probe+0x78/0xd0 [usbcore]
[ 9.742790] [ T121] EEH: [000000006e13a13a] usb_probe_device+0x60/0x200 [usbcore]
[ 9.742809] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 9.742814] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 9.742819] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 9.742824] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 9.742830] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 9.742836] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 9.742841] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 9.742847] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 9.742851] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 9.742858] [ T121] EEH: [00000000128463eb] usb_new_device+0x2f4/0x890 [usbcore]
[ 9.742875] [ T121] EEH: [0000000042394a64] register_root_hub+0x1e4/0x2a0 [usbcore]
[ 9.742895] [ T121] EEH: [00000000a33afbd1] usb_add_hcd+0x82c/0x8f0 [usbcore]
[ 9.742913] [ T121] EEH: [000000008fafad0e] xhci_pci_common_probe+0x1e4/0x3d0 [xhci_pci]
[ 9.742920] [ T121] EEH: [0000000081280f6e] local_pci_probe+0x64/0x100
[ 9.742927] [ T121] EEH: [00000000e1b257ca] pci_device_probe+0x330/0x370
[ 9.742955] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 9.742961] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 9.742968] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 9.742973] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 9.742980] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 9.742988] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 9.742994] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 9.743001] [ T121] EEH: [00000000deb502bd] pci_bus_add_device+0xb0/0xf0
[ 9.743007] [ T121] EEH: [0000000063f3148c] pci_bus_add_devices+0x54/0xb0
[ 9.743012] [ T121] EEH: [000000000c3763a7] pcibios_finish_adding_to_bus+0xd4/0xf0
[ 9.743020] [ T121] EEH: [00000000759a7fd9] pci_hp_add_devices+0x78/0x2d0
[ 9.743027] [ T121] EEH: [00000000eec13ff4] eeh_reset_device+0x238/0x298
[ 9.743033] [ T121] EEH: [00000000ccea63cc] eeh_handle_normal_event+0x61c/0xa60
[ 9.743040] [ T121] EEH: [0000000075cb9a09] eeh_event_handler+0xf8/0x190
[ 9.743047] [ T121] EEH: [000000009e6f07b4] kthread+0x194/0x1b0
[ 9.743052] [ T121] EEH: [000000005f2fe52c] start_kernel_thread+0x14/0x18
[ 9.743057] [ T121] EEH: This PCI device has failed 2 times in the last hour and will be permanently disabled after 5 failures.
[ 9.743059] [ T121] EEH: Notify device drivers to shutdown
[ 9.743060] [ T121] EEH: Beginning: 'error_detected(IO frozen)'
[ 9.743062] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 9.743064] [ T121] EEH: Finished:'error_detected(IO frozen)' with aggregate recovery state:'none'
[ 9.743120] [ T121] EEH: Collect temporary log
[ 9.743630] [ T121] EEH: of node=0014:01:00.0
[ 9.743662] [ T121] EEH: PCI device/vendor: 8241104c
[ 9.743693] [ T121] EEH: PCI cmd/status register: 00100142
[ 9.743696] [ T121] EEH: PCI-E capabilities and status follow:
[ 9.743841] [ T121] EEH: PCI-E 00: 0002c010 000086c3 0010505f 00073c12
[ 9.743991] [ T121] EEH: PCI-E 10: 10120000 00000000 00000000 00000000
[ 9.743993] [ T121] EEH: PCI-E 20: 00000000
[ 9.743994] [ T121] EEH: PCI-E AER capability register set follows:
[ 9.744143] [ T121] EEH: PCI-E AER 00: 15020001 00000000 00000000 00462030
[ 9.744262] [ T121] EEH: PCI-E AER 10: 00000000 00002000 000001e0 00000000
[ 9.744378] [ T121] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000
[ 9.744408] [ T121] EEH: PCI-E AER 30: 00000000 00000000
[ 9.745629] [ T121] RTAS: event: 2, Type: Platform Error (224), Severity: 2
[ 9.745636] [ T121] EEH: Reset with hotplug activity
[ 11.982273] [ T1050] fbcon: Taking over console
[ 12.044396] [ T121] EEH: Sleep 5s ahead of complete hotplug
[ 17.376960] [ T121] ------------[ cut here ]------------
[ 17.376980] [ T121] WARNING: arch/powerpc/kernel/eeh_pe.c:439 at eeh_pe_tree_remove+0xf8/0x2f0, CPU#12: eehd/121
[ 17.376988] [ T121] Modules linked in: mptcp_diag(E) xsk_diag(E) tcp_diag(E) udp_diag(E) raw_diag(E) inet_diag(E) unix_diag(E) af_packet_diag(E) netlink_diag(E) bonding(E) tls(E) af_packet(E) rfkill(E) nft_fib_inet(E) nft_fib_ipv4(E) nft_fib_ipv6(E) nft_fib(E) nft_reject_inet(E) nf_reject_ipv4(E) nf_reject_ipv6(E) nft_reject(E) nft_ct(E) nft_chain_nat(E) nf_nat(E) nf_conntrack(E) nf_defrag_ipv6(E) nf_defrag_ipv4(E) nf_tables(E) dm_mod(E) ibmveth(E) vmx_crypto(E) dax_pmem(E) rtc_generic(E) fuse(E) configfs(E) xhci_pci(E) ibmvscsi(E) scsi_transport_srp(E) sd_mod(E) scsi_dh_emc(E) scsi_dh_rdac(E) scsi_dh_alua(E) xhci_hcd(E) nd_pmem(E) sg(E) nd_btt(E) papr_scm(E) scsi_mod(E) scsi_common(E) libnvdimm(E) usbcore(E) pseries_wdt(E) usb_common(E) btrfs(E) xor(E) libblake2b(E) raid6_pq(E)
[ 17.377039] [ T121] CPU: 12 UID: 0 PID: 121 Comm: eehd Tainted: G E 7.2.0-rc3+ #7 PREEMPT(lazy) 56dd0daef6afd14c09fd836e317bfce16293d3bd
[ 17.377043] [ T121] Tainted: [E]=UNSIGNED_MODULE
[ 17.377045] [ T121] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1120.00 (NH1120_135) hv:phyp pSeries
[ 17.377046] [ T121] NIP: c00000000004a048 LR: c00000000004ba6c CTR: c00000000004ba10
[ 17.377048] [ T121] REGS: c00000000a4b79d0 TRAP: 0700 Tainted: G E (7.2.0-rc3+)
[ 17.377051] [ T121] MSR: 800000000282b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE> CR: 28000842 XER: 00000006
[ 17.377061] [ T121] CFAR: c00000000004a004 IRQMASK: 0
GPR00: c00000000004ba6c c00000000a4b7c90 c000000001e18100 c000000003950df0
GPR04: 0000000000000000 0000000000000000 0000000000000000 0000000000000004
GPR08: 0000010000000000 c0000000038a0800 0000000000000001 0000000088000242
GPR12: c00000000004ba10 c0000018fffd4480 c00000000025d928 c0000000091134c0
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000002
GPR24: 0000000000000002 0000000000000002 0000000000000000 0000010200000000
GPR28: 0000010000000000 5deadbeef0000122 5deadbeef0000100 c0000000038a3000
[ 17.377091] [ T121] NIP [c00000000004a048] eeh_pe_tree_remove+0xf8/0x2f0
[ 17.377094] [ T121] LR [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 17.377098] [ T121] Call Trace:
[ 17.377100] [ T121] [c00000000a4b7c90] [c00000000a83f800] 0xc00000000a83f800 (unreliable)
[ 17.377108] [ T121] [c00000000a4b7d30] [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 17.377112] [ T121] [c00000000a4b7d60] [c0000000000496ec] eeh_pe_traverse+0x6c/0xf0
[ 17.377116] [ T121] [c00000000a4b7da0] [c00000000004e100] eeh_reset_device+0x1f8/0x298
[ 17.377120] [ T121] [c00000000a4b7e50] [c00000000004ce5c] eeh_handle_normal_event+0x61c/0xa60
[ 17.377124] [ T121] [c00000000a4b7f30] [c00000000004e298] eeh_event_handler+0xf8/0x190
[ 17.377128] [ T121] [c00000000a4b7f90] [c00000000025dab4] kthread+0x194/0x1b0
[ 17.377131] [ T121] [c00000000a4b7fe0] [c00000000000dcd8] start_kernel_thread+0x14/0x18
[ 17.377134] [ T121] Code: 80ff0000 e95f0038 7fe9fb78 70e80002 408200a8 7d5f5378 e9090000 38c00000 39400001 7d08d838 7c28e000 7d4a309e <0b0a0000> 81490004 e9090068 714a0102
[ 17.377146] [ T121] ---[ end trace 0000000000000000 ]---
[ 17.377758] [ T121] pci 0014:01:00.0: No hypervisor support for SR-IOV on this device, IOV BARs disabled.
[ 17.379020] [ T121] pci 0014:01:00.0: supports D1 D2
[ 17.379023] [ T121] pci 0014:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 17.380613] [ T121] pci 0014:01:00.0: Adding to iommu group 0
[ 17.393318] [ T121] pci 0014:01:00.0: enabling device (0140 -> 0142)
[ 17.394788] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 17.394796] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 1
[ 17.394889] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 17.394891] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 17.394897] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 17.394899] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 17.395098] [ T121] xhci_hcd 0014:01:00.0: hcc params 0x0270f06d hci version 0x96 quirks 0x0000000004000000
[ 17.397042] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 17.397046] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 2
[ 17.397049] [ T121] xhci_hcd 0014:01:00.0: Host supports USB 3.0 SuperSpeed
[ 17.397108] [ T121] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
[ 17.397111] [ T121] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 17.397113] [ T121] usb usb1: Product: xHCI Host Controller
[ 17.397114] [ T121] usb usb1: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 17.397116] [ T121] usb usb1: SerialNumber: 0014:01:00.0
[ 17.397421] [ T121] hub 1-0:1.0: USB hub found
[ 17.397501] [ T121] hub 1-0:1.0: 4 ports detected
[ 17.397606] [ T121] xhci_hcd 0014:01:00.0: xHCI host controller not responding, assume dead
[ 17.397636] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 17.397774] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 17.397803] [ T121] xhci_hcd 0014:01:00.0: USB bus 2 deregistered
[ 17.397808] [ T121] xhci_hcd 0014:01:00.0: remove, state 1
[ 17.397811] [ T121] usb usb1: USB disconnect, device number 1
[ 17.398845] [ T121] xhci_hcd 0014:01:00.0: USB bus 1 deregistered
[ 17.398912] [ T121] xhci_hcd 0014:01:00.0: probe with driver xhci_hcd failed with error -108
[ 17.411280] [ T121] EEH: Notify device driver to resume
[ 17.411284] [ T121] EEH: Beginning: 'resume'
[ 17.411285] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 17.411288] [ T121] EEH: Finished:'resume'
[ 17.411289] [ T121] EEH: Recovery successful.
[ 17.411475] [ T121] EEH: Recovering PHB#14-PE#10000
[ 17.411487] [ T121] EEH: PE location: N/A, PHB location: N/A
[ 17.411492] [ T121] EEH: Frozen PHB#14-PE#10000 detected
[ 17.411496] [ T121] EEH: Call Trace:
[ 17.411499] [ T121] EEH: [000000001f1698b1] __eeh_send_failure_event+0xa8/0x190
[ 17.411509] [ T121] EEH: [000000008a51cc61] eeh_dev_check_failure+0x408/0x7a0
[ 17.411516] [ T121] EEH: [000000006ec66e06] xhci_portsc_readl+0x64/0x90 [xhci_hcd]
[ 17.411534] [ T121] EEH: [0000000088769cf2] xhci_hub_control+0xe28/0x27f0 [xhci_hcd]
[ 17.411553] [ T121] EEH: [00000000fbba7f7a] usb_hcd_submit_urb+0x508/0xd30 [usbcore]
[ 17.411573] [ T121] EEH: [000000003c3af5d9] usb_submit_urb+0x254/0x840 [usbcore]
[ 17.411593] [ T121] EEH: [00000000636aad98] usb_start_wait_urb+0x88/0x270 [usbcore]
[ 17.411611] [ T121] EEH: [00000000c4b1d0b5] usb_control_msg+0x134/0x1f0 [usbcore]
[ 17.411629] [ T121] EEH: [0000000003f2146d] hub_probe+0x570/0x12b8 [usbcore]
[ 17.411647] [ T121] EEH: [00000000f479c03a] usb_probe_interface+0x124/0x490 [usbcore]
[ 17.411666] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 17.411672] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 17.411680] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 17.411685] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 17.411691] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 17.411698] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 17.411703] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 17.411708] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 17.411713] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 17.411719] [ T121] EEH: [0000000041b13797] usb_set_configuration+0x78c/0xb60 [usbcore]
[ 17.411739] [ T121] EEH: [00000000129fbbb0] usb_generic_driver_probe+0x78/0xd0 [usbcore]
[ 17.411758] [ T121] EEH: [000000006e13a13a] usb_probe_device+0x60/0x200 [usbcore]
[ 17.411777] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 17.411782] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 17.411788] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 17.411793] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 17.411798] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 17.411805] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 17.411810] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 17.411815] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 17.411820] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 17.411826] [ T121] EEH: [00000000128463eb] usb_new_device+0x2f4/0x890 [usbcore]
[ 17.411844] [ T121] EEH: [0000000042394a64] register_root_hub+0x1e4/0x2a0 [usbcore]
[ 17.411863] [ T121] EEH: [00000000a33afbd1] usb_add_hcd+0x82c/0x8f0 [usbcore]
[ 17.411881] [ T121] EEH: [000000008fafad0e] xhci_pci_common_probe+0x1e4/0x3d0 [xhci_pci]
[ 17.411888] [ T121] EEH: [0000000081280f6e] local_pci_probe+0x64/0x100
[ 17.411894] [ T121] EEH: [00000000e1b257ca] pci_device_probe+0x330/0x370
[ 17.411900] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 17.411905] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 17.411911] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 17.411916] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 17.411921] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 17.411934] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 17.411939] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 17.411944] [ T121] EEH: [00000000deb502bd] pci_bus_add_device+0xb0/0xf0
[ 17.411950] [ T121] EEH: [0000000063f3148c] pci_bus_add_devices+0x54/0xb0
[ 17.411956] [ T121] EEH: [000000000c3763a7] pcibios_finish_adding_to_bus+0xd4/0xf0
[ 17.411964] [ T121] EEH: [00000000759a7fd9] pci_hp_add_devices+0x78/0x2d0
[ 17.411971] [ T121] EEH: [00000000eec13ff4] eeh_reset_device+0x238/0x298
[ 17.411978] [ T121] EEH: [00000000ccea63cc] eeh_handle_normal_event+0x61c/0xa60
[ 17.411986] [ T121] EEH: [0000000075cb9a09] eeh_event_handler+0xf8/0x190
[ 17.411993] [ T121] EEH: [000000009e6f07b4] kthread+0x194/0x1b0
[ 17.411999] [ T121] EEH: [000000005f2fe52c] start_kernel_thread+0x14/0x18
[ 17.412006] [ T121] EEH: This PCI device has failed 3 times in the last hour and will be permanently disabled after 5 failures.
[ 17.412007] [ T121] EEH: Notify device drivers to shutdown
[ 17.412009] [ T121] EEH: Beginning: 'error_detected(IO frozen)'
[ 17.412010] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 17.412012] [ T121] EEH: Finished:'error_detected(IO frozen)' with aggregate recovery state:'none'
[ 17.412065] [ T121] EEH: Collect temporary log
[ 17.412577] [ T121] EEH: of node=0014:01:00.0
[ 17.412608] [ T121] EEH: PCI device/vendor: 8241104c
[ 17.412639] [ T121] EEH: PCI cmd/status register: 00100142
[ 17.412640] [ T121] EEH: PCI-E capabilities and status follow:
[ 17.412786] [ T121] EEH: PCI-E 00: 0002c010 000086c3 0010505f 00073c12
[ 17.412902] [ T121] EEH: PCI-E 10: 10120000 00000000 00000000 00000000
[ 17.412904] [ T121] EEH: PCI-E 20: 00000000
[ 17.412905] [ T121] EEH: PCI-E AER capability register set follows:
[ 17.413052] [ T121] EEH: PCI-E AER 00: 15020001 00000000 00000000 00462030
[ 17.413168] [ T121] EEH: PCI-E AER 10: 00000000 00002000 000001e0 00000000
[ 17.413284] [ T121] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000
[ 17.413314] [ T121] EEH: PCI-E AER 30: 00000000 00000000
[ 17.414527] [ T121] RTAS: event: 3, Type: Platform Error (224), Severity: 2
[ 17.414545] [ T121] EEH: Reset with hotplug activity
[ 19.723905] [ T121] EEH: Sleep 5s ahead of complete hotplug
[ 25.056944] [ T121] ------------[ cut here ]------------
[ 25.056952] [ T121] WARNING: arch/powerpc/kernel/eeh_pe.c:439 at eeh_pe_tree_remove+0xf8/0x2f0, CPU#14: eehd/121
[ 25.056969] [ T121] Modules linked in: mptcp_diag(E) xsk_diag(E) tcp_diag(E) udp_diag(E) raw_diag(E) inet_diag(E) unix_diag(E) af_packet_diag(E) netlink_diag(E) bonding(E) tls(E) af_packet(E) rfkill(E) nft_fib_inet(E) nft_fib_ipv4(E) nft_fib_ipv6(E) nft_fib(E) nft_reject_inet(E) nf_reject_ipv4(E) nf_reject_ipv6(E) nft_reject(E) nft_ct(E) nft_chain_nat(E) nf_nat(E) nf_conntrack(E) nf_defrag_ipv6(E) nf_defrag_ipv4(E) nf_tables(E) dm_mod(E) ibmveth(E) vmx_crypto(E) dax_pmem(E) rtc_generic(E) fuse(E) configfs(E) xhci_pci(E) ibmvscsi(E) scsi_transport_srp(E) sd_mod(E) scsi_dh_emc(E) scsi_dh_rdac(E) scsi_dh_alua(E) xhci_hcd(E) nd_pmem(E) sg(E) nd_btt(E) papr_scm(E) scsi_mod(E) scsi_common(E) libnvdimm(E) usbcore(E) pseries_wdt(E) usb_common(E) btrfs(E) xor(E) libblake2b(E) raid6_pq(E)
[ 25.057015] [ T121] CPU: 14 UID: 0 PID: 121 Comm: eehd Tainted: G W E 7.2.0-rc3+ #7 PREEMPT(lazy) 56dd0daef6afd14c09fd836e317bfce16293d3bd
[ 25.057019] [ T121] Tainted: [W]=WARN, [E]=UNSIGNED_MODULE
[ 25.057021] [ T121] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1120.00 (NH1120_135) hv:phyp pSeries
[ 25.057023] [ T121] NIP: c00000000004a048 LR: c00000000004ba6c CTR: c00000000004ba10
[ 25.057025] [ T121] REGS: c00000000a4b79d0 TRAP: 0700 Tainted: G W E (7.2.0-rc3+)
[ 25.057027] [ T121] MSR: 800000000282b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE> CR: 24000242 XER: 00000004
[ 25.057037] [ T121] CFAR: c00000000004a004 IRQMASK: 0
GPR00: c00000000004ba6c c00000000a4b7c90 c000000001e18100 c000000003950df0
GPR04: 0000000000000000 0000000000000000 0000000000000000 0000000000000004
GPR08: 0000010000000000 c0000000038a0800 0000000000000001 0000000088000242
GPR12: c00000000004ba10 c0000018fffd2480 c00000000025d928 c0000000091134c0
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000002
GPR24: 0000000000000003 0000000000000002 0000000000000000 0000010200000000
GPR28: 0000010000000000 5deadbeef0000122 5deadbeef0000100 c0000000038a3000
[ 25.057067] [ T121] NIP [c00000000004a048] eeh_pe_tree_remove+0xf8/0x2f0
[ 25.057070] [ T121] LR [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 25.057074] [ T121] Call Trace:
[ 25.057076] [ T121] [c00000000a4b7c90] [c00000000a83f800] 0xc00000000a83f800 (unreliable)
[ 25.057083] [ T121] [c00000000a4b7d30] [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 25.057087] [ T121] [c00000000a4b7d60] [c0000000000496ec] eeh_pe_traverse+0x6c/0xf0
[ 25.057091] [ T121] [c00000000a4b7da0] [c00000000004e100] eeh_reset_device+0x1f8/0x298
[ 25.057095] [ T121] [c00000000a4b7e50] [c00000000004ce5c] eeh_handle_normal_event+0x61c/0xa60
[ 25.057099] [ T121] [c00000000a4b7f30] [c00000000004e298] eeh_event_handler+0xf8/0x190
[ 25.057103] [ T121] [c00000000a4b7f90] [c00000000025dab4] kthread+0x194/0x1b0
[ 25.057105] [ T121] [c00000000a4b7fe0] [c00000000000dcd8] start_kernel_thread+0x14/0x18
[ 25.057108] [ T121] Code: 80ff0000 e95f0038 7fe9fb78 70e80002 408200a8 7d5f5378 e9090000 38c00000 39400001 7d08d838 7c28e000 7d4a309e <0b0a0000> 81490004 e9090068 714a0102
[ 25.057120] [ T121] ---[ end trace 0000000000000000 ]---
[ 25.057709] [ T121] pci 0014:01:00.0: No hypervisor support for SR-IOV on this device, IOV BARs disabled.
[ 25.058960] [ T121] pci 0014:01:00.0: supports D1 D2
[ 25.058962] [ T121] pci 0014:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 25.060547] [ T121] pci 0014:01:00.0: Adding to iommu group 0
[ 25.073251] [ T121] pci 0014:01:00.0: enabling device (0140 -> 0142)
[ 25.074732] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 25.074740] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 1
[ 25.074831] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 25.074833] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 25.074838] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 25.074840] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 25.075031] [ T121] xhci_hcd 0014:01:00.0: hcc params 0x0270f06d hci version 0x96 quirks 0x0000000004000000
[ 25.076949] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 25.076954] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 2
[ 25.076959] [ T121] xhci_hcd 0014:01:00.0: Host supports USB 3.0 SuperSpeed
[ 25.077035] [ T121] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
[ 25.077038] [ T121] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 25.077041] [ T121] usb usb1: Product: xHCI Host Controller
[ 25.077043] [ T121] usb usb1: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 25.077045] [ T121] usb usb1: SerialNumber: 0014:01:00.0
[ 25.077419] [ T121] hub 1-0:1.0: USB hub found
[ 25.077560] [ T121] hub 1-0:1.0: 4 ports detected
[ 25.077711] [ T121] xhci_hcd 0014:01:00.0: xHCI host controller not responding, assume dead
[ 25.077745] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 25.077901] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 25.077946] [ T121] xhci_hcd 0014:01:00.0: USB bus 2 deregistered
[ 25.077956] [ T121] xhci_hcd 0014:01:00.0: remove, state 1
[ 25.077965] [ T121] usb usb1: USB disconnect, device number 1
[ 25.079122] [ T121] xhci_hcd 0014:01:00.0: USB bus 1 deregistered
[ 25.079192] [ T121] xhci_hcd 0014:01:00.0: probe with driver xhci_hcd failed with error -108
[ 25.090310] [ T121] EEH: Notify device driver to resume
[ 25.090314] [ T121] EEH: Beginning: 'resume'
[ 25.090316] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 25.090318] [ T121] EEH: Finished:'resume'
[ 25.090320] [ T121] EEH: Recovery successful.
[ 25.090505] [ T121] EEH: Recovering PHB#14-PE#10000
[ 25.090518] [ T121] EEH: PE location: N/A, PHB location: N/A
[ 25.090523] [ T121] EEH: Frozen PHB#14-PE#10000 detected
[ 25.090527] [ T121] EEH: Call Trace:
[ 25.090530] [ T121] EEH: [000000001f1698b1] __eeh_send_failure_event+0xa8/0x190
[ 25.090540] [ T121] EEH: [000000008a51cc61] eeh_dev_check_failure+0x408/0x7a0
[ 25.090547] [ T121] EEH: [000000006ec66e06] xhci_portsc_readl+0x64/0x90 [xhci_hcd]
[ 25.090565] [ T121] EEH: [0000000088769cf2] xhci_hub_control+0xe28/0x27f0 [xhci_hcd]
[ 25.090584] [ T121] EEH: [00000000fbba7f7a] usb_hcd_submit_urb+0x508/0xd30 [usbcore]
[ 25.090604] [ T121] EEH: [000000003c3af5d9] usb_submit_urb+0x254/0x840 [usbcore]
[ 25.090623] [ T121] EEH: [00000000636aad98] usb_start_wait_urb+0x88/0x270 [usbcore]
[ 25.090642] [ T121] EEH: [00000000c4b1d0b5] usb_control_msg+0x134/0x1f0 [usbcore]
[ 25.090660] [ T121] EEH: [0000000003f2146d] hub_probe+0x570/0x12b8 [usbcore]
[ 25.090678] [ T121] EEH: [00000000f479c03a] usb_probe_interface+0x124/0x490 [usbcore]
[ 25.090698] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 25.090704] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 25.090710] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 25.090715] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 25.090721] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 25.090727] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 25.090733] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 25.090738] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 25.090743] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 25.090750] [ T121] EEH: [0000000041b13797] usb_set_configuration+0x78c/0xb60 [usbcore]
[ 25.090769] [ T121] EEH: [00000000129fbbb0] usb_generic_driver_probe+0x78/0xd0 [usbcore]
[ 25.090788] [ T121] EEH: [000000006e13a13a] usb_probe_device+0x60/0x200 [usbcore]
[ 25.090808] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 25.090813] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 25.090819] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 25.090824] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 25.090830] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 25.090837] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 25.090842] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 25.090848] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 25.090853] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 25.090859] [ T121] EEH: [00000000128463eb] usb_new_device+0x2f4/0x890 [usbcore]
[ 25.090877] [ T121] EEH: [0000000042394a64] register_root_hub+0x1e4/0x2a0 [usbcore]
[ 25.090897] [ T121] EEH: [00000000a33afbd1] usb_add_hcd+0x82c/0x8f0 [usbcore]
[ 25.090915] [ T121] EEH: [000000008fafad0e] xhci_pci_common_probe+0x1e4/0x3d0 [xhci_pci]
[ 25.090933] [ T121] EEH: [0000000081280f6e] local_pci_probe+0x64/0x100
[ 25.090952] [ T121] EEH: [00000000e1b257ca] pci_device_probe+0x330/0x370
[ 25.090960] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 25.090967] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 25.090973] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 25.090980] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 25.090986] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 25.090993] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 25.090998] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 25.091003] [ T121] EEH: [00000000deb502bd] pci_bus_add_device+0xb0/0xf0
[ 25.091009] [ T121] EEH: [0000000063f3148c] pci_bus_add_devices+0x54/0xb0
[ 25.091015] [ T121] EEH: [000000000c3763a7] pcibios_finish_adding_to_bus+0xd4/0xf0
[ 25.091022] [ T121] EEH: [00000000759a7fd9] pci_hp_add_devices+0x78/0x2d0
[ 25.091029] [ T121] EEH: [00000000eec13ff4] eeh_reset_device+0x238/0x298
[ 25.091036] [ T121] EEH: [00000000ccea63cc] eeh_handle_normal_event+0x61c/0xa60
[ 25.091043] [ T121] EEH: [0000000075cb9a09] eeh_event_handler+0xf8/0x190
[ 25.091046] [ T121] EEH: [000000009e6f07b4] kthread+0x194/0x1b0
[ 25.091048] [ T121] EEH: [000000005f2fe52c] start_kernel_thread+0x14/0x18
[ 25.091050] [ T121] EEH: This PCI device has failed 4 times in the last hour and will be permanently disabled after 5 failures.
[ 25.091052] [ T121] EEH: Notify device drivers to shutdown
[ 25.091053] [ T121] EEH: Beginning: 'error_detected(IO frozen)'
[ 25.091054] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 25.091070] [ T121] EEH: Finished:'error_detected(IO frozen)' with aggregate recovery state:'none'
[ 25.091125] [ T121] EEH: Collect temporary log
[ 25.091635] [ T121] EEH: of node=0014:01:00.0
[ 25.091667] [ T121] EEH: PCI device/vendor: 8241104c
[ 25.091697] [ T121] EEH: PCI cmd/status register: 00100142
[ 25.091699] [ T121] EEH: PCI-E capabilities and status follow:
[ 25.091845] [ T121] EEH: PCI-E 00: 0002c010 000086c3 0010505f 00073c12
[ 25.091980] [ T121] EEH: PCI-E 10: 10120000 00000000 00000000 00000000
[ 25.091981] [ T121] EEH: PCI-E 20: 00000000
[ 25.091983] [ T121] EEH: PCI-E AER capability register set follows:
[ 25.092129] [ T121] EEH: PCI-E AER 00: 15020001 00000000 00000000 00462030
[ 25.092245] [ T121] EEH: PCI-E AER 10: 00000000 00002000 000001e0 00000000
[ 25.092362] [ T121] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000
[ 25.092392] [ T121] EEH: PCI-E AER 30: 00000000 00000000
[ 25.093617] [ T121] RTAS: event: 4, Type: Platform Error (224), Severity: 2
[ 25.093624] [ T121] EEH: Reset with hotplug activity
[ 27.403932] [ T121] EEH: Sleep 5s ahead of complete hotplug
[ 32.736933] [ T121] ------------[ cut here ]------------
[ 32.736938] [ T121] WARNING: arch/powerpc/kernel/eeh_pe.c:439 at eeh_pe_tree_remove+0xf8/0x2f0, CPU#10: eehd/121
[ 32.736947] [ T121] Modules linked in: mptcp_diag(E) xsk_diag(E) tcp_diag(E) udp_diag(E) raw_diag(E) inet_diag(E) unix_diag(E) af_packet_diag(E) netlink_diag(E) bonding(E) tls(E) af_packet(E) rfkill(E) nft_fib_inet(E) nft_fib_ipv4(E) nft_fib_ipv6(E) nft_fib(E) nft_reject_inet(E) nf_reject_ipv4(E) nf_reject_ipv6(E) nft_reject(E) nft_ct(E) nft_chain_nat(E) nf_nat(E) nf_conntrack(E) nf_defrag_ipv6(E) nf_defrag_ipv4(E) nf_tables(E) dm_mod(E) ibmveth(E) vmx_crypto(E) dax_pmem(E) rtc_generic(E) fuse(E) configfs(E) xhci_pci(E) ibmvscsi(E) scsi_transport_srp(E) sd_mod(E) scsi_dh_emc(E) scsi_dh_rdac(E) scsi_dh_alua(E) xhci_hcd(E) nd_pmem(E) sg(E) nd_btt(E) papr_scm(E) scsi_mod(E) scsi_common(E) libnvdimm(E) usbcore(E) pseries_wdt(E) usb_common(E) btrfs(E) xor(E) libblake2b(E) raid6_pq(E)
[ 32.737002] [ T121] CPU: 10 UID: 0 PID: 121 Comm: eehd Tainted: G W E 7.2.0-rc3+ #7 PREEMPT(lazy) 56dd0daef6afd14c09fd836e317bfce16293d3bd
[ 32.737007] [ T121] Tainted: [W]=WARN, [E]=UNSIGNED_MODULE
[ 32.737008] [ T121] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1120.00 (NH1120_135) hv:phyp pSeries
[ 32.737010] [ T121] NIP: c00000000004a048 LR: c00000000004ba6c CTR: c00000000004ba10
[ 32.737012] [ T121] REGS: c00000000a4b79d0 TRAP: 0700 Tainted: G W E (7.2.0-rc3+)
[ 32.737015] [ T121] MSR: 800000000282b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE> CR: 28000842 XER: 000000cf
[ 32.737026] [ T121] CFAR: c00000000004a004 IRQMASK: 0
GPR00: c00000000004ba6c c00000000a4b7c90 c000000001e18100 c000000003950df0
GPR04: 0000000000000000 0000000000000000 0000000000000000 0000000000000004
GPR08: 0000010000000000 c0000000038a0800 0000000000000001 0000000088000242
GPR12: c00000000004ba10 c0000018fffd6480 c00000000025d928 c0000000091134c0
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000002
GPR24: 0000000000000004 0000000000000002 0000000000000000 0000010200000000
GPR28: 0000010000000000 5deadbeef0000122 5deadbeef0000100 c0000000038a3000
[ 32.737056] [ T121] NIP [c00000000004a048] eeh_pe_tree_remove+0xf8/0x2f0
[ 32.737060] [ T121] LR [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 32.737064] [ T121] Call Trace:
[ 32.737066] [ T121] [c00000000a4b7c90] [c00000000a83f800] 0xc00000000a83f800 (unreliable)
[ 32.737075] [ T121] [c00000000a4b7d30] [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 32.737079] [ T121] [c00000000a4b7d60] [c0000000000496ec] eeh_pe_traverse+0x6c/0xf0
[ 32.737083] [ T121] [c00000000a4b7da0] [c00000000004e100] eeh_reset_device+0x1f8/0x298
[ 32.737087] [ T121] [c00000000a4b7e50] [c00000000004ce5c] eeh_handle_normal_event+0x61c/0xa60
[ 32.737092] [ T121] [c00000000a4b7f30] [c00000000004e298] eeh_event_handler+0xf8/0x190
[ 32.737096] [ T121] [c00000000a4b7f90] [c00000000025dab4] kthread+0x194/0x1b0
[ 32.737099] [ T121] [c00000000a4b7fe0] [c00000000000dcd8] start_kernel_thread+0x14/0x18
[ 32.737101] [ T121] Code: 80ff0000 e95f0038 7fe9fb78 70e80002 408200a8 7d5f5378 e9090000 38c00000 39400001 7d08d838 7c28e000 7d4a309e <0b0a0000> 81490004 e9090068 714a0102
[ 32.737113] [ T121] ---[ end trace 0000000000000000 ]---
[ 32.737724] [ T121] pci 0014:01:00.0: No hypervisor support for SR-IOV on this device, IOV BARs disabled.
[ 32.738962] [ T121] pci 0014:01:00.0: supports D1 D2
[ 32.738965] [ T121] pci 0014:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 32.740551] [ T121] pci 0014:01:00.0: Adding to iommu group 0
[ 32.753259] [ T121] pci 0014:01:00.0: enabling device (0140 -> 0142)
[ 32.754712] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 32.754720] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 1
[ 32.754811] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 32.754813] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 32.754819] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 32.754820] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 32.755010] [ T121] xhci_hcd 0014:01:00.0: hcc params 0x0270f06d hci version 0x96 quirks 0x0000000004000000
[ 32.756925] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 32.756930] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 2
[ 32.756934] [ T121] xhci_hcd 0014:01:00.0: Host supports USB 3.0 SuperSpeed
[ 32.756991] [ T121] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
[ 32.756994] [ T121] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 32.756996] [ T121] usb usb1: Product: xHCI Host Controller
[ 32.756997] [ T121] usb usb1: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 32.756999] [ T121] usb usb1: SerialNumber: 0014:01:00.0
[ 32.757462] [ T121] hub 1-0:1.0: USB hub found
[ 32.757526] [ T121] hub 1-0:1.0: 4 ports detected
[ 32.757603] [ T121] xhci_hcd 0014:01:00.0: xHCI host controller not responding, assume dead
[ 32.757626] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 32.757713] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 32.757725] [ T121] xhci_hcd 0014:01:00.0: USB bus 2 deregistered
[ 32.757728] [ T121] xhci_hcd 0014:01:00.0: remove, state 1
[ 32.757731] [ T121] usb usb1: USB disconnect, device number 1
[ 32.758548] [ T121] xhci_hcd 0014:01:00.0: USB bus 1 deregistered
[ 32.758616] [ T121] xhci_hcd 0014:01:00.0: probe with driver xhci_hcd failed with error -108
[ 32.769268] [ T121] EEH: Notify device driver to resume
[ 32.769272] [ T121] EEH: Beginning: 'resume'
[ 32.769274] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 32.769277] [ T121] EEH: Finished:'resume'
[ 32.769278] [ T121] EEH: Recovery successful.
[ 32.769466] [ T121] EEH: Recovering PHB#14-PE#10000
[ 32.769476] [ T121] EEH: PE location: N/A, PHB location: N/A
[ 32.769480] [ T121] EEH: Frozen PHB#14-PE#10000 detected
[ 32.769485] [ T121] EEH: Call Trace:
[ 32.769487] [ T121] EEH: [000000001f1698b1] __eeh_send_failure_event+0xa8/0x190
[ 32.769498] [ T121] EEH: [000000008a51cc61] eeh_dev_check_failure+0x408/0x7a0
[ 32.769505] [ T121] EEH: [000000006ec66e06] xhci_portsc_readl+0x64/0x90 [xhci_hcd]
[ 32.769523] [ T121] EEH: [0000000088769cf2] xhci_hub_control+0xe28/0x27f0 [xhci_hcd]
[ 32.769542] [ T121] EEH: [00000000fbba7f7a] usb_hcd_submit_urb+0x508/0xd30 [usbcore]
[ 32.769562] [ T121] EEH: [000000003c3af5d9] usb_submit_urb+0x254/0x840 [usbcore]
[ 32.769582] [ T121] EEH: [00000000636aad98] usb_start_wait_urb+0x88/0x270 [usbcore]
[ 32.769601] [ T121] EEH: [00000000c4b1d0b5] usb_control_msg+0x134/0x1f0 [usbcore]
[ 32.769620] [ T121] EEH: [0000000003f2146d] hub_probe+0x570/0x12b8 [usbcore]
[ 32.769638] [ T121] EEH: [00000000f479c03a] usb_probe_interface+0x124/0x490 [usbcore]
[ 32.769658] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 32.769664] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 32.769670] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 32.769675] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 32.769681] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 32.769688] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 32.769693] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 32.769699] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 32.769703] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 32.769710] [ T121] EEH: [0000000041b13797] usb_set_configuration+0x78c/0xb60 [usbcore]
[ 32.769730] [ T121] EEH: [00000000129fbbb0] usb_generic_driver_probe+0x78/0xd0 [usbcore]
[ 32.769749] [ T121] EEH: [000000006e13a13a] usb_probe_device+0x60/0x200 [usbcore]
[ 32.769768] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 32.769774] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 32.769780] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 32.769785] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 32.769791] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 32.769797] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 32.769803] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 32.769808] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 32.769814] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 32.769820] [ T121] EEH: [00000000128463eb] usb_new_device+0x2f4/0x890 [usbcore]
[ 32.769838] [ T121] EEH: [0000000042394a64] register_root_hub+0x1e4/0x2a0 [usbcore]
[ 32.769858] [ T121] EEH: [00000000a33afbd1] usb_add_hcd+0x82c/0x8f0 [usbcore]
[ 32.769876] [ T121] EEH: [000000008fafad0e] xhci_pci_common_probe+0x1e4/0x3d0 [xhci_pci]
[ 32.769883] [ T121] EEH: [0000000081280f6e] local_pci_probe+0x64/0x100
[ 32.769890] [ T121] EEH: [00000000e1b257ca] pci_device_probe+0x330/0x370
[ 32.769896] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 32.769901] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 32.769907] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 32.769913] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 32.769928] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 32.769938] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 32.769945] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 32.769952] [ T121] EEH: [00000000deb502bd] pci_bus_add_device+0xb0/0xf0
[ 32.769960] [ T121] EEH: [0000000063f3148c] pci_bus_add_devices+0x54/0xb0
[ 32.769967] [ T121] EEH: [000000000c3763a7] pcibios_finish_adding_to_bus+0xd4/0xf0
[ 32.769976] [ T121] EEH: [00000000759a7fd9] pci_hp_add_devices+0x78/0x2d0
[ 32.769984] [ T121] EEH: [00000000eec13ff4] eeh_reset_device+0x238/0x298
[ 32.769993] [ T121] EEH: [00000000ccea63cc] eeh_handle_normal_event+0x61c/0xa60
[ 32.770002] [ T121] EEH: [0000000075cb9a09] eeh_event_handler+0xf8/0x190
[ 32.770010] [ T121] EEH: [000000009e6f07b4] kthread+0x194/0x1b0
[ 32.770018] [ T121] EEH: [000000005f2fe52c] start_kernel_thread+0x14/0x18
[ 32.770027] [ T121] EEH: This PCI device has failed 5 times in the last hour and will be permanently disabled after 5 failures.
[ 32.770029] [ T121] EEH: Notify device drivers to shutdown
[ 32.770031] [ T121] EEH: Beginning: 'error_detected(IO frozen)'
[ 32.770033] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 32.770036] [ T121] EEH: Finished:'error_detected(IO frozen)' with aggregate recovery state:'none'
[ 32.770105] [ T121] EEH: Collect temporary log
[ 32.770654] [ T121] EEH: of node=0014:01:00.0
[ 32.770685] [ T121] EEH: PCI device/vendor: 8241104c
[ 32.770716] [ T121] EEH: PCI cmd/status register: 00100142
[ 32.770718] [ T121] EEH: PCI-E capabilities and status follow:
[ 32.770867] [ T121] EEH: PCI-E 00: 0002c010 000086c3 0010505f 00073c12
[ 32.771006] [ T121] EEH: PCI-E 10: 10120000 00000000 00000000 00000000
[ 32.771007] [ T121] EEH: PCI-E 20: 00000000
[ 32.771010] [ T121] EEH: PCI-E AER capability register set follows:
[ 32.771159] [ T121] EEH: PCI-E AER 00: 15020001 00000000 00000000 00462030
[ 32.771275] [ T121] EEH: PCI-E AER 10: 00000000 00002000 000001e0 00000000
[ 32.771391] [ T121] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000
[ 32.771422] [ T121] EEH: PCI-E AER 30: 00000000 00000000
[ 32.772641] [ T121] RTAS: event: 5, Type: Platform Error (224), Severity: 2
[ 32.772649] [ T121] EEH: Reset with hotplug activity
[ 35.083975] [ T121] EEH: Sleep 5s ahead of complete hotplug
[ 40.416942] [ T121] ------------[ cut here ]------------
[ 40.416958] [ T121] WARNING: arch/powerpc/kernel/eeh_pe.c:439 at eeh_pe_tree_remove+0xf8/0x2f0, CPU#8: eehd/121
[ 40.416974] [ T121] Modules linked in: mptcp_diag(E) xsk_diag(E) tcp_diag(E) udp_diag(E) raw_diag(E) inet_diag(E) unix_diag(E) af_packet_diag(E) netlink_diag(E) bonding(E) tls(E) af_packet(E) rfkill(E) nft_fib_inet(E) nft_fib_ipv4(E) nft_fib_ipv6(E) nft_fib(E) nft_reject_inet(E) nf_reject_ipv4(E) nf_reject_ipv6(E) nft_reject(E) nft_ct(E) nft_chain_nat(E) nf_nat(E) nf_conntrack(E) nf_defrag_ipv6(E) nf_defrag_ipv4(E) nf_tables(E) dm_mod(E) ibmveth(E) vmx_crypto(E) dax_pmem(E) rtc_generic(E) fuse(E) configfs(E) xhci_pci(E) ibmvscsi(E) scsi_transport_srp(E) sd_mod(E) scsi_dh_emc(E) scsi_dh_rdac(E) scsi_dh_alua(E) xhci_hcd(E) nd_pmem(E) sg(E) nd_btt(E) papr_scm(E) scsi_mod(E) scsi_common(E) libnvdimm(E) usbcore(E) pseries_wdt(E) usb_common(E) btrfs(E) xor(E) libblake2b(E) raid6_pq(E)
[ 40.417022] [ T121] CPU: 8 UID: 0 PID: 121 Comm: eehd Tainted: G W E 7.2.0-rc3+ #7 PREEMPT(lazy) 56dd0daef6afd14c09fd836e317bfce16293d3bd
[ 40.417027] [ T121] Tainted: [W]=WARN, [E]=UNSIGNED_MODULE
[ 40.417028] [ T121] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1120.00 (NH1120_135) hv:phyp pSeries
[ 40.417030] [ T121] NIP: c00000000004a048 LR: c00000000004ba6c CTR: c00000000004ba10
[ 40.417032] [ T121] REGS: c00000000a4b79d0 TRAP: 0700 Tainted: G W E (7.2.0-rc3+)
[ 40.417035] [ T121] MSR: 800000000282b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE> CR: 28000842 XER: 00000001
[ 40.417044] [ T121] CFAR: c00000000004a004 IRQMASK: 0
GPR00: c00000000004ba6c c00000000a4b7c90 c000000001e18100 c000000003950df0
GPR04: 0000000000000000 0000000000000000 0000000000000000 0000000000000004
GPR08: 0000010000000000 c0000000038a0800 0000000000000001 0000000088000242
GPR12: c00000000004ba10 c0000018fffd8480 c00000000025d928 c0000000091134c0
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000002
GPR24: 0000000000000005 0000000000000002 0000000000000000 0000010200000000
GPR28: 0000010000000000 5deadbeef0000122 5deadbeef0000100 c0000000038a3000
[ 40.417074] [ T121] NIP [c00000000004a048] eeh_pe_tree_remove+0xf8/0x2f0
[ 40.417078] [ T121] LR [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 40.417082] [ T121] Call Trace:
[ 40.417083] [ T121] [c00000000a4b7c90] [c00000000a83f800] 0xc00000000a83f800 (unreliable)
[ 40.417090] [ T121] [c00000000a4b7d30] [c00000000004ba6c] eeh_pe_detach_dev+0x5c/0xa0
[ 40.417094] [ T121] [c00000000a4b7d60] [c0000000000496ec] eeh_pe_traverse+0x6c/0xf0
[ 40.417098] [ T121] [c00000000a4b7da0] [c00000000004e100] eeh_reset_device+0x1f8/0x298
[ 40.417102] [ T121] [c00000000a4b7e50] [c00000000004ce5c] eeh_handle_normal_event+0x61c/0xa60
[ 40.417106] [ T121] [c00000000a4b7f30] [c00000000004e298] eeh_event_handler+0xf8/0x190
[ 40.417110] [ T121] [c00000000a4b7f90] [c00000000025dab4] kthread+0x194/0x1b0
[ 40.417113] [ T121] [c00000000a4b7fe0] [c00000000000dcd8] start_kernel_thread+0x14/0x18
[ 40.417116] [ T121] Code: 80ff0000 e95f0038 7fe9fb78 70e80002 408200a8 7d5f5378 e9090000 38c00000 39400001 7d08d838 7c28e000 7d4a309e <0b0a0000> 81490004 e9090068 714a0102
[ 40.417127] [ T121] ---[ end trace 0000000000000000 ]---
[ 40.417781] [ T121] pci 0014:01:00.0: No hypervisor support for SR-IOV on this device, IOV BARs disabled.
[ 40.419207] [ T121] pci 0014:01:00.0: supports D1 D2
[ 40.419210] [ T121] pci 0014:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 40.421006] [ T121] pci 0014:01:00.0: Adding to iommu group 0
[ 40.433287] [ T121] pci 0014:01:00.0: enabling device (0140 -> 0142)
[ 40.434777] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 40.434785] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 1
[ 40.434879] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 40.434881] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 40.434887] [ T121] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 40.434889] [ T121] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 40.435089] [ T121] xhci_hcd 0014:01:00.0: hcc params 0x0270f06d hci version 0x96 quirks 0x0000000004000000
[ 40.437046] [ T121] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 40.437051] [ T121] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 2
[ 40.437055] [ T121] xhci_hcd 0014:01:00.0: Host supports USB 3.0 SuperSpeed
[ 40.437125] [ T121] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
[ 40.437130] [ T121] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 40.437132] [ T121] usb usb1: Product: xHCI Host Controller
[ 40.437134] [ T121] usb usb1: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 40.437136] [ T121] usb usb1: SerialNumber: 0014:01:00.0
[ 40.437521] [ T121] hub 1-0:1.0: USB hub found
[ 40.437650] [ T121] hub 1-0:1.0: 4 ports detected
[ 40.437785] [ T121] xhci_hcd 0014:01:00.0: xHCI host controller not responding, assume dead
[ 40.437807] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 40.437996] [ T121] xhci_hcd 0014:01:00.0: HC died; cleaning up
[ 40.438020] [ T121] xhci_hcd 0014:01:00.0: USB bus 2 deregistered
[ 40.438026] [ T121] xhci_hcd 0014:01:00.0: remove, state 1
[ 40.438032] [ T121] usb usb1: USB disconnect, device number 1
[ 40.439194] [ T121] xhci_hcd 0014:01:00.0: USB bus 1 deregistered
[ 40.439262] [ T121] xhci_hcd 0014:01:00.0: probe with driver xhci_hcd failed with error -108
[ 40.450261] [ T121] EEH: Notify device driver to resume
[ 40.450264] [ T121] EEH: Beginning: 'resume'
[ 40.450265] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[ 40.450268] [ T121] EEH: Finished:'resume'
[ 40.450269] [ T121] EEH: Recovery successful.
[ 40.450464] [ T121] EEH: Recovering PHB#14-PE#10000
[ 40.450474] [ T121] EEH: PE location: N/A, PHB location: N/A
[ 40.450478] [ T121] EEH: Frozen PHB#14-PE#10000 detected
[ 40.450483] [ T121] EEH: Call Trace:
[ 40.450486] [ T121] EEH: [000000001f1698b1] __eeh_send_failure_event+0xa8/0x190
[ 40.450496] [ T121] EEH: [000000008a51cc61] eeh_dev_check_failure+0x408/0x7a0
[ 40.450503] [ T121] EEH: [000000006ec66e06] xhci_portsc_readl+0x64/0x90 [xhci_hcd]
[ 40.450520] [ T121] EEH: [0000000088769cf2] xhci_hub_control+0xe28/0x27f0 [xhci_hcd]
[ 40.450540] [ T121] EEH: [00000000fbba7f7a] usb_hcd_submit_urb+0x508/0xd30 [usbcore]
[ 40.450561] [ T121] EEH: [000000003c3af5d9] usb_submit_urb+0x254/0x840 [usbcore]
[ 40.450580] [ T121] EEH: [00000000636aad98] usb_start_wait_urb+0x88/0x270 [usbcore]
[ 40.450599] [ T121] EEH: [00000000c4b1d0b5] usb_control_msg+0x134/0x1f0 [usbcore]
[ 40.450617] [ T121] EEH: [0000000003f2146d] hub_probe+0x570/0x12b8 [usbcore]
[ 40.450636] [ T121] EEH: [00000000f479c03a] usb_probe_interface+0x124/0x490 [usbcore]
[ 40.450656] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 40.450662] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 40.450668] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 40.450682] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 40.450687] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 40.450694] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 40.450699] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 40.450705] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 40.450710] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 40.450716] [ T121] EEH: [0000000041b13797] usb_set_configuration+0x78c/0xb60 [usbcore]
[ 40.450736] [ T121] EEH: [00000000129fbbb0] usb_generic_driver_probe+0x78/0xd0 [usbcore]
[ 40.450756] [ T121] EEH: [000000006e13a13a] usb_probe_device+0x60/0x200 [usbcore]
[ 40.450775] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 40.450780] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 40.450786] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 40.450791] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 40.450797] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 40.450804] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 40.450809] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 40.450815] [ T121] EEH: [00000000a6567e0a] bus_probe_device+0x50/0xf0
[ 40.450820] [ T121] EEH: [000000005c80bed9] device_add+0x8f0/0xc00
[ 40.450826] [ T121] EEH: [00000000128463eb] usb_new_device+0x2f4/0x890 [usbcore]
[ 40.450844] [ T121] EEH: [0000000042394a64] register_root_hub+0x1e4/0x2a0 [usbcore]
[ 40.450864] [ T121] EEH: [00000000a33afbd1] usb_add_hcd+0x82c/0x8f0 [usbcore]
[ 40.450883] [ T121] EEH: [000000008fafad0e] xhci_pci_common_probe+0x1e4/0x3d0 [xhci_pci]
[ 40.450889] [ T121] EEH: [0000000081280f6e] local_pci_probe+0x64/0x100
[ 40.450896] [ T121] EEH: [00000000e1b257ca] pci_device_probe+0x330/0x370
[ 40.450902] [ T121] EEH: [00000000d5ea8429] really_probe+0x118/0x580
[ 40.450907] [ T121] EEH: [0000000059aafce1] __driver_probe_device+0xc4/0x270
[ 40.450925] [ T121] EEH: [000000007054476a] driver_probe_device+0x5c/0x110
[ 40.450945] [ T121] EEH: [000000008f7cc20f] __device_attach_driver+0x10c/0x210
[ 40.450954] [ T121] EEH: [0000000050bfed94] bus_for_each_drv+0xb0/0x130
[ 40.450963] [ T121] EEH: [0000000093e33bb5] __device_attach+0xdc/0x2a0
[ 40.450970] [ T121] EEH: [0000000050f06050] device_initial_probe+0x70/0x80
[ 40.450977] [ T121] EEH: [00000000deb502bd] pci_bus_add_device+0xb0/0xf0
[ 40.450985] [ T121] EEH: [0000000063f3148c] pci_bus_add_devices+0x54/0xb0
[ 40.450992] [ T121] EEH: [000000000c3763a7] pcibios_finish_adding_to_bus+0xd4/0xf0
[ 40.451002] [ T121] EEH: [00000000759a7fd9] pci_hp_add_devices+0x78/0x2d0
[ 40.451011] [ T121] EEH: [00000000eec13ff4] eeh_reset_device+0x238/0x298
[ 40.451024] [ T121] EEH: [00000000ccea63cc] eeh_handle_normal_event+0x61c/0xa60
[ 40.451038] [ T121] EEH: [0000000075cb9a09] eeh_event_handler+0xf8/0x190
[ 40.451051] [ T121] EEH: [000000009e6f07b4] kthread+0x194/0x1b0
[ 40.451063] [ T121] EEH: [000000005f2fe52c] start_kernel_thread+0x14/0x18
[ 40.451075] [ T121] EEH: PHB#14-PE#10000 has failed 6 times in the last hour and has been permanently disabled.
[ 40.451089] [ T121] EEH: Unable to recover from failure from PHB#14-PE#10000.
Please try reseating or replacing it
[ 40.451810] [ T121] EEH: of node=0014:01:00.0
[ 40.451848] [ T121] EEH: PCI device/vendor: 8241104c
[ 40.451886] [ T121] EEH: PCI cmd/status register: 00100142
[ 40.451888] [ T121] EEH: PCI-E capabilities and status follow:
[ 40.452104] [ T121] EEH: PCI-E 00: 0002c010 000086c3 0010505f 00073c12
[ 40.452257] [ T121] EEH: PCI-E 10: 10120000 00000000 00000000 00000000
[ 40.452260] [ T121] EEH: PCI-E 20: 00000000
[ 40.452262] [ T121] EEH: PCI-E AER capability register set follows:
[ 40.452414] [ T121] EEH: PCI-E AER 00: 15020001 00000000 00000000 00462030
[ 40.452531] [ T121] EEH: PCI-E AER 10: 00000000 00002000 000001e0 00000000
[ 40.452647] [ T121] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000
[ 40.452677] [ T121] EEH: PCI-E AER 30: 00000000 00000000
[ 40.454063] [ T121] RTAS: event: 6, Type: Platform Error (224), Severity: 2
[ 40.454092] [ T121] EEH: Beginning: 'error_detected(permanent failure)'
[ 40.454095] [ T121] PCI 0014:01:00.0#10000: EEH: no driver
[-- Attachment #3: disabl_radix.txt --]
[-- Type: text/plain, Size: 49969 bytes --]
[ 0.000000] [ T0] crashkernel reserved: 0x0000000020000000 - 0x000000022cd00000 (8397 MB)
[ 0.000000] [ T0] hash-mmu: Page sizes from device-tree:
[ 0.000000] [ T0] hash-mmu: base_shift=12: shift=12, sllp=0x0000, avpnm=0x00000000, tlbiel=1, penc=0
[ 0.000000] [ T0] hash-mmu: base_shift=12: shift=16, sllp=0x0000, avpnm=0x00000000, tlbiel=1, penc=7
[ 0.000000] [ T0] hash-mmu: base_shift=12: shift=24, sllp=0x0000, avpnm=0x00000000, tlbiel=1, penc=56
[ 0.000000] [ T0] hash-mmu: base_shift=16: shift=16, sllp=0x0110, avpnm=0x00000000, tlbiel=1, penc=1
[ 0.000000] [ T0] hash-mmu: base_shift=16: shift=24, sllp=0x0110, avpnm=0x00000000, tlbiel=1, penc=8
[ 0.000000] [ T0] hash-mmu: base_shift=24: shift=24, sllp=0x0100, avpnm=0x00000001, tlbiel=0, penc=0
[ 0.000000] [ T0] hash-mmu: base_shift=34: shift=34, sllp=0x0120, avpnm=0x000007ff, tlbiel=0, penc=3
[ 0.000000] [ T0] hash-mmu: Huge page(16GB) memory: addr = 0xC800000000 size = 0x400000000 pages = 1
[ 0.000000] [ T0] hash-mmu: Huge page(16GB) memory: addr = 0xCC00000000 size = 0x400000000 pages = 1
[ 0.000000] [ T0] hash-mmu: Huge page(16GB) memory: addr = 0xD000000000 size = 0x400000000 pages = 1
[ 0.000000] [ T0] hash-mmu: Huge page(16GB) memory: addr = 0xD400000000 size = 0x400000000 pages = 1
[ 0.000000] [ T0] Enabling pkeys with max key count 31
[ 0.000000] [ T0] Activating Kernel Userspace Access Prevention
[ 0.000000] [ T0] Activating Kernel Userspace Execution Prevention
[ 0.000000] [ T0] hash-mmu: Page orders: linear mapping = 24, virtual = 16, io = 16, vmemmap = 24
[ 0.000000] [ T0] hash-mmu: Using 1TB segments
[ 0.000000] [ T0] hash-mmu: Initializing hash mmu with SLB
[ 0.000000] [ T0] Linux version 7.2.0-rc3+ (root@ltcden10-lp2.ltc.tadn.ibm.com) (gcc (SUSE Linux) 15.2.0, GNU ld (GNU Binutils; SUSE Linux 16) 2.45.0.20251103-1600992) #7 SMP PREEMPT_DYNAMIC Fri Jul 17 11:05:38 IST 2026
[ 0.000000] [ T0] OF: reserved mem: Reserved memory: No reserved-memory node in the DT
[ 0.000000] [ T0] Found initrd at 0xc000000010f00000:0xc00000001246962b
[ 0.000000] [ T0] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1120.00 (NH1120_135) hv:phyp pSeries
[ 0.000000] [ T0] printk: legacy bootconsole [udbg0] enabled
[ 0.000000] [ T0] Partition configured for 16 cpus.
[ 0.000000] [ T0] CPU maps initialized for 8 threads per core
[ 0.000000] [ T0] (thread shift is 3)
[ 0.000000] [ T0] Allocated 3072 bytes for 16 pacas
[ 0.000000] [ T0] numa: Partition configured for 32 NUMA nodes.
[ 0.000000] [ T0] -----------------------------------------------------
[ 0.000000] [ T0] phys_mem_size = 0x2900000000
[ 0.000000] [ T0] dcache_bsize = 0x80
[ 0.000000] [ T0] icache_bsize = 0x80
[ 0.000000] [ T0] cpu_features = 0x003c00eb8f5f9187
[ 0.000000] [ T0] possible = 0x003ffbebcf5fb187
[ 0.000000] [ T0] always = 0x0000000380008181
[ 0.000000] [ T0] cpu_user_features = 0xdc0065c2 0xaef60000
[ 0.000000] [ T0] mmu_features = 0xfc006e01
[ 0.000000] [ T0] possible = 0x00000000fe00fe41
[ 0.000000] [ T0] always = 0x0000000000000000
[ 0.000000] [ T0] firmware_features = 0x00001dbfc45bfc57
[ 0.000000] [ T0] vmalloc start = 0xc008000000000000
[ 0.000000] [ T0] IO start = 0xc00a000000000000
[ 0.000000] [ T0] vmemmap start = 0xc00c000000000000
[ 0.000000] [ T0] hash-mmu: ppc64_pft_size = 0x21
[ 0.000000] [ T0] hash-mmu: htab_hash_mask = 0x3ffffff
[ 0.000000] [ T0] -----------------------------------------------------
[ 0.000000] [ T0] NODE_DATA(0) allocated [mem 0x18fff50200-0x18fff57fff]
[ 0.000000] [ T0] NODE_DATA(0) on node 1
[ 0.000000] [ T0] NODE_DATA(1) allocated [mem 0x18fff48400-0x18fff501ff]
[ 0.000000] [ T0] NODE_DATA(2) allocated [mem 0x18fff40600-0x18fff483ff]
[ 0.000000] [ T0] NODE_DATA(2) on node 1
[ 0.000000] [ T0] NODE_DATA(3) allocated [mem 0x18fff38800-0x18fff405ff]
[ 0.000000] [ T0] NODE_DATA(3) on node 1
[ 0.000000] [ T0] rfi-flush: fallback displacement flush available
[ 0.000000] [ T0] rfi-flush: patched 10 locations (no flush)
[ 0.000000] [ T0] count-cache-flush: hardware flush enabled.
[ 0.000000] [ T0] link-stack-flush: software flush enabled.
[ 0.000000] [ T0] entry-flush: patched 61 locations (no flush)
[ 0.000000] [ T0] uaccess-flush: patched 1 locations (no flush)
[ 0.000000] [ T0] stf-barrier: eieio barrier available
[ 0.000000] [ T0] stf-barrier: patched 61 entry locations (no barrier)
[ 0.000000] [ T0] stf-barrier: patched 10 exit locations (no barrier)
[ 0.000000] [ T0] lpar: H_BLOCK_REMOVE supports base psize:0 psize:0 block size:8
[ 0.000000] [ T0] lpar: H_BLOCK_REMOVE supports base psize:0 psize:2 block size:8
[ 0.000000] [ T0] lpar: H_BLOCK_REMOVE supports base psize:0 psize:10 block size:8
[ 0.000000] [ T0] lpar: H_BLOCK_REMOVE supports base psize:2 psize:2 block size:8
[ 0.000000] [ T0] lpar: H_BLOCK_REMOVE supports base psize:2 psize:10 block size:8
[ 0.000000] [ T0] PPC64 nvram contains 15360 bytes
[ 0.000000] [ T0] barrier-nospec: using ORI speculation barrier
[ 0.000000] [ T0] barrier-nospec: patched 162 locations
[ 0.000000] [ T0] Top of RAM: 0xd800000000, Total RAM: 0x2900000000
[ 0.000000] [ T0] Memory hole size: 716800MB
[ 0.000000] [ T0] Zone ranges:
[ 0.000000] [ T0] Normal [mem 0x0000000000000000-0x000000d7ffffffff]
[ 0.000000] [ T0] Device empty
[ 0.000000] [ T0] Movable zone start for each node
[ 0.000000] [ T0] Early memory node ranges
[ 0.000000] [ T0] node 1: [mem 0x0000000000000000-0x00000018ffffffff]
[ 0.000000] [ T0] node 2: [mem 0x000000c800000000-0x000000cbffffffff]
[ 0.000000] [ T0] node 0: [mem 0x000000cc00000000-0x000000cfffffffff]
[ 0.000000] [ T0] node 2: [mem 0x000000d000000000-0x000000d3ffffffff]
[ 0.000000] [ T0] node 0: [mem 0x000000d400000000-0x000000d7ffffffff]
[ 0.000000] [ T0] Initmem setup node 0 [mem 0x000000cc00000000-0x000000d7ffffffff]
[ 0.000000] [ T0] Initmem setup node 1 [mem 0x0000000000000000-0x00000018ffffffff]
[ 0.000000] [ T0] Initmem setup node 2 [mem 0x000000c800000000-0x000000d3ffffffff]
[ 0.000000] [ T0] Initmem setup node 3 as memoryless
[ 0.000000] [ T0] Initmem setup node 4 as memoryless
[ 0.000000] [ T0] Initmem setup node 5 as memoryless
[ 0.000000] [ T0] Initmem setup node 6 as memoryless
[ 0.000000] [ T0] Initmem setup node 7 as memoryless
[ 0.000000] [ T0] Initmem setup node 8 as memoryless
[ 0.000000] [ T0] Initmem setup node 9 as memoryless
[ 0.000000] [ T0] Initmem setup node 10 as memoryless
[ 0.000000] [ T0] Initmem setup node 11 as memoryless
[ 0.000000] [ T0] Initmem setup node 12 as memoryless
[ 0.000000] [ T0] Initmem setup node 13 as memoryless
[ 0.000000] [ T0] Initmem setup node 14 as memoryless
[ 0.000000] [ T0] Initmem setup node 15 as memoryless
[ 0.000000] [ T0] Initmem setup node 16 as memoryless
[ 0.000000] [ T0] Initmem setup node 17 as memoryless
[ 0.000000] [ T0] Initmem setup node 18 as memoryless
[ 0.000000] [ T0] Initmem setup node 19 as memoryless
[ 0.000000] [ T0] Initmem setup node 20 as memoryless
[ 0.000000] [ T0] Initmem setup node 21 as memoryless
[ 0.000000] [ T0] Initmem setup node 22 as memoryless
[ 0.000000] [ T0] Initmem setup node 23 as memoryless
[ 0.000000] [ T0] Initmem setup node 24 as memoryless
[ 0.000000] [ T0] Initmem setup node 25 as memoryless
[ 0.000000] [ T0] Initmem setup node 26 as memoryless
[ 0.000000] [ T0] Initmem setup node 27 as memoryless
[ 0.000000] [ T0] Initmem setup node 28 as memoryless
[ 0.000000] [ T0] Initmem setup node 29 as memoryless
[ 0.000000] [ T0] Initmem setup node 30 as memoryless
[ 0.000000] [ T0] Initmem setup node 31 as memoryless
[ 0.000000] [ T0] percpu: Embedded 4 pages/cpu s126744 r0 d135400 u262144
[ 0.000000] [ T0] pcpu-alloc: s126744 r0 d135400 u262144 alloc=1*1048576
[ 0.000000] [ T0] pcpu-alloc: [0] 00 01 02 03 [0] 04 05 06 07
[ 0.000000] [ T0] pcpu-alloc: [0] 08 09 10 11 [0] 12 13 14 15
[ 0.000000] [ T0] Kernel command line: BOOT_IMAGE=/boot/vmlinux-7.2.0-rc3+ root=UUID=89c9257f-1cb4-46d9-bbae-ec812ea746e3 mitigations=auto quiet security=selinux crashkernel=8397M disable_radix=1
[ 0.000000] [ T0] random: crng init done
[ 0.000000] [ T0] printk: log_buf_len individual max cpu contribution: 32768 bytes
[ 0.000000] [ T0] printk: log_buf_len total cpu_extra contributions: 491520 bytes
[ 0.000000] [ T0] printk: log_buf_len min size: 524288 bytes
[ 0.000000] [ T0] printk: log buffer data + meta data: 1048576 + 3670016 = 4718592 bytes
[ 0.000000] [ T0] printk: early log buf free: 516856(98%)
[ 0.000000] [ T0] Fallback order for Node 0: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 1: 1 2 0
[ 0.000000] [ T0] Fallback order for Node 2: 2 0 1
[ 0.000000] [ T0] Fallback order for Node 3: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 4: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 5: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 6: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 7: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 8: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 9: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 10: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 11: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 12: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 13: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 14: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 15: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 16: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 17: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 18: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 19: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 20: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 21: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 22: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 23: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 24: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 25: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 26: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 27: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 28: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 29: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 30: 0 2 1
[ 0.000000] [ T0] Fallback order for Node 31: 0 2 1
[ 0.000000] [ T0] Built 4 zonelists, mobility grouping on. Total pages: 2686976
[ 0.000000] [ T0] Policy zone: Normal
[ 0.000000] [ T0] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] [ T0] SLUB: Unable to allocate memory from node 0
[ 0.000000] [ T0] SLUB: Allocating a useless per node structure in order to be able to continue
[ 0.000000] [ T0] SLUB: Unable to allocate memory from node 2
[ 0.000000] [ T0] SLUB: Allocating a useless per node structure in order to be able to continue
[ 0.000000] [ T0] SLUB: HWalign=128, Order=0-3, MinObjects=0, CPUs=16, Nodes=32
[ 0.000000] [ T0] ftrace: allocating 43701 entries in 17 pages
[ 0.000000] [ T0] ftrace: allocated 17 pages with 2 groups
[ 0.000000] [ T0] Dynamic Preempt: lazy
[ 0.000000] [ T0] rcu: Preemptible hierarchical RCU implementation.
[ 0.000000] [ T0] rcu: RCU event tracing is enabled.
[ 0.000000] [ T0] rcu: RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=16.
[ 0.000000] [ T0] Trampoline variant of Tasks RCU enabled.
[ 0.000000] [ T0] Rude variant of Tasks RCU enabled.
[ 0.000000] [ T0] Tracing variant of Tasks RCU enabled.
[ 0.000000] [ T0] rcu: RCU calculated value of scheduler-enlistment delay is 100 jiffies.
[ 0.000000] [ T0] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=16
[ 0.000000] [ T0] RCU Tasks: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=16.
[ 0.000000] [ T0] RCU Tasks Rude: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=16.
[ 0.000000] [ T0] NR_IRQS: 512, nr_irqs: 512, preallocated irqs: 16
[ 0.000000] [ T0] xive: Using IRQ range [400000-40000f]
[ 0.000000] [ T0] xive: Interrupt handling initialized with spapr backend
[ 0.000000] [ T0] xive: Using priority 7 for all interrupts
[ 0.000000] [ T0] xive: Using 64kB queues
[ 0.000000] [ T0] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.000000] [ T0] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275000 ns
[ 0.000000] [ T0] time_init: decrementer frequency = 512.000000 MHz
[ 0.000000] [ T0] time_init: processor frequency = 3650.000000 MHz
[ 0.000001] [ T0] time_init: 56 bit decrementer (max: 7fffffffffffff)
[ 0.000003] [ T0] clocksource: timebase: mask: 0xffffffffffffffff max_cycles: 0x761537d007, max_idle_ns: 440795202126 ns
[ 0.000005] [ T0] clocksource: timebase mult[1f40000] shift[24] registered
[ 0.000010] [ T0] clockevent: decrementer mult[83126f] shift[24] cpu[0]
[ 0.000201] [ T0] Console: colour dummy device 80x25
[ 0.000207] [ T0] printk: legacy console [hvc0] enabled
[ 0.000209] [ T0] printk: legacy bootconsole [udbg0] disabled
[ 0.000276] [ T0] mempolicy: Enabling automatic NUMA balancing. Configure with numa_balancing= or the kernel.numa_balancing sysctl
[ 0.000298] [ T0] pid_max: default: 32768 minimum: 301
[ 0.000953] [ T0] landlock: Up and running.
[ 0.000955] [ T0] Yama: becoming mindful.
[ 0.000975] [ T0] SELinux: Initializing.
[ 0.002593] [ T0] LSM support for eBPF active
[ 0.007293] [ T0] Dentry cache hash table entries: 8388608 (order: 10, 67108864 bytes, vmalloc)
[ 0.009528] [ T0] Inode-cache hash table entries: 4194304 (order: 9, 33554432 bytes, vmalloc)
[ 0.009666] [ T0] Mount-cache hash table entries: 131072 (order: 4, 1048576 bytes, vmalloc)
[ 0.009741] [ T0] Mountpoint-cache hash table entries: 131072 (order: 4, 1048576 bytes, vmalloc)
[ 0.009965] [ T0] VFS: Finished mounting rootfs on nullfs
[ 0.011116] [ T1] Power11 performance monitor hardware support registered
[ 0.011166] [ T1] rcu: Hierarchical SRCU implementation.
[ 0.011168] [ T1] rcu: Max phase no-delay instances is 400.
[ 0.011212] [ T1] Timer migration: 2 hierarchy levels; 8 children per group; 0 crossnode level
[ 0.011952] [ T1] smp: Bringing up secondary CPUs ...
[ 0.016234] [ T1] smp: Brought up 4 nodes, 16 CPUs
[ 0.016242] [ T1] numa: Node 0 CPUs:
[ 0.016244] [ T1] numa: Node 1 CPUs: 0-15
[ 0.016247] [ T1] numa: Node 2 CPUs:
[ 0.016249] [ T1] numa: Node 3 CPUs:
[ 0.016251] [ T1] Big cores detected but using small core scheduling
[ 0.022392] [ T102] node 1 deferred pages initialised in 6ms
[ 0.022441] [ T1] Memory: 95858688K/171966464K available (19456K kernel code, 4224K rwdata, 13312K rodata, 7616K init, 2129K bss, 75969664K reserved, 0K cma-reserved)
[ 0.023139] [ T1] devtmpfs: initialized
[ 0.025377] [ T1] PCI host bridge /pci@800000020000014 ranges:
[ 0.025385] [ T1] MEM 0x0000040000000000..0x000004007effffff -> 0x0000000080000000
[ 0.025388] [ T1] MEM 0x0000044000000000..0x0000047fffffffff -> 0x0006320000000000
[ 0.025583] [ T1] posixtimers hash table entries: 8192 (order: 1, 131072 bytes, vmalloc)
[ 0.025644] [ T1] futex hash table entries: 128 (16384 bytes on 32 NUMA nodes, total 512 KiB, linear).
[ 0.032430] [ T1] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[ 0.032805] [ T1] audit: initializing netlink subsys (disabled)
[ 0.032880] [ T114] audit: type=2000 audit(1784267045.032:1): state=initialized audit_enabled=0 res=1
[ 0.041825] [ T1] thermal_sys: Registered thermal governor 'fair_share'
[ 0.041828] [ T1] thermal_sys: Registered thermal governor 'bang_bang'
[ 0.041829] [ T1] thermal_sys: Registered thermal governor 'step_wise'
[ 0.041830] [ T1] thermal_sys: Registered thermal governor 'user_space'
[ 0.041876] [ T1] cpuidle: using governor ladder
[ 0.041892] [ T1] cpuidle: using governor menu
[ 0.041985] [ T1] RTAS daemon started
[ 0.042214] [ T1] pstore: Using crash dump compression: deflate
[ 0.042216] [ T1] pstore: Registered nvram as persistent store backend
[ 0.043250] [ T1] EEH: pSeries platform initialized
[ 0.043397] [ T1] plpks: POWER LPAR Platform KeyStore is not supported or enabled
[ 0.045283] [ T1] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[ 0.046910] [ T1] HugeTLB: registered 16.0 MiB page size, pre-allocated 0 pages
[ 0.046913] [ T1] HugeTLB: 0 KiB vmemmap can be freed for a 16.0 MiB page
[ 0.046917] [ T1] HugeTLB: registered 16.0 GiB page size, pre-allocated 0 pages
[ 0.046920] [ T1] HugeTLB: 0 KiB vmemmap can be freed for a 16.0 GiB page
[ 0.049021] [ T1] iommu: Default domain type: Translated
[ 0.049023] [ T1] iommu: DMA domain TLB invalidation policy: strict mode
[ 0.052685] [ T1] pps_core: LinuxPPS API ver. 1 registered
[ 0.052687] [ T1] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 0.052692] [ T1] PTP clock support registered
[ 0.052706] [ T1] EDAC MC: Ver: 3.0.0
[ 0.053206] [ T1] NetLabel: Initializing
[ 0.053208] [ T1] NetLabel: domain hash size = 128
[ 0.053210] [ T1] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
[ 0.053284] [ T1] NetLabel: unlabeled traffic allowed by default
[ 0.053292] [ T1] mctp: management component transport protocol core
[ 0.053294] [ T1] NET: Registered PF_MCTP protocol family
[ 0.053324] [ T1] PCI: Probing PCI hardware
[ 0.053451] [ T1] PCI host bridge to bus 0014:01
[ 0.053463] [ T1] pci_bus 0014:01: root bus resource [mem 0x40000000000-0x4007effffff] (bus address [0x80000000-0xfeffffff])
[ 0.053469] [ T1] pci_bus 0014:01: root bus resource [mem 0x44000000000-0x47fffffffff 64bit] (bus address [0x6320000000000-0x6323fffffffff])
[ 0.053474] [ T1] pci_bus 0014:01: root bus resource [bus 01-ff]
[ 0.054366] [ T1] pci 0014:01:00.0: No hypervisor support for SR-IOV on this device, IOV BARs disabled.
[ 0.056472] [ T1] pci 0014:01:00.0: supports D1 D2
[ 0.056475] [ T1] pci 0014:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 0.087239] [ T1] IOMMU table initialized, virtual merging enabled
[ 0.087378] [ T1] pci_bus 0014:01: resource 4 [mem 0x40000000000-0x4007effffff]
[ 0.087382] [ T1] pci_bus 0014:01: resource 5 [mem 0x44000000000-0x47fffffffff 64bit]
[ 0.087473] [ T1] pci 0014:01:00.0: ibm,query-pe-dma-windows(53) 10000 8000000 20000014 returned 0, lb=1000000 ps=103 wn=1
[ 0.087485] [ T1] pci 0014:01:00.0: Adding to iommu group 0
[ 0.101244] [ T1] EEH: Capable adapter found: recovery enabled.
[ 0.101246] [ T1] PCI: Probing PCI hardware done
[ 0.101341] [ T1] vgaarb: loaded
[ 0.101521] [ T1] clocksource: Switched to clocksource timebase
[ 0.102128] [ T1] VFS: Disk quotas dquot_6.6.0
[ 0.102161] [ T1] VFS: Dquot-cache hash table entries: 8192 (65536 bytes)
[ 0.104548] [ T1] NET: Registered PF_INET protocol family
[ 0.104729] [ T1] IP idents hash table entries: 262144 (order: 5, 2097152 bytes, vmalloc)
[ 0.108178] [ T1] tcp_listen_portaddr_hash hash table entries: 65536 (order: 4, 1048576 bytes, vmalloc)
[ 0.108286] [ T1] Table-perturb hash table entries: 65536 (order: 2, 262144 bytes, vmalloc)
[ 0.108299] [ T1] TCP established hash table entries: 524288 (order: 6, 4194304 bytes, vmalloc)
[ 0.108945] [ T1] TCP bind hash table entries: 65536 (order: 5, 2097152 bytes, vmalloc)
[ 0.109155] [ T1] TCP: Hash tables configured (established 524288 bind 65536)
[ 0.109365] [ T1] MPTCP token hash table entries: 65536 (order: 5, 1572864 bytes, vmalloc)
[ 0.109514] [ T1] UDP hash table entries: 65536 (order: 6, 4194304 bytes, vmalloc)
[ 0.110073] [ T1] NET: Registered PF_UNIX/PF_LOCAL protocol family
[ 0.110083] [ T1] NET: Registered PF_XDP protocol family
[ 0.110207] [ T1] pci 0014:01:00.0: enabling device (0144 -> 0146)
[ 0.110587] [ T1] PCI: CLS 128 bytes, default 128
[ 0.110707] [ T96] Unpacking initramfs...
[ 0.111440] [ T1] papr-hvpipe: hvpipe feature is enabled
[ 0.176249] [ T1] vio_register_device_node: node lid missing 'reg'
[ 0.176368] [ T1] vas: API is supported only with radix page tables
[ 0.177183] [ T1] hv-24x7: read 548 catalog entries, created 387 event attrs (0 failures), 387 descs
[ 0.181005] [ T1] Initialise system trusted keyrings
[ 0.181044] [ T1] Key type blacklist registered
[ 0.181148] [ T1] workingset: timestamp_bits=38 (anon: 33) max_order=21 bucket_order=0 (anon: 0)
[ 0.181576] [ T1] integrity: Platform Keyring initialized
[ 0.181581] [ T1] integrity: Machine keyring initialized
[ 0.181582] [ T1] Allocating IMA blacklist keyring.
[ 0.191791] [ T1] Key type asymmetric registered
[ 0.191793] [ T1] Asymmetric key parser 'x509' registered
[ 0.191821] [ T1] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[ 0.191877] [ T1] io scheduler mq-deadline registered
[ 0.191879] [ T1] io scheduler kyber registered
[ 0.191912] [ T1] io scheduler bfq registered
[ 0.195690] [ T1] ledtrig-cpu: registered to indicate activity on CPUs
[ 0.195733] [ T1] rpaphp: RPA HOT Plug PCI Controller Driver version: 0.1
[ 0.195896] [ T1] rpaphp: Slot [U78D8.ND0.FGD004Y-P0-C4-C0] registered
[ 0.196345] [ T1] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[ 0.196838] [ T1] Non-volatile memory driver v1.3
[ 0.196840] [ T1] pseries_rng: Registering IBM pSeries RNG driver
[ 0.197152] [ C2] tpm_ibmvtpm 30000003: CRQ initialization completed
[ 0.284836] [ T96] Freeing initrd memory: 21888K
[ 1.258075] [ T1] mousedev: PS/2 mouse device common for all mice
[ 1.258201] [ T1] xcede: xcede_record_size = 10
[ 1.258203] [ T1] xcede: Record 0 : hint = 1, latency = 0x1800 tb ticks, Wake-on-irq = 1
[ 1.258205] [ T1] xcede: Record 1 : hint = 2, latency = 0x3c00 tb ticks, Wake-on-irq = 0
[ 1.258206] [ T1] cpuidle: Skipping the 2 Extended CEDE idle states
[ 1.258207] [ T1] cpuidle: Fixed up CEDE exit latency to 12 us
[ 1.258430] [ T1] pseries_idle_driver registered
[ 1.258469] [ T1] nx_compress_pseries ibm,compression-v1: nx842_OF_upd: device disabled
[ 1.258497] [ T1] NX-GZIP is not supported. Returned=-524
[ 1.258556] [ T1] hid: raw HID events driver (C) Jiri Kosina
[ 1.258588] [ T1] drop_monitor: Initializing network drop monitor service
[ 1.258738] [ T1] NET: Registered PF_INET6 protocol family
[ 1.259107] [ T1] Segment Routing with IPv6
[ 1.259108] [ T1] RPL Segment Routing with IPv6
[ 1.259119] [ T1] In-situ OAM (IOAM) with IPv6
[ 1.259137] [ T1] PFKEY is deprecated and scheduled to be removed in 2027, please contact the netdev mailing list
[ 1.259140] [ T1] NET: Registered PF_KEY protocol family
[ 1.259209] [ T1] secvar-sysfs: Failed to retrieve secvar operations
[ 1.260983] [ T1] registered taskstats version 1
[ 1.261459] [ T1] Loading compiled-in X.509 certificates
[ 1.262167] [ T1] Loaded X.509 cert 'Build time autogenerated kernel key: 1bed38dafb8769e8ad27e7b933b25570d07757a0'
[ 1.268308] [ T1] Demotion targets for Node 0: null
[ 1.268309] [ T1] Demotion targets for Node 1: null
[ 1.268311] [ T1] Demotion targets for Node 2: null
[ 1.268329] [ T1] page_owner is disabled
[ 1.268612] [ T1] Key type .fscrypt registered
[ 1.268614] [ T1] Key type fscrypt-provisioning registered
[ 1.285376] [ T1] Key type encrypted registered
[ 1.285406] [ T1] Secure boot mode disabled
[ 1.285416] [ T1] Loading compiled-in module X.509 certificates
[ 1.286071] [ T1] Loaded X.509 cert 'Build time autogenerated kernel key: 1bed38dafb8769e8ad27e7b933b25570d07757a0'
[ 1.286074] [ T1] ima: Allocated hash algorithm: sha256
[ 1.305553] [ T1] Secure boot mode disabled
[ 1.305569] [ T1] Trusted boot mode disabled
[ 1.305571] [ T1] ima: No architecture policies found
[ 1.305599] [ T1] evm: Initialising EVM extended attributes:
[ 1.305600] [ T1] evm: security.selinux
[ 1.305601] [ T1] evm: security.SMACK64 (disabled)
[ 1.305603] [ T1] evm: security.SMACK64EXEC (disabled)
[ 1.305604] [ T1] evm: security.SMACK64TRANSMUTE (disabled)
[ 1.305605] [ T1] evm: security.SMACK64MMAP (disabled)
[ 1.305606] [ T1] evm: security.apparmor
[ 1.305607] [ T1] evm: security.ima
[ 1.305608] [ T1] evm: security.capability
[ 1.305609] [ T1] evm: HMAC attrs: 0x1
[ 1.305628] [ T1] Running certificate verification RSA selftest
[ 1.306165] [ T1] Loaded X.509 cert 'Certificate verification self-testing key: f58703bb33ce1b73ee02eccdee5b8817518fe3db'
[ 1.306713] [ T1] Running certificate verification ECDSA selftest
[ 1.312684] [ T1] Loaded X.509 cert 'Certificate verification ECDSA self-testing key: 2900bcea1deb7bc8479a84a23d758efdfdd2b2d3'
[ 1.314491] [ T1] SED: plpks not available
[ 1.315851] [ T1] clk: Disabling unused clocks
[ 1.317669] [ T1] Freeing unused kernel image (initmem) memory: 7616K
[ 1.317910] [ T1] Checked W+X mappings: passed, no W+X pages found
[ 1.317922] [ T1] Run /init as init process
[ 1.317923] [ T1] with arguments:
[ 1.317925] [ T1] /init
[ 1.317926] [ T1] with environment:
[ 1.317927] [ T1] HOME=/
[ 1.317928] [ T1] TERM=linux
[ 1.334538] [ T1] systemd[1]: Successfully made /usr/ read-only.
[ 1.334708] [ T1] systemd[1]: systemd 257.13+suse.40.g59336000ef running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +IPE -SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK -BTF -XKBCOMMON -UTMP +SYSVINIT +LIBARCHIVE)
[ 1.334713] [ T1] systemd[1]: Detected virtualization powervm.
[ 1.334718] [ T1] systemd[1]: Detected architecture ppc64-le.
[ 1.334722] [ T1] systemd[1]: Running in initrd.
[ 1.334899] [ T1] systemd[1]: No hostname configured, using default hostname.
[ 1.334976] [ T1] systemd[1]: Hostname set to <localhost>.
[ 1.392837] [ T1] systemd[1]: /usr/lib/systemd/system/plymouth-start.service:15: Unit uses KillMode=none. This is unsafe, as it disables systemd's process lifecycle management for the service. Please update the service to use a safer KillMode=, such as 'mixed' or 'control-group'. Support for KillMode=none is deprecated and will eventually be removed.
[ 1.393077] [ T1] systemd[1]: /usr/lib/systemd/system/systemd-ask-password-plymouth.service:10: ConditionPathExists= path is not absolute, ignoring: ${localstatedir}/run/plymouth/pid
[ 1.397387] [ T1] systemd[1]: Queued start job for default target Initrd Default Target.
[ 1.409857] [ T1] systemd[1]: Expecting device /dev/disk/by-uuid/89c9257f-1cb4-46d9-bbae-ec812ea746e3...
[ 1.409905] [ T1] systemd[1]: Reached target Initrd /usr File System.
[ 1.409932] [ T1] systemd[1]: Reached target Slice Units.
[ 1.409951] [ T1] systemd[1]: Reached target Swaps.
[ 1.409966] [ T1] systemd[1]: Reached target Timer Units.
[ 1.410061] [ T1] systemd[1]: Listening on Journal Socket (/dev/log).
[ 1.410147] [ T1] systemd[1]: Listening on Journal Sockets.
[ 1.410220] [ T1] systemd[1]: Listening on udev Control Socket.
[ 1.410268] [ T1] systemd[1]: Listening on udev Kernel Socket.
[ 1.410283] [ T1] systemd[1]: Reached target Socket Units.
[ 1.411341] [ T1] systemd[1]: Starting Create List of Static Device Nodes...
[ 1.413204] [ T1] systemd[1]: Starting Journal Service...
[ 1.413359] [ T1] systemd[1]: Load Kernel Modules skipped, no trigger condition checks were met.
[ 1.413943] [ T1] systemd[1]: Starting Apply Kernel Variables...
[ 1.414617] [ T1] systemd[1]: Starting Virtual Console Setup...
[ 1.416698] [ T1] systemd[1]: Finished Create List of Static Device Nodes.
[ 1.417681] [ T1] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
[ 1.423041] [ T1] systemd[1]: Finished Apply Kernel Variables.
[ 1.426205] [ T1] systemd[1]: Finished Create Static Device Nodes in /dev gracefully.
[ 1.427019] [ T1] systemd[1]: Starting Create Static Device Nodes in /dev...
[ 1.435216] [ T1] systemd[1]: Finished Create Static Device Nodes in /dev.
[ 1.435338] [ T1] systemd[1]: Reached target Preparation for Local File Systems.
[ 1.435355] [ T1] systemd[1]: Reached target Local File Systems.
[ 1.437705] [ T216] systemd-journald[216]: Collecting audit messages is disabled.
[ 1.445479] [ T1] systemd[1]: Started Journal Service.
[ 1.586297] [ T341] raid6_pq: module verification failed: signature and/or required key missing - tainting kernel
[ 1.587156] [ T341] raid6: using intx1 recovery algorithm
[ 1.603555] [ T341] raid6: int64x1 gen() 5437 MB/s
[ 1.620535] [ T341] raid6: int64x2 gen() 6070 MB/s
[ 1.637529] [ T341] raid6: int64x4 gen() 7523 MB/s
[ 1.654544] [ T341] raid6: int64x8 gen() 8015 MB/s
[ 1.671537] [ T341] raid6: altivecx1 gen() 13546 MB/s
[ 1.688530] [ T341] raid6: altivecx2 gen() 17625 MB/s
[ 1.705518] [ T341] raid6: altivecx4 gen() 20320 MB/s
[ 1.722541] [ T341] raid6: altivecx8 gen() 14648 MB/s
[ 1.739528] [ T341] raid6: vpermxor1 gen() 19781 MB/s
[ 1.756522] [ T341] raid6: vpermxor2 gen() 23648 MB/s
[ 1.773533] [ T341] raid6: vpermxor4 gen() 26718 MB/s
[ 1.790525] [ T341] raid6: vpermxor8 gen() 34054 MB/s
[ 1.790528] [ T341] raid6: using algorithm vpermxor8 gen() 34054 MB/s
[ 1.791403] [ T341] xor: measuring software checksum speed
[ 1.791513] [ T341] altivec : 30661 MB/sec
[ 1.791707] [ T341] 32regs_prefetch : 17091 MB/sec
[ 1.791868] [ T341] 32regs : 20676 MB/sec
[ 1.792050] [ T341] 8regs_prefetch : 18172 MB/sec
[ 1.792209] [ T341] 8regs : 20748 MB/sec
[ 1.792210] [ T341] xor: using function: altivec (30661 MB/sec)
[ 2.014902] [ T341] Btrfs loaded, assert=on, zoned=yes, fsverity=yes
[ 2.212639] [ T363] usbcore: registered new interface driver usbfs
[ 2.212663] [ T363] usbcore: registered new interface driver hub
[ 2.212692] [ T363] usbcore: registered new device driver usb
[ 2.214721] [ T369] papr_scm ibm,persistent-memory:ibm,pmemory@44104001: Permission denied while accessing performance stats
[ 2.214771] [ T384] SCSI subsystem initialized
[ 2.214989] [ T369] papr_scm ibm,persistent-memory:ibm,pmemory@44104001: nvdimm pmu didn't register rc=-2
[ 2.225804] [ T384] alua: device handler registered
[ 2.227029] [ T384] rdac: device handler registered
[ 2.227887] [ T384] emc: device handler registered
[ 2.237434] [ T363] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 2.237442] [ T363] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 1
[ 2.237640] [ T363] xhci_hcd 0014:01:00.0: ibm,query-pe-dma-windows(53) 10000 8000000 20000014 returned 0, lb=1000000 ps=103 wn=1
[ 2.237645] [ T363] xhci_hcd 0014:01:00.0: Skipping ibm,pmemory
[ 2.242146] [ T384] ibmvscsi 30000066: SRP_VERSION: 16.a
[ 2.242340] [ T384] ibmvscsi 30000066: Maximum ID: 64 Maximum LUN: 32 Maximum Channel: 3
[ 2.242344] [ T384] scsi host0: IBM POWER Virtual SCSI Adapter 1.5.9
[ 2.242656] [ C8] ibmvscsi 30000066: partner initialization complete
[ 2.242681] [ C8] ibmvscsi 30000066: host srp version: 16.a, host partition ltcden10-vios1 (100), OS 3, max io 262144
[ 2.242722] [ C8] ibmvscsi 30000066: Client reserve enabled
[ 2.242725] [ C8] ibmvscsi 30000066: sent SRP login
[ 2.242749] [ C8] ibmvscsi 30000066: SRP_LOGIN succeeded
[ 2.248739] [ T363] xhci_hcd 0014:01:00.0: ibm,create-pe-dma-window(54) 10000 8000000 20000014 15 28 returned 0 (liobn = 0x70000014 starting addr = 8000000 0)
[ 2.252186] [ T363] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 2.252189] [ T363] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 2.252198] [ T363] xhci_hcd 0014:01:00.0: lsa_required: 0, lsa_enabled: 0, direct mapping: 1
[ 2.252200] [ T363] xhci_hcd 0014:01:00.0: iommu: 64-bit OK but direct DMA is limited by 800010000000000
[ 2.252345] [ T363] xhci_hcd 0014:01:00.0: hcc params 0x0270f06d hci version 0x96 quirks 0x0000000004000000
[ 2.253930] [ T100] scsi 0:0:1:0: Direct-Access AIX VDASD 0001 PQ: 0 ANSI: 3
[ 2.254376] [ T363] xhci_hcd 0014:01:00.0: xHCI Host Controller
[ 2.254382] [ T363] xhci_hcd 0014:01:00.0: new USB bus registered, assigned bus number 2
[ 2.254389] [ T363] xhci_hcd 0014:01:00.0: Host supports USB 3.0 SuperSpeed
[ 2.254493] [ T363] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 7.02
[ 2.254497] [ T363] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 2.254499] [ T363] usb usb1: Product: xHCI Host Controller
[ 2.254501] [ T363] usb usb1: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 2.254503] [ T363] usb usb1: SerialNumber: 0014:01:00.0
[ 2.254664] [ T363] hub 1-0:1.0: USB hub found
[ 2.254689] [ T363] hub 1-0:1.0: 4 ports detected
[ 2.254973] [ T363] usb usb2: We don't know the algorithms for LPM for this host, disabling LPM.
[ 2.255019] [ T363] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 7.02
[ 2.255022] [ T363] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 2.255024] [ T363] usb usb2: Product: xHCI Host Controller
[ 2.255027] [ T363] usb usb2: Manufacturer: Linux 7.2.0-rc3+ xhci-hcd
[ 2.255029] [ T363] usb usb2: SerialNumber: 0014:01:00.0
[ 2.255160] [ T363] hub 2-0:1.0: USB hub found
[ 2.255173] [ T363] hub 2-0:1.0: 4 ports detected
[ 2.264313] [ T100] sd 0:0:1:0: Attached scsi generic sg0 type 0
[ 2.264554] [ T409] sd 0:0:1:0: [sda] 26214400 4096-byte logical blocks: (107 GB/100 GiB)
[ 2.264586] [ T409] sd 0:0:1:0: [sda] Write Protect is off
[ 2.264589] [ T409] sd 0:0:1:0: [sda] Mode Sense: 17 00 00 08
[ 2.264618] [ T409] sd 0:0:1:0: [sda] Cache data unavailable
[ 2.264620] [ T409] sd 0:0:1:0: [sda] Assuming drive cache: write through
[ 2.283344] [ T409] sda: sda1 sda2 sda3
[ 2.283484] [ T409] sd 0:0:1:0: [sda] Attached SCSI disk
[ 2.433766] [ T426] BTRFS: device fsid 89c9257f-1cb4-46d9-bbae-ec812ea746e3 devid 1 transid 347017 /dev/sda2 (8:2) scanned by mount (426)
[ 2.434487] [ T426] BTRFS info (device sda2): first mount of filesystem 89c9257f-1cb4-46d9-bbae-ec812ea746e3
[ 2.434492] [ T426] BTRFS info (device sda2): using crc32c checksum algorithm
[ 2.442612] [ T426] BTRFS info (device sda2): enabling ssd optimizations
[ 2.442615] [ T426] BTRFS info (device sda2): enabling free space tree
[ 2.576717] [ T242] usb 2-4: new SuperSpeed USB device number 2 using xhci_hcd
[ 2.580317] [ T216] systemd-journald[216]: Received SIGTERM from PID 1 (systemd).
[ 2.592822] [ T242] usb 2-4: New USB device found, idVendor=0781, idProduct=5581, bcdDevice= 1.00
[ 2.592826] [ T242] usb 2-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2.592828] [ T242] usb 2-4: Product: SanDisk 3.2Gen1
[ 2.592830] [ T242] usb 2-4: Manufacturer: USB
[ 2.592831] [ T242] usb 2-4: SerialNumber: 04018bb37d56d0d1d4c3e570a894d4096f6e109c38abd5a0f85e0a74814412213009000000000000000000005886fadfff017e18815581079f3258b6
[ 2.638260] [ T114] audit: type=1404 audit(1784267047.637:2): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295 enabled=1 old-enabled=1 lsm=selinux res=1
[ 2.775267] [ T1] SELinux: Permission firmware_load in class system not defined in policy.
[ 2.775272] [ T1] SELinux: Permission kexec_image_load in class system not defined in policy.
[ 2.775274] [ T1] SELinux: Permission kexec_initramfs_load in class system not defined in policy.
[ 2.775275] [ T1] SELinux: Permission policy_load in class system not defined in policy.
[ 2.775276] [ T1] SELinux: Permission x509_certificate_load in class system not defined in policy.
[ 2.775343] [ T1] SELinux: Permission map_create_as in class bpf not defined in policy.
[ 2.775344] [ T1] SELinux: Permission prog_load_as in class bpf not defined in policy.
[ 2.775348] [ T1] SELinux: Permission allowed in class io_uring not defined in policy.
[ 2.775350] [ T1] SELinux: Class memfd_file not defined in policy.
[ 2.775351] [ T1] SELinux: the above unknown classes and permissions will be allowed
[ 2.777698] [ T1] SELinux: policy capability network_peer_controls=1
[ 2.777700] [ T1] SELinux: policy capability open_perms=1
[ 2.777702] [ T1] SELinux: policy capability extended_socket_class=1
[ 2.777703] [ T1] SELinux: policy capability always_check_network=0
[ 2.777704] [ T1] SELinux: policy capability cgroup_seclabel=1
[ 2.777705] [ T1] SELinux: policy capability nnp_nosuid_transition=1
[ 2.777706] [ T1] SELinux: policy capability genfs_seclabel_symlinks=1
[ 2.777707] [ T1] SELinux: policy capability ioctl_skip_cloexec=0
[ 2.777708] [ T1] SELinux: policy capability userspace_initial_context=0
[ 2.777709] [ T1] SELinux: policy capability netlink_xperm=0
[ 2.777710] [ T1] SELinux: policy capability netif_wildcard=0
[ 2.777711] [ T1] SELinux: policy capability genfs_seclabel_wildcard=0
[ 2.777712] [ T1] SELinux: policy capability functionfs_seclabel=0
[ 2.777713] [ T1] SELinux: policy capability memfd_class=0
[ 2.777714] [ T1] SELinux: policy capability bpf_token_perms=0
[ 2.817079] [ T114] audit: type=1403 audit(1784267047.816:3): auid=4294967295 ses=4294967295 lsm=selinux res=1
[ 2.818714] [ T1] systemd[1]: Successfully loaded SELinux policy in 180.607ms.
[ 2.874458] [ T1] systemd[1]: Relabeled /dev/, /dev/shm/, /run/ in 22.607ms.
[ 2.877960] [ T1] systemd[1]: systemd 257.13+suse.40.g59336000ef running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +IPE -SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK -BTF -XKBCOMMON -UTMP +SYSVINIT +LIBARCHIVE)
[ 2.877968] [ T1] systemd[1]: Detected virtualization powervm.
[ 2.877975] [ T1] systemd[1]: Detected architecture ppc64-le.
[ 2.965716] [ T1] systemd[1]: bpf-restrict-fs: LSM BPF program attached
[ 3.098293] [ T1] systemd[1]: /usr/lib/systemd/system/plymouth-start.service:15: Unit uses KillMode=none. This is unsafe, as it disables systemd's process lifecycle management for the service. Please update the service to use a safer KillMode=, such as 'mixed' or 'control-group'. Support for KillMode=none is deprecated and will eventually be removed.
[ 3.098724] [ T1] systemd[1]: /usr/lib/systemd/system/systemd-ask-password-plymouth.service:10: ConditionPathExists= path is not absolute, ignoring: ${localstatedir}/run/plymouth/pid
[ 3.183486] [ T1] systemd[1]: initrd-switch-root.service: Deactivated successfully.
[ 3.183624] [ T1] systemd[1]: Stopped Switch Root.
[ 3.184613] [ T1] systemd[1]: systemd-journald.service: Scheduled restart job, restart counter is at 1.
[ 3.186021] [ T1] systemd[1]: Created slice Slice /system/getty.
[ 3.186931] [ T1] systemd[1]: Created slice Slice /system/modprobe.
[ 3.187706] [ T1] systemd[1]: Created slice Slice /system/serial-getty.
[ 3.190017] [ T1] systemd[1]: Created slice User and Session Slice.
[ 3.190088] [ T1] systemd[1]: Dispatch Password Requests to Console Directory Watch skipped, unmet condition check ConditionPathExists=!/run/plymouth/pid
[ 3.190171] [ T1] systemd[1]: Arbitrary Executable File Formats File System Automount Point skipped, unmet condition check ConditionPathExists=/proc/sys/fs/binfmt_misc
[ 3.190185] [ T1] systemd[1]: Expecting device /dev/disk/by-uuid/89c9257f-1cb4-46d9-bbae-ec812ea746e3...
[ 3.190213] [ T1] systemd[1]: Expecting device /dev/disk/by-uuid/e695f9c0-9eab-4fcb-9c70-f18a4f4b6849...
[ 3.190245] [ T1] systemd[1]: Expecting device /dev/hvc0...
[ 3.190279] [ T1] systemd[1]: Reached target Local Encrypted Volumes.
[ 3.190329] [ T1] systemd[1]: Stopped target Switch Root.
[ 3.190370] [ T1] systemd[1]: Stopped target Initrd File Systems.
[ 3.190403] [ T1] systemd[1]: Stopped target Initrd Root File System.
[ 3.190437] [ T1] systemd[1]: Reached target Local Integrity Protected Volumes.
[ 3.190483] [ T1] systemd[1]: Reached target Remote File Systems.
[ 3.190515] [ T1] systemd[1]: Reached target Slice Units.
[ 3.190568] [ T1] systemd[1]: Reached target System Time Set.
[ 3.190627] [ T1] systemd[1]: Reached target Local Verity Protected Volumes.
[ 3.191146] [ T1] systemd[1]: Listening on Device-mapper event daemon FIFOs.
[ 3.192488] [ T1] systemd[1]: Listening on LVM2 poll daemon socket.
[ 3.193049] [ T1] systemd[1]: Listening on Syslog Socket.
[ 3.194757] [ T1] systemd[1]: Listening on Process Core Dump Socket.
[ 3.195805] [ T1] systemd[1]: Listening on Credential Encryption/Decryption.
[ 3.196599] [ T1] systemd[1]: Listening on udev Control Socket.
[ 3.196924] [ T1] systemd[1]: Listening on udev Kernel Socket.
[ 3.200769] [ T1] systemd[1]: Mounting Huge Pages File System...
[ 3.203588] [ T1] systemd[1]: Mounting POSIX Message Queue File System...
[ 3.206590] [ T1] systemd[1]: Mounting Kernel Debug File System...
[ 3.209562] [ T1] systemd[1]: Mounting Kernel Trace File System...
[ 3.211733] [ T1] systemd[1]: Starting Availability of block devices...
[ 3.214185] [ T1] systemd[1]: Starting Create List of Static Device Nodes...
[ 3.215661] [ T1] systemd[1]: Starting Load Kernel Module configfs...
[ 3.217445] [ T1] systemd[1]: Starting Load Kernel Module drm...
[ 3.218982] [ T1] systemd[1]: Starting Load Kernel Module efi_pstore...
[ 3.220683] [ T1] systemd[1]: Starting Load Kernel Module fuse...
[ 3.220818] [ T1] systemd[1]: plymouth-switch-root.service: Deactivated successfully.
[ 3.220893] [ T1] systemd[1]: Stopped Plymouth switch root service.
[ 3.221112] [ T1] systemd[1]: systemd-fsck-root.service: Deactivated successfully.
[ 3.221188] [ T1] systemd[1]: Stopped File System Check on Root Device.
[ 3.225245] [ T1] systemd[1]: Starting Journal Service...
[ 3.225856] [ T1] systemd[1]: Load Kernel Modules skipped, no trigger condition checks were met.
[ 3.225919] [ T1] systemd[1]: Apply Kernel Variables for 7.2.0-rc3+ from /boot skipped, unmet condition check ConditionPathExists=/boot/sysctl.conf-7.2.0-rc3+
[ 3.225939] [ T1] systemd[1]: Apply Kernel Variables for 7.2.0-rc3+ skipped, unmet condition check ConditionPathExists=/usr/lib/modules/7.2.0-rc3+/sysctl.conf
[ 3.227622] [ T1] systemd[1]: Starting Remount Root and Kernel File Systems...
[ 3.229465] [ T1] systemd[1]: Starting Apply Kernel Variables...
[ 3.231271] [ T1] systemd[1]: Starting Load udev Rules from Credentials...
[ 3.233020] [ T1] systemd[1]: Starting Coldplug All udev Devices...
[ 3.237462] [ T1] systemd[1]: Mounted Huge Pages File System.
[ 3.237867] [ T1] systemd[1]: Mounted POSIX Message Queue File System.
[ 3.238156] [ T1] systemd[1]: Mounted Kernel Debug File System.
[ 3.238467] [ T1] systemd[1]: Mounted Kernel Trace File System.
[ 3.239014] [ T1] systemd[1]: Finished Availability of block devices.
[ 3.239576] [ T1] systemd[1]: Finished Create List of Static Device Nodes.
[ 3.240062] [ T1] systemd[1]: modprobe@drm.service: Deactivated successfully.
[ 3.240255] [ T1] systemd[1]: Finished Load Kernel Module drm.
[ 3.240733] [ T1] systemd[1]: modprobe@efi_pstore.service: Deactivated successfully.
[ 3.240916] [ T1] systemd[1]: Finished Load Kernel Module efi_pstore.
[ 3.243254] [ T1] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
[ 3.245256] [ T1] systemd[1]: Finished Remount Root and Kernel File Systems.
[ 3.246135] [ T1] systemd[1]: Rebuild Hardware Database skipped, unmet condition check ConditionNeedsUpdate=/etc
[ 3.247351] [ T1] systemd[1]: modprobe@configfs.service: Deactivated successfully.
[ 3.247544] [ T1] systemd[1]: Finished Load Kernel Module configfs.
[ 3.252590] [ T1] systemd[1]: Mounting Kernel Configuration File System...
[ 3.254773] [ T1] systemd[1]: Finished Apply Kernel Variables.
[ 3.258827] [ T1] systemd[1]: Finished Load udev Rules from Credentials.
[ 3.261121] [ T1] systemd[1]: Mounted Kernel Configuration File System.
[ 3.266249] [ T524] systemd-journald[524]: Collecting audit messages is disabled.
[ 3.271125] [ T1] systemd[1]: Started Journal Service.
[ 3.303817] [ T523] fuse: init (API version 7.45)
[ 3.468154] [ T571] rtc-generic rtc-generic: registered as rtc0
[ 3.468210] [ T571] rtc-generic rtc-generic: setting system clock to 2026-07-17T05:44:09 UTC (1784267049)
[ 3.491833] [ T618] ibmveth: IBM Power Virtual Ethernet Driver 1.06
[ 3.510857] [ T643] ibmveth 30000005 env5: renamed from eth2
[ 3.511009] [ T592] ibmveth 30000004 env4: renamed from eth1
[ 3.511147] [ T590] ibmveth 30000002 env2: renamed from eth0
[ 3.533939] [ T620] usb-storage 2-4:1.0: USB Mass Storage device detected
[ 3.534185] [ T620] scsi host1: usb-storage 2-4:1.0
[ 3.534423] [ T620] usbcore: registered new interface driver usb-storage
[ 3.541507] [ T620] usbcore: registered new interface driver uas
[ 3.579011] [ T745] Adding 2098048k swap on /dev/sda3. Priority:-1 extents:1 across:2098048k SS
[ 4.243130] [ T524] systemd-journald[524]: Received client request to flush runtime journal.
[ 4.577865] [ T786] scsi 1:0:0:0: Direct-Access USB SanDisk 3.2Gen1 1.00 PQ: 0 ANSI: 6
[ 4.578605] [ T786] sd 1:0:0:0: Attached scsi generic sg1 type 0
[ 4.585640] [ T100] sd 1:0:0:0: [sdb] 60125184 512-byte logical blocks: (30.8 GB/28.7 GiB)
[ 4.586905] [ T100] sd 1:0:0:0: [sdb] Write Protect is off
[ 4.586908] [ T100] sd 1:0:0:0: [sdb] Mode Sense: 43 00 00 00
[ 4.587404] [ T100] sd 1:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 4.731856] [ T100] sdb: sdb1
[ 4.732029] [ T100] sd 1:0:0:0: [sdb] Attached SCSI removable disk
[ 5.545400] [ T878] device-mapper: uevent: version 1.0.3
[ 5.545589] [ T878] device-mapper: ioctl: 4.50.0-ioctl (2025-04-28) initialised: dm-devel@lists.linux.dev
[ 6.832350] [ T1068] NET: Registered PF_PACKET protocol family
[ 7.150258] [ T1181] SELinux: unrecognized netlink message: protocol=4 nlmsg_type=19 sclass=netlink_tcpdiag_socket pid=1181 comm=ss
[ 7.743602] [ T1291] SELinux: unrecognized netlink message: protocol=4 nlmsg_type=19 sclass=netlink_tcpdiag_socket pid=1291 comm=ss
[ 12.347329] [ T1085] fbcon: Taking over console
^ permalink raw reply
* [PATCH 1/3] powerpc/dts: mpc5121: Move GPIO controller properties to SoC dtsi
From: Dmitry Torokhov @ 2026-07-19 5:22 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Anatolij Gustschin
Cc: devicetree, linuxppc-dev, linux-kernel
In-Reply-To: <20260718-ads7846-pdm360ng-v1-0-f318f85cda57@gmail.com>
Define gpio@1100 with label gpio_pic as a GPIO controller and
interrupt controller directly in mpc5121.dtsi so all MPC5121 boards
inherit the correct controller capabilities.
Remove the redundant local controller property declaration block from
ac14xx.dts.
Assisted-by: Antigravity:gemini-3.5-flash
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
arch/powerpc/boot/dts/ac14xx.dts | 13 -------------
arch/powerpc/boot/dts/mpc5121.dtsi | 6 +++++-
2 files changed, 5 insertions(+), 14 deletions(-)
diff --git a/arch/powerpc/boot/dts/ac14xx.dts b/arch/powerpc/boot/dts/ac14xx.dts
index 5d8877e1f4ad..05fcf08df1ca 100644
--- a/arch/powerpc/boot/dts/ac14xx.dts
+++ b/arch/powerpc/boot/dts/ac14xx.dts
@@ -148,19 +148,6 @@ clock@f00 {
compatible = "fsl,mpc5121rev2-clock", "fsl,mpc5121-clock";
};
- /*
- * GPIO PIC:
- * interrupts cell = <pin nr, sense>
- * sense == 8: Level, low assertion
- * sense == 2: Edge, high-to-low change
- */
- gpio_pic: gpio@1100 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- };
-
sdhc@1500 {
cd-gpios = <&gpio_pic 23 0>; /* card detect */
wp-gpios = <&gpio_pic 24 0>; /* write protect */
diff --git a/arch/powerpc/boot/dts/mpc5121.dtsi b/arch/powerpc/boot/dts/mpc5121.dtsi
index a278fb7b9e71..9c5dacb94b92 100644
--- a/arch/powerpc/boot/dts/mpc5121.dtsi
+++ b/arch/powerpc/boot/dts/mpc5121.dtsi
@@ -146,10 +146,14 @@ pmc@1000 {
interrupts = <83 0x8>;
};
- gpio@1100 {
+ gpio_pic: gpio@1100 {
compatible = "fsl,mpc5121-gpio";
reg = <0x1100 0x100>;
interrupts = <78 0x8>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
};
can@1300 {
--
2.55.0.229.g6434b31f56-goog
^ permalink raw reply related
* [PATCH 0/3] powerpc: 512x: Convert ADS7845 touchscreen on PDM360NG to device tree
From: Dmitry Torokhov @ 2026-07-19 5:22 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Anatolij Gustschin
Cc: devicetree, linuxppc-dev, linux-kernel
The reason for this series is to remove support for platform data in the
ads7846 touchscreen driver, as pdm360ng is the last user of legacy
platform data in the kernel for this driver.
This series converts the ADS7845 touchscreen on the PDM360NG board to
use Device Tree bindings instead of legacy platform data callbacks:
- Move GPIO controller capabilities into mpc5121.dtsi so all MPC5121
boards inherit proper controller definitions, and remove redundant
local declarations from ac14xx.dts
- Update pdm360ng.dts to use "ti,ads7845" with pendown-gpio and
interrupt-parent referencing gpio_pic
- Add "ifm,pdm360ng" to mpc512x_generic.c and delete obsolete
pdm360ng.c.
This change has been discussed in '24i but I just got around to
implementing this:
https://lore.kernel.org/r/ZoNHLjmSvCN12vU5@google.com/
Note that this should compile but I have not tried this on real
hardware.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
Dmitry Torokhov (3):
powerpc/dts: mpc5121: Move GPIO controller properties to SoC dtsi
powerpc/dts: pdm360ng: Convert ADS7845 touchscreen to DT bindings
powerpc/512x: Remove pdm360ng platform setup in favor of mpc512x_generic
arch/powerpc/boot/dts/ac14xx.dts | 13 ---
arch/powerpc/boot/dts/mpc5121.dtsi | 6 +-
arch/powerpc/boot/dts/pdm360ng.dts | 7 +-
arch/powerpc/platforms/512x/Kconfig | 3 +-
arch/powerpc/platforms/512x/Makefile | 1 -
arch/powerpc/platforms/512x/mpc512x_generic.c | 1 +
arch/powerpc/platforms/512x/pdm360ng.c | 126 --------------------------
7 files changed, 12 insertions(+), 145 deletions(-)
---
base-commit: 8e9685d3c41c35dd1b37df70d854137abcb2fbac
change-id: 20260717-ads7846-pdm360ng-ec7ed9f72f82
Thanks.
--
Dmitry
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox