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; if (!zdev->fmb) return seq_printf(m, "FMB statistics disabled\n"); /* header */ seq_printf(m, "FMB @ %p\n", zdev->fmb); seq_printf(m, "Update interval: %u ms\n", zdev->fmb_update); 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_sw_counter_show(m); return 0; }
static int pci_perf_show(struct seq_file *m, void *v) { struct zpci_dev *zdev = m->private; if (!zdev) return 0; mutex_lock(&zdev->lock); if (!zdev->fmb) { mutex_unlock(&zdev->lock); seq_puts(m, "FMB statistics disabled\n"); return 0; } /* header */ seq_printf(m, "Update interval: %u ms\n", zdev->fmb_update); seq_printf(m, "Samples: %u\n", zdev->fmb->samples); seq_printf(m, "Last update TOD: %Lx\n", zdev->fmb->last_update); 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; case 3: pci_fmb_show(m, pci_fmt3_names, ARRAY_SIZE(pci_fmt3_names), &zdev->fmb->fmt3.tx_bytes); break; default: seq_puts(m, "Unknown format\n"); } pci_sw_counter_show(m); mutex_unlock(&zdev->lock); return 0; }