-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sparc64: Move generic PCR support code to seperate file.
It all lives in the oprofile support code currently and we will need to share this stuff with NMI watchdog and perf_counter support. Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
David S. Miller
committed
Jan 29, 2009
1 parent
5376071
commit 3eb8057
Showing
6 changed files
with
177 additions
and
108 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
#ifndef __PCR_H | ||
#define __PCR_H | ||
|
||
struct pcr_ops { | ||
u64 (*read)(void); | ||
void (*write)(u64); | ||
}; | ||
extern const struct pcr_ops *pcr_ops; | ||
|
||
extern void deferred_pcr_work_irq(int irq, struct pt_regs *regs); | ||
extern void schedule_deferred_pcr_work(void); | ||
|
||
#define PCR_PIC_PRIV 0x00000001 /* PIC access is privileged */ | ||
#define PCR_STRACE 0x00000002 /* Trace supervisor events */ | ||
#define PCR_UTRACE 0x00000004 /* Trace user events */ | ||
#define PCR_N2_HTRACE 0x00000008 /* Trace hypervisor events */ | ||
#define PCR_N2_TOE_OV0 0x00000010 /* Trap if PIC 0 overflows */ | ||
#define PCR_N2_TOE_OV1 0x00000020 /* Trap if PIC 1 overflows */ | ||
#define PCR_N2_MASK0 0x00003fc0 | ||
#define PCR_N2_MASK0_SHIFT 6 | ||
#define PCR_N2_SL0 0x0003c000 | ||
#define PCR_N2_SL0_SHIFT 14 | ||
#define PCR_N2_OV0 0x00040000 | ||
#define PCR_N2_MASK1 0x07f80000 | ||
#define PCR_N2_MASK1_SHIFT 19 | ||
#define PCR_N2_SL1 0x78000000 | ||
#define PCR_N2_SL1_SHIFT 27 | ||
#define PCR_N2_OV1 0x80000000 | ||
|
||
#endif /* __PCR_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
/* pcr.c: Generic sparc64 performance counter infrastructure. | ||
* | ||
* Copyright (C) 2009 David S. Miller (davem@davemloft.net) | ||
*/ | ||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/init.h> | ||
#include <linux/irq.h> | ||
|
||
#include <asm/pil.h> | ||
#include <asm/pcr.h> | ||
|
||
/* This code is shared between various users of the performance | ||
* counters. Users will be oprofile, pseudo-NMI watchdog, and the | ||
* perf_counter support layer. | ||
*/ | ||
|
||
/* Performance counter interrupts run unmasked at PIL level 15. | ||
* Therefore we can't do things like wakeups and other work | ||
* that expects IRQ disabling to be adhered to in locking etc. | ||
* | ||
* Therefore in such situations we defer the work by signalling | ||
* a lower level cpu IRQ. | ||
*/ | ||
void deferred_pcr_work_irq(int irq, struct pt_regs *regs) | ||
{ | ||
clear_softint(1 << PIL_DEFERRED_PCR_WORK); | ||
} | ||
|
||
void schedule_deferred_pcr_work(void) | ||
{ | ||
set_softint(1 << PIL_DEFERRED_PCR_WORK); | ||
} | ||
|
||
const struct pcr_ops *pcr_ops; | ||
EXPORT_SYMBOL_GPL(pcr_ops); | ||
|
||
static u64 direct_pcr_read(void) | ||
{ | ||
u64 val; | ||
|
||
read_pcr(val); | ||
return val; | ||
} | ||
|
||
static void direct_pcr_write(u64 val) | ||
{ | ||
write_pcr(val); | ||
} | ||
|
||
static const struct pcr_ops direct_pcr_ops = { | ||
.read = direct_pcr_read, | ||
.write = direct_pcr_write, | ||
}; | ||
|
||
static void n2_pcr_write(u64 val) | ||
{ | ||
unsigned long ret; | ||
|
||
ret = sun4v_niagara2_setperf(HV_N2_PERF_SPARC_CTL, val); | ||
if (val != HV_EOK) | ||
write_pcr(val); | ||
} | ||
|
||
static const struct pcr_ops n2_pcr_ops = { | ||
.read = direct_pcr_read, | ||
.write = n2_pcr_write, | ||
}; | ||
|
||
static unsigned long perf_hsvc_group; | ||
static unsigned long perf_hsvc_major; | ||
static unsigned long perf_hsvc_minor; | ||
|
||
static int __init register_perf_hsvc(void) | ||
{ | ||
if (tlb_type == hypervisor) { | ||
switch (sun4v_chip_type) { | ||
case SUN4V_CHIP_NIAGARA1: | ||
perf_hsvc_group = HV_GRP_NIAG_PERF; | ||
break; | ||
|
||
case SUN4V_CHIP_NIAGARA2: | ||
perf_hsvc_group = HV_GRP_N2_CPU; | ||
break; | ||
|
||
default: | ||
return -ENODEV; | ||
} | ||
|
||
|
||
perf_hsvc_major = 1; | ||
perf_hsvc_minor = 0; | ||
if (sun4v_hvapi_register(perf_hsvc_group, | ||
perf_hsvc_major, | ||
&perf_hsvc_minor)) { | ||
printk("perfmon: Could not register hvapi.\n"); | ||
return -ENODEV; | ||
} | ||
} | ||
return 0; | ||
} | ||
|
||
static void __init unregister_perf_hsvc(void) | ||
{ | ||
if (tlb_type != hypervisor) | ||
return; | ||
sun4v_hvapi_unregister(perf_hsvc_group); | ||
} | ||
|
||
int __init pcr_arch_init(void) | ||
{ | ||
int err = register_perf_hsvc(); | ||
|
||
if (err) | ||
return err; | ||
|
||
switch (tlb_type) { | ||
case hypervisor: | ||
pcr_ops = &n2_pcr_ops; | ||
break; | ||
|
||
case spitfire: | ||
case cheetah: | ||
case cheetah_plus: | ||
pcr_ops = &direct_pcr_ops; | ||
break; | ||
|
||
default: | ||
err = -ENODEV; | ||
goto out_unregister; | ||
} | ||
|
||
return 0; | ||
|
||
out_unregister: | ||
unregister_perf_hsvc(); | ||
return err; | ||
} | ||
|
||
arch_initcall(pcr_arch_init); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters