From: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
To: linuxppc-dev@lists.ozlabs.org,
Frederic Barrat <fbarrat@linux.vnet.ibm.com>
Cc: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>,
Andrew Donnellan <andrew.donnellan@au1.ibm.com>,
Christophe Lombard <christophe_lombard@fr.ibm.com>,
Philippe Bergheaud <philippe.bergheaud@fr.ibm.com>,
"Alastair D'Silva" <alastair@linux.ibm.com>
Subject: [PATCH 3/3] cxl: Provide implementation for sl_ops.start_psltrace on PSL9
Date: Fri, 9 Feb 2018 09:55:35 +0530 [thread overview]
Message-ID: <20180209042535.16845-4-vaibhav@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180209042535.16845-1-vaibhav@linux.vnet.ibm.com>
We introduce a new function named cxl_start_trace_psl9() that starts
the various trace-arrays available on PSL9. The implementation
configures trace-array-units(TAU) via multiple writes to the
PSL_TRACECFG register and uses the defaults (data-bus, trigger-bus &
trigger-masks) provided by the h/w team for each trace-array. These
defaults are defined in array cxl_psl_trace_mask.
The implementation takes care of not re-initializing a trace-array in
case its already in 'FIN' or 'WFT' or 'INIT' state so as to not reset
the existing trace data. After moving the individual trace-arrays to
'INIT' state we poll the PSL_CTCCFG register to ensure the all
configured TAUs to move to WFT/FIN state so that no traces/triggers
are missed.
Signed-off-by: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
---
drivers/misc/cxl/pci.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index 9e8b8525534c..44b1843c5b7a 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -1767,6 +1767,78 @@ static void cxl_stop_trace_psl9(struct cxl *adapter)
}
}
+/* Default enable mask for various trace arrays */
+static const uint64_t cxl_psl_trace_mask[] = {
+ [CXL_PSL9_TRACEID_RX0] = 0x8200000000000000ULL,
+ [CXL_PSL9_TRACEID_RX1] = 0xAA00000000000001UL,
+ [CXL_PSL9_TRACEID_XSL] = 0x0,
+ [CXL_PSL9_TRACEID_CT0] = 0xA2B8000000000003UL,
+ [CXL_PSL9_TRACEID_CT1] = 0x0,
+ [CXL_PSL9_TRACEID_LA0] = 0x83FFC00000000005ULL,
+ [CXL_PSL9_TRACEID_LA1] = 0x83FFC00000000006ULL,
+ [CXL_PSL9_TRACEID_JM0] = 0x8200000000000007ULL,
+ [CXL_PSL9_TRACEID_DMA0] = 0x8200000000000008UL,
+ [CXL_PSL9_TRACEID_DMA1] = 0x8200000000000009UL,
+ [CXL_PSL9_TRACEID_REOA] = 0x0,
+};
+
+static void cxl_start_trace_psl9(struct cxl *adapter)
+{
+ int traceid;
+ unsigned long timeout;
+ struct pci_dev *dev = to_pci_dev(adapter->dev.parent);
+ uint64_t trace_mask, trace_cfg = cxl_p1_read(adapter, CXL_PSL9_CTCCFG);
+
+ dev_dbg(&dev->dev, "Enabling traces. PSL_CTCCFG=0x%016llx\n",
+ trace_cfg);
+
+ for (trace_mask = traceid = 0;
+ traceid < CXL_PSL9_TRACEID_MAX; ++traceid) {
+
+ if (cxl_psl_trace_mask[traceid] == 0)
+ continue;
+
+ if (CXL_PSL9_TRACE_STATE(trace_cfg, traceid) ==
+ CXL_PSL9_TRACESTATE_IDLE) {
+ dev_dbg(&dev->dev, "Traceid-%d Initializing\n",
+ traceid);
+ cxl_p1_write(adapter, CXL_PSL9_TRACECFG,
+ cxl_psl_trace_mask[traceid]);
+
+ /* filter out tlbie-response */
+ if (traceid == CXL_PSL9_TRACEID_LA0) {
+ cxl_p1_write(adapter, CXL_PSL9_TRACECFG,
+ 0x81FF400000000005ULL);
+ }
+
+ /* Mask so that we can poll for exit from INIT state */
+ trace_mask |= CXL_PSL9_TRACESTATE_WFT <<
+ (62 - traceid * 2);
+ } else {
+ dev_dbg(&dev->dev, "Traceid-%d already init.\n",
+ traceid);
+ }
+ }
+
+ /* poll until all the enabled arrays are out of INIT state */
+ timeout = jiffies + (HZ * CXL_TIMEOUT);
+ while (time_before(jiffies, timeout)) {
+ trace_cfg = cxl_p1_read(adapter, CXL_PSL9_CTCCFG);
+ if ((trace_cfg & trace_mask) == trace_mask)
+ break;
+ schedule();
+ }
+
+ if ((trace_cfg & trace_mask) != trace_mask) {
+ dev_warn(&dev->dev, "Trace init timeout."
+ "Some trace events may be missed.\n");
+ dev_dbg(&dev->dev, "cxl:CTCCFG=0x%016llx\n", trace_cfg);
+
+ } else {
+ dev_info(&dev->dev, "Traces enabled\n");
+ }
+}
+
static void cxl_stop_trace_psl8(struct cxl *adapter)
{
int slice;
@@ -1802,6 +1874,7 @@ static const struct cxl_service_layer_ops psl9_ops = {
.psl_irq_dump_registers = cxl_native_irq_dump_regs_psl9,
.err_irq_dump_registers = cxl_native_err_irq_dump_regs_psl9,
.stop_psltrace = cxl_stop_trace_psl9,
+ .start_psltrace = cxl_start_trace_psl9,
.timebase_read = timebase_read_psl9,
.capi_mode = OPAL_PHB_CAPI_MODE_CAPI,
.needs_reset_before_disable = true,
--
2.14.3
prev parent reply other threads:[~2018-02-09 4:26 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-09 4:25 [PATCH 0/3] Provide ability to enable PSL traces on card probe Vaibhav Jain
2018-02-09 4:25 ` [PATCH 1/3] cxl: Introduce various enums/defines for PSL9 trace arrays Vaibhav Jain
2018-02-09 13:08 ` christophe lombard
2018-02-11 16:46 ` Vaibhav Jain
2018-02-09 4:25 ` [PATCH 2/3] cxl: Introduce module parameter 'enable_psltrace' Vaibhav Jain
2018-02-09 13:14 ` christophe lombard
2018-02-11 17:10 ` Vaibhav Jain
2018-02-12 10:46 ` christophe lombard
2018-02-12 13:54 ` Frederic Barrat
2018-02-13 11:07 ` Vaibhav Jain
2018-02-09 4:25 ` Vaibhav Jain [this message]
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=20180209042535.16845-4-vaibhav@linux.vnet.ibm.com \
--to=vaibhav@linux.vnet.ibm.com \
--cc=alastair@linux.ibm.com \
--cc=andrew.donnellan@au1.ibm.com \
--cc=christophe_lombard@fr.ibm.com \
--cc=fbarrat@linux.vnet.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=philippe.bergheaud@fr.ibm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).