> 
> 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

Reply via email to