[S390] perf: add support for s390x CPU counters
[linux-2.6.git] / arch / s390 / include / asm / cpu_mf.h
index d91dd38..e49db5d 100644 (file)
@@ -1,12 +1,95 @@
+/*
+ * CPU-measurement facilities
+ *
+ *  Copyright IBM Corp. 2012
+ *  Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
+ *            Jan Glauber <jang@linux.vnet.ibm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (version 2 only)
+ * as published by the Free Software Foundation.
+ */
 #ifndef _ASM_S390_CPU_MF_H
 #define _ASM_S390_CPU_MF_H
 
-#define CPU_MF_INT_SF_MASK     0xffc00000
-
 #define CPU_MF_INT_SF_IAE      (1 << 31)       /* invalid entry address */
 #define CPU_MF_INT_SF_ISE      (1 << 30)       /* incorrect SDBT entry */
 #define CPU_MF_INT_SF_PRA      (1 << 29)       /* program request alert */
 #define CPU_MF_INT_SF_SACA     (1 << 23)       /* sampler auth. change alert */
 #define CPU_MF_INT_SF_LSDA     (1 << 22)       /* loss of sample data alert */
+#define CPU_MF_INT_CF_CACA     (1 <<  7)       /* counter auth. change alert */
+#define CPU_MF_INT_CF_LCDA     (1 <<  6)       /* loss of counter data alert */
+
+#define CPU_MF_INT_CF_MASK     (CPU_MF_INT_CF_CACA|CPU_MF_INT_CF_LCDA)
+#define CPU_MF_INT_SF_MASK     (CPU_MF_INT_SF_IAE|CPU_MF_INT_SF_ISE|   \
+                                CPU_MF_INT_SF_PRA|CPU_MF_INT_SF_SACA|  \
+                                CPU_MF_INT_SF_LSDA)
+
+/* CPU measurement facility support */
+static inline int cpum_cf_avail(void)
+{
+       return MACHINE_HAS_SPP && test_facility(67);
+}
+
+static inline int cpum_sf_avail(void)
+{
+       return MACHINE_HAS_SPP && test_facility(68);
+}
+
+
+struct cpumf_ctr_info {
+       u16   cfvn;
+       u16   auth_ctl;
+       u16   enable_ctl;
+       u16   act_ctl;
+       u16   max_cpu;
+       u16   csvn;
+       u16   max_cg;
+       u16   reserved1;
+       u32   reserved2[12];
+} __packed;
+
+/* Query counter information */
+static inline int qctri(struct cpumf_ctr_info *info)
+{
+       int rc = -EINVAL;
+
+       asm volatile (
+               "0:     .insn   s,0xb28e0000,%1\n"
+               "1:     lhi     %0,0\n"
+               "2:\n"
+               EX_TABLE(1b, 2b)
+               : "+d" (rc), "=Q" (*info));
+       return rc;
+}
+
+/* Load CPU-counter-set controls */
+static inline int lcctl(u64 ctl)
+{
+       int cc;
+
+       asm volatile (
+               "       .insn   s,0xb2840000,%1\n"
+               "       ipm     %0\n"
+               "       srl     %0,28\n"
+               : "=d" (cc) : "m" (ctl) : "cc");
+       return cc;
+}
+
+/* Extract CPU counter */
+static inline int ecctr(u64 ctr, u64 *val)
+{
+       register u64 content asm("4") = 0;
+       int cc;
+
+       asm volatile (
+               "       .insn   rre,0xb2e40000,%0,%2\n"
+               "       ipm     %1\n"
+               "       srl     %1,28\n"
+               : "=d" (content), "=d" (cc) : "d" (ctr) : "cc");
+       if (!cc)
+               *val = content;
+       return cc;
+}
 
-#endif
+#endif /* _ASM_S390_CPU_MF_H */