// SPDX-License-Identifier: GPL-2.0-or-later // // The devices the kernel implements itself, as /sys and udev see them. // // /dev holds them already (kernel/fs/devfs.c). This is the other half of what // udev needs: for each node a place in /sys/devices, the class and dev/ links // that lead back to it, the facts udev's rules read (MAJOR, MINOR, DEVNAME, // input capabilities), and a way to announce it on the uevent netlink socket. #pragma once #include "core/types.h" #define KDEV_NAME 24 #define KDEV_DEVNAME 32 #define KDEV_BLK0 256 // kdev indexes from here are block devices enum { KD_NONE, KD_KEYBOARD, KD_MOUSE }; struct kdev { char subsys[16]; // class: input, mem, tty, graphics, block char name[KDEV_NAME]; // directory name under the parent char devname[KDEV_DEVNAME]; // path below /dev, "" for a device with no node short major, minor; int block; int parent; // kdev index of the device it hangs off, or -1 int cap; // KD_*: what an input device can do }; int kdev_nsubsys(void); const char *kdev_subsys(int s); // Index of the Nth device that exists, 0.. until -1. int kdev_nth(int n); int kdev_get(int i, struct kdev *k); // The numbers stat() shows for its node, which are what /sys must show too. void kdev_numbers(const struct kdev *k, int *maj, int *min); // "devices/virtual/input/input0/event0": where it lives below /sys. int kdev_path(int i, char *buf, int cap); // Announce a device on the uevent socket: action is "add", "remove", "change". void kdev_uevent(int i, const char *action); // What reading a device's `uevent` file says. int kdev_uevent_text(int i, char *buf, int cap);