Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.9.4.
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/*
  3 * Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM
  4 *
  5 * Based on alpha version.
  6 */
  7
  8#ifndef _ASM_POWERPC_OPROFILE_IMPL_H
  9#define _ASM_POWERPC_OPROFILE_IMPL_H
 10#ifdef __KERNEL__
 11
 12#define OP_MAX_COUNTER 8
 13
 14/* Per-counter configuration as set via oprofilefs.  */
 15struct op_counter_config {
 16	unsigned long enabled;
 17	unsigned long event;
 18	unsigned long count;
 19	/* Classic doesn't support per-counter user/kernel selection */
 20	unsigned long kernel;
 21	unsigned long user;
 22	unsigned long unit_mask;
 23};
 24
 25/* System-wide configuration as set via oprofilefs.  */
 26struct op_system_config {
 27#ifdef CONFIG_PPC64
 28	unsigned long mmcr0;
 29	unsigned long mmcr1;
 30	unsigned long mmcra;
 31#ifdef CONFIG_OPROFILE_CELL
 32	/* Register for oprofile user tool to check cell kernel profiling
 33	 * support.
 34	 */
 35	unsigned long cell_support;
 36#endif
 37#endif
 38	unsigned long enable_kernel;
 39	unsigned long enable_user;
 40};
 41
 42/* Per-arch configuration */
 43struct op_powerpc_model {
 44	int (*reg_setup) (struct op_counter_config *,
 45			   struct op_system_config *,
 46			   int num_counters);
 47	int  (*cpu_setup) (struct op_counter_config *);
 48	int  (*start) (struct op_counter_config *);
 49	int  (*global_start) (struct op_counter_config *);
 50	void (*stop) (void);
 51	void (*global_stop) (void);
 52	int (*sync_start)(void);
 53	int (*sync_stop)(void);
 54	void (*handle_interrupt) (struct pt_regs *,
 55				  struct op_counter_config *);
 56	int num_counters;
 57};
 58
 59extern struct op_powerpc_model op_model_fsl_emb;
 60extern struct op_powerpc_model op_model_power4;
 61extern struct op_powerpc_model op_model_7450;
 62extern struct op_powerpc_model op_model_cell;
 63extern struct op_powerpc_model op_model_pa6t;
 64
 65
 66/* All the classic PPC parts use these */
 67static inline unsigned int classic_ctr_read(unsigned int i)
 68{
 69	switch(i) {
 70	case 0:
 71		return mfspr(SPRN_PMC1);
 72	case 1:
 73		return mfspr(SPRN_PMC2);
 74	case 2:
 75		return mfspr(SPRN_PMC3);
 76	case 3:
 77		return mfspr(SPRN_PMC4);
 78	case 4:
 79		return mfspr(SPRN_PMC5);
 80	case 5:
 81		return mfspr(SPRN_PMC6);
 82
 83/* No PPC32 chip has more than 6 so far */
 84#ifdef CONFIG_PPC64
 85	case 6:
 86		return mfspr(SPRN_PMC7);
 87	case 7:
 88		return mfspr(SPRN_PMC8);
 89#endif
 90	default:
 91		return 0;
 92	}
 93}
 94
 95static inline void classic_ctr_write(unsigned int i, unsigned int val)
 96{
 97	switch(i) {
 98	case 0:
 99		mtspr(SPRN_PMC1, val);
100		break;
101	case 1:
102		mtspr(SPRN_PMC2, val);
103		break;
104	case 2:
105		mtspr(SPRN_PMC3, val);
106		break;
107	case 3:
108		mtspr(SPRN_PMC4, val);
109		break;
110	case 4:
111		mtspr(SPRN_PMC5, val);
112		break;
113	case 5:
114		mtspr(SPRN_PMC6, val);
115		break;
116
117/* No PPC32 chip has more than 6, yet */
118#ifdef CONFIG_PPC64
119	case 6:
120		mtspr(SPRN_PMC7, val);
121		break;
122	case 7:
123		mtspr(SPRN_PMC8, val);
124		break;
125#endif
126	default:
127		break;
128	}
129}
130
131
132extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth);
133
134#endif /* __KERNEL__ */
135#endif /* _ASM_POWERPC_OPROFILE_IMPL_H */