1 /*
2  * Copyright (c) 2019, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef DEBUGFS_H
8 #define DEBUGFS_H
9 
10 #define NAMELEN   13 /* Maximum length of a file name */
11 #define PATHLEN   41 /* Maximum length of a path */
12 #define STATLEN   41 /* Size of static part of dir format */
13 #define ROOTLEN   (2 + 4) /* Size needed to encode root string */
14 #define FILNAMLEN (2 + NAMELEN) /* Size needed to encode filename */
15 #define DIRLEN    (STATLEN + FILNAMLEN + 3*ROOTLEN) /* Size of dir entry */
16 
17 #define KSEEK_SET 0
18 #define KSEEK_CUR 1
19 #define KSEEK_END 2
20 
21 #define NELEM(tab) (sizeof(tab) / sizeof((tab)[0]))
22 
23 typedef unsigned short qid_t; /* FIXME: short type not recommended? */
24 
25 /*******************************************************************************
26  * This structure contains the necessary information to represent a 9p
27  * directory.
28  ******************************************************************************/
29 typedef struct {
30 	char		name[NAMELEN];
31 	long		length;
32 	unsigned char	mode;
33 	unsigned char	index;
34 	unsigned char	dev;
35 	qid_t		qid;
36 } dir_t;
37 
38 /* Permission definitions used as flags */
39 #define O_READ		(1 << 0)
40 #define O_WRITE		(1 << 1)
41 #define O_RDWR		(1 << 2)
42 #define O_BIND		(1 << 3)
43 #define O_DIR		(1 << 4)
44 #define O_STAT		(1 << 5)
45 
46 /* 9p interface */
47 int mount(const char *srv, const char *mnt, const char *spec);
48 int create(const char *name, int flags);
49 int open(const char *name, int flags);
50 int close(int fd);
51 int read(int fd, void *buf, int n);
52 int write(int fd, void *buf, int n);
53 int seek(int fd, long off, int whence);
54 int bind(const char *path, const char *where);
55 int stat(const char *path, dir_t *dir);
56 
57 /* DebugFS initialization */
58 void debugfs_init(void);
59 int debugfs_smc_setup(void);
60 
61 /* Debugfs version returned through SMC interface */
62 #define DEBUGFS_VERSION		(0x000000001U)
63 
64 /* Function ID for accessing the debugfs interface */
65 #define DEBUGFS_FID_VALUE	(0x30U)
66 
67 #define is_debugfs_fid(_fid)	\
68 	(((_fid) & FUNCID_NUM_MASK) == DEBUGFS_FID_VALUE)
69 
70 /* Error code for debugfs SMC interface failures */
71 #define DEBUGFS_E_INVALID_PARAMS	(-2)
72 #define DEBUGFS_E_DENIED		(-3)
73 
74 uintptr_t debugfs_smc_handler(unsigned int smc_fid,
75 			      u_register_t cmd,
76 			      u_register_t arg2,
77 			      u_register_t arg3,
78 			      u_register_t arg4,
79 			      void *cookie,
80 			      void *handle,
81 			      uintptr_t flags);
82 
83 #endif /* DEBUGFS_H */
84