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 */