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