Author: luporl
Date: Thu Nov  5 14:15:50 2020
New Revision: 367383
URL: https://svnweb.freebsd.org/changeset/base/367383

Log:
  [PowerPC] Make PPC 970 PMC SPRs the standard ones
  
  And add a _74XX suffix to 74XX SPRs.
  
  This is a preparation for adding support to POWER8/9 PMCs, which have most
  SPRs equal to 970 ones.
  
  Reviewed by:  jhibbits
  Sponsored by: Eldorado Research Institute (eldorado.org.br)
  Differential Revision:        https://reviews.freebsd.org/D26532

Modified:
  head/sys/dev/hwpmc/hwpmc_mpc7xxx.c
  head/sys/dev/hwpmc/hwpmc_ppc970.c
  head/sys/powerpc/include/spr.h
  head/sys/powerpc/powerpc/cpu.c

Modified: head/sys/dev/hwpmc/hwpmc_mpc7xxx.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_mpc7xxx.c  Thu Nov  5 13:45:26 2020        
(r367382)
+++ head/sys/dev/hwpmc/hwpmc_mpc7xxx.c  Thu Nov  5 14:15:50 2020        
(r367383)
@@ -48,12 +48,15 @@ __FBSDID("$FreeBSD$");
                                 PMC_CAP_WRITE | PMC_CAP_INVERT |       \
                                 PMC_CAP_QUALIFIER)
 
-#define PPC_SET_PMC1SEL(r, x)  ((r & ~(SPR_MMCR0_PMC1SEL(0x3f))) | 
SPR_MMCR0_PMC1SEL(x))
-#define PPC_SET_PMC2SEL(r, x)  ((r & ~(SPR_MMCR0_PMC2SEL(0x3f))) | 
SPR_MMCR0_PMC2SEL(x))
+#define PPC_SET_PMC1SEL(r, x)  ((r & ~(SPR_MMCR0_74XX_PMC1SEL(0x3f))) | \
+                               SPR_MMCR0_74XX_PMC1SEL(x))
+#define PPC_SET_PMC2SEL(r, x)  ((r & ~(SPR_MMCR0_74XX_PMC2SEL(0x3f))) | \
+                               SPR_MMCR0_74XX_PMC2SEL(x))
 #define PPC_SET_PMC3SEL(r, x)  ((r & ~(SPR_MMCR1_PMC3SEL(0x1f))) | 
SPR_MMCR1_PMC3SEL(x))
 #define PPC_SET_PMC4SEL(r, x)  ((r & ~(SPR_MMCR1_PMC4SEL(0x1f))) | 
SPR_MMCR1_PMC4SEL(x))
 #define PPC_SET_PMC5SEL(r, x)  ((r & ~(SPR_MMCR1_PMC5SEL(0x1f))) | 
SPR_MMCR1_PMC5SEL(x))
-#define PPC_SET_PMC6SEL(r, x)  ((r & ~(SPR_MMCR1_PMC6SEL(0x3f))) | 
SPR_MMCR1_PMC6SEL(x))
+#define PPC_SET_PMC6SEL(r, x)  ((r & ~(SPR_MMCR1_74XX_PMC6SEL(0x3f))) | \
+                               SPR_MMCR1_74XX_PMC6SEL(x))
 
 /* Change this when we support more than just the 7450. */
 #define MPC7XXX_MAX_PMCS       6
