xref: /aosp_15_r20/external/arm-trusted-firmware/lib/debugfs/dev.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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