15bdeb9a2SDavid du Colombier /* 2*e986649eSDavid du Colombier * EHCI portable hardware definitions 35bdeb9a2SDavid du Colombier */ 45bdeb9a2SDavid du Colombier 55bdeb9a2SDavid du Colombier typedef struct Ecapio Ecapio; 65bdeb9a2SDavid du Colombier typedef struct Edbgio Edbgio; 75bdeb9a2SDavid du Colombier 85bdeb9a2SDavid du Colombier #pragma incomplete Ecapio; 95bdeb9a2SDavid du Colombier #pragma incomplete Edbgio; 105bdeb9a2SDavid du Colombier 115bdeb9a2SDavid du Colombier /* 125bdeb9a2SDavid du Colombier * EHCI interface registers and bits 135bdeb9a2SDavid du Colombier */ 145bdeb9a2SDavid du Colombier enum 155bdeb9a2SDavid du Colombier { 165bdeb9a2SDavid du Colombier /* Ecapio->parms reg. */ 175bdeb9a2SDavid du Colombier Cnports = 0xF, /* nport bits */ 185bdeb9a2SDavid du Colombier Cdbgportshift = 20, /* debug port */ 195bdeb9a2SDavid du Colombier Cdbgportmask = 0xF, 205bdeb9a2SDavid du Colombier 215bdeb9a2SDavid du Colombier /* Ecapio->capparms bits */ 225bdeb9a2SDavid du Colombier C64 = 1<<0, /* 64-bits */ 235bdeb9a2SDavid du Colombier Cpfl = 1<<1, /* program'ble frame list: can be <1024 */ 245bdeb9a2SDavid du Colombier Casp = 1<<2, /* asynch. sched. park */ 255bdeb9a2SDavid du Colombier Ceecpshift = 8, /* extended capabilities ptr. */ 265bdeb9a2SDavid du Colombier Ceecpmask = (1<<8) - 1, 275bdeb9a2SDavid du Colombier 285bdeb9a2SDavid du Colombier Clegacy = 1, /* legacy support cap. id */ 295bdeb9a2SDavid du Colombier CLbiossem = 2, /* legacy cap. bios sem. */ 305bdeb9a2SDavid du Colombier CLossem = 3, /* legacy cap. os sem */ 315bdeb9a2SDavid du Colombier CLcontrol = 4, /* legacy support control & status */ 325bdeb9a2SDavid du Colombier 335bdeb9a2SDavid du Colombier /* typed links */ 345bdeb9a2SDavid du Colombier Lterm = 1, 355bdeb9a2SDavid du Colombier Litd = 0<<1, 365bdeb9a2SDavid du Colombier Lqh = 1<<1, 375bdeb9a2SDavid du Colombier Lsitd = 2<<1, 385bdeb9a2SDavid du Colombier Lfstn = 3<<1, /* we don't use these */ 395bdeb9a2SDavid du Colombier 405bdeb9a2SDavid du Colombier /* Cmd reg. */ 415bdeb9a2SDavid du Colombier Cstop = 0x00000, /* stop running */ 425bdeb9a2SDavid du Colombier Crun = 0x00001, /* start operation */ 435bdeb9a2SDavid du Colombier Chcreset = 0x00002, /* host controller reset */ 445bdeb9a2SDavid du Colombier Cflsmask = 0x0000C, /* frame list size bits */ 455bdeb9a2SDavid du Colombier Cfls1024 = 0x00000, /* frame list size 1024 */ 465bdeb9a2SDavid du Colombier Cfls512 = 0x00004, /* frame list size 512 frames */ 475bdeb9a2SDavid du Colombier Cfls256 = 0x00008, /* frame list size 256 frames */ 485bdeb9a2SDavid du Colombier Cpse = 0x00010, /* periodic sched. enable */ 495bdeb9a2SDavid du Colombier Case = 0x00020, /* async sched. enable */ 505bdeb9a2SDavid du Colombier Ciasync = 0x00040, /* interrupt on async advance doorbell */ 515bdeb9a2SDavid du Colombier /* interrupt threshold ctl. in µframes (1-32 in powers of 2) */ 525bdeb9a2SDavid du Colombier Citcshift = 16, 535bdeb9a2SDavid du Colombier Citcmask = 0xff << Citcshift, 545bdeb9a2SDavid du Colombier 555bdeb9a2SDavid du Colombier /* Sts reg. */ 565bdeb9a2SDavid du Colombier Sasyncss = 0x08000, /* aync schedule status */ 575bdeb9a2SDavid du Colombier Speriodss = 0x04000, /* periodic schedule status */ 585bdeb9a2SDavid du Colombier Srecl = 0x02000, /* reclamnation (empty async sched.) */ 595bdeb9a2SDavid du Colombier Shalted = 0x01000, /* h.c. is halted */ 605bdeb9a2SDavid du Colombier Sasync = 0x00020, /* interrupt on async advance */ 615bdeb9a2SDavid du Colombier Sherr = 0x00010, /* host system error */ 625bdeb9a2SDavid du Colombier Sfrroll = 0x00008, /* frame list roll over */ 635bdeb9a2SDavid du Colombier Sportchg = 0x00004, /* port change detect */ 645bdeb9a2SDavid du Colombier Serrintr = 0x00002, /* error interrupt */ 655bdeb9a2SDavid du Colombier Sintr = 0x00001, /* interrupt */ 665bdeb9a2SDavid du Colombier Sintrs = 0x0003F, /* interrupts status */ 675bdeb9a2SDavid du Colombier 685bdeb9a2SDavid du Colombier /* Intr reg. */ 695bdeb9a2SDavid du Colombier Iusb = 0x01, /* intr. on usb */ 705bdeb9a2SDavid du Colombier Ierr = 0x02, /* intr. on usb error */ 715bdeb9a2SDavid du Colombier Iportchg = 0x04, /* intr. on port change */ 725bdeb9a2SDavid du Colombier Ifrroll = 0x08, /* intr. on frlist roll over */ 735bdeb9a2SDavid du Colombier Ihcerr = 0x10, /* intr. on host error */ 745bdeb9a2SDavid du Colombier Iasync = 0x20, /* intr. on async advance enable */ 755bdeb9a2SDavid du Colombier Iall = 0x3F, /* all interrupts */ 765bdeb9a2SDavid du Colombier 775bdeb9a2SDavid du Colombier /* Config reg. */ 785bdeb9a2SDavid du Colombier Callmine = 1, /* route all ports to us */ 795bdeb9a2SDavid du Colombier 805bdeb9a2SDavid du Colombier /* Portsc reg. */ 815bdeb9a2SDavid du Colombier Pspresent = 0x00000001, /* device present */ 825bdeb9a2SDavid du Colombier Psstatuschg = 0x00000002, /* Pspresent changed */ 835bdeb9a2SDavid du Colombier Psenable = 0x00000004, /* device enabled */ 845bdeb9a2SDavid du Colombier Pschange = 0x00000008, /* Psenable changed */ 855bdeb9a2SDavid du Colombier Psresume = 0x00000040, /* resume detected */ 865bdeb9a2SDavid du Colombier Pssuspend = 0x00000080, /* port suspended */ 875bdeb9a2SDavid du Colombier Psreset = 0x00000100, /* port reset */ 885bdeb9a2SDavid du Colombier Pspower = 0x00001000, /* port power on */ 895bdeb9a2SDavid du Colombier Psowner = 0x00002000, /* port owned by companion */ 905bdeb9a2SDavid du Colombier Pslinemask = 0x00000C00, /* line status bits */ 915bdeb9a2SDavid du Colombier Pslow = 0x00000400, /* low speed device */ 925bdeb9a2SDavid du Colombier 935bdeb9a2SDavid du Colombier /* Debug port csw reg. */ 945bdeb9a2SDavid du Colombier Cowner = 0x40000000, /* port owned by ehci */ 955bdeb9a2SDavid du Colombier Cenable = 0x10000000, /* debug port enabled */ 965bdeb9a2SDavid du Colombier Cdone = 0x00010000, /* request is done */ 975bdeb9a2SDavid du Colombier Cbusy = 0x00000400, /* port in use by a driver */ 985bdeb9a2SDavid du Colombier Cerrmask= 0x00000380, /* error code bits */ 995bdeb9a2SDavid du Colombier Chwerr = 0x00000100, /* hardware error */ 1005bdeb9a2SDavid du Colombier Cterr = 0x00000080, /* transaction error */ 1015bdeb9a2SDavid du Colombier Cfailed = 0x00000040, /* transaction did fail */ 1025bdeb9a2SDavid du Colombier Cgo = 0x00000020, /* execute the transaction */ 1035bdeb9a2SDavid du Colombier Cwrite = 0x00000010, /* request is a write */ 1045bdeb9a2SDavid du Colombier Clen = 0x0000000F, /* data len */ 1055bdeb9a2SDavid du Colombier 1065bdeb9a2SDavid du Colombier /* Debug port pid reg. */ 1075bdeb9a2SDavid du Colombier Prpidshift = 16, /* received pid */ 1085bdeb9a2SDavid du Colombier Prpidmask = 0xFF, 1095bdeb9a2SDavid du Colombier Pspidshift = 8, /* sent pid */ 1105bdeb9a2SDavid du Colombier Pspidmask = 0xFF, 1115bdeb9a2SDavid du Colombier Ptokshift = 0, /* token pid */ 1125bdeb9a2SDavid du Colombier Ptokmask = 0xFF, 1135bdeb9a2SDavid du Colombier 1145bdeb9a2SDavid du Colombier Ptoggle = 0x00008800, /* to update toggles */ 1155bdeb9a2SDavid du Colombier Ptogglemask = 0x0000FF00, 1165bdeb9a2SDavid du Colombier 1175bdeb9a2SDavid du Colombier /* Debug port addr reg. */ 1185bdeb9a2SDavid du Colombier Adevshift = 8, /* device address */ 1195bdeb9a2SDavid du Colombier Adevmask = 0x7F, 1205bdeb9a2SDavid du Colombier Aepshift = 0, /* endpoint number */ 1215bdeb9a2SDavid du Colombier Aepmask = 0xF, 1225bdeb9a2SDavid du Colombier }; 1235bdeb9a2SDavid du Colombier 1245bdeb9a2SDavid du Colombier /* 1255bdeb9a2SDavid du Colombier * Capability registers (hw) 1265bdeb9a2SDavid du Colombier */ 1275bdeb9a2SDavid du Colombier struct Ecapio 1285bdeb9a2SDavid du Colombier { 1295bdeb9a2SDavid du Colombier ulong cap; /* 00 controller capability register */ 1305bdeb9a2SDavid du Colombier ulong parms; /* 04 structural parameters register */ 1315bdeb9a2SDavid du Colombier ulong capparms; /* 08 capability parameters */ 1325bdeb9a2SDavid du Colombier ulong portroute; /* 0c not on the CS5536 */ 1335bdeb9a2SDavid du Colombier }; 1345bdeb9a2SDavid du Colombier 1355bdeb9a2SDavid du Colombier /* 1365bdeb9a2SDavid du Colombier * Debug port registers (hw) 1375bdeb9a2SDavid du Colombier */ 1385bdeb9a2SDavid du Colombier struct Edbgio 1395bdeb9a2SDavid du Colombier { 1405bdeb9a2SDavid du Colombier ulong csw; /* control and status */ 1415bdeb9a2SDavid du Colombier ulong pid; /* USB pid */ 1425bdeb9a2SDavid du Colombier uchar data[8]; /* data buffer */ 1435bdeb9a2SDavid du Colombier ulong addr; /* device and endpoint addresses */ 1445bdeb9a2SDavid du Colombier }; 145