Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci - Restore pci_subr.c rev. 1.135's change in pci_...



details:   https://anonhg.NetBSD.org/src/rev/31d01909d130
branches:  trunk
changeset: 341577:31d01909d130
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Thu Nov 12 12:17:59 2015 +0000

description:
- Restore pci_subr.c rev. 1.135's change in pci_conf_print_caplist().
  As wrote in the comment, HyperTransport capability appears multiple times.
  pci_conf_cap() reruns only the first entry, so it can't be used here.
- Try to decode HyperTransport capability. Currently, the capability type
  of each HyperTransport capability is printed and only the MSI Mapping
  capability is decoded.
- Style change.

diffstat:

 sys/dev/pci/pci_subr.c |  113 +++++++++++++++++++++++++++++++++++++++++++++---
 sys/dev/pci/pcireg.h   |   18 +++++--
 2 files changed, 118 insertions(+), 13 deletions(-)

diffs (207 lines):

diff -r 9480090c235a -r 31d01909d130 sys/dev/pci/pci_subr.c
--- a/sys/dev/pci/pci_subr.c    Thu Nov 12 12:08:13 2015 +0000
+++ b/sys/dev/pci/pci_subr.c    Thu Nov 12 12:17:59 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pci_subr.c,v 1.140 2015/10/30 20:03:45 msaitoh Exp $   */
+/*     $NetBSD: pci_subr.c,v 1.141 2015/11/12 12:17:59 msaitoh Exp $   */
 
 /*
  * Copyright (c) 1997 Zubin D. Dittia.  All rights reserved.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.140 2015/10/30 20:03:45 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.141 2015/11/12 12:17:59 msaitoh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_pci.h"
@@ -1232,7 +1232,96 @@
        }
 }
 
-/* XXX pci_conf_print_ldt_cap */
+/* pci_conf_print_ht_slave_cap */
+/* pci_conf_print_ht_host_cap */
+/* pci_conf_print_ht_switch_cap */
+/* pci_conf_print_ht_intr_cap */
+/* pci_conf_print_ht_revid_cap */
+/* pci_conf_print_ht_unitid_cap */
+/* pci_conf_print_ht_extcnf_cap */
+/* pci_conf_print_ht_addrmap_cap */
+/* pci_conf_print_ht_msimap_cap */
+
+static void
+pci_conf_print_ht_msimap_cap(const pcireg_t *regs, int capoff)
+{
+       pcireg_t val;
+       uint32_t lo, hi;
+
+       /*
+        * Print the rest of the command register bits. Others are
+        * printed in pci_conf_print_ht_cap().
+        */
+       val = regs[o2i(capoff + PCI_HT_CMD)];
+       onoff("Enable", val, PCI_HT_MSI_ENABLED);
+       onoff("Fixed", val, PCI_HT_MSI_FIXED);
+
+       lo = regs[o2i(capoff + PCI_HT_MSI_ADDR_LO)];
+       hi = regs[o2i(capoff + PCI_HT_MSI_ADDR_HI)];
+       printf("    Address Low register: 0x%08x\n", lo);
+       printf("    Address high register: 0x%08x\n", hi);
+       printf("      Address: 0x%016" PRIx64 "\n",
+           (uint64_t)hi << 32 | (lo & PCI_HT_MSI_ADDR_LO_MASK));
+}
+
+/* pci_conf_print_ht_droute_cap */
+/* pci_conf_print_ht_vcset_cap */
+/* pci_conf_print_ht_retry_cap */
+/* pci_conf_print_ht_x86enc_cap */
+/* pci_conf_print_ht_gen3_cap */
+/* pci_conf_print_ht_fle_cap */
+/* pci_conf_print_ht_pm_cap */
+/* pci_conf_print_ht_hnc_cap */
+
+static const struct ht_types {
+       pcireg_t cap;
+       const char *name;
+       void (*printfunc)(const pcireg_t *, int);
+} ht_captab[] = {
+       {PCI_HT_CAP_SLAVE,      "Slave or Primary Interface", NULL },
+       {PCI_HT_CAP_HOST,       "Host or Secondary Interface", NULL },
+       {PCI_HT_CAP_SWITCH,     "Switch", NULL },
+       {PCI_HT_CAP_INTERRUPT,  "Interrupt Discovery and Configuration", NULL},
+       {PCI_HT_CAP_REVID,      "Revision ID",  NULL },
+       {PCI_HT_CAP_UNITID_CLUMP, "UnitID Clumping",    NULL },
+       {PCI_HT_CAP_EXTCNFSPACE, "Extended Configuration Space Access", NULL },
+       {PCI_HT_CAP_ADDRMAP,    "Address Mapping",      NULL },
+       {PCI_HT_CAP_MSIMAP,     "MSI Mapping",  pci_conf_print_ht_msimap_cap },
+       {PCI_HT_CAP_DIRECTROUTE, "Direct Route",        NULL },
+       {PCI_HT_CAP_VCSET,      "VCSet",        NULL },
+       {PCI_HT_CAP_RETRYMODE,  "Retry Mode",   NULL },
+       {PCI_HT_CAP_X86ENCODE,  "X86 Encoding", NULL },
+       {PCI_HT_CAP_GEN3,       "Gen3", NULL },
+       {PCI_HT_CAP_FLE,        "Function-Level Extension",     NULL },
+       {PCI_HT_CAP_PM,         "Power Management",     NULL },
+       {PCI_HT_CAP_HIGHNODECNT, "High Node Count",     NULL },
+};
+
+static void
+pci_conf_print_ht_cap(const pcireg_t *regs, int capoff)
+{
+       pcireg_t val, foundcap;
+       unsigned int off;
+
+       val = regs[o2i(capoff + PCI_HT_CMD)];
+
+       printf("\n  HyperTransport Capability Register at 0x%02x\n", capoff);
+
+       printf("    Command register: 0x%04x\n", val >> 16);
+       foundcap = PCI_HT_CAP(val);
+       for (off = 0; off < __arraycount(ht_captab); off++) {
+               if (ht_captab[off].cap == foundcap)
+                       break;
+       }
+       printf("      Capability Type: 0x%02x ", foundcap);
+       if (off >= __arraycount(ht_captab)) {
+               printf("(unknown)\n");
+               return;
+       }
+       printf("(%s)\n", ht_captab[off].name);
+       if (ht_captab[off].printfunc != NULL)
+               ht_captab[off].printfunc(regs, off);
+}
 
 static void
 pci_conf_print_vendspec_cap(const pcireg_t *regs, int capoff)
