opl_pcbe.c revision 31632b7349396ed48ad2afad7285d3b22935a30c
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER START
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The contents of this file are subject to the terms of the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Common Development and Distribution License (the "License").
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You may not use this file except in compliance with the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * See the License for the specific language governing permissions
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and limitations under the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * When distributing Covered Code, include this CDDL HEADER in each
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If applicable, add the following below this CDDL HEADER, with the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * fields enclosed by brackets "[]" replaced with your own identifying
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * information: Portions Copyright [yyyy] [name of copyright owner]
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER END
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Use is subject to license terms.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * SPARC64 VI & VII Performance Counter Backend
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#pragma ident "%Z%%M% %I% %E% SMI"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int opl_pcbe_init(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic const char *opl_pcbe_impl_name(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic const char *opl_pcbe_cpuref(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic char *opl_pcbe_list_attrs(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int opl_pcbe_configure(uint_t picnum, char *event, uint64_t preset,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uint32_t flags, uint_t nattrs, kcpc_attr_t *attrs, void **data,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void opl_pcbe_allstop(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct _opl_pcbe_config {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *name;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Performance Control Register (PCR)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * +----------+-----+-----+------+----+
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * | 0 | OVF | 0 | OVR0 | 0 |
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * +----------+-----+-----+------+----+
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * 63 48 47:32 31:27 26 25
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * +----+----+--- -+----+-----+---+-----+-----+----+----+----+
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * | NC | 0 | SC | 0 | SU | 0 | SL |ULRO | UT | ST |PRIV|
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * +----+----+-----+----+-----+---+-----+-----+----+----+----+
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * 24:22 21 20:18 17 16:11 10 9:4 3 2 1 0
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * ULRO and OVRO bits should be on upon accessing pcr unless
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * those fields need to be updated.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Turn off these bits when updating SU/SL or OVF field
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * (during initialization, etc.).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Performance Instrumentation Counter (PIC)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Four PICs are implemented in SPARC64 VI and VII,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * each PIC is accessed using PCR.SC as a select field.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * +------------------------+--------------------------+
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * | PICU | PICL |
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * +------------------------+--------------------------+
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * 63 32 31 0
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define SPARC64_VI_PCR_SYS (UINT64_C(1) << CPC_SPARC64_VI_PCR_SYS_SHIFT)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define SPARC64_VI_PCR_USR (UINT64_C(1) << CPC_SPARC64_VI_PCR_USR_SHIFT)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define SPARC64_VI_PCR_ULRO (UINT64_C(1) << CPC_SPARC64_VI_PCR_ULRO_SHIFT)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define SPARC64_VI_PCR_OVRO (UINT64_C(1) << CPC_SPARC64_VI_PCR_OVRO_SHIFT)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define SPARC64_VI_PCR_OVF (CPC_SPARC64_VI_PCR_OVF_MASK << \
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ((pcr) & (UINT64_C(1) << (CPC_SPARC64_VI_PCR_OVF_SHIFT + picno)))
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pcr &= ~(UINT64_C(1) << (CPC_SPARC64_VI_PCR_OVF_SHIFT + picno)); \
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic const uint64_t allstopped = SPARC64_VI_PCR_PRIVPIC |
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic const struct nametable SPARC64_VI_names_l0[] = {
static const char *opl_impl_name;
static const char *opl_cpuref;
opl_pcbe_init(void)
const struct nametable *n;
case OLYMPUS_C_IMPL:
case JUPITER_IMPL:
for (i = 0; i < CPC_SPARC64_VI_NPIC; i++) {
size = 0;
static uint_t
opl_pcbe_ncounters(void)
return (CPC_SPARC64_VI_NPIC);
opl_pcbe_impl_name(void)
return (opl_impl_name);
opl_pcbe_cpuref(void)
return (opl_cpuref);
opl_pcbe_list_attrs(void)
static const struct nametable *
const struct nametable *n;
return (NULL);
static uint64_t
for (i = 0; i < CPC_SPARC64_VI_NPIC; i++) {
return (bitmap);
static uint64_t
opl_pcbe_overflow_bitmap(void)
const struct nametable *n;
return (CPC_INVALID_PICNUM);
if (nattrs != 0)
return (CPC_INVALID_ATTRIBUTE);
return (CPC_CONFLICTING_REQS);
return (CPC_INVALID_EVENT);
if (bitmap == 0)
for (i = 0; i < CPC_SPARC64_VI_NPIC; i++) {
for (i = 0; i < SPARC64_VI_NUM_PIC_PAIRS; i++) {
for (i = 0; i < SPARC64_VI_NUM_PIC_PAIRS; i++) {
opl_pcbe_allstop(void)
if (bitmap == 0)
for (i = 0; i < CPC_SPARC64_VI_NPIC; i++) {
dummypic_data[i] = 0;
for (i = 0; i < SPARC64_VI_NUM_PIC_PAIRS; i++) {
&modlpcbe,
_init(void)
if (opl_pcbe_init() != 0)
return (ENOTSUP);
_fini(void)