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