⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swsys.c

📁 source code of armboot for s3c4510
💻 C
📖 第 1 页 / 共 3 页
字号:
	UINT32	pcidta;
    UINT8   u8RegVal;
    UINT16  u16IrqMask;

    // release packet driver
    SWPKT_vDrvClose();

    // Unset Interrupt Vector
    ISR_vSwitchIntDisable();

    // disabled all interrupt and cache
    ISR_vIntDisable();
	
	   // Disable interrupt masks
	   //modified by hill 20070919
 #ifdef __SWITCH_CPUIF_PCI
 	PCIIO_Write8((g_u32SwIoBA +  0x24 + 3), 0x00);
 #else

 #endif
 
    SWREG_vWriteU16(CPUIF_IRQ_MASK, 0x0000);

    //Dequeue hold cpu port
    SWREG_vWriteU8(QUECTL_DEQUE_HOLD + 3, DEQUE_HOLD_CPU);

    //Disable cpuio output port enable (OPORT_EN)
    SWREG_vReadU8(CPUPORT_CFG, &u8RegVal);
    u8RegVal &= ~CPU_CFG_RX_ENABLE;
    SWREG_vWriteU8(CPUPORT_CFG, u8RegVal);
	
	 //modified by hill 20070919
#ifdef __SWITCH_CPUIF_PCI
    //Write 0x03(SFRST, FORSRST) to reset HCI DMA engine
    SWPCICSR_vWriteU8(CR0_OFF + 3, (CR3_FORSRST|CR3_SFRST_DONE) );
    //Wait HCI reset stable (by read SFRST=0)
    SWPCICSR_bWaitStatus(CR0_OFF + 3, CR3_SFRST_DONE, FALSE);
#else
	
#endif
}


void SWSYS_vSwitchInit (void)
{
    UINT8   u8Ver, u8RegVal;
	UINT8 temp;

    // MIB Enable
    SWREG_vBitsOnU8(INITCTL_MIB_EN, MIB_ENABLE);

    // Set 0x415[7] = 0, if 1, many to one testing will loss packet
    // Set 0x416[4] = 0, if 1, many to one testing will loss packet
    SWREG_vBitsOffU8(INITCTL_BASIC_FUNC_CFG + 1, FUNC_CFG_DEADLOCK_RELIEF_EN);
    SWREG_vBitsOffU8(INITCTL_BASIC_FUNC_CFG + 2, FUNC_CFG_FC_VIO_EN);

    SWSYS_vGetChipVer(&u8Ver);

    // Set CPU threshold
    if (u8Ver >= 1) {
        SWREG_vReadU8(RESMGMT_CPU_ENTER_CONG_THR, &u8RegVal);
        SWREG_vWriteU8(RESMGMT_CPU_ENTER_CONG_THR, ((u8RegVal + 7) / 8));

        SWREG_vReadU8((RESMGMT_CPU_ENTER_CONG_THR + 1), &u8RegVal);
        SWREG_vWriteU8((RESMGMT_CPU_ENTER_CONG_THR + 1), ((u8RegVal + 7) / 8));

        SWREG_vReadU8((RESMGMT_CPU_ENTER_CONG_THR + 2), &u8RegVal);
        SWREG_vWriteU8((RESMGMT_CPU_ENTER_CONG_THR + 2), ((u8RegVal + 7) / 8));

        SWREG_vReadU8((RESMGMT_CPU_ENTER_CONG_THR + 3), &u8RegVal);
        SWREG_vWriteU8((RESMGMT_CPU_ENTER_CONG_THR + 3), ((u8RegVal + 7) / 8));

        SWREG_vReadU8(RESMGMT_CPU_LEAVE_CONG_THR, &u8RegVal);
        SWREG_vWriteU8(RESMGMT_CPU_LEAVE_CONG_THR, ((u8RegVal + 7) / 8));
    }
    // Apply CPU threshold set
    SWREG_vWriteU8(RESMGMT_CPU_THR_ATTR, 0x01);

    // Patch : set "PAD Delay"(reg. 0x041C-1D=0x55-55) for patch
    //         SMII mode receive FCS error on Y0 of PCB(VN0088A).
    SWREG_vWriteU16(INITCTL_PAD_DELAY_CFG, 0x5555);

    // Patch Qos
    if (u8Ver == 1) {
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR1, 220);
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR1 + 1, 230);
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR1 + 2, 240);
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR1 + 3, 255);
        SWREG_vWriteU8(RESMGMT_LEAVE_CONG_THR1, 200);
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR2, 220);
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR2 + 1, 230);
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR2 + 2, 240);
        SWREG_vWriteU8(RESMGMT_ENTER_CONG_THR2 + 3, 255);
        SWREG_vWriteU8(RESMGMT_LEAVE_CONG_THR2, 200);
        SWREG_vWriteU8(RESMGMT_INGRS_BUF_USAGE_THR, 10);
        SWREG_vWriteU8(RESMGMT_INGRS_BUF_USAGE_THR + 1, 8);
        SWREG_vWriteU8(RESMGMT_INGRS_BUF_USAGE_THR + 2, 10);
        SWREG_vWriteU8(RESMGMT_INGRS_BUF_USAGE_THR + 3, 8);
    }

    // Patch : none IP SNAP with tag packet will always be ARP packet
   // if ( SWVLANTB_u8GetVlanMode() != VLAN_MODE_DISABLE) {
    //	s_vPatchNonArpToCpu();
	//}

}


