Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/hwpmc/hwpmc_ppc970.c
Show First 20 Lines • Show All 336 Lines • ▼ Show 20 Lines | ppc970_pmcn_write(unsigned int pmc, uint32_t val) | ||||
} | } | ||||
} | } | ||||
static int | static int | ||||
ppc970_config_pmc(int cpu, int ri, struct pmc *pm) | ppc970_config_pmc(int cpu, int ri, struct pmc *pm) | ||||
{ | { | ||||
struct pmc_hw *phw; | struct pmc_hw *phw; | ||||
PMCDBG(MDP,CFG,1, "cpu=%d ri=%d pm=%p", cpu, ri, pm); | PMCDBG3(MDP,CFG,1, "cpu=%d ri=%d pm=%p", cpu, ri, pm); | ||||
KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | ||||
("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); | ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); | ||||
KASSERT(ri >= 0 && ri < PPC970_MAX_PMCS, | KASSERT(ri >= 0 && ri < PPC970_MAX_PMCS, | ||||
("[powerpc,%d] illegal row-index %d", __LINE__, ri)); | ("[powerpc,%d] illegal row-index %d", __LINE__, ri)); | ||||
phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri]; | phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri]; | ||||
▲ Show 20 Lines • Show All 86 Lines • ▼ Show 20 Lines | KASSERT(ri >= 0 && ri < PPC970_MAX_PMCS, | ||||
("[powerpc,%d] illegal row index %d", __LINE__, ri)); | ("[powerpc,%d] illegal row index %d", __LINE__, ri)); | ||||
pm = powerpc_pcpu[cpu]->pc_ppcpmcs[ri].phw_pmc; | pm = powerpc_pcpu[cpu]->pc_ppcpmcs[ri].phw_pmc; | ||||
KASSERT(pm, | KASSERT(pm, | ||||
("[core,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, | ("[core,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, | ||||
ri)); | ri)); | ||||
tmp = ppc970_pmcn_read(ri); | tmp = ppc970_pmcn_read(ri); | ||||
PMCDBG(MDP,REA,2,"ppc-read id=%d -> %jd", ri, tmp); | PMCDBG2(MDP,REA,2,"ppc-read id=%d -> %jd", ri, tmp); | ||||
if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) | if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) | ||||
*v = POWERPC_PERFCTR_VALUE_TO_RELOAD_COUNT(tmp); | *v = POWERPC_PERFCTR_VALUE_TO_RELOAD_COUNT(tmp); | ||||
else | else | ||||
*v = tmp; | *v = tmp; | ||||
return 0; | return 0; | ||||
} | } | ||||
static int | static int | ||||
ppc970_write_pmc(int cpu, int ri, pmc_value_t v) | ppc970_write_pmc(int cpu, int ri, pmc_value_t v) | ||||
{ | { | ||||
struct pmc *pm; | struct pmc *pm; | ||||
KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | ||||
("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); | ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); | ||||
KASSERT(ri >= 0 && ri < PPC970_MAX_PMCS, | KASSERT(ri >= 0 && ri < PPC970_MAX_PMCS, | ||||
("[powerpc,%d] illegal row-index %d", __LINE__, ri)); | ("[powerpc,%d] illegal row-index %d", __LINE__, ri)); | ||||
pm = powerpc_pcpu[cpu]->pc_ppcpmcs[ri].phw_pmc; | pm = powerpc_pcpu[cpu]->pc_ppcpmcs[ri].phw_pmc; | ||||
if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) | if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) | ||||
v = POWERPC_RELOAD_COUNT_TO_PERFCTR_VALUE(v); | v = POWERPC_RELOAD_COUNT_TO_PERFCTR_VALUE(v); | ||||
PMCDBG(MDP,WRI,1,"powerpc-write cpu=%d ri=%d v=%jx", cpu, ri, v); | PMCDBG3(MDP,WRI,1,"powerpc-write cpu=%d ri=%d v=%jx", cpu, ri, v); | ||||
ppc970_pmcn_write(ri, v); | ppc970_pmcn_write(ri, v); | ||||
return 0; | return 0; | ||||
} | } | ||||
static int | static int | ||||
ppc970_intr(int cpu, struct trapframe *tf) | ppc970_intr(int cpu, struct trapframe *tf) | ||||
{ | { | ||||
struct pmc *pm; | struct pmc *pm; | ||||
struct powerpc_cpu *pac; | struct powerpc_cpu *pac; | ||||
uint32_t config; | uint32_t config; | ||||
int i, error, retval; | int i, error, retval; | ||||
KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | ||||
("[powerpc,%d] out of range CPU %d", __LINE__, cpu)); | ("[powerpc,%d] out of range CPU %d", __LINE__, cpu)); | ||||
PMCDBG(MDP,INT,1, "cpu=%d tf=%p um=%d", cpu, (void *) tf, | PMCDBG3(MDP,INT,1, "cpu=%d tf=%p um=%d", cpu, (void *) tf, | ||||
TRAPF_USERMODE(tf)); | TRAPF_USERMODE(tf)); | ||||
retval = 0; | retval = 0; | ||||
pac = powerpc_pcpu[cpu]; | pac = powerpc_pcpu[cpu]; | ||||
/* | /* | ||||
* look for all PMCs that have interrupted: | * look for all PMCs that have interrupted: | ||||
▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
struct pmc_cpu *pc; | struct pmc_cpu *pc; | ||||
struct powerpc_cpu *pac; | struct powerpc_cpu *pac; | ||||
struct pmc_hw *phw; | struct pmc_hw *phw; | ||||
int first_ri, i; | int first_ri, i; | ||||
KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), | ||||
("[powerpc,%d] wrong cpu number %d", __LINE__, cpu)); | ("[powerpc,%d] wrong cpu number %d", __LINE__, cpu)); | ||||
PMCDBG(MDP,INI,1,"powerpc-init cpu=%d", cpu); | PMCDBG1(MDP,INI,1,"powerpc-init cpu=%d", cpu); | ||||
powerpc_pcpu[cpu] = pac = malloc(sizeof(struct powerpc_cpu), M_PMC, | powerpc_pcpu[cpu] = pac = malloc(sizeof(struct powerpc_cpu), M_PMC, | ||||
M_WAITOK|M_ZERO); | M_WAITOK|M_ZERO); | ||||
pac->pc_ppcpmcs = malloc(sizeof(struct pmc_hw) * PPC970_MAX_PMCS, | pac->pc_ppcpmcs = malloc(sizeof(struct pmc_hw) * PPC970_MAX_PMCS, | ||||
M_PMC, M_WAITOK|M_ZERO); | M_PMC, M_WAITOK|M_ZERO); | ||||
pac->pc_class = PMC_CLASS_PPC970; | pac->pc_class = PMC_CLASS_PPC970; | ||||
pc = pmc_pcpu[cpu]; | pc = pmc_pcpu[cpu]; | ||||
▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | if (caps & PMC_CAP_SYSTEM) | ||||
config |= POWERPC_PMC_KERNEL_ENABLE; | config |= POWERPC_PMC_KERNEL_ENABLE; | ||||
if (caps & PMC_CAP_USER) | if (caps & PMC_CAP_USER) | ||||
config |= POWERPC_PMC_USER_ENABLE; | config |= POWERPC_PMC_USER_ENABLE; | ||||
if ((caps & (PMC_CAP_USER | PMC_CAP_SYSTEM)) == 0) | if ((caps & (PMC_CAP_USER | PMC_CAP_SYSTEM)) == 0) | ||||
config |= POWERPC_PMC_ENABLE; | config |= POWERPC_PMC_ENABLE; | ||||
pm->pm_md.pm_powerpc.pm_powerpc_evsel = config; | pm->pm_md.pm_powerpc.pm_powerpc_evsel = config; | ||||
PMCDBG(MDP,ALL,2,"powerpc-allocate ri=%d -> config=0x%x", ri, config); | PMCDBG2(MDP,ALL,2,"powerpc-allocate ri=%d -> config=0x%x", ri, config); | ||||
return 0; | return 0; | ||||
} | } | ||||
static int | static int | ||||
ppc970_release_pmc(int cpu, int ri, struct pmc *pmc) | ppc970_release_pmc(int cpu, int ri, struct pmc *pmc) | ||||
{ | { | ||||
struct pmc_hw *phw; | struct pmc_hw *phw; | ||||
▲ Show 20 Lines • Show All 44 Lines • Show Last 20 Lines |