1700 Add SCSI UNMAP support
[unleashed.git] / usr / src / uts / common / sys / cmlb_impl.h
blobb64c4aa64b2710fe15dbe707ad96716ef0ba6477
1 /*
2 * CDDL HEADER START
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]
19 * CDDL HEADER END
23 * Copyright 2016 Toomas Soome <tsoome@me.com>
24 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
28 #ifndef _SYS_CMLB_IMPL_H
29 #define _SYS_CMLB_IMPL_H
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
35 #include <sys/cmlb.h>
36 #include <sys/ddi.h>
37 #include <sys/sunddi.h>
40 * FDISK partitions - 4 primary and MAX_EXT_PARTS number of Extended
41 * Partitions.
43 #define FDISK_PARTS (FD_NUMPART + MAX_EXT_PARTS)
45 #if defined(_SUNOS_VTOC_8)
47 * As lofi needs to support p0 on sparc in case of labeled virtual disks,
48 * define NDSMAP to support one extra entrie.
50 #define NSDMAP (NDKMAP + 1)
51 #elif defined(_SUNOS_VTOC_16)
52 #define NSDMAP (NDKMAP + FDISK_PARTS + 1)
53 #else
54 #error "No VTOC format defined."
55 #endif
57 #define MAXPART (NSDMAP + 1)
58 #define WD_NODE 7
59 #define P0_RAW_DISK (NDKMAP)
61 #if defined(__i386) || defined(__amd64)
63 #define FDISK_P1 (NDKMAP+1)
64 #define FDISK_P2 (NDKMAP+2)
65 #define FDISK_P3 (NDKMAP+3)
66 #define FDISK_P4 (NDKMAP+4)
68 #endif /* __i386 || __amd64 */
70 /* Driver Logging Levels */
71 #define CMLB_LOGMASK_ERROR 0x00000001
72 #define CMLB_LOGMASK_INFO 0x00000002
73 #define CMLB_LOGMASK_TRACE 0x00000004
75 #define CMLB_TRACE 0x00000001
76 #define CMLB_INFO 0x00000002
77 #define CMLB_ERROR 0x00000004
80 #define CMLB_MUTEX(cl) (&((cl)->cl_mutex))
81 #define CMLB_DEVINFO(cl) ((cl)->cl_devi)
82 #define CMLB_LABEL(cl) (ddi_driver_name((cl->cl_devi)))
85 #define ISREMOVABLE(cl) (cl->cl_is_removable)
86 #define ISCD(cl) (cl->cl_device_type == DTYPE_RODIRECT)
87 #define ISHOTPLUGGABLE(cl) (cl->cl_is_hotpluggable)
89 #define CMLBUNIT_SHIFT (CMLBUNIT_DFT_SHIFT)
90 #define CMLBPART_MASK ((1 << CMLBUNIT_SHIFT) - 1)
92 #define CMLBUNIT(dev, shift) (getminor((dev)) >> (shift))
93 #define CMLBPART(dev) (getminor((dev)) & CMLBPART_MASK)
96 * Return codes of cmlb_uselabel().
98 #define CMLB_LABEL_IS_VALID 0
99 #define CMLB_LABEL_IS_INVALID 1
101 #define CMLB_2TB_BLOCKS 0xffffffff
102 #define CMLB_1TB_BLOCKS 0x7fffffff
104 #define CMLB_EXTVTOC_LIMIT CMLB_2TB_BLOCKS
105 #define CMLB_OLDVTOC_LIMIT CMLB_1TB_BLOCKS
108 * fdisk partition mapping structure
110 struct fmap {
111 ulong_t fmap_start; /* starting block number */
112 ulong_t fmap_nblk; /* number of blocks */
113 uchar_t fmap_systid; /* systid of the partition */
116 /* for cm_state */
117 typedef enum {
118 CMLB_INITED = 0,
119 CMLB_ATTACHED
120 } cmlb_state_t;
122 typedef enum
124 CMLB_LABEL_UNDEF = 0,
125 CMLB_LABEL_VTOC,
126 CMLB_LABEL_EFI
127 } cmlb_label_t;
129 #define CMLB_ALLOW_2TB_WARN 0x1
132 typedef struct cmlb_lun {
133 dev_info_t *cl_devi; /* pointer to devinfo */
134 struct dk_vtoc cl_vtoc; /* disk VTOC */
135 struct dk_geom cl_g; /* disk geometry */
137 diskaddr_t cl_blockcount; /* capacity */
138 uint32_t cl_tgt_blocksize; /* blocksize */
140 diskaddr_t cl_solaris_size; /* size of Solaris partition */
141 uint_t cl_solaris_offset; /* offset to Solaris part. */
143 struct dk_map cl_map[MAXPART]; /* logical partitions */
144 /* cylno is overloaded. used */
145 /* for starting block for EFI */
147 diskaddr_t cl_offset[MAXPART]; /* partition start blocks */
149 struct fmap cl_fmap[FDISK_PARTS]; /* fdisk partitions */
151 uchar_t cl_asciilabel[LEN_DKL_ASCII]; /* Disk ASCII label */
154 * This is the HBAs current notion of the geometry of the drive,
155 * for HBAs that support the "geometry" property.
157 struct cmlb_geom cl_lgeom;
160 * This is the geometry of the device as reported by the MODE SENSE,
161 * command, Page 3 (Format Device Page) and Page 4 (Rigid Disk Drive
162 * Geometry Page), assuming MODE SENSE is supported by the target.
164 struct cmlb_geom cl_pgeom;
166 ushort_t cl_dkg_skew; /* skew */
168 cmlb_label_t cl_def_labeltype; /* default label type */
170 /* label type based on which minor nodes were created last */
171 cmlb_label_t cl_last_labeltype;
173 cmlb_label_t cl_cur_labeltype; /* current label type */
175 /* indicates whether vtoc label is read from media */
176 cmlb_label_t cl_label_from_media;
178 cmlb_state_t cl_state; /* state of handle */
180 boolean_t cl_f_geometry_is_valid;
181 int cl_sys_blocksize;
183 kmutex_t cl_mutex;
185 /* the following are passed in at attach time */
186 boolean_t cl_is_removable; /* is removable */
187 boolean_t cl_is_hotpluggable; /* is hotpluggable */
188 int cl_alter_behavior;
189 char *cl_node_type; /* DDI_NT_... */
190 int cl_device_type; /* DTYPE_DIRECT,.. */
191 int cl_reserved; /* reserved efi partition # */
192 cmlb_tg_ops_t *cmlb_tg_ops;
193 #if defined(__i386) || defined(__amd64)
195 * Flag indicating whether extended partition nodes should be created
196 * or not. Is set in cmlb_attach. After creating nodes in
197 * cmlb_read_fdisk, it will be unset.
199 int cl_update_ext_minor_nodes;
200 int cl_logical_drive_count;
201 #endif /* __i386 || __amd64 */
202 uint8_t cl_msglog_flag; /* used to enable/suppress */
203 /* certain log messages */
204 } cmlb_lun_t;
206 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cmlb_tg_ops))
207 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_devi))
208 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_removable))
209 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_hotpluggable))
210 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_node_type))
211 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_sys_blocksize))
212 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_alter_behavior))
213 _NOTE(SCHEME_PROTECTS_DATA("private data", cmlb_geom))
214 _NOTE(SCHEME_PROTECTS_DATA("safe sharing", cmlb_lun::cl_f_geometry_is_valid))
216 _NOTE(MUTEX_PROTECTS_DATA(cmlb_lun::cl_mutex, cmlb_lun::cl_vtoc))
219 #define DK_TG_READ(ihdlp, bufaddr, start_block, reqlength, tg_cookie)\
220 (ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_READ, \
221 bufaddr, start_block, reqlength, tg_cookie)
223 #define DK_TG_WRITE(ihdlp, bufaddr, start_block, reqlength, tg_cookie)\
224 (ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_WRITE,\
225 bufaddr, start_block, reqlength, tg_cookie)
227 #define DK_TG_GETPHYGEOM(ihdlp, phygeomp, tg_cookie) \
228 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETPHYGEOM,\
229 (void *)phygeomp, tg_cookie)
231 #define DK_TG_GETVIRTGEOM(ihdlp, virtgeomp, tg_cookie) \
232 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETVIRTGEOM,\
233 (void *)virtgeomp, tg_cookie)
235 #define DK_TG_GETCAP(ihdlp, capp, tg_cookie) \
236 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETCAPACITY,\
237 capp, tg_cookie)
239 #define DK_TG_GETBLOCKSIZE(ihdlp, lbap, tg_cookie) \
240 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp),\
241 TG_GETBLOCKSIZE, lbap, tg_cookie)
243 #define DK_TG_GETATTRIBUTE(ihdlp, attributep, tg_cookie) \
244 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETATTR,\
245 attributep, tg_cookie)
247 #ifdef __cplusplus
249 #endif
251 #endif /* _SYS_CMLB_IMPL_H */