xref: /plan9/sys/src/9/port/sd.h (revision 0cc6832d7c845a6250c7353daab06d4af2dfe5cb)
180ee5cbfSDavid du Colombier /*
280ee5cbfSDavid du Colombier  * Storage Device.
380ee5cbfSDavid du Colombier  */
480ee5cbfSDavid du Colombier typedef struct SDev SDev;
580ee5cbfSDavid du Colombier typedef struct SDifc SDifc;
6*0cc6832dSDavid du Colombier typedef struct SDio SDio;
780ee5cbfSDavid du Colombier typedef struct SDpart SDpart;
880ee5cbfSDavid du Colombier typedef struct SDperm SDperm;
980ee5cbfSDavid du Colombier typedef struct SDreq SDreq;
1080ee5cbfSDavid du Colombier typedef struct SDunit SDunit;
119a747e4fSDavid du Colombier 
129a747e4fSDavid du Colombier struct SDperm {
139a747e4fSDavid du Colombier 	char*	name;
149a747e4fSDavid du Colombier 	char*	user;
1580ee5cbfSDavid du Colombier 	ulong	perm;
169a747e4fSDavid du Colombier };
1780ee5cbfSDavid du Colombier 
189a747e4fSDavid du Colombier struct SDpart {
1917629263SDavid du Colombier 	uvlong	start;
2017629263SDavid du Colombier 	uvlong	end;
2180ee5cbfSDavid du Colombier 	SDperm;
2280ee5cbfSDavid du Colombier 	int	valid;
2380ee5cbfSDavid du Colombier 	ulong	vers;
249a747e4fSDavid du Colombier };
2580ee5cbfSDavid du Colombier 
269a747e4fSDavid du Colombier struct SDunit {
2780ee5cbfSDavid du Colombier 	SDev*	dev;
2880ee5cbfSDavid du Colombier 	int	subno;
29eb2d877eSDavid du Colombier 	uchar	inquiry[255];		/* format follows SCSI spec */
304de34a7eSDavid du Colombier 	uchar	sense[18];		/* format follows SCSI spec */
3180ee5cbfSDavid du Colombier 	SDperm;
3280ee5cbfSDavid du Colombier 
3380ee5cbfSDavid du Colombier 	QLock	ctl;
3417629263SDavid du Colombier 	uvlong	sectors;
3580ee5cbfSDavid du Colombier 	ulong	secsize;
3680ee5cbfSDavid du Colombier 	SDpart*	part;			/* nil or array of size npart */
3780ee5cbfSDavid du Colombier 	int	npart;
3880ee5cbfSDavid du Colombier 	ulong	vers;
3980ee5cbfSDavid du Colombier 	SDperm	ctlperm;
4080ee5cbfSDavid du Colombier 
4180ee5cbfSDavid du Colombier 	QLock	raw;			/* raw read or write in progress */
429a747e4fSDavid du Colombier 	ulong	rawinuse;		/* really just a test-and-set */
4380ee5cbfSDavid du Colombier 	int	state;
4480ee5cbfSDavid du Colombier 	SDreq*	req;
4580ee5cbfSDavid du Colombier 	SDperm	rawperm;
469a747e4fSDavid du Colombier };
4780ee5cbfSDavid du Colombier 
489a747e4fSDavid du Colombier /*
499a747e4fSDavid du Colombier  * Each controller is represented by a SDev.
509a747e4fSDavid du Colombier  */
519a747e4fSDavid du Colombier struct SDev {
529a747e4fSDavid du Colombier 	Ref	r;			/* Number of callers using device */
5380ee5cbfSDavid du Colombier 	SDifc*	ifc;			/* pnp/legacy */
5480ee5cbfSDavid du Colombier 	void*	ctlr;
5580ee5cbfSDavid du Colombier 	int	idno;
564de34a7eSDavid du Colombier 	char	name[8];
5780ee5cbfSDavid du Colombier 	SDev*	next;
5880ee5cbfSDavid du Colombier 
5980ee5cbfSDavid du Colombier 	QLock;				/* enable/disable */
6080ee5cbfSDavid du Colombier 	int	enabled;
619a747e4fSDavid du Colombier 	int	nunit;			/* Number of units */
629a747e4fSDavid du Colombier 	QLock	unitlock;		/* `Loading' of units */
639a747e4fSDavid du Colombier 	int*	unitflg;		/* Unit flags */
649a747e4fSDavid du Colombier 	SDunit**unit;
659a747e4fSDavid du Colombier };
6680ee5cbfSDavid du Colombier 
679a747e4fSDavid du Colombier struct SDifc {
6880ee5cbfSDavid du Colombier 	char*	name;
6980ee5cbfSDavid du Colombier 
7080ee5cbfSDavid du Colombier 	SDev*	(*pnp)(void);
7180ee5cbfSDavid du Colombier 	SDev*	(*legacy)(int, int);
7280ee5cbfSDavid du Colombier 	int	(*enable)(SDev*);
7380ee5cbfSDavid du Colombier 	int	(*disable)(SDev*);
7480ee5cbfSDavid du Colombier 
7580ee5cbfSDavid du Colombier 	int	(*verify)(SDunit*);
7680ee5cbfSDavid du Colombier 	int	(*online)(SDunit*);
7780ee5cbfSDavid du Colombier 	int	(*rio)(SDreq*);
7880ee5cbfSDavid du Colombier 	int	(*rctl)(SDunit*, char*, int);
7980ee5cbfSDavid du Colombier 	int	(*wctl)(SDunit*, Cmdbuf*);
8080ee5cbfSDavid du Colombier 
8117629263SDavid du Colombier 	long	(*bio)(SDunit*, int, int, void*, long, uvlong);
829a747e4fSDavid du Colombier 	SDev*	(*probe)(DevConf*);
839a747e4fSDavid du Colombier 	void	(*clear)(SDev*);
844de34a7eSDavid du Colombier 	char*	(*rtopctl)(SDev*, char*, char*);
854de34a7eSDavid du Colombier 	int	(*wtopctl)(SDev*, Cmdbuf*);
869a747e4fSDavid du Colombier };
8780ee5cbfSDavid du Colombier 
889a747e4fSDavid du Colombier struct SDreq {
8980ee5cbfSDavid du Colombier 	SDunit*	unit;
9080ee5cbfSDavid du Colombier 	int	lun;
9180ee5cbfSDavid du Colombier 	int	write;
9280ee5cbfSDavid du Colombier 	uchar	cmd[16];
9380ee5cbfSDavid du Colombier 	int	clen;
9480ee5cbfSDavid du Colombier 	void*	data;
9580ee5cbfSDavid du Colombier 	int	dlen;
9680ee5cbfSDavid du Colombier 
9780ee5cbfSDavid du Colombier 	int	flags;
9880ee5cbfSDavid du Colombier 
9980ee5cbfSDavid du Colombier 	int	status;
10080ee5cbfSDavid du Colombier 	long	rlen;
10180ee5cbfSDavid du Colombier 	uchar	sense[256];
1029a747e4fSDavid du Colombier };
10380ee5cbfSDavid du Colombier 
10480ee5cbfSDavid du Colombier enum {
10580ee5cbfSDavid du Colombier 	SDnosense	= 0x00000001,
10680ee5cbfSDavid du Colombier 	SDvalidsense	= 0x00010000,
10727522402SDavid du Colombier 
10827522402SDavid du Colombier 	SDinq0periphqual= 0xe0,
10927522402SDavid du Colombier 	SDinq0periphtype= 0x1f,
11027522402SDavid du Colombier 	SDinq1removable	= 0x80,
11127522402SDavid du Colombier 
11227522402SDavid du Colombier 	/* periphtype values */
11327522402SDavid du Colombier 	SDperdisk	= 0,	/* Direct access (disk) */
11427522402SDavid du Colombier 	SDpertape	= 1,	/* Sequential eg, tape */
11527522402SDavid du Colombier 	SDperpr		= 2,	/* Printer */
11627522402SDavid du Colombier 	SDperworm	= 4,	/* Worm */
11727522402SDavid du Colombier 	SDpercd		= 5,	/* CD-ROM */
11827522402SDavid du Colombier 	SDpermo		= 7,	/* rewriteable MO */
11927522402SDavid du Colombier 	SDperjuke	= 8,	/* medium-changer */
12080ee5cbfSDavid du Colombier };
12180ee5cbfSDavid du Colombier 
12280ee5cbfSDavid du Colombier enum {
12380ee5cbfSDavid du Colombier 	SDretry		= -5,		/* internal to controllers */
12480ee5cbfSDavid du Colombier 	SDmalloc	= -4,
12580ee5cbfSDavid du Colombier 	SDeio		= -3,
12680ee5cbfSDavid du Colombier 	SDtimeout	= -2,
12780ee5cbfSDavid du Colombier 	SDnostatus	= -1,
12880ee5cbfSDavid du Colombier 
12980ee5cbfSDavid du Colombier 	SDok		= 0,
13080ee5cbfSDavid du Colombier 
13180ee5cbfSDavid du Colombier 	SDcheck		= 0x02,		/* check condition */
13280ee5cbfSDavid du Colombier 	SDbusy		= 0x08,		/* busy */
13380ee5cbfSDavid du Colombier 
13480ee5cbfSDavid du Colombier 	SDmaxio		= 2048*1024,
13580ee5cbfSDavid du Colombier 	SDnpart		= 16,
13680ee5cbfSDavid du Colombier };
13780ee5cbfSDavid du Colombier 
1387ee275a1SDavid du Colombier /*
1397ee275a1SDavid du Colombier  * Allow the default #defines for sdmalloc & sdfree to be overridden by
1407ee275a1SDavid du Colombier  * system-specific versions.  This can be used to avoid extra copying
1417ee275a1SDavid du Colombier  * by making sure sd buffers are cache-aligned (some ARM systems) or
1427ee275a1SDavid du Colombier  * page-aligned (xen) for DMA.
1437ee275a1SDavid du Colombier  */
1447ee275a1SDavid du Colombier #ifndef sdmalloc
14580ee5cbfSDavid du Colombier #define sdmalloc(n)	malloc(n)
14680ee5cbfSDavid du Colombier #define sdfree(p)	free(p)
1477ee275a1SDavid du Colombier #endif
14880ee5cbfSDavid du Colombier 
149*0cc6832dSDavid du Colombier /*
150*0cc6832dSDavid du Colombier  * mmc/sd/sdio host controller interface
151*0cc6832dSDavid du Colombier  */
152*0cc6832dSDavid du Colombier 
153*0cc6832dSDavid du Colombier struct SDio {
154*0cc6832dSDavid du Colombier 	char	*name;
155*0cc6832dSDavid du Colombier 	int	(*init)(void);
156*0cc6832dSDavid du Colombier 	void	(*enable)(void);
157*0cc6832dSDavid du Colombier 	int	(*inquiry)(char*, int);
158*0cc6832dSDavid du Colombier 	int	(*cmd)(u32int, u32int, u32int*);
159*0cc6832dSDavid du Colombier 	void	(*iosetup)(int, void*, int, int);
160*0cc6832dSDavid du Colombier 	void	(*io)(int, uchar*, int);
161*0cc6832dSDavid du Colombier };
162*0cc6832dSDavid du Colombier 
163*0cc6832dSDavid du Colombier extern SDio sdio;
164*0cc6832dSDavid du Colombier 
1654de34a7eSDavid du Colombier /* devsd.c */
1664de34a7eSDavid du Colombier extern void sdadddevs(SDev*);
1672210c76eSDavid du Colombier extern void sdaddconf(SDunit*);
1682210c76eSDavid du Colombier extern void sdaddallconfs(void (*f)(SDunit*));
1692210c76eSDavid du Colombier extern void sdaddpart(SDunit*, char*, uvlong, uvlong);
1704de34a7eSDavid du Colombier extern int sdsetsense(SDreq*, int, int, int, int);
1714de34a7eSDavid du Colombier extern int sdmodesense(SDreq*, uchar*, void*, int);
1724de34a7eSDavid du Colombier extern int sdfakescsi(SDreq*, void*, int);
1734de34a7eSDavid du Colombier 
17480ee5cbfSDavid du Colombier /* sdscsi.c */
17580ee5cbfSDavid du Colombier extern int scsiverify(SDunit*);
17680ee5cbfSDavid du Colombier extern int scsionline(SDunit*);
17717629263SDavid du Colombier extern long scsibio(SDunit*, int, int, void*, long, uvlong);
17880ee5cbfSDavid du Colombier extern SDev* scsiid(SDev*, SDifc*);
179