1 // Copyright 2017 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #pragma once 6 7 #include <limits.h> 8 #include <zircon/boot/image.h> 9 #include <zircon/device/ioctl.h> 10 #include <zircon/device/ioctl-wrapper.h> 11 #include <zircon/types.h> 12 13 #define IOCTL_RAMDISK_CONFIG \ 14 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 1) 15 #define IOCTL_RAMDISK_CONFIG_VMO \ 16 IOCTL(IOCTL_KIND_SET_HANDLE, IOCTL_FAMILY_RAMDISK, 4) 17 #define IOCTL_RAMDISK_UNLINK \ 18 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 2) 19 #define IOCTL_RAMDISK_SET_FLAGS \ 20 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 3) 21 #define IOCTL_RAMDISK_WAKE_UP \ 22 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 4) 23 #define IOCTL_RAMDISK_SLEEP_AFTER \ 24 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 5) 25 #define IOCTL_RAMDISK_GET_BLK_COUNTS \ 26 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 6) 27 28 // Ramdisk-specific flags 29 #define RAMDISK_FLAG_RESUME_ON_WAKE 0xFF000001 30 31 typedef struct ramdisk_ioctl_config { 32 uint64_t blk_size; 33 uint64_t blk_count; 34 uint8_t type_guid[ZBI_PARTITION_GUID_LEN]; 35 } ramdisk_ioctl_config_t; 36 37 typedef struct ramdisk_ioctl_config_response { 38 char name[NAME_MAX + 1]; 39 } ramdisk_ioctl_config_response_t; 40 41 typedef struct ramdisk_blk_counts { 42 uint64_t received; 43 uint64_t successful; 44 uint64_t failed; 45 } ramdisk_blk_counts_t; 46 47 // ssize_t ioctl_ramdisk_config(int fd, const ramdisk_ioctl_config_t* in, 48 // ramdisk_ioctl_config_response_t* out); 49 IOCTL_WRAPPER_INOUT(ioctl_ramdisk_config, IOCTL_RAMDISK_CONFIG, ramdisk_ioctl_config_t, 50 ramdisk_ioctl_config_response_t); 51 52 // ssize_t ioctl_ramdisk_config_vmo(int fd, const zx_handle_t* in, 53 // ramdisk_ioctl_config_response_t* out); 54 IOCTL_WRAPPER_INOUT(ioctl_ramdisk_config_vmo, IOCTL_RAMDISK_CONFIG_VMO, 55 zx_handle_t, ramdisk_ioctl_config_response_t); 56 57 // ssize_t ioctl_ramdisk_unlink(int fd); 58 IOCTL_WRAPPER(ioctl_ramdisk_unlink, IOCTL_RAMDISK_UNLINK); 59 60 // ssize_t ioctl_ramdisk_set_flags(int fd, uint32_t* in); 61 // The flags to set match block_info_t.flags. This is intended to simulate the behavior 62 // of other block devices, so it should be used only for tests. 63 IOCTL_WRAPPER_IN(ioctl_ramdisk_set_flags, IOCTL_RAMDISK_SET_FLAGS, uint32_t); 64 65 // ssize_t ioctl_ramdisk_wake_up(int fd); 66 // "Wakes" the ramdisk, if it was sleeping. 67 // Transactions are no longer expected to fail after this point, and the ramdisk will not sleep 68 // again until the next call to SLEEP_AFTER. 69 // This will reset the current transaction count. 70 IOCTL_WRAPPER(ioctl_ramdisk_wake_up, IOCTL_RAMDISK_WAKE_UP); 71 72 // ssize_t ioctl_ramdisk_sleep_after(int fd, uint64_t* in); 73 // Tell the ramdisk to "sleep" after |in| blocks have been written successfully. 74 // After this point, all incoming transactions will fail. 75 // This will reset the current block count. 76 // NOTE! Use caution with RAMDISK_FLAG_RESUME_ON_WAKE set; sleeping with this flags will cause I/O 77 // to block indefinitely until another call invokes |ioctl_ramdisk_wake_up|. 78 IOCTL_WRAPPER_IN(ioctl_ramdisk_sleep_after, IOCTL_RAMDISK_SLEEP_AFTER, uint64_t); 79 80 // ssize_t ioctl_ramdisk_get_blk_counts(int fd, ramdisk_blk_counts_t* out); 81 // Retrieve the number of received, successful, and failed block writes since the last call to 82 // sleep/wake. 83 IOCTL_WRAPPER_OUT(ioctl_ramdisk_get_blk_counts, IOCTL_RAMDISK_GET_BLK_COUNTS, ramdisk_blk_counts_t); 84