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.
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.
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]
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
29 #include <fm/fmd_api.h>
30 #include <sys/types.h>
36 #define CMA_RA_SUCCESS 0
37 #define CMA_RA_FAILURE 1
40 #define FM_FMRI_HC_CPUIDS "hc-xscf-cpuids"
44 extern boolean_t cma_is_native
;
47 typedef struct cma_page
{
48 struct cma_page
*pg_next
; /* List of page retirements for retry */
49 nvlist_t
*pg_rsrc
; /* Resource for this page */
50 nvlist_t
*pg_asru
; /* ASRU for this page */
51 uint64_t pg_addr
; /* Address of this page */
52 char *pg_uuid
; /* UUID for this page's case */
53 uint_t pg_nretries
; /* Number of retries so far for page */
57 typedef struct cma_cpu
{
58 struct cma_cpu
*cpu_next
; /* List of cpus */
59 nvlist_t
*cpu_fmri
; /* FMRI for this cpu entry */
60 int cpuid
; /* physical id of this cpu */
61 char *cpu_uuid
; /* UUID for this cpu's case */
62 uint_t cpu_nretries
; /* Number of retries so far for cpu */
67 struct timespec cma_cpu_delay
; /* CPU offline retry interval */
68 uint_t cma_cpu_tries
; /* Number of CPU offline retries */
69 uint_t cma_cpu_dooffline
; /* Whether to offline CPUs */
70 uint_t cma_cpu_forcedoffline
; /* Whether to do forced CPU offline */
71 uint_t cma_cpu_doonline
; /* Whether to online CPUs */
72 uint_t cma_cpu_doblacklist
; /* Whether to blacklist CPUs */
73 uint_t cma_cpu_dounblacklist
; /* Whether to unblacklist CPUs */
74 cma_page_t
*cma_pages
; /* List of page retirements for retry */
75 hrtime_t cma_page_curdelay
; /* Current retry sleep interval */
76 hrtime_t cma_page_mindelay
; /* Minimum retry sleep interval */
77 hrtime_t cma_page_maxdelay
; /* Maximum retry sleep interval */
78 id_t cma_page_timerid
; /* fmd timer ID for retry sleep */
79 uint_t cma_page_doretire
; /* Whether to retire pages */
80 uint_t cma_page_dounretire
; /* Whether to unretire pages */
82 cma_cpu_t
*cma_cpus
; /* List of cpus */
83 hrtime_t cma_cpu_curdelay
; /* Current retry sleep interval */
84 hrtime_t cma_cpu_mindelay
; /* Minimum retry sleep interval */
85 hrtime_t cma_cpu_maxdelay
; /* Maximum retry sleep interval */
86 id_t cma_cpu_timerid
; /* LDOM cpu timer */
90 typedef struct cma_stats
{
91 fmd_stat_t cpu_flts
; /* Successful offlines */
92 fmd_stat_t cpu_repairs
; /* Successful onlines */
93 fmd_stat_t cpu_fails
; /* Failed offlines/onlines */
94 fmd_stat_t cpu_blfails
; /* Failed blacklists */
95 fmd_stat_t cpu_supp
; /* Suppressed offlines/onlines */
96 fmd_stat_t cpu_blsupp
; /* Suppressed blacklists */
97 fmd_stat_t page_flts
; /* Successful page retires */
98 fmd_stat_t page_repairs
; /* Successful page unretires */
99 fmd_stat_t page_fails
; /* Failed page retires/unretires */
100 fmd_stat_t page_supp
; /* Suppressed retires/unretires */
101 fmd_stat_t page_nonent
; /* Retires for non-present pages */
102 fmd_stat_t bad_flts
; /* Malformed faults */
103 fmd_stat_t nop_flts
; /* Inapplicable faults */
104 fmd_stat_t auto_flts
; /* Auto-close faults */
107 extern cma_stats_t cma_stats
;
110 extern int cma_cpu_cpu_retire(fmd_hdl_t
*, nvlist_t
*, nvlist_t
*,
111 const char *, boolean_t
);
112 extern int cma_cpu_hc_retire(fmd_hdl_t
*, nvlist_t
*, nvlist_t
*,
113 const char *, boolean_t
);
114 extern int cma_page_retire(fmd_hdl_t
*, nvlist_t
*, nvlist_t
*,
115 const char *, boolean_t
);
116 extern void cma_page_retry(fmd_hdl_t
*);
117 extern void cma_page_fini(fmd_hdl_t
*);
118 extern int cma_set_errno(int);
120 extern int cma_cache_way_retire(fmd_hdl_t
*, nvlist_t
*, nvlist_t
*,
121 const char *, boolean_t
);
123 * Platforms may have their own implementations of these functions
125 extern int cma_cpu_blacklist(fmd_hdl_t
*, nvlist_t
*, nvlist_t
*, boolean_t
);
126 extern int cma_cpu_statechange(fmd_hdl_t
*, nvlist_t
*, const char *, int,
128 extern int cma_fmri_page_service_state(fmd_hdl_t
*, nvlist_t
*);
129 extern int cma_fmri_page_retire(fmd_hdl_t
*, nvlist_t
*);
130 extern int cma_fmri_page_unretire(fmd_hdl_t
*, nvlist_t
*);
133 extern void cma_cpu_start_retry(fmd_hdl_t
*, nvlist_t
*, const char *,
135 extern void cma_cpu_fini(fmd_hdl_t
*);
136 extern void cma_cpu_retry(fmd_hdl_t
*);
139 extern const char *p_online_state_fmt(int);