60405de4d8688d96dd05157c28db3ade5c9bc234kz/*
60405de4d8688d96dd05157c28db3ade5c9bc234kz * CDDL HEADER START
60405de4d8688d96dd05157c28db3ade5c9bc234kz *
60405de4d8688d96dd05157c28db3ade5c9bc234kz * The contents of this file are subject to the terms of the
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Common Development and Distribution License (the "License").
60405de4d8688d96dd05157c28db3ade5c9bc234kz * You may not use this file except in compliance with the License.
60405de4d8688d96dd05157c28db3ade5c9bc234kz *
60405de4d8688d96dd05157c28db3ade5c9bc234kz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
60405de4d8688d96dd05157c28db3ade5c9bc234kz * or http://www.opensolaris.org/os/licensing.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * See the License for the specific language governing permissions
60405de4d8688d96dd05157c28db3ade5c9bc234kz * and limitations under the License.
60405de4d8688d96dd05157c28db3ade5c9bc234kz *
60405de4d8688d96dd05157c28db3ade5c9bc234kz * When distributing Covered Code, include this CDDL HEADER in each
60405de4d8688d96dd05157c28db3ade5c9bc234kz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * If applicable, add the following below this CDDL HEADER, with the
60405de4d8688d96dd05157c28db3ade5c9bc234kz * fields enclosed by brackets "[]" replaced with your own identifying
60405de4d8688d96dd05157c28db3ade5c9bc234kz * information: Portions Copyright [yyyy] [name of copyright owner]
60405de4d8688d96dd05157c28db3ade5c9bc234kz *
60405de4d8688d96dd05157c28db3ade5c9bc234kz * CDDL HEADER END
60405de4d8688d96dd05157c28db3ade5c9bc234kz */
60405de4d8688d96dd05157c28db3ade5c9bc234kz/*
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * Copyright 2008 Sun Microsystems, Inc.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * All rights reserved. Use is subject to license terms.
60405de4d8688d96dd05157c28db3ade5c9bc234kz */
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz#pragma ident "%Z%%M% %I% %E% SMI"
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz#include "drmP.h"
60405de4d8688d96dd05157c28db3ade5c9bc234kz#include <sys/kstat.h>
60405de4d8688d96dd05157c28db3ade5c9bc234kz#include <sys/ddi.h>
60405de4d8688d96dd05157c28db3ade5c9bc234kz#include <sys/sunddi.h>
60405de4d8688d96dd05157c28db3ade5c9bc234kz#include <sys/sunldi.h>
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic char *drmkstat_name[] = {
60405de4d8688d96dd05157c28db3ade5c9bc234kz "opens",
60405de4d8688d96dd05157c28db3ade5c9bc234kz "closes",
60405de4d8688d96dd05157c28db3ade5c9bc234kz "IOCTLs",
60405de4d8688d96dd05157c28db3ade5c9bc234kz "locks",
60405de4d8688d96dd05157c28db3ade5c9bc234kz "unlocks",
60405de4d8688d96dd05157c28db3ade5c9bc234kz NULL
60405de4d8688d96dd05157c28db3ade5c9bc234kz};
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int
60405de4d8688d96dd05157c28db3ade5c9bc234kzdrm_kstat_update(kstat_t *ksp, int flag)
60405de4d8688d96dd05157c28db3ade5c9bc234kz{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg drm_device_t *sc;
60405de4d8688d96dd05157c28db3ade5c9bc234kz kstat_named_t *knp;
60405de4d8688d96dd05157c28db3ade5c9bc234kz int tmp;
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (flag != KSTAT_READ)
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (EACCES);
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz sc = ksp->ks_private;
60405de4d8688d96dd05157c28db3ade5c9bc234kz knp = ksp->ks_data;
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz for (tmp = 1; tmp < 6; tmp++) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz (knp++)->value.ui32 = sc->counts[tmp];
60405de4d8688d96dd05157c28db3ade5c9bc234kz }
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (0);
60405de4d8688d96dd05157c28db3ade5c9bc234kz}
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kzint
d0538f66491267879b7418b21ad78e3dcc2dcc83cgdrm_init_kstats(drm_device_t *sc)
60405de4d8688d96dd05157c28db3ade5c9bc234kz{
60405de4d8688d96dd05157c28db3ade5c9bc234kz int instance;
60405de4d8688d96dd05157c28db3ade5c9bc234kz kstat_t *ksp;
60405de4d8688d96dd05157c28db3ade5c9bc234kz kstat_named_t *knp;
60405de4d8688d96dd05157c28db3ade5c9bc234kz char *np;
60405de4d8688d96dd05157c28db3ade5c9bc234kz char **aknp;
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz instance = ddi_get_instance(sc->dip);
60405de4d8688d96dd05157c28db3ade5c9bc234kz aknp = drmkstat_name;
60405de4d8688d96dd05157c28db3ade5c9bc234kz ksp = kstat_create("drm", instance, "drminfo", "drm",
60405de4d8688d96dd05157c28db3ade5c9bc234kz KSTAT_TYPE_NAMED, sizeof (drmkstat_name)/sizeof (char *) - 1,
60405de4d8688d96dd05157c28db3ade5c9bc234kz KSTAT_FLAG_PERSISTENT);
60405de4d8688d96dd05157c28db3ade5c9bc234kz if (ksp == NULL)
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (NULL);
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz ksp->ks_private = sc;
60405de4d8688d96dd05157c28db3ade5c9bc234kz ksp->ks_update = drm_kstat_update;
60405de4d8688d96dd05157c28db3ade5c9bc234kz for (knp = ksp->ks_data; (np = (*aknp)) != NULL; knp++, aknp++) {
60405de4d8688d96dd05157c28db3ade5c9bc234kz kstat_named_init(knp, np, KSTAT_DATA_UINT32);
60405de4d8688d96dd05157c28db3ade5c9bc234kz }
60405de4d8688d96dd05157c28db3ade5c9bc234kz kstat_install(ksp);
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz sc->asoft_ksp = ksp;
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kz return (0);
60405de4d8688d96dd05157c28db3ade5c9bc234kz}
60405de4d8688d96dd05157c28db3ade5c9bc234kz
60405de4d8688d96dd05157c28db3ade5c9bc234kzvoid
d0538f66491267879b7418b21ad78e3dcc2dcc83cgdrm_fini_kstats(drm_device_t *sc)
60405de4d8688d96dd05157c28db3ade5c9bc234kz{
d0538f66491267879b7418b21ad78e3dcc2dcc83cg if (sc->asoft_ksp)
d0538f66491267879b7418b21ad78e3dcc2dcc83cg kstat_delete(sc->asoft_ksp);
d0538f66491267879b7418b21ad78e3dcc2dcc83cg else
d0538f66491267879b7418b21ad78e3dcc2dcc83cg cmn_err(CE_WARN, "attempt to delete null kstat");
60405de4d8688d96dd05157c28db3ade5c9bc234kz}