s390/oprofile: move hwsampler interfaces to cpu_mf.h
Extract and move the oprofile hwsampler data structures and interfaces to the cpu_mf.h header file which contains common interface definitions for the various CPU-measurement facilities. This change is necessary for a new perf PMU. Few interface names have been revised to fit to the latest CPU-measurement facilities documentation. Also declare the data structures as __packed and correct checkpatch findings. Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
52733e0152
commit
cf48ad8327
@ -56,6 +56,78 @@ struct cpumf_ctr_info {
|
||||
u32 reserved2[12];
|
||||
} __packed;
|
||||
|
||||
/* QUERY SAMPLING INFORMATION block */
|
||||
struct hws_qsi_info_block { /* Bit(s) */
|
||||
unsigned int b0_13:14; /* 0-13: zeros */
|
||||
unsigned int as:1; /* 14: sampling authorisation control*/
|
||||
unsigned int b15_21:7; /* 15-21: zeros */
|
||||
unsigned int es:1; /* 22: sampling enable control */
|
||||
unsigned int b23_29:7; /* 23-29: zeros */
|
||||
unsigned int cs:1; /* 30: sampling activation control */
|
||||
unsigned int:1; /* 31: reserved */
|
||||
unsigned int bsdes:16; /* 4-5: size of basic sampling entry */
|
||||
unsigned int dsdes:16; /* 6-7: size of diagnostic sampling entry */
|
||||
unsigned long min_sampl_rate; /* 8-15: minimum sampling interval */
|
||||
unsigned long max_sampl_rate; /* 16-23: maximum sampling interval*/
|
||||
unsigned long tear; /* 24-31: TEAR contents */
|
||||
unsigned long dear; /* 32-39: DEAR contents */
|
||||
unsigned int rsvrd0; /* 40-43: reserved */
|
||||
unsigned int cpu_speed; /* 44-47: CPU speed */
|
||||
unsigned long long rsvrd1; /* 48-55: reserved */
|
||||
unsigned long long rsvrd2; /* 56-63: reserved */
|
||||
} __packed;
|
||||
|
||||
/* SET SAMPLING CONTROLS request block */
|
||||
struct hws_lsctl_request_block {
|
||||
unsigned int s:1; /* 0: maximum buffer indicator */
|
||||
unsigned int h:1; /* 1: part. level reserved for VM use*/
|
||||
unsigned long long b2_53:52;/* 2-53: zeros */
|
||||
unsigned int es:1; /* 54: sampling enable control */
|
||||
unsigned int b55_61:7; /* 55-61: - zeros */
|
||||
unsigned int cs:1; /* 62: sampling activation control */
|
||||
unsigned int b63:1; /* 63: zero */
|
||||
unsigned long interval; /* 8-15: sampling interval */
|
||||
unsigned long tear; /* 16-23: TEAR contents */
|
||||
unsigned long dear; /* 24-31: DEAR contents */
|
||||
/* 32-63: */
|
||||
unsigned long rsvrd1; /* reserved */
|
||||
unsigned long rsvrd2; /* reserved */
|
||||
unsigned long rsvrd3; /* reserved */
|
||||
unsigned long rsvrd4; /* reserved */
|
||||
} __packed;
|
||||
|
||||
|
||||
struct hws_data_entry {
|
||||
unsigned int def:16; /* 0-15 Data Entry Format */
|
||||
unsigned int R:4; /* 16-19 reserved */
|
||||
unsigned int U:4; /* 20-23 Number of unique instruct. */
|
||||
unsigned int z:2; /* zeros */
|
||||
unsigned int T:1; /* 26 PSW DAT mode */
|
||||
unsigned int W:1; /* 27 PSW wait state */
|
||||
unsigned int P:1; /* 28 PSW Problem state */
|
||||
unsigned int AS:2; /* 29-30 PSW address-space control */
|
||||
unsigned int I:1; /* 31 entry valid or invalid */
|
||||
unsigned int:16;
|
||||
unsigned int prim_asn:16; /* primary ASN */
|
||||
unsigned long long ia; /* Instruction Address */
|
||||
unsigned long long gpp; /* Guest Program Parameter */
|
||||
unsigned long long hpp; /* Host Program Parameter */
|
||||
} __packed;
|
||||
|
||||
struct hws_trailer_entry {
|
||||
unsigned int f:1; /* 0 - Block Full Indicator */
|
||||
unsigned int a:1; /* 1 - Alert request control */
|
||||
unsigned int t:1; /* 2 - Timestamp format */
|
||||
unsigned long long:61; /* 3 - 63: Reserved */
|
||||
unsigned long long overflow; /* 64 - sample Overflow count */
|
||||
unsigned long long timestamp; /* 16 - time-stamp */
|
||||
unsigned long long timestamp1; /* */
|
||||
unsigned long long reserved1; /* 32 -Reserved */
|
||||
unsigned long long reserved2; /* */
|
||||
unsigned long long progusage1; /* 48 - reserved for programming use */
|
||||
unsigned long long progusage2; /* */
|
||||
} __packed;
|
||||
|
||||
/* Query counter information */
|
||||
static inline int qctri(struct cpumf_ctr_info *info)
|
||||
{
|
||||
@ -99,4 +171,70 @@ static inline int ecctr(u64 ctr, u64 *val)
|
||||
return cc;
|
||||
}
|
||||
|
||||
/* Query sampling information */
|
||||
static inline int qsi(struct hws_qsi_info_block *info)
|
||||
{
|
||||
int cc;
|
||||
cc = 1;
|
||||
|
||||
asm volatile(
|
||||
"0: .insn s,0xb2860000,0(%1)\n"
|
||||
"1: lhi %0,0\n"
|
||||
"2:\n"
|
||||
EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
|
||||
: "=d" (cc), "+a" (info)
|
||||
: "m" (*info)
|
||||
: "cc", "memory");
|
||||
|
||||
return cc ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
/* Load sampling controls */
|
||||
static inline int lsctl(struct hws_lsctl_request_block *req)
|
||||
{
|
||||
int cc;
|
||||
|
||||
cc = 1;
|
||||
asm volatile(
|
||||
"0: .insn s,0xb2870000,0(%1)\n"
|
||||
"1: ipm %0\n"
|
||||
" srl %0,28\n"
|
||||
"2:\n"
|
||||
EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
|
||||
: "+d" (cc), "+a" (req)
|
||||
: "m" (*req)
|
||||
: "cc", "memory");
|
||||
|
||||
return cc ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
/* Sampling control helper functions */
|
||||
|
||||
#define SDB_TE_ALERT_REQ_MASK 0x4000000000000000UL
|
||||
#define SDB_TE_BUFFER_FULL_MASK 0x8000000000000000UL
|
||||
|
||||
/* Return pointer to trailer entry of an sample data block */
|
||||
static inline unsigned long *trailer_entry_ptr(unsigned long v)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
ret = (void *) v;
|
||||
ret += PAGE_SIZE;
|
||||
ret -= sizeof(struct hws_trailer_entry);
|
||||
|
||||
return (unsigned long *) ret;
|
||||
}
|
||||
|
||||
/* Return if the entry in the sample data block table (sdbt)
|
||||
* is a link to the next sdbt */
|
||||
static inline int is_link_entry(unsigned long *s)
|
||||
{
|
||||
return *s & 0x1ul ? 1 : 0;
|
||||
}
|
||||
|
||||
/* Return pointer to the linked sdbt */
|
||||
static inline unsigned long *get_next_sdbt(unsigned long *s)
|
||||
{
|
||||
return (unsigned long *) (*s & ~0x1ul);
|
||||
}
|
||||
#endif /* _ASM_S390_CPU_MF_H */
|
||||
|
@ -26,9 +26,6 @@
|
||||
#define MAX_NUM_SDB 511
|
||||
#define MIN_NUM_SDB 1
|
||||
|
||||
#define ALERT_REQ_MASK 0x4000000000000000ul
|
||||
#define BUFFER_FULL_MASK 0x8000000000000000ul
|
||||
|
||||
DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer);
|
||||
|
||||
struct hws_execute_parms {
|
||||
@ -65,43 +62,6 @@ static unsigned long interval;
|
||||
static unsigned long min_sampler_rate;
|
||||
static unsigned long max_sampler_rate;
|
||||
|
||||
static int ssctl(void *buffer)
|
||||
{
|
||||
int cc;
|
||||
|
||||
/* set in order to detect a program check */
|
||||
cc = 1;
|
||||
|
||||
asm volatile(
|
||||
"0: .insn s,0xB2870000,0(%1)\n"
|
||||
"1: ipm %0\n"
|
||||
" srl %0,28\n"
|
||||
"2:\n"
|
||||
EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
|
||||
: "+d" (cc), "+a" (buffer)
|
||||
: "m" (*((struct hws_ssctl_request_block *)buffer))
|
||||
: "cc", "memory");
|
||||
|
||||
return cc ? -EINVAL : 0 ;
|
||||
}
|
||||
|
||||
static int qsi(void *buffer)
|
||||
{
|
||||
int cc;
|
||||
cc = 1;
|
||||
|
||||
asm volatile(
|
||||
"0: .insn s,0xB2860000,0(%1)\n"
|
||||
"1: lhi %0,0\n"
|
||||
"2:\n"
|
||||
EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
|
||||
: "=d" (cc), "+a" (buffer)
|
||||
: "m" (*((struct hws_qsi_info_block *)buffer))
|
||||
: "cc", "memory");
|
||||
|
||||
return cc ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
static void execute_qsi(void *parms)
|
||||
{
|
||||
struct hws_execute_parms *ep = parms;
|
||||
@ -113,7 +73,7 @@ static void execute_ssctl(void *parms)
|
||||
{
|
||||
struct hws_execute_parms *ep = parms;
|
||||
|
||||
ep->rc = ssctl(ep->buffer);
|
||||
ep->rc = lsctl(ep->buffer);
|
||||
}
|
||||
|
||||
static int smp_ctl_ssctl_stop(int cpu)
|
||||
@ -214,17 +174,6 @@ static int smp_ctl_qsi(int cpu)
|
||||
return ep.rc;
|
||||
}
|
||||
|
||||
static inline unsigned long *trailer_entry_ptr(unsigned long v)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
ret = (void *)v;
|
||||
ret += PAGE_SIZE;
|
||||
ret -= sizeof(struct hws_trailer_entry);
|
||||
|
||||
return (unsigned long *) ret;
|
||||
}
|
||||
|
||||
static void hws_ext_handler(struct ext_code ext_code,
|
||||
unsigned int param32, unsigned long param64)
|
||||
{
|
||||
@ -256,16 +205,6 @@ static void init_all_cpu_buffers(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int is_link_entry(unsigned long *s)
|
||||
{
|
||||
return *s & 0x1ul ? 1 : 0;
|
||||
}
|
||||
|
||||
static unsigned long *get_next_sdbt(unsigned long *s)
|
||||
{
|
||||
return (unsigned long *) (*s & ~0x1ul);
|
||||
}
|
||||
|
||||
static int prepare_cpu_buffers(void)
|
||||
{
|
||||
int cpu;
|
||||
@ -353,7 +292,7 @@ static int allocate_sdbt(int cpu)
|
||||
}
|
||||
*sdbt = sdb;
|
||||
trailer = trailer_entry_ptr(*sdbt);
|
||||
*trailer = ALERT_REQ_MASK;
|
||||
*trailer = SDB_TE_ALERT_REQ_MASK;
|
||||
sdbt++;
|
||||
mutex_unlock(&hws_sem_oom);
|
||||
}
|
||||
@ -829,7 +768,7 @@ static void worker_on_interrupt(unsigned int cpu)
|
||||
|
||||
trailer = trailer_entry_ptr(*sdbt);
|
||||
/* leave loop if no more work to do */
|
||||
if (!(*trailer & BUFFER_FULL_MASK)) {
|
||||
if (!(*trailer & SDB_TE_BUFFER_FULL_MASK)) {
|
||||
done = 1;
|
||||
if (!hws_flush_all)
|
||||
continue;
|
||||
|
@ -9,27 +9,7 @@
|
||||
#define HWSAMPLER_H_
|
||||
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct hws_qsi_info_block /* QUERY SAMPLING information block */
|
||||
{ /* Bit(s) */
|
||||
unsigned int b0_13:14; /* 0-13: zeros */
|
||||
unsigned int as:1; /* 14: sampling authorisation control*/
|
||||
unsigned int b15_21:7; /* 15-21: zeros */
|
||||
unsigned int es:1; /* 22: sampling enable control */
|
||||
unsigned int b23_29:7; /* 23-29: zeros */
|
||||
unsigned int cs:1; /* 30: sampling activation control */
|
||||
unsigned int:1; /* 31: reserved */
|
||||
unsigned int bsdes:16; /* 4-5: size of sampling entry */
|
||||
unsigned int:16; /* 6-7: reserved */
|
||||
unsigned long min_sampl_rate; /* 8-15: minimum sampling interval */
|
||||
unsigned long max_sampl_rate; /* 16-23: maximum sampling interval*/
|
||||
unsigned long tear; /* 24-31: TEAR contents */
|
||||
unsigned long dear; /* 32-39: DEAR contents */
|
||||
unsigned int rsvrd0; /* 40-43: reserved */
|
||||
unsigned int cpu_speed; /* 44-47: CPU speed */
|
||||
unsigned long long rsvrd1; /* 48-55: reserved */
|
||||
unsigned long long rsvrd2; /* 56-63: reserved */
|
||||
};
|
||||
#include <asm/cpu_mf.h>
|
||||
|
||||
struct hws_ssctl_request_block /* SET SAMPLING CONTROLS req block */
|
||||
{ /* bytes 0 - 7 Bit(s) */
|
||||
@ -68,36 +48,6 @@ struct hws_cpu_buffer {
|
||||
unsigned int stop_mode:1;
|
||||
};
|
||||
|
||||
struct hws_data_entry {
|
||||
unsigned int def:16; /* 0-15 Data Entry Format */
|
||||
unsigned int R:4; /* 16-19 reserved */
|
||||
unsigned int U:4; /* 20-23 Number of unique instruct. */
|
||||
unsigned int z:2; /* zeros */
|
||||
unsigned int T:1; /* 26 PSW DAT mode */
|
||||
unsigned int W:1; /* 27 PSW wait state */
|
||||
unsigned int P:1; /* 28 PSW Problem state */
|
||||
unsigned int AS:2; /* 29-30 PSW address-space control */
|
||||
unsigned int I:1; /* 31 entry valid or invalid */
|
||||
unsigned int:16;
|
||||
unsigned int prim_asn:16; /* primary ASN */
|
||||
unsigned long long ia; /* Instruction Address */
|
||||
unsigned long long gpp; /* Guest Program Parameter */
|
||||
unsigned long long hpp; /* Host Program Parameter */
|
||||
};
|
||||
|
||||
struct hws_trailer_entry {
|
||||
unsigned int f:1; /* 0 - Block Full Indicator */
|
||||
unsigned int a:1; /* 1 - Alert request control */
|
||||
unsigned long:62; /* 2 - 63: Reserved */
|
||||
unsigned long overflow; /* 64 - sample Overflow count */
|
||||
unsigned long timestamp; /* 16 - time-stamp */
|
||||
unsigned long timestamp1; /* */
|
||||
unsigned long reserved1; /* 32 -Reserved */
|
||||
unsigned long reserved2; /* */
|
||||
unsigned long progusage1; /* 48 - reserved for programming use */
|
||||
unsigned long progusage2; /* */
|
||||
};
|
||||
|
||||
int hwsampler_setup(void);
|
||||
int hwsampler_shutdown(void);
|
||||
int hwsampler_allocate(unsigned long sdbt, unsigned long sdb);
|
||||
|
Loading…
Reference in New Issue
Block a user