Add a printx lock
[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 typedef struct SDev SDev;
14 typedef struct SDifc SDifc;
15 typedef struct SDio SDio;
16 typedef struct SDpart SDpart;
17 typedef struct SDperm SDperm;
18 typedef struct SDreq SDreq;
19 typedef struct SDunit SDunit;
20
21 struct SDperm {
22         char *name;
23         char *user;
24         uint32_t perm;
25 };
26
27 struct SDpart {
28         uint64_t start;
29         uint64_t end;
30         SDperm SDperm;
31         int valid;
32         uint32_t vers;
33 };
34
35 struct SDunit {
36         SDev *dev;
37         int subno;
38         unsigned char inquiry[255]; /* format follows SCSI spec */
39         unsigned char sense[18];    /* format follows SCSI spec */
40         SDperm SDperm;
41
42         QLock ctl;
43         uint64_t sectors;
44         uint32_t secsize;
45         SDpart *part; /* nil or array of size npart */
46         int npart;
47         uint32_t vers;
48         SDperm ctlperm;
49
50         QLock raw;         /* raw read or write in progress */
51         uint32_t rawinuse; /* really just a test-and-set */
52         int state;
53         SDreq *req;
54         SDperm rawperm;
55 };
56
57 /*
58  * Each controller is represented by a SDev.
59  */
60 struct SDev {
61         Ref r;      /* Number of callers using device */
62         SDifc *ifc; /* pnp/legacy */
63         void *ctlr;
64         int idno;
65         char name[8];
66         SDev *next;
67
68         QLock ql; /* enable/disable */
69         int enabled;
70         int nunit;      /* Number of units */
71         QLock unitlock; /* `Loading' of units */
72         int *unitflg;   /* Unit flags */
73         SDunit **unit;
74 };
75
76 struct SDifc {
77         char *name;
78
79         SDev *(*pnp)(void);
80         SDev *(*legacy)(int, int);
81         int (*enable)(SDev *);
82         int (*disable)(SDev *);
83
84         int (*verify)(SDunit *);
85         int (*online)(SDunit *);
86         int (*rio)(SDreq *);
87         int (*rctl)(SDunit *, char *, int);
88         int (*wctl)(SDunit *, Cmdbuf *);
89
90         int32_t (*bio)(SDunit *, int, int, void *, int32_t, uint64_t);
91         SDev *(*probe)(DevConf *);
92         void (*clear)(SDev *);
93         char *(*rtopctl)(SDev *, char *, char *);
94         int (*wtopctl)(SDev *, Cmdbuf *);
95 };
96
97 struct SDreq {
98         SDunit *unit;
99         int lun;
100         int write;
101         unsigned char cmd[16];
102         int clen;
103         void *data;
104         int dlen;
105
106         int flags;
107
108         int status;
109         int32_t rlen;
110         unsigned char sense[256];
111 };
112
113 enum {
114         SDnosense = 0x00000001,
115         SDvalidsense = 0x00010000,
116
117         SDinq0periphqual = 0xe0,
118         SDinq0periphtype = 0x1f,
119         SDinq1removable = 0x80,
120
121         /* periphtype values */
122         SDperdisk = 0, /* Direct access (disk) */
123         SDpertape = 1, /* Sequential eg, tape */
124         SDperpr = 2,   /* Printer */
125         SDperworm = 4, /* Worm */
126         SDpercd = 5,   /* CD-ROM */
127         SDpermo = 7,   /* rewriteable MO */
128         SDperjuke = 8, /* medium-changer */
129 };
130
131 enum {
132         SDretry = -5, /* internal to controllers */
133         SDmalloc = -4,
134         SDeio = -3,
135         SDtimeout = -2,
136         SDnostatus = -1,
137
138         SDok = 0,
139
140         SDcheck = 0x02, /* check condition */
141         SDbusy = 0x08,  /* busy */
142
143         SDmaxio = 2048 * 1024,
144         SDnpart = 16,
145 };
146
147 /*
148  * Allow the default #defines for sdmalloc & sdfree to be overridden by
149  * system-specific versions.  This can be used to avoid extra copying
150  * by making sure sd buffers are cache-aligned (some ARM systems) or
151  * page-aligned (xen) for DMA.
152  */
153 #ifndef sdmalloc
154 #define sdmalloc(n) malloc(n)
155 #define sdfree(p) free(p)
156 #endif
157
158 /*
159  * mmc/sd/sdio host controller interface
160  */
161
162 struct SDio {
163         char *name;
164         int (*init)(void);
165         void (*enable)(void);
166         int (*inquiry)(char *, int);
167         int (*cmd)(uint32_t, uint32_t, uint32_t *);
168         void (*iosetup)(int, void *, int, int);
169         void (*io)(int, unsigned char *, int);
170 };
171
172 extern SDio sdio;
173
174 /* devsd.c */
175 extern void sdadddevs(SDev *);
176 extern void sdaddconf(SDunit *);
177 extern void sdaddallconfs(void (*f)(SDunit *));
178 extern void sdaddpart(SDunit *, char *, uint64_t, uint64_t);
179 extern int sdsetsense(SDreq *, int, int, int, int);
180 extern int sdmodesense(SDreq *, unsigned char *, void *, int);
181 extern int sdfakescsi(SDreq *, void *, int);
182
183 /* sdscsi.c */
184 extern int scsiverify(SDunit *);
185 extern int scsionline(SDunit *);
186 extern int32_t scsibio(SDunit *, int, int, void *, int32_t, uint64_t);
187 extern SDev *scsiid(SDev *, SDifc *);
188
189 /*
190  *  hardware info about a device
191  */
192 typedef struct devport {
193         uint32_t port;
194         int size;
195 } Devport;
196
197 struct DevConf {
198         uint32_t intnum; /* interrupt number */
199         char *type;      /* card type, malloced */
200         int nports;      /* Number of ports */
201         Devport *ports;  /* The ports themselves */
202 };