xref: /titanic_52/usr/src/uts/common/avs/ns/sdbc/sd_cache.h (revision 3270659f55e0928d6edec3d26217cc29398a8149)
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 _SD_CACHE_H
27 #define	_SD_CACHE_H
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 #include	<sys/debug.h>
34 #include <sys/nsctl/nsctl.h>
35 
36 /*
37  * Compiler defines
38  */
39 
40 #define	_SD_FAULT_RES		/* Enable Fault tolerance		*/
41 
42 #define	_SD_USE_THREADS		/* Use own threadset			*/
43 #define	_SD_LRU_OPTIMIZE	/* Enable LRU queue optimizations  	*/
44 #define	_SD_HASH_OPTIMIZE	/* Enable Hash optimizations		*/
45 
46 #if !defined(_SD_NO_GENERIC)
47 #define	_SD_MULTIUSER		/* Block locking (concurrent/dual copy) */
48 #endif /* (_SD_NO_GENERIC) */
49 
50 #if defined(_SD_OPTIM_ALLOC)
51 #define	_SD_NOCHECKS		/* Disable handle allocation checks	*/
52 #define	_SD_NOTRACE		/* Disable SDTRACE() macro		*/
53 #undef	_SD_MULTIUSER		/* Disable Block locking		*/
54 #if (_SD_OPTIM_ALLOC+0 > 1)
55 #define	_SD_NOSTATS		/* Disable read/write counts		*/
56 #endif
57 #endif /* (_SD_OPTIM_ALLOC) */
58 
59 #if defined(_SD_CHECKS)		/* Enable checks, stats, and tracing	*/
60 #undef	_SD_NOCHECKS
61 #undef	_SD_NOTRACE
62 #undef	_SD_NOSTATS
63 #define	_SD_STATS		/* Enable cache hits/longevity stats	*/
64 #if (_SD_CHECKS+0 > 1)
65 #define	_SD_DEBUG		/* Extra debugging checks		*/
66 #endif
67 #endif /* (_SD_CHECKS) */
68 
69 #if defined(_SD_NOTRACE) && defined(_SD_STATS)
70 #undef _SD_STATS		/* _SD_STATS requires SDTRACE() macro	*/
71 #endif
72 
73 /*
74  * Other compiler defines currently not enabled.
75  * 	#define	_SD_FBA_DATA_LOG  Enable data logging per 512 bytes.
76  * Other compiler defines enabled in the Makefile.
77  *	#define	_SD_8K_BLKSIZE	  Allow 8K cache block size
78  */
79 
80 extern	int	_sd_cblock_shift;
81 #define	BLK_SHFT	(_sd_cblock_shift)
82 #define	BLK_MASK	((1 << BLK_SHFT) - 1)
83 #define	BLK_SIZE(x)	((x) << BLK_SHFT)
84 #define	BLK_NUM(x)	((x) >> BLK_SHFT)
85 #define	BLK_LEN(x)	((x + BLK_MASK) >> BLK_SHFT)
86 #define	BLK_OFF(x)	((x) & BLK_MASK)
87 
88 
89 
90 #define	BLK_FBA_SHFT	(BLK_SHFT - FBA_SHFT)
91 #define	BLK_FBA_MASK	((1 << BLK_FBA_SHFT) - 1)
92 #define	BLK_TO_FBA_NUM(x) \
93 			((x) << BLK_FBA_SHFT)	/* block_num to fba_num */
94 #define	BLK_FBA_OFF(x)	((x) & BLK_FBA_MASK)	/* fba offset within */
95 						/* a cache block */
96 
97 #define	FBA_TO_BLK_NUM(x) \
98 			((x) >> BLK_FBA_SHFT)	/* fba_num to a */
99 						/* block_num */
100 
101 /* fba_num to the next higher block_num */
102 #define	FBA_TO_BLK_LEN(x)	((x + BLK_FBA_MASK) >> BLK_FBA_SHFT)
103 
104 /*
105  * This is the set of flags that are valid. Anything else set in the
106  * handle is invalid and the handle should be rejected during an allocation.
107  */
108 
109 #define	_SD_VALID_FLAGS (NSC_RDWRBUF | NSC_NOBLOCK | NSC_WRTHRU | NSC_NOCACHE\
110 			| NSC_HALLOCATED | NSC_BCOPY | NSC_PAGEIO \
111 			| NSC_PINNABLE | NSC_MIXED | NSC_FORCED_WRTHRU \
112 			| NSC_METADATA)
113 
114 
115 #define	_SD_FLAG_MASK   	(NSC_FLAGS)
116 #define	_SD_HINT_MASK		(NSC_HINTS)
117 #define	_SD_WRTHRU_MASK		(NSC_WRTHRU | NSC_FORCED_WRTHRU)
118 #define	_SD_NOCACHE_MASK	(NSC_NOCACHE)
119 
120 
121 
122 #define	_SD_INVALID_CD(cd)	((cd) > sdbc_max_devs)
123 
124 #define	_INFSD_NODE_UP(i)	(nsc_node_up(i))
125 
126 #ifdef m88k
127 #define	_sd_cache_initialized	_INFSD_cache_initialized
128 #endif
129 
130 #define	_SD_MAX_FBAS	1024
131 /*
132  * Allow one entry for null terminator and another to handle
133  * requests that are not cache block aligned.
134  */
135 #if defined(_SD_8K_BLKSIZE)
136 #define	_SD_MAX_BLKS	(2 + ((_SD_MAX_FBAS) >> 4))
137 #else
138 #define	_SD_MAX_BLKS	(2 + ((_SD_MAX_FBAS) >> 3))
139 #endif
140 
141 /* cd to use for _sd_centry_alloc to avoid entering hash table */
142 
143 #define	_CD_NOHASH	-1
144 
145 #if defined(_KERNEL) || defined(_KMEMUSER)
146 
147 struct _sd_buf_handle;
148 typedef void (*sdbc_callback_fn_t)(struct _sd_buf_handle *);
149 
150 typedef struct _sd_buf_handle {
151 	nsc_buf_t bh_buf;		/* Generic buffer - must be first */
152 	nsc_vec_t bh_bufvec[_SD_MAX_BLKS]; /* Scatter gather list */
153 	int bh_cd;
154 	sdbc_callback_fn_t bh_disconnect_cb;
155 	sdbc_callback_fn_t bh_read_cb;
156 	sdbc_callback_fn_t bh_write_cb;
157 	struct _sd_cctl *bh_centry;
158 	struct _sd_buf_handle *bh_next;
159 	struct _sd_buf_handle *bh_prev;
160 	void *bh_alloc_thread; /* debug: kthread that alloc'd this handle */
161 	void *bh_busy_thread; /* debug: kthread that is using this handle */
162 	void *bh_param;
163 } _sd_buf_handle_t;
164 
165 #define	bh_fba_pos	bh_buf.sb_pos
166 #define	bh_fba_len	bh_buf.sb_len
167 #define	bh_flag		bh_buf.sb_flag
168 #define	bh_error	bh_buf.sb_error
169 #define	bh_vec		bh_buf.sb_vec
170 
171 #define	_sd_bufvec_t	nsc_vec_t
172 #define	buflen		sv_len
173 #define	bufaddr		sv_addr
174 #define	bufvmeaddr	sv_vme
175 
176 #endif /* _KERNEL || _KMEMUSER */
177 
178 #ifdef __cplusplus
179 }
180 #endif
181 
182 #endif /* _SD_CACHE_H */
183