Home | History | Annotate | Line # | Download | only in dist
media.h revision 1.2
      1  1.1  christos /*
      2  1.1  christos  * media.h -
      3  1.1  christos  *
      4  1.1  christos  * Written by Eryk Vershen
      5  1.1  christos  */
      6  1.1  christos 
      7  1.1  christos /*
      8  1.1  christos  * Copyright 1997,1998 by Apple Computer, Inc.
      9  1.1  christos  *              All Rights Reserved
     10  1.1  christos  *
     11  1.1  christos  * Permission to use, copy, modify, and distribute this software and
     12  1.1  christos  * its documentation for any purpose and without fee is hereby granted,
     13  1.1  christos  * provided that the above copyright notice appears in all copies and
     14  1.1  christos  * that both the copyright notice and this permission notice appear in
     15  1.1  christos  * supporting documentation.
     16  1.1  christos  *
     17  1.1  christos  * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
     18  1.1  christos  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     19  1.1  christos  * FOR A PARTICULAR PURPOSE.
     20  1.1  christos  *
     21  1.1  christos  * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
     22  1.1  christos  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
     23  1.1  christos  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
     24  1.1  christos  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
     25  1.1  christos  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     26  1.1  christos  */
     27  1.1  christos 
     28  1.1  christos #ifndef __media__
     29  1.1  christos #define __media__
     30  1.1  christos 
     31  1.1  christos 
     32  1.1  christos /*
     33  1.1  christos  * Media is an abstraction of a disk device.
     34  1.1  christos  *
     35  1.1  christos  * A media object has the following visible attributes:
     36  1.1  christos  *
     37  1.1  christos  *      a granularity       (e.g. 512, 1024, 1, etc.)
     38  1.1  christos  *      a total size in bytes
     39  1.1  christos  *
     40  1.1  christos  *  And the following operations are available:
     41  1.1  christos  *
     42  1.1  christos  *      open
     43  1.1  christos  *      read @ byte offset for size in bytes
     44  1.1  christos  *      write @ byte offset for size in bytes
     45  1.1  christos  *      close
     46  1.1  christos  *
     47  1.1  christos  * XXX Should really split public media interface from "protected" interface.
     48  1.1  christos  */
     49  1.1  christos 
     50  1.1  christos 
     51  1.1  christos /*
     52  1.1  christos  * Defines
     53  1.1  christos  */
     54  1.1  christos 
     55  1.1  christos 
     56  1.1  christos /*
     57  1.1  christos  * Types
     58  1.1  christos  */
     59  1.1  christos /* those whose use media objects need just the pointer type */
     60  1.1  christos typedef struct media *MEDIA;
     61  1.1  christos 
     62  1.1  christos /* those who define media objects need the struct and internal routine types */
     63  1.2  christos typedef long (*media_read)(MEDIA m, long long offset, uint32_t count, void *address);
     64  1.2  christos typedef long (*media_write)(MEDIA m, long long offset, uint32_t count, void *address);
     65  1.1  christos typedef long (*media_close)(MEDIA m);
     66  1.1  christos typedef long (*media_os_reload)(MEDIA m);
     67  1.1  christos 
     68  1.1  christos struct media {
     69  1.1  christos     long            kind;           /* kind of media - SCSI, IDE, etc. */
     70  1.2  christos     uint32_t   grain;          /* granularity (offset & size) */
     71  1.1  christos     long long       size_in_bytes;  /* offset granularity */
     72  1.1  christos     media_read      do_read;        /* device specific routines */
     73  1.1  christos     media_write     do_write;
     74  1.1  christos     media_close     do_close;
     75  1.1  christos     media_os_reload do_os_reload;
     76  1.1  christos 				    /* specific media kinds will add extra info */
     77  1.1  christos };
     78  1.1  christos 
     79  1.1  christos /* those whose use media object iterators need just the pointer type */
     80  1.1  christos typedef struct media_iterator *MEDIA_ITERATOR;
     81  1.1  christos 
     82  1.1  christos /* those who define media object iterators need the struct and internal routine types */
     83  1.1  christos typedef void (*media_iterator_reset)(MEDIA_ITERATOR m);
     84  1.1  christos typedef char* (*media_iterator_step)(MEDIA_ITERATOR m);
     85  1.1  christos typedef void (*media_iterator_delete)(MEDIA_ITERATOR m);
     86  1.1  christos 
     87  1.1  christos typedef enum {
     88  1.1  christos     kInit,
     89  1.1  christos     kReset,
     90  1.1  christos     kIterating,
     91  1.1  christos     kEnd
     92  1.1  christos } media_iterator_state;
     93  1.1  christos 
     94  1.1  christos struct media_iterator {
     95  1.1  christos     long                    kind;           /* kind of media - SCSI, IDE, etc. */
     96  1.1  christos     media_iterator_state    state;          /* init, reset, iterating, at_end */
     97  1.1  christos     media_iterator_reset    do_reset;       /* device specific routines */
     98  1.1  christos     media_iterator_step     do_step;
     99  1.1  christos     media_iterator_delete   do_delete;
    100  1.1  christos 					    /* specific media kinds will add extra info */
    101  1.1  christos };
    102  1.1  christos 
    103  1.1  christos 
    104  1.1  christos /*
    105  1.1  christos  * Global Constants
    106  1.1  christos  */
    107  1.1  christos 
    108  1.1  christos 
    109  1.1  christos /*
    110  1.1  christos  * Global Variables
    111  1.1  christos  */
    112  1.1  christos 
    113  1.1  christos 
    114  1.1  christos /*
    115  1.1  christos  * Forward declarations
    116  1.1  christos  */
    117  1.1  christos /* those whose use media objects need these routines */
    118  1.2  christos uint32_t media_granularity(MEDIA m);
    119  1.1  christos long long media_total_size(MEDIA m);
    120  1.2  christos long read_media(MEDIA m, long long offset, uint32_t count, void *address);
    121  1.2  christos long write_media(MEDIA m, long long offset, uint32_t count, void *address);
    122  1.1  christos void close_media(MEDIA m);
    123  1.1  christos void os_reload_media(MEDIA m);
    124  1.1  christos 
    125  1.1  christos /* those who define media objects need these routines also */
    126  1.1  christos long allocate_media_kind(void);
    127  1.1  christos MEDIA new_media(long size);
    128  1.1  christos void delete_media(MEDIA m);
    129  1.1  christos 
    130  1.1  christos /* those whose use media object iterators need these routines */
    131  1.1  christos void reset_media_iterator(MEDIA_ITERATOR m);
    132  1.1  christos char *step_media_iterator(MEDIA_ITERATOR m);
    133  1.1  christos void delete_media_iterator(MEDIA_ITERATOR m);
    134  1.1  christos 
    135  1.1  christos /* those who define media object iterators need these routines also */
    136  1.1  christos MEDIA_ITERATOR new_media_iterator(long size);
    137  1.1  christos void private_delete_media_iterator(MEDIA_ITERATOR m);
    138  1.1  christos 
    139  1.1  christos #endif /* __media__ */
    140