linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Kobayashi,Daisuke" <kobayashi.da-06@fujitsu.com>
To: kobayashi.da-06@jp.fujitsu.com, linux-cxl@vger.kernel.org
Cc: y-goto@fujitsu.com, linux-pci@vger.kernel.org, mj@ucw.cz,
	dan.j.williams@intel.com,
	KobayashiDaisuke <kobayashi.da-06@fujitsu.com>
Subject: [PATCH v3 3/3] Add function to display cxl1.1 device link status
Date: Tue, 12 Mar 2024 17:05:59 +0900	[thread overview]
Message-ID: <20240312080559.14904-4-kobayashi.da-06@fujitsu.com> (raw)
In-Reply-To: <20240312080559.14904-1-kobayashi.da-06@fujitsu.com>

From: KobayashiDaisuke <kobayashi.da-06@fujitsu.com>

This patch adds a function to output the link status of the CXL1.1 device
when it is connected.

In CXL1.1, the link status of the device is included in the RCRB mapped to
the memory mapped register area. The value of that register is outputted
to sysfs, and based on that, displays the link status information.

Signed-off-by: "KobayashiDaisuke" <kobayashi.da-06@fujitsu.com>
---
 lib/access.c | 29 +++++++++++++++++++++
 lib/pci.h    |  2 ++
 ls-caps.c    | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 104 insertions(+)

diff --git a/lib/access.c b/lib/access.c
index 7d66123..bc75a84 100644
--- a/lib/access.c
+++ b/lib/access.c
@@ -12,6 +12,7 @@
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
+#include <fcntl.h>
 
 #include "internal.h"
 
@@ -268,3 +269,31 @@ pci_get_string_property(struct pci_dev *d, u32 prop)
 
   return NULL;
 }
+
+#define OBJNAMELEN 1024
+#define OBJBUFSIZE 64
+int
+get_rcd_sysfs_obj_file(struct pci_dev *d, char *object, char *result)
+{
+#ifdef PCI_HAVE_PM_LINUX_SYSFS
+  char namebuf[OBJNAMELEN];
+  int n = snprintf(namebuf, OBJNAMELEN, "%s/devices/%04x:%02x:%02x.%d/%s",
+		   pci_get_param(d->access, "sysfs.path"),
+       d->domain, d->bus, d->dev, d->func, object);
+  if (n < 0 || n >= OBJNAMELEN){
+    d->access->error("Failed to get filename");
+    return -1;
+    }
+  int fd = open(namebuf, O_RDONLY);
+  if(fd < 0)
+    return -1;
+  n = read(fd, result, OBJBUFSIZE);
+  if (n < 0 || n >= OBJBUFSIZE){
+    d->access->error("Failed to read the file");
+    return -1;
+  }
+  return 0;
+#else
+  return -1;
+#endif
+}
diff --git a/lib/pci.h b/lib/pci.h
index 2322bf7..fb25069 100644
--- a/lib/pci.h
+++ b/lib/pci.h
@@ -187,6 +187,8 @@ int pci_write_long(struct pci_dev *, int pos, u32 data) PCI_ABI;
 int pci_read_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;
 int pci_write_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;
 
+int get_rcd_sysfs_obj_file(struct pci_dev *d, char *object, char *result) PCI_ABI;
+
 /*
  * Most device properties take some effort to obtain, so libpci does not
  * initialize them during default bus scan. Instead, you have to call
diff --git a/ls-caps.c b/ls-caps.c
index 1b63262..12c9f34 100644
--- a/ls-caps.c
+++ b/ls-caps.c
@@ -10,6 +10,8 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <fcntl.h>
+#include <stdlib.h>
 
 #include "lspci.h"
 
@@ -1381,6 +1383,74 @@ static void cap_express_slot2(struct device *d UNUSED, int where UNUSED)
   /* No capabilities that require this field in PCIe rev2.0 spec. */
 }
 
