2014-03-14 13:00:38 +08:00
|
|
|
#ifndef LINUX_POWERPC_PERF_HV_24X7_CATALOG_H_
|
|
|
|
#define LINUX_POWERPC_PERF_HV_24X7_CATALOG_H_
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
|
|
|
|
/* From document "24x7 Event and Group Catalog Formats Proposal" v0.15 */
|
|
|
|
|
|
|
|
struct hv_24x7_catalog_page_0 {
|
|
|
|
#define HV_24X7_CATALOG_MAGIC 0x32347837 /* "24x7" in ASCII */
|
|
|
|
__be32 magic;
|
|
|
|
__be32 length; /* In 4096 byte pages */
|
|
|
|
__be64 version; /* XXX: arbitrary? what's the meaning/useage/purpose? */
|
|
|
|
__u8 build_time_stamp[16]; /* "YYYYMMDDHHMMSS\0\0" */
|
|
|
|
__u8 reserved2[32];
|
|
|
|
__be16 schema_data_offs; /* in 4096 byte pages */
|
|
|
|
__be16 schema_data_len; /* in 4096 byte pages */
|
|
|
|
__be16 schema_entry_count;
|
|
|
|
__u8 reserved3[2];
|
|
|
|
__be16 event_data_offs;
|
|
|
|
__be16 event_data_len;
|
|
|
|
__be16 event_entry_count;
|
|
|
|
__u8 reserved4[2];
|
|
|
|
__be16 group_data_offs; /* in 4096 byte pages */
|
|
|
|
__be16 group_data_len; /* in 4096 byte pages */
|
|
|
|
__be16 group_entry_count;
|
|
|
|
__u8 reserved5[2];
|
|
|
|
__be16 formula_data_offs; /* in 4096 byte pages */
|
|
|
|
__be16 formula_data_len; /* in 4096 byte pages */
|
|
|
|
__be16 formula_entry_count;
|
|
|
|
__u8 reserved6[2];
|
|
|
|
} __packed;
|
|
|
|
|
powerpc/perf/hv-24x7: parse catalog and populate sysfs with events
Retrieves and parses the 24x7 catalog on POWER systems that supply it
(right now, only POWER 8). Events are exposed via sysfs in the standard
fashion, and are all parameterized.
$ cd /sys/bus/event_source/devices/hv_24x7/events
$ cat HPM_CS_FROM_L4_LDATA__PHYS_CORE
domain=0x2,offset=0xd58,core=?,lpar=0x0
$ cat HPM_TLBIE__VCPU_HOME_CHIP
domain=0x4,offset=0x358,vcpu=?,lpar=?
where user is required to specify values for the fields with '?' (like
core, vcpu, lpar above), when specifying the event with the perf tool.
Catalog is (at the moment) only parsed on boot. It needs re-parsing
when a some hypervisor events occur. At that point we'll also need to
prevent old events from continuing to function (counter that is passed
in via spare space in the config values?).
Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2015-01-31 05:46:00 +08:00
|
|
|
struct hv_24x7_event_data {
|
|
|
|
__be16 length; /* in bytes, must be a multiple of 16 */
|
|
|
|
__u8 reserved1[2];
|
|
|
|
__u8 domain; /* Chip = 1, Core = 2 */
|
|
|
|
__u8 reserved2[1];
|
|
|
|
__be16 event_group_record_offs; /* in bytes, must be 8 byte aligned */
|
|
|
|
__be16 event_group_record_len; /* in bytes */
|
|
|
|
|
|
|
|
/* in bytes, offset from event_group_record */
|
|
|
|
__be16 event_counter_offs;
|
|
|
|
|
|
|
|
/* verified_state, unverified_state, caveat_state, broken_state, ... */
|
|
|
|
__be32 flags;
|
|
|
|
|
|
|
|
__be16 primary_group_ix;
|
|
|
|
__be16 group_count;
|
|
|
|
__be16 event_name_len;
|
|
|
|
__u8 remainder[];
|
|
|
|
/* __u8 event_name[event_name_len - 2]; */
|
|
|
|
/* __be16 event_description_len; */
|
|
|
|
/* __u8 event_desc[event_description_len - 2]; */
|
|
|
|
/* __be16 detailed_desc_len; */
|
|
|
|
/* __u8 detailed_desc[detailed_desc_len - 2]; */
|
|
|
|
} __packed;
|
|
|
|
|
2014-03-14 13:00:38 +08:00
|
|
|
#endif
|