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 */