ktest: Add minor fixes for kernel tests
[akaros.git] / kern / include / sd.h
1 /*
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9
10 /*
11  * Storage Device.
12  */
13 struct devconf;
14 struct sdev;
15 struct sdifc;
16 struct sdio;
17 struct sdpart;
18 struct sdperm;
19 struct sdreq;
20 struct sdunit;
21
22 struct sdperm {
23         char *name;
24         char *user;
25         uint32_t perm;
26 };
27
28 struct sdpart {
29         uint64_t start;
30         uint64_t end;
31         struct sdperm sdperm;
32         int valid;
33         uint32_t vers;
34 };
35
36 struct sdunit {
37         struct sdev *dev;
38         int subno;
39         unsigned char inquiry[255]; /* format follows SCSI spec */
40         unsigned char sense[18];    /* format follows SCSI spec */
41         struct sdperm sdperm;
42
43         qlock_t ctl;
44         uint64_t sectors;
45         uint32_t secsize;
46         struct sdpart *part; /* nil or array of size npart */
47         int npart;
48         uint32_t vers;
49         struct sdperm ctlperm;
50
51         qlock_t raw;       /* raw read or write in progress */
52         uint32_t rawinuse; /* really just a test-and-set */
53         int state;
54         struct sdreq *req;
55         struct sdperm rawperm;
56 };
57
58 /*
59  * Each controller is represented by a struct sdev.
60  */
61 struct sdev {
62         struct kref r;     /* Number of callers using device */
63         struct sdifc *ifc; /* pnp/legacy */
64         void *ctlr;
65         int idno;
66         char name[8];
67         struct sdev *next;
68
69         qlock_t ql; /* enable/disable */
70         int enabled;
71         int nunit;        /* Number of units */
72         qlock_t unitlock; /* `Loading' of units */
73         int *unitflg;     /* Unit flags */
74         struct sdunit **unit;
75 };
76
77 struct sdifc {
78         char *name;
79
80         struct sdev *(*pnp)(void);
81         struct sdev *(*legacy)(int, int);
82         int (*enable)(struct sdev *);
83         int (*disable)(struct sdev *);
84
85         int (*verify)(struct sdunit *);
86         int (*online)(struct sdunit *);
87         int (*rio)(struct sdreq *);
88         int (*rctl)(struct sdunit *, char *, int);
89         int (*wctl)(struct sdunit *, struct cmdbuf *);
90
91         int32_t (*bio)(struct sdunit *, int, int, void *, int32_t, uint64_t);
92         struct sdev *(*probe)(struct devconf *);
93         void (*clear)(struct sdev *);
94         char *(*rtopctl)(struct sdev *, char *, char *);
95         int (*wtopctl)(struct sdev *, struct cmdbuf *);
96 };
97
98 struct sdreq {
99         struct sdunit *unit;
100         int lun;
101         int write;
102         unsigned char cmd[16];
103         int clen;
104         void *data;
105         int dlen;
106
107         int flags;
108
109         int status;
110         int32_t rlen;
111         unsigned char sense[256];
112 };
113
114 enum {
115         SDnosense = 0x00000001,
116         SDvalidsense = 0x00010000,
117
118         SDinq0periphqual = 0xe0,
119         SDinq0periphtype = 0x1f,
120         SDinq1removable = 0x80,
121
122         /* periphtype values */
123         SDperdisk = 0, /* Direct access (disk) */
124         SDpertape = 1, /* Sequential eg, tape */
125         SDperpr = 2,   /* Printer */
126         SDperworm = 4, /* Worm */
127         SDpercd = 5,   /* CD-ROM */
128         SDpermo = 7,   /* rewriteable MO */
129         SDperjuke = 8, /* medium-changer */
130 };
131
132 enum {
133         SDretry = -5, /* internal to controllers */
134         SDmalloc = -4,
135         SDeio = -3,
136         SDtimeout = -2,
137         SDnostatus = -1,
138
139         SDok = 0,
140
141         SDcheck = 0x02, /* check condition */
142         SDbusy = 0x08,  /* busy */
143
144         SDmaxio = 2048 * 1024,
145         SDnpart = 16,
146 };
147
148 /*
149  * mmc/sd/sdio host controller interface
150  */
151
152 struct sdio {
153         char *name;
154         int (*init)(void);
155         void (*enable)(void);
156         int (*inquiry)(char *, int);
157         int (*cmd)(uint32_t, uint32_t, uint32_t *);
158         void (*iosetup)(int, void *, int, int);
159         void (*io)(int, unsigned char *, int);
160 };
161
162 extern struct sdio sdio;
163
164 /* devsd.c */
165 extern void sdadddevs(struct sdev *);
166 extern void sdaddconf(struct sdunit *);
167 extern void sdaddallconfs(void (*f)(struct sdunit *));
168 extern void sdaddpart(struct sdunit *, char *, uint64_t, uint64_t);
169 extern int sdsetsense(struct sdreq *, int, int, int, int);
170 extern int sdmodesense(struct sdreq *, unsigned char *, void *, int);
171 extern int sdfakescsi(struct sdreq *, void *, int);
172
173 /* sdscsi.c */
174 extern int scsiverify(struct sdunit *);
175 extern int scsionline(struct sdunit *);
176 extern int32_t scsibio(struct sdunit *, int, int, void *, int32_t, uint64_t);
177 extern struct sdev *scsiid(struct sdev *, struct sdifc *);
178
179 /*
180  *  hardware info about a device
181  */
182 struct devport {
183         uint32_t port;
184         int size;
185 };
186
187 struct devconf {
188         uint32_t intnum;       /* interrupt number */
189         char *type;            /* card type, malloced */
190         int nports;            /* Number of ports */
191         struct devport *ports; /* The ports themselves */
192 };