174a4d8c2SCharles.Forsyth /* 274a4d8c2SCharles.Forsyth * programmable interrupt vectors (for the 8259's) 374a4d8c2SCharles.Forsyth */ 474a4d8c2SCharles.Forsyth enum 574a4d8c2SCharles.Forsyth { 674a4d8c2SCharles.Forsyth Bptvec= 3, /* breakpoints */ 774a4d8c2SCharles.Forsyth Mathemuvec= 7, /* math coprocessor emulation interrupt */ 874a4d8c2SCharles.Forsyth Mathovervec= 9, /* math coprocessor overrun interrupt */ 974a4d8c2SCharles.Forsyth Matherr1vec= 16, /* math coprocessor error interrupt */ 1074a4d8c2SCharles.Forsyth Faultvec= 14, /* page fault */ 1174a4d8c2SCharles.Forsyth 1274a4d8c2SCharles.Forsyth Syscallvec= 64, 1374a4d8c2SCharles.Forsyth 1474a4d8c2SCharles.Forsyth VectorPIC = 24, /* external [A]PIC interrupts */ 1574a4d8c2SCharles.Forsyth VectorCLOCK = VectorPIC+0, 1674a4d8c2SCharles.Forsyth VectorKBD = VectorPIC+1, 1774a4d8c2SCharles.Forsyth VectorUART1 = VectorPIC+3, 1874a4d8c2SCharles.Forsyth VectorUART0 = VectorPIC+4, 1974a4d8c2SCharles.Forsyth VectorPCMCIA = VectorPIC+5, 2074a4d8c2SCharles.Forsyth VectorFLOPPY = VectorPIC+6, 2174a4d8c2SCharles.Forsyth VectorLPT = VectorPIC+7, 2274a4d8c2SCharles.Forsyth VectorIRQ7 = VectorPIC+7, 2374a4d8c2SCharles.Forsyth VectorAUX = VectorPIC+12, /* PS/2 port */ 2474a4d8c2SCharles.Forsyth VectorIRQ13 = VectorPIC+13, /* coprocessor on x386 */ 2574a4d8c2SCharles.Forsyth VectorATA0 = VectorPIC+14, 2674a4d8c2SCharles.Forsyth VectorATA1 = VectorPIC+15, 2774a4d8c2SCharles.Forsyth MaxVectorPIC = VectorPIC+15, 2874a4d8c2SCharles.Forsyth }; 2974a4d8c2SCharles.Forsyth 3074a4d8c2SCharles.Forsyth enum { 3174a4d8c2SCharles.Forsyth BusCBUS = 0, /* Corollary CBUS */ 3274a4d8c2SCharles.Forsyth BusCBUSII, /* Corollary CBUS II */ 3374a4d8c2SCharles.Forsyth BusEISA, /* Extended ISA */ 3474a4d8c2SCharles.Forsyth BusFUTURE, /* IEEE Futurebus */ 3574a4d8c2SCharles.Forsyth BusINTERN, /* Internal bus */ 3674a4d8c2SCharles.Forsyth BusISA, /* Industry Standard Architecture */ 3774a4d8c2SCharles.Forsyth BusMBI, /* Multibus I */ 3874a4d8c2SCharles.Forsyth BusMBII, /* Multibus II */ 3974a4d8c2SCharles.Forsyth BusMCA, /* Micro Channel Architecture */ 4074a4d8c2SCharles.Forsyth BusMPI, /* MPI */ 4174a4d8c2SCharles.Forsyth BusMPSA, /* MPSA */ 4274a4d8c2SCharles.Forsyth BusNUBUS, /* Apple Macintosh NuBus */ 4374a4d8c2SCharles.Forsyth BusPCI, /* Peripheral Component Interconnect */ 4474a4d8c2SCharles.Forsyth BusPCMCIA, /* PC Memory Card International Association */ 4574a4d8c2SCharles.Forsyth BusTC, /* DEC TurboChannel */ 4674a4d8c2SCharles.Forsyth BusVL, /* VESA Local bus */ 4774a4d8c2SCharles.Forsyth BusVME, /* VMEbus */ 4874a4d8c2SCharles.Forsyth BusXPRESS, /* Express System Bus */ 4974a4d8c2SCharles.Forsyth }; 5074a4d8c2SCharles.Forsyth 5174a4d8c2SCharles.Forsyth #define MKBUS(t,b,d,f) (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8)) 5274a4d8c2SCharles.Forsyth #define BUSFNO(tbdf) (((tbdf)>>8)&0x07) 5374a4d8c2SCharles.Forsyth #define BUSDNO(tbdf) (((tbdf)>>11)&0x1F) 5474a4d8c2SCharles.Forsyth #define BUSBNO(tbdf) (((tbdf)>>16)&0xFF) 5574a4d8c2SCharles.Forsyth #define BUSTYPE(tbdf) ((tbdf)>>24) 5674a4d8c2SCharles.Forsyth #define BUSBDF(tbdf) ((tbdf)&0x00FFFF00) 5774a4d8c2SCharles.Forsyth #define BUSUNKNOWN (-1) 5874a4d8c2SCharles.Forsyth 5974a4d8c2SCharles.Forsyth enum { 6074a4d8c2SCharles.Forsyth MaxEISA = 16, 6174a4d8c2SCharles.Forsyth CfgEISA = 0xC80, 6274a4d8c2SCharles.Forsyth }; 6374a4d8c2SCharles.Forsyth 6474a4d8c2SCharles.Forsyth /* 6574a4d8c2SCharles.Forsyth * PCI support code. 6674a4d8c2SCharles.Forsyth */ 6774a4d8c2SCharles.Forsyth enum { /* type 0 and type 1 pre-defined header */ 6874a4d8c2SCharles.Forsyth PciVID = 0x00, /* vendor ID */ 6974a4d8c2SCharles.Forsyth PciDID = 0x02, /* device ID */ 7074a4d8c2SCharles.Forsyth PciPCR = 0x04, /* command */ 7174a4d8c2SCharles.Forsyth PciPSR = 0x06, /* status */ 7274a4d8c2SCharles.Forsyth PciRID = 0x08, /* revision ID */ 7374a4d8c2SCharles.Forsyth PciCCRp = 0x09, /* programming interface class code */ 7474a4d8c2SCharles.Forsyth PciCCRu = 0x0A, /* sub-class code */ 7574a4d8c2SCharles.Forsyth PciCCRb = 0x0B, /* base class code */ 7674a4d8c2SCharles.Forsyth PciCLS = 0x0C, /* cache line size */ 7774a4d8c2SCharles.Forsyth PciLTR = 0x0D, /* latency timer */ 7874a4d8c2SCharles.Forsyth PciHDT = 0x0E, /* header type */ 7974a4d8c2SCharles.Forsyth PciBST = 0x0F, /* BIST */ 8074a4d8c2SCharles.Forsyth 8174a4d8c2SCharles.Forsyth PciBAR0 = 0x10, /* base address */ 8274a4d8c2SCharles.Forsyth PciBAR1 = 0x14, 8374a4d8c2SCharles.Forsyth 8474a4d8c2SCharles.Forsyth PciINTL = 0x3C, /* interrupt line */ 8574a4d8c2SCharles.Forsyth PciINTP = 0x3D, /* interrupt pin */ 8674a4d8c2SCharles.Forsyth }; 8774a4d8c2SCharles.Forsyth 88*8a8c2d74SCharles.Forsyth /* ccrb (base class code) values; controller types */ 89*8a8c2d74SCharles.Forsyth enum { 90*8a8c2d74SCharles.Forsyth Pcibcpci1 = 0, /* pci 1.0; no class codes defined */ 91*8a8c2d74SCharles.Forsyth Pcibcstore = 1, /* mass storage */ 92*8a8c2d74SCharles.Forsyth Pcibcnet = 2, /* network */ 93*8a8c2d74SCharles.Forsyth Pcibcdisp = 3, /* display */ 94*8a8c2d74SCharles.Forsyth Pcibcmmedia = 4, /* multimedia */ 95*8a8c2d74SCharles.Forsyth Pcibcmem = 5, /* memory */ 96*8a8c2d74SCharles.Forsyth Pcibcbridge = 6, /* bridge */ 97*8a8c2d74SCharles.Forsyth Pcibccomm = 7, /* simple comms (e.g., serial) */ 98*8a8c2d74SCharles.Forsyth Pcibcbasesys = 8, /* base system */ 99*8a8c2d74SCharles.Forsyth Pcibcinput = 9, /* input */ 100*8a8c2d74SCharles.Forsyth Pcibcdock = 0xa, /* docking stations */ 101*8a8c2d74SCharles.Forsyth Pcibcproc = 0xb, /* processors */ 102*8a8c2d74SCharles.Forsyth Pcibcserial = 0xc, /* serial bus (e.g., USB) */ 103*8a8c2d74SCharles.Forsyth Pcibcwireless = 0xd, /* wireless */ 104*8a8c2d74SCharles.Forsyth Pcibcintell = 0xe, /* intelligent i/o */ 105*8a8c2d74SCharles.Forsyth Pcibcsatcom = 0xf, /* satellite comms */ 106*8a8c2d74SCharles.Forsyth Pcibccrypto = 0x10, /* encryption/decryption */ 107*8a8c2d74SCharles.Forsyth Pcibcdacq = 0x11, /* data acquisition & signal proc. */ 108*8a8c2d74SCharles.Forsyth }; 109*8a8c2d74SCharles.Forsyth 110*8a8c2d74SCharles.Forsyth /* ccru (sub-class code) values; common cases only */ 111*8a8c2d74SCharles.Forsyth enum { 112*8a8c2d74SCharles.Forsyth /* mass storage */ 113*8a8c2d74SCharles.Forsyth Pciscscsi = 0, /* SCSI */ 114*8a8c2d74SCharles.Forsyth Pciscide = 1, /* IDE (ATA) */ 115*8a8c2d74SCharles.Forsyth 116*8a8c2d74SCharles.Forsyth /* network */ 117*8a8c2d74SCharles.Forsyth Pciscether = 0, /* Ethernet */ 118*8a8c2d74SCharles.Forsyth 119*8a8c2d74SCharles.Forsyth /* display */ 120*8a8c2d74SCharles.Forsyth Pciscvga = 0, /* VGA */ 121*8a8c2d74SCharles.Forsyth Pciscxga = 1, /* XGA */ 122*8a8c2d74SCharles.Forsyth Pcisc3d = 2, /* 3D */ 123*8a8c2d74SCharles.Forsyth 124*8a8c2d74SCharles.Forsyth /* bridges */ 125*8a8c2d74SCharles.Forsyth Pcischostpci = 0, /* host/pci */ 126*8a8c2d74SCharles.Forsyth Pciscpcicpci = 1, /* pci/pci */ 127*8a8c2d74SCharles.Forsyth 128*8a8c2d74SCharles.Forsyth /* simple comms */ 129*8a8c2d74SCharles.Forsyth Pciscserial = 0, /* 16450, etc. */ 130*8a8c2d74SCharles.Forsyth Pciscmultiser = 1, /* multiport serial */ 131*8a8c2d74SCharles.Forsyth 132*8a8c2d74SCharles.Forsyth /* serial bus */ 133*8a8c2d74SCharles.Forsyth Pciscusb = 3, /* USB */ 134*8a8c2d74SCharles.Forsyth }; 135*8a8c2d74SCharles.Forsyth 13674a4d8c2SCharles.Forsyth enum { /* type 0 pre-defined header */ 13774a4d8c2SCharles.Forsyth PciBAR2 = 0x18, 13874a4d8c2SCharles.Forsyth PciBAR3 = 0x1C, 13974a4d8c2SCharles.Forsyth PciBAR4 = 0x20, 14074a4d8c2SCharles.Forsyth PciBAR5 = 0x24, 14174a4d8c2SCharles.Forsyth PciCIS = 0x28, /* cardbus CIS pointer */ 14274a4d8c2SCharles.Forsyth PciSVID = 0x2C, /* subsystem vendor ID */ 14374a4d8c2SCharles.Forsyth PciSID = 0x2E, /* cardbus CIS pointer */ 14474a4d8c2SCharles.Forsyth PciEBAR0 = 0x30, /* expansion ROM base address */ 14574a4d8c2SCharles.Forsyth PciMGNT = 0x3E, /* burst period length */ 14674a4d8c2SCharles.Forsyth PciMLT = 0x3F, /* maximum latency between bursts */ 14774a4d8c2SCharles.Forsyth }; 14874a4d8c2SCharles.Forsyth 14974a4d8c2SCharles.Forsyth enum { /* type 1 pre-defined header */ 15074a4d8c2SCharles.Forsyth PciPBN = 0x18, /* primary bus number */ 15174a4d8c2SCharles.Forsyth PciSBN = 0x19, /* secondary bus number */ 15274a4d8c2SCharles.Forsyth PciUBN = 0x1A, /* subordinate bus number */ 15374a4d8c2SCharles.Forsyth PciSLTR = 0x1B, /* secondary latency timer */ 15474a4d8c2SCharles.Forsyth PciIBR = 0x1C, /* I/O base */ 15574a4d8c2SCharles.Forsyth PciILR = 0x1D, /* I/O limit */ 15674a4d8c2SCharles.Forsyth PciSPSR = 0x1E, /* secondary status */ 15774a4d8c2SCharles.Forsyth PciMBR = 0x20, /* memory base */ 15874a4d8c2SCharles.Forsyth PciMLR = 0x22, /* memory limit */ 15974a4d8c2SCharles.Forsyth PciPMBR = 0x24, /* prefetchable memory base */ 16074a4d8c2SCharles.Forsyth PciPMLR = 0x26, /* prefetchable memory limit */ 16174a4d8c2SCharles.Forsyth PciPUBR = 0x28, /* prefetchable base upper 32 bits */ 16274a4d8c2SCharles.Forsyth PciPULR = 0x2C, /* prefetchable limit upper 32 bits */ 16374a4d8c2SCharles.Forsyth PciIUBR = 0x30, /* I/O base upper 16 bits */ 16474a4d8c2SCharles.Forsyth PciIULR = 0x32, /* I/O limit upper 16 bits */ 16574a4d8c2SCharles.Forsyth PciEBAR1 = 0x28, /* expansion ROM base address */ 16674a4d8c2SCharles.Forsyth PciBCR = 0x3E, /* bridge control register */ 16774a4d8c2SCharles.Forsyth }; 16874a4d8c2SCharles.Forsyth 16974a4d8c2SCharles.Forsyth enum { /* type 2 pre-defined header */ 17074a4d8c2SCharles.Forsyth PciCBExCA = 0x10, 17174a4d8c2SCharles.Forsyth PciCBSPSR = 0x16, 17274a4d8c2SCharles.Forsyth PciCBPBN = 0x18, /* primary bus number */ 17374a4d8c2SCharles.Forsyth PciCBSBN = 0x19, /* secondary bus number */ 17474a4d8c2SCharles.Forsyth PciCBUBN = 0x1A, /* subordinate bus number */ 17574a4d8c2SCharles.Forsyth PciCBSLTR = 0x1B, /* secondary latency timer */ 17674a4d8c2SCharles.Forsyth PciCBMBR0 = 0x1C, 17774a4d8c2SCharles.Forsyth PciCBMLR0 = 0x20, 17874a4d8c2SCharles.Forsyth PciCBMBR1 = 0x24, 17974a4d8c2SCharles.Forsyth PciCBMLR1 = 0x28, 18074a4d8c2SCharles.Forsyth PciCBIBR0 = 0x2C, /* I/O base */ 18174a4d8c2SCharles.Forsyth PciCBILR0 = 0x30, /* I/O limit */ 18274a4d8c2SCharles.Forsyth PciCBIBR1 = 0x34, /* I/O base */ 18374a4d8c2SCharles.Forsyth PciCBILR1 = 0x38, /* I/O limit */ 184*8a8c2d74SCharles.Forsyth PciCBBCTL = 0x3E, /* Bridge control */ 18574a4d8c2SCharles.Forsyth PciCBSVID = 0x40, /* subsystem vendor ID */ 18674a4d8c2SCharles.Forsyth PciCBSID = 0x42, /* subsystem ID */ 18774a4d8c2SCharles.Forsyth PciCBLMBAR = 0x44, /* legacy mode base address */ 18874a4d8c2SCharles.Forsyth }; 18974a4d8c2SCharles.Forsyth 19074a4d8c2SCharles.Forsyth typedef struct Pcisiz Pcisiz; 19174a4d8c2SCharles.Forsyth struct Pcisiz 19274a4d8c2SCharles.Forsyth { 19374a4d8c2SCharles.Forsyth Pcidev* dev; 19474a4d8c2SCharles.Forsyth int siz; 19574a4d8c2SCharles.Forsyth int bar; 19674a4d8c2SCharles.Forsyth }; 19774a4d8c2SCharles.Forsyth 19874a4d8c2SCharles.Forsyth typedef struct Pcidev Pcidev; 19974a4d8c2SCharles.Forsyth typedef struct Pcidev { 20074a4d8c2SCharles.Forsyth int tbdf; /* type+bus+device+function */ 20174a4d8c2SCharles.Forsyth ushort vid; /* vendor ID */ 20274a4d8c2SCharles.Forsyth ushort did; /* device ID */ 20374a4d8c2SCharles.Forsyth 204*8a8c2d74SCharles.Forsyth ushort pcr; 205*8a8c2d74SCharles.Forsyth 20674a4d8c2SCharles.Forsyth uchar rid; 20774a4d8c2SCharles.Forsyth uchar ccrp; 20874a4d8c2SCharles.Forsyth uchar ccru; 20974a4d8c2SCharles.Forsyth uchar ccrb; 210*8a8c2d74SCharles.Forsyth uchar cls; 211*8a8c2d74SCharles.Forsyth uchar ltr; 21274a4d8c2SCharles.Forsyth 21374a4d8c2SCharles.Forsyth struct { 21474a4d8c2SCharles.Forsyth ulong bar; /* base address */ 21574a4d8c2SCharles.Forsyth int size; 21674a4d8c2SCharles.Forsyth } mem[6]; 21774a4d8c2SCharles.Forsyth 21874a4d8c2SCharles.Forsyth struct { 21974a4d8c2SCharles.Forsyth ulong bar; 22074a4d8c2SCharles.Forsyth int size; 22174a4d8c2SCharles.Forsyth } rom; 22274a4d8c2SCharles.Forsyth uchar intl; /* interrupt line */ 22374a4d8c2SCharles.Forsyth 22474a4d8c2SCharles.Forsyth Pcidev* list; 22574a4d8c2SCharles.Forsyth Pcidev* link; /* next device on this bno */ 226*8a8c2d74SCharles.Forsyth 227*8a8c2d74SCharles.Forsyth Pcidev* bridge; /* down a bus */ 22874a4d8c2SCharles.Forsyth struct { 22974a4d8c2SCharles.Forsyth ulong bar; 23074a4d8c2SCharles.Forsyth int size; 23174a4d8c2SCharles.Forsyth } ioa, mema; 23274a4d8c2SCharles.Forsyth 233*8a8c2d74SCharles.Forsyth int pmrb; /* power management register block */ 23474a4d8c2SCharles.Forsyth }; 23574a4d8c2SCharles.Forsyth 23674a4d8c2SCharles.Forsyth #define PCIWINDOW 0 23774a4d8c2SCharles.Forsyth #define PCIWADDR(va) (PADDR(va)+PCIWINDOW) 23874a4d8c2SCharles.Forsyth #define ISAWINDOW 0 23974a4d8c2SCharles.Forsyth #define ISAWADDR(va) (PADDR(va)+ISAWINDOW) 24074a4d8c2SCharles.Forsyth 24174a4d8c2SCharles.Forsyth /* 24274a4d8c2SCharles.Forsyth * PCMCIA support code. 24374a4d8c2SCharles.Forsyth */ 244*8a8c2d74SCharles.Forsyth typedef struct PCMslot PCMslot; 245*8a8c2d74SCharles.Forsyth typedef struct PCMconftab PCMconftab; 246*8a8c2d74SCharles.Forsyth 24774a4d8c2SCharles.Forsyth /* 24874a4d8c2SCharles.Forsyth * Map between ISA memory space and PCMCIA card memory space. 24974a4d8c2SCharles.Forsyth */ 25074a4d8c2SCharles.Forsyth struct PCMmap { 25174a4d8c2SCharles.Forsyth ulong ca; /* card address */ 25274a4d8c2SCharles.Forsyth ulong cea; /* card end address */ 25374a4d8c2SCharles.Forsyth ulong isa; /* ISA address */ 25474a4d8c2SCharles.Forsyth int len; /* length of the ISA area */ 25574a4d8c2SCharles.Forsyth int attr; /* attribute memory */ 25674a4d8c2SCharles.Forsyth int ref; 25774a4d8c2SCharles.Forsyth }; 258*8a8c2d74SCharles.Forsyth 259*8a8c2d74SCharles.Forsyth /* configuration table entry */ 260*8a8c2d74SCharles.Forsyth struct PCMconftab 261*8a8c2d74SCharles.Forsyth { 262*8a8c2d74SCharles.Forsyth int index; 263*8a8c2d74SCharles.Forsyth ushort irqs; /* legal irqs */ 264*8a8c2d74SCharles.Forsyth uchar irqtype; 265*8a8c2d74SCharles.Forsyth uchar bit16; /* true for 16 bit access */ 266*8a8c2d74SCharles.Forsyth struct { 267*8a8c2d74SCharles.Forsyth ulong start; 268*8a8c2d74SCharles.Forsyth ulong len; 269*8a8c2d74SCharles.Forsyth } io[16]; 270*8a8c2d74SCharles.Forsyth int nio; 271*8a8c2d74SCharles.Forsyth uchar vpp1; 272*8a8c2d74SCharles.Forsyth uchar vpp2; 273*8a8c2d74SCharles.Forsyth uchar memwait; 274*8a8c2d74SCharles.Forsyth ulong maxwait; 275*8a8c2d74SCharles.Forsyth ulong readywait; 276*8a8c2d74SCharles.Forsyth ulong otherwait; 277*8a8c2d74SCharles.Forsyth }; 278*8a8c2d74SCharles.Forsyth 279*8a8c2d74SCharles.Forsyth /* a card slot */ 280*8a8c2d74SCharles.Forsyth struct PCMslot 281*8a8c2d74SCharles.Forsyth { 282*8a8c2d74SCharles.Forsyth Lock; 283*8a8c2d74SCharles.Forsyth int ref; 284*8a8c2d74SCharles.Forsyth 285*8a8c2d74SCharles.Forsyth void *cp; /* controller for this slot */ 286*8a8c2d74SCharles.Forsyth long memlen; /* memory length */ 287*8a8c2d74SCharles.Forsyth uchar base; /* index register base */ 288*8a8c2d74SCharles.Forsyth uchar slotno; /* slot number */ 289*8a8c2d74SCharles.Forsyth 290*8a8c2d74SCharles.Forsyth /* status */ 291*8a8c2d74SCharles.Forsyth uchar special; /* in use for a special device */ 292*8a8c2d74SCharles.Forsyth uchar already; /* already inited */ 293*8a8c2d74SCharles.Forsyth uchar occupied; 294*8a8c2d74SCharles.Forsyth uchar battery; 295*8a8c2d74SCharles.Forsyth uchar wrprot; 296*8a8c2d74SCharles.Forsyth uchar powered; 297*8a8c2d74SCharles.Forsyth uchar configed; 298*8a8c2d74SCharles.Forsyth uchar enabled; 299*8a8c2d74SCharles.Forsyth uchar busy; 300*8a8c2d74SCharles.Forsyth 301*8a8c2d74SCharles.Forsyth /* cis info */ 302*8a8c2d74SCharles.Forsyth ulong msec; /* time of last slotinfo call */ 303*8a8c2d74SCharles.Forsyth char verstr[512]; /* version string */ 304*8a8c2d74SCharles.Forsyth int ncfg; /* number of configurations */ 305*8a8c2d74SCharles.Forsyth struct { 306*8a8c2d74SCharles.Forsyth ushort cpresent; /* config registers present */ 307*8a8c2d74SCharles.Forsyth ulong caddr; /* relative address of config registers */ 308*8a8c2d74SCharles.Forsyth } cfg[8]; 309*8a8c2d74SCharles.Forsyth int nctab; /* number of config table entries */ 310*8a8c2d74SCharles.Forsyth PCMconftab ctab[8]; 311*8a8c2d74SCharles.Forsyth PCMconftab *def; /* default conftab */ 312*8a8c2d74SCharles.Forsyth 313*8a8c2d74SCharles.Forsyth /* memory maps */ 314*8a8c2d74SCharles.Forsyth Lock mlock; /* lock down the maps */ 315*8a8c2d74SCharles.Forsyth int time; 316*8a8c2d74SCharles.Forsyth PCMmap mmap[4]; /* maps, last is always for the kernel */ 317*8a8c2d74SCharles.Forsyth }; 318