master
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2010 Fabien Thomas
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#ifndef _DEV_HWPMC_UNCORE_H_
30#define _DEV_HWPMC_UNCORE_H_ 1
31
32/*
33 * Fixed-function PMCs.
34 */
35struct pmc_md_ucf_op_pmcallocate {
36 uint16_t pm_ucf_flags; /* additional flags */
37};
38
39#define UCF_EN 0x1
40#define UCF_PMI 0x4
41
42/*
43 * Programmable PMCs.
44 */
45struct pmc_md_ucp_op_pmcallocate {
46 uint64_t pm_ucp_config;
47};
48
49#define UCP_EVSEL(C) ((C) & 0xFF)
50#define UCP_UMASK(C) ((C) & 0xFF00)
51#define UCP_CTRR (1 << 17)
52#define UCP_EDGE (1 << 18)
53#define UCP_INT (1 << 20)
54#define UCP_EN (1 << 22)
55#define UCP_INV (1 << 23)
56#define UCP_CMASK(C) (((C) & 0xFF) << 24)
57#ifdef _KERNEL
58
59#define DCTL_FLAG_UNC_PMI (1ULL << 13)
60
61/*
62 * Fixed-function counters.
63 */
64
65#define UCF_MASK 0xF
66
67#define UCF_CTR0 0x394
68
69#define UCF_OFFSET 32
70#define UCF_OFFSET_SB 29
71#define UCF_CTRL 0x395
72
73/*
74 * Programmable counters.
75 */
76
77#define UCP_PMC0 0x3B0
78#define UCP_EVSEL0 0x3C0
79#define UCP_OPCODE_MATCH 0x396
80#define UCP_CB0_EVSEL0 0x700
81
82/*
83 * Simplified programming interface in Intel Performance Architecture
84 * v2 and later.
85 */
86
87#define UC_GLOBAL_STATUS 0x392
88#define UC_GLOBAL_CTRL 0x391
89#define UC_GLOBAL_OVF_CTRL 0x393
90
91#define UC_GLOBAL_STATUS_FLAG_CLRCHG (1ULL << 63)
92#define UC_GLOBAL_STATUS_FLAG_OVFPMI (1ULL << 61)
93#define UC_GLOBAL_CTRL_FLAG_FRZ (1ULL << 63)
94#define UC_GLOBAL_CTRL_FLAG_ENPMICORE0 (1ULL << 48)
95
96/*
97 * Model specific registers.
98 */
99
100#define MSR_GQ_SNOOP_MESF 0x301
101
102struct pmc_md_ucf_pmc {
103 uint64_t pm_ucf_ctrl;
104};
105
106struct pmc_md_ucp_pmc {
107 uint64_t pm_ucp_evsel;
108};
109
110/*
111 * Prototypes.
112 */
113
114int pmc_uncore_initialize(struct pmc_mdep *_md, int _maxcpu);
115void pmc_uncore_finalize(struct pmc_mdep *_md);
116
117int pmc_ucf_initialize(struct pmc_mdep *_md, int _maxcpu, int _npmc, int _width);
118void pmc_ucf_finalize(struct pmc_mdep *_md);
119
120int pmc_ucp_initialize(struct pmc_mdep *_md, int _maxcpu, int _npmc, int _width,
121 int _flags);
122void pmc_ucp_finalize(struct pmc_mdep *_md);
123
124#endif /* _KERNEL */
125#endif /* _DEV_HWPMC_UNCORE_H */