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/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _CMD_LxCACHE_H
27#define	_CMD_LxCACHE_H
28
29/*
30 * Routines for the creation of Lxcache retirement faults and for the
31 * management of Lxcache-related state.
32 */
33
34#include <cmd_state.h>
35#include <cmd_cpu.h>
36#include <cmd_fmri.h>
37
38#include <fm/fmd_api.h>
39#include <sys/types.h>
40
41#ifdef __cplusplus
42extern "C" {
43#endif
44
45#define	QTCLR		1
46#define	CMD_ANON_WAY	-1
47#define	MAX_WAYS	8
48#define	HUNDRED_PERCENT	100
49#define	SUSPECT_PERCENT	50
50
51#define	CMD_LxCACHE_F_ACTIVE	0x0
52#define	CMD_LxCACHE_F_FAULTING	0x1
53#define	CMD_LxCACHE_F_RETIRED	0x2
54#define	CMD_LxCACHE_F_UNRETIRED	0x4
55#define	CMD_LxCACHE_F_RERETIRED	0x8
56
57#define	LxCACHE_MKVERSION(version)	((version) << 4 | 1)
58
59#define	CMD_LxCACHE_VERSION_1	LxCACHE_MKVERSION(1)	/* 17 */
60#define	CMD_LxCACHE_VERSION	CMD_LxCACHE_VERSION_1
61
62#define	CMD_LxCACHE_VERSIONED(Lxcache)	((Lxcache)->Lxcache_version & 1)
63
64#define	MAX_FMRI_LEN	128
65
66#define	IS_TAG(type)	((type == CMD_PTR_CPU_L2TAG) ||\
67			    (type == CMD_PTR_CPU_L3TAG))
68
69typedef struct cmd_Lxcache_pers {
70	cmd_header_t Lxcachep_header;	/* Nodetype must be CMD_NT_LxCACHE */
71	/*
72	 * We need the cpu_hdr_bufname  in order to restore the Lxcache.
73	 */
74	char Lxcachep_cpu_hdr_bufname[CMD_BUFNMLEN];
75	uint_t Lxcachep_version;
76	cmd_fmri_t Lxcachep_asru;	/* ASRU for this LxCACHE */
77	char	Lxcachep_retired_fmri[MAX_FMRI_LEN];
78	cmd_ptrsubtype_t Lxcachep_type;	/* L2 or L3 */
79	uint32_t Lxcachep_index;	/* cache index Lxcache represents */
80	uint32_t Lxcachep_way;		/* cache way this Lxcache represents */
81	uint16_t Lxcachep_bit;		/* bit in Lxcache that has fault */
82	uint_t Lxcachep_flags;		/* CMD_MEM_F_* */
83	uint_t	Lxreason;		/* Suspicion or convicted */
84} cmd_Lxcache_pers_t;
85
86#define	CMD_LXFUNCTIONING	0	/* Initial value */
87#define	CMD_LXSUSPICIOUS	0x1
88#define	CMD_LXSUSPECT_DATA	0x1
89#define	CMD_LXCONVICTED		0x2
90#define	CMD_LXSUSPECT_0_TAG	0x4
91#define	CMD_LXSUSPECT_1_TAG	0x8
92#define	CMD_LXSUSPICIOUS_BY_ASSOCIATION		0x10
93#define	CMD_LXCONVICTED_BY_ASSOCIATION		0x20
94
95typedef struct cmd_Lxcache {
96	cmd_Lxcache_pers_t Lxcache_pers;
97	int	Lxcache_retry_count;	/* retry count for recheck taga */
98	id_t	Lxcache_timeout_id;
99	cmd_errcl_t	Lxcache_clcode;
100	char	*Lxcache_class;
101	fmd_event_t	*Lxcache_ep;
102	nvlist_t	*Lxcache_nvl;
103	char	*Lxcache_serdnm;	/* SERD to hold the ep during */
104					/* recheck of tags */
105	cmd_case_t Lxcache_case;	/* Open CE case against this Lxcache */
106	cmd_xr_t	*xr;		/* The associated XR struct */
107} cmd_Lxcache_t;
108
109#define	Lxcache_header		Lxcache_pers.Lxcachep_header
110#define	Lxcache_nodetype	Lxcache_pers.Lxcachep_header.hdr_nodetype
111#define	Lxcache_bufname		Lxcache_pers.Lxcachep_header.hdr_bufname
112#define	Lxcache_cpu_bufname	Lxcache_pers.Lxcachep_cpu_hdr_bufname
113#define	Lxcache_version		Lxcache_pers.Lxcachep_version
114#define	Lxcache_asru		Lxcache_pers.Lxcachep_asru
115#define	Lxcache_asru_nvl	Lxcache_pers.Lxcachep_asru.fmri_nvl
116#define	Lxcache_flags		Lxcache_pers.Lxcachep_flags
117#define	Lxcache_type		Lxcache_pers.Lxcachep_type
118#define	Lxcache_index		Lxcache_pers.Lxcachep_index
119#define	Lxcache_way		Lxcache_pers.Lxcachep_way
120#define	Lxcache_bit		Lxcache_pers.Lxcachep_bit
121#define	Lxcache_retired_fmri	Lxcache_pers.Lxcachep_retired_fmri
122#define	Lxcache_reason		Lxcache_pers.Lxreason
123#define	Lxcache_list		Lxcache_header.hdr_list
124
125/*
126 * Lxcache retirement
127 *
128 * When a Lxcache is to be retired, these routines are called to generate and
129 * manage a fault.memory.Lxcache against the Lxcache.
130 */
131#ifdef sun4u
132extern int cmd_cache_ce_panther(fmd_hdl_t *, fmd_event_t *, cmd_xr_t *);
133extern int cmd_xr_pn_cache_fill(fmd_hdl_t *, nvlist_t *, cmd_xr_t *,
134    cmd_cpu_t *, cmd_errcl_t);
135#endif
136extern cmd_evdisp_t cmd_us4plus_tag_err(fmd_hdl_t *, fmd_event_t *, nvlist_t *,
137	cmd_cpu_t *, cmd_ptrsubtype_t,
138	const char *, const char *, const char *, cmd_errcl_t);
139extern void cmd_Lxcache_close(fmd_hdl_t *, void *);
140extern void cmd_Lxcache_write(fmd_hdl_t *, cmd_Lxcache_t *);
141
142extern cmd_Lxcache_t *cmd_Lxcache_create(fmd_hdl_t *,  cmd_xr_t *xr,
143    cmd_cpu_t *, nvlist_t *, cmd_ptrsubtype_t, int32_t, int8_t, int16_t);
144
145extern cmd_Lxcache_t *cmd_Lxcache_lookup_by_type_index_way_bit(cmd_cpu_t *,
146	cmd_ptrsubtype_t, int32_t, int8_t, int16_t);
147
148extern cmd_Lxcache_t *
149cmd_Lxcache_lookup_by_index_way(cmd_cpu_t *, cmd_ptrsubtype_t,
150	int32_t, int8_t);
151extern cmd_Lxcache_t *
152cmd_Lxcache_lookup_by_type_index_way_reason(cmd_cpu_t *, cmd_ptrsubtype_t,
153	int32_t, int8_t, int32_t);
154extern cmd_Lxcache_t *
155cmd_Lxcache_lookup_by_type_index_bit_reason(cmd_cpu_t *, cmd_ptrsubtype_t,
156	int32_t, int16_t, int32_t);
157extern int8_t cmd_Lxcache_get_next_retirable_way(cmd_cpu_t *, int32_t,
158	cmd_ptrsubtype_t, int8_t);
159extern int8_t cmd_Lxcache_get_lowest_retirable_way(cmd_cpu_t *,
160	int32_t, cmd_ptrsubtype_t);
161extern void cmd_Lxcache_destroy_anonymous_serd_engines(fmd_hdl_t *,
162	cmd_cpu_t *, cmd_ptrsubtype_t, int32_t, int16_t);
163extern const char *cmd_type_to_str(cmd_ptrsubtype_t);
164extern const char *cmd_reason_to_str(int);
165extern const char *cmd_flags_to_str(int);
166extern boolean_t cmd_Lxcache_unretire(fmd_hdl_t *, cmd_cpu_t *,
167	cmd_Lxcache_t *, const char *);
168extern boolean_t cmd_Lxcache_retire(fmd_hdl_t *, cmd_cpu_t *,
169	cmd_Lxcache_t *, const char *, uint_t);
170extern int cmd_Lx_repair_rsrc(fmd_hdl_t *, nvlist_t *);
171extern ssize_t cmd_fmri_nvl2str(fmd_hdl_t *hdl, nvlist_t *nvl, char *,
172	size_t);
173extern void cmd_Lxcache_dirty(fmd_hdl_t *, cmd_Lxcache_t *);
174extern void *cmd_Lxcache_restore(fmd_hdl_t *, fmd_case_t *, cmd_case_ptr_t *);
175extern void cmd_Lxcache_validate(fmd_hdl_t *, cmd_cpu_t *);
176extern void cmd_Lxcache_destroy(fmd_hdl_t *, cmd_cpu_t *, cmd_Lxcache_t *);
177extern void cmd_Lxcache_free(fmd_hdl_t *, cmd_cpu_t *, cmd_Lxcache_t *, int);
178extern void cmd_Lxcache_fini(fmd_hdl_t *, cmd_cpu_t *);
179extern char *cmd_Lxcache_serdnm_create(fmd_hdl_t *, uint32_t, cmd_ptrsubtype_t,
180				int32_t, int8_t, int16_t);
181extern char *cmd_Lxcache_anonymous_serdnm_create(fmd_hdl_t *, uint32_t,
182		cmd_ptrsubtype_t, int32_t, int8_t, int16_t);
183extern void cmd_Lxcache_gc(fmd_hdl_t *);
184extern void cmd_Lxcache_fault(fmd_hdl_t *, cmd_cpu_t *, cmd_Lxcache_t *,
185				const char *, nvlist_t *, uint_t);
186extern cmd_evdisp_t get_tagdata(cmd_cpu_t *, cmd_ptrsubtype_t,
187    int32_t, uint64_t *);
188
189extern int get_cpu_retired_ways(cmd_cpu_t *, cmd_ptrsubtype_t);
190extern int get_index_retired_ways(cmd_cpu_t *, cmd_ptrsubtype_t, int32_t);
191extern int is_index_way_retired(cmd_cpu_t *, cmd_ptrsubtype_t, int32_t,
192    int8_t);
193extern void cmd_fault_the_cpu(fmd_hdl_t *, cmd_cpu_t *, cmd_ptrsubtype_t,
194	    const char *);
195extern uint32_t cmd_Lx_index_count_type1_ways(cmd_cpu_t *);
196extern uint32_t cmd_Lx_index_count_type2_ways(cmd_cpu_t *);
197extern void cmd_Lxcache_anonymous_tag_error_timeout(fmd_hdl_t *, id_t);
198extern cmd_Lxcache_t *cmd_Lxcache_lookup_by_timeout_id(id_t);
199extern boolean_t cmd_create_case_for_Lxcache(fmd_hdl_t *, cmd_cpu_t *,
200	cmd_Lxcache_t *);
201extern int test_mode;
202#ifdef __cplusplus
203}
204#endif
205
206#endif /* _CMD_LxCACHE_H */
207