/****************************************************************************** * FILE PURPOSE: SRIO API function calls ****************************************************************************** * FILE NAME: SrioAPI.c * * DESCRIPTION: Provides SRIO API functions for TCI6488/6487. Note for convenience, * register direct read/write is done below, refer to CSL for better * examples if needed. * * (C) Copywright reserved by Texas Instruments. *****************************************************************************/ #include "SrioAPI.h" /* provide some delay */ void delay_boot(unsigned int cycles) { unsigned int i; for(i=0; iPLL Multiply 10x , PLL ennable *(( unsigned int *)(0x2d00000 + 0x100)) = 0x00081121; // EQ->1, CDR->000:first order, LOS->disable:loss of signal detection *(( unsigned int *)(0x2d00000 + 0x104)) = 0x00081121; // ALIGN->Comma alignment enable, TERM->Common point set to 0.8 VDDT // INVPAIR->Normal polarity, RETE->half rate, BUS-WIDTH->10bit operation // ENRX->Enable receiver *(( unsigned int *)(0x2d00000 + 0x110)) = 0x00000921; // SWING->750mV, CM->Raised common mode, INVPAIR->Normal polarity, *(( unsigned int *)(0x2d00000 + 0x114)) = 0x00000921; // RETE->half rate, BUS-WIDTH->10bit operation, ENTX->Enable TX delay_boot(10000); *(( unsigned int *)(0x2d00000 + 0x1010)) = 0x20000019; // LARGE_SUPPORT->PE supports common transport large systems, EXTENDED_FEATURE valid, PE supports 34bit address *(( unsigned int *)(0x2d00000 + 0x1018)) = 0x0000FDF4; // all source operations is enable *(( unsigned int *)(0x2d00000 + 0x101c)) = 0x0000FC04; // all destination operations is enable, except atomic *(( unsigned int *)(0x2d00000 + 0x1100)) = 0x10000002; // General endpoint device with software assisted error recovery option *(( unsigned int *)(0x2d00000 + 0x115c)) = 0x00600001; // port 0 Output port enable *(( unsigned int *)(0x2d00000 + 0x117c)) = 0x00600001; // port 1 Output port enable *(( unsigned int *)(0x2d00000 + 0x105C)) = 0x005A0200; // ? Local Configuration Space Base Address 1 CSR (LCL_CFG_BAR) ///* base ID */ // *(( unsigned int *)(0x2d00000 + 0x1060)) = DEVICEID_REG; ///* device id 1 & 2 */ // *(( unsigned int *)(0x2d00000 + 0x80)) = DEVICEID_REG; // *(( unsigned int *)(0x2d00000 + 0x84)) = DEVICEID_REG; /* base ID */ *(( unsigned int *)(0x2d00000 + 0x1060)) = 0x00030003; /* device id 1 & 2 */ *(( unsigned int *)(0x2d00000 + 0x80)) = 0x00FFFFFF; *(( unsigned int *)(0x2d00000 + 0x84)) = 0x00FFFFFF; *(( unsigned int *)(0x2d00000 + 0x12004)) = 0x48000000; //SP_MODE->4Port(1x mode each), IDLE_ERR_DIS->Error checking enable, PW_DIS->disable port wire error reporting //TGT_ID_DIS->Packet accepted with any DestID and forwarded to the logical layer //SELF_RST->Self reset interrupt disabled (default), interrupt signal is asserted *(( unsigned int *)(0x2d00000 + 0x90)) = 0xffffffff; //Disable %consider *(( unsigned int *)(0x2d00000 + 0x94)) = 0x0003ffff; //Disable %consider *(( unsigned int *)(0x2d00000 + 0x98)) = 0xffffffff; //Disable *(( unsigned int *)(0x2d00000 + 0x9c)) = 0x0003ffff; //Disable *(( unsigned int *)(0x2d00000 + 0x280)) = 0x44444444; //Routed to INTDST4 *(( unsigned int *)(0x2d00000 + 0x320)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x324)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x330)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x334)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x12008)) = 0x00000008;//0x00000008; *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x80000000; *(( unsigned int *)(0x2d00000 + 0x20)) = 0x05053910; //*(( unsigned int *)(0x2d00000 + 0x20)) = 0x05053750; *(( unsigned int *)(0x2d00000 + 0x04)) = 0x00000005; /* needed, otherwise it will not be able to send requests out */ *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x60000000; } /* SRIO config 1, Boot mode 9: SerDes ref clock: 125 MHz, Link rate= 3.125 Gbps */ void ConfigSRIO_Bootmode_9(void) { *(( unsigned int *)(0x2d00000 + 0x120)) = 0x0000000F; *(( unsigned int *)(0x2d00000 + 0x100)) = 0x00081101; *(( unsigned int *)(0x2d00000 + 0x104)) = 0x00081101; *(( unsigned int *)(0x2d00000 + 0x110)) = 0x00000901; *(( unsigned int *)(0x2d00000 + 0x114)) = 0x00000901; delay_boot(10000); *(( unsigned int *)(0x2d00000 + 0x1010)) = 0x20000019; *(( unsigned int *)(0x2d00000 + 0x1018)) = 0x0000FDF4; *(( unsigned int *)(0x2d00000 + 0x101c)) = 0x0000FC04; *(( unsigned int *)(0x2d00000 + 0x1100)) = 0x10000002; *(( unsigned int *)(0x2d00000 + 0x115c)) = 0x00600001; *(( unsigned int *)(0x2d00000 + 0x117c)) = 0x00600001; *(( unsigned int *)(0x2d00000 + 0x105C)) = 0x005A0200; /* base ID */ *(( unsigned int *)(0x2d00000 + 0x1060)) = DEVICEID_REG; /* device id 1 & 2 */ *(( unsigned int *)(0x2d00000 + 0x80)) = DEVICEID_REG; *(( unsigned int *)(0x2d00000 + 0x84)) = DEVICEID_REG; *(( unsigned int *)(0x2d00000 + 0x12004)) = 0x4D000000; *(( unsigned int *)(0x2d00000 + 0x90)) = 0xffffffff; *(( unsigned int *)(0x2d00000 + 0x94)) = 0x0003ffff; *(( unsigned int *)(0x2d00000 + 0x98)) = 0xffffffff; *(( unsigned int *)(0x2d00000 + 0x9c)) = 0x0003ffff; *(( unsigned int *)(0x2d00000 + 0x280)) = 0x44444444; *(( unsigned int *)(0x2d00000 + 0x320)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x324)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x330)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x334)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x12008)) = 0x00000008; *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x20)) = 0x0D053910; *(( unsigned int *)(0x2d00000 + 0x04)) = 0x00000005; /* needed, otherwise it will not be able to send requests out */ *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x60000000; } /* SRIO config 2, Boot mode 10: SerDes ref clock: 156.25 MHz, Link rate= 1.25 Gbps */ void ConfigSRIO_Bootmode_10(void) { *(( unsigned int *)(0x2d00000 + 0x120)) = 0x00000009; *(( unsigned int *)(0x2d00000 + 0x100)) = 0x00081121; *(( unsigned int *)(0x2d00000 + 0x104)) = 0x00081121; *(( unsigned int *)(0x2d00000 + 0x110)) = 0x00000921; *(( unsigned int *)(0x2d00000 + 0x114)) = 0x00000921; delay_boot(10000); *(( unsigned int *)(0x2d00000 + 0x1010)) = 0x20000019; *(( unsigned int *)(0x2d00000 + 0x1018)) = 0x0000FDF4; *(( unsigned int *)(0x2d00000 + 0x101c)) = 0x0000FC04; *(( unsigned int *)(0x2d00000 + 0x1100)) = 0x10000002; *(( unsigned int *)(0x2d00000 + 0x115c)) = 0x00600001; *(( unsigned int *)(0x2d00000 + 0x117c)) = 0x00600001; *(( unsigned int *)(0x2d00000 + 0x105C)) = 0x005A0200; /* base ID */ *(( unsigned int *)(0x2d00000 + 0x1060)) = DEVICEID_REG; /* device id 1 & 2 */ *(( unsigned int *)(0x2d00000 + 0x80)) = DEVICEID_REG; *(( unsigned int *)(0x2d00000 + 0x84)) = DEVICEID_REG; *(( unsigned int *)(0x2d00000 + 0x12004)) = 0x4D000000; *(( unsigned int *)(0x2d00000 + 0x90)) = 0xffffffff; *(( unsigned int *)(0x2d00000 + 0x94)) = 0x0003ffff; *(( unsigned int *)(0x2d00000 + 0x98)) = 0xffffffff; *(( unsigned int *)(0x2d00000 + 0x9c)) = 0x0003ffff; *(( unsigned int *)(0x2d00000 + 0x280)) = 0x44444444; *(( unsigned int *)(0x2d00000 + 0x320)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x324)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x330)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x334)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x12008)) = 0x00000008; *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x20)) = 0x0D053910; *(( unsigned int *)(0x2d00000 + 0x04)) = 0x00000005; /* needed, otherwise it will not be able to send requests out */ *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x60000000; } /* SRIO config 3, Boot mode 11: SerDes ref clock: 156.25 MHz, Link rate= 3.125 Gbps */ void ConfigSRIO_Bootmode_11(void) { *(( unsigned int *)(0x2d00000 + 0x120)) = 0x0000000B; *(( unsigned int *)(0x2d00000 + 0x100)) = 0x00081101; *(( unsigned int *)(0x2d00000 + 0x104)) = 0x00081101; *(( unsigned int *)(0x2d00000 + 0x110)) = 0x00000901; *(( unsigned int *)(0x2d00000 + 0x114)) = 0x00000901; delay_boot(10000); *(( unsigned int *)(0x2d00000 + 0x1010)) = 0x20000019; *(( unsigned int *)(0x2d00000 + 0x1018)) = 0x0000FDF4; *(( unsigned int *)(0x2d00000 + 0x101c)) = 0x0000FC04; *(( unsigned int *)(0x2d00000 + 0x1100)) = 0x10000002; *(( unsigned int *)(0x2d00000 + 0x115c)) = 0x00600001; *(( unsigned int *)(0x2d00000 + 0x117c)) = 0x00600001; *(( unsigned int *)(0x2d00000 + 0x105C)) = 0x005A0200; /* base ID */ *(( unsigned int *)(0x2d00000 + 0x1060)) = DEVICEID_REG; /* device id 1 & 2 */ *(( unsigned int *)(0x2d00000 + 0x80)) = DEVICEID_REG; *(( unsigned int *)(0x2d00000 + 0x84)) = DEVICEID_REG; *(( unsigned int *)(0x2d00000 + 0x12004)) = 0x4D000000; *(( unsigned int *)(0x2d00000 + 0x90)) = 0xffffffff; *(( unsigned int *)(0x2d00000 + 0x94)) = 0x0003ffff; *(( unsigned int *)(0x2d00000 + 0x98)) = 0xffffffff; *(( unsigned int *)(0x2d00000 + 0x9c)) = 0x0003ffff; *(( unsigned int *)(0x2d00000 + 0x280)) = 0x44444444; *(( unsigned int *)(0x2d00000 + 0x320)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x324)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x330)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x334)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x12008)) = 0x00000008; *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x00000000; *(( unsigned int *)(0x2d00000 + 0x20)) = 0x0D053910; *(( unsigned int *)(0x2d00000 + 0x04)) = 0x00000005; /* needed, otherwise it will not be able to send requests out */ *(( unsigned int *)(0x2d00000 + 0x113c)) = 0x60000000; } /* Configure SRIO to have the same linkrate as per TCI6488/6487 DSP. */ void SRIOConfigure(int bootmode) { //PSC_SRIO_ON(); switch(bootmode) { default: case SRIOBootConfig0: ConfigSRIO_Bootmode_8(); break; case SRIOBootConfig1: ConfigSRIO_Bootmode_9(); break; case SRIOBootConfig2: ConfigSRIO_Bootmode_10(); break; case SRIOBootConfig3: ConfigSRIO_Bootmode_11(); break; } } /* Return if Port is OK or not */ int SRIOPortStatus(int port) { unsigned int count,value,portok; count = 0; portok= 0; while(1) { if(port == PORT0) value = *((volatile unsigned int *)(0x2d00000 + 0x1158)); /* SP0_ERR_STAT */ else value = *((volatile unsigned int *)(0x2d00000 + 0x1178)); /* SP1_ERR_STAT */ if((value & 0x02) !=0) { portok++; if(portok >= 50) break; /* port must be solid OK */ delay_boot(100); } else { portok = 0; count++; if(count>=SRIO_TIMEOUT) return(-1); } delay_boot(1000); } return(0); } /* Transfer (size_bytes) bytes data from host address (host_addr) to device ID's (rio_id) global address (dsp_addr). Lane 0 is used for booting. rio_id: destination device id host_addr: host's address dsp_addr: target dsp's global address size_bytes: size in bytes */ int SRIOTransfer(int rio_id, int port, unsigned int host_addr, unsigned int dsp_addr, int size_bytes) { unsigned int count,busy; /* Perform a transfer */ /* LSU 1 Reg 0 - MSB of destination */ *((volatile unsigned int *)0x2d00400) = 0x00000000; /* LSU 1 Reg 1 - LSB of destination */ *((volatile unsigned int *)0x2d00404) = (unsigned int)dsp_addr; /* LSU 1 Reg 2 - source address */ *((volatile unsigned int *)0x2d00408) = (unsigned int)host_addr; /* LSU 1 Reg 3 - Byte count */ *((volatile unsigned int *)0x2d0040c) = size_bytes; /* LSU 1 Reg 4 - * out port ID = 0 * Priority = 2 * XAM = 0 * ID size = 1 (16 bit) * Dest ID specified as arg * interrupt request = 0 */ *((volatile unsigned int *)0x2d00410) = 0x21000000 | (rio_id << 8) | (port << 30);; /* LSU 1 Reg 5 - * doorbell info = 0 for this packet type * hop count = 0 for this packet type * Packet type = 0x54 - ftype = 5, ttype = 4 * nwrite packet type. * Writing this register should initiate the transfer */ *((volatile unsigned int *)0x2d00414) = 0x00000054; /* wait for it to complete */ count = 0; while(1) { busy = *((volatile unsigned int *)0x2d00418); if((busy & 0x00000001) == 0) break; count++; if(count>=SRIO_TIMEOUT) return(-1); delay_boot(1000); } return(0); } /* Send a door bell interrupt to DSP to wake it up. Lane 0 is used for booting. rio_id: destination device id */ int SRIODoorBell(int rio_id, int port) { unsigned int count,busy; /* LSU 1 Reg 0 - MSB of destination */ *((unsigned int *)0x2d00400) = 0; /* LSU 1 Reg 1 - LSB of destination */ //*((unsigned int *)0x2d00404) = 0; *((unsigned int *)0x2d00404) = 0x10806430; /* LSU 1 Reg 2 - source address */ *((unsigned int *)0x2d00408) = 0; /* LSU 1 Reg 3 - byte count */ *((unsigned int *)0x2d0040c) = 0; /* LSU 1 Reg 4 - */ *((unsigned int *)0x2d00410) = 0x21000000 | (rio_id << 8)| (port << 30);; /* LSU 1 Reg 5 * doorbell info 0 * hop count 3 * Packet type = 0xa0 ftype = 10, ttype = 0 */ *((unsigned int *)0x2d00414) = 0x000000a0; /* wait for it to complete */ count = 0; while(1) { busy = *((volatile unsigned int *)0x2d00418); if((busy & 0x00000001) == 0) break; count++; if(count>=SRIO_TIMEOUT) return(-1); delay_boot(1000); } return(0); } /***************************************************************************** * SRIO Boot Function *****************************************************************************/ /* Convert bytes to 32 bits */ unsigned int byteto32bits(unsigned char *pDspCode) { int i; unsigned int temp; temp = *pDspCode++; for(i=0; i<3;i++) { temp <<= 8; temp |= *pDspCode++; } return(temp); } /* Convert to big endian, if the .out to be booted is big endian, this is not required */ void Convert2BigEndian(unsigned int *pDspCode, int size) { unsigned int i; unsigned int temp; for(i=0; i>24) | ((temp<<8) & 0x00FF0000) | ((temp>>8) & 0x0000FF00) | (temp<<24); *pDspCode= temp; } } /* Send boot tables to DSP and then door bell interrupt to boot the DSP pDspCode: points to DSP code; DeviceID: device ID. */ int bootDSP(unsigned char *pDspCode,int DeviceID) { unsigned int i; unsigned int size; unsigned int count, remainder; unsigned int startaddr; /* Skip the boot entry address */ pDspCode+=4; while(1) { /* Get the size */ size = byteto32bits(pDspCode); if(size == 0) break; pDspCode += 4; startaddr = byteto32bits(pDspCode); pDspCode+= 4; count = size/SIZELIMIT; remainder = size - count * SIZELIMIT; for(i=0; i