svn commit: r275190 - head/sys/dev/hwpmc

Justin Hibbits jhibbits at FreeBSD.org
Thu Nov 27 18:41:15 UTC 2014


Author: jhibbits
Date: Thu Nov 27 18:41:14 2014
New Revision: 275190
URL: https://svnweb.freebsd.org/changeset/base/275190

Log:
  Fix hwpmc sampling for ppc970 (G5-class) processors.
  
  With this, hwpmc sampling now works on these processors.
  
  MFC after:	3 weeks
  Relnotes:	yes

Modified:
  head/sys/dev/hwpmc/hwpmc_ppc970.c

Modified: head/sys/dev/hwpmc/hwpmc_ppc970.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_ppc970.c	Thu Nov 27 14:54:17 2014	(r275189)
+++ head/sys/dev/hwpmc/hwpmc_ppc970.c	Thu Nov 27 18:41:14 2014	(r275190)
@@ -481,7 +481,6 @@ ppc970_intr(int cpu, struct trapframe *t
 {
 	struct pmc *pm;
 	struct powerpc_cpu *pac;
-	pmc_value_t v;
 	uint32_t config;
 	int i, error, retval;
 
@@ -503,8 +502,7 @@ ppc970_intr(int cpu, struct trapframe *t
 	 * If found, we call a helper to process the interrupt.
 	 */
 
-	config  = mfspr(SPR_970MMCR0);
-	mtspr(SPR_970MMCR0, config | SPR_MMCR0_FC);
+	config  = mfspr(SPR_970MMCR0) & ~SPR_MMCR0_FC;
 	for (i = 0; i < PPC970_MAX_PMCS; i++) {
 		if ((pm = pac->pc_ppcpmcs[i].phw_pmc) == NULL ||
 		    !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) {
@@ -519,24 +517,21 @@ ppc970_intr(int cpu, struct trapframe *t
 		if (pm->pm_state != PMC_STATE_RUNNING)
 			continue;
 
-		/* Stop the PMC, reload count. */
-		v       = pm->pm_sc.pm_reloadcount;
-
-		ppc970_pmcn_write(i, v);
-
-		/* Restart the counter if logging succeeded. */
 		error = pmc_process_interrupt(cpu, PMC_HR, pm, tf,
 		    TRAPF_USERMODE(tf));
-		mtspr(SPR_970MMCR0, config);
 		if (error != 0)
 			ppc970_stop_pmc(cpu, i);
-		atomic_add_int(retval ? &pmc_stats.pm_intr_processed :
-				&pmc_stats.pm_intr_ignored, 1);
 
+		/* reload sampling count. */
+		ppc970_write_pmc(cpu, i, pm->pm_sc.pm_reloadcount);
 	}
 
+	atomic_add_int(retval ? &pmc_stats.pm_intr_processed :
+	    &pmc_stats.pm_intr_ignored, 1);
+
 	/* Re-enable PERF exceptions. */
-	mtspr(SPR_970MMCR0, mfspr(SPR_970MMCR0) | SPR_MMCR0_PMXE);
+	if (retval)
+		mtspr(SPR_970MMCR0, config | SPR_MMCR0_PMXE);
 
 	return (retval);
 }
@@ -572,10 +567,10 @@ ppc970_pcpu_init(struct pmc_mdep *md, in
 
 	/* Clear the MMCRs, and set FC, to disable all PMCs. */
 	/* 970 PMC is not counted when set to 0x08 */
-	mtspr(SPR_970MMCR0, SPR_MMCR0_FC | SPR_MMCR0_PMXE | SPR_MMCR0_PMC1CE |
-	    SPR_MMCR0_PMCNCE | SPR_970MMCR0_PMC1SEL(0x8) | SPR_970MMCR0_PMC2SEL(0x8));
+	mtspr(SPR_970MMCR0, SPR_MMCR0_FC | SPR_MMCR0_PMXE |
+	    SPR_MMCR0_FCECE | SPR_MMCR0_PMC1CE | SPR_MMCR0_PMCNCE |
+	    SPR_970MMCR0_PMC1SEL(0x8) | SPR_970MMCR0_PMC2SEL(0x8));
 	mtspr(SPR_970MMCR1, 0x4218420);
-	mtmsr(mfmsr() | PSL_PMM);
 
 	return 0;
 }
@@ -585,7 +580,6 @@ ppc970_pcpu_fini(struct pmc_mdep *md, in
 {
 	register_t mmcr0 = mfspr(SPR_MMCR0);
 
-	mtmsr(mfmsr() & ~PSL_PMM);
 	mmcr0 |= SPR_MMCR0_FC;
 	mmcr0 &= ~SPR_MMCR0_PMXE;
 	mtspr(SPR_MMCR0, mmcr0);


More information about the svn-src-head mailing list