]> git.lizzy.rs Git - plan9front.git/blob - sys/include/fis.h
merge
[plan9front.git] / sys / include / fis.h
1 #pragma lib     "libfis.a"
2 #pragma src     "/sys/src/libfis"
3
4 /* ata errors */
5 enum {
6         Emed    = 1<<0,         /* media error */
7         Enm     = 1<<1,         /* no media */
8         Eabrt   = 1<<2,         /* abort */
9         Emcr    = 1<<3,         /* media change request */
10         Eidnf   = 1<<4,         /* no user-accessible address */
11         Emc     = 1<<5,         /* media change */
12         Eunc    = 1<<6,         /* data error */
13         Ewp     = 1<<6,         /* write protect */
14         Eicrc   = 1<<7,         /* interface crc error */
15
16         Efatal  = Eidnf|Eicrc,  /* must sw reset */
17 };
18
19 /* ata status */
20 enum {
21         ASerr   = 1<<0,         /* error */
22         ASdrq   = 1<<3,         /* request */
23         ASdf    = 1<<5,         /* fault */
24         ASdrdy  = 1<<6,         /* ready */
25         ASbsy   = 1<<7,         /* busy */
26
27         ASobs   = 1<<1|1<<2|1<<4,
28 };
29
30 enum {
31         /* fis types */
32         H2dev           = 0x27,
33         D2host          = 0x34,
34
35         /* fis flags bits */
36         Fiscmd          = 0x80,
37
38         /* ata bits */
39         Ataobs          = 0xa0,
40         Atalba          = 0x40,
41
42         /* nominal fis size (fits any fis) */
43         Fissize         = 0x20,
44 };
45
46 /* sata device-to-host (0x27) fis layout */
47 enum {
48         Ftype,
49         Fflags,
50         Fcmd,
51         Ffeat,
52         Flba0,
53         Flba8,
54         Flba16,
55         Fdev,
56         Flba24,
57         Flba32,
58         Flba40,
59         Ffeat8,
60         Fsc,
61         Fsc8,
62         Ficc,           /* isochronous cmd completion */
63         Fcontrol,
64 };
65
66 /* sata host-to-device fis (0x34) differences */
67 enum{
68         Fioport = 1,
69         Fstatus,
70         Frerror,
71 };
72
73 /* ata protcol type */
74 enum{
75         Pnd     = 0<<0, /* data direction */
76         Pin     = 1<<0,
77         Pout    = 2<<0,
78         Pdatam  = 3<<0,
79
80         Ppio    = 1<<2, /* ata protocol */
81         Pdma    = 2<<2,
82         Pdmq    = 3<<2,
83         Preset  = 4<<2,
84         Pdiag   = 5<<2,
85         Ppkt    = 6<<2,
86         Pprotom = 7<<2,
87
88         P48     = 0<<5, /* command “size” */
89         P28     = 1<<5,
90         Pcmdszm = 1<<5,
91
92         Pssn    = 0<<6, /* sector size */
93         P512    = 1<<6,
94         Pssm    = 1<<6,
95 };
96
97 typedef struct Sfis Sfis;
98 struct Sfis {
99         ushort  feat;
100         uchar   udma;
101         uchar   speeds;
102         uint    sig;
103         uint    lsectsz;
104         uint    physshift;      /* log2(log/phys) */
105         uint    c;              /* disgusting, no? */
106         uint    h;
107         uint    s;
108 };
109
110 enum {
111         Dlba    = 1<<0, /* required for sata */
112         Dllba   = 1<<1,
113         Dsmart  = 1<<2,
114         Dpower  = 1<<3,
115         Dnop    = 1<<4,
116         Datapi  = 1<<5,
117         Datapi16= 1<<6,
118         Data8   = 1<<7,
119         Dsct    = 1<<8,
120         Dnflag  = 9,
121 };
122
123 enum {
124         Pspinup = 1<<0,
125         Pidready        = 1<<1,
126 };
127
128 void    setfissig(Sfis*, uint);
129 int     txmodefis(Sfis*, uchar*, uchar);
130 int     atapirwfis(Sfis*, uchar*, uchar*, int, int);
131 int     featfis(Sfis*, uchar*, uchar);
132 int     flushcachefis(Sfis*, uchar*);
133 int     identifyfis(Sfis*, uchar*);
134 int     nopfis(Sfis*, uchar*, int);
135 int     rwfis(Sfis*, uchar*, int, int, uvlong);
136 void    skelfis(uchar*);
137 void    sigtofis(Sfis*, uchar*);
138 uvlong  fisrw(Sfis*, uchar*, int*);
139
140 void    idmove(char*, ushort*, int);
141 vlong   idfeat(Sfis*, ushort*);
142 uvlong  idwwn(Sfis*, ushort*);
143 int     idss(Sfis*, ushort*);
144 int     idpuis(ushort*);
145 ushort  id16(ushort*, int);
146 uint    id32(ushort*, int);
147 uvlong  id64(ushort*, int);
148 char    *pflag(char*, char*, Sfis*);
149 uint    fistosig(uchar*);
150
151 /* scsi */
152 typedef struct Cfis Cfis;
153 struct Cfis {
154         uchar   phyid;
155         uchar   encid[8];
156         uchar   tsasaddr[8];
157         uchar   ssasaddr[8];
158         uchar   ict[2];
159 };
160
161 void    smpskelframe(Cfis*, uchar*, int);
162 uint    sashash(uvlong);
163 uchar   *sasbhash(uchar*, uchar*);