void SWSYS_vSwitchResetSignal(void)
{
    // reset switch
    PLAT_vSetMacResetPin(0);
    // reset phy
    PLAT_vSetPhyResetPin(0);
    PLAT_vDelayLoop(1);

    // de-assert reset signal
    PLAT_vSetMacResetPin(1);
    PLAT_vDelayLoop(1);
    // de-assert reset signal
    PLAT_vSetPhyResetPin(1);
    // wait for phy initialize completed
    PLAT_vDelayLoop(40);
}


BOOL SWSYS_bSwitchSramBIST (UINT8 byMemType)
{
    BOOL    bBistOK = TRUE;
    UINT16  wStatus;
    UINT32  dwStatus;
    UINT8   byOldBistCfg;

//add by hill 20070920
#if 0
	SWREG_vWriteU8(CPUIF_IRQ_MASK,0x01);
	SWREG_vReadU8(CPUIF_IRQ_MASK, &byOldBistCfg);
	if(byOldBistCfg != 0x01)
	{
		printf("register read & write : failure !\n");
	}
	else
	{
		printf("register read & write : success !\n");
	}
#endif

    SWREG_vReadU8(SRAMCTL_GBL_BIST_CFG, &byOldBistCfg);
//add by hill 20070924
#if 0
//#if 1
		printf("value of register(SRAMCTL_GBL_BIST_CFG) is %8x\n",byOldBistCfg);
#endif

    if (byMemType == MEM_MOSYS) {
        // Trigger BIST and wait for execution finished
        SWREG_vWriteU8(SRAMCTL_GBL_BIST_CFG,
            BIST_CFG_BIST_ENABLE | BIST_CFG_MOSYS_BIST_START);

        if (!SWREG_bWaitStatus(SRAMCTL_MOSYS_BIST_STATUS+1,
           (MOSYS_BIST_STATUS_OK >>8), TRUE)) {
            bBistOK = FALSE;
            goto exit;
        }

        // Return BIST result
        SWREG_vReadU16(SRAMCTL_MOSYS_BIST_STATUS, &wStatus);
        if ((wStatus & MOSYS_BIST_STATUS_ERR_MSK) != 0) {
            bBistOK = FALSE;
            goto exit;
        }
    }
    else if (byMemType == MEM_CAM) {
        // Trigger BIST and wait for execution finished
        SWREG_vWriteU8(SRAMCTL_GBL_BIST_CFG,
            BIST_CFG_BIST_ENABLE | BIST_CFG_CAM_BIST_START);

        if (!SWREG_bWaitStatus(SRAMCTL_CAM_BIST_STATUS+2, (CAM_BIST_STATUS_OK>>16), TRUE)) {
            bBistOK = FALSE;
            goto exit;
        }

        // Return BIST result
        SWREG_vReadU32(SRAMCTL_CAM_BIST_STATUS, &dwStatus);
        if ((dwStatus & CAM_BIST_STATUS_ERR_MSK) != 0) {
            bBistOK = FALSE;
            goto exit;
        }
    }
    else if (byMemType == MEM_ARTISAN) {
        // Trigger BIST and wait for execution finished
        SWREG_vWriteU8(SRAMCTL_GBL_BIST_CFG,
            BIST_CFG_BIST_ENABLE | BIST_CFG_ARTISAN_BIST_START);

        if (!SWREG_bWaitStatus(SRAMCTL_ATS_BIST_STATUS+2,
            (ATS_BIST_STATUS_OK>>16), TRUE)) {
            bBistOK = FALSE;
            goto exit;
        }

        // Return BIST result
        SWREG_vReadU16(SRAMCTL_NON_REPAIR_STATUS, &wStatus);
        if ((wStatus & NON_REPAIR_STATUS_ATS_MSK) != 0) {
            bBistOK = FALSE;
            goto exit;
        }
    }
    else {
        return FALSE;
    }

exit:
    // Restore BIST enable after BIST Test
    SWREG_vWriteU8(SRAMCTL_GBL_BIST_CFG, byOldBistCfg);

    return bBistOK;
}


