// SPDX-License-Identifier: GPL-2.0-or-later #pragma once // Block devices that are found rather than assumed. // // The first four device numbers are fixed and always were: IDE 0 and 1, the // ramdisk, the first USB stick. Everything since -- a SATA disk behind AHCI, // an NVMe namespace, and every partition on any of them -- registers here at // probe time and is handed the next free number from BLKDEV_FIRST. // // A partition is a block device in its own right, with block 0 at its first // sector. That is the whole of partition support from a filesystem's side: // SchFS on /dev/sata0p2 sees a volume that starts at zero, exactly as it would // on a whole disk, and needs to know nothing about GPT -- which is also what // a Linux driver for SchFS will see when it is handed /dev/sda2. #define BLKDEV_FIRST 4 #define NBLKDEV 16 // so device numbers stay below SCHFS_DEV (64) // The GPT partition type of a SchFS volume, as it is written and printed: // 47138FA9-B79C-47A6-9F7D-AC1F7F572D5E. sgdisk and fdisk accept it as is. // Generated for SchFS on 2026-10-22; nothing else uses it. #define SCHFS_GPT_TYPE "47138FA9-B79C-47A6-9F7D-AC1F7F572D5E" // What a driver supplies. `rw` moves `count` of the device's own sectors at // `lba` to or from `buf`, a kernel address; it is never asked for more than // BSIZE bytes at once. Returns 0, or -1 if the device refused. struct blkdev_ops { int (*rw)(void *priv, uint64 lba, uint32 count, void *buf, int write); int (*flush)(void *priv); // 0 when there is nothing to flush }; // Register a whole disk. Its partition table, if it has one, is read here and // every partition registered after it. Returns the disk's device number, or // -1 if the table is full. int blkdev_register(const char *name, const struct blkdev_ops *ops, void *priv, uint64 nsectors, uint32 secsize); int blkdev_present(uint dev); void blkdev_rw(struct buf *b); int blkdev_flush(uint dev); // For the root probe: the registered devices in order, partitions after the // disk they are on. Returns the device number of the i'th, or -1 past the end. int blkdev_nth(int i); const char *blkdev_name(uint dev); int blkdev_is_schfs(uint dev); // a partition typed SCHFS_GPT_TYPE int blkdev_info(char *buf, int cap); // /proc/partitions