xref: /titanic_44/usr/src/uts/common/sys/cmlb_impl.h (revision c31fac72a0572e58d0f06438a238d835dee8ffa7)
13ccda647Slclee /*
23ccda647Slclee  * CDDL HEADER START
33ccda647Slclee  *
43ccda647Slclee  * The contents of this file are subject to the terms of the
5e8fb11a1Sshidokht  * Common Development and Distribution License (the "License").
6e8fb11a1Sshidokht  * You may not use this file except in compliance with the License.
73ccda647Slclee  *
83ccda647Slclee  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93ccda647Slclee  * or http://www.opensolaris.org/os/licensing.
103ccda647Slclee  * See the License for the specific language governing permissions
113ccda647Slclee  * and limitations under the License.
123ccda647Slclee  *
133ccda647Slclee  * When distributing Covered Code, include this CDDL HEADER in each
143ccda647Slclee  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153ccda647Slclee  * If applicable, add the following below this CDDL HEADER, with the
163ccda647Slclee  * fields enclosed by brackets "[]" replaced with your own identifying
173ccda647Slclee  * information: Portions Copyright [yyyy] [name of copyright owner]
183ccda647Slclee  *
193ccda647Slclee  * CDDL HEADER END
203ccda647Slclee  */
21342440ecSPrasad Singamsetty 
223ccda647Slclee /*
23*c31fac72SShidokht Yadegari  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
243ccda647Slclee  * Use is subject to license terms.
253ccda647Slclee  */
263ccda647Slclee 
273ccda647Slclee #ifndef _SYS_CMLB_IMPL_H
283ccda647Slclee #define	_SYS_CMLB_IMPL_H
293ccda647Slclee 
303ccda647Slclee #ifdef	__cplusplus
313ccda647Slclee extern "C" {
323ccda647Slclee #endif
333ccda647Slclee 
343ccda647Slclee #include <sys/cmlb.h>
353ccda647Slclee #include <sys/ddi.h>
363ccda647Slclee #include <sys/sunddi.h>
373ccda647Slclee 
38aa1b14e7SSheshadri Vasudevan /*
39aa1b14e7SSheshadri Vasudevan  * FDISK partitions - 4 primary and MAX_EXT_PARTS number of Extended
40aa1b14e7SSheshadri Vasudevan  * Partitions.
41aa1b14e7SSheshadri Vasudevan  */
42aa1b14e7SSheshadri Vasudevan #define	FDISK_PARTS		(FD_NUMPART + MAX_EXT_PARTS)
43aa1b14e7SSheshadri Vasudevan 
443ccda647Slclee #if defined(_SUNOS_VTOC_8)
453ccda647Slclee #define	NSDMAP			NDKMAP
463ccda647Slclee #elif defined(_SUNOS_VTOC_16)
47aa1b14e7SSheshadri Vasudevan #define	NSDMAP			(NDKMAP + FDISK_PARTS + 1)
483ccda647Slclee #else
493ccda647Slclee #error "No VTOC format defined."
503ccda647Slclee #endif
513ccda647Slclee 
523ccda647Slclee #define	MAXPART			(NSDMAP + 1)
533ccda647Slclee #define	WD_NODE			7
543ccda647Slclee 
553ccda647Slclee 
563ccda647Slclee #if defined(__i386) || defined(__amd64)
573ccda647Slclee 
583ccda647Slclee #define	P0_RAW_DISK		(NDKMAP)
593ccda647Slclee #define	FDISK_P1		(NDKMAP+1)
603ccda647Slclee #define	FDISK_P2		(NDKMAP+2)
613ccda647Slclee #define	FDISK_P3		(NDKMAP+3)
623ccda647Slclee #define	FDISK_P4		(NDKMAP+4)
633ccda647Slclee 
643ccda647Slclee #endif  /* __i386 || __amd64 */
653ccda647Slclee 
663ccda647Slclee /* Driver Logging Levels */
673ccda647Slclee #define	CMLB_LOGMASK_ERROR	0x00000001
683ccda647Slclee #define	CMLB_LOGMASK_INFO	0x00000002
693ccda647Slclee #define	CMLB_LOGMASK_TRACE	0x00000004
703ccda647Slclee 
713ccda647Slclee #define	CMLB_TRACE		0x00000001
723ccda647Slclee #define	CMLB_INFO		0x00000002
733ccda647Slclee #define	CMLB_ERROR		0x00000004
743ccda647Slclee 
753ccda647Slclee 
76e8fb11a1Sshidokht #define	CMLB_MUTEX(cl)		(&((cl)->cl_mutex))
77e8fb11a1Sshidokht #define	CMLB_DEVINFO(cl)	((cl)->cl_devi)
78*c31fac72SShidokht Yadegari #define	CMLB_LABEL(cl)		(ddi_driver_name((cl->cl_devi)))
793ccda647Slclee 
803ccda647Slclee 
817f0b8309SEdward Pilatowicz #define	ISREMOVABLE(cl)		(cl->cl_is_removable)
82e8fb11a1Sshidokht #define	ISCD(cl)		(cl->cl_device_type == DTYPE_RODIRECT)
837f0b8309SEdward Pilatowicz #define	ISHOTPLUGGABLE(cl)	(cl->cl_is_hotpluggable)
843ccda647Slclee 
853ccda647Slclee #if defined(_SUNOS_VTOC_8)
863ccda647Slclee 
873ccda647Slclee #define	CMLBUNIT_SHIFT		3
883ccda647Slclee #define	CMLBPART_MASK		7
893ccda647Slclee 
903ccda647Slclee #elif defined(_SUNOS_VTOC_16)
913ccda647Slclee 
923ccda647Slclee #define	CMLBUNIT_SHIFT		6
933ccda647Slclee #define	CMLBPART_MASK		63
943ccda647Slclee 
953ccda647Slclee #else
963ccda647Slclee #error "No VTOC format defined."
973ccda647Slclee #endif
983ccda647Slclee 
993ccda647Slclee #define	CMLBUNIT(dev)		(getminor((dev)) >> CMLBUNIT_SHIFT)
1003ccda647Slclee #define	CMLBPART(dev)		(getminor((dev)) &  CMLBPART_MASK)
1013ccda647Slclee 
1023ccda647Slclee /*
1033ccda647Slclee  * Return codes of cmlb_uselabel().
1043ccda647Slclee  */
1053ccda647Slclee #define	CMLB_LABEL_IS_VALID	0
1063ccda647Slclee #define	CMLB_LABEL_IS_INVALID	1
1073ccda647Slclee 
108342440ecSPrasad Singamsetty #define	CMLB_2TB_BLOCKS		0xffffffff
109342440ecSPrasad Singamsetty #define	CMLB_1TB_BLOCKS		0x7fffffff
110342440ecSPrasad Singamsetty 
111342440ecSPrasad Singamsetty #define	CMLB_EXTVTOC_LIMIT	CMLB_2TB_BLOCKS
112342440ecSPrasad Singamsetty #define	CMLB_OLDVTOC_LIMIT	CMLB_1TB_BLOCKS
113342440ecSPrasad Singamsetty 
1143ccda647Slclee /*
1153ccda647Slclee  * fdisk partition mapping structure
1163ccda647Slclee  */
1173ccda647Slclee struct fmap {
118342440ecSPrasad Singamsetty 	ulong_t fmap_start;	/* starting block number */
119342440ecSPrasad Singamsetty 	ulong_t fmap_nblk;	/* number of blocks */
120aa1b14e7SSheshadri Vasudevan 	uchar_t fmap_systid;		/* systid of the partition */
1213ccda647Slclee };
1223ccda647Slclee 
1233ccda647Slclee /* for cm_state */
1243ccda647Slclee typedef enum  {
1253ccda647Slclee 	CMLB_INITED = 0,
1263ccda647Slclee 	CMLB_ATTACHED
1273ccda647Slclee } cmlb_state_t;
1283ccda647Slclee 
1293ccda647Slclee typedef enum
1303ccda647Slclee {
1313ccda647Slclee 	CMLB_LABEL_UNDEF = 0,
1323ccda647Slclee 	CMLB_LABEL_VTOC,
1333ccda647Slclee 	CMLB_LABEL_EFI
1343ccda647Slclee } cmlb_label_t;
1353ccda647Slclee 
136342440ecSPrasad Singamsetty #define	CMLB_ALLOW_2TB_WARN 0x1
137342440ecSPrasad Singamsetty 
1383ccda647Slclee 
1393ccda647Slclee typedef struct cmlb_lun {
140e8fb11a1Sshidokht 	dev_info_t	*cl_devi;		/* pointer to devinfo */
141e8fb11a1Sshidokht 	struct dk_vtoc	cl_vtoc;	/* disk VTOC */
142e8fb11a1Sshidokht 	struct dk_geom	cl_g;		/* disk geometry */
1433ccda647Slclee 
144e8fb11a1Sshidokht 	diskaddr_t	cl_blockcount;		/* capacity */
145e8fb11a1Sshidokht 	uint32_t	cl_tgt_blocksize;	/* blocksize */
1463ccda647Slclee 
147e8fb11a1Sshidokht 	diskaddr_t	cl_solaris_size;	/* size of Solaris partition */
148e8fb11a1Sshidokht 	uint_t		cl_solaris_offset;	/* offset to Solaris part. */
1493ccda647Slclee 
150e8fb11a1Sshidokht 	struct  dk_map  cl_map[MAXPART];	/* logical partitions */
151342440ecSPrasad Singamsetty 						/* cylno is overloaded. used */
152342440ecSPrasad Singamsetty 						/* for starting block for EFI */
153342440ecSPrasad Singamsetty 
154e8fb11a1Sshidokht 	diskaddr_t	cl_offset[MAXPART];	/* partition start blocks */
1553ccda647Slclee 
156aa1b14e7SSheshadri Vasudevan 	struct fmap	cl_fmap[FDISK_PARTS];	/* fdisk partitions */
1573ccda647Slclee 
158e8fb11a1Sshidokht 	uchar_t		cl_asciilabel[LEN_DKL_ASCII];	/* Disk ASCII label */
1593ccda647Slclee 
1603ccda647Slclee 	/*
1613ccda647Slclee 	 * This is the HBAs current notion of the geometry of the drive,
1623ccda647Slclee 	 * for HBAs that support the "geometry" property.
1633ccda647Slclee 	 */
164e8fb11a1Sshidokht 	struct cmlb_geom	cl_lgeom;
1653ccda647Slclee 
1663ccda647Slclee 	/*
1673ccda647Slclee 	 * This is the geometry of the device as reported by the MODE SENSE,
1683ccda647Slclee 	 * command, Page 3 (Format Device Page) and Page 4 (Rigid Disk Drive
1693ccda647Slclee 	 * Geometry Page), assuming MODE SENSE is supported by the target.
1703ccda647Slclee 	 */
171e8fb11a1Sshidokht 	struct cmlb_geom	cl_pgeom;
1723ccda647Slclee 
173e8fb11a1Sshidokht 	ushort_t	cl_dkg_skew;		/* skew */
1743ccda647Slclee 
175e8fb11a1Sshidokht 	cmlb_label_t	cl_def_labeltype;	/* default label type */
1763ccda647Slclee 
1773ccda647Slclee 	/* label type based on which minor nodes were created last */
178e8fb11a1Sshidokht 	cmlb_label_t	cl_last_labeltype;
1793ccda647Slclee 
180e8fb11a1Sshidokht 	cmlb_label_t	cl_cur_labeltype;	/* current label type */
1813ccda647Slclee 
1823ccda647Slclee 	/* indicates whether vtoc label is read from media */
183342440ecSPrasad Singamsetty 	cmlb_label_t		cl_label_from_media;
1843ccda647Slclee 
185e8fb11a1Sshidokht 	cmlb_state_t	cl_state;		/* state of handle */
1863ccda647Slclee 
1877f0b8309SEdward Pilatowicz 	boolean_t	cl_f_geometry_is_valid;
188e8fb11a1Sshidokht 	int		cl_sys_blocksize;
1893ccda647Slclee 
190e8fb11a1Sshidokht 	kmutex_t	cl_mutex;
1913ccda647Slclee 
1923ccda647Slclee 	/* the following are passed in at attach time */
1937f0b8309SEdward Pilatowicz 	boolean_t	cl_is_removable;	/* is removable */
1947f0b8309SEdward Pilatowicz 	boolean_t	cl_is_hotpluggable;	/* is hotpluggable */
195e8fb11a1Sshidokht 	int		cl_alter_behavior;
196e8fb11a1Sshidokht 	char 		*cl_node_type;		/* DDI_NT_... */
197e8fb11a1Sshidokht 	int		cl_device_type;		/* DTYPE_DIRECT,.. */
198e8fb11a1Sshidokht 	int		cl_reserved;		/* reserved efi partition # */
1993ccda647Slclee 	cmlb_tg_ops_t 	*cmlb_tg_ops;
200aa1b14e7SSheshadri Vasudevan #if defined(__i386) || defined(__amd64)
201aa1b14e7SSheshadri Vasudevan 	/*
202aa1b14e7SSheshadri Vasudevan 	 * Flag indicating whether extended partition nodes should be created
203aa1b14e7SSheshadri Vasudevan 	 * or not. Is set in cmlb_attach. After creating nodes in
204aa1b14e7SSheshadri Vasudevan 	 * cmlb_read_fdisk, it will be unset.
205aa1b14e7SSheshadri Vasudevan 	 */
206aa1b14e7SSheshadri Vasudevan 	int		cl_update_ext_minor_nodes;
207aa1b14e7SSheshadri Vasudevan 	int		cl_logical_drive_count;
208aa1b14e7SSheshadri Vasudevan #endif  /* __i386 || __amd64 */
209342440ecSPrasad Singamsetty 	uint8_t		cl_msglog_flag;		/* used to enable/suppress */
210342440ecSPrasad Singamsetty 						/* certain log messages */
2113ccda647Slclee } cmlb_lun_t;
2123ccda647Slclee 
2133ccda647Slclee _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cmlb_tg_ops))
214e8fb11a1Sshidokht _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_devi))
215e8fb11a1Sshidokht _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_removable))
216e8fb11a1Sshidokht _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_hotpluggable))
217e8fb11a1Sshidokht _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_node_type))
218e8fb11a1Sshidokht _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_sys_blocksize))
219e8fb11a1Sshidokht _NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_alter_behavior))
2203ccda647Slclee _NOTE(SCHEME_PROTECTS_DATA("private data", cmlb_geom))
221e8fb11a1Sshidokht _NOTE(SCHEME_PROTECTS_DATA("safe sharing", cmlb_lun::cl_f_geometry_is_valid))
2223ccda647Slclee 
2231fad2c0eSXiao Raymond Li _NOTE(MUTEX_PROTECTS_DATA(cmlb_lun::cl_mutex, cmlb_lun::cl_vtoc))
2243ccda647Slclee 
2253ccda647Slclee 
226e8fb11a1Sshidokht #define	DK_TG_READ(ihdlp, bufaddr, start_block, reqlength, tg_cookie)\
227e8fb11a1Sshidokht 	(ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_READ, \
228e8fb11a1Sshidokht 	bufaddr, start_block, reqlength, tg_cookie)
2293ccda647Slclee 
230e8fb11a1Sshidokht #define	DK_TG_WRITE(ihdlp,  bufaddr, start_block, reqlength, tg_cookie)\
231e8fb11a1Sshidokht 	(ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_WRITE,\
232e8fb11a1Sshidokht 	bufaddr, start_block, reqlength, tg_cookie)
2333ccda647Slclee 
234e8fb11a1Sshidokht #define	DK_TG_GETPHYGEOM(ihdlp, phygeomp, tg_cookie) \
235e8fb11a1Sshidokht 	(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETPHYGEOM,\
236e8fb11a1Sshidokht 	    (void *)phygeomp, tg_cookie)
2373ccda647Slclee 
238e8fb11a1Sshidokht #define	DK_TG_GETVIRTGEOM(ihdlp, virtgeomp, tg_cookie) \
239e8fb11a1Sshidokht 	(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETVIRTGEOM,\
240e8fb11a1Sshidokht 	    (void *)virtgeomp, tg_cookie)
2413ccda647Slclee 
242e8fb11a1Sshidokht #define	DK_TG_GETCAP(ihdlp, capp, tg_cookie) \
243e8fb11a1Sshidokht 	(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETCAPACITY,\
244e8fb11a1Sshidokht 	capp, tg_cookie)
245e8fb11a1Sshidokht 
246e8fb11a1Sshidokht #define	DK_TG_GETBLOCKSIZE(ihdlp, lbap, tg_cookie) \
247e8fb11a1Sshidokht 	(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp),\
248e8fb11a1Sshidokht 	TG_GETBLOCKSIZE, lbap, tg_cookie)
249e8fb11a1Sshidokht 
250e8fb11a1Sshidokht #define	DK_TG_GETATTRIBUTE(ihdlp, attributep, tg_cookie) \
251e8fb11a1Sshidokht 	(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETATTR,\
252e8fb11a1Sshidokht 	    attributep, tg_cookie)
2533ccda647Slclee 
2543ccda647Slclee #ifdef __cplusplus
2553ccda647Slclee }
2563ccda647Slclee #endif
2573ccda647Slclee 
2583ccda647Slclee #endif	/* _SYS_CMLB_IMPL_H */
259