sdmv50xx.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750
  1. /*
  2. * Marvell 88SX[56]0[48][01] fileserver Serial ATA (SATA) driver
  3. *
  4. * See MV-S101357-00 Rev B Marvell PCI/PCI-X to 8-Port/4-Port
  5. * SATA Host Controller, ATA-5 ANSI NCITS 340-2000.
  6. *
  7. * This is a heavily-modified version (by Coraid) of a heavily-modified
  8. * version (from The Labs) of a driver written by Coraid, Inc.
  9. * The original copyright notice appears at the end of this file.
  10. */
  11. #include "u.h"
  12. #include "../port/lib.h"
  13. #include "mem.h"
  14. #include "dat.h"
  15. #include "fns.h"
  16. #include "io.h"
  17. #include "../port/error.h"
  18. #include "../port/sd.h"
  19. #define dprint if(!0){}else iprint
  20. #define idprint if(!0){}else iprint
  21. #define ioprint if(!0){}else iprint
  22. enum{
  23. NCtlr = 4,
  24. NCtlrdrv = 8,
  25. NDrive = NCtlr*NCtlrdrv,
  26. Read = 0,
  27. Write,
  28. };
  29. enum {
  30. SrbRing = 32,
  31. /* Addresses of ATA register */
  32. ARcmd = 027,
  33. ARdev = 026,
  34. ARerr = 021,
  35. ARfea = 021,
  36. ARlba2 = 025,
  37. ARlba1 = 024,
  38. ARlba0 = 023,
  39. ARseccnt = 022,
  40. ARstat = 027,
  41. ATAerr = (1<<0),
  42. ATAdrq = (1<<3),
  43. ATAdf = (1<<5),
  44. ATAdrdy = (1<<6),
  45. ATAbusy = (1<<7),
  46. ATAabort = (1<<2),
  47. ATAobs = (1<<1 | 1<<2 | 1<<4),
  48. ATAeIEN = (1<<1),
  49. ATAsrst = (1<<2),
  50. ATAhob = (1<<7),
  51. ATAbad = (ATAbusy|ATAdf|ATAdrq|ATAerr),
  52. SFdone = (1<<0),
  53. SFerror = (1<<1),
  54. SRBident = 0,
  55. SRBread,
  56. SRBwrite,
  57. SRBsmart,
  58. SRBnodata = 0,
  59. SRBdatain,
  60. SRBdataout,
  61. RQread = 1, /* data coming IN from device */
  62. PRDeot = (1<<15),
  63. /* EDMA interrupt error cause register */
  64. ePrtDataErr = (1<<0),
  65. ePrtPRDErr = (1<<1),
  66. eDevErr = (1<<2),
  67. eDevDis = (1<<3),
  68. eDevCon = (1<<4),
  69. eOverrun = (1<<5),
  70. eUnderrun = (1<<6),
  71. eSelfDis = (1<<8),
  72. ePrtCRQBErr = (1<<9),
  73. ePrtCRPBErr = (1<<10),
  74. ePrtIntErr = (1<<11),
  75. eIORdyErr = (1<<12),
  76. // flags for sata 2 version
  77. eSelfDis2 = (1<<7),
  78. SerrInt = (1<<5),
  79. /* EDMA Command Register */
  80. eEnEDMA = (1<<0),
  81. eDsEDMA = (1<<1),
  82. eAtaRst = (1<<2),
  83. /* Interrupt mask for errors we care about */
  84. IEM = (eDevDis | eDevCon | eSelfDis),
  85. IEM2 = (eDevDis | eDevCon | eSelfDis2),
  86. /* drive states */
  87. Dnull = 0,
  88. Dnew,
  89. Dready,
  90. Derror,
  91. Dmissing,
  92. Dreset,
  93. Dlast,
  94. /* drive flags */
  95. Dext = (1<<0), /* use ext commands */
  96. Dpio = (1<<1), /* doing pio */
  97. Dwanted = (1<<2), /* someone wants an srb entry */
  98. Dedma = (1<<3), /* device in edma mode */
  99. Dpiowant = (1<<4), /* some wants to use the pio mode */
  100. // phyerrata magic crap
  101. Mpreamp = 0x7e0,
  102. Dpreamp = 0x720,
  103. REV60X1B2 = 0x7,
  104. REV60X1C0 = 0x9,
  105. };
  106. static char* diskstates[Dlast] = {
  107. "null",
  108. "new",
  109. "ready",
  110. "error",
  111. "missing",
  112. "reset",
  113. };
  114. extern SDifc sdmv50xxifc;
  115. typedef struct Arb Arb;
  116. typedef struct Bridge Bridge;
  117. typedef struct Chip Chip;
  118. typedef struct Ctlr Ctlr;
  119. typedef struct Drive Drive;
  120. typedef struct Edma Edma;
  121. typedef struct Prd Prd;
  122. typedef struct Rx Rx;
  123. typedef struct Srb Srb;
  124. typedef struct Tx Tx;
  125. // there are 4 drives per chip. thus an 8-port
  126. // card has two chips.
  127. struct Chip
  128. {
  129. Arb *arb;
  130. Edma *edma;
  131. };
  132. enum{
  133. DMautoneg,
  134. DMsatai,
  135. DMsataii,
  136. };
  137. struct Drive
  138. {
  139. Lock;
  140. Ctlr *ctlr;
  141. SDunit *unit;
  142. char name[10];
  143. ulong magic;
  144. Bridge *bridge;
  145. Edma *edma;
  146. Chip *chip;
  147. int chipx;
  148. int mediachange;
  149. int state;
  150. int flag;
  151. uvlong sectors;
  152. ulong pm2; // phymode 2 init state
  153. ulong intick; // check for hung westerdigital drives.
  154. int wait;
  155. int mode; // DMautoneg, satai or sataii.
  156. char serial[20+1];
  157. char firmware[8+1];
  158. char model[40+1];
  159. ushort info[256];
  160. Srb *srb[SrbRing-1];
  161. int nsrb;
  162. Prd *prd;
  163. Tx *tx;
  164. Rx *rx;
  165. Srb *srbhead;
  166. Srb *srbtail;
  167. int driveno; // ctlr*NCtlrdrv + unit
  168. };
  169. struct Ctlr
  170. {
  171. Lock;
  172. int irq;
  173. int tbdf;
  174. int rid;
  175. ulong magic;
  176. int enabled;
  177. int type;
  178. SDev *sdev;
  179. Pcidev *pcidev;
  180. uchar *mmio;
  181. ulong *lmmio;
  182. Chip chip[2];
  183. int nchip;
  184. Drive drive[NCtlrdrv];
  185. int ndrive;
  186. };
  187. struct Srb /* request buffer */
  188. {
  189. Lock;
  190. Rendez;
  191. Srb *next;
  192. Drive *drive;
  193. uvlong blockno;
  194. int count;
  195. int req;
  196. int flag;
  197. uchar *data;
  198. uchar cmd;
  199. uchar lba[6];
  200. uchar sectors;
  201. int sta;
  202. int err;
  203. };
  204. /*
  205. * Memory-mapped I/O registers in many forms.
  206. */
  207. struct Bridge /* memory-mapped per-Drive registers */
  208. {
  209. ulong status;
  210. ulong serror;
  211. ulong sctrl;
  212. ulong phyctrl;
  213. ulong phymode3;
  214. ulong phymode4;
  215. uchar fill0[0x14];
  216. ulong phymode1;
  217. ulong phymode2;
  218. char fill1[8];
  219. ulong ctrl;
  220. char fill2[0x34];
  221. ulong phymode;
  222. char fill3[0x88];
  223. }; // most be 0x100 hex in length
  224. struct Arb /* memory-mapped per-Chip registers */
  225. {
  226. ulong config; /* satahc configuration register (sata2 only) */
  227. ulong rqop; /* request queue out-pointer */
  228. ulong rqip; /* response queue in pointer */
  229. ulong ict; /* inerrupt caolescing threshold */
  230. ulong itt; /* interrupt timer threshold */
  231. ulong ic; /* interrupt cause */
  232. ulong btc; /* bridges test control */
  233. ulong bts; /* bridges test status */
  234. ulong bpc; /* bridges pin configuration */
  235. char fill1[0xdc];
  236. Bridge bridge[4];
  237. };
  238. struct Edma /* memory-mapped per-Drive DMA-related registers */
  239. {
  240. ulong config; /* configuration register */
  241. ulong timer;
  242. ulong iec; /* interrupt error cause */
  243. ulong iem; /* interrupt error mask */
  244. ulong txbasehi; /* request queue base address high */
  245. ulong txi; /* request queue in pointer */
  246. ulong txo; /* request queue out pointer */
  247. ulong rxbasehi; /* response queue base address high */
  248. ulong rxi; /* response queue in pointer */
  249. ulong rxo; /* response queue out pointer */
  250. ulong ctl; /* command register */
  251. ulong testctl; /* test control */
  252. ulong status;
  253. ulong iordyto; /* IORDY timeout */
  254. char fill[0x18];
  255. ulong sataconfig; /* sata 2 */
  256. char fill[0xac];
  257. ushort pio; /* data register */
  258. char pad0[2];
  259. uchar err; /* features and error */
  260. char pad1[3];
  261. uchar seccnt; /* sector count */
  262. char pad2[3];
  263. uchar lba0;
  264. char pad3[3];
  265. uchar lba1;
  266. char pad4[3];
  267. uchar lba2;
  268. char pad5[3];
  269. uchar lba3;
  270. char pad6[3];
  271. uchar cmdstat; /* cmd/status */
  272. char pad7[3];
  273. uchar altstat; /* alternate status */
  274. uchar fill2[0x1df];
  275. Bridge port;
  276. char fill3[0x1c00]; /* pad to 0x2000 bytes */
  277. };
  278. /*
  279. * Memory structures shared with card.
  280. */
  281. struct Prd /* physical region descriptor */
  282. {
  283. ulong pa; /* byte address of physical memory */
  284. ushort count; /* byte count (bit0 must be 0) */
  285. ushort flag;
  286. ulong zero; /* high long of 64 bit address */
  287. ulong reserved;
  288. };
  289. struct Tx /* command request block */
  290. {
  291. ulong prdpa; /* physical region descriptor table structures */
  292. ulong zero; /* must be zero (high long of prd address) */
  293. ushort flag; /* control flags */
  294. ushort regs[11];
  295. };
  296. struct Rx /* command response block */
  297. {
  298. ushort cid; /* cID of response */
  299. uchar cEdmaSts; /* EDMA status */
  300. uchar cDevSts; /* status from disk */
  301. ulong ts; /* time stamp */
  302. };
  303. static Drive *mvsatadrive[NDrive];
  304. static int nmvsatadrive;
  305. /*
  306. * Little-endian parsing for drive data.
  307. */
  308. static ushort
  309. lhgets(void *p)
  310. {
  311. uchar *a = p;
  312. return ((ushort) a[1] << 8) | a[0];
  313. }
  314. static ulong
  315. lhgetl(void *p)
  316. {
  317. uchar *a = p;
  318. return ((ulong) lhgets(a+2) << 16) | lhgets(a);
  319. }
  320. static uvlong
  321. lhgetv(void *p)
  322. {
  323. uchar *a = p;
  324. return ((uvlong) lhgetl(a+4) << 32) | lhgetl(a);
  325. }
  326. static void
  327. idmove(char *p, ushort *a, int n)
  328. {
  329. char *op;
  330. int i;
  331. op = p;
  332. for(i=0; i<n/2; i++){
  333. *p++ = a[i]>>8;
  334. *p++ = a[i];
  335. }
  336. while(p>op && *--p == ' ')
  337. *p = 0;
  338. }
  339. /*
  340. * Request buffers.
  341. */
  342. struct
  343. {
  344. Lock;
  345. Srb *freechain;
  346. int nalloc;
  347. } srblist;
  348. static Srb*
  349. allocsrb(void)
  350. {
  351. Srb *p;
  352. ilock(&srblist);
  353. if((p = srblist.freechain) == nil){
  354. srblist.nalloc++;
  355. iunlock(&srblist);
  356. p = smalloc(sizeof *p);
  357. }else{
  358. srblist.freechain = p->next;
  359. iunlock(&srblist);
  360. }
  361. return p;
  362. }
  363. static void
  364. freesrb(Srb *p)
  365. {
  366. ilock(&srblist);
  367. p->next = srblist.freechain;
  368. srblist.freechain = p;
  369. iunlock(&srblist);
  370. }
  371. /*
  372. * Wait for a byte to be a particular value.
  373. */
  374. static int
  375. satawait(uchar *p, uchar mask, uchar v, int ms)
  376. {
  377. int i;
  378. for(i=0; i<ms && (*p & mask) != v; i++)
  379. microdelay(1000);
  380. return (*p & mask) == v;
  381. }
  382. /*
  383. * Drive initialization
  384. */
  385. // unmask in the pci registers err done
  386. static void
  387. unmask(ulong *mmio, int port, int coal)
  388. {
  389. port &= 7;
  390. if(coal)
  391. coal = 1;
  392. if (port < 4)
  393. mmio[0x1d64/4] |= (3 << (((port&3)*2)) | (coal<<8));
  394. else
  395. mmio[0x1d64/4] |= (3 << (((port&3)*2+9)) | (coal<<17));
  396. }
  397. static void
  398. mask(ulong *mmio, int port, int coal)
  399. {
  400. port &= 7;
  401. if(coal)
  402. coal = 1;
  403. if (port < 4)
  404. mmio[0x1d64/4] &= ~(3 << (((port&3)*2)) | (coal<<8));
  405. else
  406. mmio[0x1d64/4] &= ~(3 << (((port&3)*2+9)) | (coal<<17));
  407. }
  408. /* I give up, marvell. You win. */
  409. static void
  410. phyerrata(Drive *d)
  411. {
  412. ulong n, m;
  413. enum { BadAutoCal = 0xf << 26, };
  414. if (d->ctlr->type == 1)
  415. return;
  416. microdelay(200);
  417. n = d->bridge->phymode2;
  418. while ((n & BadAutoCal) == BadAutoCal) {
  419. dprint("%s: badautocal\n", d->unit->name);
  420. n &= ~(1<<16);
  421. n |= (1<<31);
  422. d->bridge->phymode2 = n;
  423. microdelay(200);
  424. d->bridge->phymode2 &= ~((1<<16) | (1<<31));
  425. microdelay(200);
  426. n = d->bridge->phymode2;
  427. }
  428. n &= ~(1<<31);
  429. d->bridge->phymode2 = n;
  430. microdelay(200);
  431. /* abra cadabra! (random magic) */
  432. m = d->bridge->phymode3;
  433. m &= ~0x7f800000;
  434. m |= 0x2a800000;
  435. d->bridge->phymode3 = m;
  436. /* fix phy mode 4 */
  437. m = d->bridge->phymode3;
  438. n = d->bridge->phymode4;
  439. n &= ~(1<<1);
  440. n |= 1;
  441. switch(d->ctlr->rid){
  442. case REV60X1B2:
  443. default:
  444. d->bridge->phymode4 = n;
  445. d->bridge->phymode3 = m;
  446. break;
  447. case REV60X1C0:
  448. d->bridge->phymode4 = n;
  449. break;
  450. }
  451. /* revert values of pre-emphasis and signal amps to the saved ones */
  452. n = d->bridge->phymode2;
  453. n &= ~Mpreamp;
  454. n |= d->pm2;
  455. n &= ~(1<<16);
  456. d->bridge->phymode2 = n;
  457. }
  458. static void
  459. edmacleanout(Drive *d)
  460. {
  461. int i;
  462. Srb *srb;
  463. for(i=0; i<nelem(d->srb); i++){
  464. if(srb = d->srb[i]){
  465. d->srb[i] = nil;
  466. d->nsrb--;
  467. srb->flag |= SFerror|SFdone;
  468. wakeup(srb);
  469. }
  470. }
  471. while(srb = d->srbhead){
  472. d->srbhead = srb->next;
  473. srb->flag |= SFerror|SFdone;
  474. wakeup(srb);
  475. }
  476. }
  477. static void
  478. resetdisk(Drive *d)
  479. {
  480. ulong n;
  481. d->sectors = 0;
  482. d->unit->sectors = 0;
  483. if (d->ctlr->type == 2) {
  484. // without bit 8 we can boot without disks, but
  485. // inserted disks will never appear. :-X
  486. n = d->edma->sataconfig;
  487. n &= 0xff;
  488. n |= 0x9b1100;
  489. d->edma->sataconfig = n;
  490. n = d->edma->sataconfig; //flush
  491. USED(n);
  492. }
  493. d->edma->ctl = eDsEDMA;
  494. microdelay(1);
  495. d->edma->ctl = eAtaRst;
  496. microdelay(25);
  497. d->edma->ctl = 0;
  498. if (satawait((uchar *)&d->edma->ctl, eEnEDMA, 0, 3*1000) == 0)
  499. print("%s: eEnEDMA never cleared on reset\n", d->unit->name);
  500. edmacleanout(d);
  501. phyerrata(d);
  502. d->bridge->sctrl = 0x301 | (d->mode << 4);
  503. d->state = Dmissing;
  504. }
  505. static void
  506. edmainit(Drive *d)
  507. {
  508. int i;
  509. if(d->tx != nil)
  510. return;
  511. d->tx = xspanalloc(32*sizeof(Tx), 1024, 0);
  512. d->rx = xspanalloc(32*sizeof(Rx), 256, 0);
  513. d->prd = xspanalloc(32*sizeof(Prd), 32, 0);
  514. for(i = 0; i < 32; i++)
  515. d->tx[i].prdpa = PADDR(&d->prd[i]);
  516. coherence();
  517. }
  518. static int
  519. configdrive(Ctlr *ctlr, Drive *d, SDunit *unit)
  520. {
  521. dprint("%s: configdrive\n", unit->name);
  522. if(d->driveno < 0)
  523. panic("mv50xx: configdrive: unset driveno\n");
  524. d->unit = unit;
  525. edmainit(d);
  526. d->mode = DMsatai;
  527. if(d->ctlr->type == 1){
  528. d->edma->iem = IEM;
  529. d->bridge = &d->chip->arb->bridge[d->chipx];
  530. }else{
  531. d->edma->iem = IEM2;
  532. d->bridge = &d->chip->edma[d->chipx].port;
  533. d->edma->iem = ~(1<<6);
  534. d->pm2 = Dpreamp;
  535. if(d->ctlr->lmmio[0x180d8/4] & 1)
  536. d->pm2 = d->bridge->phymode2 & Mpreamp;
  537. }
  538. resetdisk(d);
  539. unmask(ctlr->lmmio, d->driveno, 0);
  540. delay(100);
  541. if(d->bridge->status){
  542. dprint("%s: configdrive: found drive %lx\n", unit->name, d->bridge->status);
  543. return 0;
  544. }
  545. return -1;
  546. }
  547. static int
  548. enabledrive(Drive *d)
  549. {
  550. Edma *edma;
  551. dprint("%s: enabledrive..", d->unit->name);
  552. if((d->bridge->status & 0xf) != 3){
  553. dprint("%s: not present\n", d->unit->name);
  554. d->state = Dmissing;
  555. return -1;
  556. }
  557. edma = d->edma;
  558. if(satawait(&edma->cmdstat, ATAbusy, 0, 5*1000) == 0){
  559. dprint("%s: busy timeout\n", d->unit->name);
  560. d->state = Dmissing;
  561. return -1;
  562. }
  563. edma->iec = 0;
  564. d->chip->arb->ic &= ~(0x101 << d->chipx);
  565. edma->config = 0x51f;
  566. if (d->ctlr->type == 2)
  567. edma->config |= 7<<11;
  568. edma->txi = PADDR(d->tx);
  569. edma->txo = (ulong)d->tx & 0x3e0;
  570. edma->rxi = (ulong)d->rx & 0xf8;
  571. edma->rxo = PADDR(d->rx);
  572. edma->ctl |= 1; /* enable dma */
  573. if(d->bridge->status = 0x113){
  574. dprint("%s: new\n", d->unit->name);
  575. d->state = Dnew;
  576. }else
  577. print("%s: status not forced (should be okay)\n", d->unit->name);
  578. return 0;
  579. }
  580. static void
  581. disabledrive(Drive *d)
  582. {
  583. int i;
  584. ulong *r;
  585. dprint("%s: disabledrive\n", d->unit->name);
  586. if(d->tx == nil) /* never enabled */
  587. return;
  588. d->edma->ctl = 0;
  589. d->edma->iem = 0;
  590. r = (ulong*)(d->ctlr->mmio + 0x1d64);
  591. i = d->chipx;
  592. if(d->chipx < 4)
  593. *r &= ~(3 << (i*2));
  594. else
  595. *r |= ~(3 << (i*2+9));
  596. }
  597. static int
  598. setudmamode(Drive *d, uchar mode)
  599. {
  600. Edma *edma;
  601. dprint("%s: setudmamode %d\n", d->unit->name, mode);
  602. edma = d->edma;
  603. if (edma == nil) {
  604. iprint("setudamode(m%d): zero d->edma\m", d->driveno);
  605. return 0;
  606. }
  607. if(satawait(&edma->cmdstat, ~ATAobs, ATAdrdy, 9*1000) == 0){
  608. iprint("%s: cmdstat 0x%.2ux ready timeout\n", d->unit->name, edma->cmdstat);
  609. return 0;
  610. }
  611. edma->altstat = ATAeIEN;
  612. edma->err = 3;
  613. edma->seccnt = 0x40 | mode;
  614. edma->cmdstat = 0xef;
  615. microdelay(1);
  616. if(satawait(&edma->cmdstat, ATAbusy, 0, 5*1000) == 0){
  617. iprint("%s: cmdstat 0x%.2ux busy timeout\n", d->unit->name, edma->cmdstat);
  618. return 0;
  619. }
  620. return 1;
  621. }
  622. static int
  623. identifydrive(Drive *d)
  624. {
  625. int i;
  626. ushort *id;
  627. Edma *edma;
  628. SDunit *unit;
  629. dprint("%s: identifydrive\n", d->unit->name);
  630. if(setudmamode(d, 5) == 0) /* do all SATA support 5? */
  631. goto Error;
  632. id = d->info;
  633. memset(d->info, 0, sizeof d->info);
  634. edma = d->edma;
  635. if(satawait(&edma->cmdstat, ~ATAobs, ATAdrdy, 5*1000) == 0)
  636. goto Error;
  637. edma->altstat = ATAeIEN; /* no interrupts */
  638. edma->cmdstat = 0xec;
  639. microdelay(1);
  640. if(satawait(&edma->cmdstat, ATAbusy, 0, 5*1000) == 0)
  641. goto Error;
  642. for(i = 0; i < 256; i++)
  643. id[i] = edma->pio;
  644. if(edma->cmdstat & ATAbad)
  645. goto Error;
  646. i = lhgets(id+83) | lhgets(id+86);
  647. if(i & (1<<10)){
  648. d->flag |= Dext;
  649. d->sectors = lhgetv(id+100);
  650. }else{
  651. d->flag &= ~Dext;
  652. d->sectors = lhgetl(id+60);
  653. }
  654. idmove(d->serial, id+10, 20);
  655. idmove(d->firmware, id+23, 8);
  656. idmove(d->model, id+27, 40);
  657. unit = d->unit;
  658. memset(unit->inquiry, 0, sizeof unit->inquiry);
  659. unit->inquiry[2] = 2;
  660. unit->inquiry[3] = 2;
  661. unit->inquiry[4] = sizeof(unit->inquiry)-4;
  662. idmove((char*)unit->inquiry+8, id+27, 40);
  663. if(enabledrive(d) == 0) {
  664. d->state = Dready;
  665. d->mediachange = 1;
  666. idprint("%s: LLBA %lld sectors\n", d->unit->name, d->sectors);
  667. } else
  668. d->state = Derror;
  669. if(d->state == Dready)
  670. return 0;
  671. return -1;
  672. Error:
  673. dprint("error...");
  674. d->state = Derror;
  675. return -1;
  676. }
  677. /* p. 163:
  678. M recovered error
  679. P protocol error
  680. N PhyRdy change
  681. W CommWake
  682. B 8-to-10 encoding error
  683. D disparity error
  684. C crc error
  685. H handshake error
  686. S link sequence error
  687. T transport state transition error
  688. F unrecognized fis type
  689. X device changed
  690. */
  691. static char stab[] = {
  692. [1] 'M',
  693. [10] 'P',
  694. [16] 'N',
  695. [18] 'W', 'B', 'D', 'C', 'H', 'S', 'T', 'F', 'X'
  696. };
  697. static ulong sbad = (7<<20)|(3<<23);
  698. static void
  699. serrdecode(ulong r, char *s, char *e)
  700. {
  701. int i;
  702. e -= 3;
  703. for(i = 0; i < nelem(stab) && s < e; i++){
  704. if((r&(1<<i)) && stab[i]){
  705. *s++ = stab[i];
  706. if(sbad&(1<<i))
  707. *s++ = '*';
  708. }
  709. }
  710. *s = 0;
  711. }
  712. char *iectab[] = {
  713. "ePrtDataErr",
  714. "ePrtPRDErr",
  715. "eDevErr",
  716. "eDevDis",
  717. "eDevCon",
  718. "SerrInt",
  719. "eUnderrun",
  720. "eSelfDis2",
  721. "eSelfDis",
  722. "ePrtCRQBErr",
  723. "ePrtCRPBErr",
  724. "ePrtIntErr",
  725. "eIORdyErr",
  726. };
  727. static char*
  728. iecdecode(ulong cause)
  729. {
  730. int i;
  731. for(i = 0; i < nelem(iectab); i++)
  732. if(cause&(1<<i))
  733. return iectab[i];
  734. return "";
  735. }
  736. enum{
  737. Cerror = ePrtDataErr|ePrtPRDErr|eDevErr|eSelfDis2|ePrtCRPBErr|ePrtIntErr,
  738. };
  739. static void
  740. updatedrive(Drive *d)
  741. {
  742. int x;
  743. ulong cause;
  744. Edma *edma;
  745. char buf[32+4+1];
  746. edma = d->edma;
  747. if((edma->ctl&eEnEDMA) == 0){
  748. // FEr SATA#4 40xx
  749. x = d->edma->cmdstat;
  750. USED(x);
  751. }
  752. cause = edma->iec;
  753. if(cause == 0)
  754. return;
  755. dprint("%s: cause %08ulx [%s]\n", d->unit->name, cause, iecdecode(cause));
  756. if(cause & eDevCon)
  757. d->state = Dnew;
  758. if(cause&eDevDis && d->state == Dready)
  759. iprint("%s: pulled: st=%08ulx\n", d->unit->name, cause);
  760. switch(d->ctlr->type){
  761. case 1:
  762. if(cause&eSelfDis)
  763. d->state = Derror;
  764. break;
  765. case 2:
  766. if(cause&Cerror)
  767. d->state = Derror;
  768. if(cause&SerrInt){
  769. serrdecode(d->bridge->serror, buf, buf+sizeof buf);
  770. dprint("%s: serror %08ulx [%s]\n", d->unit->name, (ulong)d->bridge->serror, buf);
  771. d->bridge->serror = d->bridge->serror;
  772. }
  773. }
  774. edma->iec = ~cause;
  775. }
  776. /*
  777. * Requests
  778. */
  779. static Srb*
  780. srbrw(int req, Drive *d, uchar *data, uint sectors, uvlong lba)
  781. {
  782. int i;
  783. Srb *srb;
  784. static uchar cmd[2][2] = { 0xC8, 0x25, 0xCA, 0x35 };
  785. srb = allocsrb();
  786. srb->req = req;
  787. srb->drive = d;
  788. srb->blockno = lba;
  789. srb->sectors = sectors;
  790. srb->count = sectors*512;
  791. srb->flag = 0;
  792. srb->data = data;
  793. for(i=0; i<6; i++)
  794. srb->lba[i] = lba >> (8*i);
  795. srb->cmd = cmd[srb->req!=SRBread][(d->flag&Dext)!=0];
  796. return srb;
  797. }
  798. static uintptr
  799. advance(uintptr pa, int shift)
  800. {
  801. int n, mask;
  802. mask = 0x1F<<shift;
  803. n = (pa & mask) + (1<<shift);
  804. return (pa & ~mask) | (n & mask);
  805. }
  806. #define CMD(r, v) (((r)<<8) | ((v)&0xFF))
  807. static void
  808. mvsatarequest(ushort *cmd, Srb *srb, int ext)
  809. {
  810. *cmd++ = CMD(ARseccnt, 0);
  811. *cmd++ = CMD(ARseccnt, srb->sectors);
  812. *cmd++ = CMD(ARfea, 0);
  813. if(ext){
  814. *cmd++ = CMD(ARlba0, srb->lba[3]);
  815. *cmd++ = CMD(ARlba0, srb->lba[0]);
  816. *cmd++ = CMD(ARlba1, srb->lba[4]);
  817. *cmd++ = CMD(ARlba1, srb->lba[1]);
  818. *cmd++ = CMD(ARlba2, srb->lba[5]);
  819. *cmd++ = CMD(ARlba2, srb->lba[2]);
  820. *cmd++ = CMD(ARdev, 0xe0);
  821. }else{
  822. *cmd++ = CMD(ARlba0, srb->lba[0]);
  823. *cmd++ = CMD(ARlba1, srb->lba[1]);
  824. *cmd++ = CMD(ARlba2, srb->lba[2]);
  825. *cmd++ = CMD(ARdev, srb->lba[3] | 0xe0);
  826. }
  827. *cmd = CMD(ARcmd, srb->cmd) | (1<<15);
  828. }
  829. static void
  830. startsrb(Drive *d, Srb *srb)
  831. {
  832. int i;
  833. Edma *edma;
  834. Prd *prd;
  835. Tx *tx;
  836. if(d->nsrb >= nelem(d->srb)){
  837. srb->next = nil;
  838. if(d->srbhead)
  839. d->srbtail->next = srb;
  840. else
  841. d->srbhead = srb;
  842. d->srbtail = srb;
  843. return;
  844. }
  845. d->nsrb++;
  846. for(i=0; i<nelem(d->srb); i++)
  847. if(d->srb[i] == nil)
  848. break;
  849. if(i == nelem(d->srb))
  850. panic("sdmv50xx: no free srbs");
  851. d->intick = MACHP(0)->ticks;
  852. d->srb[i] = srb;
  853. edma = d->edma;
  854. tx = (Tx*)KADDR(edma->txi);
  855. tx->flag = (i<<1) | (srb->req == SRBread);
  856. prd = KADDR(tx->prdpa);
  857. prd->pa = PADDR(srb->data);
  858. prd->count = srb->count;
  859. prd->flag = PRDeot;
  860. mvsatarequest(tx->regs, srb, d->flag&Dext);
  861. coherence();
  862. edma->txi = advance(edma->txi, 5);
  863. d->intick = MACHP(0)->ticks;
  864. }
  865. enum{
  866. Rpidx = 0x1f<<3,
  867. };
  868. static void
  869. completesrb(Drive *d)
  870. {
  871. Edma *edma;
  872. Rx *rx;
  873. Srb *srb;
  874. edma = d->edma;
  875. if((edma->ctl & eEnEDMA) == 0)
  876. return;
  877. while((edma->rxo&Rpidx) != (edma->rxi&Rpidx)){
  878. rx = (Rx*)KADDR(edma->rxo);
  879. if(srb = d->srb[rx->cid]){
  880. d->srb[rx->cid] = nil;
  881. d->nsrb--;
  882. if(rx->cDevSts & ATAbad)
  883. srb->flag |= SFerror;
  884. if (rx->cEdmaSts)
  885. iprint("cEdmaSts: %02ux\n", rx->cEdmaSts);
  886. srb->sta = rx->cDevSts;
  887. srb->flag |= SFdone;
  888. wakeup(srb);
  889. }else
  890. iprint("srb missing\n");
  891. edma->rxo = advance(edma->rxo, 3);
  892. if(srb = d->srbhead){
  893. d->srbhead = srb->next;
  894. startsrb(d, srb);
  895. }
  896. }
  897. }
  898. static int
  899. srbdone(void *v)
  900. {
  901. Srb *srb;
  902. srb = v;
  903. return srb->flag & SFdone;
  904. }
  905. /*
  906. * Interrupts
  907. */
  908. static void
  909. mv50interrupt(Ureg*, void *a)
  910. {
  911. int i;
  912. ulong cause;
  913. Ctlr *ctlr;
  914. Drive *drive;
  915. ctlr = a;
  916. ilock(ctlr);
  917. cause = ctlr->lmmio[0x1d60/4];
  918. // dprint("sd%c: mv50interrupt: 0x%lux\n", ctlr->sdev->idno, cause);
  919. for(i=0; i<ctlr->ndrive; i++)
  920. if(cause & (3<<(i*2+i/4))){
  921. drive = &ctlr->drive[i];
  922. if(drive->edma == 0)
  923. continue; // not ready yet.
  924. ilock(drive);
  925. updatedrive(drive);
  926. while(ctlr->chip[i/4].arb->ic & (0x0101 << (i%4))){
  927. ctlr->chip[i/4].arb->ic = ~(0x101 << (i%4));
  928. completesrb(drive);
  929. }
  930. iunlock(drive);
  931. }
  932. iunlock(ctlr);
  933. }
  934. enum{
  935. Nms = 256,
  936. Midwait = 16*1024/Nms-1,
  937. Mphywait = 512/Nms-1,
  938. };
  939. static void
  940. westerndigitalhung(Drive *d)
  941. {
  942. Edma *e;
  943. e = d->edma;
  944. if(d->srb
  945. && TK2MS(MACHP(0)->ticks-d->intick) > 5*1000
  946. && (e->rxo&Rpidx) == (e->rxi&Rpidx)){
  947. dprint("westerndigital drive hung; resetting\n");
  948. d->state = Dreset;
  949. }
  950. }
  951. static void
  952. checkdrive(Drive *d, int i)
  953. {
  954. static ulong s, olds[NCtlr*NCtlrdrv];
  955. char *name;
  956. ilock(d);
  957. name = d->unit->name;
  958. s = d->bridge->status;
  959. if(s != olds[i]){
  960. dprint("%s: status: %08lx -> %08lx: %s\n", name, olds[i], s, diskstates[d->state]);
  961. olds[i] = s;
  962. }
  963. // westerndigitalhung(d);
  964. switch(d->state){
  965. case Dnew:
  966. case Dmissing:
  967. switch(s){
  968. case 0x000:
  969. break;
  970. default:
  971. dprint("%s: unknown state %8lx\n", name, s);
  972. case 0x100:
  973. if(++d->wait&Mphywait)
  974. break;
  975. reset: d->mode ^= 1;
  976. dprint("%s: reset; new mode %d\n", name, d->mode);
  977. resetdisk(d);
  978. break;
  979. case 0x123:
  980. case 0x113:
  981. s = d->edma->cmdstat;
  982. if(s == 0x7f || (s&~ATAobs) != ATAdrdy){
  983. if((++d->wait&Midwait) == 0)
  984. goto reset;
  985. }else if(identifydrive(d) == -1)
  986. goto reset;
  987. }
  988. break;
  989. case Dready:
  990. if(s != 0)
  991. break;
  992. iprint("%s: pulled: st=%08ulx\n", name, s); // never happens
  993. case Dreset:
  994. case Derror:
  995. dprint("%s reset: mode %d\n", name, d->mode);
  996. resetdisk(d);
  997. break;
  998. }
  999. iunlock(d);
  1000. }
  1001. static void
  1002. satakproc(void*)
  1003. {
  1004. int i;
  1005. while(waserror())
  1006. ;
  1007. for(;;){
  1008. tsleep(&up->sleep, return0, 0, Nms);
  1009. for(i = 0; i < nmvsatadrive; i++)
  1010. checkdrive(mvsatadrive[i], i);
  1011. }
  1012. }
  1013. /*
  1014. * Device discovery
  1015. */
  1016. static SDev*
  1017. mv50pnp(void)
  1018. {
  1019. int i, nunit;
  1020. uchar *base;
  1021. ulong io, n, *mem;
  1022. Ctlr *ctlr;
  1023. Pcidev *p;
  1024. SDev *head, *tail, *sdev;
  1025. Drive *d;
  1026. static int ctlrno, done;
  1027. dprint("mv50pnp\n");
  1028. if(done++)
  1029. return nil;
  1030. p = nil;
  1031. head = nil;
  1032. tail = nil;
  1033. while((p = pcimatch(p, 0x11ab, 0)) != nil){
  1034. switch(p->did){
  1035. case 0x5040:
  1036. case 0x5041:
  1037. case 0x5080:
  1038. case 0x5081:
  1039. case 0x6041:
  1040. case 0x6081:
  1041. break;
  1042. default:
  1043. print("mv50pnp: unknown did %ux ignored\n", (ushort)p->did);
  1044. continue;
  1045. }
  1046. if (ctlrno >= NCtlr) {
  1047. print("mv50pnp: too many controllers\n");
  1048. break;
  1049. }
  1050. nunit = (p->did&0xf0) >> 4;
  1051. print("Marvell 88SX%ux: %d SATA-%s ports with%s flash\n",
  1052. (ushort)p->did, nunit,
  1053. ((p->did&0xf000)==0x6000? "II": "I"),
  1054. (p->did&1? "": "out"));
  1055. if((sdev = malloc(sizeof(SDev))) == nil)
  1056. continue;
  1057. if((ctlr = malloc(sizeof(Ctlr))) == nil){
  1058. free(sdev);
  1059. continue;
  1060. }
  1061. memset(sdev, 0, sizeof *sdev);
  1062. memset(ctlr, 0, sizeof *ctlr);
  1063. io = p->mem[0].bar & ~0x0F;
  1064. mem = (ulong*)vmap(io, p->mem[0].size);
  1065. if(mem == 0){
  1066. print("sdmv50xx: address 0x%luX in use\n", io);
  1067. free(sdev);
  1068. free(ctlr);
  1069. continue;
  1070. }
  1071. ctlr->rid = p->rid;
  1072. // avert thine eyes! (what does this do?)
  1073. mem[0x104f0/4] = 0;
  1074. ctlr->type = (p->did >> 12) & 3;
  1075. if(ctlr->type == 1){
  1076. n = mem[0xc00/4];
  1077. n &= ~(3<<4);
  1078. mem[0xc00/4] = n;
  1079. }
  1080. sdev->ifc = &sdmv50xxifc;
  1081. sdev->ctlr = ctlr;
  1082. sdev->nunit = nunit;
  1083. sdev->idno = 'E';
  1084. ctlr->sdev = sdev;
  1085. ctlr->irq = p->intl;
  1086. ctlr->tbdf = p->tbdf;
  1087. ctlr->pcidev = p;
  1088. ctlr->lmmio = mem;
  1089. ctlr->mmio = (uchar*)mem;
  1090. ctlr->nchip = (nunit+3)/4;
  1091. ctlr->ndrive = nunit;
  1092. ctlr->enabled = 0;
  1093. for(i = 0; i < ctlr->nchip; i++){
  1094. base = ctlr->mmio+0x20000+0x10000*i;
  1095. ctlr->chip[i].arb = (Arb*)base;
  1096. ctlr->chip[i].edma = (Edma*)(base + 0x2000);
  1097. }
  1098. for (i = 0; i < nunit; i++) {
  1099. d = &ctlr->drive[i];
  1100. d->sectors = 0;
  1101. d->ctlr = ctlr;
  1102. d->driveno = ctlrno*NCtlrdrv + i;
  1103. d->chipx = i%4;
  1104. d->chip = &ctlr->chip[i/4];
  1105. d->edma = &d->chip->edma[d->chipx];
  1106. mvsatadrive[d->driveno] = d;
  1107. }
  1108. nmvsatadrive += nunit;
  1109. ctlrno++;
  1110. if(head)
  1111. tail->next = sdev;
  1112. else
  1113. head = sdev;
  1114. tail = sdev;
  1115. }
  1116. return head;
  1117. }
  1118. /*
  1119. * Enable the controller. Each disk has its own interrupt mask,
  1120. * and those get enabled as the disks are brought online.
  1121. */
  1122. static int
  1123. mv50enable(SDev *sdev)
  1124. {
  1125. char name[32];
  1126. Ctlr *ctlr;
  1127. dprint("sd%c: enable\n", sdev->idno);
  1128. ctlr = sdev->ctlr;
  1129. if (ctlr->enabled)
  1130. return 1;
  1131. snprint(name, sizeof name, "%s (%s)", sdev->name, sdev->ifc->name);
  1132. intrenable(ctlr->irq, mv50interrupt, ctlr, ctlr->tbdf, name);
  1133. ctlr->enabled = 1;
  1134. return 1;
  1135. }
  1136. /*
  1137. * Disable the controller.
  1138. */
  1139. static int
  1140. mv50disable(SDev *sdev)
  1141. {
  1142. char name[32];
  1143. int i;
  1144. Ctlr *ctlr;
  1145. Drive *drive;
  1146. dprint("sd%c: disable\n", sdev->idno);
  1147. ctlr = sdev->ctlr;
  1148. ilock(ctlr);
  1149. for(i=0; i<ctlr->sdev->nunit; i++){
  1150. drive = &ctlr->drive[i];
  1151. ilock(drive);
  1152. disabledrive(drive);
  1153. iunlock(drive);
  1154. }
  1155. iunlock(ctlr);
  1156. snprint(name, sizeof name, "%s (%s)", sdev->name, sdev->ifc->name);
  1157. intrdisable(ctlr->irq, mv50interrupt, ctlr, ctlr->tbdf, name);
  1158. return 0;
  1159. }
  1160. /*
  1161. * Clean up all disk structures. Already disabled.
  1162. * Could keep count of number of allocated controllers
  1163. * and free the srblist when it drops to zero.
  1164. */
  1165. static void
  1166. mv50clear(SDev *sdev)
  1167. {
  1168. int i;
  1169. Ctlr *ctlr;
  1170. Drive *d;
  1171. dprint("sd%c: clear\n", sdev->idno);
  1172. ctlr = sdev->ctlr;
  1173. for(i=0; i<ctlr->ndrive; i++){
  1174. d = &ctlr->drive[i];
  1175. free(d->tx);
  1176. free(d->rx);
  1177. free(d->prd);
  1178. }
  1179. free(ctlr);
  1180. }
  1181. /*
  1182. * Check that there is a disk or at least a hot swap bay in the drive.
  1183. */
  1184. static int
  1185. mv50verify(SDunit *unit)
  1186. {
  1187. Ctlr *ctlr;
  1188. Drive *drive;
  1189. int i;
  1190. dprint("%s: verify\n", unit->name);
  1191. ctlr = unit->dev->ctlr;
  1192. drive = &ctlr->drive[unit->subno];
  1193. ilock(ctlr);
  1194. ilock(drive);
  1195. i = configdrive(ctlr, drive, unit);
  1196. iunlock(drive);
  1197. iunlock(ctlr);
  1198. /*
  1199. * If ctlr->type == 1, then the drives spin up whenever
  1200. * the controller feels like it; if ctlr->type != 1, then
  1201. * they spin up as a result of configdrive.
  1202. *
  1203. * If there is a drive in the slot, give it 1.5s to spin up
  1204. * before returning. There is a noticeable drag on the
  1205. * power supply when spinning up fifteen drives
  1206. * all at once (like in the Coraid enclosures).
  1207. */
  1208. if(ctlr->type != 1 && i == 0){
  1209. if(!waserror()){
  1210. tsleep(&up->sleep, return0, 0, 1500);
  1211. poperror();
  1212. }
  1213. }
  1214. return 1;
  1215. }
  1216. /*
  1217. * Check whether the disk is online.
  1218. */
  1219. static int
  1220. mv50online(SDunit *unit)
  1221. {
  1222. Ctlr *ctlr;
  1223. Drive *d;
  1224. int r, s0;
  1225. static int once;
  1226. if(once++ == 0)
  1227. kproc("mvsata", satakproc, 0);
  1228. ctlr = unit->dev->ctlr;
  1229. d = &ctlr->drive[unit->subno];
  1230. r = 0;
  1231. ilock(d);
  1232. s0 = d->state;
  1233. USED(s0);
  1234. if(d->state == Dnew)
  1235. identifydrive(d);
  1236. if(d->mediachange){
  1237. idprint("%s: online: %s -> %s\n", unit->name, diskstates[s0], diskstates[d->state]);
  1238. r = 2;
  1239. unit->sectors = d->sectors;
  1240. unit->secsize = 512;
  1241. d->mediachange = 0;
  1242. } else if(d->state == Dready)
  1243. r = 1;
  1244. iunlock(d);
  1245. return r;
  1246. }
  1247. /*
  1248. * Register dumps
  1249. */
  1250. typedef struct Regs Regs;
  1251. struct Regs
  1252. {
  1253. ulong offset;
  1254. char *name;
  1255. };
  1256. static Regs regsctlr[] =
  1257. {
  1258. 0x0C28, "pci serr# mask",
  1259. 0x1D40, "pci err addr low",
  1260. 0x1D44, "pci err addr hi",
  1261. 0x1D48, "pci err attr",
  1262. 0x1D50, "pci err cmd",
  1263. 0x1D58, "pci intr cause",
  1264. 0x1D5C, "pci mask cause",
  1265. 0x1D60, "device micr",
  1266. 0x1D64, "device mimr",
  1267. };
  1268. static Regs regsarb[] =
  1269. {
  1270. 0x0004, "arb rqop",
  1271. 0x0008, "arb rqip",
  1272. 0x000C, "arb ict",
  1273. 0x0010, "arb itt",
  1274. 0x0014, "arb ic",
  1275. 0x0018, "arb btc",
  1276. 0x001C, "arb bts",
  1277. 0x0020, "arb bpc",
  1278. };
  1279. static Regs regsbridge[] =
  1280. {
  1281. 0x0000, "bridge status",
  1282. 0x0004, "bridge serror",
  1283. 0x0008, "bridge sctrl",
  1284. 0x000C, "bridge phyctrl",
  1285. 0x003C, "bridge ctrl",
  1286. 0x0074, "bridge phymode",
  1287. };
  1288. static Regs regsedma[] =
  1289. {
  1290. 0x0000, "edma config",
  1291. 0x0004, "edma timer",
  1292. 0x0008, "edma iec",
  1293. 0x000C, "edma iem",
  1294. 0x0010, "edma txbasehi",
  1295. 0x0014, "edma txi",
  1296. 0x0018, "edma txo",
  1297. 0x001C, "edma rxbasehi",
  1298. 0x0020, "edma rxi",
  1299. 0x0024, "edma rxo",
  1300. 0x0028, "edma c",
  1301. 0x002C, "edma tc",
  1302. 0x0030, "edma status",
  1303. 0x0034, "edma iordyto",
  1304. /* 0x0100, "edma pio",
  1305. 0x0104, "edma err",
  1306. 0x0108, "edma sectors",
  1307. 0x010C, "edma lba0",
  1308. 0x0110, "edma lba1",
  1309. 0x0114, "edma lba2",
  1310. 0x0118, "edma lba3",
  1311. 0x011C, "edma cmdstat",
  1312. 0x0120, "edma altstat",
  1313. */
  1314. };
  1315. static char*
  1316. rdregs(char *p, char *e, void *base, Regs *r, int n, char *prefix)
  1317. {
  1318. int i;
  1319. for(i=0; i<n; i++)
  1320. p = seprint(p, e, "%s%s%-19s %.8ux\n",
  1321. prefix ? prefix : "", prefix ? ": " : "",
  1322. r[i].name, *(u32int*)((uchar*)base+r[i].offset));
  1323. return p;
  1324. }
  1325. static char*
  1326. rdinfo(char *p, char *e, ushort *info)
  1327. {
  1328. int i;
  1329. p = seprint(p, e, "info");
  1330. for(i=0; i<256; i++){
  1331. p = seprint(p, e, "%s%.4ux%s",
  1332. i%8==0 ? "\t" : "",
  1333. info[i],
  1334. i%8==7 ? "\n" : "");
  1335. }
  1336. return p;
  1337. }
  1338. static int
  1339. mv50rctl(SDunit *unit, char *p, int l)
  1340. {
  1341. char *e, *op;
  1342. Ctlr *ctlr;
  1343. Drive *drive;
  1344. if((ctlr = unit->dev->ctlr) == nil)
  1345. return 0;
  1346. drive = &ctlr->drive[unit->subno];
  1347. e = p+l;
  1348. op = p;
  1349. if(drive->state == Dready){
  1350. p = seprint(p, e, "model %s\n", drive->model);
  1351. p = seprint(p, e, "serial %s\n", drive->serial);
  1352. p = seprint(p, e, "firmware %s\n", drive->firmware);
  1353. }else
  1354. p = seprint(p, e, "no disk present\n");
  1355. p = seprint(p, e, "geometry %llud 512\n", drive->sectors);
  1356. p = rdinfo(p, e, drive->info);
  1357. p = rdregs(p, e, drive->chip->arb, regsarb, nelem(regsarb), nil);
  1358. p = rdregs(p, e, drive->bridge, regsbridge, nelem(regsbridge), nil);
  1359. p = rdregs(p, e, drive->edma, regsedma, nelem(regsedma), nil);
  1360. return p-op;
  1361. }
  1362. static int
  1363. mv50wctl(SDunit *unit, Cmdbuf *cb)
  1364. {
  1365. Ctlr *ctlr;
  1366. Drive *drive;
  1367. USED(unit);
  1368. if(strcmp(cb->f[0], "reset") == 0){
  1369. ctlr = unit->dev->ctlr;
  1370. drive = &ctlr->drive[unit->subno];
  1371. ilock(drive);
  1372. drive->state = Dreset;
  1373. iunlock(drive);
  1374. return 0;
  1375. }
  1376. cmderror(cb, Ebadctl);
  1377. return -1;
  1378. }
  1379. static char*
  1380. mv50rtopctl(SDev *sdev, char *p, char *e)
  1381. {
  1382. char name[10];
  1383. Ctlr *ctlr;
  1384. ctlr = sdev->ctlr;
  1385. if(ctlr == nil)
  1386. return p;
  1387. snprint(name, sizeof name, "sd%c", sdev->idno);
  1388. p = rdregs(p, e, ctlr->mmio, regsctlr, nelem(regsctlr), name);
  1389. /* info for first disk */
  1390. p = rdregs(p, e, ctlr->chip[0].arb, regsarb, nelem(regsarb), name);
  1391. p = rdregs(p, e, &ctlr->chip[0].arb->bridge[0], regsbridge, nelem(regsbridge), name);
  1392. p = rdregs(p, e, &ctlr->chip[0].edma[0], regsedma, nelem(regsedma), name);
  1393. return p;
  1394. }
  1395. static int
  1396. waitready(Drive *d)
  1397. {
  1398. ulong s, i;
  1399. for(i = 0; i < 120; i++){
  1400. ilock(d);
  1401. s = d->bridge->status;
  1402. iunlock(d);
  1403. if(s == 0)
  1404. return SDeio;
  1405. if (d->state == Dready)
  1406. return SDok;
  1407. if ((i+1)%60 == 0){
  1408. ilock(d);
  1409. resetdisk(d);
  1410. iunlock(d);
  1411. }
  1412. if(!waserror()){
  1413. tsleep(&up->sleep, return0, 0, 1000);
  1414. poperror();
  1415. }
  1416. }
  1417. print("%s: not responding after 2 minutes\n", d->unit->name);
  1418. return SDeio;
  1419. }
  1420. static int
  1421. mv50rio(SDreq *r)
  1422. {
  1423. int count, max, n, status, try, flag;
  1424. uchar *cmd, *data;
  1425. uvlong lba;
  1426. Ctlr *ctlr;
  1427. Drive *drive;
  1428. SDunit *unit;
  1429. Srb *srb;
  1430. unit = r->unit;
  1431. ctlr = unit->dev->ctlr;
  1432. drive = &ctlr->drive[unit->subno];
  1433. cmd = r->cmd;
  1434. if((status = sdfakescsi(r, drive->info, sizeof drive->info)) != SDnostatus){
  1435. /* XXX check for SDcheck here */
  1436. r->status = status;
  1437. return status;
  1438. }
  1439. switch(cmd[0]){
  1440. case 0x28: /* read */
  1441. case 0x2A: /* write */
  1442. break;
  1443. default:
  1444. iprint("%s: bad cmd 0x%.2ux\n", drive->unit->name, cmd[0]);
  1445. r->status = SDcheck;
  1446. return SDcheck;
  1447. }
  1448. lba = (cmd[2]<<24)|(cmd[3]<<16)|(cmd[4]<<8)|cmd[5];
  1449. count = (cmd[7]<<8)|cmd[8];
  1450. if(r->data == nil)
  1451. return SDok;
  1452. if(r->dlen < count*unit->secsize)
  1453. count = r->dlen/unit->secsize;
  1454. try = 0;
  1455. retry:
  1456. if(waitready(drive) != SDok)
  1457. return SDeio;
  1458. /*
  1459. * Could arrange here to have an Srb always outstanding:
  1460. *
  1461. * lsrb = nil;
  1462. * while(count > 0 || lsrb != nil){
  1463. * srb = nil;
  1464. * if(count > 0){
  1465. * srb = issue next srb;
  1466. * }
  1467. * if(lsrb){
  1468. * sleep on lsrb and handle it
  1469. * }
  1470. * }
  1471. *
  1472. * On the disks I tried, this didn't help. If anything,
  1473. * it's a little slower. -rsc
  1474. */
  1475. data = r->data;
  1476. while(count > 0){
  1477. /*
  1478. * Max is 128 sectors (64kB) because prd->count is 16 bits.
  1479. */
  1480. max = 128;
  1481. n = count;
  1482. if(n > max)
  1483. n = max;
  1484. if((drive->edma->ctl&eEnEDMA) == 0)
  1485. goto tryagain;
  1486. srb = srbrw(cmd[0]==0x28 ? SRBread : SRBwrite, drive, data, n, lba);
  1487. ilock(drive);
  1488. startsrb(drive, srb);
  1489. iunlock(drive);
  1490. /* Don't let user interrupt DMA. */
  1491. while(waserror())
  1492. ;
  1493. sleep(srb, srbdone, srb);
  1494. poperror();
  1495. flag = srb->flag;
  1496. freesrb(srb);
  1497. if(flag == 0){
  1498. tryagain: if(++try == 10){
  1499. print("%s: bad disk\n", drive->unit->name);
  1500. return SDeio;
  1501. }
  1502. dprint("%s: retry\n", drive->unit->name);
  1503. if(!waserror()){
  1504. tsleep(&up->sleep, return0, 0, 1000);
  1505. poperror();
  1506. }
  1507. goto retry;
  1508. }
  1509. if(flag & SFerror){
  1510. print("%s: i/o error\n", drive->unit->name);
  1511. return SDeio;
  1512. }
  1513. count -= n;
  1514. lba += n;
  1515. data += n*unit->secsize;
  1516. }
  1517. r->rlen = data - (uchar*)r->data;
  1518. return SDok;
  1519. }
  1520. SDifc sdmv50xxifc = {
  1521. "mv50xx", /* name */
  1522. mv50pnp, /* pnp */
  1523. nil, /* legacy */
  1524. mv50enable, /* enable */
  1525. mv50disable, /* disable */
  1526. mv50verify, /* verify */
  1527. mv50online, /* online */
  1528. mv50rio, /* rio */
  1529. mv50rctl, /* rctl */
  1530. mv50wctl, /* wctl */
  1531. scsibio, /* bio */
  1532. nil, /* probe */
  1533. mv50clear, /* clear */
  1534. mv50rtopctl, /* rtopctl */
  1535. };
  1536. /*
  1537. * The original driver on which this one is based came with the
  1538. * following notice:
  1539. *
  1540. * Copyright 2005
  1541. * Coraid, Inc.
  1542. *
  1543. * This software is provided `as-is,' without any express or implied
  1544. * warranty. In no event will the author be held liable for any damages
  1545. * arising from the use of this software.
  1546. *
  1547. * Permission is granted to anyone to use this software for any purpose,
  1548. * including commercial applications, and to alter it and redistribute it
  1549. * freely, subject to the following restrictions:
  1550. *
  1551. * 1. The origin of this software must not be misrepresented; you must
  1552. * not claim that you wrote the original software. If you use this
  1553. * software in a product, an acknowledgment in the product documentation
  1554. * would be appreciated but is not required.
  1555. *
  1556. * 2. Altered source versions must be plainly marked as such, and must
  1557. * not be misrepresented as being the original software.
  1558. *
  1559. * 3. This notice may not be removed or altered from any source
  1560. * distribution.
  1561. */