sparc64: Abstract away PIC register accesses.
And, like for the PCR, allow indexing of different PIC register numbers. This also removes all of the non-__KERNEL__ bits from asm/perfctr.h, nothing kernel side should include it any more. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
#define __PCR_H
|
||||
|
||||
struct pcr_ops {
|
||||
u64 (*read)(unsigned long);
|
||||
void (*write)(unsigned long, u64);
|
||||
u64 (*read_pcr)(unsigned long);
|
||||
void (*write_pcr)(unsigned long, u64);
|
||||
u64 (*read_pic)(unsigned long);
|
||||
void (*write_pic)(unsigned long, u64);
|
||||
};
|
||||
extern const struct pcr_ops *pcr_ops;
|
||||
|
||||
|
@@ -54,11 +54,6 @@ enum perfctr_opcode {
|
||||
PERFCTR_GETPCR
|
||||
};
|
||||
|
||||
/* I don't want the kernel's namespace to be polluted with this
|
||||
* stuff when this file is included. --DaveM
|
||||
*/
|
||||
#ifndef __KERNEL__
|
||||
|
||||
#define PRIV 0x00000001
|
||||
#define SYS 0x00000002
|
||||
#define USR 0x00000004
|
||||
@@ -168,29 +163,4 @@ struct vcounter_struct {
|
||||
unsigned long long vcnt1;
|
||||
};
|
||||
|
||||
#else /* !(__KERNEL__) */
|
||||
|
||||
#ifndef CONFIG_SPARC32
|
||||
|
||||
/* Performance counter register access. */
|
||||
#define read_pcr(__p) __asm__ __volatile__("rd %%pcr, %0" : "=r" (__p))
|
||||
#define write_pcr(__p) __asm__ __volatile__("wr %0, 0x0, %%pcr" : : "r" (__p))
|
||||
#define read_pic(__p) __asm__ __volatile__("rd %%pic, %0" : "=r" (__p))
|
||||
|
||||
/* Blackbird errata workaround. See commentary in
|
||||
* arch/sparc64/kernel/smp.c:smp_percpu_timer_interrupt()
|
||||
* for more information.
|
||||
*/
|
||||
#define write_pic(__p) \
|
||||
__asm__ __volatile__("ba,pt %%xcc, 99f\n\t" \
|
||||
" nop\n\t" \
|
||||
".align 64\n" \
|
||||
"99:wr %0, 0x0, %%pic\n\t" \
|
||||
"rd %%pic, %%g0" : : "r" (__p))
|
||||
#define reset_pic() write_pic(0)
|
||||
|
||||
#endif /* !CONFIG_SPARC32 */
|
||||
|
||||
#endif /* !(__KERNEL__) */
|
||||
|
||||
#endif /* !(PERF_COUNTER_API) */
|
||||
|
Reference in New Issue
Block a user