kz151634 | 60405de | 2006-09-28 01:41:18 -0700 | [diff] [blame] | 1 | /* |
| 2 | * CDDL HEADER START |
| 3 | * |
| 4 | * The contents of this file are subject to the terms of the |
| 5 | * Common Development and Distribution License (the "License"). |
| 6 | * You may not use this file except in compliance with the License. |
| 7 | * |
| 8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| 9 | * or http://www.opensolaris.org/os/licensing. |
| 10 | * See the License for the specific language governing permissions |
| 11 | * and limitations under the License. |
| 12 | * |
| 13 | * When distributing Covered Code, include this CDDL HEADER in each |
| 14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| 15 | * If applicable, add the following below this CDDL HEADER, with the |
| 16 | * fields enclosed by brackets "[]" replaced with your own identifying |
| 17 | * information: Portions Copyright [yyyy] [name of copyright owner] |
| 18 | * |
| 19 | * CDDL HEADER END |
| 20 | */ |
| 21 | /* |
cg149915 | d0538f6 | 2008-01-09 19:45:15 -0800 | [diff] [blame] | 22 | * Copyright 2008 Sun Microsystems, Inc. |
kz151634 | 60405de | 2006-09-28 01:41:18 -0700 | [diff] [blame] | 23 | * All rights reserved. Use is subject to license terms. |
| 24 | */ |
| 25 | |
| 26 | #pragma ident "%Z%%M% %I% %E% SMI" |
| 27 | |
| 28 | #include "drmP.h" |
| 29 | #include <sys/kstat.h> |
| 30 | #include <sys/ddi.h> |
| 31 | #include <sys/sunddi.h> |
| 32 | #include <sys/sunldi.h> |
| 33 | |
| 34 | static char *drmkstat_name[] = { |
| 35 | "opens", |
| 36 | "closes", |
| 37 | "IOCTLs", |
| 38 | "locks", |
| 39 | "unlocks", |
| 40 | NULL |
| 41 | }; |
| 42 | |
| 43 | static int |
| 44 | drm_kstat_update(kstat_t *ksp, int flag) |
| 45 | { |
cg149915 | d0538f6 | 2008-01-09 19:45:15 -0800 | [diff] [blame] | 46 | drm_device_t *sc; |
kz151634 | 60405de | 2006-09-28 01:41:18 -0700 | [diff] [blame] | 47 | kstat_named_t *knp; |
| 48 | int tmp; |
| 49 | |
| 50 | if (flag != KSTAT_READ) |
| 51 | return (EACCES); |
| 52 | |
| 53 | sc = ksp->ks_private; |
| 54 | knp = ksp->ks_data; |
| 55 | |
| 56 | for (tmp = 1; tmp < 6; tmp++) { |
| 57 | (knp++)->value.ui32 = sc->counts[tmp]; |
| 58 | } |
| 59 | |
| 60 | return (0); |
| 61 | } |
| 62 | |
| 63 | int |
cg149915 | d0538f6 | 2008-01-09 19:45:15 -0800 | [diff] [blame] | 64 | drm_init_kstats(drm_device_t *sc) |
kz151634 | 60405de | 2006-09-28 01:41:18 -0700 | [diff] [blame] | 65 | { |
| 66 | int instance; |
| 67 | kstat_t *ksp; |
| 68 | kstat_named_t *knp; |
| 69 | char *np; |
| 70 | char **aknp; |
| 71 | |
| 72 | instance = ddi_get_instance(sc->dip); |
| 73 | aknp = drmkstat_name; |
| 74 | ksp = kstat_create("drm", instance, "drminfo", "drm", |
| 75 | KSTAT_TYPE_NAMED, sizeof (drmkstat_name)/sizeof (char *) - 1, |
| 76 | KSTAT_FLAG_PERSISTENT); |
| 77 | if (ksp == NULL) |
| 78 | return (NULL); |
| 79 | |
| 80 | ksp->ks_private = sc; |
| 81 | ksp->ks_update = drm_kstat_update; |
| 82 | for (knp = ksp->ks_data; (np = (*aknp)) != NULL; knp++, aknp++) { |
| 83 | kstat_named_init(knp, np, KSTAT_DATA_UINT32); |
| 84 | } |
| 85 | kstat_install(ksp); |
| 86 | |
| 87 | sc->asoft_ksp = ksp; |
| 88 | |
| 89 | return (0); |
| 90 | } |
| 91 | |
| 92 | void |
cg149915 | d0538f6 | 2008-01-09 19:45:15 -0800 | [diff] [blame] | 93 | drm_fini_kstats(drm_device_t *sc) |
kz151634 | 60405de | 2006-09-28 01:41:18 -0700 | [diff] [blame] | 94 | { |
cg149915 | d0538f6 | 2008-01-09 19:45:15 -0800 | [diff] [blame] | 95 | if (sc->asoft_ksp) |
| 96 | kstat_delete(sc->asoft_ksp); |
| 97 | else |
| 98 | cmn_err(CE_WARN, "attempt to delete null kstat"); |
kz151634 | 60405de | 2006-09-28 01:41:18 -0700 | [diff] [blame] | 99 | } |