diff options
| author | Olof Johansson <olof@lixom.net> | 2007-01-28 22:23:54 -0500 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2007-02-06 22:03:19 -0500 |
| commit | 1bd2e5ae18a8f93333707d81d3dbd9209a255137 (patch) | |
| tree | 72feb6bae2a8dea311e2d9f2e412cfbc69a952fb | |
| parent | c69b767a2c871bb80cb9e346d6ebce248f711dfb (diff) | |
[POWERPC] Add PMC type to cputable
Add cputable entries for which type of PMC implementation the processor
has.
I've only filled in the current 64-bit processors, the unfilled default
value will have same behaviour as before so it can be done over time
as needed.
Also tidy up the dummy_perf implementation a bit, aggregating it into
one function with ifdefs instead of several.
Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
| -rw-r--r-- | arch/powerpc/kernel/cputable.c | 17 | ||||
| -rw-r--r-- | arch/powerpc/kernel/pmc.c | 35 | ||||
| -rw-r--r-- | include/asm-powerpc/cputable.h | 7 |
3 files changed, 33 insertions, 26 deletions
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index b742013bb9da..4939b3d56dfb 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
| @@ -86,6 +86,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 86 | .icache_bsize = 128, | 86 | .icache_bsize = 128, |
| 87 | .dcache_bsize = 128, | 87 | .dcache_bsize = 128, |
| 88 | .num_pmcs = 8, | 88 | .num_pmcs = 8, |
| 89 | .pmc_type = PPC_PMC_IBM, | ||
| 89 | .oprofile_cpu_type = "ppc64/power3", | 90 | .oprofile_cpu_type = "ppc64/power3", |
| 90 | .oprofile_type = PPC_OPROFILE_RS64, | 91 | .oprofile_type = PPC_OPROFILE_RS64, |
| 91 | .platform = "power3", | 92 | .platform = "power3", |
| @@ -99,6 +100,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 99 | .icache_bsize = 128, | 100 | .icache_bsize = 128, |
| 100 | .dcache_bsize = 128, | 101 | .dcache_bsize = 128, |
| 101 | .num_pmcs = 8, | 102 | .num_pmcs = 8, |
| 103 | .pmc_type = PPC_PMC_IBM, | ||
| 102 | .oprofile_cpu_type = "ppc64/power3", | 104 | .oprofile_cpu_type = "ppc64/power3", |
| 103 | .oprofile_type = PPC_OPROFILE_RS64, | 105 | .oprofile_type = PPC_OPROFILE_RS64, |
| 104 | .platform = "power3", | 106 | .platform = "power3", |
| @@ -112,6 +114,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 112 | .icache_bsize = 128, | 114 | .icache_bsize = 128, |
| 113 | .dcache_bsize = 128, | 115 | .dcache_bsize = 128, |
| 114 | .num_pmcs = 8, | 116 | .num_pmcs = 8, |
| 117 | .pmc_type = PPC_PMC_IBM, | ||
| 115 | .oprofile_cpu_type = "ppc64/rs64", | 118 | .oprofile_cpu_type = "ppc64/rs64", |
| 116 | .oprofile_type = PPC_OPROFILE_RS64, | 119 | .oprofile_type = PPC_OPROFILE_RS64, |
| 117 | .platform = "rs64", | 120 | .platform = "rs64", |
| @@ -125,6 +128,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 125 | .icache_bsize = 128, | 128 | .icache_bsize = 128, |
| 126 | .dcache_bsize = 128, | 129 | .dcache_bsize = 128, |
| 127 | .num_pmcs = 8, | 130 | .num_pmcs = 8, |
| 131 | .pmc_type = PPC_PMC_IBM, | ||
| 128 | .oprofile_cpu_type = "ppc64/rs64", | 132 | .oprofile_cpu_type = "ppc64/rs64", |
| 129 | .oprofile_type = PPC_OPROFILE_RS64, | 133 | .oprofile_type = PPC_OPROFILE_RS64, |
| 130 | .platform = "rs64", | 134 | .platform = "rs64", |
| @@ -138,6 +142,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 138 | .icache_bsize = 128, | 142 | .icache_bsize = 128, |
| 139 | .dcache_bsize = 128, | 143 | .dcache_bsize = 128, |
| 140 | .num_pmcs = 8, | 144 | .num_pmcs = 8, |
| 145 | .pmc_type = PPC_PMC_IBM, | ||
| 141 | .oprofile_cpu_type = "ppc64/rs64", | 146 | .oprofile_cpu_type = "ppc64/rs64", |
| 142 | .oprofile_type = PPC_OPROFILE_RS64, | 147 | .oprofile_type = PPC_OPROFILE_RS64, |
| 143 | .platform = "rs64", | 148 | .platform = "rs64", |
| @@ -151,6 +156,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 151 | .icache_bsize = 128, | 156 | .icache_bsize = 128, |
| 152 | .dcache_bsize = 128, | 157 | .dcache_bsize = 128, |
| 153 | .num_pmcs = 8, | 158 | .num_pmcs = 8, |
| 159 | .pmc_type = PPC_PMC_IBM, | ||
| 154 | .oprofile_cpu_type = "ppc64/rs64", | 160 | .oprofile_cpu_type = "ppc64/rs64", |
| 155 | .oprofile_type = PPC_OPROFILE_RS64, | 161 | .oprofile_type = PPC_OPROFILE_RS64, |
| 156 | .platform = "rs64", | 162 | .platform = "rs64", |
| @@ -164,6 +170,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 164 | .icache_bsize = 128, | 170 | .icache_bsize = 128, |
| 165 | .dcache_bsize = 128, | 171 | .dcache_bsize = 128, |
| 166 | .num_pmcs = 8, | 172 | .num_pmcs = 8, |
| 173 | .pmc_type = PPC_PMC_IBM, | ||
| 167 | .oprofile_cpu_type = "ppc64/power4", | 174 | .oprofile_cpu_type = "ppc64/power4", |
| 168 | .oprofile_type = PPC_OPROFILE_POWER4, | 175 | .oprofile_type = PPC_OPROFILE_POWER4, |
| 169 | .platform = "power4", | 176 | .platform = "power4", |
| @@ -177,6 +184,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 177 | .icache_bsize = 128, | 184 | .icache_bsize = 128, |
| 178 | .dcache_bsize = 128, | 185 | .dcache_bsize = 128, |
| 179 | .num_pmcs = 8, | 186 | .num_pmcs = 8, |
| 187 | .pmc_type = PPC_PMC_IBM, | ||
| 180 | .oprofile_cpu_type = "ppc64/power4", | 188 | .oprofile_cpu_type = "ppc64/power4", |
| 181 | .oprofile_type = PPC_OPROFILE_POWER4, | 189 | .oprofile_type = PPC_OPROFILE_POWER4, |
| 182 | .platform = "power4", | 190 | .platform = "power4", |
| @@ -191,6 +199,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 191 | .icache_bsize = 128, | 199 | .icache_bsize = 128, |
| 192 | .dcache_bsize = 128, | 200 | .dcache_bsize = 128, |
| 193 | .num_pmcs = 8, | 201 | .num_pmcs = 8, |
| 202 | .pmc_type = PPC_PMC_IBM, | ||
| 194 | .cpu_setup = __setup_cpu_ppc970, | 203 | .cpu_setup = __setup_cpu_ppc970, |
| 195 | .cpu_restore = __restore_cpu_ppc970, | 204 | .cpu_restore = __restore_cpu_ppc970, |
| 196 | .oprofile_cpu_type = "ppc64/970", | 205 | .oprofile_cpu_type = "ppc64/970", |
| @@ -207,6 +216,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 207 | .icache_bsize = 128, | 216 | .icache_bsize = 128, |
| 208 | .dcache_bsize = 128, | 217 | .dcache_bsize = 128, |
| 209 | .num_pmcs = 8, | 218 | .num_pmcs = 8, |
| 219 | .pmc_type = PPC_PMC_IBM, | ||
| 210 | .cpu_setup = __setup_cpu_ppc970, | 220 | .cpu_setup = __setup_cpu_ppc970, |
| 211 | .cpu_restore = __restore_cpu_ppc970, | 221 | .cpu_restore = __restore_cpu_ppc970, |
| 212 | .oprofile_cpu_type = "ppc64/970", | 222 | .oprofile_cpu_type = "ppc64/970", |
| @@ -239,6 +249,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 239 | .icache_bsize = 128, | 249 | .icache_bsize = 128, |
| 240 | .dcache_bsize = 128, | 250 | .dcache_bsize = 128, |
| 241 | .num_pmcs = 8, | 251 | .num_pmcs = 8, |
| 252 | .pmc_type = PPC_PMC_IBM, | ||
| 242 | .cpu_setup = __setup_cpu_ppc970, | 253 | .cpu_setup = __setup_cpu_ppc970, |
| 243 | .oprofile_cpu_type = "ppc64/970", | 254 | .oprofile_cpu_type = "ppc64/970", |
| 244 | .oprofile_type = PPC_OPROFILE_POWER4, | 255 | .oprofile_type = PPC_OPROFILE_POWER4, |
| @@ -253,6 +264,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 253 | .icache_bsize = 128, | 264 | .icache_bsize = 128, |
| 254 | .dcache_bsize = 128, | 265 | .dcache_bsize = 128, |
| 255 | .num_pmcs = 6, | 266 | .num_pmcs = 6, |
| 267 | .pmc_type = PPC_PMC_IBM, | ||
| 256 | .oprofile_cpu_type = "ppc64/power5", | 268 | .oprofile_cpu_type = "ppc64/power5", |
| 257 | .oprofile_type = PPC_OPROFILE_POWER4, | 269 | .oprofile_type = PPC_OPROFILE_POWER4, |
| 258 | /* SIHV / SIPR bits are implemented on POWER4+ (GQ) | 270 | /* SIHV / SIPR bits are implemented on POWER4+ (GQ) |
| @@ -271,6 +283,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 271 | .icache_bsize = 128, | 283 | .icache_bsize = 128, |
| 272 | .dcache_bsize = 128, | 284 | .dcache_bsize = 128, |
| 273 | .num_pmcs = 6, | 285 | .num_pmcs = 6, |
| 286 | .pmc_type = PPC_PMC_IBM, | ||
| 274 | .oprofile_cpu_type = "ppc64/power5+", | 287 | .oprofile_cpu_type = "ppc64/power5+", |
| 275 | .oprofile_type = PPC_OPROFILE_POWER4, | 288 | .oprofile_type = PPC_OPROFILE_POWER4, |
| 276 | .oprofile_mmcra_sihv = MMCRA_SIHV, | 289 | .oprofile_mmcra_sihv = MMCRA_SIHV, |
| @@ -321,6 +334,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 321 | .icache_bsize = 128, | 334 | .icache_bsize = 128, |
| 322 | .dcache_bsize = 128, | 335 | .dcache_bsize = 128, |
| 323 | .num_pmcs = 6, | 336 | .num_pmcs = 6, |
| 337 | .pmc_type = PPC_PMC_IBM, | ||
| 324 | .oprofile_cpu_type = "ppc64/power6", | 338 | .oprofile_cpu_type = "ppc64/power6", |
| 325 | .oprofile_type = PPC_OPROFILE_POWER4, | 339 | .oprofile_type = PPC_OPROFILE_POWER4, |
| 326 | .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, | 340 | .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, |
| @@ -340,6 +354,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 340 | .icache_bsize = 128, | 354 | .icache_bsize = 128, |
| 341 | .dcache_bsize = 128, | 355 | .dcache_bsize = 128, |
| 342 | .num_pmcs = 4, | 356 | .num_pmcs = 4, |
| 357 | .pmc_type = PPC_PMC_IBM, | ||
| 343 | .oprofile_cpu_type = "ppc64/cell-be", | 358 | .oprofile_cpu_type = "ppc64/cell-be", |
| 344 | .oprofile_type = PPC_OPROFILE_CELL, | 359 | .oprofile_type = PPC_OPROFILE_CELL, |
| 345 | .platform = "ppc-cell-be", | 360 | .platform = "ppc-cell-be", |
| @@ -353,6 +368,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 353 | .icache_bsize = 64, | 368 | .icache_bsize = 64, |
| 354 | .dcache_bsize = 64, | 369 | .dcache_bsize = 64, |
| 355 | .num_pmcs = 6, | 370 | .num_pmcs = 6, |
| 371 | .pmc_type = PPC_PMC_PA6T, | ||
| 356 | .platform = "pa6t", | 372 | .platform = "pa6t", |
| 357 | }, | 373 | }, |
| 358 | { /* default match */ | 374 | { /* default match */ |
| @@ -364,6 +380,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 364 | .icache_bsize = 128, | 380 | .icache_bsize = 128, |
| 365 | .dcache_bsize = 128, | 381 | .dcache_bsize = 128, |
| 366 | .num_pmcs = 6, | 382 | .num_pmcs = 6, |
| 383 | .pmc_type = PPC_PMC_IBM, | ||
| 367 | .platform = "power4", | 384 | .platform = "power4", |
| 368 | } | 385 | } |
| 369 | #endif /* CONFIG_PPC64 */ | 386 | #endif /* CONFIG_PPC64 */ |
diff --git a/arch/powerpc/kernel/pmc.c b/arch/powerpc/kernel/pmc.c index 3d8f6f44641e..e40f6ddd98a4 100644 --- a/arch/powerpc/kernel/pmc.c +++ b/arch/powerpc/kernel/pmc.c | |||
| @@ -19,38 +19,21 @@ | |||
| 19 | #include <asm/processor.h> | 19 | #include <asm/processor.h> |
| 20 | #include <asm/pmc.h> | 20 | #include <asm/pmc.h> |
| 21 | 21 | ||
| 22 | #if defined(CONFIG_FSL_BOOKE) && !defined(CONFIG_E200) | 22 | #ifndef MMCR0_PMA0 |
| 23 | static void dummy_perf(struct pt_regs *regs) | 23 | #define MMCR0_PMA0 0 |
| 24 | { | ||
| 25 | unsigned int pmgc0 = mfpmr(PMRN_PMGC0); | ||
| 26 | |||
| 27 | pmgc0 &= ~PMGC0_PMIE; | ||
| 28 | mtpmr(PMRN_PMGC0, pmgc0); | ||
| 29 | } | ||
| 30 | #elif defined(CONFIG_PPC64) || defined(CONFIG_6xx) | ||
| 31 | |||
| 32 | #ifndef MMCR0_PMAO | ||
| 33 | #define MMCR0_PMAO 0 | ||
| 34 | #endif | 24 | #endif |
| 35 | 25 | ||
| 36 | /* Ensure exceptions are disabled */ | ||
| 37 | static void dummy_perf(struct pt_regs *regs) | 26 | static void dummy_perf(struct pt_regs *regs) |
| 38 | { | 27 | { |
| 39 | unsigned int mmcr0 = mfspr(SPRN_MMCR0); | 28 | #if defined(CONFIG_FSL_BOOKE) && !defined(CONFIG_E200) |
| 40 | 29 | mtpmr(PMRN_PMGC0, mfpmr(PMRN_PMGC0) & ~PMGC0_PMIE); | |
| 41 | mmcr0 &= ~(MMCR0_PMXE|MMCR0_PMAO); | 30 | #elif defined(CONFIG_PPC64) || defined(CONFIG_6xx) |
| 42 | mtspr(SPRN_MMCR0, mmcr0); | 31 | mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~(MMCR0_PMXE|MMCR0_PMA0)); |
| 43 | } | ||
| 44 | #else | 32 | #else |
| 45 | /* Ensure exceptions are disabled */ | 33 | mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_PMXE); |
| 46 | static void dummy_perf(struct pt_regs *regs) | ||
| 47 | { | ||
| 48 | unsigned int mmcr0 = mfspr(SPRN_MMCR0); | ||
| 49 | |||
| 50 | mmcr0 &= ~(MMCR0_PMXE); | ||
| 51 | mtspr(SPRN_MMCR0, mmcr0); | ||
| 52 | } | ||
| 53 | #endif | 34 | #endif |
| 35 | } | ||
| 36 | |||
| 54 | 37 | ||
| 55 | static DEFINE_SPINLOCK(pmc_owner_lock); | 38 | static DEFINE_SPINLOCK(pmc_owner_lock); |
| 56 | static void *pmc_owner_caller; /* mostly for debugging */ | 39 | static void *pmc_owner_caller; /* mostly for debugging */ |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index 80e314d2f247..e870b5393175 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
| @@ -50,6 +50,12 @@ enum powerpc_oprofile_type { | |||
| 50 | PPC_OPROFILE_CELL = 5, | 50 | PPC_OPROFILE_CELL = 5, |
| 51 | }; | 51 | }; |
| 52 | 52 | ||
| 53 | enum powerpc_pmc_type { | ||
| 54 | PPC_PMC_DEFAULT = 0, | ||
| 55 | PPC_PMC_IBM = 1, | ||
| 56 | PPC_PMC_PA6T = 2, | ||
| 57 | }; | ||
| 58 | |||
| 53 | struct cpu_spec { | 59 | struct cpu_spec { |
| 54 | /* CPU is matched via (PVR & pvr_mask) == pvr_value */ | 60 | /* CPU is matched via (PVR & pvr_mask) == pvr_value */ |
| 55 | unsigned int pvr_mask; | 61 | unsigned int pvr_mask; |
| @@ -65,6 +71,7 @@ struct cpu_spec { | |||
| 65 | 71 | ||
| 66 | /* number of performance monitor counters */ | 72 | /* number of performance monitor counters */ |
| 67 | unsigned int num_pmcs; | 73 | unsigned int num_pmcs; |
| 74 | enum powerpc_pmc_type pmc_type; | ||
| 68 | 75 | ||
| 69 | /* this is called to initialize various CPU bits like L1 cache, | 76 | /* this is called to initialize various CPU bits like L1 cache, |
| 70 | * BHT, SPD, etc... from head.S before branching to identify_machine | 77 | * BHT, SPD, etc... from head.S before branching to identify_machine |