+#define OBJBUFSIZE 64
+static void cap_express_link_rcd(struct device *d){
+  u32 t, aspm, cap_speed, cap_width, sta_speed, sta_width;
+  u16 w;
+  struct pci_dev *pdev = d->dev;
+  char buf[OBJBUFSIZE];
+
+  if(get_rcd_sysfs_obj_file(pdev, "rcd_link_cap", buf))
+    return;
+  t = (u32)strtoul(buf, NULL, 16);
+
+  aspm = (t & PCI_EXP_LNKCAP_ASPM) >> 10;
+  cap_speed = t & PCI_EXP_LNKCAP_SPEED;
+  cap_width = (t & PCI_EXP_LNKCAP_WIDTH) >> 4;
+  printf("\t\tLnkCap:\tPort #%d, Speed %s, Width x%d, ASPM %s",
+	t >> 24,
+	link_speed(cap_speed), cap_width,
+	aspm_support(aspm));
+  if (aspm)
+    {
+      printf(", Exit Latency ");
+      if (aspm & 1)
+	printf("L0s %s", latency_l0s((t & PCI_EXP_LNKCAP_L0S) >> 12));
+      if (aspm & 2)
+	printf("%sL1 %s", (aspm & 1) ? ", " : "",
+	    latency_l1((t & PCI_EXP_LNKCAP_L1) >> 15));
+    }
+  printf("\n");
+  printf("\t\t\tClockPM%c Surprise%c LLActRep%c BwNot%c ASPMOptComp%c\n",
+	FLAG(t, PCI_EXP_LNKCAP_CLOCKPM),
+	FLAG(t, PCI_EXP_LNKCAP_SURPRISE),
+	FLAG(t, PCI_EXP_LNKCAP_DLLA),
+	FLAG(t, PCI_EXP_LNKCAP_LBNC),
+	FLAG(t, PCI_EXP_LNKCAP_AOC));
+
+  if(!get_rcd_sysfs_obj_file(pdev, "rcd_link_ctrl", buf)){
+    w = (u16)strtoul(buf, NULL, 16);    
+    printf("\t\tLnkCtl:\tASPM %s;", aspm_enabled(w & PCI_EXP_LNKCTL_ASPM));
+    printf(" Disabled%c CommClk%c\n\t\t\tExtSynch%c ClockPM%c AutWidDis%c BWInt%c AutBWInt%c\n",
+    FLAG(w, PCI_EXP_LNKCTL_DISABLE),
+    FLAG(w, PCI_EXP_LNKCTL_CLOCK),
+    FLAG(w, PCI_EXP_LNKCTL_XSYNCH),
+    FLAG(w, PCI_EXP_LNKCTL_CLOCKPM),
+    FLAG(w, PCI_EXP_LNKCTL_HWAUTWD),
+    FLAG(w, PCI_EXP_LNKCTL_BWMIE),
+    FLAG(w, PCI_EXP_LNKCTL_AUTBWIE));
+  }
+
+  if(!get_rcd_sysfs_obj_file(pdev, "rcd_link_status", buf)){
+    w = (u16)strtoul(buf, NULL, 16);    
+    sta_speed = w & PCI_EXP_LNKSTA_SPEED;
+    sta_width = (w & PCI_EXP_LNKSTA_WIDTH) >> 4;
+    printf("\t\tLnkSta:\tSpeed %s%s, Width x%d%s\n",
+    link_speed(sta_speed),
+    link_compare(PCI_EXP_TYPE_ROOT_INT_EP, sta_speed, cap_speed),
+    sta_width,
+    link_compare(PCI_EXP_TYPE_ROOT_INT_EP, sta_width, cap_width));
+    printf("\t\t\tTrErr%c Train%c SlotClk%c DLActive%c BWMgmt%c ABWMgmt%c\n",
+    FLAG(w, PCI_EXP_LNKSTA_TR_ERR),
+    FLAG(w, PCI_EXP_LNKSTA_TRAIN),
+    FLAG(w, PCI_EXP_LNKSTA_SL_CLK),
+    FLAG(w, PCI_EXP_LNKSTA_DL_ACT),
+    FLAG(w, PCI_EXP_LNKSTA_BWMGMT),
+    FLAG(w, PCI_EXP_LNKSTA_AUTBW));
+  }
+  return;
+}
+
 static int
 cap_express(struct device *d, int where, int cap)
 {
@@ -1445,6 +1515,9 @@ cap_express(struct device *d, int where, int cap)
   cap_express_dev(d, where, type);
   if (link)
     cap_express_link(d, where, type);
+  else if (type == PCI_EXP_TYPE_ROOT_INT_EP)
+    cap_express_link_rcd(d);
+   
   if (slot)
     cap_express_slot(d, where);
   if (type == PCI_EXP_TYPE_ROOT_PORT || type == PCI_EXP_TYPE_ROOT_EC)
-- 
2.43.0


  parent reply	other threads:[~2024-03-12  8:03 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-12  8:05 [PATCH v3 0/3] Display cxl1.1 device link status Kobayashi,Daisuke
2024-03-12  8:05 ` [PATCH v3 1/3] Add sysfs attribute for CXL 1.1 " Kobayashi,Daisuke
2024-03-26 19:51   ` Dan Williams
2024-03-28  1:47     ` Daisuke Kobayashi (Fujitsu)
2024-04-03  9:40       ` Daisuke Kobayashi (Fujitsu)
2024-04-05  8:31         ` Daisuke Kobayashi (Fujitsu)
2024-04-08 21:43           ` Dan Williams
2024-04-09  4:55             ` Daisuke Kobayashi (Fujitsu)
2024-04-05 17:25         ` Jonathan Cameron
2024-04-08 21:32         ` Dan Williams
2024-04-09 14:59   ` Bjorn Helgaas
2024-04-09 15:00     ` Bjorn Helgaas
2024-03-12  8:05 ` [PATCH v3 2/3] Remove conditional branch that is not suitable for cxl1.1 devices Kobayashi,Daisuke
2024-03-26 20:00   ` Dan Williams
2024-03-27  8:26     ` Daisuke Kobayashi (Fujitsu)
2024-03-12  8:05 ` Kobayashi,Daisuke [this message]
2024-03-26 20:05   ` [PATCH v3 3/3] Add function to display cxl1.1 device link status Dan Williams
2024-03-27  8:27     ` Daisuke Kobayashi (Fujitsu)
2024-03-29 22:23   ` Martin Mareš
2024-03-30  1:15     ` Dan Williams
2024-03-31  1:03       ` Martin Mareš
2024-04-01 17:47         ` Dan Williams
2024-04-02  7:09           ` Daisuke Kobayashi (Fujitsu)
2024-03-25  4:49 ` [PATCH v3 0/3] Display " Daisuke Kobayashi (Fujitsu)
2024-03-26 19:15 ` Dan Williams
2024-03-27  8:24   ` Daisuke Kobayashi (Fujitsu)

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=20240312080559.14904-4-kobayashi.da-06@fujitsu.com \
    --to=kobayashi.da-06@fujitsu.com \
    --cc=dan.j.williams@intel.com \
    --cc=kobayashi.da-06@jp.fujitsu.com \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=mj@ucw.cz \
    --cc=y-goto@fujitsu.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).