* [PATCH v3 0/3] PCI Controller event and LTSSM tracepoint support
@ 2026-01-12 1:19 Shawn Lin
2026-01-12 1:19 ` [PATCH v3 1/3] PCI: trace: Add PCI controller LTSSM transition tracepoint Shawn Lin
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Shawn Lin @ 2026-01-12 1:19 UTC (permalink / raw)
To: Manivannan Sadhasivam, Bjorn Helgaas
Cc: linux-rockchip, linux-pci, linux-trace-kernel, linux-doc,
Steven Rostedt, Masami Hiramatsu, Shawn Lin
This patch-set adds new pci controller event and LTSSM tracepoint used by host drivers
which provide LTSSM trace functionality. The first user is pcie-dw-rockchip with a 256
Bytes FIFO for recording LTSSM transition.
Dependency
======
Need to apply on top of Mani's rework of error handling of dw_pcie_wait_for_link()
API in order to show the proper LTSSM name for dwc-based controller[1].
[1] https://lore.kernel.org/linux-pci/20260107-pci-dwc-suspend-rework-v4-0-9b5f3c72df0a@oss.qualcomm.com/T/#mfc5885b2afdeef4db1322597eaee61967558821e
Testing
=======
This series was tested on RK3588/RK3588s EVB1 with NVMe SSD connected to PCIe3 and PCIe2
root ports.
echo 1 > /sys/kernel/debug/tracing/events/pci_controller/pcie_ltssm_state_transition/enable
cat /sys/kernel/debug/tracing/trace_pipe
# tracer: nop
#
# entries-in-buffer/entries-written: 64/64 #P:8
#
# _-----=> irqs-off/BH-disabled
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / _-=> migrate-disable
# |||| / delay
# TASK-PID CPU# ||||| TIMESTAMP FUNCTION
# | | | ||||| | |
kworker/0:0-9 [000] ..... 5.600194: pcie_ltssm_state_transition: dev: a40000000.pcie state: DETECT_ACT rate: Unknown
kworker/0:0-9 [000] ..... 5.600198: pcie_ltssm_state_transition: dev: a40000000.pcie state: DETECT_WAIT rate: Unknown
kworker/0:0-9 [000] ..... 5.600199: pcie_ltssm_state_transition: dev: a40000000.pcie state: DETECT_ACT rate: Unknown
kworker/0:0-9 [000] ..... 5.600201: pcie_ltssm_state_transition: dev: a40000000.pcie state: POLL_ACTIVE rate: Unknown
kworker/0:0-9 [000] ..... 5.600202: pcie_ltssm_state_transition: dev: a40000000.pcie state: POLL_CONFIG rate: Unknown
kworker/0:0-9 [000] ..... 5.600204: pcie_ltssm_state_transition: dev: a40000000.pcie state: CFG_LINKWD_START rate: Unknown
kworker/0:0-9 [000] ..... 5.600206: pcie_ltssm_state_transition: dev: a40000000.pcie state: CFG_LINKWD_ACEPT rate: Unknown
kworker/0:0-9 [000] ..... 5.600207: pcie_ltssm_state_transition: dev: a40000000.pcie state: CFG_LANENUM_WAI rate: Unknown
kworker/0:0-9 [000] ..... 5.600208: pcie_ltssm_state_transition: dev: a40000000.pcie state: CFG_LANENUM_ACEPT rate: Unknown
kworker/0:0-9 [000] ..... 5.600210: pcie_ltssm_state_transition: dev: a40000000.pcie state: CFG_COMPLETE rate: Unknown
kworker/0:0-9 [000] ..... 5.600212: pcie_ltssm_state_transition: dev: a40000000.pcie state: CFG_IDLE rate: Unknown
kworker/0:0-9 [000] ..... 5.600213: pcie_ltssm_state_transition: dev: a40000000.pcie state: L0 rate: 2.5 GT/s
kworker/0:0-9 [000] ..... 5.600214: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_LOCK rate: Unknown
kworker/0:0-9 [000] ..... 5.600216: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_RCVRCFG rate: Unknown
kworker/0:0-9 [000] ..... 5.600217: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_SPEED rate: Unknown
kworker/0:0-9 [000] ..... 5.600218: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_LOCK rate: Unknown
kworker/0:0-9 [000] ..... 5.600220: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_EQ1 rate: Unknown
kworker/0:0-9 [000] ..... 5.600221: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_EQ2 rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600222: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_EQ3 rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600224: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_LOCK rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600225: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_RCVRCFG rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600226: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_IDLE rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600227: pcie_ltssm_state_transition: dev: a40000000.pcie state: L0 rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600228: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_LOCK rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600229: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_RCVRCFG rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600231: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_IDLE rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600232: pcie_ltssm_state_transition: dev: a40000000.pcie state: L0 rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600233: pcie_ltssm_state_transition: dev: a40000000.pcie state: L123_SEND_EIDLE rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600234: pcie_ltssm_state_transition: dev: a40000000.pcie state: L1_IDLE rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600236: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_LOCK rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600237: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_RCVRCFG rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600238: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_IDLE rate: 8.0 GT/s
kworker/0:0-9 [000] ..... 5.600239: pcie_ltssm_state_transition: dev: a40000000.pcie state: L0 rate: 8.0 GT/s
Changes in v3:
- add TRACE_DEFINE_ENUM for all enums(Steven Rostedt)
- Add toctree entry in Documentation/trace/index.rst(Bagas Sanjaya)
- fix mismatch section underline length(Bagas Sanjaya)
- Make example snippets in code block(Bagas Sanjaya)
- warp context into 80 columns and fix the file name(Bjorn)
- reorder variables(Mani)
- rename loop to i; rename en to enable(Mani)
- use FIELD_GET(Mani)
- add comment about how the FIFO works(Mani)
- Link to v2: https://lore.kernel.org/linux-pci/1767929389-143957-1-git-send-email-shawn.lin@rock-chips.com/T/#t
Changes in v2:
- use tracepoint
- Link to v1: https://lore.kernel.org/linux-pci/ym435w3ltwc7vln7g6j3ijswsarubwjazux65ttcqtrbr3i5fu@gig3qlzdkopf/T/#t
Shawn Lin (3):
PCI: trace: Add PCI controller LTSSM transition tracepoint
Documentation: tracing: Add PCI controller event documentation
PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
Documentation/trace/events-pci-controller.rst | 42 +++++++++++
Documentation/trace/index.rst | 1 +
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 104 ++++++++++++++++++++++++++
drivers/pci/trace.c | 1 +
include/trace/events/pci_controller.h | 52 +++++++++++++
5 files changed, 200 insertions(+)
create mode 100644 Documentation/trace/events-pci-controller.rst
create mode 100644 include/trace/events/pci_controller.h
--
2.7.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 1/3] PCI: trace: Add PCI controller LTSSM transition tracepoint
2026-01-12 1:19 [PATCH v3 0/3] PCI Controller event and LTSSM tracepoint support Shawn Lin
@ 2026-01-12 1:19 ` Shawn Lin
2026-01-12 1:19 ` [PATCH v3 2/3] Documentation: tracing: Add PCI controller event documentation Shawn Lin
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
2 siblings, 0 replies; 11+ messages in thread
From: Shawn Lin @ 2026-01-12 1:19 UTC (permalink / raw)
To: Manivannan Sadhasivam, Bjorn Helgaas
Cc: linux-rockchip, linux-pci, linux-trace-kernel, linux-doc,
Steven Rostedt, Masami Hiramatsu, Shawn Lin
Some platforms may provide LTSSM trace functionality, recording historical
LTSSM state transition information. This is very useful for debugging, such
as when certain devices cannot be recognized or link broken during test.
Implement the pci controller tracepoint for recording LTSSM and rate.
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
---
Changes in v3:
- add TRACE_DEFINE_ENUM for all enums(Steven Rostedt)
Changes in v2: None
drivers/pci/trace.c | 1 +
include/trace/events/pci_controller.h | 52 +++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+)
create mode 100644 include/trace/events/pci_controller.h
diff --git a/drivers/pci/trace.c b/drivers/pci/trace.c
index cf11abc..c1da9d3 100644
--- a/drivers/pci/trace.c
+++ b/drivers/pci/trace.c
@@ -9,3 +9,4 @@
#define CREATE_TRACE_POINTS
#include <trace/events/pci.h>
+#include <trace/events/pci_controller.h>
diff --git a/include/trace/events/pci_controller.h b/include/trace/events/pci_controller.h
new file mode 100644
index 0000000..f38eedf
--- /dev/null
+++ b/include/trace/events/pci_controller.h
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM pci_controller
+
+#if !defined(_TRACE_HW_EVENT_PCI_CONTROLLER_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_HW_EVENT_PCI_CONTROLLER_H
+
+#include <uapi/linux/pci_regs.h>
+#include <linux/tracepoint.h>
+
+TRACE_DEFINE_ENUM(PCIE_SPEED_2_5GT);
+TRACE_DEFINE_ENUM(PCIE_SPEED_5_0GT);
+TRACE_DEFINE_ENUM(PCIE_SPEED_8_0GT);
+TRACE_DEFINE_ENUM(PCIE_SPEED_16_0GT);
+TRACE_DEFINE_ENUM(PCIE_SPEED_32_0GT);
+TRACE_DEFINE_ENUM(PCIE_SPEED_64_0GT);
+TRACE_DEFINE_ENUM(PCI_SPEED_UNKNOWN);
+
+TRACE_EVENT(pcie_ltssm_state_transition,
+ TP_PROTO(const char *dev_name, const char *state, u32 rate),
+ TP_ARGS(dev_name, state, rate),
+
+ TP_STRUCT__entry(
+ __string(dev_name, dev_name)
+ __string(state, state)
+ __field(u32, rate)
+ ),
+
+ TP_fast_assign(
+ __assign_str(dev_name);
+ __assign_str(state);
+ __entry->rate = rate;
+ ),
+
+ TP_printk("dev: %s state: %s rate: %s",
+ __get_str(dev_name), __get_str(state),
+ __print_symbolic(__entry->rate,
+ { PCIE_SPEED_2_5GT, "2.5 GT/s" },
+ { PCIE_SPEED_5_0GT, "5.0 GT/s" },
+ { PCIE_SPEED_8_0GT, "8.0 GT/s" },
+ { PCIE_SPEED_16_0GT, "16.0 GT/s" },
+ { PCIE_SPEED_32_0GT, "32.0 GT/s" },
+ { PCIE_SPEED_64_0GT, "64.0 GT/s" },
+ { PCI_SPEED_UNKNOWN, "Unknown" }
+ )
+ )
+);
+
+#endif /* _TRACE_HW_EVENT_PCI_CONTROLLER_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 2/3] Documentation: tracing: Add PCI controller event documentation
2026-01-12 1:19 [PATCH v3 0/3] PCI Controller event and LTSSM tracepoint support Shawn Lin
2026-01-12 1:19 ` [PATCH v3 1/3] PCI: trace: Add PCI controller LTSSM transition tracepoint Shawn Lin
@ 2026-01-12 1:19 ` Shawn Lin
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
2 siblings, 0 replies; 11+ messages in thread
From: Shawn Lin @ 2026-01-12 1:19 UTC (permalink / raw)
To: Manivannan Sadhasivam, Bjorn Helgaas
Cc: linux-rockchip, linux-pci, linux-trace-kernel, linux-doc,
Steven Rostedt, Masami Hiramatsu, Shawn Lin
The available tracepoint, pcie_ltssm_state_transition, monitors the LTSSM state
transition for debugging purpose. Add description about it.
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
---
Changes in v3:
- Add toctree entry in Documentation/trace/index.rst(Bagas Sanjaya)
- fix mismatch section underline length(Bagas Sanjaya)
- Make example snippets in code block(Bagas Sanjaya)
- warp context into 80 columns and fix the file name(Bjorn)
Changes in v2: None
Documentation/trace/events-pci-controller.rst | 42 +++++++++++++++++++++++++++
Documentation/trace/index.rst | 1 +
2 files changed, 43 insertions(+)
create mode 100644 Documentation/trace/events-pci-controller.rst
diff --git a/Documentation/trace/events-pci-controller.rst b/Documentation/trace/events-pci-controller.rst
new file mode 100644
index 0000000..cb9f715
--- /dev/null
+++ b/Documentation/trace/events-pci-controller.rst
@@ -0,0 +1,42 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+======================================
+Subsystem Trace Points: PCI Controller
+======================================
+
+Overview
+========
+The PCI controller tracing system provides tracepoints to monitor controller
+level information for debugging purpose. The events normally show up here:
+
+ /sys/kernel/tracing/events/pci_controller
+
+Cf. include/trace/events/pci_controller.h for the events definitions.
+
+Available Tracepoints
+=====================
+
+pcie_ltssm_state_transition
+---------------------------
+
+Monitors PCIe LTSSM state transition including state and rate information
+::
+
+ pcie_ltssm_state_transition "dev: %s state: %s rate: %s\n"
+
+**Parameters**:
+
+* ``dev`` - PCIe controller instance
+* ``state`` - PCIe LTSSM state
+* ``rate`` - PCIe date rate
+
+**Example Usage**:
+
+.. code-block:: shell
+
+ # Enable the tracepoint
+ echo 1 > /sys/kernel/debug/tracing/events/pci_controller/pcie_ltssm_state_transition/enable
+
+ # Monitor events (the following output is generated when a device is linking)
+ cat /sys/kernel/debug/tracing/trace_pipe
+ kworker/0:0-9 [000] ..... 5.600221: pcie_ltssm_state_transition: dev: a40000000.pcie state: RCVRY_EQ2 rate: 8.0 GT/s
diff --git a/Documentation/trace/index.rst b/Documentation/trace/index.rst
index 0a40bfa..6101317 100644
--- a/Documentation/trace/index.rst
+++ b/Documentation/trace/index.rst
@@ -55,6 +55,7 @@ applications.
events-nmi
events-msr
events-pci
+ events-pci-controller
boottime-trace
histogram
histogram-design
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 1:19 [PATCH v3 0/3] PCI Controller event and LTSSM tracepoint support Shawn Lin
2026-01-12 1:19 ` [PATCH v3 1/3] PCI: trace: Add PCI controller LTSSM transition tracepoint Shawn Lin
2026-01-12 1:19 ` [PATCH v3 2/3] Documentation: tracing: Add PCI controller event documentation Shawn Lin
@ 2026-01-12 1:20 ` Shawn Lin
2026-01-12 6:42 ` kernel test robot
` (4 more replies)
2 siblings, 5 replies; 11+ messages in thread
From: Shawn Lin @ 2026-01-12 1:20 UTC (permalink / raw)
To: Manivannan Sadhasivam, Bjorn Helgaas
Cc: linux-rockchip, linux-pci, linux-trace-kernel, linux-doc,
Steven Rostedt, Masami Hiramatsu, Shawn Lin
Rockchip platforms provide a 64x4 bytes debug FIFO to trace the
LTSSM history. Any LTSSM change will be recorded. It's userful
for debug purpose, for example link failure, etc.
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
---
Changes in v3:
- reorder variables(Mani)
- rename loop to i; rename en to enable(Mani)
- use FIELD_GET(Mani)
- add comment about how the FIFO works(Mani)
Changes in v2:
- use tracepoint
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 104 ++++++++++++++++++++++++++
1 file changed, 104 insertions(+)
diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index 352f513..344e0b9 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -22,6 +22,8 @@
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/reset.h>
+#include <linux/workqueue.h>
+#include <trace/events/pci_controller.h>
#include "../../pci.h"
#include "pcie-designware.h"
@@ -73,6 +75,20 @@
#define PCIE_CLIENT_CDM_RASDES_TBA_L1_1 BIT(4)
#define PCIE_CLIENT_CDM_RASDES_TBA_L1_2 BIT(5)
+/* Debug FIFO information */
+#define PCIE_CLIENT_DBG_FIFO_MODE_CON 0x310
+#define PCIE_CLIENT_DBG_EN 0xffff0007
+#define PCIE_CLIENT_DBG_DIS 0xffff0000
+#define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D0 0x320
+#define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D1 0x324
+#define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D0 0x328
+#define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D1 0x32c
+#define PCIE_CLIENT_DBG_TRANSITION_DATA 0xffff0000
+#define PCIE_CLIENT_DBG_FIFO_STATUS 0x350
+#define PCIE_DBG_FIFO_RATE_MASK GENMASK(22, 20)
+#define PCIE_DBG_FIFO_L1SUB_MASK GENMASK(10, 8)
+#define PCIE_DBG_LTSSM_HISTORY_CNT 64
+
/* Hot Reset Control Register */
#define PCIE_CLIENT_HOT_RESET_CTRL 0x180
#define PCIE_LTSSM_APP_DLY2_EN BIT(1)
@@ -96,6 +112,7 @@ struct rockchip_pcie {
struct irq_domain *irq_domain;
const struct rockchip_pcie_of_data *data;
bool supports_clkreq;
+ struct delayed_work trace_work;
};
struct rockchip_pcie_of_data {
@@ -206,6 +223,89 @@ static enum dw_pcie_ltssm rockchip_pcie_get_ltssm(struct dw_pcie *pci)
return rockchip_pcie_get_ltssm_reg(rockchip) & PCIE_LTSSM_STATUS_MASK;
}
+#ifdef CONFIG_TRACING
+static void rockchip_pcie_ltssm_trace_work(struct work_struct *work)
+{
+ struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie,
+ trace_work.work);
+ struct dw_pcie *pci = &rockchip->pci;
+ enum dw_pcie_ltssm state;
+ u32 i, l1ss, prev_val = DW_PCIE_LTSSM_UNKNOWN, rate, val;
+
+ for (i = 0; i < PCIE_DBG_LTSSM_HISTORY_CNT; i++) {
+ val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_DBG_FIFO_STATUS);
+ rate = FIELD_GET(PCIE_DBG_FIFO_RATE_MASK, val);
+ l1ss = FIELD_GET(PCIE_DBG_FIFO_L1SUB_MASK, val);
+ val = FIELD_GET(PCIE_LTSSM_STATUS_MASK, val);
+
+ /*
+ * Hardware Mechanism: The ring FIFO employs two tracking counters:
+ * - 'last-read-point': maintains the user's last read position
+ * - 'last-valid-point': tracks the hardware's last state update
+ *
+ * Software Handling: When two consecutive LTSSM states are identical,
+ * it indicates invalid subsequent data in the FIFO. In this case, we
+ * skip the remaining entries. The dual-counter design ensures that on
+ * the next state transition, reading can resume from the last user
+ * position.
+ */
+ if ((i > 0 && val == prev_val) || val > DW_PCIE_LTSSM_RCVRY_EQ3)
+ break;
+
+ state = prev_val = val;
+ if (val == DW_PCIE_LTSSM_L1_IDLE) {
+ if (l1ss == 2)
+ state = DW_PCIE_LTSSM_L1_2;
+ else if (l1ss == 1)
+ state = DW_PCIE_LTSSM_L1_1;
+ }
+
+ trace_pcie_ltssm_state_transition(dev_name(pci->dev),
+ dw_pcie_ltssm_status_string(state),
+ ((rate + 1) > pci->max_link_speed) ?
+ PCI_SPEED_UNKNOWN : PCIE_SPEED_2_5GT + rate);
+ }
+
+ schedule_delayed_work(&rockchip->trace_work, msecs_to_jiffies(5000));
+}
+
+static void rockchip_pcie_ltssm_trace(struct rockchip_pcie *rockchip,
+ bool enable)
+{
+ if (enable) {
+ rockchip_pcie_writel_apb(rockchip,
+ PCIE_CLIENT_DBG_TRANSITION_DATA,
+ PCIE_CLIENT_DBG_FIFO_PTN_HIT_D0);
+ rockchip_pcie_writel_apb(rockchip,
+ PCIE_CLIENT_DBG_TRANSITION_DATA,
+ PCIE_CLIENT_DBG_FIFO_PTN_HIT_D1);
+ rockchip_pcie_writel_apb(rockchip,
+ PCIE_CLIENT_DBG_TRANSITION_DATA,
+ PCIE_CLIENT_DBG_FIFO_TRN_HIT_D0);
+ rockchip_pcie_writel_apb(rockchip,
+ PCIE_CLIENT_DBG_TRANSITION_DATA,
+ PCIE_CLIENT_DBG_FIFO_TRN_HIT_D1);
+ rockchip_pcie_writel_apb(rockchip,
+ PCIE_CLIENT_DBG_EN,
+ PCIE_CLIENT_DBG_FIFO_MODE_CON);
+
+ INIT_DELAYED_WORK(&rockchip->trace_work,
+ rockchip_pcie_ltssm_trace_work);
+ schedule_delayed_work(&rockchip->trace_work, 0);
+ } else {
+ rockchip_pcie_writel_apb(rockchip,
+ PCIE_CLIENT_DBG_DIS,
+ PCIE_CLIENT_DBG_FIFO_MODE_CON);
+ cancel_delayed_work_sync(&rockchip->trace_work);
+ }
+}
+#else
+static void rockchip_pcie_ltssm_trace(struct rockchip_pcie *rockchip,
+ bool enable)
+{
+}
+#endif
+
static void rockchip_pcie_enable_ltssm(struct rockchip_pcie *rockchip)
{
rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_ENABLE_LTSSM,
@@ -289,6 +389,9 @@ static int rockchip_pcie_start_link(struct dw_pcie *pci)
* 100us as we don't know how long should the device need to reset.
*/
msleep(PCIE_T_PVPERL_MS);
+
+ rockchip_pcie_ltssm_trace(rockchip, true);
+
gpiod_set_value_cansleep(rockchip->rst_gpio, 1);
return 0;
@@ -299,6 +402,7 @@ static void rockchip_pcie_stop_link(struct dw_pcie *pci)
struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
rockchip_pcie_disable_ltssm(rockchip);
+ rockchip_pcie_ltssm_trace(rockchip, false);
}
static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
@ 2026-01-12 6:42 ` kernel test robot
2026-01-12 7:19 ` Shawn Lin
2026-01-12 9:31 ` kernel test robot
` (3 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: kernel test robot @ 2026-01-12 6:42 UTC (permalink / raw)
To: Shawn Lin, Manivannan Sadhasivam, Bjorn Helgaas
Cc: oe-kbuild-all, linux-rockchip, linux-pci, linux-trace-kernel,
linux-doc, Steven Rostedt, Masami Hiramatsu, Shawn Lin
Hi Shawn,
kernel test robot noticed the following build errors:
[auto build test ERROR on pci/next]
[also build test ERROR on next-20260109]
[cannot apply to pci/for-linus trace/for-next mani-mhi/mhi-next linus/master v6.19-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Shawn-Lin/PCI-trace-Add-PCI-controller-LTSSM-transition-tracepoint/20260112-100141
base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link: https://lore.kernel.org/r/1768180800-63364-4-git-send-email-shawn.lin%40rock-chips.com
patch subject: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
config: loongarch-randconfig-002-20260112 (https://download.01.org/0day-ci/archive/20260112/202601121428.WVvakywZ-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260112/202601121428.WVvakywZ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601121428.WVvakywZ-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/pci/controller/dwc/pcie-dw-rockchip.c: In function 'rockchip_pcie_ltssm_trace_work':
>> drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:41: error: implicit declaration of function 'dw_pcie_ltssm_status_string' [-Wimplicit-function-declaration]
264 | dw_pcie_ltssm_status_string(state),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:41: error: passing argument 2 of 'trace_pcie_ltssm_state_transition' makes pointer from integer without a cast [-Wint-conversion]
264 | dw_pcie_ltssm_status_string(state),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| int
In file included from include/trace/events/pci_controller.h:9,
from drivers/pci/controller/dwc/pcie-dw-rockchip.c:26:
include/trace/events/pci_controller.h:20:52: note: expected 'const char *' but argument is of type 'int'
20 | TP_PROTO(const char *dev_name, const char *state, u32 rate),
| ~~~~~~~~~~~~^~~~~
include/linux/tracepoint.h:288:41: note: in definition of macro '__DECLARE_TRACE'
288 | static inline void trace_##name(proto) \
| ^~~~~
include/linux/tracepoint.h:494:31: note: in expansion of macro 'PARAMS'
494 | __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
| ^~~~~~
include/linux/tracepoint.h:632:9: note: in expansion of macro 'DECLARE_TRACE_EVENT'
632 | DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
| ^~~~~~~~~~~~~~~~~~~
include/linux/tracepoint.h:632:35: note: in expansion of macro 'PARAMS'
632 | DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
| ^~~~~~
include/trace/events/pci_controller.h:19:1: note: in expansion of macro 'TRACE_EVENT'
19 | TRACE_EVENT(pcie_ltssm_state_transition,
| ^~~~~~~~~~~
include/trace/events/pci_controller.h:20:9: note: in expansion of macro 'TP_PROTO'
20 | TP_PROTO(const char *dev_name, const char *state, u32 rate),
| ^~~~~~~~
vim +/dw_pcie_ltssm_status_string +264 drivers/pci/controller/dwc/pcie-dw-rockchip.c
225
226 #ifdef CONFIG_TRACING
227 static void rockchip_pcie_ltssm_trace_work(struct work_struct *work)
228 {
229 struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie,
230 trace_work.work);
231 struct dw_pcie *pci = &rockchip->pci;
232 enum dw_pcie_ltssm state;
233 u32 i, l1ss, prev_val = DW_PCIE_LTSSM_UNKNOWN, rate, val;
234
235 for (i = 0; i < PCIE_DBG_LTSSM_HISTORY_CNT; i++) {
236 val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_DBG_FIFO_STATUS);
237 rate = FIELD_GET(PCIE_DBG_FIFO_RATE_MASK, val);
238 l1ss = FIELD_GET(PCIE_DBG_FIFO_L1SUB_MASK, val);
239 val = FIELD_GET(PCIE_LTSSM_STATUS_MASK, val);
240
241 /*
242 * Hardware Mechanism: The ring FIFO employs two tracking counters:
243 * - 'last-read-point': maintains the user's last read position
244 * - 'last-valid-point': tracks the hardware's last state update
245 *
246 * Software Handling: When two consecutive LTSSM states are identical,
247 * it indicates invalid subsequent data in the FIFO. In this case, we
248 * skip the remaining entries. The dual-counter design ensures that on
249 * the next state transition, reading can resume from the last user
250 * position.
251 */
252 if ((i > 0 && val == prev_val) || val > DW_PCIE_LTSSM_RCVRY_EQ3)
253 break;
254
255 state = prev_val = val;
256 if (val == DW_PCIE_LTSSM_L1_IDLE) {
257 if (l1ss == 2)
258 state = DW_PCIE_LTSSM_L1_2;
259 else if (l1ss == 1)
260 state = DW_PCIE_LTSSM_L1_1;
261 }
262
263 trace_pcie_ltssm_state_transition(dev_name(pci->dev),
> 264 dw_pcie_ltssm_status_string(state),
265 ((rate + 1) > pci->max_link_speed) ?
266 PCI_SPEED_UNKNOWN : PCIE_SPEED_2_5GT + rate);
267 }
268
269 schedule_delayed_work(&rockchip->trace_work, msecs_to_jiffies(5000));
270 }
271
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 6:42 ` kernel test robot
@ 2026-01-12 7:19 ` Shawn Lin
0 siblings, 0 replies; 11+ messages in thread
From: Shawn Lin @ 2026-01-12 7:19 UTC (permalink / raw)
To: kernel test robot, Manivannan Sadhasivam, Bjorn Helgaas
Cc: shawn.lin, oe-kbuild-all, linux-rockchip, linux-pci,
linux-trace-kernel, linux-doc, Steven Rostedt, Masami Hiramatsu
在 2026/01/12 星期一 14:42, kernel test robot 写道:
> Hi Shawn,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on pci/next]
> [also build test ERROR on next-20260109]
> [cannot apply to pci/for-linus trace/for-next mani-mhi/mhi-next linus/master v6.19-rc5]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Shawn-Lin/PCI-trace-Add-PCI-controller-LTSSM-transition-tracepoint/20260112-100141
> base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
> patch link: https://lore.kernel.org/r/1768180800-63364-4-git-send-email-shawn.lin%40rock-chips.com
> patch subject: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
> config: loongarch-randconfig-002-20260112 (https://download.01.org/0day-ci/archive/20260112/202601121428.WVvakywZ-lkp@intel.com/config)
> compiler: loongarch64-linux-gcc (GCC) 15.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260112/202601121428.WVvakywZ-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202601121428.WVvakywZ-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> drivers/pci/controller/dwc/pcie-dw-rockchip.c: In function 'rockchip_pcie_ltssm_trace_work':
>>> drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:41: error: implicit declaration of function 'dw_pcie_ltssm_status_string' [-Wimplicit-function-declaration]
> 264 | dw_pcie_ltssm_status_string(state),
Hi lkp,
It depends on another patch mentioned in the cover letter. So the
complie error is expected right now.
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:41: error: passing argument 2 of 'trace_pcie_ltssm_state_transition' makes pointer from integer without a cast [-Wint-conversion]
> 264 | dw_pcie_ltssm_status_string(state),
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> | |
> | int
> In file included from include/trace/events/pci_controller.h:9,
> from drivers/pci/controller/dwc/pcie-dw-rockchip.c:26:
> include/trace/events/pci_controller.h:20:52: note: expected 'const char *' but argument is of type 'int'
> 20 | TP_PROTO(const char *dev_name, const char *state, u32 rate),
> | ~~~~~~~~~~~~^~~~~
> include/linux/tracepoint.h:288:41: note: in definition of macro '__DECLARE_TRACE'
> 288 | static inline void trace_##name(proto) \
> | ^~~~~
> include/linux/tracepoint.h:494:31: note: in expansion of macro 'PARAMS'
> 494 | __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
> | ^~~~~~
> include/linux/tracepoint.h:632:9: note: in expansion of macro 'DECLARE_TRACE_EVENT'
> 632 | DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
> | ^~~~~~~~~~~~~~~~~~~
> include/linux/tracepoint.h:632:35: note: in expansion of macro 'PARAMS'
> 632 | DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
> | ^~~~~~
> include/trace/events/pci_controller.h:19:1: note: in expansion of macro 'TRACE_EVENT'
> 19 | TRACE_EVENT(pcie_ltssm_state_transition,
> | ^~~~~~~~~~~
> include/trace/events/pci_controller.h:20:9: note: in expansion of macro 'TP_PROTO'
> 20 | TP_PROTO(const char *dev_name, const char *state, u32 rate),
> | ^~~~~~~~
>
>
> vim +/dw_pcie_ltssm_status_string +264 drivers/pci/controller/dwc/pcie-dw-rockchip.c
>
> 225
> 226 #ifdef CONFIG_TRACING
> 227 static void rockchip_pcie_ltssm_trace_work(struct work_struct *work)
> 228 {
> 229 struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie,
> 230 trace_work.work);
> 231 struct dw_pcie *pci = &rockchip->pci;
> 232 enum dw_pcie_ltssm state;
> 233 u32 i, l1ss, prev_val = DW_PCIE_LTSSM_UNKNOWN, rate, val;
> 234
> 235 for (i = 0; i < PCIE_DBG_LTSSM_HISTORY_CNT; i++) {
> 236 val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_DBG_FIFO_STATUS);
> 237 rate = FIELD_GET(PCIE_DBG_FIFO_RATE_MASK, val);
> 238 l1ss = FIELD_GET(PCIE_DBG_FIFO_L1SUB_MASK, val);
> 239 val = FIELD_GET(PCIE_LTSSM_STATUS_MASK, val);
> 240
> 241 /*
> 242 * Hardware Mechanism: The ring FIFO employs two tracking counters:
> 243 * - 'last-read-point': maintains the user's last read position
> 244 * - 'last-valid-point': tracks the hardware's last state update
> 245 *
> 246 * Software Handling: When two consecutive LTSSM states are identical,
> 247 * it indicates invalid subsequent data in the FIFO. In this case, we
> 248 * skip the remaining entries. The dual-counter design ensures that on
> 249 * the next state transition, reading can resume from the last user
> 250 * position.
> 251 */
> 252 if ((i > 0 && val == prev_val) || val > DW_PCIE_LTSSM_RCVRY_EQ3)
> 253 break;
> 254
> 255 state = prev_val = val;
> 256 if (val == DW_PCIE_LTSSM_L1_IDLE) {
> 257 if (l1ss == 2)
> 258 state = DW_PCIE_LTSSM_L1_2;
> 259 else if (l1ss == 1)
> 260 state = DW_PCIE_LTSSM_L1_1;
> 261 }
> 262
> 263 trace_pcie_ltssm_state_transition(dev_name(pci->dev),
> > 264 dw_pcie_ltssm_status_string(state),
> 265 ((rate + 1) > pci->max_link_speed) ?
> 266 PCI_SPEED_UNKNOWN : PCIE_SPEED_2_5GT + rate);
> 267 }
> 268
> 269 schedule_delayed_work(&rockchip->trace_work, msecs_to_jiffies(5000));
> 270 }
> 271
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
2026-01-12 6:42 ` kernel test robot
@ 2026-01-12 9:31 ` kernel test robot
2026-01-12 10:15 ` kernel test robot
` (2 subsequent siblings)
4 siblings, 0 replies; 11+ messages in thread
From: kernel test robot @ 2026-01-12 9:31 UTC (permalink / raw)
To: Shawn Lin, Manivannan Sadhasivam, Bjorn Helgaas
Cc: oe-kbuild-all, linux-rockchip, linux-pci, linux-trace-kernel,
linux-doc, Steven Rostedt, Masami Hiramatsu, Shawn Lin
Hi Shawn,
kernel test robot noticed the following build warnings:
[auto build test WARNING on pci/next]
[also build test WARNING on next-20260109]
[cannot apply to pci/for-linus trace/for-next mani-mhi/mhi-next linus/master v6.19-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Shawn-Lin/PCI-trace-Add-PCI-controller-LTSSM-transition-tracepoint/20260112-100141
base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link: https://lore.kernel.org/r/1768180800-63364-4-git-send-email-shawn.lin%40rock-chips.com
patch subject: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
config: arm64-randconfig-002-20260112 (https://download.01.org/0day-ci/archive/20260112/202601121734.epct0ieX-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260112/202601121734.epct0ieX-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601121734.epct0ieX-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/pci/controller/dwc/pcie-dw-rockchip.c: In function 'rockchip_pcie_ltssm_trace_work':
drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:6: error: implicit declaration of function 'dw_pcie_ltssm_status_string'; did you mean 'dw_pcie_start_link'? [-Werror=implicit-function-declaration]
dw_pcie_ltssm_status_string(state),
^~~~~~~~~~~~~~~~~~~~~~~~~~~
dw_pcie_start_link
>> drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:6: warning: passing argument 2 of 'trace_pcie_ltssm_state_transition' makes pointer from integer without a cast [-Wint-conversion]
dw_pcie_ltssm_status_string(state),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from include/trace/events/pci_controller.h:9,
from drivers/pci/controller/dwc/pcie-dw-rockchip.c:26:
include/trace/events/pci_controller.h:20:45: note: expected 'const char *' but argument is of type 'int'
TP_PROTO(const char *dev_name, const char *state, u32 rate),
~~~~~~~~~~~~^~~~~
include/linux/tracepoint.h:288:34: note: in definition of macro '__DECLARE_TRACE'
static inline void trace_##name(proto) \
^~~~~
include/linux/tracepoint.h:494:24: note: in expansion of macro 'PARAMS'
__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
^~~~~~
include/linux/tracepoint.h:632:2: note: in expansion of macro 'DECLARE_TRACE_EVENT'
DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
^~~~~~~~~~~~~~~~~~~
include/linux/tracepoint.h:632:28: note: in expansion of macro 'PARAMS'
DECLARE_TRACE_EVENT(name, PARAMS(proto), PARAMS(args))
^~~~~~
include/trace/events/pci_controller.h:19:1: note: in expansion of macro 'TRACE_EVENT'
TRACE_EVENT(pcie_ltssm_state_transition,
^~~~~~~~~~~
include/trace/events/pci_controller.h:20:2: note: in expansion of macro 'TP_PROTO'
TP_PROTO(const char *dev_name, const char *state, u32 rate),
^~~~~~~~
cc1: some warnings being treated as errors
vim +/trace_pcie_ltssm_state_transition +264 drivers/pci/controller/dwc/pcie-dw-rockchip.c
225
226 #ifdef CONFIG_TRACING
227 static void rockchip_pcie_ltssm_trace_work(struct work_struct *work)
228 {
229 struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie,
230 trace_work.work);
231 struct dw_pcie *pci = &rockchip->pci;
232 enum dw_pcie_ltssm state;
233 u32 i, l1ss, prev_val = DW_PCIE_LTSSM_UNKNOWN, rate, val;
234
235 for (i = 0; i < PCIE_DBG_LTSSM_HISTORY_CNT; i++) {
236 val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_DBG_FIFO_STATUS);
237 rate = FIELD_GET(PCIE_DBG_FIFO_RATE_MASK, val);
238 l1ss = FIELD_GET(PCIE_DBG_FIFO_L1SUB_MASK, val);
239 val = FIELD_GET(PCIE_LTSSM_STATUS_MASK, val);
240
241 /*
242 * Hardware Mechanism: The ring FIFO employs two tracking counters:
243 * - 'last-read-point': maintains the user's last read position
244 * - 'last-valid-point': tracks the hardware's last state update
245 *
246 * Software Handling: When two consecutive LTSSM states are identical,
247 * it indicates invalid subsequent data in the FIFO. In this case, we
248 * skip the remaining entries. The dual-counter design ensures that on
249 * the next state transition, reading can resume from the last user
250 * position.
251 */
252 if ((i > 0 && val == prev_val) || val > DW_PCIE_LTSSM_RCVRY_EQ3)
253 break;
254
255 state = prev_val = val;
256 if (val == DW_PCIE_LTSSM_L1_IDLE) {
257 if (l1ss == 2)
258 state = DW_PCIE_LTSSM_L1_2;
259 else if (l1ss == 1)
260 state = DW_PCIE_LTSSM_L1_1;
261 }
262
263 trace_pcie_ltssm_state_transition(dev_name(pci->dev),
> 264 dw_pcie_ltssm_status_string(state),
265 ((rate + 1) > pci->max_link_speed) ?
266 PCI_SPEED_UNKNOWN : PCIE_SPEED_2_5GT + rate);
267 }
268
269 schedule_delayed_work(&rockchip->trace_work, msecs_to_jiffies(5000));
270 }
271
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
2026-01-12 6:42 ` kernel test robot
2026-01-12 9:31 ` kernel test robot
@ 2026-01-12 10:15 ` kernel test robot
2026-01-12 15:16 ` Steven Rostedt
2026-01-13 22:03 ` Bjorn Helgaas
4 siblings, 0 replies; 11+ messages in thread
From: kernel test robot @ 2026-01-12 10:15 UTC (permalink / raw)
To: Shawn Lin, Manivannan Sadhasivam, Bjorn Helgaas
Cc: llvm, oe-kbuild-all, linux-rockchip, linux-pci,
linux-trace-kernel, linux-doc, Steven Rostedt, Masami Hiramatsu,
Shawn Lin
Hi Shawn,
kernel test robot noticed the following build errors:
[auto build test ERROR on pci/next]
[also build test ERROR on next-20260109]
[cannot apply to pci/for-linus trace/for-next mani-mhi/mhi-next linus/master v6.19-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Shawn-Lin/PCI-trace-Add-PCI-controller-LTSSM-transition-tracepoint/20260112-100141
base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link: https://lore.kernel.org/r/1768180800-63364-4-git-send-email-shawn.lin%40rock-chips.com
patch subject: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
config: arm64-randconfig-004-20260112 (https://download.01.org/0day-ci/archive/20260112/202601121712.JbsMAjDZ-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260112/202601121712.JbsMAjDZ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601121712.JbsMAjDZ-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:6: error: call to undeclared function 'dw_pcie_ltssm_status_string'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
264 | dw_pcie_ltssm_status_string(state),
| ^
>> drivers/pci/controller/dwc/pcie-dw-rockchip.c:264:6: error: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
264 | dw_pcie_ltssm_status_string(state),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/trace/events/pci_controller.h:20:45: note: passing argument to parameter 'state' here
20 | TP_PROTO(const char *dev_name, const char *state, u32 rate),
| ^
2 errors generated.
vim +/dw_pcie_ltssm_status_string +264 drivers/pci/controller/dwc/pcie-dw-rockchip.c
225
226 #ifdef CONFIG_TRACING
227 static void rockchip_pcie_ltssm_trace_work(struct work_struct *work)
228 {
229 struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie,
230 trace_work.work);
231 struct dw_pcie *pci = &rockchip->pci;
232 enum dw_pcie_ltssm state;
233 u32 i, l1ss, prev_val = DW_PCIE_LTSSM_UNKNOWN, rate, val;
234
235 for (i = 0; i < PCIE_DBG_LTSSM_HISTORY_CNT; i++) {
236 val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_DBG_FIFO_STATUS);
237 rate = FIELD_GET(PCIE_DBG_FIFO_RATE_MASK, val);
238 l1ss = FIELD_GET(PCIE_DBG_FIFO_L1SUB_MASK, val);
239 val = FIELD_GET(PCIE_LTSSM_STATUS_MASK, val);
240
241 /*
242 * Hardware Mechanism: The ring FIFO employs two tracking counters:
243 * - 'last-read-point': maintains the user's last read position
244 * - 'last-valid-point': tracks the hardware's last state update
245 *
246 * Software Handling: When two consecutive LTSSM states are identical,
247 * it indicates invalid subsequent data in the FIFO. In this case, we
248 * skip the remaining entries. The dual-counter design ensures that on
249 * the next state transition, reading can resume from the last user
250 * position.
251 */
252 if ((i > 0 && val == prev_val) || val > DW_PCIE_LTSSM_RCVRY_EQ3)
253 break;
254
255 state = prev_val = val;
256 if (val == DW_PCIE_LTSSM_L1_IDLE) {
257 if (l1ss == 2)
258 state = DW_PCIE_LTSSM_L1_2;
259 else if (l1ss == 1)
260 state = DW_PCIE_LTSSM_L1_1;
261 }
262
263 trace_pcie_ltssm_state_transition(dev_name(pci->dev),
> 264 dw_pcie_ltssm_status_string(state),
265 ((rate + 1) > pci->max_link_speed) ?
266 PCI_SPEED_UNKNOWN : PCIE_SPEED_2_5GT + rate);
267 }
268
269 schedule_delayed_work(&rockchip->trace_work, msecs_to_jiffies(5000));
270 }
271
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
` (2 preceding siblings ...)
2026-01-12 10:15 ` kernel test robot
@ 2026-01-12 15:16 ` Steven Rostedt
2026-01-13 3:55 ` Shawn Lin
2026-01-13 22:03 ` Bjorn Helgaas
4 siblings, 1 reply; 11+ messages in thread
From: Steven Rostedt @ 2026-01-12 15:16 UTC (permalink / raw)
To: Shawn Lin
Cc: Manivannan Sadhasivam, Bjorn Helgaas, linux-rockchip, linux-pci,
linux-trace-kernel, linux-doc, Masami Hiramatsu
On Mon, 12 Jan 2026 09:20:00 +0800
Shawn Lin <shawn.lin@rock-chips.com> wrote:
> Rockchip platforms provide a 64x4 bytes debug FIFO to trace the
> LTSSM history. Any LTSSM change will be recorded. It's userful
> for debug purpose, for example link failure, etc.
>
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> ---
>
> Changes in v3:
> - reorder variables(Mani)
> - rename loop to i; rename en to enable(Mani)
> - use FIELD_GET(Mani)
> - add comment about how the FIFO works(Mani)
>
> Changes in v2:
> - use tracepoint
>
> drivers/pci/controller/dwc/pcie-dw-rockchip.c | 104 ++++++++++++++++++++++++++
> 1 file changed, 104 insertions(+)
>
> diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> index 352f513..344e0b9 100644
> --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> @@ -22,6 +22,8 @@
> #include <linux/platform_device.h>
> #include <linux/regmap.h>
> #include <linux/reset.h>
> +#include <linux/workqueue.h>
> +#include <trace/events/pci_controller.h>
>
> #include "../../pci.h"
> #include "pcie-designware.h"
> @@ -73,6 +75,20 @@
> #define PCIE_CLIENT_CDM_RASDES_TBA_L1_1 BIT(4)
> #define PCIE_CLIENT_CDM_RASDES_TBA_L1_2 BIT(5)
>
> +/* Debug FIFO information */
> +#define PCIE_CLIENT_DBG_FIFO_MODE_CON 0x310
> +#define PCIE_CLIENT_DBG_EN 0xffff0007
> +#define PCIE_CLIENT_DBG_DIS 0xffff0000
> +#define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D0 0x320
> +#define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D1 0x324
> +#define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D0 0x328
> +#define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D1 0x32c
> +#define PCIE_CLIENT_DBG_TRANSITION_DATA 0xffff0000
> +#define PCIE_CLIENT_DBG_FIFO_STATUS 0x350
> +#define PCIE_DBG_FIFO_RATE_MASK GENMASK(22, 20)
> +#define PCIE_DBG_FIFO_L1SUB_MASK GENMASK(10, 8)
> +#define PCIE_DBG_LTSSM_HISTORY_CNT 64
> +
> /* Hot Reset Control Register */
> #define PCIE_CLIENT_HOT_RESET_CTRL 0x180
> #define PCIE_LTSSM_APP_DLY2_EN BIT(1)
> @@ -96,6 +112,7 @@ struct rockchip_pcie {
> struct irq_domain *irq_domain;
> const struct rockchip_pcie_of_data *data;
> bool supports_clkreq;
> + struct delayed_work trace_work;
> };
>
> struct rockchip_pcie_of_data {
> @@ -206,6 +223,89 @@ static enum dw_pcie_ltssm rockchip_pcie_get_ltssm(struct dw_pcie *pci)
> return rockchip_pcie_get_ltssm_reg(rockchip) & PCIE_LTSSM_STATUS_MASK;
> }
>
> +#ifdef CONFIG_TRACING
> +static void rockchip_pcie_ltssm_trace_work(struct work_struct *work)
> +{
> + struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie,
> + trace_work.work);
> + struct dw_pcie *pci = &rockchip->pci;
> + enum dw_pcie_ltssm state;
> + u32 i, l1ss, prev_val = DW_PCIE_LTSSM_UNKNOWN, rate, val;
> +
> + for (i = 0; i < PCIE_DBG_LTSSM_HISTORY_CNT; i++) {
> + val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_DBG_FIFO_STATUS);
> + rate = FIELD_GET(PCIE_DBG_FIFO_RATE_MASK, val);
> + l1ss = FIELD_GET(PCIE_DBG_FIFO_L1SUB_MASK, val);
> + val = FIELD_GET(PCIE_LTSSM_STATUS_MASK, val);
> +
> + /*
> + * Hardware Mechanism: The ring FIFO employs two tracking counters:
> + * - 'last-read-point': maintains the user's last read position
> + * - 'last-valid-point': tracks the hardware's last state update
> + *
> + * Software Handling: When two consecutive LTSSM states are identical,
> + * it indicates invalid subsequent data in the FIFO. In this case, we
> + * skip the remaining entries. The dual-counter design ensures that on
> + * the next state transition, reading can resume from the last user
> + * position.
> + */
> + if ((i > 0 && val == prev_val) || val > DW_PCIE_LTSSM_RCVRY_EQ3)
> + break;
> +
> + state = prev_val = val;
> + if (val == DW_PCIE_LTSSM_L1_IDLE) {
> + if (l1ss == 2)
> + state = DW_PCIE_LTSSM_L1_2;
> + else if (l1ss == 1)
> + state = DW_PCIE_LTSSM_L1_1;
> + }
> +
> + trace_pcie_ltssm_state_transition(dev_name(pci->dev),
> + dw_pcie_ltssm_status_string(state),
> + ((rate + 1) > pci->max_link_speed) ?
> + PCI_SPEED_UNKNOWN : PCIE_SPEED_2_5GT + rate);
> + }
Does it make sense to call this work function every 5 seconds when the
tracepoint isn't enabled?
You can add a function callback to when the tracepoint is enabled by defining:
TRACE_EVENT_FN(<name>
TP_PROTO(..)
TP_ARGS(..)
TP_STRUCT__entry(..)
TP_fast_assign(..)
TP_printk(..)
reg,
unreg)
reg() gets called when the tracepoint is first enabled. This could be where
you can start the work function. And unreg() would stop it.
You would likely need to also include state variables as I guess you don't
want to start it if the link is down. Also, if the tracepoint is enabled
when the link goes up you want to start the work queue.
I would recommend this so that you don't call this work function when it's
not doing anything useful.
-- Steve
> +
> + schedule_delayed_work(&rockchip->trace_work, msecs_to_jiffies(5000));
> +}
> +
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 15:16 ` Steven Rostedt
@ 2026-01-13 3:55 ` Shawn Lin
0 siblings, 0 replies; 11+ messages in thread
From: Shawn Lin @ 2026-01-13 3:55 UTC (permalink / raw)
To: Steven Rostedt
Cc: shawn.lin, Manivannan Sadhasivam, Bjorn Helgaas, linux-rockchip,
linux-pci, linux-trace-kernel, linux-doc, Masami Hiramatsu
Hi Steven,
在 2026/01/12 星期一 23:16, Steven Rostedt 写道:
> On Mon, 12 Jan 2026 09:20:00 +0800
> Shawn Lin <shawn.lin@rock-chips.com> wrote:
>
>> Rockchip platforms provide a 64x4 bytes debug FIFO to trace the
>> LTSSM history. Any LTSSM change will be recorded. It's userful
>> for debug purpose, for example link failure, etc.
>>
>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
>> ---
>>
>> Changes in v3:
>> - reorder variables(Mani)
>> - rename loop to i; rename en to enable(Mani)
>> - use FIELD_GET(Mani)
>> - add comment about how the FIFO works(Mani)
>>
>> Changes in v2:
>> - use tracepoint
>>
>> drivers/pci/controller/dwc/pcie-dw-rockchip.c | 104 ++++++++++++++++++++++++++
>> 1 file changed, 104 insertions(+)
>>
>> diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
>> index 352f513..344e0b9 100644
>> --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
>> +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
>> @@ -22,6 +22,8 @@
>> #include <linux/platform_device.h>
>> #include <linux/regmap.h>
>> #include <linux/reset.h>
>> +#include <linux/workqueue.h>
>> +#include <trace/events/pci_controller.h>
>>
>> #include "../../pci.h"
>> #include "pcie-designware.h"
>> @@ -73,6 +75,20 @@
>> #define PCIE_CLIENT_CDM_RASDES_TBA_L1_1 BIT(4)
>> #define PCIE_CLIENT_CDM_RASDES_TBA_L1_2 BIT(5)
>>
>> +/* Debug FIFO information */
>> +#define PCIE_CLIENT_DBG_FIFO_MODE_CON 0x310
>> +#define PCIE_CLIENT_DBG_EN 0xffff0007
>> +#define PCIE_CLIENT_DBG_DIS 0xffff0000
>> +#define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D0 0x320
>> +#define PCIE_CLIENT_DBG_FIFO_PTN_HIT_D1 0x324
>> +#define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D0 0x328
>> +#define PCIE_CLIENT_DBG_FIFO_TRN_HIT_D1 0x32c
>> +#define PCIE_CLIENT_DBG_TRANSITION_DATA 0xffff0000
>> +#define PCIE_CLIENT_DBG_FIFO_STATUS 0x350
>> +#define PCIE_DBG_FIFO_RATE_MASK GENMASK(22, 20)
>> +#define PCIE_DBG_FIFO_L1SUB_MASK GENMASK(10, 8)
>> +#define PCIE_DBG_LTSSM_HISTORY_CNT 64
>> +
>> /* Hot Reset Control Register */
>> #define PCIE_CLIENT_HOT_RESET_CTRL 0x180
>> #define PCIE_LTSSM_APP_DLY2_EN BIT(1)
>> @@ -96,6 +112,7 @@ struct rockchip_pcie {
>> struct irq_domain *irq_domain;
>> const struct rockchip_pcie_of_data *data;
>> bool supports_clkreq;
>> + struct delayed_work trace_work;
>> };
>>
>> struct rockchip_pcie_of_data {
>> @@ -206,6 +223,89 @@ static enum dw_pcie_ltssm rockchip_pcie_get_ltssm(struct dw_pcie *pci)
>> return rockchip_pcie_get_ltssm_reg(rockchip) & PCIE_LTSSM_STATUS_MASK;
>> }
>>
>> +#ifdef CONFIG_TRACING
>> +static void rockchip_pcie_ltssm_trace_work(struct work_struct *work)
>> +{
>> + struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie,
>> + trace_work.work);
>> + struct dw_pcie *pci = &rockchip->pci;
>> + enum dw_pcie_ltssm state;
>> + u32 i, l1ss, prev_val = DW_PCIE_LTSSM_UNKNOWN, rate, val;
>> +
>> + for (i = 0; i < PCIE_DBG_LTSSM_HISTORY_CNT; i++) {
>> + val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_DBG_FIFO_STATUS);
>> + rate = FIELD_GET(PCIE_DBG_FIFO_RATE_MASK, val);
>> + l1ss = FIELD_GET(PCIE_DBG_FIFO_L1SUB_MASK, val);
>> + val = FIELD_GET(PCIE_LTSSM_STATUS_MASK, val);
>> +
>> + /*
>> + * Hardware Mechanism: The ring FIFO employs two tracking counters:
>> + * - 'last-read-point': maintains the user's last read position
>> + * - 'last-valid-point': tracks the hardware's last state update
>> + *
>> + * Software Handling: When two consecutive LTSSM states are identical,
>> + * it indicates invalid subsequent data in the FIFO. In this case, we
>> + * skip the remaining entries. The dual-counter design ensures that on
>> + * the next state transition, reading can resume from the last user
>> + * position.
>> + */
>> + if ((i > 0 && val == prev_val) || val > DW_PCIE_LTSSM_RCVRY_EQ3)
>> + break;
>> +
>> + state = prev_val = val;
>> + if (val == DW_PCIE_LTSSM_L1_IDLE) {
>> + if (l1ss == 2)
>> + state = DW_PCIE_LTSSM_L1_2;
>> + else if (l1ss == 1)
>> + state = DW_PCIE_LTSSM_L1_1;
>> + }
>> +
>> + trace_pcie_ltssm_state_transition(dev_name(pci->dev),
>> + dw_pcie_ltssm_status_string(state),
>> + ((rate + 1) > pci->max_link_speed) ?
>> + PCI_SPEED_UNKNOWN : PCIE_SPEED_2_5GT + rate);
>> + }
>
> Does it make sense to call this work function every 5 seconds when the
> tracepoint isn't enabled?
>
That's a good question. We don't need to read fifo and call
trace_pcie_ltssm_state_transition if tracepoint isn't enabled.
Will improve in v4.
> You can add a function callback to when the tracepoint is enabled by defining:
>
> TRACE_EVENT_FN(<name>
> TP_PROTO(..)
> TP_ARGS(..)
> TP_STRUCT__entry(..)
> TP_fast_assign(..)
> TP_printk(..)
>
> reg,
> unreg)
>
> reg() gets called when the tracepoint is first enabled. This could be where
> you can start the work function. And unreg() would stop it.
>
As how to start/stop it may vary from host to host, so I think we could
use reg()/unreg() to set a status to indicate whether this tracepoint is
enabled. Then the host drivers could decide how to implement trace work
based on it.
> You would likely need to also include state variables as I guess you don't
> want to start it if the link is down. Also, if the tracepoint is enabled
> when the link goes up you want to start the work queue.
Frankly, I do want to start it if the link is down as the link may come
up later and that will make us able to dump the transition in time.
>
> I would recommend this so that you don't call this work function when it's
> not doing anything useful.
Sure, very appreciate your suggestion.
Thanks.
>
> -- Steve
>
>
>
>> +
>> + schedule_delayed_work(&rockchip->trace_work, msecs_to_jiffies(5000));
>> +}
>> +
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
` (3 preceding siblings ...)
2026-01-12 15:16 ` Steven Rostedt
@ 2026-01-13 22:03 ` Bjorn Helgaas
4 siblings, 0 replies; 11+ messages in thread
From: Bjorn Helgaas @ 2026-01-13 22:03 UTC (permalink / raw)
To: Shawn Lin
Cc: Manivannan Sadhasivam, Bjorn Helgaas, linux-rockchip, linux-pci,
linux-trace-kernel, linux-doc, Steven Rostedt, Masami Hiramatsu
On Mon, Jan 12, 2026 at 09:20:00AM +0800, Shawn Lin wrote:
> Rockchip platforms provide a 64x4 bytes debug FIFO to trace the
> LTSSM history. Any LTSSM change will be recorded. It's userful
> for debug purpose, for example link failure, etc.
s/userful/useful/
> + * Hardware Mechanism: The ring FIFO employs two tracking counters:
> + * - 'last-read-point': maintains the user's last read position
> + * - 'last-valid-point': tracks the hardware's last state update
> + *
> + * Software Handling: When two consecutive LTSSM states are identical,
> + * it indicates invalid subsequent data in the FIFO. In this case, we
> + * skip the remaining entries. The dual-counter design ensures that on
> + * the next state transition, reading can resume from the last user
> + * position.
Wrap this to fit in 80 columns like the rest of the file. Occasional
code lines that don't fit because of indentation or long meaningful
names are tolerable, but reading plain English text that doesn't fit
for no real reason is just annoying.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-01-13 22:03 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-12 1:19 [PATCH v3 0/3] PCI Controller event and LTSSM tracepoint support Shawn Lin
2026-01-12 1:19 ` [PATCH v3 1/3] PCI: trace: Add PCI controller LTSSM transition tracepoint Shawn Lin
2026-01-12 1:19 ` [PATCH v3 2/3] Documentation: tracing: Add PCI controller event documentation Shawn Lin
2026-01-12 1:20 ` [PATCH v3 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
2026-01-12 6:42 ` kernel test robot
2026-01-12 7:19 ` Shawn Lin
2026-01-12 9:31 ` kernel test robot
2026-01-12 10:15 ` kernel test robot
2026-01-12 15:16 ` Steven Rostedt
2026-01-13 3:55 ` Shawn Lin
2026-01-13 22:03 ` Bjorn Helgaas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox