xref: /xnu-11215/bsd/sys/disk.h (revision e6231be0)
1 /*
2  * Copyright (c) 1998-2014 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _SYS_DISK_H_
30 #define _SYS_DISK_H_
31 
32 #include <stdint.h>
33 #include <sys/ioctl.h>
34 
35 #ifdef XNU_KERNEL_PRIVATE
36 #include <mach/boolean.h>
37 #endif /* XNU_KERNEL_PRIVATE */
38 
39 /*
40  * Definitions
41  *
42  * ioctl                                 description
43  * ------------------------------------- ---------------------------------------
44  * DKIOCEJECT                            eject media
45  * DKIOCSYNCHRONIZE                      flush media
46  *
47  * DKIOCFORMAT                           format media
48  * DKIOCGETFORMATCAPACITIES              get media's formattable capacities
49  *
50  * DKIOCGETBLOCKSIZE                     get media's block size
51  * DKIOCGETBLOCKCOUNT                    get media's block count
52  * DKIOCGETFIRMWAREPATH                  get media's firmware path
53  *
54  * DKIOCISFORMATTED                      is media formatted?
55  * DKIOCISWRITABLE                       is media writable?
56  *
57  * DKIOCREQUESTIDLE                      idle media
58  * DKIOCUNMAP                            delete unused data
59  *
60  * DKIOCGETLOCATION                      get device's physical location
61  *
62  * DKIOCGETMAXBLOCKCOUNTREAD             get maximum block count for reads
63  * DKIOCGETMAXBLOCKCOUNTWRITE            get maximum block count for writes
64  * DKIOCGETMAXBYTECOUNTREAD              get maximum byte count for reads
65  * DKIOCGETMAXBYTECOUNTWRITE             get maximum byte count for writes
66  *
67  * DKIOCGETMAXSEGMENTCOUNTREAD           get maximum segment count for reads
68  * DKIOCGETMAXSEGMENTCOUNTWRITE          get maximum segment count for writes
69  * DKIOCGETMAXSEGMENTBYTECOUNTREAD       get maximum segment byte count for reads
70  * DKIOCGETMAXSEGMENTBYTECOUNTWRITE      get maximum segment byte count for writes
71  *
72  * DKIOCGETMINSEGMENTALIGNMENTBYTECOUNT  get minimum segment alignment in bytes
73  * DKIOCGETMAXSEGMENTADDRESSABLEBITCOUNT get maximum segment width in bits
74  *
75  * DKIOCGETFEATURES                      get device's feature set
76  * DKIOCGETPHYSICALBLOCKSIZE             get device's block size
77  * DKIOCGETCOMMANDPOOLSIZE               get device's queue depth
78  *
79  * DKIOCGETPROVISIONSTATUS               get device's block provision status
80  * DKIOCGETIOMINSATURATIONBYTECOUNT      get minimum byte count to saturate storage bandwidth
81  *
82  * DKIOCGETERRORDESCRIPTION              get description of any drive error
83  *
84  * DKIOCGETMAXSWAPWRITE                  get maximum swap file write per day in bytes
85  */
86 
87 #define DK_FEATURE_BARRIER                    0x00000002
88 #define DK_FEATURE_PRIORITY                   0x00000004
89 #define DK_FEATURE_UNMAP                      0x00000010
90 
91 #define DK_SYNCHRONIZE_OPTION_BARRIER         0x00000002
92 
93 typedef struct{
94 	uint64_t               offset;
95 	uint64_t               length;
96 } dk_extent_t;
97 
98 typedef struct{
99 	char                   path[128];
100 } dk_firmware_path_t;
101 
102 typedef struct{
103 	uint64_t               blockCount;
104 	uint32_t               blockSize;
105 
106 	uint8_t                reserved0096[4];    /* reserved, clear to zero */
107 } dk_format_capacity_t;
108 
109 typedef struct{
110 	dk_format_capacity_t * capacities;
111 	uint32_t               capacitiesCount;    /* use zero to probe count */
112 
113 #ifdef __LP64__
114 	uint8_t                reserved0096[4];    /* reserved, clear to zero */
115 #else /* !__LP64__ */
116 	uint8_t                reserved0064[8];    /* reserved, clear to zero */
117 #endif /* !__LP64__ */
118 } dk_format_capacities_t;
119 
120 typedef struct{
121 	uint64_t               offset;
122 	uint64_t               length;
123 
124 	uint32_t               options;
125 
126 	uint8_t                reserved0160[4];    /* reserved, clear to zero */
127 } dk_synchronize_t;
128 
129 typedef struct{
130 	dk_extent_t *          extents;
131 	uint32_t               extentsCount;
132 
133 	uint32_t               options;
134 
135 #ifndef __LP64__
136 	uint8_t                reserved0096[4];    /* reserved, clear to zero */
137 #endif /* !__LP64__ */
138 } dk_unmap_t;
139 
140 typedef struct{
141 	uint64_t           flags;
142 	uint64_t           hotfile_size;           /* in bytes */
143 	uint64_t           hibernate_minsize;
144 	uint64_t           swapfile_pinning;
145 
146 	uint64_t           padding[4];
147 } dk_corestorage_info_t;
148 
149 #define DK_CORESTORAGE_PIN_YOUR_METADATA        0x00000001
150 #define DK_CORESTORAGE_ENABLE_HOTFILES          0x00000002
151 #define DK_CORESTORAGE_PIN_YOUR_SWAPFILE        0x00000004
152 
153 #define DK_PROVISION_TYPE_MAPPED                0x00
154 #define DK_PROVISION_TYPE_DEALLOCATED           0x01
155 #define DK_PROVISION_TYPE_ANCHORED              0x02
156 
157 typedef struct{
158 	uint64_t           offset;
159 	uint64_t           length;
160 	uint8_t            provisionType;
161 	uint8_t            reserved[7];
162 } dk_provision_extent_t;
163 
164 typedef struct{
165 	uint64_t                offset;         /* input:        logical byte offset */
166 	uint64_t                length;         /* input:        byte length, 0 for whole length */
167 	uint64_t                options;        /*               reserved, clear to zero */
168 	uint32_t                reserved;       /*               not used */
169 	uint32_t                extentsCount;   /* input/output: count for extents */
170 	dk_provision_extent_t * extents;        /* output:       provision extents */
171 } dk_provision_status_t;
172 
173 typedef struct{
174 	uint64_t               options;        /*               reserved, clear to zero */
175 	uint64_t               reserved;       /*               reserved, clear to zero */
176 	uint64_t               description_size;
177 	char *                 description;
178 } dk_error_description_t;
179 
180 #define DK_LOCATION_INTERNAL                   0x00000000
181 #define DK_LOCATION_EXTERNAL                   0x00000001
182 
183 #ifdef KERNEL
184 #ifdef PRIVATE
185 
186 /* Definitions of option bits for dk_unmap_t */
187 #define _DK_UNMAP_INITIALIZE                   0x00000100
188 
189 #endif /* PRIVATE */
190 #endif /* KERNEL */
191 
192 #define DKIOCEJECT                            _IO('d', 21)
193 #define DKIOCSYNCHRONIZE                      _IOW('d', 22, dk_synchronize_t)
194 
195 #define DKIOCFORMAT                           _IOW('d', 26, dk_format_capacity_t)
196 #define DKIOCGETFORMATCAPACITIES              _IOWR('d', 26, dk_format_capacities_t)
197 
198 #define DKIOCGETBLOCKSIZE                     _IOR('d', 24, uint32_t)
199 #define DKIOCGETBLOCKCOUNT                    _IOR('d', 25, uint64_t)
200 #define DKIOCGETFIRMWAREPATH                  _IOR('d', 28, dk_firmware_path_t)
201 
202 #define DKIOCISFORMATTED                      _IOR('d', 23, uint32_t)
203 #define DKIOCISWRITABLE                       _IOR('d', 29, uint32_t)
204 
205 #define DKIOCREQUESTIDLE                      _IO('d', 30)
206 #define DKIOCUNMAP                            _IOW('d', 31, dk_unmap_t)
207 #define DKIOCCORESTORAGE                      _IOR('d', 32, dk_corestorage_info_t)
208 
209 #define DKIOCGETLOCATION                      _IOR('d', 33, uint64_t)
210 
211 #define DKIOCGETMAXBLOCKCOUNTREAD             _IOR('d', 64, uint64_t)
212 #define DKIOCGETMAXBLOCKCOUNTWRITE            _IOR('d', 65, uint64_t)
213 #define DKIOCGETMAXBYTECOUNTREAD              _IOR('d', 70, uint64_t)
214 #define DKIOCGETMAXBYTECOUNTWRITE             _IOR('d', 71, uint64_t)
215 
216 #define DKIOCGETMAXSEGMENTCOUNTREAD           _IOR('d', 66, uint64_t)
217 #define DKIOCGETMAXSEGMENTCOUNTWRITE          _IOR('d', 67, uint64_t)
218 #define DKIOCGETMAXSEGMENTBYTECOUNTREAD       _IOR('d', 68, uint64_t)
219 #define DKIOCGETMAXSEGMENTBYTECOUNTWRITE      _IOR('d', 69, uint64_t)
220 
221 #define DKIOCGETMINSEGMENTALIGNMENTBYTECOUNT  _IOR('d', 74, uint64_t)
222 #define DKIOCGETMAXSEGMENTADDRESSABLEBITCOUNT _IOR('d', 75, uint64_t)
223 
224 #define DKIOCGETFEATURES                      _IOR('d', 76, uint32_t)
225 #define DKIOCGETPHYSICALBLOCKSIZE             _IOR('d', 77, uint32_t)
226 #define DKIOCGETCOMMANDPOOLSIZE               _IOR('d', 78, uint32_t)
227 
228 #define DKIOCGETPROVISIONSTATUS               _IOWR('d', 79, dk_provision_status_t)
229 
230 #define DKIOCGETERRORDESCRIPTION              _IOR('d', 80, dk_error_description_t)
231 
232 #define DKIOCSYNCHRONIZECACHE                 _IO('d', 22)
233 
234 #ifdef KERNEL
235 #define DK_FEATURE_FORCE_UNIT_ACCESS          0x00000001
236 
237 #define DK_ENCRYPTION_TYPE_AES_CBC            1
238 #define DK_ENCRYPTION_TYPE_AES_XEX            2
239 #define DK_ENCRYPTION_TYPE_AES_XTS            3
240 
241 #define DK_TIER_MASK                          0xC0
242 #define DK_TIER_SHIFT                         6
243 
244 #define DK_TIER_TO_PRIORITY(tier)             (((tier) << DK_TIER_SHIFT) | ~DK_TIER_MASK)
245 #define DK_PRIORITY_TO_TIER(priority)         ((priority) >> DK_TIER_SHIFT)
246 
247 typedef struct{
248 	uint64_t               offset;
249 	uint64_t               length;
250 
251 	uint8_t                reserved0128[12];   /* reserved, clear to zero */
252 
253 	dev_t                  dev;
254 } dk_physical_extent_t;
255 
256 typedef struct{
257 	dk_extent_t *          extents;
258 	uint32_t               extentsCount;
259 
260 	uint8_t                tier;
261 
262 #ifdef __LP64__
263 	uint8_t                reserved0104[3];    /* reserved, clear to zero */
264 #else /* !__LP64__ */
265 	uint8_t                reserved0072[7];    /* reserved, clear to zero */
266 #endif /* !__LP64__ */
267 } dk_set_tier_t;
268 
269 #define DKIOCSETBLOCKSIZE                     _IOW('d', 24, uint32_t)
270 #define DKIOCGETBSDUNIT                       _IOR('d', 27, uint32_t)
271 #define DKIOCISSOLIDSTATE                     _IOR('d', 79, uint32_t)
272 #define DKIOCISVIRTUAL                        _IOR('d', 72, uint32_t)
273 #define DKIOCGETBASE                          _IOR('d', 73, uint64_t)
274 #define DKIOCGETTHROTTLEMASK                  _IOR('d', 80, uint64_t)
275 #define DKIOCLOCKPHYSICALEXTENTS              _IO('d', 81)
276 #define DKIOCGETPHYSICALEXTENT                _IOWR('d', 82, dk_physical_extent_t)
277 #define DKIOCUNLOCKPHYSICALEXTENTS            _IO('d', 83)
278 #define DKIOCSETTIER                          _IOW('d', 85, dk_set_tier_t)
279 #define DKIOCGETENCRYPTIONTYPE                _IOR('d', 86, uint32_t)
280 #define DKIOCISLOWPOWERMODE                   _IOR('d', 87, uint32_t)
281 #define DKIOCGETIOMINSATURATIONBYTECOUNT      _IOR('d', 88, uint32_t)
282 
283 #ifdef XNU_KERNEL_PRIVATE
284 typedef struct{
285 	boolean_t mi_mdev; /* Is this a memdev device? */
286 	boolean_t mi_phys; /* Physical memory? */
287 	uint32_t mi_base; /* Base page number of the device? */
288 	uint64_t mi_size; /* Size of the device (in ) */
289 } dk_memdev_info_t;
290 
291 typedef dk_memdev_info_t memdev_info_t;
292 
293 #define DKIOCGETMEMDEVINFO                    _IOR('d', 90, dk_memdev_info_t)
294 #endif /* XNU_KERNEL_PRIVATE */
295 #ifdef PRIVATE
296 typedef struct _dk_cs_pin {
297 	dk_extent_t     cp_extent;
298 	int64_t         cp_flags;
299 } _dk_cs_pin_t;
300 /* The following are modifiers to _DKIOCCSPINEXTENT/cp_flags operation */
301 #define _DKIOCCSPINTOFASTMEDIA          (0)                     /* Pin extent to the fast (SSD) media             */
302 #define _DKIOCCSPINFORHIBERNATION       (1 << 0)        /* Pin of hibernation file, content not preserved */
303 #define _DKIOCCSPINDISCARDDENYLIST      (1 << 1)        /* Hibernation complete/error, stop denylist-ing  */
304 #define _DKIOCCSPINTOSLOWMEDIA          (1 << 2)        /* Pin extent to the slow (HDD) media             */
305 #define _DKIOCCSTEMPORARYPIN            (1 << 3)        /* Relocate, but do not pin, to indicated media   */
306 #define _DKIOCCSHIBERNATEIMGSIZE        (1 << 4)        /* Anticipate/Max size of the upcoming hibernate  */
307 #define _DKIOCCSPINFORSWAPFILE          (1 << 5)        /* Pin of swap file, content not preserved        */
308 
309 #define _DKIOCCSSETLVNAME                     _IOW('d', 198, char[256])
310 #define _DKIOCCSPINEXTENT                     _IOW('d', 199, _dk_cs_pin_t)
311 #define _DKIOCCSUNPINEXTENT                   _IOW('d', 200, _dk_cs_pin_t)
312 #define _DKIOCGETMIGRATIONUNITBYTESIZE        _IOR('d', 201, uint32_t)
313 
314 typedef struct _dk_cs_map {
315 	dk_extent_t     cm_extent;
316 	uint64_t        cm_bytes_mapped;
317 } _dk_cs_map_t;
318 
319 typedef struct _dk_cs_unmap {
320 	dk_extent_t                  *extents;
321 	uint32_t                     extentsCount;
322 	uint32_t                     options;
323 } _dk_cs_unmap_t;
324 
325 #define _DKIOCCSMAP                           _IOWR('d', 202, _dk_cs_map_t)
326 // No longer used: _DKIOCCSSETFSVNODE (203) & _DKIOCCSGETFREEBYTES (204)
327 #define _DKIOCCSUNMAP                         _IOWR('d', 205, _dk_cs_unmap_t)
328 
329 typedef enum {
330 	DK_APFS_ONE_DEVICE = 1,
331 	DK_APFS_FUSION
332 } dk_apfs_flavour_t;
333 
334 #define DKIOCGETAPFSFLAVOUR     _IOR('d', 91, dk_apfs_flavour_t)
335 
336 // Extent's offset and length returned in bytes
337 typedef struct dk_apfs_wbc_range {
338 	dev_t dev;              // Physical device for extents
339 	uint32_t count;         // Number of extents
340 	dk_extent_t extents[2]; // Addresses are relative to device we return
341 } dk_apfs_wbc_range_t;
342 
343 #define DKIOCAPFSGETWBCRANGE           _IOR('d', 92, dk_apfs_wbc_range_t)
344 #define DKIOCAPFSRELEASEWBCRANGE       _IO('d', 93)
345 
346 #define DKIOCGETMAXSWAPWRITE           _IOR('d', 94, uint64_t)
347 
348 #endif /* PRIVATE */
349 #endif /* KERNEL */
350 
351 #ifdef PRIVATE
352 #define _DKIOCSETSTATIC                       _IO('d', 84)
353 #endif /* PRIVATE */
354 
355 #endif  /* _SYS_DISK_H_ */
356