@@ -1887,7 +1976,7 @@
        { PCI_CAP_MSI,          "MSI",          pci_conf_print_msi_cap }, 
        { PCI_CAP_CPCI_HOTSWAP, "CompactPCI Hot-swapping", NULL },
        { PCI_CAP_PCIX,         "PCI-X",        pci_conf_print_pcix_cap },
-       { PCI_CAP_LDT,          "HyperTransport", NULL },
+       { PCI_CAP_LDT,          "HyperTransport", pci_conf_print_ht_cap },
        { PCI_CAP_VENDSPEC,     "Vendor-specific",
          pci_conf_print_vendspec_cap },
        { PCI_CAP_DEBUGPORT,    "Debug Port",   pci_conf_print_debugport_cap },
@@ -1911,8 +2000,7 @@
        int off;
 
        for (off = PCI_CAPLIST_PTR(regs[o2i(capoff)]);
-            off != 0;
-            off = PCI_CAPLIST_NEXT(rval)) {
+            off != 0; off = PCI_CAPLIST_NEXT(rval)) {
                rval = regs[o2i(off)];
                if (capid == PCI_CAPLIST_CAP(rval)) {
                        if (offsetp != NULL)
@@ -1942,8 +2030,7 @@
 
        /* Print capability register's offset and the type first */
        for (off = PCI_CAPLIST_PTR(regs[o2i(capoff)]);
-            off != 0;
-            off = PCI_CAPLIST_NEXT(regs[o2i(off)])) {
+            off != 0; off = PCI_CAPLIST_NEXT(regs[o2i(off)])) {
                rval = regs[o2i(off)];
                printf("  Capability register at 0x%02x\n", off);
 
@@ -1971,11 +2058,21 @@
                 * the same. This is required because some capabilities
                 * appear multiple times (e.g. HyperTransport capability).
                 */
+#if 0
                if (pci_conf_find_cap(regs, capoff, i, &off)) {
                        rval = regs[o2i(off)];
                        if (pci_captab[i].printfunc != NULL)
                                pci_captab[i].printfunc(regs, off);
                }
+#else
+               for (off = PCI_CAPLIST_PTR(regs[o2i(capoff)]);
+                    off != 0; off = PCI_CAPLIST_NEXT(regs[o2i(off)])) {
+                       rval = regs[o2i(off)];
+                       if ((PCI_CAPLIST_CAP(rval) == i)
+                           && (pci_captab[i].printfunc != NULL))
+                               pci_captab[i].printfunc(regs, off);
+               }
+#endif
        }
 }
 
diff -r 9480090c235a -r 31d01909d130 sys/dev/pci/pcireg.h
--- a/sys/dev/pci/pcireg.h      Thu Nov 12 12:08:13 2015 +0000
+++ b/sys/dev/pci/pcireg.h      Thu Nov 12 12:17:59 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pcireg.h,v 1.107 2015/11/12 12:08:13 msaitoh Exp $     */
+/*     $NetBSD: pcireg.h,v 1.108 2015/11/12 12:17:59 msaitoh Exp $     */
 
 /*
  * Copyright (c) 1995, 1996, 1999, 2000
@@ -783,8 +783,6 @@
 
 #define PCI_HT_CMD     0x00    /* Capability List & Command Register */
 #define        PCI_HT_CMD_MASK         __BITS(31, 16)
-#define PCI_HT_MSI_ENABLED     __BIT(16)
-#define PCI_HT_MSI_FIXED       __BIT(17)
 #define PCI_HT_CAP(cr) ((((cr) >> 27) < 0x08) ?                                      \
     (((cr) >> 27) & 0x1c) : (((cr) >> 27) & 0x1f))
 #define PCI_HT_CAPMASK         __BITS(31, 27)
@@ -806,9 +804,19 @@
 #define PCI_HT_CAP_PM          0b11100
 #define PCI_HT_CAP_HIGHNODECNT 0b11101
 
-#define PCI_HT_MSI_ADDR_LO     0x04
-#define PCI_HT_MSI_ADDR_HI     0x08
+/*
+ * HT Cap ID: 0b10101
+ * MSI Mapping
+ */
+
+/* Command register bits (31-16)*/
+#define PCI_HT_MSI_ENABLED     __BIT(16)
+#define PCI_HT_MSI_FIXED       __BIT(17)
+
+#define PCI_HT_MSI_ADDR_LO     0x04 /* Address register (low) */
+#define PCI_HT_MSI_ADDR_LO_MASK        __BITS(31, 20)
 #define PCI_HT_MSI_FIXED_ADDR  0xfee00000UL
+#define PCI_HT_MSI_ADDR_HI     0x08 /* Address Register (high) */
 
 /*
  * Capability ID: 0x09



Home | Main Index | Thread Index | Old Index