void SWSYS_vSetAutoPollOn (void)
{
    SWREG_vWriteU8(PHYCTL_CMD, PHY_CMD_EN_AUTO);
    SWREG_bWaitStatus(PHYCTL_STATUS, PHY_STATUS_AUTOPOLL, TRUE);
}


void SWSYS_vSetAutoPollOff (void)
{
    SWREG_vWriteU8(PHYCTL_CMD, PHY_CMD_DIS_AUTO);
    SWREG_bWaitStatus(PHYCTL_STATUS, PHY_STATUS_AUTOPOLL, FALSE);
}


void SWSYS_vBoardInit (void)
{
    //UINT    uu;
    //UINT8   au8EthAddr[MAC_ADDR_SIZE];
 
    // Trigger MAC & PHY reset signal
    SWSYS_vSwitchResetSignal();

	#ifdef __SWITCH_CPUIF_PCI
    // scan switch device on PCI bus, then we can use it
    PCILIB_Scan(&g_u32SwIoBA, &g_u32SwMemBA);
	#endif

    if (!SWSYS_bBufInit()) return;
	//hill 20070921
#if 0
	printf("SWSYS_bBufInit...done\n");
#endif

    // Set system initial hardware configuration
    SWSYS_vSwitchInit();
#if 0
	printf("SWSYS_vSwitchInit...done\n");
#endif
    // Enable phy autopolling
    SWSYS_vSetAutoPollOn();
#if 0
	printf("SWSYS_vSetAutoPollOn...done\n");
#endif
    // It should be run when MAC resets and after hardware are all ready.
    // get mac address from eeprom and set it switch
//    for (uu = 0; uu < MAC_ADDR_SIZE; uu++) {
  //      NVRAM_bReadU8(NVR_ADDR_MAC_ADDR + uu, au8EthAddr + uu);
  //  }
    //SWPKT_vSetMacAddress(au8EthAddr);

    // Setup Interrupt Vector
#ifdef __SWITCH_CPUIF_PCI
  //  ISR_vSetIntHandlers(INT_OFFSET_PCI_H, SWSYS_vIsrIntaAss);
#else   // local bus
    #ifdef __CPU_S3C2510A
  //    ISR_vSetIntHandlers(VEC_EXT5_INT, ISR_vSwitch);
    #else
  // /   ISR_vSetIntHandlers(VEC_EXT0_INT, ISR_vSwitch);
    #endif
#endif

    //ISR_vSwitchIntEnable();
}
#if (SUPPORT_2M_PKT_MEM)
/************************************************************************
 * This function allocates only 2Mbits packet buffer from the hw buffer pool
 ************************************************************************/
