Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1/*
   2 * Copyright 2014 Tilera Corporation. All Rights Reserved.
   3 *
   4 *   This program is free software; you can redistribute it and/or
   5 *   modify it under the terms of the GNU General Public License
   6 *   as published by the Free Software Foundation, version 2.
   7 *
   8 *   This program is distributed in the hope that it will be useful, but
   9 *   WITHOUT ANY WARRANTY; without even the implied warranty of
  10 *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  11 *   NON INFRINGEMENT.  See the GNU General Public License for
  12 *   more details.
  13 *
  14 *
  15 * Perf_events support for Tile processor.
  16 *
  17 * This code is based upon the x86 perf event
  18 * code, which is:
  19 *
  20 *  Copyright (C) 2008 Thomas Gleixner <tglx@linutronix.de>
  21 *  Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar
  22 *  Copyright (C) 2009 Jaswinder Singh Rajput
  23 *  Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter
  24 *  Copyright (C) 2008-2009 Red Hat, Inc., Peter Zijlstra
  25 *  Copyright (C) 2009 Intel Corporation, <markus.t.metzger@intel.com>
  26 *  Copyright (C) 2009 Google, Inc., Stephane Eranian
  27 */
  28
  29#include <linux/kprobes.h>
  30#include <linux/kernel.h>
  31#include <linux/kdebug.h>
  32#include <linux/mutex.h>
  33#include <linux/bitmap.h>
  34#include <linux/irq.h>
  35#include <linux/interrupt.h>
  36#include <linux/perf_event.h>
  37#include <linux/atomic.h>
  38#include <asm/traps.h>
  39#include <asm/stack.h>
  40#include <asm/pmc.h>
  41#include <hv/hypervisor.h>
  42
  43#define TILE_MAX_COUNTERS	4
  44
  45#define PERF_COUNT_0_IDX	0
  46#define PERF_COUNT_1_IDX	1
  47#define AUX_PERF_COUNT_0_IDX	2
  48#define AUX_PERF_COUNT_1_IDX	3
  49
  50struct cpu_hw_events {
  51	int			n_events;
  52	struct perf_event	*events[TILE_MAX_COUNTERS]; /* counter order */
  53	struct perf_event	*event_list[TILE_MAX_COUNTERS]; /* enabled
  54								order */
  55	int			assign[TILE_MAX_COUNTERS];
  56	unsigned long		active_mask[BITS_TO_LONGS(TILE_MAX_COUNTERS)];
  57	unsigned long		used_mask;
  58};
  59
  60/* TILE arch specific performance monitor unit */
  61struct tile_pmu {
  62	const char	*name;
  63	int		version;
  64	const int	*hw_events;	/* generic hw events table */
  65	/* generic hw cache events table */
  66	const int	(*cache_events)[PERF_COUNT_HW_CACHE_MAX]
  67				       [PERF_COUNT_HW_CACHE_OP_MAX]
  68				       [PERF_COUNT_HW_CACHE_RESULT_MAX];
  69	int		(*map_hw_event)(u64);	 /*method used to map
  70						  hw events */
  71	int		(*map_cache_event)(u64); /*method used to map
  72						  cache events */
  73
  74	u64		max_period;		/* max sampling period */
  75	u64		cntval_mask;		/* counter width mask */
  76	int		cntval_bits;		/* counter width */
  77	int		max_events;		/* max generic hw events
  78						in map */
  79	int		num_counters;		/* number base + aux counters */
  80	int		num_base_counters;	/* number base counters */
  81};
  82
  83DEFINE_PER_CPU(u64, perf_irqs);
  84static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events);
  85
  86#define TILE_OP_UNSUPP		(-1)
  87
  88#ifndef __tilegx__
  89/* TILEPro hardware events map */
  90static const int tile_hw_event_map[] = {
  91	[PERF_COUNT_HW_CPU_CYCLES]		= 0x01, /* ONE */
  92	[PERF_COUNT_HW_INSTRUCTIONS]		= 0x06, /* MP_BUNDLE_RETIRED */
  93	[PERF_COUNT_HW_CACHE_REFERENCES]	= TILE_OP_UNSUPP,
  94	[PERF_COUNT_HW_CACHE_MISSES]		= TILE_OP_UNSUPP,
  95	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS]	= 0x16, /*
  96					  MP_CONDITIONAL_BRANCH_ISSUED */
  97	[PERF_COUNT_HW_BRANCH_MISSES]		= 0x14, /*
  98					  MP_CONDITIONAL_BRANCH_MISSPREDICT */
  99	[PERF_COUNT_HW_BUS_CYCLES]		= TILE_OP_UNSUPP,
 100};
 101#else
 102/* TILEGx hardware events map */
 103static const int tile_hw_event_map[] = {
 104	[PERF_COUNT_HW_CPU_CYCLES]		= 0x181, /* ONE */
 105	[PERF_COUNT_HW_INSTRUCTIONS]		= 0xdb, /* INSTRUCTION_BUNDLE */
 106	[PERF_COUNT_HW_CACHE_REFERENCES]	= TILE_OP_UNSUPP,
 107	[PERF_COUNT_HW_CACHE_MISSES]		= TILE_OP_UNSUPP,
 108	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS]	= 0xd9, /*
 109						COND_BRANCH_PRED_CORRECT */
 110	[PERF_COUNT_HW_BRANCH_MISSES]		= 0xda, /*
 111						COND_BRANCH_PRED_INCORRECT */
 112	[PERF_COUNT_HW_BUS_CYCLES]		= TILE_OP_UNSUPP,
 113};
 114#endif
 115
 116#define C(x) PERF_COUNT_HW_CACHE_##x
 117
 118/*
 119 * Generalized hw caching related hw_event table, filled
 120 * in on a per model basis. A value of -1 means
 121 * 'not supported', any other value means the
 122 * raw hw_event ID.
 123 */
 124#ifndef __tilegx__
 125/* TILEPro hardware cache event map */
 126static const int tile_cache_event_map[PERF_COUNT_HW_CACHE_MAX]
 127				     [PERF_COUNT_HW_CACHE_OP_MAX]
 128				     [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
 129[C(L1D)] = {
 130	[C(OP_READ)] = {
 131		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 132		[C(RESULT_MISS)] = 0x21, /* RD_MISS */
 133	},
 134	[C(OP_WRITE)] = {
 135		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 136		[C(RESULT_MISS)] = 0x22, /* WR_MISS */
 137	},
 138	[C(OP_PREFETCH)] = {
 139		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 140		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 141	},
 142},
 143[C(L1I)] = {
 144	[C(OP_READ)] = {
 145		[C(RESULT_ACCESS)] = 0x12, /* MP_ICACHE_HIT_ISSUED */
 146		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 147	},
 148	[C(OP_WRITE)] = {
 149		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 150		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 151	},
 152	[C(OP_PREFETCH)] = {
 153		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 154		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 155	},
 156},
 157[C(LL)] = {
 158	[C(OP_READ)] = {
 159		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 160		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 161	},
 162	[C(OP_WRITE)] = {
 163		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 164		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 165	},
 166	[C(OP_PREFETCH)] = {
 167		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 168		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 169	},
 170},
 171[C(DTLB)] = {
 172	[C(OP_READ)] = {
 173		[C(RESULT_ACCESS)] = 0x1d, /* TLB_CNT */
 174		[C(RESULT_MISS)] = 0x20, /* TLB_EXCEPTION */
 175	},
 176	[C(OP_WRITE)] = {
 177		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 178		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 179	},
 180	[C(OP_PREFETCH)] = {
 181		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 182		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 183	},
 184},
 185[C(ITLB)] = {
 186	[C(OP_READ)] = {
 187		[C(RESULT_ACCESS)] = 0x13, /* MP_ITLB_HIT_ISSUED */
 188		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 189	},
 190	[C(OP_WRITE)] = {
 191		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 192		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 193	},
 194	[C(OP_PREFETCH)] = {
 195		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 196		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 197	},
 198},
 199[C(BPU)] = {
 200	[C(OP_READ)] = {
 201		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 202		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 203	},
 204	[C(OP_WRITE)] = {
 205		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 206		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 207	},
 208	[C(OP_PREFETCH)] = {
 209		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 210		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 211	},
 212},
 213};
 214#else
 215/* TILEGx hardware events map */
 216static const int tile_cache_event_map[PERF_COUNT_HW_CACHE_MAX]
 217				     [PERF_COUNT_HW_CACHE_OP_MAX]
 218				     [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
 219[C(L1D)] = {
 220	/*
 221	 * Like some other architectures (e.g. ARM), the performance
 222	 * counters don't differentiate between read and write
 223	 * accesses/misses, so this isn't strictly correct, but it's the
 224	 * best we can do. Writes and reads get combined.
 225	 */
 226	[C(OP_READ)] = {
 227		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 228		[C(RESULT_MISS)] = 0x44, /* RD_MISS */
 229	},
 230	[C(OP_WRITE)] = {
 231		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 232		[C(RESULT_MISS)] = 0x45, /* WR_MISS */
 233	},
 234	[C(OP_PREFETCH)] = {
 235		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 236		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 237	},
 238},
 239[C(L1I)] = {
 240	[C(OP_READ)] = {
 241		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 242		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 243	},
 244	[C(OP_WRITE)] = {
 245		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 246		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 247	},
 248	[C(OP_PREFETCH)] = {
 249		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 250		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 251	},
 252},
 253[C(LL)] = {
 254	[C(OP_READ)] = {
 255		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 256		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 257	},
 258	[C(OP_WRITE)] = {
 259		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 260		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 261	},
 262	[C(OP_PREFETCH)] = {
 263		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 264		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 265	},
 266},
 267[C(DTLB)] = {
 268	[C(OP_READ)] = {
 269		[C(RESULT_ACCESS)] = 0x40, /* TLB_CNT */
 270		[C(RESULT_MISS)] = 0x43, /* TLB_EXCEPTION */
 271	},
 272	[C(OP_WRITE)] = {
 273		[C(RESULT_ACCESS)] = 0x40, /* TLB_CNT */
 274		[C(RESULT_MISS)] = 0x43, /* TLB_EXCEPTION */
 275	},
 276	[C(OP_PREFETCH)] = {
 277		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 278		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 279	},
 280},
 281[C(ITLB)] = {
 282	[C(OP_READ)] = {
 283		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 284		[C(RESULT_MISS)] = 0xd4, /* ITLB_MISS_INT */
 285	},
 286	[C(OP_WRITE)] = {
 287		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 288		[C(RESULT_MISS)] = 0xd4, /* ITLB_MISS_INT */
 289	},
 290	[C(OP_PREFETCH)] = {
 291		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 292		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 293	},
 294},
 295[C(BPU)] = {
 296	[C(OP_READ)] = {
 297		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 298		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 299	},
 300	[C(OP_WRITE)] = {
 301		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 302		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 303	},
 304	[C(OP_PREFETCH)] = {
 305		[C(RESULT_ACCESS)] = TILE_OP_UNSUPP,
 306		[C(RESULT_MISS)] = TILE_OP_UNSUPP,
 307	},
 308},
 309};
 310#endif
 311
 312static atomic_t tile_active_events;
 313static DEFINE_MUTEX(perf_intr_reserve_mutex);
 314
 315static int tile_map_hw_event(u64 config);
 316static int tile_map_cache_event(u64 config);
 317
 318static int tile_pmu_handle_irq(struct pt_regs *regs, int fault);
 319
 320/*
 321 * To avoid new_raw_count getting larger then pre_raw_count
 322 * in tile_perf_event_update(), we limit the value of max_period to 2^31 - 1.
 323 */
 324static const struct tile_pmu tilepmu = {
 325#ifndef __tilegx__
 326	.name = "tilepro",
 327#else
 328	.name = "tilegx",
 329#endif
 330	.max_events = ARRAY_SIZE(tile_hw_event_map),
 331	.map_hw_event = tile_map_hw_event,
 332	.hw_events = tile_hw_event_map,
 333	.map_cache_event = tile_map_cache_event,
 334	.cache_events = &tile_cache_event_map,
 335	.cntval_bits = 32,
 336	.cntval_mask = (1ULL << 32) - 1,
 337	.max_period = (1ULL << 31) - 1,
 338	.num_counters = TILE_MAX_COUNTERS,
 339	.num_base_counters = TILE_BASE_COUNTERS,
 340};
 341
 342static const struct tile_pmu *tile_pmu __read_mostly;
 343
 344/*
 345 * Check whether perf event is enabled.
 346 */
 347int tile_perf_enabled(void)
 348{
 349	return atomic_read(&tile_active_events) != 0;
 350}
 351
 352/*
 353 * Read Performance Counters.
 354 */
 355static inline u64 read_counter(int idx)
 356{
 357	u64 val = 0;
 358
 359	/* __insn_mfspr() only takes an immediate argument */
 360	switch (idx) {
 361	case PERF_COUNT_0_IDX:
 362		val = __insn_mfspr(SPR_PERF_COUNT_0);
 363		break;
 364	case PERF_COUNT_1_IDX:
 365		val = __insn_mfspr(SPR_PERF_COUNT_1);
 366		break;
 367	case AUX_PERF_COUNT_0_IDX:
 368		val = __insn_mfspr(SPR_AUX_PERF_COUNT_0);
 369		break;
 370	case AUX_PERF_COUNT_1_IDX:
 371		val = __insn_mfspr(SPR_AUX_PERF_COUNT_1);
 372		break;
 373	default:
 374		WARN_ON_ONCE(idx > AUX_PERF_COUNT_1_IDX ||
 375				idx < PERF_COUNT_0_IDX);
 376	}
 377
 378	return val;
 379}
 380
 381/*
 382 * Write Performance Counters.
 383 */
 384static inline void write_counter(int idx, u64 value)
 385{
 386	/* __insn_mtspr() only takes an immediate argument */
 387	switch (idx) {
 388	case PERF_COUNT_0_IDX:
 389		__insn_mtspr(SPR_PERF_COUNT_0, value);
 390		break;
 391	case PERF_COUNT_1_IDX:
 392		__insn_mtspr(SPR_PERF_COUNT_1, value);
 393		break;
 394	case AUX_PERF_COUNT_0_IDX:
 395		__insn_mtspr(SPR_AUX_PERF_COUNT_0, value);
 396		break;
 397	case AUX_PERF_COUNT_1_IDX:
 398		__insn_mtspr(SPR_AUX_PERF_COUNT_1, value);
 399		break;
 400	default:
 401		WARN_ON_ONCE(idx > AUX_PERF_COUNT_1_IDX ||
 402				idx < PERF_COUNT_0_IDX);
 403	}
 404}
 405
 406/*
 407 * Enable performance event by setting
 408 * Performance Counter Control registers.
 409 */
 410static inline void tile_pmu_enable_event(struct perf_event *event)
 411{
 412	struct hw_perf_event *hwc = &event->hw;
 413	unsigned long cfg, mask;
 414	int shift, idx = hwc->idx;
 415
 416	/*
 417	 * prevent early activation from tile_pmu_start() in hw_perf_enable
 418	 */
 419
 420	if (WARN_ON_ONCE(idx == -1))
 421		return;
 422
 423	if (idx < tile_pmu->num_base_counters)
 424		cfg = __insn_mfspr(SPR_PERF_COUNT_CTL);
 425	else
 426		cfg = __insn_mfspr(SPR_AUX_PERF_COUNT_CTL);
 427
 428	switch (idx) {
 429	case PERF_COUNT_0_IDX:
 430	case AUX_PERF_COUNT_0_IDX:
 431		mask = TILE_EVENT_MASK;
 432		shift = 0;
 433		break;
 434	case PERF_COUNT_1_IDX:
 435	case AUX_PERF_COUNT_1_IDX:
 436		mask = TILE_EVENT_MASK << 16;
 437		shift = 16;
 438		break;
 439	default:
 440		WARN_ON_ONCE(idx < PERF_COUNT_0_IDX ||
 441			idx > AUX_PERF_COUNT_1_IDX);
 442		return;
 443	}
 444
 445	/* Clear mask bits to enable the event. */
 446	cfg &= ~mask;
 447	cfg |= hwc->config << shift;
 448
 449	if (idx < tile_pmu->num_base_counters)
 450		__insn_mtspr(SPR_PERF_COUNT_CTL, cfg);
 451	else
 452		__insn_mtspr(SPR_AUX_PERF_COUNT_CTL, cfg);
 453}
 454
 455/*
 456 * Disable performance event by clearing
 457 * Performance Counter Control registers.
 458 */
 459static inline void tile_pmu_disable_event(struct perf_event *event)
 460{
 461	struct hw_perf_event *hwc = &event->hw;
 462	unsigned long cfg, mask;
 463	int idx = hwc->idx;
 464
 465	if (idx == -1)
 466		return;
 467
 468	if (idx < tile_pmu->num_base_counters)
 469		cfg = __insn_mfspr(SPR_PERF_COUNT_CTL);
 470	else
 471		cfg = __insn_mfspr(SPR_AUX_PERF_COUNT_CTL);
 472
 473	switch (idx) {
 474	case PERF_COUNT_0_IDX:
 475	case AUX_PERF_COUNT_0_IDX:
 476		mask = TILE_PLM_MASK;
 477		break;
 478	case PERF_COUNT_1_IDX:
 479	case AUX_PERF_COUNT_1_IDX:
 480		mask = TILE_PLM_MASK << 16;
 481		break;
 482	default:
 483		WARN_ON_ONCE(idx < PERF_COUNT_0_IDX ||
 484			idx > AUX_PERF_COUNT_1_IDX);
 485		return;
 486	}
 487
 488	/* Set mask bits to disable the event. */
 489	cfg |= mask;
 490
 491	if (idx < tile_pmu->num_base_counters)
 492		__insn_mtspr(SPR_PERF_COUNT_CTL, cfg);
 493	else
 494		__insn_mtspr(SPR_AUX_PERF_COUNT_CTL, cfg);
 495}
 496
 497/*
 498 * Propagate event elapsed time into the generic event.
 499 * Can only be executed on the CPU where the event is active.
 500 * Returns the delta events processed.
 501 */
 502static u64 tile_perf_event_update(struct perf_event *event)
 503{
 504	struct hw_perf_event *hwc = &event->hw;
 505	int shift = 64 - tile_pmu->cntval_bits;
 506	u64 prev_raw_count, new_raw_count;
 507	u64 oldval;
 508	int idx = hwc->idx;
 509	u64 delta;
 510
 511	/*
 512	 * Careful: an NMI might modify the previous event value.
 513	 *
 514	 * Our tactic to handle this is to first atomically read and
 515	 * exchange a new raw count - then add that new-prev delta
 516	 * count to the generic event atomically:
 517	 */
 518again:
 519	prev_raw_count = local64_read(&hwc->prev_count);
 520	new_raw_count = read_counter(idx);
 521
 522	oldval = local64_cmpxchg(&hwc->prev_count, prev_raw_count,
 523				 new_raw_count);
 524	if (oldval != prev_raw_count)
 525		goto again;
 526
 527	/*
 528	 * Now we have the new raw value and have updated the prev
 529	 * timestamp already. We can now calculate the elapsed delta
 530	 * (event-)time and add that to the generic event.
 531	 *
 532	 * Careful, not all hw sign-extends above the physical width
 533	 * of the count.
 534	 */
 535	delta = (new_raw_count << shift) - (prev_raw_count << shift);
 536	delta >>= shift;
 537
 538	local64_add(delta, &event->count);
 539	local64_sub(delta, &hwc->period_left);
 540
 541	return new_raw_count;
 542}
 543
 544/*
 545 * Set the next IRQ period, based on the hwc->period_left value.
 546 * To be called with the event disabled in hw:
 547 */
 548static int tile_event_set_period(struct perf_event *event)
 549{
 550	struct hw_perf_event *hwc = &event->hw;
 551	int idx = hwc->idx;
 552	s64 left = local64_read(&hwc->period_left);
 553	s64 period = hwc->sample_period;
 554	int ret = 0;
 555
 556	/*
 557	 * If we are way outside a reasonable range then just skip forward:
 558	 */
 559	if (unlikely(left <= -period)) {
 560		left = period;
 561		local64_set(&hwc->period_left, left);
 562		hwc->last_period = period;
 563		ret = 1;
 564	}
 565
 566	if (unlikely(left <= 0)) {
 567		left += period;
 568		local64_set(&hwc->period_left, left);
 569		hwc->last_period = period;
 570		ret = 1;
 571	}
 572	if (left > tile_pmu->max_period)
 573		left = tile_pmu->max_period;
 574
 575	/*
 576	 * The hw event starts counting from this event offset,
 577	 * mark it to be able to extra future deltas:
 578	 */
 579	local64_set(&hwc->prev_count, (u64)-left);
 580
 581	write_counter(idx, (u64)(-left) & tile_pmu->cntval_mask);
 582
 583	perf_event_update_userpage(event);
 584
 585	return ret;
 586}
 587
 588/*
 589 * Stop the event but do not release the PMU counter
 590 */
 591static void tile_pmu_stop(struct perf_event *event, int flags)
 592{
 593	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 594	struct hw_perf_event *hwc = &event->hw;
 595	int idx = hwc->idx;
 596
 597	if (__test_and_clear_bit(idx, cpuc->active_mask)) {
 598		tile_pmu_disable_event(event);
 599		cpuc->events[hwc->idx] = NULL;
 600		WARN_ON_ONCE(hwc->state & PERF_HES_STOPPED);
 601		hwc->state |= PERF_HES_STOPPED;
 602	}
 603
 604	if ((flags & PERF_EF_UPDATE) && !(hwc->state & PERF_HES_UPTODATE)) {
 605		/*
 606		 * Drain the remaining delta count out of a event
 607		 * that we are disabling:
 608		 */
 609		tile_perf_event_update(event);
 610		hwc->state |= PERF_HES_UPTODATE;
 611	}
 612}
 613
 614/*
 615 * Start an event (without re-assigning counter)
 616 */
 617static void tile_pmu_start(struct perf_event *event, int flags)
 618{
 619	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 620	int idx = event->hw.idx;
 621
 622	if (WARN_ON_ONCE(!(event->hw.state & PERF_HES_STOPPED)))
 623		return;
 624
 625	if (WARN_ON_ONCE(idx == -1))
 626		return;
 627
 628	if (flags & PERF_EF_RELOAD) {
 629		WARN_ON_ONCE(!(event->hw.state & PERF_HES_UPTODATE));
 630		tile_event_set_period(event);
 631	}
 632
 633	event->hw.state = 0;
 634
 635	cpuc->events[idx] = event;
 636	__set_bit(idx, cpuc->active_mask);
 637
 638	unmask_pmc_interrupts();
 639
 640	tile_pmu_enable_event(event);
 641
 642	perf_event_update_userpage(event);
 643}
 644
 645/*
 646 * Add a single event to the PMU.
 647 *
 648 * The event is added to the group of enabled events
 649 * but only if it can be scehduled with existing events.
 650 */
 651static int tile_pmu_add(struct perf_event *event, int flags)
 652{
 653	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 654	struct hw_perf_event *hwc;
 655	unsigned long mask;
 656	int b, max_cnt;
 657
 658	hwc = &event->hw;
 659
 660	/*
 661	 * We are full.
 662	 */
 663	if (cpuc->n_events == tile_pmu->num_counters)
 664		return -ENOSPC;
 665
 666	cpuc->event_list[cpuc->n_events] = event;
 667	cpuc->n_events++;
 668
 669	hwc->state = PERF_HES_UPTODATE | PERF_HES_STOPPED;
 670	if (!(flags & PERF_EF_START))
 671		hwc->state |= PERF_HES_ARCH;
 672
 673	/*
 674	 * Find first empty counter.
 675	 */
 676	max_cnt = tile_pmu->num_counters;
 677	mask = ~cpuc->used_mask;
 678
 679	/* Find next free counter. */
 680	b = find_next_bit(&mask, max_cnt, 0);
 681
 682	/* Should not happen. */
 683	if (WARN_ON_ONCE(b == max_cnt))
 684		return -ENOSPC;
 685
 686	/*
 687	 * Assign counter to event.
 688	 */
 689	event->hw.idx = b;
 690	__set_bit(b, &cpuc->used_mask);
 691
 692	/*
 693	 * Start if requested.
 694	 */
 695	if (flags & PERF_EF_START)
 696		tile_pmu_start(event, PERF_EF_RELOAD);
 697
 698	return 0;
 699}
 700
 701/*
 702 * Delete a single event from the PMU.
 703 *
 704 * The event is deleted from the group of enabled events.
 705 * If it is the last event, disable PMU interrupt.
 706 */
 707static void tile_pmu_del(struct perf_event *event, int flags)
 708{
 709	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 710	int i;
 711
 712	/*
 713	 * Remove event from list, compact list if necessary.
 714	 */
 715	for (i = 0; i < cpuc->n_events; i++) {
 716		if (cpuc->event_list[i] == event) {
 717			while (++i < cpuc->n_events)
 718				cpuc->event_list[i-1] = cpuc->event_list[i];
 719			--cpuc->n_events;
 720			cpuc->events[event->hw.idx] = NULL;
 721			__clear_bit(event->hw.idx, &cpuc->used_mask);
 722			tile_pmu_stop(event, PERF_EF_UPDATE);
 723			break;
 724		}
 725	}
 726	/*
 727	 * If there are no events left, then mask PMU interrupt.
 728	 */
 729	if (cpuc->n_events == 0)
 730		mask_pmc_interrupts();
 731	perf_event_update_userpage(event);
 732}
 733
 734/*
 735 * Propagate event elapsed time into the event.
 736 */
 737static inline void tile_pmu_read(struct perf_event *event)
 738{
 739	tile_perf_event_update(event);
 740}
 741
 742/*
 743 * Map generic events to Tile PMU.
 744 */
 745static int tile_map_hw_event(u64 config)
 746{
 747	if (config >= tile_pmu->max_events)
 748		return -EINVAL;
 749	return tile_pmu->hw_events[config];
 750}
 751
 752/*
 753 * Map generic hardware cache events to Tile PMU.
 754 */
 755static int tile_map_cache_event(u64 config)
 756{
 757	unsigned int cache_type, cache_op, cache_result;
 758	int code;
 759
 760	if (!tile_pmu->cache_events)
 761		return -ENOENT;
 762
 763	cache_type = (config >>  0) & 0xff;
 764	if (cache_type >= PERF_COUNT_HW_CACHE_MAX)
 765		return -EINVAL;
 766
 767	cache_op = (config >>  8) & 0xff;
 768	if (cache_op >= PERF_COUNT_HW_CACHE_OP_MAX)
 769		return -EINVAL;
 770
 771	cache_result = (config >> 16) & 0xff;
 772	if (cache_result >= PERF_COUNT_HW_CACHE_RESULT_MAX)
 773		return -EINVAL;
 774
 775	code = (*tile_pmu->cache_events)[cache_type][cache_op][cache_result];
 776	if (code == TILE_OP_UNSUPP)
 777		return -EINVAL;
 778
 779	return code;
 780}
 781
 782static void tile_event_destroy(struct perf_event *event)
 783{
 784	if (atomic_dec_return(&tile_active_events) == 0)
 785		release_pmc_hardware();
 786}
 787
 788static int __tile_event_init(struct perf_event *event)
 789{
 790	struct perf_event_attr *attr = &event->attr;
 791	struct hw_perf_event *hwc = &event->hw;
 792	int code;
 793
 794	switch (attr->type) {
 795	case PERF_TYPE_HARDWARE:
 796		code = tile_pmu->map_hw_event(attr->config);
 797		break;
 798	case PERF_TYPE_HW_CACHE:
 799		code = tile_pmu->map_cache_event(attr->config);
 800		break;
 801	case PERF_TYPE_RAW:
 802		code = attr->config & TILE_EVENT_MASK;
 803		break;
 804	default:
 805		/* Should not happen. */
 806		return -EOPNOTSUPP;
 807	}
 808
 809	if (code < 0)
 810		return code;
 811
 812	hwc->config = code;
 813	hwc->idx = -1;
 814
 815	if (attr->exclude_user)
 816		hwc->config |= TILE_CTL_EXCL_USER;
 817
 818	if (attr->exclude_kernel)
 819		hwc->config |= TILE_CTL_EXCL_KERNEL;
 820
 821	if (attr->exclude_hv)
 822		hwc->config |= TILE_CTL_EXCL_HV;
 823
 824	if (!hwc->sample_period) {
 825		hwc->sample_period = tile_pmu->max_period;
 826		hwc->last_period = hwc->sample_period;
 827		local64_set(&hwc->period_left, hwc->sample_period);
 828	}
 829	event->destroy = tile_event_destroy;
 830	return 0;
 831}
 832
 833static int tile_event_init(struct perf_event *event)
 834{
 835	int err = 0;
 836	perf_irq_t old_irq_handler = NULL;
 837
 838	if (atomic_inc_return(&tile_active_events) == 1)
 839		old_irq_handler = reserve_pmc_hardware(tile_pmu_handle_irq);
 840
 841	if (old_irq_handler) {
 842		pr_warn("PMC hardware busy (reserved by oprofile)\n");
 843
 844		atomic_dec(&tile_active_events);
 845		return -EBUSY;
 846	}
 847
 848	switch (event->attr.type) {
 849	case PERF_TYPE_RAW:
 850	case PERF_TYPE_HARDWARE:
 851	case PERF_TYPE_HW_CACHE:
 852		break;
 853
 854	default:
 855		return -ENOENT;
 856	}
 857
 858	err = __tile_event_init(event);
 859	if (err) {
 860		if (event->destroy)
 861			event->destroy(event);
 862	}
 863	return err;
 864}
 865
 866static struct pmu tilera_pmu = {
 867	.event_init	= tile_event_init,
 868	.add		= tile_pmu_add,
 869	.del		= tile_pmu_del,
 870
 871	.start		= tile_pmu_start,
 872	.stop		= tile_pmu_stop,
 873
 874	.read		= tile_pmu_read,
 875};
 876
 877/*
 878 * PMU's IRQ handler, PMU has 2 interrupts, they share the same handler.
 879 */
 880int tile_pmu_handle_irq(struct pt_regs *regs, int fault)
 881{
 882	struct perf_sample_data data;
 883	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 884	struct perf_event *event;
 885	struct hw_perf_event *hwc;
 886	u64 val;
 887	unsigned long status;
 888	int bit;
 889
 890	__this_cpu_inc(perf_irqs);
 891
 892	if (!atomic_read(&tile_active_events))
 893		return 0;
 894
 895	status = pmc_get_overflow();
 896	pmc_ack_overflow(status);
 897
 898	for_each_set_bit(bit, &status, tile_pmu->num_counters) {
 899
 900		event = cpuc->events[bit];
 901
 902		if (!event)
 903			continue;
 904
 905		if (!test_bit(bit, cpuc->active_mask))
 906			continue;
 907
 908		hwc = &event->hw;
 909
 910		val = tile_perf_event_update(event);
 911		if (val & (1ULL << (tile_pmu->cntval_bits - 1)))
 912			continue;
 913
 914		perf_sample_data_init(&data, 0, event->hw.last_period);
 915		if (!tile_event_set_period(event))
 916			continue;
 917
 918		if (perf_event_overflow(event, &data, regs))
 919			tile_pmu_stop(event, 0);
 920	}
 921
 922	return 0;
 923}
 924
 925static bool __init supported_pmu(void)
 926{
 927	tile_pmu = &tilepmu;
 928	return true;
 929}
 930
 931int __init init_hw_perf_events(void)
 932{
 933	supported_pmu();
 934	perf_pmu_register(&tilera_pmu, "cpu", PERF_TYPE_RAW);
 935	return 0;
 936}
 937arch_initcall(init_hw_perf_events);
 938
 939/* Callchain handling code. */
 940
 941/*
 942 * Tile specific backtracing code for perf_events.
 943 */
 944static inline void perf_callchain(struct perf_callchain_entry_ctx *entry,
 945		    struct pt_regs *regs)
 946{
 947	struct KBacktraceIterator kbt;
 948	unsigned int i;
 949
 950	/*
 951	 * Get the address just after the "jalr" instruction that
 952	 * jumps to the handler for a syscall.  When we find this
 953	 * address in a backtrace, we silently ignore it, which gives
 954	 * us a one-step backtrace connection from the sys_xxx()
 955	 * function in the kernel to the xxx() function in libc.
 956	 * Otherwise, we lose the ability to properly attribute time
 957	 * from the libc calls to the kernel implementations, since
 958	 * oprofile only considers PCs from backtraces a pair at a time.
 959	 */
 960	unsigned long handle_syscall_pc = handle_syscall_link_address();
 961
 962	KBacktraceIterator_init(&kbt, NULL, regs);
 963	kbt.profile = 1;
 964
 965	/*
 966	 * The sample for the pc is already recorded.  Now we are adding the
 967	 * address of the callsites on the stack.  Our iterator starts
 968	 * with the frame of the (already sampled) call site.  If our
 969	 * iterator contained a "return address" field, we could have just
 970	 * used it and wouldn't have needed to skip the first
 971	 * frame.  That's in effect what the arm and x86 versions do.
 972	 * Instead we peel off the first iteration to get the equivalent
 973	 * behavior.
 974	 */
 975
 976	if (KBacktraceIterator_end(&kbt))
 977		return;
 978	KBacktraceIterator_next(&kbt);
 979
 980	/*
 981	 * Set stack depth to 16 for user and kernel space respectively, that
 982	 * is, total 32 stack frames.
 983	 */
 984	for (i = 0; i < 16; ++i) {
 985		unsigned long pc;
 986		if (KBacktraceIterator_end(&kbt))
 987			break;
 988		pc = kbt.it.pc;
 989		if (pc != handle_syscall_pc)
 990			perf_callchain_store(entry, pc);
 991		KBacktraceIterator_next(&kbt);
 992	}
 993}
 994
 995void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
 996		    struct pt_regs *regs)
 997{
 998	perf_callchain(entry, regs);
 999}
1000
1001void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
1002		      struct pt_regs *regs)
1003{
1004	perf_callchain(entry, regs);
1005}