Lines Matching +full:- +full:alt
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright 2008-2009 Paul Mackerras, IBM Corporation.
18 #define PM_PMC_SH 20 /* PMC number (1-based) for direct events */
38 #define MMCR1_TTMSEL_SH(n) (MMCR1_TTM0SEL_SH - (n) * 4)
48 #define MMCR1_PMCSEL_SH(n) (MMCR1_PMC1SEL_SH - (n) * 8)
58 * 4 = add/and event (PMC1 -> bits 0 & 4),
59 * 5 = add/and event (PMC1 -> bits 1 & 5),
60 * 6 = add/and event (PMC1 -> bits 2 & 6),
61 * 7 = add/and event (PMC1 -> bits 3 & 7).
123 0x000000c0, /* VMX set 2: byte 0 bits 4-7 */
148 bit = -1; in power6_marked_instr_event()
151 if (pmc == 0 || !(ptype & (1 << (pmc - 1)))) in power6_marked_instr_event()
159 bit = ptype ^ (pmc - 1); in power6_marked_instr_event()
163 if (!(event & PM_BUSEVENT_MSK) || bit == -1) in power6_marked_instr_event()
187 return -1; in p6_compute_mmcr()
191 if (pmc_inuse & (1 << (pmc - 1))) in p6_compute_mmcr()
192 return -1; /* collision! */ in p6_compute_mmcr()
193 pmc_inuse |= 1 << (pmc - 1); in p6_compute_mmcr()
200 --pmc; in p6_compute_mmcr()
207 return -1; in p6_compute_mmcr()
218 return -1; in p6_compute_mmcr()
226 return -1; in p6_compute_mmcr()
249 mmcr->mmcr0 = 0; in p6_compute_mmcr()
251 mmcr->mmcr0 = MMCR0_PMC1CE; in p6_compute_mmcr()
253 mmcr->mmcr0 |= MMCR0_PMCjCE; in p6_compute_mmcr()
254 mmcr->mmcr1 = mmcr1; in p6_compute_mmcr()
255 mmcr->mmcra = mmcra; in p6_compute_mmcr()
262 * 0-1 add field: number of uses of PMC1 (max 1)
263 * 2-3, 4-5, 6-7, 8-9, 10-11: ditto for PMC2, 3, 4, 5, 6
264 * 12-15 add field: number of uses of PMC1-4 (max 4)
265 * 16-19 select field: unit on byte 0 of event bus
266 * 20-23, 24-27, 28-31 ditto for bytes 1, 2, 3
267 * 32-34 select field: nest (subunit) event selector
278 return -1; in p6_get_constraint()
279 sh = (pmc - 1) * 2; in p6_get_constraint()
285 sh = byte * 4 + (16 - PM_UNIT_SH); in p6_get_constraint()
295 mask |= 0x8000; /* add field for count of PMC1-4 uses */ in p6_get_constraint()
355 int hi = ARRAY_SIZE(presorted_event_table) - 1; in find_alternatives_list()
359 int mid = lo + (hi - lo) / 2; in find_alternatives_list()
360 unsigned int alt = presorted_event_table[mid]; in find_alternatives_list() local
362 if (alt < event) in find_alternatives_list()
364 else if (alt > event) in find_alternatives_list()
365 hi = mid - 1; in find_alternatives_list()
370 return -1; in find_alternatives_list()
373 static int p6_get_alternatives(u64 event, unsigned int flags, u64 alt[]) in p6_get_alternatives() argument
380 alt[0] = event; in p6_get_alternatives()
392 alt[nalt++] = aevent; in p6_get_alternatives()
398 /* PMCSEL 0x32 counter N == PMCSEL 0x34 counter 5-N */ in p6_get_alternatives()
402 alt[nalt++] = ((event ^ 0x6) & ~PM_PMC_MSKS) | in p6_get_alternatives()
403 ((5 - pmc) << PM_PMC_SH); in p6_get_alternatives()
405 /* PMCSEL 0x38 counter N == PMCSEL 0x3a counter N+/-2 */ in p6_get_alternatives()
407 alt[nalt++] = ((event ^ 0x2) & ~PM_PMC_MSKS) | in p6_get_alternatives()
408 ((pmc > 2? pmc - 2: pmc + 2) << PM_PMC_SH); in p6_get_alternatives()
424 switch (alt[i]) { in p6_get_alternatives()
426 alt[j++] = 0x600005; /* PM_RUN_CYC */ in p6_get_alternatives()
430 alt[j++] = 0x1e; /* PM_CYC */ in p6_get_alternatives()
433 alt[j++] = 0x500009; /* PM_RUN_INST_CMPL */ in p6_get_alternatives()
437 alt[j++] = 2; /* PM_INST_CMPL */ in p6_get_alternatives()
440 alt[j++] = 0x4000f4; /* PM_RUN_PURR */ in p6_get_alternatives()
443 alt[j++] = 0x10000e; /* PM_PURR */ in p6_get_alternatives()
454 if (!p6_limited_pmc_event(alt[i])) { in p6_get_alternatives()
455 alt[j] = alt[i]; in p6_get_alternatives()
464 if (p6_limited_pmc_event(alt[i])) { in p6_get_alternatives()
465 alt[j] = alt[i]; in p6_get_alternatives()
479 mmcr->mmcr1 &= ~(0xffUL << MMCR1_PMCSEL_SH(pmc)); in p6_disable_pmc()
494 * Table of generalized cache-related events.
495 * 0 means not supported, -1 means nonsensical, other values
507 [C(OP_WRITE)] = { -1, -1 },
517 [C(OP_WRITE)] = { -1, -1 },
518 [C(OP_PREFETCH)] = { -1, -1 },
522 [C(OP_WRITE)] = { -1, -1 },
523 [C(OP_PREFETCH)] = { -1, -1 },
527 [C(OP_WRITE)] = { -1, -1 },
528 [C(OP_PREFETCH)] = { -1, -1 },
531 [C(OP_READ)] = { -1, -1 },
532 [C(OP_WRITE)] = { -1, -1 },
533 [C(OP_PREFETCH)] = { -1, -1 },
559 return -ENODEV; in init_power6_pmu()