static BOOL s_bPktMemAlloc(void)
{
    UINT8   u8Sts, u8Valid0, u8Valid1, au8Data[SRAM_ENTRY_SIZE_4Byte], byOldBistCfg;
    UINT16  u16Len = 1024, u16All = 2048, u16Head[4], u16Tail[4];
    UINT32  u32Addr;


    u8Valid0 = u8Valid1 = 0;
    
    //Using BIST to find the normal Packet Memory
    SWREG_vReadU8(SRAMCTL_GBL_BIST_CFG, &byOldBistCfg);
    SWREG_vWriteU8(SRAMCTL_GBL_BIST_CFG,
        BIST_CFG_BIST_ENABLE | BIST_CFG_MOSYS_BIST_START);
    if (!SWREG_bWaitStatus(SRAMCTL_MOSYS_BIST_STATUS+1,
       (MOSYS_BIST_STATUS_OK >>8), TRUE)) {
        return FALSE;
    }
    SWREG_vWriteU8(SRAMCTL_GBL_BIST_CFG, byOldBistCfg);

    //-----assign valid Mosys SRAM 
    SWREG_vReadU8(SRAMCTL_NON_REPAIR_STATUS, &u8Sts);
    if((u8Sts & NON_REPAIR_STATUS_PM0) == 0){
        //PM0 is good
        u8Valid0 = 0;
        if((u8Sts & NON_REPAIR_STATUS_PM1) == 0)
            u8Valid1 = 1;
        else if((u8Sts & NON_REPAIR_STATUS_PM2) == 0)
            u8Valid1 = 2;
        else if((u8Sts & NON_REPAIR_STATUS_PM3) == 0)
            u8Valid1 = 3;
    }
    else{
        if((u8Sts & NON_REPAIR_STATUS_PM1) == 0){
            //PM1 is good
            u8Valid0 = 1;
            if(u8Sts & NON_REPAIR_STATUS_PM2)
                u8Valid1 = 2;
            else if((u8Sts & NON_REPAIR_STATUS_PM3) == 0)
                u8Valid1 = 3;
        }
        else{
            if((u8Sts & NON_REPAIR_STATUS_PM2) == 0){
                //PM2 is good
                u8Valid0 = 2;
                if(u8Sts & NON_REPAIR_STATUS_PM3)
                    u8Valid1 = 3;
            }
        }
    }

    //-----re-assign the head and tail of all Link Lists 
    u16Head[0] = u8Valid0 * u16Len;
    u16Tail[0] = u16Head[0] + (u16All / 4) - 1;
    u16Head[1] = u16Tail[0] + 1;
    u16Tail[1] = u16Head[1] + (u16All / 4) - 1;

    u16Head[2] = u8Valid1 * u16Len;
    u16Tail[2] = u16Head[2] + (u16All / 4) - 1;
    u16Head[3] = u16Tail[2] + 1;
    u16Tail[3] = u16Head[3] + (u16All / 4) - 1;

    //-----Enable buffer intialization
    SWREG_vBitsOnU8(BUFCTL_INIT, BUF_INIT_HW_OK);
    
    //-----write tail and head at same pointer to stop function of buffer controller
    SWREG_vBitsOffU8(BUFCTL_BUF_CFG, BUF_CNTRL_LL0_3_EN);   //Disable linked list 0~4
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST0_TAIL, 0x0000);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST1_TAIL, 0x0400);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST2_TAIL, 0x0800);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST3_TAIL, 0x0C00);
    SWREG_vBitsOnU8(BUFCTL_BUF_CFG, BUF_CNTRL_LL0_3_EN);    //Enable linked list 0~4

    SWREG_bWaitStatus(BUFCTL_INIT, BUF_INIT_HW_OK, TRUE);

    //------ re-chain free link list:write segmement link of SRAM.
    u32Addr = u16Tail[1];
    u32Addr = (u32Addr << 2) + SRAM_SGMNT_LNK_BASE_ADDR;
    STR_pvMemset(au8Data, 0, SRAM_ENTRY_SIZE_4Byte);
    au8Data[0] = (UINT8)(u16Head[2] & 0xFF);
    au8Data[1] = (UINT8)(u16Head[2] >> 8);
    SWSRAM_bWriteEntry(u32Addr, au8Data);

    //-----set Link List length = 512
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST_LEN0, 512);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST_LEN1, 512);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST_LEN2, 512);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST_LEN3, 512);

    //-----set head and tail
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST0_HEAD, u16Head[0]);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST1_HEAD, u16Head[1]);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST2_HEAD, u16Head[2]);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST3_HEAD, u16Head[3]);
    
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST0_TAIL, u16Tail[0]);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST1_TAIL, u16Tail[1]);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST2_TAIL, u16Tail[2]);
    SWREG_vWriteU16(BUFCTL_FREE_LNK_LST3_TAIL, u16Tail[3]);

    //-----Modify Threshold of Congestion Control
    SWREG_vWriteU16(RESMGMT_LEAVE_SYS_XOFF_THR, 3500);
    SWREG_vWriteU16(RESMGMT_ENTER_SYS_XOFF_THR, 3052);
    SWREG_vWriteU16(RESMGMT_LEAVE_ALL_XOFF_THR, 2661);
    SWREG_vWriteU16(RESMGMT_ENTER_ALL_XOFF_THR, 2312);

    return TRUE;
    
}
#endif /* SUPPORT_2M_PKT_MEM */

