123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*
- * Copyright (c) 2019, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #ifndef DEV_H
- #define DEV_H
- #include <cdefs.h>
- #include <lib/debugfs.h>
- #include <stddef.h>
- /* FIXME: need configurability */
- #define NR_CHANS 10
- #define NR_CONSS 1
- #define NR_BINDS 4
- #define NR_FILES 18
- #define NODEV 255
- #define CHDIR (1 << 15)
- #define SYNCDEV 0
- #define SYNCALL 1
- typedef struct dev dev_t;
- typedef struct chan chan_t;
- typedef struct dirtab dirtab_t;
- typedef int devgen_t(chan_t *, const dirtab_t *, int, int, dir_t *);
- typedef struct attr attr_t;
- enum {
- DEV_ROOT_QROOT,
- DEV_ROOT_QDEV,
- DEV_ROOT_QFIP,
- DEV_ROOT_QBLOBS,
- DEV_ROOT_QBLOBCTL,
- DEV_ROOT_QPSCI
- };
- /*******************************************************************************
- * This structure contains the necessary information to represent a directory
- * of the filesystem.
- ******************************************************************************/
- struct dirtab {
- char name[NAMELEN];
- qid_t qid;
- long length;
- unsigned char perm;
- void *data;
- };
- /*******************************************************************************
- * This structure defines the interface of device drivers.
- * Each driver must implement a subset of those functions.
- * It is possible to redirect to default implementations defined in dev.c.
- ******************************************************************************/
- /* FIXME: comments for the callbacks */
- struct dev {
- char id;
- int (*stat)(chan_t *c, const char *file, dir_t *dir);
- int (*walk)(chan_t *c, const char *name);
- int (*read)(chan_t *c, void *buf, int n);
- int (*write)(chan_t *c, void *buf, int n);
- int (*seek)(chan_t *c, long off, int whence);
- chan_t *(*clone)(chan_t *c, chan_t *nc);
- chan_t *(*attach)(int id, int dev);
- chan_t *(*mount)(chan_t *c, const char *spec);
- };
- /*******************************************************************************
- * This structure defines the channel structure.
- * A channel is a handle on an element of the filesystem.
- ******************************************************************************/
- struct chan {
- long offset;
- qid_t qid;
- unsigned char index; /* device index in devtab */
- unsigned char dev;
- unsigned char mode;
- };
- /*******************************************************************************
- * This structure defines an abstract argument passed to physical drivers from
- * the configuration file.
- ******************************************************************************/
- struct attr {
- char *key;
- char *value;
- };
- chan_t *path_to_channel(const char *path, int mode);
- chan_t *clone(chan_t *c, chan_t *nc);
- chan_t *attach(int id, int dev);
- void channel_close(chan_t *c);
- int buf_to_channel(chan_t *c, void *dst, void *src, int nbytes, long len);
- int dirread(chan_t *c, dir_t *dir, const dirtab_t *tab,
- int ntab, devgen_t *gen);
- void make_dir_entry(chan_t *c, dir_t *dir, const char *name, long length,
- qid_t qid, unsigned int mode);
- void devlink(void);
- chan_t *devattach(int id, int dev);
- int devseek(chan_t *c, long off, int whence);
- chan_t *devclone(chan_t *c, chan_t *nc);
- int devgen(chan_t *c, const dirtab_t *tab, int ntab, int n, dir_t *dir);
- int devwalk(chan_t *c, const char *name, const dirtab_t *tab, int ntab,
- devgen_t *gen);
- int devstat(chan_t *dirc, const char *file, dir_t *dir,
- const dirtab_t *tab, int ntab, devgen_t *gen);
- chan_t *deverrmount(chan_t *c, const char *spec);
- int deverrwrite(chan_t *c, void *buf, int n);
- int deverrseek(chan_t *c, long off, int whence);
- extern dev_t *const devtab[];
- void __dead2 devpanic(const char *cause);
- #endif /* DEV_H */
|