1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2019, Arm Limited. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #ifndef DEV_H 8*54fd6939SJiyong Park #define DEV_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <cdefs.h> 11*54fd6939SJiyong Park #include <lib/debugfs.h> 12*54fd6939SJiyong Park #include <stddef.h> 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park /* FIXME: need configurability */ 15*54fd6939SJiyong Park #define NR_CHANS 10 16*54fd6939SJiyong Park #define NR_CONSS 1 17*54fd6939SJiyong Park #define NR_BINDS 4 18*54fd6939SJiyong Park #define NR_FILES 18 19*54fd6939SJiyong Park 20*54fd6939SJiyong Park #define NODEV 255 21*54fd6939SJiyong Park #define CHDIR (1 << 15) 22*54fd6939SJiyong Park 23*54fd6939SJiyong Park #define SYNCDEV 0 24*54fd6939SJiyong Park #define SYNCALL 1 25*54fd6939SJiyong Park 26*54fd6939SJiyong Park typedef struct dev dev_t; 27*54fd6939SJiyong Park typedef struct chan chan_t; 28*54fd6939SJiyong Park typedef struct dirtab dirtab_t; 29*54fd6939SJiyong Park typedef int devgen_t(chan_t *, const dirtab_t *, int, int, dir_t *); 30*54fd6939SJiyong Park typedef struct attr attr_t; 31*54fd6939SJiyong Park 32*54fd6939SJiyong Park enum { 33*54fd6939SJiyong Park DEV_ROOT_QROOT, 34*54fd6939SJiyong Park DEV_ROOT_QDEV, 35*54fd6939SJiyong Park DEV_ROOT_QFIP, 36*54fd6939SJiyong Park DEV_ROOT_QBLOBS, 37*54fd6939SJiyong Park DEV_ROOT_QBLOBCTL, 38*54fd6939SJiyong Park DEV_ROOT_QPSCI 39*54fd6939SJiyong Park }; 40*54fd6939SJiyong Park 41*54fd6939SJiyong Park /******************************************************************************* 42*54fd6939SJiyong Park * This structure contains the necessary information to represent a directory 43*54fd6939SJiyong Park * of the filesystem. 44*54fd6939SJiyong Park ******************************************************************************/ 45*54fd6939SJiyong Park struct dirtab { 46*54fd6939SJiyong Park char name[NAMELEN]; 47*54fd6939SJiyong Park qid_t qid; 48*54fd6939SJiyong Park long length; 49*54fd6939SJiyong Park unsigned char perm; 50*54fd6939SJiyong Park void *data; 51*54fd6939SJiyong Park }; 52*54fd6939SJiyong Park 53*54fd6939SJiyong Park /******************************************************************************* 54*54fd6939SJiyong Park * This structure defines the interface of device drivers. 55*54fd6939SJiyong Park * Each driver must implement a subset of those functions. 56*54fd6939SJiyong Park * It is possible to redirect to default implementations defined in dev.c. 57*54fd6939SJiyong Park ******************************************************************************/ 58*54fd6939SJiyong Park /* FIXME: comments for the callbacks */ 59*54fd6939SJiyong Park struct dev { 60*54fd6939SJiyong Park char id; 61*54fd6939SJiyong Park int (*stat)(chan_t *c, const char *file, dir_t *dir); 62*54fd6939SJiyong Park int (*walk)(chan_t *c, const char *name); 63*54fd6939SJiyong Park int (*read)(chan_t *c, void *buf, int n); 64*54fd6939SJiyong Park int (*write)(chan_t *c, void *buf, int n); 65*54fd6939SJiyong Park int (*seek)(chan_t *c, long off, int whence); 66*54fd6939SJiyong Park chan_t *(*clone)(chan_t *c, chan_t *nc); 67*54fd6939SJiyong Park chan_t *(*attach)(int id, int dev); 68*54fd6939SJiyong Park chan_t *(*mount)(chan_t *c, const char *spec); 69*54fd6939SJiyong Park }; 70*54fd6939SJiyong Park 71*54fd6939SJiyong Park /******************************************************************************* 72*54fd6939SJiyong Park * This structure defines the channel structure. 73*54fd6939SJiyong Park * A channel is a handle on an element of the filesystem. 74*54fd6939SJiyong Park ******************************************************************************/ 75*54fd6939SJiyong Park struct chan { 76*54fd6939SJiyong Park long offset; 77*54fd6939SJiyong Park qid_t qid; 78*54fd6939SJiyong Park unsigned char index; /* device index in devtab */ 79*54fd6939SJiyong Park unsigned char dev; 80*54fd6939SJiyong Park unsigned char mode; 81*54fd6939SJiyong Park }; 82*54fd6939SJiyong Park 83*54fd6939SJiyong Park /******************************************************************************* 84*54fd6939SJiyong Park * This structure defines an abstract argument passed to physical drivers from 85*54fd6939SJiyong Park * the configuration file. 86*54fd6939SJiyong Park ******************************************************************************/ 87*54fd6939SJiyong Park struct attr { 88*54fd6939SJiyong Park char *key; 89*54fd6939SJiyong Park char *value; 90*54fd6939SJiyong Park }; 91*54fd6939SJiyong Park 92*54fd6939SJiyong Park chan_t *path_to_channel(const char *path, int mode); 93*54fd6939SJiyong Park chan_t *clone(chan_t *c, chan_t *nc); 94*54fd6939SJiyong Park chan_t *attach(int id, int dev); 95*54fd6939SJiyong Park void channel_close(chan_t *c); 96*54fd6939SJiyong Park int buf_to_channel(chan_t *c, void *dst, void *src, int nbytes, long len); 97*54fd6939SJiyong Park int dirread(chan_t *c, dir_t *dir, const dirtab_t *tab, 98*54fd6939SJiyong Park int ntab, devgen_t *gen); 99*54fd6939SJiyong Park void make_dir_entry(chan_t *c, dir_t *dir, const char *name, long length, 100*54fd6939SJiyong Park qid_t qid, unsigned int mode); 101*54fd6939SJiyong Park void devlink(void); 102*54fd6939SJiyong Park 103*54fd6939SJiyong Park chan_t *devattach(int id, int dev); 104*54fd6939SJiyong Park int devseek(chan_t *c, long off, int whence); 105*54fd6939SJiyong Park chan_t *devclone(chan_t *c, chan_t *nc); 106*54fd6939SJiyong Park int devgen(chan_t *c, const dirtab_t *tab, int ntab, int n, dir_t *dir); 107*54fd6939SJiyong Park int devwalk(chan_t *c, const char *name, const dirtab_t *tab, int ntab, 108*54fd6939SJiyong Park devgen_t *gen); 109*54fd6939SJiyong Park int devstat(chan_t *dirc, const char *file, dir_t *dir, 110*54fd6939SJiyong Park const dirtab_t *tab, int ntab, devgen_t *gen); 111*54fd6939SJiyong Park 112*54fd6939SJiyong Park chan_t *deverrmount(chan_t *c, const char *spec); 113*54fd6939SJiyong Park int deverrwrite(chan_t *c, void *buf, int n); 114*54fd6939SJiyong Park int deverrseek(chan_t *c, long off, int whence); 115*54fd6939SJiyong Park 116*54fd6939SJiyong Park extern dev_t *const devtab[]; 117*54fd6939SJiyong Park 118*54fd6939SJiyong Park void __dead2 devpanic(const char *cause); 119*54fd6939SJiyong Park 120*54fd6939SJiyong Park #endif /* DEV_H */ 121