@@ -318,22 +321,22 @@ mpc7xxx_pmcn_read(unsigned int pmc)
 {
        switch (pmc) {
                case 0:
-                       return mfspr(SPR_PMC1);
+                       return mfspr(SPR_PMC1_74XX);
                        break;
                case 1:
-                       return mfspr(SPR_PMC2);
+                       return mfspr(SPR_PMC2_74XX);
                        break;
                case 2:
-                       return mfspr(SPR_PMC3);
+                       return mfspr(SPR_PMC3_74XX);
                        break;
                case 3:
-                       return mfspr(SPR_PMC4);
+                       return mfspr(SPR_PMC4_74XX);
                        break;
                case 4:
-                       return mfspr(SPR_PMC5);
+                       return mfspr(SPR_PMC5_74XX);
                        break;
                case 5:
-                       return mfspr(SPR_PMC6);
+                       return mfspr(SPR_PMC6_74XX);
                default:
                        panic("Invalid PMC number: %d\n", pmc);
        }
@@ -344,22 +347,22 @@ mpc7xxx_pmcn_write(unsigned int pmc, uint32_t val)
 {
        switch (pmc) {
                case 0:
-                       mtspr(SPR_PMC1, val);
+                       mtspr(SPR_PMC1_74XX, val);
                        break;
                case 1:
-                       mtspr(SPR_PMC2, val);
+                       mtspr(SPR_PMC2_74XX, val);
                        break;
                case 2:
-                       mtspr(SPR_PMC3, val);
+                       mtspr(SPR_PMC3_74XX, val);
                        break;
                case 3:
-                       mtspr(SPR_PMC4, val);
+                       mtspr(SPR_PMC4_74XX, val);
                        break;
                case 4:
-                       mtspr(SPR_PMC5, val);
+                       mtspr(SPR_PMC5_74XX, val);
                        break;
                case 5:
-                       mtspr(SPR_PMC6, val);
+                       mtspr(SPR_PMC6_74XX, val);
                        break;
                default:
                        panic("Invalid PMC number: %d\n", pmc);
@@ -452,34 +455,34 @@ mpc7xxx_start_pmc(int cpu, int ri)
        /* Enable the PMC. */
        switch (ri) {
        case 0:
-               pmc_mmcr = mfspr(SPR_MMCR0);
+               pmc_mmcr = mfspr(SPR_MMCR0_74XX);
                pmc_mmcr = PPC_SET_PMC1SEL(pmc_mmcr, config);
-               mtspr(SPR_MMCR0, pmc_mmcr);
+               mtspr(SPR_MMCR0_74XX, pmc_mmcr);
                break;
        case 1:
-               pmc_mmcr = mfspr(SPR_MMCR0);
+               pmc_mmcr = mfspr(SPR_MMCR0_74XX);
                pmc_mmcr = PPC_SET_PMC2SEL(pmc_mmcr, config);
-               mtspr(SPR_MMCR0, pmc_mmcr);
+               mtspr(SPR_MMCR0_74XX, pmc_mmcr);
                break;
        case 2:
-               pmc_mmcr = mfspr(SPR_MMCR1);
+               pmc_mmcr = mfspr(SPR_MMCR1_74XX);
                pmc_mmcr = PPC_SET_PMC3SEL(pmc_mmcr, config);
-               mtspr(SPR_MMCR1, pmc_mmcr);
+               mtspr(SPR_MMCR1_74XX, pmc_mmcr);
                break;
        case 3:
-               pmc_mmcr = mfspr(SPR_MMCR0);
+               pmc_mmcr = mfspr(SPR_MMCR0_74XX);
                pmc_mmcr = PPC_SET_PMC4SEL(pmc_mmcr, config);
-               mtspr(SPR_MMCR0, pmc_mmcr);
+               mtspr(SPR_MMCR0_74XX, pmc_mmcr);
                break;
        case 4:
-               pmc_mmcr = mfspr(SPR_MMCR1);
+               pmc_mmcr = mfspr(SPR_MMCR1_74XX);
                pmc_mmcr = PPC_SET_PMC5SEL(pmc_mmcr, config);
-               mtspr(SPR_MMCR1, pmc_mmcr);
+               mtspr(SPR_MMCR1_74XX, pmc_mmcr);
                break;
        case 5:
-               pmc_mmcr = mfspr(SPR_MMCR1);
+               pmc_mmcr = mfspr(SPR_MMCR1_74XX);
                pmc_mmcr = PPC_SET_PMC6SEL(pmc_mmcr, config);
-               mtspr(SPR_MMCR1, pmc_mmcr);
+               mtspr(SPR_MMCR1_74XX, pmc_mmcr);
                break;
        default:
                break;
@@ -490,10 +493,10 @@ mpc7xxx_start_pmc(int cpu, int ri)
         */
        config = ~pm->pm_md.pm_powerpc.pm_powerpc_evsel & POWERPC_PMC_ENABLE;
 
-       pmc_mmcr = mfspr(SPR_MMCR0);
+       pmc_mmcr = mfspr(SPR_MMCR0_74XX);
        pmc_mmcr &= ~SPR_MMCR0_FC;
        pmc_mmcr |= config;
-       mtspr(SPR_MMCR0, pmc_mmcr);
+       mtspr(SPR_MMCR0_74XX, pmc_mmcr);
 
        return 0;
 }
@@ -513,34 +516,34 @@ mpc7xxx_stop_pmc(int cpu, int ri)
         */
        switch (ri) {
        case 0:
-               pmc_mmcr = mfspr(SPR_MMCR0);
+               pmc_mmcr = mfspr(SPR_MMCR0_74XX);
                pmc_mmcr = PPC_SET_PMC1SEL(pmc_mmcr, 0);
-               mtspr(SPR_MMCR0, pmc_mmcr);
+               mtspr(SPR_MMCR0_74XX, pmc_mmcr);
                break;
        case 1:
-               pmc_mmcr = mfspr(SPR_MMCR0);
+               pmc_mmcr = mfspr(SPR_MMCR0_74XX);
                pmc_mmcr = PPC_SET_PMC2SEL(pmc_mmcr, 0);
-               mtspr(SPR_MMCR0, pmc_mmcr);
+               mtspr(SPR_MMCR0_74XX, pmc_mmcr);
                break;
        case 2:
-               pmc_mmcr = mfspr(SPR_MMCR1);
+               pmc_mmcr = mfspr(SPR_MMCR1_74XX);
                pmc_mmcr = PPC_SET_PMC3SEL(pmc_mmcr, 0);
-               mtspr(SPR_MMCR1, pmc_mmcr);
+               mtspr(SPR_MMCR1_74XX, pmc_mmcr);
                break;
        case 3:
-               pmc_mmcr = mfspr(SPR_MMCR0);
+               pmc_mmcr = mfspr(SPR_MMCR0_74XX);
                pmc_mmcr = PPC_SET_PMC4SEL(pmc_mmcr, 0);
-               mtspr(SPR_MMCR0, pmc_mmcr);
+               mtspr(SPR_MMCR0_74XX, pmc_mmcr);
                break;
        case 4:
-               pmc_mmcr = mfspr(SPR_MMCR1);
+               pmc_mmcr = mfspr(SPR_MMCR1_74XX);
                pmc_mmcr = PPC_SET_PMC5SEL(pmc_mmcr, 0);
-               mtspr(SPR_MMCR1, pmc_mmcr);
+               mtspr(SPR_MMCR1_74XX, pmc_mmcr);
                break;
        case 5:
-               pmc_mmcr = mfspr(SPR_MMCR1);
+               pmc_mmcr = mfspr(SPR_MMCR1_74XX);
                pmc_mmcr = PPC_SET_PMC6SEL(pmc_mmcr, 0);
-               mtspr(SPR_MMCR1, pmc_mmcr);
+               mtspr(SPR_MMCR1_74XX, pmc_mmcr);
                break;
        default:
                break;
@@ -577,9 +580,9 @@ mpc7xxx_pcpu_init(struct pmc_mdep *md, int cpu)
        }
 
        /* Clear the MMCRs, and set FC, to disable all PMCs. */
-       mtspr(SPR_MMCR0, SPR_MMCR0_FC | SPR_MMCR0_PMXE |
+       mtspr(SPR_MMCR0_74XX, SPR_MMCR0_FC | SPR_MMCR0_PMXE |
            SPR_MMCR0_FCECE | SPR_MMCR0_PMC1CE | SPR_MMCR0_PMCNCE);
-       mtspr(SPR_MMCR1, 0);
+       mtspr(SPR_MMCR1_74XX, 0);
 
        return 0;
 }
@@ -587,11 +590,11 @@ mpc7xxx_pcpu_init(struct pmc_mdep *md, int cpu)
 static int
 mpc7xxx_pcpu_fini(struct pmc_mdep *md, int cpu)
 {
-       uint32_t mmcr0 = mfspr(SPR_MMCR0);
+       uint32_t mmcr0 = mfspr(SPR_MMCR0_74XX);
 
        mtmsr(mfmsr() & ~PSL_PMM);
        mmcr0 |= SPR_MMCR0_FC;
-       mtspr(SPR_MMCR0, mmcr0);
+       mtspr(SPR_MMCR0_74XX, mmcr0);
 
        free(powerpc_pcpu[cpu]->pc_ppcpmcs, M_PMC);
        free(powerpc_pcpu[cpu], M_PMC);
@@ -678,7 +681,7 @@ mpc7xxx_intr(struct trapframe *tf)
 
        pac = powerpc_pcpu[cpu];
 
-       config  = mfspr(SPR_MMCR0) & ~SPR_MMCR0_FC;
+       config  = mfspr(SPR_MMCR0_74XX) & ~SPR_MMCR0_FC;
 
        /*
         * look for all PMCs that have interrupted:
@@ -717,7 +720,7 @@ mpc7xxx_intr(struct trapframe *tf)
 
        /* Re-enable PERF exceptions. */
        if (retval)
-               mtspr(SPR_MMCR0, config | SPR_MMCR0_PMXE);
+               mtspr(SPR_MMCR0_74XX, config | SPR_MMCR0_PMXE);
 
        return (retval);
 }

Modified: head/sys/dev/hwpmc/hwpmc_ppc970.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_ppc970.c   Thu Nov  5 13:45:26 2020        
(r367382)
+++ head/sys/dev/hwpmc/hwpmc_ppc970.c   Thu Nov  5 14:15:50 2020        
(r367383)
@@ -276,28 +276,28 @@ ppc970_pmcn_read(unsigned int pmc)
 
        switch (pmc) {
                case 0:
-                       val = mfspr(SPR_970PMC1);
+                       val = mfspr(SPR_PMC1);
                        break;
                case 1:
-                       val = mfspr(SPR_970PMC2);
+                       val = mfspr(SPR_PMC2);
                        break;
                case 2:
-                       val = mfspr(SPR_970PMC3);
+                       val = mfspr(SPR_PMC3);
                        break;
                case 3:
-                       val = mfspr(SPR_970PMC4);
+                       val = mfspr(SPR_PMC4);
                        break;
                case 4:
-                       val = mfspr(SPR_970PMC5);
+                       val = mfspr(SPR_PMC5);
                        break;
                case 5:
-                       val = mfspr(SPR_970PMC6);
+                       val = mfspr(SPR_PMC6);
                        break;
                case 6:
-                       val = mfspr(SPR_970PMC7);
+                       val = mfspr(SPR_PMC7);
                        break;
                case 7:
-                       val = mfspr(SPR_970PMC8);
+                       val = mfspr(SPR_PMC8);
                        break;
                default:
                        panic("Invalid PMC number: %d\n", pmc);
@@ -311,28 +311,28 @@ ppc970_pmcn_write(unsigned int pmc, uint32_t val)
 {
        switch (pmc) {
                case 0:
-                       mtspr(SPR_970PMC1, val);
+                       mtspr(SPR_PMC1, val);
                        break;
                case 1:
-                       mtspr(SPR_970PMC2, val);
+                       mtspr(SPR_PMC2, val);
                        break;
                case 2:
-                       mtspr(SPR_970PMC3, val);
+                       mtspr(SPR_PMC3, val);
                        break;
                case 3:
-                       mtspr(SPR_970PMC4, val);
+                       mtspr(SPR_PMC4, val);
                        break;
                case 4:
-                       mtspr(SPR_970PMC5, val);
+                       mtspr(SPR_PMC5, val);
                        break;
                case 5:
-                       mtspr(SPR_970PMC6, val);
+                       mtspr(SPR_PMC6, val);
                        break;
                case 6:
-                       mtspr(SPR_970PMC7, val);
+                       mtspr(SPR_PMC7, val);
                        break;
                case 7:
-                       mtspr(SPR_970PMC8, val);
+                       mtspr(SPR_PMC8, val);
                        break;
                default:
                        panic("Invalid PMC number: %d\n", pmc);
@@ -378,9 +378,9 @@ ppc970_set_pmc(int cpu, int ri, int config)
        switch (ri) {
        case 0:
        case 1:
-               pmc_mmcr = mfspr(SPR_970MMCR0);
+               pmc_mmcr = mfspr(SPR_MMCR0);
                pmc_mmcr = PPC970_SET_MMCR0_PMCSEL(pmc_mmcr, config, ri);
-               mtspr(SPR_970MMCR0, pmc_mmcr);
+               mtspr(SPR_MMCR0, pmc_mmcr);
                break;
        case 2:
        case 3:
@@ -388,9 +388,9 @@ ppc970_set_pmc(int cpu, int ri, int config)
        case 5:
        case 6:
        case 7:
-               pmc_mmcr = mfspr(SPR_970MMCR1);
+               pmc_mmcr = mfspr(SPR_MMCR1);
                pmc_mmcr = PPC970_SET_MMCR1_PMCSEL(pmc_mmcr, config, ri);
-               mtspr(SPR_970MMCR1, pmc_mmcr);
+               mtspr(SPR_MMCR1, pmc_mmcr);
                break;
        }
        return 0;
@@ -416,10 +416,10 @@ ppc970_start_pmc(int cpu, int ri)
         */
        config = ~pm->pm_md.pm_powerpc.pm_powerpc_evsel & POWERPC_PMC_ENABLE;
 
-       pmc_mmcr = mfspr(SPR_970MMCR0);
+       pmc_mmcr = mfspr(SPR_MMCR0);
        pmc_mmcr &= ~SPR_MMCR0_FC;
        pmc_mmcr |= config;
-       mtspr(SPR_970MMCR0, pmc_mmcr);
+       mtspr(SPR_MMCR0, pmc_mmcr);
 
        return 0;
 }
@@ -505,7 +505,7 @@ ppc970_intr(struct trapframe *tf)
         * If found, we call a helper to process the interrupt.
         */
 
-       config  = mfspr(SPR_970MMCR0) & ~SPR_MMCR0_FC;
+       config  = mfspr(SPR_MMCR0) & ~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))) {
@@ -535,7 +535,7 @@ ppc970_intr(struct trapframe *tf)
 
        /* Re-enable PERF exceptions. */
        if (retval)
-               mtspr(SPR_970MMCR0, config | SPR_MMCR0_PMXE);
+               mtspr(SPR_MMCR0, config | SPR_MMCR0_PMXE);
 
        return (retval);
 }
@@ -571,10 +571,10 @@ ppc970_pcpu_init(struct pmc_mdep *md, int cpu)
 
        /* 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 |
+       mtspr(SPR_MMCR0, 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);
+           SPR_MMCR0_PMC1SEL(0x8) | SPR_MMCR0_PMC2SEL(0x8));
+       mtspr(SPR_MMCR1, 0x4218420);
 
        return 0;
 }

Modified: head/sys/powerpc/include/spr.h
==============================================================================
--- head/sys/powerpc/include/spr.h      Thu Nov  5 13:45:26 2020        
(r367382)
+++ head/sys/powerpc/include/spr.h      Thu Nov  5 14:15:50 2020        
(r367383)
@@ -412,6 +412,7 @@
 #define          Mx_CTR_PPCS           0x02000000 /* Priv/user state compare 
mode */
 #define          Mx_CTR_TLB_INDX       0x000001f0 /* TLB index mask */
 #define          Mx_CTR_TLB_INDX_BITPOS        8         /* TLB index shift */
+
 #define        SPR_MI_AP               0x312   /* ..8 IMMU access protection */
 #define          Mx_GP_SUPER(n)        (0 << (2*(15-(n)))) /* access is 
supervisor */
 #define          Mx_GP_PAGE            (1 << (2*(15-(n)))) /* access is page 
protect */
@@ -441,26 +442,68 @@
 #define        SPR_MD_AP               0x31a   /* ..8 DMMU access protection */
 #define        SPR_MD_EPN              0x31b   /* ..8 DMMU effective number */
 
-#define        SPR_970MMCR0            0x31b   /* ... Monitor Mode Control 
Register 0 (PPC 970) */
-#define          SPR_970MMCR0_PMC1SEL(x) ((x) << 8) /* PMC1 selector (970) */
-#define          SPR_970MMCR0_PMC2SEL(x) ((x) << 1) /* PMC2 selector (970) */
-#define        SPR_970MMCR1            0x31e   /* ... Monitor Mode Control 
Register 1 (PPC 970) */
-#define          SPR_970MMCR1_PMC3SEL(x)         (((x) & 0x1f) << 27) /* PMC 3 
selector */
-#define          SPR_970MMCR1_PMC4SEL(x)         (((x) & 0x1f) << 22) /* PMC 4 
selector */
-#define          SPR_970MMCR1_PMC5SEL(x)         (((x) & 0x1f) << 17) /* PMC 5 
selector */
-#define          SPR_970MMCR1_PMC6SEL(x)         (((x) & 0x1f) << 12) /* PMC 6 
selector */
-#define          SPR_970MMCR1_PMC7SEL(x)         (((x) & 0x1f) << 7) /* PMC 7 
selector */
-#define          SPR_970MMCR1_PMC8SEL(x)         (((x) & 0x1f) << 2) /* PMC 8 
selector */
-#define        SPR_970MMCRA            0x312   /* ... Monitor Mode Control 
Register 2 (PPC 970) */
-#define        SPR_970PMC1             0x313   /* ... PMC 1 */
-#define        SPR_970PMC2             0x314   /* ... PMC 2 */
-#define        SPR_970PMC3             0x315   /* ... PMC 3 */
-#define        SPR_970PMC4             0x316   /* ... PMC 4 */
-#define        SPR_970PMC5             0x317   /* ... PMC 5 */
-#define        SPR_970PMC6             0x318   /* ... PMC 6 */
-#define        SPR_970PMC7             0x319   /* ... PMC 7 */
-#define        SPR_970PMC8             0x31a   /* ... PMC 8 */
+#define        SPR_MMCRA               0x312   /* ... Monitor Mode Control 
Register A */
+#define        SPR_PMC1                0x313   /* ... PMC 1 */
+#define        SPR_PMC2                0x314   /* ... PMC 2 */
+#define        SPR_PMC3                0x315   /* ... PMC 3 */
+#define        SPR_PMC4                0x316   /* ... PMC 4 */
+#define        SPR_PMC5                0x317   /* ... PMC 5 */
+#define        SPR_PMC6                0x318   /* ... PMC 6 */
+#define        SPR_PMC7                0x319   /* ... PMC 7 */
+#define        SPR_PMC8                0x31a   /* ... PMC 8 */
 
+#define        SPR_MMCR0               0x31b   /* ... Monitor Mode Control 
Register 0 */
+#define          SPR_MMCR0_FC            0x80000000 /* Freeze counters */
+#define          SPR_MMCR0_FCS           0x40000000 /* Freeze counters in 
supervisor mode */
+#define          SPR_MMCR0_FCP           0x20000000 /* Freeze counters in user 
mode */
+#define          SPR_MMCR0_FCM1          0x10000000 /* Freeze counters when 
mark=1 */
+#define          SPR_MMCR0_FCM0          0x08000000 /* Freeze counters when 
mark=0 */
+#define          SPR_MMCR0_PMXE          0x04000000 /* Enable PM interrupt */
+#define          SPR_MMCR0_PMAE          0x04000000 /* PM Alert Enable */
+#define          SPR_MMCR0_FCECE         0x02000000 /* Freeze counters after 
event */
+#define          SPR_MMCR0_TBSEL_15      0x01800000 /* Count bit 15 of TBL */
+#define          SPR_MMCR0_TBSEL_19      0x01000000 /* Count bit 19 of TBL */
+#define          SPR_MMCR0_TBSEL_23      0x00800000 /* Count bit 23 of TBL */
+#define          SPR_MMCR0_TBSEL_31      0x00000000 /* Count bit 31 of TBL */
+#define          SPR_MMCR0_TBEE          0x00400000 /* Time-base event enable 
*/
+#define          SPR_MMCR0_THRESHOLD(x)  ((x) << 16) /* Threshold value */
+#define          SPR_MMCR0_PMC1CE        0x00008000 /* PMC1 condition enable */
+#define          SPR_MMCR0_PMCNCE        0x00004000 /* PMCn condition enable */
+#define          SPR_MMCR0_TRIGGER       0x00002000 /* Trigger */
+#define          SPR_MMCR0_PMAO          0x00000080 /* PM Alert Occurred */
+#define          SPR_MMCR0_FCPC          0x00001000 /* Freeze Counters in 
Problem State Cond. */
+#define          SPR_MMCR0_FC56          0x00000010 /* Freeze Counters 5-6 */
+#define          SPR_MMCR0_PMC1SEL(x)    ((x) << 8) /* PMC1 selector (970) */
+#define          SPR_MMCR0_PMC2SEL(x)    ((x) << 1) /* PMC2 selector (970) */
+#define          SPR_MMCR0_74XX_PMC1SEL(x)     (((x) & 0x3f) << 6) /* PMC1 
selector */
+#define          SPR_MMCR0_74XX_PMC2SEL(x)     (((x) & 0x3f) << 0) /* PMC2 
selector */
+
+#define        SPR_MMCR1               0x31e   /* ... Monitor Mode Control 
Register 1 */
+#define          SPR_MMCR1_PMC3SEL(x)    (((x) & 0x1f) << 27) /* PMC 3 
selector */
+#define          SPR_MMCR1_PMC4SEL(x)    (((x) & 0x1f) << 22) /* PMC 4 
selector */
+#define          SPR_MMCR1_PMC5SEL(x)    (((x) & 0x1f) << 17) /* PMC 5 
selector */
+#define          SPR_MMCR1_PMC6SEL(x)    (((x) & 0x1f) << 12) /* PMC 6 
selector */
+#define          SPR_MMCR1_74XX_PMC6SEL(x)     (((x) & 0x3f) << 11) /* PMC 6 
selector */
+#define          SPR_MMCR1_PMC7SEL(x)    (((x) & 0x1f) << 7) /* PMC 7 selector 
*/
+#define          SPR_MMCR1_PMC8SEL(x)    (((x) & 0x1f) << 2) /* PMC 8 selector 
*/
+#define          SPR_MMCR1_P8_PMCSEL_ALL       0xffffffff
+#define          SPR_MMCR1_P8_PMCNSEL_MASK(n)  (0xffUL << ((3-(n))*8))
+#define          SPR_MMCR1_P8_PMCNSEL(n, v)    ((unsigned long)(v) << 
((3-(n))*8))
+
+#define        SPR_MMCR2               0x311
+#define          SPR_MMCR2_CNBIT(n, bit) ((bit) << (((5 - (n)) * 9) + 10))
+#define          SPR_MMCR2_FCNS(n)       SPR_MMCR2_CNBIT(n, 0x100UL)
+#define          SPR_MMCR2_FCNP0(n)      SPR_MMCR2_CNBIT(n, 0x080UL)
+#define          SPR_MMCR2_FCNP1(n)      SPR_MMCR2_CNBIT(n, 0x040UL)
+#define          SPR_MMCR2_FCNM1(n)      SPR_MMCR2_CNBIT(n, 0x020UL)
+#define          SPR_MMCR2_FCNM0(n)      SPR_MMCR2_CNBIT(n, 0x010UL)
+#define          SPR_MMCR2_FCNWAIT(n)    SPR_MMCR2_CNBIT(n, 0x008UL)
+#define          SPR_MMCR2_FCNH(n)       SPR_MMCR2_CNBIT(n, 0x004UL)
+/* Freeze Counter N in Hypervisor/Supervisor/Problem states */
+#define          SPR_MMCR2_FCNHSP(n)                                   \
+               (SPR_MMCR2_FCNS(n) | SPR_MMCR2_FCNP0(n) |       \
+                   SPR_MMCR2_FCNP1(n) | SPR_MMCR2_FCNH(n))
+
 #define        SPR_M_TWB               0x31c   /* ..8 MMU tablewalk base */
 #define          M_TWB_L1TB            0xfffff000 /* level-1 translation base 
*/
 #define          M_TWB_L1INDX          0x00000ffc /* level-1 index */
@@ -502,41 +545,19 @@
 #define        SPR_UMMCR0              0x3a8   /* .6. User Monitor Mode 
Control Register 0 */
 #define        SPR_USIA                0x3ab   /* .6. User Sampled Instruction 
Address */
 #define        SPR_UMMCR1              0x3ac   /* .6. User Monitor Mode 
Control Register 1 */
-#define        SPR_MMCR2               0x3b0   /* .6. Monitor Mode Control 
Register 2 */
-#define          SPR_MMCR2_THRESHMULT_32         0x80000000 /* Multiply MMCR0 
threshold by 32 */
-#define          SPR_MMCR2_THRESHMULT_2          0x00000000 /* Multiply MMCR0 
threshold by 2 */
-#define        SPR_PMC5                0x3b1   /* .6. Performance Counter 
Register 5 */
-#define        SPR_PMC6                0x3b2   /* .6. Performance Counter 
Register 6 */
-#define        SPR_MMCR0               0x3b8   /* .6. Monitor Mode Control 
Register 0 */
-#define          SPR_MMCR0_FC            0x80000000 /* Freeze counters */
-#define          SPR_MMCR0_FCS           0x40000000 /* Freeze counters in 
supervisor mode */
-#define          SPR_MMCR0_FCP           0x20000000 /* Freeze counters in user 
mode */
-#define          SPR_MMCR0_FCM1          0x10000000 /* Freeze counters when 
mark=1 */
-#define          SPR_MMCR0_FCM0          0x08000000 /* Freeze counters when 
mark=0 */
-#define          SPR_MMCR0_PMXE          0x04000000 /* Enable PM interrupt */
-#define          SPR_MMCR0_FCECE         0x02000000 /* Freeze counters after 
event */
-#define          SPR_MMCR0_TBSEL_15      0x01800000 /* Count bit 15 of TBL */
-#define          SPR_MMCR0_TBSEL_19      0x01000000 /* Count bit 19 of TBL */
-#define          SPR_MMCR0_TBSEL_23      0x00800000 /* Count bit 23 of TBL */
-#define          SPR_MMCR0_TBSEL_31      0x00000000 /* Count bit 31 of TBL */
-#define          SPR_MMCR0_TBEE          0x00400000 /* Time-base event enable 
*/
-#define          SPR_MMCRO_THRESHOLD(x)  ((x) << 16) /* Threshold value */
-#define          SPR_MMCR0_PMC1CE        0x00008000 /* PMC1 condition enable */
-#define          SPR_MMCR0_PMCNCE        0x00004000 /* PMCn condition enable */
-#define          SPR_MMCR0_TRIGGER       0x00002000 /* Trigger */
-#define          SPR_MMCR0_PMC1SEL(x)    (((x) & 0x3f) << 6) /* PMC1 selector 
*/
-#define          SPR_MMCR0_PMC2SEL(x)    (((x) & 0x3f) << 0) /* PMC2 selector 
*/
-#define        SPR_PMC1                0x3b9   /* .6. Performance Counter 
Register 1 */
-#define        SPR_PMC2                0x3ba   /* .6. Performance Counter 
Register 2 */
+#define        SPR_MMCR2_74XX          0x3b0   /* .6. Monitor Mode Control 
Register 2 */
+#define          SPR_MMCR2_74XX_THRESHMULT_32    0x80000000 /* Multiply MMCR0 
threshold by 32 */
+#define          SPR_MMCR2_74XX_THRESHMULT_2     0x00000000 /* Multiply MMCR0 
threshold by 2 */
+#define        SPR_PMC5_74XX           0x3b1   /* .6. Performance Counter 
Register 5 */
+#define        SPR_PMC6_74XX           0x3b2   /* .6. Performance Counter 
Register 6 */
+#define        SPR_MMCR0_74XX          0x3b8   /* .6. Monitor Mode Control 
Register 0 */
+#define        SPR_PMC1_74XX           0x3b9   /* .6. Performance Counter 
Register 1 */
+#define        SPR_PMC2_74XX           0x3ba   /* .6. Performance Counter 
Register 2 */
 #define        SPR_SIA                 0x3bb   /* .6. Sampled Instruction 
Address */
-#define        SPR_MMCR1               0x3bc   /* .6. Monitor Mode Control 
Register 2 */
-#define          SPR_MMCR1_PMC3SEL(x)    (((x) & 0x1f) << 27) /* PMC 3 
selector */
-#define          SPR_MMCR1_PMC4SEL(x)    (((x) & 0x1f) << 22) /* PMC 4 
selector */
-#define          SPR_MMCR1_PMC5SEL(x)    (((x) & 0x1f) << 17) /* PMC 5 
selector */
-#define          SPR_MMCR1_PMC6SEL(x)    (((x) & 0x3f) << 11) /* PMC 6 
selector */
+#define        SPR_MMCR1_74XX          0x3bc   /* .6. Monitor Mode Control 
Register 2 */
 
-#define        SPR_PMC3                0x3bd   /* .6. Performance Counter 
Register 3 */
-#define        SPR_PMC4                0x3be   /* .6. Performance Counter 
Register 4 */
+#define        SPR_PMC3_74XX           0x3bd   /* .6. Performance Counter 
Register 3 */
+#define        SPR_PMC4_74XX           0x3be   /* .6. Performance Counter 
Register 4 */
 #define        SPR_DMISS               0x3d0   /* .68 Data TLB Miss Address 
Register */
 #define        SPR_DCMP                0x3d1   /* .68 Data TLB Compare 
Register */
 #define        SPR_HASH1               0x3d2   /* .68 Primary Hash Address 
Register */

Modified: head/sys/powerpc/powerpc/cpu.c
==============================================================================
--- head/sys/powerpc/powerpc/cpu.c      Thu Nov  5 13:45:26 2020        
(r367382)
+++ head/sys/powerpc/powerpc/cpu.c      Thu Nov  5 14:15:50 2020        
(r367383)
@@ -377,12 +377,13 @@ cpu_est_clockrate(int cpu_id, uint64_t *cps)
                case MPC7410:
                case MPC7447A:
                case MPC7448:
-                       mtspr(SPR_MMCR0, SPR_MMCR0_FC);
-                       mtspr(SPR_PMC1, 0);
-                       mtspr(SPR_MMCR0, SPR_MMCR0_PMC1SEL(PMCN_CYCLES));
+                       mtspr(SPR_MMCR0_74XX, SPR_MMCR0_FC);
+                       mtspr(SPR_PMC1_74XX, 0);
+                       mtspr(SPR_MMCR0_74XX,
+                           SPR_MMCR0_74XX_PMC1SEL(PMCN_CYCLES));
                        DELAY(1000);
-                       *cps = (mfspr(SPR_PMC1) * 1000) + 4999;
-                       mtspr(SPR_MMCR0, SPR_MMCR0_FC);
+                       *cps = (mfspr(SPR_PMC1_74XX) * 1000) + 4999;
+                       mtspr(SPR_MMCR0_74XX, SPR_MMCR0_FC);
 
                        mtmsr(msr);
                        return (0);
@@ -390,18 +391,17 @@ cpu_est_clockrate(int cpu_id, uint64_t *cps)
                case IBM970FX:
                case IBM970MP:
                        isync();
-                       mtspr(SPR_970MMCR0, SPR_MMCR0_FC);
+                       mtspr(SPR_MMCR0, SPR_MMCR0_FC);
                        isync();
-                       mtspr(SPR_970MMCR1, 0);
-                       mtspr(SPR_970MMCRA, 0);
-                       mtspr(SPR_970PMC1, 0);
-                       mtspr(SPR_970MMCR0,
-                           SPR_970MMCR0_PMC1SEL(PMC970N_CYCLES));
+                       mtspr(SPR_MMCR1, 0);
+                       mtspr(SPR_MMCRA, 0);
+                       mtspr(SPR_PMC1, 0);
+                       mtspr(SPR_MMCR0, SPR_MMCR0_PMC1SEL(PMC970N_CYCLES));
                        isync();
                        DELAY(1000);
                        powerpc_sync();
-                       mtspr(SPR_970MMCR0, SPR_MMCR0_FC);
-                       *cps = (mfspr(SPR_970PMC1) * 1000) + 4999;
+                       mtspr(SPR_MMCR0, SPR_MMCR0_FC);
+                       *cps = (mfspr(SPR_PMC1) * 1000) + 4999;
 
                        mtmsr(msr);
                        return (0);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to