> > From: Kan Liang <kan.li...@intel.com> > > As of Skylake Server, there are a number of free-running counters in > each IIO Box that collect counts for per box IO clocks and per Port > Input/Output x BW/Utilization. > Add a new PMU for these free-running counters. Don't let them share with > the GP counters of IIO box. Otherwise, it will result in some (probably) > unexpected scheduling artifacts. > > The free running counter is read-only and always active. Counting will > be suspended only when the IIO Box is powered down. > > There are three types of IIO free running counters on Skylake server, IO > CLOCKS counter, BANDWIDTH counters and UTILIZATION counters. > IO CLOCKS counter is to count IO clocks. > BANDWIDTH counters are to count inbound(PCIe->CPU)/outbound(CPU- > >PCIe) > bandwidth. > UTILIZATION counters are to count input/output utilization. > > The bit width of the free running counters is 36-bits. > > Signed-off-by: Kan Liang <kan.li...@intel.com> > --- > > Changes since V6: > - Add a new PMU for IIO free-running counters. >
Hi Peter, Could you please review the patch? If it's OK for you, could you please merge the patch set? Thanks, Kan > arch/x86/events/intel/uncore_snbep.c | 82 > ++++++++++++++++++++++++++++++++++++ > 1 file changed, 82 insertions(+) > > diff --git a/arch/x86/events/intel/uncore_snbep.c > b/arch/x86/events/intel/uncore_snbep.c > index 22ec65b..d6b302e 100644 > --- a/arch/x86/events/intel/uncore_snbep.c > +++ b/arch/x86/events/intel/uncore_snbep.c > @@ -3484,6 +3484,87 @@ static struct intel_uncore_type skx_uncore_iio = { > .format_group = &skx_uncore_iio_format_group, > }; > > +enum perf_uncore_iio_freerunning_type_id { > + SKX_IIO_MSR_IOCLK = 0, > + SKX_IIO_MSR_BW = 1, > + SKX_IIO_MSR_UTIL = 2, > + > + SKX_IIO_FREERUNNING_TYPE_MAX, > +}; > + > + > +static struct freerunning_counters skx_iio_freerunning[] = { > + [SKX_IIO_MSR_IOCLK] = { 0xa45, 0x1, 0x20, 1, 36 }, > + [SKX_IIO_MSR_BW] = { 0xb00, 0x1, 0x10, 8, 36 }, > + [SKX_IIO_MSR_UTIL] = { 0xb08, 0x1, 0x10, 8, 36 }, > +}; > + > +static struct uncore_event_desc skx_uncore_iio_freerunning_events[] = { > + /* Free-Running IO CLOCKS Counter */ > + INTEL_UNCORE_EVENT_DESC(ioclk, > "event=0xff,umask=0x10"), > + /* Free-Running IIO BANDWIDTH Counters */ > + INTEL_UNCORE_EVENT_DESC(bw_in_port0, > "event=0xff,umask=0x20"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port1, > "event=0xff,umask=0x21"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port2, > "event=0xff,umask=0x22"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port3, > "event=0xff,umask=0x23"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port0, > "event=0xff,umask=0x24"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port0.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port0.unit, "MiB"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port1, > "event=0xff,umask=0x25"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port1.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port1.unit, "MiB"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port2, > "event=0xff,umask=0x26"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port2.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port2.unit, "MiB"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port3, > "event=0xff,umask=0x27"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port3.scale, > "3.814697266e-6"), > + INTEL_UNCORE_EVENT_DESC(bw_out_port3.unit, "MiB"), > + /* Free-running IIO UTILIZATION Counters */ > + INTEL_UNCORE_EVENT_DESC(util_in_port0, > "event=0xff,umask=0x30"), > + INTEL_UNCORE_EVENT_DESC(util_out_port0, > "event=0xff,umask=0x31"), > + INTEL_UNCORE_EVENT_DESC(util_in_port1, > "event=0xff,umask=0x32"), > + INTEL_UNCORE_EVENT_DESC(util_out_port1, > "event=0xff,umask=0x33"), > + INTEL_UNCORE_EVENT_DESC(util_in_port2, > "event=0xff,umask=0x34"), > + INTEL_UNCORE_EVENT_DESC(util_out_port2, > "event=0xff,umask=0x35"), > + INTEL_UNCORE_EVENT_DESC(util_in_port3, > "event=0xff,umask=0x36"), > + INTEL_UNCORE_EVENT_DESC(util_out_port3, > "event=0xff,umask=0x37"), > + { /* end: all zeroes */ }, > +}; > + > +static struct intel_uncore_ops skx_uncore_iio_freerunning_ops = { > + .read_counter = uncore_msr_read_counter, > +}; > + > +static struct attribute *skx_uncore_iio_freerunning_formats_attr[] = { > + &format_attr_event.attr, > + &format_attr_umask.attr, > + NULL, > +}; > + > +static const struct attribute_group > skx_uncore_iio_freerunning_format_group = { > + .name = "format", > + .attrs = skx_uncore_iio_freerunning_formats_attr, > +}; > + > +static struct intel_uncore_type skx_uncore_iio_free_running = { > + .name = "iio_free_running", > + .num_counters = 17, > + .num_boxes = 6, > + .num_freerunning_types = SKX_IIO_FREERUNNING_TYPE_MAX, > + .freerunning = skx_iio_freerunning, > + .ops = &skx_uncore_iio_freerunning_ops, > + .event_descs = skx_uncore_iio_freerunning_events, > + .format_group = > &skx_uncore_iio_freerunning_format_group, > +}; > + > static struct attribute *skx_uncore_formats_attr[] = { > &format_attr_event.attr, > &format_attr_umask.attr, > @@ -3557,6 +3638,7 @@ static struct intel_uncore_type *skx_msr_uncores[] > = { > &skx_uncore_ubox, > &skx_uncore_chabox, > &skx_uncore_iio, > + &skx_uncore_iio_free_running, > &skx_uncore_irp, > &skx_uncore_pcu, > NULL, > -- > 2.7.4