From: Steven Rostedt <rostedt@goodmis.org>
To: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Manivannan Sadhasivam <mani@kernel.org>,
Bjorn Helgaas <bhelgaas@google.com>,
linux-rockchip@lists.infradead.org, linux-pci@vger.kernel.org,
linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
Masami Hiramatsu <mhiramat@kernel.org>
Subject: Re: [PATCH v4 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
Date: Tue, 24 Feb 2026 09:11:15 -0500 [thread overview]
Message-ID: <20260224091115.6e32c38e@fedora> (raw)
In-Reply-To: <1769047340-113287-4-git-send-email-shawn.lin@rock-chips.com>
On Thu, 22 Jan 2026 10:02:20 +0800
Shawn Lin <shawn.lin@rock-chips.com> wrote:
>
> +#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;
> +
> + if (!pci_ltssm_tp_enabled())
> + goto skip_trace;
You can use:
if (!trace_pcie_ltssm_state_transition_enabled())
goto skip_trace;
The above is a static branch. That means when tracing is disabled, it is
basically:
goto skip_trace;
and when tracing is enabled it is a nop.
-- Steve
> +
> + 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 HW'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);
> + }
> +
> +skip_trace:
> + 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,
> @@ -291,6 +398,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;
> @@ -301,6 +411,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)
WARNING: multiple messages have this Message-ID (diff)
From: Steven Rostedt <rostedt@goodmis.org>
To: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Manivannan Sadhasivam <mani@kernel.org>,
Bjorn Helgaas <bhelgaas@google.com>,
linux-rockchip@lists.infradead.org, linux-pci@vger.kernel.org,
linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
Masami Hiramatsu <mhiramat@kernel.org>
Subject: Re: [PATCH v4 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support
Date: Tue, 24 Feb 2026 09:11:15 -0500 [thread overview]
Message-ID: <20260224091115.6e32c38e@fedora> (raw)
In-Reply-To: <1769047340-113287-4-git-send-email-shawn.lin@rock-chips.com>
On Thu, 22 Jan 2026 10:02:20 +0800
Shawn Lin <shawn.lin@rock-chips.com> wrote:
>
> +#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;
> +
> + if (!pci_ltssm_tp_enabled())
> + goto skip_trace;
You can use:
if (!trace_pcie_ltssm_state_transition_enabled())
goto skip_trace;
The above is a static branch. That means when tracing is disabled, it is
basically:
goto skip_trace;
and when tracing is enabled it is a nop.
-- Steve
> +
> + 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 HW'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);
> + }
> +
> +skip_trace:
> + 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,
> @@ -291,6 +398,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;
> @@ -301,6 +411,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)
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
next prev parent reply other threads:[~2026-02-24 14:11 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-22 2:02 [PATCH v4 0/3] PCI Controller event and LTSSM tracepoint support Shawn Lin
2026-01-22 2:02 ` Shawn Lin
2026-01-22 2:02 ` [PATCH v4 1/3] PCI: trace: Add PCI controller LTSSM transition tracepoint Shawn Lin
2026-01-22 2:02 ` Shawn Lin
2026-02-24 14:08 ` Steven Rostedt
2026-02-24 14:08 ` Steven Rostedt
2026-02-24 15:22 ` Ilpo Järvinen
2026-02-24 15:22 ` Ilpo Järvinen
2026-02-24 15:35 ` Manivannan Sadhasivam
2026-02-24 15:35 ` Manivannan Sadhasivam
2026-02-24 15:46 ` Ilpo Järvinen
2026-02-24 15:46 ` Ilpo Järvinen
2026-02-26 5:52 ` Manivannan Sadhasivam
2026-02-26 5:52 ` Manivannan Sadhasivam
2026-01-22 2:02 ` [PATCH v4 2/3] Documentation: tracing: Add PCI controller event documentation Shawn Lin
2026-01-22 2:02 ` Shawn Lin
2026-01-22 2:02 ` [PATCH v4 3/3] PCI: dw-rockchip: Add pcie_ltssm_state_transition trace support Shawn Lin
2026-01-22 2:02 ` Shawn Lin
2026-02-24 14:11 ` Steven Rostedt [this message]
2026-02-24 14:11 ` Steven Rostedt
2026-02-24 14:16 ` Steven Rostedt
2026-02-24 14:16 ` Steven Rostedt
2026-02-25 1:25 ` Shawn Lin
2026-02-25 1:25 ` Shawn Lin
2026-02-26 0:13 ` Steven Rostedt
2026-02-26 0:13 ` Steven Rostedt
2026-03-03 3:25 ` Shawn Lin
2026-03-03 3:25 ` Shawn Lin
2026-02-11 13:13 ` [PATCH v4 0/3] PCI Controller event and LTSSM tracepoint support Shawn Lin
2026-02-11 13:13 ` Shawn Lin
2026-02-11 15:40 ` Manivannan Sadhasivam
2026-02-11 15:40 ` Manivannan Sadhasivam
2026-02-24 8:49 ` Shawn Lin
2026-02-24 8:49 ` Shawn Lin
2026-02-24 14:06 ` Steven Rostedt
2026-02-24 14:06 ` Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260224091115.6e32c38e@fedora \
--to=rostedt@goodmis.org \
--cc=bhelgaas@google.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mani@kernel.org \
--cc=mhiramat@kernel.org \
--cc=shawn.lin@rock-chips.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.