#if 0
static void s_vPatchNonArpToCpu(void)
{
    UINT8       u8RegVal;
    STcamEntry  STcamEntryBuf;
    SL2pACEntry SL2ACEntryBuf;
    UINT8       u8EntryIndex = 246;
    UINT16      u16ByteMsk = 0, u16MskType = 0;
    UINT8       byTmpType[2];


    // L2+ mirror to CPU port
    SWREG_vReadU8(FWDCTL_MIRROR_PORT_CFG, &u8RegVal);
    u8RegVal |= 0x1A;
    SWREG_vWriteU8(FWDCTL_MIRROR_PORT_CFG, u8RegVal);


//*** ACL 0 ***//
    //Set entry into TCAM  table
    STR_pvMemset(&STcamEntryBuf, 0 , sizeof(STcamEntry));

    // DMAC_TYPE == broadcast
    STcamEntryBuf.u8DmacType = 2;
    u16MskType |= MSK_DMAC_TYPE;

    //no matter Ipv4 or Non_ipv4 group,check this bit
    u16MskType |= MSK_IPV4;

    byTmpType[0] = 0x08;
    byTmpType[1] = 0x06;

    STcamEntryBuf.UCfg13B.au8AftSV[0] = byTmpType[0];
    STcamEntryBuf.UCfg13B.au8AftSV[1] = byTmpType[1];
    u16ByteMsk |= 0x0003;    //unmaked 1st,2nd octet after SMAC or VLAN-tag (0000 0000 0000 0011 b)

#if defined(__LITTLE_ENDIAN)
    // convert byte array 
    SWSRAM_vEndianConvert(&STcamEntryBuf.UCfg13B.au8AftSV[1],4);
    SWSRAM_vEndianConvert(&STcamEntryBuf.UCfg13B.au8AftSV[5],4);
    SWSRAM_vEndianConvert(&STcamEntryBuf.UCfg13B.au8AftSV[9],4);
#endif   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -