xref: /plan9-contrib/sys/src/9/port/portusbehci.h (revision e986649ea05d15cf020f4212d51bd136f7bd0f33)
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