162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Cell Broadband Engine Performance Monitor 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * (C) Copyright IBM Corporation 2006 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: 862306a36Sopenharmony_ci * David Erb (djerb@us.ibm.com) 962306a36Sopenharmony_ci * Kevin Corry (kevcorry@us.ibm.com) 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifndef __ASM_CELL_PMU_H__ 1362306a36Sopenharmony_ci#define __ASM_CELL_PMU_H__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* The Cell PMU has four hardware performance counters, which can be 1662306a36Sopenharmony_ci * configured as four 32-bit counters or eight 16-bit counters. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci#define NR_PHYS_CTRS 4 1962306a36Sopenharmony_ci#define NR_CTRS (NR_PHYS_CTRS * 2) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* Macros for the pm_control register. */ 2262306a36Sopenharmony_ci#define CBE_PM_16BIT_CTR(ctr) (1 << (24 - ((ctr) & (NR_PHYS_CTRS - 1)))) 2362306a36Sopenharmony_ci#define CBE_PM_ENABLE_PERF_MON 0x80000000 2462306a36Sopenharmony_ci#define CBE_PM_STOP_AT_MAX 0x40000000 2562306a36Sopenharmony_ci#define CBE_PM_TRACE_MODE_GET(pm_control) (((pm_control) >> 28) & 0x3) 2662306a36Sopenharmony_ci#define CBE_PM_TRACE_MODE_SET(mode) (((mode) & 0x3) << 28) 2762306a36Sopenharmony_ci#define CBE_PM_TRACE_BUF_OVFLW(bit) (((bit) & 0x1) << 17) 2862306a36Sopenharmony_ci#define CBE_PM_COUNT_MODE_SET(count) (((count) & 0x3) << 18) 2962306a36Sopenharmony_ci#define CBE_PM_FREEZE_ALL_CTRS 0x00100000 3062306a36Sopenharmony_ci#define CBE_PM_ENABLE_EXT_TRACE 0x00008000 3162306a36Sopenharmony_ci#define CBE_PM_SPU_ADDR_TRACE_SET(msk) (((msk) & 0x3) << 9) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* Macros for the trace_address register. */ 3462306a36Sopenharmony_ci#define CBE_PM_TRACE_BUF_FULL 0x00000800 3562306a36Sopenharmony_ci#define CBE_PM_TRACE_BUF_EMPTY 0x00000400 3662306a36Sopenharmony_ci#define CBE_PM_TRACE_BUF_DATA_COUNT(ta) ((ta) & 0x3ff) 3762306a36Sopenharmony_ci#define CBE_PM_TRACE_BUF_MAX_COUNT 0x400 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* Macros for the pm07_control registers. */ 4062306a36Sopenharmony_ci#define CBE_PM_CTR_INPUT_MUX(pm07_control) (((pm07_control) >> 26) & 0x3f) 4162306a36Sopenharmony_ci#define CBE_PM_CTR_INPUT_CONTROL 0x02000000 4262306a36Sopenharmony_ci#define CBE_PM_CTR_POLARITY 0x01000000 4362306a36Sopenharmony_ci#define CBE_PM_CTR_COUNT_CYCLES 0x00800000 4462306a36Sopenharmony_ci#define CBE_PM_CTR_ENABLE 0x00400000 4562306a36Sopenharmony_ci#define PM07_CTR_INPUT_MUX(x) (((x) & 0x3F) << 26) 4662306a36Sopenharmony_ci#define PM07_CTR_INPUT_CONTROL(x) (((x) & 1) << 25) 4762306a36Sopenharmony_ci#define PM07_CTR_POLARITY(x) (((x) & 1) << 24) 4862306a36Sopenharmony_ci#define PM07_CTR_COUNT_CYCLES(x) (((x) & 1) << 23) 4962306a36Sopenharmony_ci#define PM07_CTR_ENABLE(x) (((x) & 1) << 22) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* Macros for the pm_status register. */ 5262306a36Sopenharmony_ci#define CBE_PM_CTR_OVERFLOW_INTR(ctr) (1 << (31 - ((ctr) & 7))) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cienum pm_reg_name { 5562306a36Sopenharmony_ci group_control, 5662306a36Sopenharmony_ci debug_bus_control, 5762306a36Sopenharmony_ci trace_address, 5862306a36Sopenharmony_ci ext_tr_timer, 5962306a36Sopenharmony_ci pm_status, 6062306a36Sopenharmony_ci pm_control, 6162306a36Sopenharmony_ci pm_interval, 6262306a36Sopenharmony_ci pm_start_stop, 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* Routines for reading/writing the PMU registers. */ 6662306a36Sopenharmony_ciextern u32 cbe_read_phys_ctr(u32 cpu, u32 phys_ctr); 6762306a36Sopenharmony_ciextern void cbe_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val); 6862306a36Sopenharmony_ciextern u32 cbe_read_ctr(u32 cpu, u32 ctr); 6962306a36Sopenharmony_ciextern void cbe_write_ctr(u32 cpu, u32 ctr, u32 val); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciextern u32 cbe_read_pm07_control(u32 cpu, u32 ctr); 7262306a36Sopenharmony_ciextern void cbe_write_pm07_control(u32 cpu, u32 ctr, u32 val); 7362306a36Sopenharmony_ciextern u32 cbe_read_pm(u32 cpu, enum pm_reg_name reg); 7462306a36Sopenharmony_ciextern void cbe_write_pm(u32 cpu, enum pm_reg_name reg, u32 val); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciextern u32 cbe_get_ctr_size(u32 cpu, u32 phys_ctr); 7762306a36Sopenharmony_ciextern void cbe_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciextern void cbe_enable_pm(u32 cpu); 8062306a36Sopenharmony_ciextern void cbe_disable_pm(u32 cpu); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciextern void cbe_read_trace_buffer(u32 cpu, u64 *buf); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciextern void cbe_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask); 8562306a36Sopenharmony_ciextern void cbe_disable_pm_interrupts(u32 cpu); 8662306a36Sopenharmony_ciextern u32 cbe_get_and_clear_pm_interrupts(u32 cpu); 8762306a36Sopenharmony_ciextern void cbe_sync_irq(int node); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#define CBE_COUNT_SUPERVISOR_MODE 0 9062306a36Sopenharmony_ci#define CBE_COUNT_HYPERVISOR_MODE 1 9162306a36Sopenharmony_ci#define CBE_COUNT_PROBLEM_MODE 2 9262306a36Sopenharmony_ci#define CBE_COUNT_ALL_MODES 3 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#endif /* __ASM_CELL_PMU_H__ */ 95