summaryrefslogtreecommitdiff
path: root/usr/src/lib/fm/topo/modules/i86pc/chip/chip.h
blob: efabfbc6d998bc8a742cf94d8bcc67791a31a65b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
 * Copyright 2019, Joyent, Inc.
 * Copyright 2020 Oxide Computer Company
 */

#ifndef _CHIP_H
#define	_CHIP_H

#include <kstat.h>
#include <libnvpair.h>
#include <fm/libtopo.h>
#include <fm/topo_mod.h>

#ifdef __cplusplus
extern "C" {
#endif

#define	CHIP_VERSION		TOPO_VERSION

/* Below should match the definitions in x86pi_impl.h */
#define	X86PI_FULL		1
#define	X86PI_NONE		2

/*
 * FM_AWARE_SMBIOS means SMBIOS meets FMA needs
 * X86PI_FULL is defined as 1 in x86pi.so
 * And passed from x86pi.so to chip.so as module
 * private data
 */
#define	FM_AWARE_SMBIOS(mod)	\
	(topo_mod_getspecific(mod) != NULL && \
	    (*(int *)topo_mod_getspecific(mod) == X86PI_FULL))
#define	IGNORE_ID	0xFFFF

/*
 * These definitions are for the Tree Nodes
 * in the FM Topology
 */
#define	CHIP_NODE_NAME		"chip"
#define	CORE_NODE_NAME		"core"
#define	STRAND_NODE_NAME	"strand"
#define	MCT_NODE_NAME		"memory-controller"
#define	CHAN_NODE_NAME		"dram-channel"
#define	CS_NODE_NAME		"chip-select"
#define	DIMM_NODE_NAME		"dimm"
#define	RANK_NODE_NAME		"rank"

#define	PGNAME(prefix)	(prefix##_NODE_NAME "-properties")

/*
 * chip-properties
 */
#define	CHIP_BRAND		"brand"
#define	CHIP_FAMILY		"family"
#define	CHIP_MODEL		"model"
#define	CHIP_NCORE		"ncore_per_chip"
#define	CHIP_SOCKET		"socket"
#define	CHIP_STEPPING		"stepping"
#define	CHIP_VENDOR_ID		"vendor_id"

/*
 * memory-controller-properties
 * check usr/src/uts/i86pc/os/cpuid.c to understand more
 * on procnodeid values for AMD & Intel
 */
#define	MCT_PROCNODE_ID		"procnodeid"

/*
 * core-properties
 */
#define	CORE_CHIP_ID		"chip_id"
#define	CORE_PROCNODE_ID	"procnodeid"

/*
 * strand-properties
 */
#define	STRAND_CHIP_ID		"chip_id"
#define	STRAND_PROCNODE_ID	"procnodeid"
#define	STRAND_CORE_ID		"core_id"
#define	STRAND_PKG_CORE_ID	"pkg_core_id"
#define	STRAND_CPU_ID		"cpuid"

/*
 * label property methods
 */
#define	SIMPLE_DIMM_LBL		"simple_dimm_label"
#define	SIMPLE_DIMM_LBL_MP	"simple_dimm_label_mp"
#define	SEQ_DIMM_LBL		"seq_dimm_label"
#define	G4_DIMM_LBL		"g4_dimm_label"
#define	G12F_DIMM_LBL		"g12f_dimm_label"
#define	SIMPLE_CHIP_LBL		"simple_chip_label"
#define	G4_CHIP_LBL		"g4_chip_label"
#define	A4FPLUS_CHIP_LBL	"a4fplus_chip_label"
#define	SIMPLE_CS_LBL_MP	"simple_cs_label_mp"
#define	FSB2_CHIP_LBL		"fsb2_chip_label"

/*
 * DIMM serial number property methods
 */
#define	GET_DIMM_SERIAL		"get_dimm_serial"

extern int simple_dimm_label(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int simple_dimm_label_mp(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int seq_dimm_label(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int g4_dimm_label(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
    nvlist_t **);

extern int g12f_dimm_label(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
    nvlist_t **);

extern int simple_chip_label(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int g4_chip_label(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int a4fplus_chip_label(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int simple_cs_label_mp(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int get_dimm_serial(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
    nvlist_t **);
extern int fsb2_chip_label(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);

/*
 * Support functions of chip_subr.c
 */
extern void whinge(topo_mod_t *, int *, const char *, ...);
extern int nvprop_add(topo_mod_t *, nvpair_t *, const char *, tnode_t *);
extern int add_nvlist_strprop(topo_mod_t *, tnode_t *, nvlist_t *,
    const char *, const char *, const char **);
extern int add_nvlist_longprop(topo_mod_t *, tnode_t *, nvlist_t *,
    const char *, const char *, int32_t *);
extern int add_nvlist_longprops(topo_mod_t *, tnode_t *, nvlist_t *,
    const char *, int32_t *, ...);
extern int mkrsrc(topo_mod_t *, tnode_t *, const char *, int,
    nvlist_t *, nvlist_t **);
extern nvlist_t *cpu_fmri_create(topo_mod_t *, uint32_t, char *, uint8_t);
extern boolean_t is_xpv();
extern void get_chip_kstat_strs(topo_mod_t *, kstat_ctl_t *, int32_t, char **,
    char **);

/*
 * topo methods
 */
extern int mem_asru_compute(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int rank_fmri_present(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int rank_fmri_replaced(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int retire_strands(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int unretire_strands(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int service_state_strands(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int unusable_strands(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int ntv_page_retire(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int ntv_page_service_state(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int ntv_page_unretire(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int ntv_page_unusable(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);
extern int chip_fmri_replaced(topo_mod_t *, tnode_t *, topo_version_t,
    nvlist_t *, nvlist_t **);

extern int mem_asru_create(topo_mod_t *, nvlist_t *, nvlist_t **);

/*
 * Prototypes for chip_amd.c
 */
extern void amd_mc_create(topo_mod_t *, uint16_t, tnode_t *, const char *,
    nvlist_t *, int32_t, int32_t, int, int, int *);

/*
 * Prototypes for chip_intel.c
 */
extern int mc_offchip_open(void);
extern int mc_offchip_create(topo_mod_t *, tnode_t *, const char *, nvlist_t *);
extern void onchip_mc_create(topo_mod_t *, uint16_t, tnode_t *,
    const char *, nvlist_t *);

extern char *get_fmtstr(topo_mod_t *, nvlist_t *);
extern int store_prop_val(topo_mod_t *, char *, char *, nvlist_t **out);

/*
 * Prototypes for chip_smbios.c
 */

extern int init_chip_smbios(topo_mod_t *);
extern int chip_status_smbios_get(topo_mod_t *, id_t);
extern int chip_fru_smbios_get(topo_mod_t *, id_t);
extern const char *chip_label_smbios_get(topo_mod_t *, tnode_t *, id_t, char *);
extern const char *chip_serial_smbios_get(topo_mod_t *, id_t);
extern const char *chip_part_smbios_get(topo_mod_t *, id_t);
extern const char *chip_rev_smbios_get(topo_mod_t *, id_t);
extern id_t memnode_to_smbiosid(topo_mod_t *, uint16_t, const char *,
    uint64_t, void *);

/*
 * Prototypes for chip_temp.c
 */
extern int chip_create_chip_temp_sensor(topo_mod_t *, tnode_t *);
extern int chip_create_core_temp_sensor(topo_mod_t *, tnode_t *);

#ifdef __cplusplus
}
#endif

#endif /* _CHIP_H */