s390/pci: fmb enhancements
[cascardo/linux.git] / arch / s390 / pci / pci_debug.c
index c555de3..38993b1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright IBM Corp. 2012
+ *  Copyright IBM Corp. 2012,2015
  *
  *  Author(s):
  *    Jan Glauber <jang@linux.vnet.ibm.com>
@@ -23,22 +23,45 @@ EXPORT_SYMBOL_GPL(pci_debug_msg_id);
 debug_info_t *pci_debug_err_id;
 EXPORT_SYMBOL_GPL(pci_debug_err_id);
 
-static char *pci_perf_names[] = {
-       /* hardware counters */
+static char *pci_common_names[] = {
        "Load operations",
        "Store operations",
        "Store block operations",
        "Refresh operations",
+};
+
+static char *pci_fmt0_names[] = {
        "DMA read bytes",
        "DMA write bytes",
 };
 
+static char *pci_fmt1_names[] = {
+       "Received bytes",
+       "Received packets",
+       "Transmitted bytes",
+       "Transmitted packets",
+};
+
+static char *pci_fmt2_names[] = {
+       "Consumed work units",
+       "Maximum work units",
+};
+
 static char *pci_sw_names[] = {
        "Allocated pages",
        "Mapped pages",
        "Unmapped pages",
 };
 
+static void pci_fmb_show(struct seq_file *m, char *name[], int length,
+                        u64 *data)
+{
+       int i;
+
+       for (i = 0; i < length; i++, data++)
+               seq_printf(m, "%26s:\t%llu\n", name[i], *data);
+}
+
 static void pci_sw_counter_show(struct seq_file *m)
 {
        struct zpci_dev *zdev = m->private;
@@ -53,8 +76,6 @@ static void pci_sw_counter_show(struct seq_file *m)
 static int pci_perf_show(struct seq_file *m, void *v)
 {
        struct zpci_dev *zdev = m->private;
-       u64 *stat;
-       int i;
 
        if (!zdev)
                return 0;
@@ -72,15 +93,27 @@ static int pci_perf_show(struct seq_file *m, void *v)
        seq_printf(m, "Samples: %u\n", zdev->fmb->samples);
        seq_printf(m, "Last update TOD: %Lx\n", zdev->fmb->last_update);
 
-       /* hardware counters */
-       stat = (u64 *) &zdev->fmb->ld_ops;
-       for (i = 0; i < 4; i++)
-               seq_printf(m, "%26s:\t%llu\n",
-                          pci_perf_names[i], *(stat + i));
-       if (zdev->fmb->dma_valid)
-               for (i = 4; i < 6; i++)
-                       seq_printf(m, "%26s:\t%llu\n",
-                                  pci_perf_names[i], *(stat + i));
+       pci_fmb_show(m, pci_common_names, ARRAY_SIZE(pci_common_names),
+                    &zdev->fmb->ld_ops);
+
+       switch (zdev->fmb->format) {
+       case 0:
+               if (!(zdev->fmb->fmt_ind & ZPCI_FMB_DMA_COUNTER_VALID))
+                       break;
+               pci_fmb_show(m, pci_fmt0_names, ARRAY_SIZE(pci_fmt0_names),
+                            &zdev->fmb->fmt0.dma_rbytes);
+               break;
+       case 1:
+               pci_fmb_show(m, pci_fmt1_names, ARRAY_SIZE(pci_fmt1_names),
+                            &zdev->fmb->fmt1.rx_bytes);
+               break;
+       case 2:
+               pci_fmb_show(m, pci_fmt2_names, ARRAY_SIZE(pci_fmt2_names),
+                            &zdev->fmb->fmt2.consumed_work_units);
+               break;
+       default:
+               seq_puts(m, "Unknown format\n");
+       }
 
        pci_sw_counter_show(m);
        mutex_unlock(&zdev->lock);