// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
// clang-format off
// DEFAULT ioctls accept and received byte[] data
// the particular ioctl may define more specific structures
#define IOCTL_KIND_DEFAULT 0x0
// GET_HANDLE ioctls accept plain data and return
// a single handle, optionally followed by plain data
#define IOCTL_KIND_GET_HANDLE 0x1
// GET_TWO_HANDLES ioctls accept plain data and return
// two handles, optionally followed by plain data
#define IOCTL_KIND_GET_TWO_HANDLES 0x2
// GET_THREE_HANDLES ioctls accept plain data and return
// three handles, optionally followed by plain data
#define IOCTL_KIND_GET_THREE_HANDLES 0x4
// SET_HANDLE ioctls accept a handle, and optionally
// plain data afterwards.
#define IOCTL_KIND_SET_HANDLE 0x3
// SET_TWO_HANDLES ioctls accepts two handles, and
// optionally plain data afterwards.
#define IOCTL_KIND_SET_TWO_HANDLES 0x5
// core device/vfs ioctl families
#define IOCTL_FAMILY_RESERVED 0x00
#define IOCTL_FAMILY_DEVICE 0x01
#define IOCTL_FAMILY_VFS 0x02
#define IOCTL_FAMILY_DMCTL 0x03
#define IOCTL_FAMILY_TEST 0x04
// device protocol families
#define IOCTL_FAMILY_CONSOLE 0x10
#define IOCTL_FAMILY_INPUT 0x11
// 0x12 unused
#define IOCTL_FAMILY_BLOCK 0x13
#define IOCTL_FAMILY_I2C 0x14
#define IOCTL_FAMILY_USB_DEVICE 0x16
#define IOCTL_FAMILY_HID 0x17
// 0x18 unused
#define IOCTL_FAMILY_AUDIO 0x19
#define IOCTL_FAMILY_MIDI 0x1A
#define IOCTL_FAMILY_KTRACE 0x1B
#define IOCTL_FAMILY_BT_HCI 0x1C
#define IOCTL_FAMILY_SYSINFO 0x1D
// 0x1E unused
#define IOCTL_FAMILY_RTC 0x1F // ioctls for RTC
#define IOCTL_FAMILY_ETH 0x20
#define IOCTL_FAMILY_INSNTRACE 0x21 // ioctls for instruction tracing
#define IOCTL_FAMILY_RAMDISK 0x22
#define IOCTL_FAMILY_SDMMC 0x23
#define IOCTL_FAMILY_WLAN 0x24
#define IOCTL_FAMILY_PTY 0x25
#define IOCTL_FAMILY_NETCONFIG 0x26
#define IOCTL_FAMILY_ETHERTAP 0x27
#define IOCTL_FAMILY_USB_PERIPHERAL 0x28
#define IOCTL_FAMILY_USB_VIRT_BUS 0x29
#define IOCTL_FAMILY_CPUPERF 0x2A
#define IOCTL_FAMILY_POWER 0x30
#define IOCTL_FAMILY_THERMAL 0x31
#define IOCTL_FAMILY_CAMERA 0x32
#define IOCTL_FAMILY_BT_HOST 0x33
#define IOCTL_FAMILY_WLANPHY 0x34
#define IOCTL_FAMILY_SERIAL 0x35
#define IOCTL_FAMILY_WLANTAP 0x36
#define IOCTL_FAMILY_DISPLAY_CONTROLLER 0x37
#define IOCTL_FAMILY_DEBUG 0x38
#define IOCTL_FAMILY_AUDIO_CODEC 0x39
#define IOCTL_FAMILY_BACKLIGHT 0x3A
#define IOCTL_FAMILY_NAND_TEST 0x3B
#define IOCTL_FAMILY_TEE 0x3C
#define IOCTL_FAMILY_SKIP_BLOCK 0x3D
#define IOCTL_FAMILY_USB_TEST 0x3E
#define IOCTL_FAMILY_CLK 0x3F
// 0x40 unused.
#define IOCTL_FAMILY_QMI 0x41
// IOCTL constructor
// --K-FFNN
#define IOCTL(kind, family, number) \
((((kind) & 0xF) << 20) | (((family) & 0xFF) << 8) | ((number) & 0xFF))
// IOCTL accessors
#define IOCTL_KIND(n) (((n) >> 20) & 0xF)
#define IOCTL_FAMILY(n) (((n) >> 8) & 0xFF)
#define IOCTL_NUMBER(n) ((n) & 0xFF)