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]
23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SYS_CMLB_IMPL_H
28 #define _SYS_CMLB_IMPL_H
36 #include <sys/sunddi.h>
39 * FDISK partitions - 4 primary and MAX_EXT_PARTS number of Extended
42 #define FDISK_PARTS (FD_NUMPART + MAX_EXT_PARTS)
44 #if defined(_SUNOS_VTOC_8)
46 #elif defined(_SUNOS_VTOC_16)
47 #define NSDMAP (NDKMAP + FDISK_PARTS + 1)
49 #error "No VTOC format defined."
52 #define MAXPART (NSDMAP + 1)
56 #if defined(__i386) || defined(__amd64)
58 #define P0_RAW_DISK (NDKMAP)
59 #define FDISK_P1 (NDKMAP+1)
60 #define FDISK_P2 (NDKMAP+2)
61 #define FDISK_P3 (NDKMAP+3)
62 #define FDISK_P4 (NDKMAP+4)
64 #endif /* __i386 || __amd64 */
66 /* Driver Logging Levels */
67 #define CMLB_LOGMASK_ERROR 0x00000001
68 #define CMLB_LOGMASK_INFO 0x00000002
69 #define CMLB_LOGMASK_TRACE 0x00000004
71 #define CMLB_TRACE 0x00000001
72 #define CMLB_INFO 0x00000002
73 #define CMLB_ERROR 0x00000004
76 #define CMLB_MUTEX(cl) (&((cl)->cl_mutex))
77 #define CMLB_DEVINFO(cl) ((cl)->cl_devi)
78 #define CMLB_LABEL(cl) (ddi_driver_name((cl->cl_devi)))
81 #define ISREMOVABLE(cl) (cl->cl_is_removable)
82 #define ISCD(cl) (cl->cl_device_type == DTYPE_RODIRECT)
83 #define ISHOTPLUGGABLE(cl) (cl->cl_is_hotpluggable)
85 #if defined(_SUNOS_VTOC_8)
87 #define CMLBUNIT_SHIFT 3
88 #define CMLBPART_MASK 7
90 #elif defined(_SUNOS_VTOC_16)
92 #define CMLBUNIT_SHIFT 6
93 #define CMLBPART_MASK 63
96 #error "No VTOC format defined."
99 #define CMLBUNIT(dev) (getminor((dev)) >> CMLBUNIT_SHIFT)
100 #define CMLBPART(dev) (getminor((dev)) & CMLBPART_MASK)
103 * Return codes of cmlb_uselabel().
105 #define CMLB_LABEL_IS_VALID 0
106 #define CMLB_LABEL_IS_INVALID 1
108 #define CMLB_2TB_BLOCKS 0xffffffff
109 #define CMLB_1TB_BLOCKS 0x7fffffff
111 #define CMLB_EXTVTOC_LIMIT CMLB_2TB_BLOCKS
112 #define CMLB_OLDVTOC_LIMIT CMLB_1TB_BLOCKS
115 * fdisk partition mapping structure
118 ulong_t fmap_start
; /* starting block number */
119 ulong_t fmap_nblk
; /* number of blocks */
120 uchar_t fmap_systid
; /* systid of the partition */
131 CMLB_LABEL_UNDEF
= 0,
136 #define CMLB_ALLOW_2TB_WARN 0x1
139 typedef struct cmlb_lun
{
140 dev_info_t
*cl_devi
; /* pointer to devinfo */
141 struct dk_vtoc cl_vtoc
; /* disk VTOC */
142 struct dk_geom cl_g
; /* disk geometry */
144 diskaddr_t cl_blockcount
; /* capacity */
145 uint32_t cl_tgt_blocksize
; /* blocksize */
147 diskaddr_t cl_solaris_size
; /* size of Solaris partition */
148 uint_t cl_solaris_offset
; /* offset to Solaris part. */
150 struct dk_map cl_map
[MAXPART
]; /* logical partitions */
151 /* cylno is overloaded. used */
152 /* for starting block for EFI */
154 diskaddr_t cl_offset
[MAXPART
]; /* partition start blocks */
156 struct fmap cl_fmap
[FDISK_PARTS
]; /* fdisk partitions */
158 uchar_t cl_asciilabel
[LEN_DKL_ASCII
]; /* Disk ASCII label */
161 * This is the HBAs current notion of the geometry of the drive,
162 * for HBAs that support the "geometry" property.
164 struct cmlb_geom cl_lgeom
;
167 * This is the geometry of the device as reported by the MODE SENSE,
168 * command, Page 3 (Format Device Page) and Page 4 (Rigid Disk Drive
169 * Geometry Page), assuming MODE SENSE is supported by the target.
171 struct cmlb_geom cl_pgeom
;
173 ushort_t cl_dkg_skew
; /* skew */
175 cmlb_label_t cl_def_labeltype
; /* default label type */
177 /* label type based on which minor nodes were created last */
178 cmlb_label_t cl_last_labeltype
;
180 cmlb_label_t cl_cur_labeltype
; /* current label type */
182 /* indicates whether vtoc label is read from media */
183 cmlb_label_t cl_label_from_media
;
185 cmlb_state_t cl_state
; /* state of handle */
187 boolean_t cl_f_geometry_is_valid
;
188 int cl_sys_blocksize
;
192 /* the following are passed in at attach time */
193 boolean_t cl_is_removable
; /* is removable */
194 boolean_t cl_is_hotpluggable
; /* is hotpluggable */
195 int cl_alter_behavior
;
196 char *cl_node_type
; /* DDI_NT_... */
197 int cl_device_type
; /* DTYPE_DIRECT,.. */
198 int cl_reserved
; /* reserved efi partition # */
199 cmlb_tg_ops_t
*cmlb_tg_ops
;
200 #if defined(__i386) || defined(__amd64)
202 * Flag indicating whether extended partition nodes should be created
203 * or not. Is set in cmlb_attach. After creating nodes in
204 * cmlb_read_fdisk, it will be unset.
206 int cl_update_ext_minor_nodes
;
207 int cl_logical_drive_count
;
208 #endif /* __i386 || __amd64 */
209 uint8_t cl_msglog_flag
; /* used to enable/suppress */
210 /* certain log messages */
213 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cmlb_tg_ops
))
214 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_devi
))
215 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_removable
))
216 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_hotpluggable
))
217 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_node_type
))
218 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_sys_blocksize
))
219 _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_alter_behavior
))
220 _NOTE(SCHEME_PROTECTS_DATA("private data", cmlb_geom
))
221 _NOTE(SCHEME_PROTECTS_DATA("safe sharing", cmlb_lun::cl_f_geometry_is_valid
))
223 _NOTE(MUTEX_PROTECTS_DATA(cmlb_lun::cl_mutex
, cmlb_lun::cl_vtoc
))
226 #define DK_TG_READ(ihdlp, bufaddr, start_block, reqlength, tg_cookie)\
227 (ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_READ, \
228 bufaddr, start_block, reqlength, tg_cookie)
230 #define DK_TG_WRITE(ihdlp, bufaddr, start_block, reqlength, tg_cookie)\
231 (ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_WRITE,\
232 bufaddr, start_block, reqlength, tg_cookie)
234 #define DK_TG_GETPHYGEOM(ihdlp, phygeomp, tg_cookie) \
235 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETPHYGEOM,\
236 (void *)phygeomp, tg_cookie)
238 #define DK_TG_GETVIRTGEOM(ihdlp, virtgeomp, tg_cookie) \
239 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETVIRTGEOM,\
240 (void *)virtgeomp, tg_cookie)
242 #define DK_TG_GETCAP(ihdlp, capp, tg_cookie) \
243 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETCAPACITY,\
246 #define DK_TG_GETBLOCKSIZE(ihdlp, lbap, tg_cookie) \
247 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp),\
248 TG_GETBLOCKSIZE, lbap, tg_cookie)
250 #define DK_TG_GETATTRIBUTE(ihdlp, attributep, tg_cookie) \
251 (ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETATTR,\
252 attributep, tg_cookie)
258 #endif /* _SYS_CMLB_IMPL_H */