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