linux/arch/powerpc/include/asm/oprofile_impl.h
<<
>>
Prefs
   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 */
 136