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 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
29 #pragma ident "%Z%%M% %I% %E% SMI"
32 * Collections of memory modules are known as banks, and are described by
33 * the cmd_bank general-purpose state structure. The bank structure --
34 * cmd_bank_t -- is itself comprised of a persistent (cmd_bank_pers_t) and
35 * dynamic (the rest of cmd_bank_t) portions. While we'd prefer to associate
36 * errors with individual modules, some errors (UEs) may only be attributed to
37 * a bank of modules. This structure is used to track the UEs. Links are made
38 * (via bank_dimms) to the known memory modules that comprise the bank. Note
39 * that memory modules are discovered lazily - as ereports naming them are
40 * processed. As such, the bank_dimms list may be empty, or may only list a
41 * subset of the modules in the bank.
45 * ,--------. ,--------.
46 * |bank | <---- |case_ptr| (CMD_PTR_BANK_CASE)
48 * |,-------| ,-------------.
49 * ,->||asru_t | ----> |packed nvlist|
50 * | |`-------| `-------------'
51 * `--| unum | ,---------. ,---------.
52 * | dimms | ----> |bank_memb| ----> |bank_memb| ----> ...
53 * `--------' `---------' `---------'
56 * dimm buffer dimm buffer
58 * Data structure P? Case? Notes
59 * ---------------- --- ----- -------------------------------------
60 * cmd_bank_pers_t Yes No Name is unum-derived ("bank_%s")
61 * cmd_case_ptr_t Yes Yes Name is case's UUID
62 * bank_asru Yes No Name is unum-derived ("bank_asru_%d")
63 * bank_unum No No Pointer into ASRU - relinked during restore
64 * bank_dimms No No Recreated during restore
74 * Tracks the discovered DIMMs that make up a given bank. Only DIMMs that have
75 * experienced errors independently of the bank will be included in this list.
77 typedef struct cmd_bank_memb
{
78 cmd_list_t bm_list
; /* Memory module list */
79 cmd_dimm_t
*bm_dimm
; /* This memory module */
83 * The bank structure started life without a version number. Making things more
84 * complicated, the version number in the new struct occupies the space used for
85 * the case pointer in the non-versioned struct. We therefore have to use
86 * somewhat unorthodox version numbers so as to allow us to easily tell the
87 * difference between a version number and a case pointer. Case pointers will
88 * be zero or (this being SPARC), a value with the bottom two bits clear. Our
89 * version numbers will begin with 0x11, and will increase by 0x10 each time.
92 #define BANK_MKVERSION(version) ((version) << 4 | 1)
94 #define CMD_BANK_VERSION_1 BANK_MKVERSION(1) /* 17 */
95 #define CMD_BANK_VERSION CMD_DIMM_VERSION_1
97 #define CMD_BANK_VERSIONED(bank) ((bank)->bank_version & 1)
99 #define CMD_BANK_STAT_PREFIX "b" /* b = bank */
101 typedef struct cmd_bank_0
{
102 cmd_header_t bank0_header
; /* Nodetype must be CMD_NT_BANK */
103 fmd_case_t
*bank0_case
; /* Open UE case against this bank */
104 cmd_fmri_t bank0_asru
; /* ASRU for this bank */
105 const char *bank0_unum
; /* This bank's name (ptr into ASRU) */
106 cmd_list_t bank0_dimms
; /* List of discovered DIMMs in bank */
107 uint_t bank0_wrnthresh
; /* # of pages retired before warning */
108 uint_t bank0_nretired
; /* # ret'd pages for UEs in bank */
111 /* Portion of the bank structure which must be persisted */
112 typedef struct cmd_bank_pers
{
113 cmd_header_t bankp_header
; /* Nodetype must be CMD_NT_BANK */
114 uint_t bankp_version
; /* Version of this persistent buffer */
115 cmd_fmri_t bankp_asru
; /* ASRU for this bank */
116 uint_t bankp_flags
; /* CMD_MEM_F_* */
117 uint_t bankp_nretired
; /* # ret'd pages for UEs in bank */
120 /* Persistent and dynamic bank data */
122 cmd_bank_pers_t bank_pers
; /* Persistent data for this bank */
123 const char *bank_unum
; /* This bank's name (ptr into ASRU) */
124 cmd_list_t bank_dimms
; /* List of discovered DIMMs in bank */
125 cmd_case_t bank_case
; /* Open UE case against this bank */
126 fmd_stat_t bank_retstat
; /* Publicizes num of page retirements */
129 #define CMD_BANK_MAXSIZE \
130 MAX(sizeof (cmd_bank_0_t), sizeof (cmd_bank_pers_t))
131 #define CMD_BANK_MINSIZE \
132 MIN(sizeof (cmd_bank_0_t), sizeof (cmd_bank_pers_t))
134 #define bank_header bank_pers.bankp_header
135 #define bank_nodetype bank_pers.bankp_header.hdr_nodetype
136 #define bank_bufname bank_pers.bankp_header.hdr_bufname
137 #define bank_version bank_pers.bankp_version
138 #define bank_asru bank_pers.bankp_asru
139 #define bank_asru_nvl bank_pers.bankp_asru.fmri_nvl
140 #define bank_flags bank_pers.bankp_flags
141 #define bank_nretired bank_pers.bankp_nretired
143 extern cmd_bank_t
*cmd_bank_lookup(fmd_hdl_t
*, nvlist_t
*);
144 extern cmd_bank_t
*cmd_bank_create(fmd_hdl_t
*, nvlist_t
*);
146 extern nvlist_t
*cmd_bank_fru(cmd_bank_t
*);
147 extern nvlist_t
*cmd_bank_create_fault(fmd_hdl_t
*, cmd_bank_t
*, const char *,
150 extern void cmd_bank_add_dimm(fmd_hdl_t
*, cmd_bank_t
*, cmd_dimm_t
*);
151 extern void cmd_bank_remove_dimm(fmd_hdl_t
*, cmd_bank_t
*, cmd_dimm_t
*);
153 extern void cmd_bank_dirty(fmd_hdl_t
*, cmd_bank_t
*);
154 extern void *cmd_bank_restore(fmd_hdl_t
*, fmd_case_t
*, cmd_case_ptr_t
*);
155 extern void cmd_bank_destroy(fmd_hdl_t
*, cmd_bank_t
*);
156 extern void cmd_bank_validate(fmd_hdl_t
*);
157 extern void cmd_bank_gc(fmd_hdl_t
*);
158 extern void cmd_bank_fini(fmd_hdl_t
*);
164 #endif /* _CMD_BANK_H */