Merge tag 'perf-core-2021-02-17' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / include / uapi / linux / perf_event.h
index cb6f841..ad15e40 100644 (file)
@@ -145,12 +145,14 @@ enum perf_event_sample_format {
        PERF_SAMPLE_CGROUP                      = 1U << 21,
        PERF_SAMPLE_DATA_PAGE_SIZE              = 1U << 22,
        PERF_SAMPLE_CODE_PAGE_SIZE              = 1U << 23,
+       PERF_SAMPLE_WEIGHT_STRUCT               = 1U << 24,
 
-       PERF_SAMPLE_MAX = 1U << 24,             /* non-ABI */
+       PERF_SAMPLE_MAX = 1U << 25,             /* non-ABI */
 
        __PERF_SAMPLE_CALLCHAIN_EARLY           = 1ULL << 63, /* non-ABI; internal use */
 };
 
+#define PERF_SAMPLE_WEIGHT_TYPE        (PERF_SAMPLE_WEIGHT | PERF_SAMPLE_WEIGHT_STRUCT)
 /*
  * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set
  *
@@ -912,7 +914,24 @@ enum perf_event_type {
         *        char                  data[size];
         *        u64                   dyn_size; } && PERF_SAMPLE_STACK_USER
         *
-        *      { u64                   weight;   } && PERF_SAMPLE_WEIGHT
+        *      { union perf_sample_weight
+        *       {
+        *              u64             full; && PERF_SAMPLE_WEIGHT
+        *      #if defined(__LITTLE_ENDIAN_BITFIELD)
+        *              struct {
+        *                      u32     var1_dw;
+        *                      u16     var2_w;
+        *                      u16     var3_w;
+        *              } && PERF_SAMPLE_WEIGHT_STRUCT
+        *      #elif defined(__BIG_ENDIAN_BITFIELD)
+        *              struct {
+        *                      u16     var3_w;
+        *                      u16     var2_w;
+        *                      u32     var1_dw;
+        *              } && PERF_SAMPLE_WEIGHT_STRUCT
+        *      #endif
+        *       }
+        *      }
         *      { u64                   data_src; } && PERF_SAMPLE_DATA_SRC
         *      { u64                   transaction; } && PERF_SAMPLE_TRANSACTION
         *      { u64                   abi; # enum perf_sample_regs_abi
@@ -1159,14 +1178,16 @@ union perf_mem_data_src {
                        mem_lvl_num:4,  /* memory hierarchy level number */
                        mem_remote:1,   /* remote */
                        mem_snoopx:2,   /* snoop mode, ext */
-                       mem_rsvd:24;
+                       mem_blk:3,      /* access blocked */
+                       mem_rsvd:21;
        };
 };
 #elif defined(__BIG_ENDIAN_BITFIELD)
 union perf_mem_data_src {
        __u64 val;
        struct {
-               __u64   mem_rsvd:24,
+               __u64   mem_rsvd:21,
+                       mem_blk:3,      /* access blocked */
                        mem_snoopx:2,   /* snoop mode, ext */
                        mem_remote:1,   /* remote */
                        mem_lvl_num:4,  /* memory hierarchy level number */
@@ -1249,6 +1270,12 @@ union perf_mem_data_src {
 #define PERF_MEM_TLB_OS                0x40 /* OS fault handler */
 #define PERF_MEM_TLB_SHIFT     26
 
+/* Access blocked */
+#define PERF_MEM_BLK_NA                0x01 /* not available */
+#define PERF_MEM_BLK_DATA      0x02 /* data could not be forwarded */
+#define PERF_MEM_BLK_ADDR      0x04 /* address conflict */
+#define PERF_MEM_BLK_SHIFT     40
+
 #define PERF_MEM_S(a, s) \
        (((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT)
 
@@ -1280,4 +1307,23 @@ struct perf_branch_entry {
                reserved:40;
 };
 
+union perf_sample_weight {
+       __u64           full;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+       struct {
+               __u32   var1_dw;
+               __u16   var2_w;
+               __u16   var3_w;
+       };
+#elif defined(__BIG_ENDIAN_BITFIELD)
+       struct {
+               __u16   var3_w;
+               __u16   var2_w;
+               __u32   var1_dw;
+       };
+#else
+#error "Unknown endianness"
+#endif
+};
+
 #endif /* _UAPI_LINUX_PERF_EVENT_H */