39#define SIGNAL_TYPE_CYCLES 0
40#define PM_COUNTER_CTRL_CYLES 0x42C00000U
42#define PFM_CELL_NUM_PMCS 24
43#define PFM_CELL_EVENT_MIN 1
44#define PFM_CELL_EVENT_MAX 8
47#define PFM_CELL_16BIT_CNTR_EVENT_MAX 8
48#define PFM_CELL_32BIT_CNTR_EVENT_MAX 4
50#define COMMON_REG_NUMS 8
56#define PFM_CELL_GRP_CONTROL_REG_GRP0_BIT 30
57#define PFM_CELL_GRP_CONTROL_REG_GRP1_BIT 28
58#define PFM_CELL_BASE_WORD_UNIT_FIELD_BIT 24
59#define PFM_CELL_WORD_UNIT_FIELD_WIDTH 2
60#define PFM_CELL_MAX_WORD_NUMBER 3
61#define PFM_CELL_COUNTER_CONTROL_GRP1 0x80000000U
62#define PFM_CELL_DEFAULT_TRIGGER_EVENT_UNIT 0x00555500U
63#define PFM_CELL_PM_CONTROL_16BIT_CNTR_MASK 0x01E00000U
64#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_PROBLEM 0x00080000U
65#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_SUPERVISOR 0x00000000U
66#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_HYPERVISOR 0x00040000U
67#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_ALL 0x000C0000U
68#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_MASK 0x000C0000U
71 ((x == WORD_0_ONLY)||(x == WORD_2_ONLY)) ? x : 0
81#define swap_int(num1, num2) do { \
97 if (strcmp(buffer,
"Cell Broadband Engine, altivec supported")) {
117 offset = (pmx_num - 1);
119 if ((~*pmx_ctrl_bits >> offset) & 0x1) {
120 *pmx_ctrl_bits |= (0x1 << offset);
126 }
else if (pmx_num == 0){
131 *pmx_ctrl_bits |= (0x1 <<
i);
138static unsigned long long
141 unsigned long long count = 0;
143 while ((~word) & 0x1) {
167 unsigned int word_type0, word_type1;
188 if ((
ONLY_WORD(word_type0) != 0) && (word_type0 == word_type1)) {
195 word_type1 &= ~(1UL << (group0->
word));
200 word_type0 &= ~(1UL << (group1->
word));
219 return (event_code & 0x00000000FFFFFFFFULL) / 100;
224 return (event_code & 0x00000000FFFFFFFFULL) % 100;
229 if (41 <= signal_type && signal_type <= 56) {
243 unsigned int event_cnt;
246 int cycles_signal_cnt = 0;
247 unsigned int signal_type, subunit;
252 for(
i = 0;
i < event_cnt;
i++) {
261 cycles_signal_cnt = 1;
293 DPRINT(
"signal count is invalid\n");
299 DPRINT(
"signal count is invalid\n");
303 return (signal_cnt + cycles_signal_cnt);
323 unsigned int ppu_count_mode = 0;
343 return ppu_count_mode;
353 unsigned int event_cnt;
354 unsigned int signal_cnt = 0, pmcs_cnt = 0;
355 unsigned int signal_type;
356 unsigned long long signal_bit;
360 int input_control, polarity, count_cycle, count_enable;
363 unsigned int pmx_ctrl_bits;
384 if (event_cnt > max_event_cnt)
401 if (signal_cnt == 1) {
404 }
else if (signal_cnt == 2) {
412 if (signal_cnt == 1) {
417 }
else if (signal_cnt == 2) {
425 (group[1].
freq << shift1);
444 (mod_in->
control & ~PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_MASK) |
459 for(
i = 0;
i < event_cnt;
i++) {
464 DPRINT(
"pmX already used\n");
505 pc[pmcs_cnt].
reg_value = ( (signal_bit << (31 - 5))
506 | (input_control << (31 - 6))
507 | (polarity << (31 - 7))
508 | (count_cycle << (31 - 8))
509 | (count_enable << (31 - 9)) );
557 mod_in = &default_model_in;
592 memset(counters, 0,
sizeof(*counters));
604 memset(impl_pmcs, 0,
sizeof(*impl_pmcs));
616 memset(impl_pmds, 0,
sizeof(*impl_pmds));
659 if (!strcmp(
cell_pe[
i].pme_name,
"CYCLES")) {
#define PME_CELL_EVENT_COUNT
static pme_cell_entry_t cell_pe[]
static int pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_ERR_NOTFOUND
#define PFMLIB_ERR_TOOMANY
#define PFMLIB_ERR_NOASSIGN
#define PFMLIB_ERR_NOTSUPP
static unsigned int get_signal_type(unsigned long long event_code)
static int pfm_cell_dispatch_counters(pfmlib_input_param_t *inp, pfmlib_cell_input_param_t *mod_in, pfmlib_output_param_t *outp)
#define PFM_CELL_DEFAULT_TRIGGER_EVENT_UNIT
static unsigned int get_signal_bit(unsigned long long event_code)
static int pfm_cell_get_cycle_event(pfmlib_event_t *e)
#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_HYPERVISOR
#define PFM_CELL_GRP_CONTROL_REG_GRP0_BIT
#define PFM_CELL_32BIT_CNTR_EVENT_MAX
static unsigned int get_ppu_count_mode(unsigned int plm)
#define SIGNAL_TYPE_CYCLES
#define PFM_CELL_NUM_PMCS
static int pfm_cell_get_event_desc(unsigned int ev, char **str)
#define PFM_CELL_EVENT_MIN
#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_SUPERVISOR
static int get_debug_bus_word(struct pfm_cell_signal_group_desc *group0, struct pfm_cell_signal_group_desc *group1)
static void pfm_cell_get_impl_counters(pfmlib_regmask_t *impl_counters)
static int pfm_cell_dispatch_events(pfmlib_input_param_t *inp, void *model_in, pfmlib_output_param_t *outp, void *model_out)
static unsigned long long search_enable_word(int word)
static int check_signal_type(pfmlib_input_param_t *inp, pfmlib_cell_input_param_t *mod_in, struct pfm_cell_signal_group_desc *group0, struct pfm_cell_signal_group_desc *group1)
#define PFM_CELL_COUNTER_CONTROL_GRP1
static void pfm_cell_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
#define PFM_CELL_GRP_CONTROL_REG_GRP1_BIT
#define PFM_CELL_16BIT_CNTR_EVENT_MAX
#define PFM_CELL_WORD_UNIT_FIELD_WIDTH
#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_ALL
static int is_spe_signal_group(unsigned int signal_type)
static int pfm_cell_detect(void)
static char * pfm_cell_get_event_name(unsigned int i)
#define PFM_CELL_PM_CONTROL_16BIT_CNTR_MASK
#define swap_int(num1, num2)
pfm_pmu_support_t cell_support
static void pfm_cell_get_impl_pmds(pfmlib_regmask_t *impl_pmds)
#define PFM_CELL_PM_CONTROL_PPU_CNTR_MODE_PROBLEM
static int get_count_bit(unsigned int type)
#define PM_COUNTER_CTRL_CYLES
static void pfm_cell_get_impl_pmcs(pfmlib_regmask_t *impl_pmcs)
#define PFM_CELL_BASE_WORD_UNIT_FIELD_BIT
int pfm_cell_spe_event(unsigned int event_index)
static int pfm_cell_get_event_code(unsigned int i, unsigned int cnt, int *code)
#define PFM_CELL_MAX_WORD_NUMBER
static int get_pmx_offset(int pmx_num, unsigned int *pmx_ctrl_bits)
#define PMU_CELL_NUM_PERFCTR
#define PMU_CELL_NUM_COUNTERS
#define COUNT_TYPE_SINGLE_CYCLE
#define REG_GROUP_CONTROL
#define COUNT_TYPE_MULTI_CYCLE
#define REG_EXT_TRACE_TIMER
#define PFM_CELL_PME_FREQ_SPU
#define REG_PM_START_STOP
#define COUNT_TYPE_CUMULATIVE_LEN
#define COUNT_TYPE_BOTH_TYPE
#define COUNT_TYPE_OCCURRENCE
#define REG_TRACE_ADDRESS
#define SIGNAL_SPU_TRIGGER
#define REG_DEBUG_BUS_CONTROL
int __pfm_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen)
#define DPRINT(fmt, a...)
unsigned int input_control
unsigned int pmX_control_num
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
unsigned int pfp_pmc_count
unsigned int pfp_pmd_count
unsigned long long reg_value
unsigned int pme_enable_word
unsigned long long pme_code