From e51bd967cda1989d606b5b6178ed6d2c8d151707 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 28 Feb 2002 20:39:54 +0000 Subject: 2002-02-28 Joel Sherrill * Submitted by Victor V. Vengerov and merged into the RTEMS source. * ChangeLog, Makefile.am, README, configure.ac, include/Makefile.am, include/rtems/bdbuf.h, include/rtems/blkdev.h, include/rtems/diskdevs.h, include/rtems/ramdisk.h, include/rtems/.cvsignore, include/.cvsignore, src/Makefile.am, src/bdbuf.c, src/blkdev.c, src/diskdevs.c, src/ramdisk.c, src/.cvsignore, .cvsignore: New files. --- cpukit/libblock/include/rtems/diskdevs.h | 206 +++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 cpukit/libblock/include/rtems/diskdevs.h (limited to 'cpukit/libblock/include/rtems/diskdevs.h') diff --git a/cpukit/libblock/include/rtems/diskdevs.h b/cpukit/libblock/include/rtems/diskdevs.h new file mode 100644 index 0000000000..fab3231e62 --- /dev/null +++ b/cpukit/libblock/include/rtems/diskdevs.h @@ -0,0 +1,206 @@ +/* + * logdisk.h - Physical and logical block devices (disks) support + * + * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia + * Author: Victor V. Vengerov + * + * @(#) $Id$ + */ + +#ifndef __RTEMS_LIBBLOCK_LOGDISK_H__ +#define __RTEMS_LIBBLOCK_LOGDISK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#include "rtems/blkdev.h" + +/* Buffer pool identifier */ +typedef int rtems_bdpool_id; + +/* Block device ioctl handler */ +typedef int (* block_device_ioctl) (dev_t dev, int req, void *argp); + +/* disk_device: Entry of this type created for every disk device (both for + * logical and physical disks). + * Array of arrays of pointers to disk_device structures maintained. First + * table indexed by major number and second table indexed by minor number. + * Such data organization allow quick lookup using data structure of + * moderated size. + */ +typedef struct disk_device { + dev_t dev; /* Device ID (major + minor) */ + struct disk_device *phys_dev; /* Physical device ID (the same + as dev if this entry specifies + the physical device) */ + char *name; /* Disk device name */ + int uses; /* Use counter. Device couldn't be + removed if it is in use. */ + int start; /* Starting block number (0 for + physical devices, block offset + on the related physical device + for logical device) */ + int size; /* Size of physical or logical disk + in disk blocks */ + int block_size; /* Size of device block (minimum + transfer unit) in bytes + (must be power of 2) */ + int block_size_log2; /* log2 of block_size */ + rtems_bdpool_id pool; /* Buffer pool assigned to this + device */ + block_device_ioctl ioctl; /* ioctl handler for this block + device */ +} disk_device; + +/* rtems_disk_create_phys -- + * Create physical disk entry. This function usually invoked from + * block device driver initialization code when physical device + * detected in the system. Device driver should provide ioctl handler + * to allow block device access operations. This primitive will register + * device in rtems (invoke rtems_io_register_name). + * + * PARAMETERS: + * dev - device identifier (major, minor numbers) + * block_size - size of disk block (minimum data transfer unit); must be + * power of 2 + * disk_size - number of blocks on device + * handler - IOCTL handler (function providing basic block input/output + * request handling BIOREQUEST and other device management + * operations) + * name - character name of device (e.g. /dev/hda) + * + * RETURNS: + * RTEMS_SUCCESSFUL if information about new physical disk added, or + * error code if error occured (device already registered, wrong block + * size value, no memory available). + */ +rtems_status_code +rtems_disk_create_phys(dev_t dev, int block_size, int disk_size, + block_device_ioctl handler, + char *name); + +/* rtems_disk_create_log -- + * Create logical disk entry. Logical disk is contiguous area on physical + * disk. Disk may be splitted to several logical disks in several ways: + * manually or using information stored in blocks on physical disk + * (DOS-like partition table, BSD disk label, etc). This function usually + * invoked from application when application-specific splitting are in use, + * or from generic code which handle different logical disk organizations. + * This primitive will register device in rtems (invoke + * rtems_io_register_name). + * + * PARAMETERS: + * dev - logical device identifier (major, minor numbers) + * phys - physical device (block device which holds this logical disk) + * identifier + * start - starting block number on the physical device + * size - logical disk size in blocks + * name - logical disk name + * + * RETURNS: + * RTEMS_SUCCESSFUL if logical device successfully added, or error code + * if error occured (device already registered, no physical device + * exists, logical disk is out of physical disk boundaries, no memory + * available). + */ +rtems_status_code +rtems_disk_create_log(dev_t dev, dev_t phys, int start, int size, char *name); + +/* rtems_disk_delete -- + * Delete physical or logical disk device. Device may be deleted if its + * use counter (and use counters of all logical devices - if it is + * physical device) equal to 0. When physical device deleted, + * all logical devices deleted inherently. Appropriate devices removed + * from "/dev" filesystem. + * + * PARAMETERS: + * dev - device identifier (major, minor numbers) + * + * RETURNS: + * RTEMS_SUCCESSFUL if block device successfully deleted, or error code + * if error occured (device is not defined, device is in use). + */ +rtems_status_code +rtems_disk_delete(dev_t dev); + +/* rtems_disk_lookup -- + * Find block device descriptor by its device identifier. This function + * increment usage counter to 1. User should release disk_device structure + * by invoking rtems_disk_release primitive. + * + * PARAMETERS: + * dev - device identifier (major, minor numbers) + * + * RETURNS: + * pointer to the block device descriptor, or NULL if no such device + * exists. + */ +disk_device * +rtems_disk_lookup(dev_t dev); + +/* rtems_disk_release -- + * Release disk_device structure (decrement usage counter to 1). + * + * PARAMETERS: + * dd - pointer to disk device structure + * + * RETURNS: + * RTEMS_SUCCESSFUL + * + * NOTE: + * It should be implemented as inline function. + */ +rtems_status_code +rtems_disk_release(disk_device *dd); + +/* rtems_disk_next -- + * Disk device enumerator. Looking for device having device number larger + * than dev and return disk device descriptor for it. If there are no + * such device, NULL value returned. + * + * PARAMETERS: + * dev - device number (use -1 to start search) + * + * RETURNS: + * Pointer to the disk descriptor for next disk device, or NULL if all + * devices enumerated. */ +disk_device * +rtems_disk_next(dev_t dev); + +/* rtems_diskio_initialize -- + * Initialization of disk device library (initialize all data structures, + * etc.) + * + * PARAMETERS: + * none + * + * RETURNS: + * RTEMS_SUCCESSFUL if library initialized, or error code if error + * occured. + */ +rtems_status_code +rtems_disk_io_initialize(void); + +/* rtems_diskio_done -- + * Release all resources allocated for disk device interface. + * + * PARAMETERS: + * none + * + * RETURNS: + * RTEMS_SUCCESSFUL if all resources released, or error code if error + * occured. + */ +rtems_status_code +rtems_disk_io_done(void); + +#ifdef __cplusplus +} +#endif + +#endif -- cgit v1.2.3