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

📄 emi_pl_tx.uc

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 UC
字号:
/* emi_bw_tx.uc
 *
 * Brief:
 *
 *
 *---------------------------------------------------------------------------
 *                                                                      
 *                  I N T E L   P R O P R I E T A R Y                   
 *                                                                      
 *     COPYRIGHT (c)  2002 BY  INTEL  CORPORATION.  ALL RIGHTS          
 *     RESERVED.   NO  PART  OF THIS PROGRAM  OR  PUBLICATION  MAY      
 *     BE  REPRODUCED,   TRANSMITTED,   TRANSCRIBED,   STORED  IN  A    
 *     RETRIEVAL SYSTEM, OR TRANSLATED INTO ANY LANGUAGE OR COMPUTER    
 *     LANGUAGE IN ANY FORM OR BY ANY MEANS, ELECTRONIC, MECHANICAL,    
 *     MAGNETIC,  OPTICAL,  CHEMICAL, MANUAL, OR OTHERWISE,  WITHOUT    
 *     THE PRIOR WRITTEN PERMISSION OF :                                
 *                                                                      
 *                        INTEL  CORPORATION                            
 *                                                                     
 *                     2200 MISSION COLLEGE BLVD                        
 *                                                                      
 *               SANTA  CLARA,  CALIFORNIA  95052-8119                  
 *                                                                      
 *---------------------------------------------------------------------------
 *
 *
 *  system: IXDP2400
 *  subsystem: DIAG
 *  author: dalsraja, 23 December, 2002
 *  revisions: 
 * 
 * 
 * --------------------------------------------------------------------------
 */

#include "common_uc.h"
/*Added for pL by VGD*/
#define_eval	UP_CTRL_PARITY		(MSF_PARITY_ODD << 2)

#define TX_ELEMENT_SIZE				MSF_ELEMENTSIZE_128
#define TX_ENABLE_MASK				0xF
#define TX_MODE						MSF_POS_UTOPIA
#define TX_WIDTH					MSF_WIDTH_4x8
#define TX_SINGLE_PHY				MSF_SINGLE_PHY

#define TBUF_ELEM_COUNT				(1 << (7 - TX_ELEMENT_SIZE))
#define TBUF_ELEM_COUNT_PER_PORT	(TBUF_ELEM_COUNT >> 2)
#define TBUF_ADDR_SHF				(6 + TX_ELEMENT_SIZE)
#define TX_ELEMENTSIZE_BYTE			(1 << TBUF_ADDR_SHF)

#define TX_CONTROL_EOP				(1 << 8)
#define TX_CONTROL_SOP				(1 << 9)

#define POS_PAYLOAD_LENGTH			64
#define FUTURE_COUNT_SIG_NUM		&future_count_sig
#define FUTURE_COUNT_STEP			48

#define INTER_ME_SIG_NUM			15

#define NUMBER_OF_PORTS				4

#define ME_0						0
#define ME_1						1
#define ME_2						2
#define ME_3						3

#define PORT_0						0
#define PORT_1						1
#define PORT_2						2
#define PORT_3						3

#define SIG_THD_NUM					0

#define SPEED_ADDR					0x1100

.reg cur_me
.reg MsfAddress
.reg future_count_value future_count_incr
.reg byte_count
.reg TxConfigData0
.reg $TxConfigData0
.reg $TxControlWord0 $TxControlWord1
.reg tbuf_element base_element_for_port
.sig msf_sig future_count_sig inter_me_sig

.xfer_order $TxControlWord0 $TxControlWord1

.addr inter_me_sig INTER_ME_SIG_NUM

.set_sig inter_me_sig
br=ctx[0, init#]
ctx_arb[kill]

init#:
.begin
	.reg temp
	local_csr_rd[ACTIVE_CTX_STS]
	immed[temp, 0]
	alu[cur_me, 0x1F, AND, temp, >>3]	// Extract the current ME number
.end

	immed[tbuf_element, 0]
	immed[byte_count, POS_PAYLOAD_LENGTH]
	immed[future_count_value, 0]

.if (cur_me == 0)
	immed[base_element_for_port, (TBUF_ELEM_COUNT_PER_PORT * PORT_0)]
.elif (cur_me == 1)
	immed[base_element_for_port, (TBUF_ELEM_COUNT_PER_PORT * PORT_1)]
.elif (cur_me == 2)
	immed[base_element_for_port, (TBUF_ELEM_COUNT_PER_PORT * PORT_2)]
.else
	immed[base_element_for_port, (TBUF_ELEM_COUNT_PER_PORT * PORT_3)]
.endif

.begin
	.reg temp_scratch_addr $temp_scratch_data
	.sig scratch_sig
	immed[temp_scratch_addr, SPEED_ADDR]
	scratch[read, $temp_scratch_data, temp_scratch_addr, 0, 1], ctx_swap[scratch_sig]
	alu[future_count_incr, --, B, $temp_scratch_data]
.end

	alu[--, cur_me, -, 0]
	beq[init_msf#]
	ctx_arb[inter_me_sig]
	br[msf_init_done#]


init_msf#:
//****************************************************
// Configure TX Control
//****************************************************
	immed[MsfAddress, MSF_TX_CONTROL]
	immed[TxConfigData0, (TX_ELEMENT_SIZE << 2)]	// put control and data into diff freelist
	immed_w1[TxConfigData0, ((TX_ENABLE_MASK << 8) | (TX_MODE << 6) | (TX_WIDTH << 4) | (TX_SINGLE_PHY << 3) | (0<<1)|(0<<0))]
	alu[$TxConfigData0, --, B, TxConfigData0]
	msf[write, $TxConfigData0, MsfAddress, 0, 1], ctx_swap[msf_sig]

	immed[MsfAddress, TX_UP_CONTROL_0]
	immed[TxConfigData0, (UP_CTRL_CP_MODE | UP_CTRL_PARITY | UP_CTRL_CELLSIZE | UP_CTRL_DRTIME)]
	alu[$TxConfigData0, --, B, TxConfigData0]
	msf[write, $TxConfigData0, MsfAddress, 0, 1], ctx_swap[msf_sig]
	immed[MsfAddress, TX_UP_CONTROL_1]
	msf[write, $TxConfigData0, MsfAddress, 0, 1], ctx_swap[msf_sig]
	immed[MsfAddress, TX_UP_CONTROL_2]
	msf[write, $TxConfigData0, MsfAddress, 0, 1], ctx_swap[msf_sig]
	immed[MsfAddress, TX_UP_CONTROL_3]
	msf[write, $TxConfigData0, MsfAddress, 0, 1], ctx_swap[msf_sig]

	immed[MsfAddress, MSF_TX_CONTROL]
	immed[TxConfigData0, (TX_ELEMENT_SIZE << 2)]	// put control and data into diff freelist
	immed_w1[TxConfigData0, ((TX_ENABLE_MASK << 12) | (TX_ENABLE_MASK << 8) | (TX_MODE << 6) | (TX_WIDTH << 4) | (TX_SINGLE_PHY << 3) | (0<<1)|(0<<0))]
	alu[$TxConfigData0, --, B, TxConfigData0]
	msf[write, $TxConfigData0, MsfAddress, 0, 1], ctx_swap[msf_sig]

.begin
	.reg temp
	immed[temp, ((ME_1 << 7) | (SIG_THD_NUM << 4) | (INTER_ME_SIG_NUM << 0))]
	alu[--, --, B, temp]
	cap[fast_wr, ALU, interthread_sig]
	immed[temp, ((ME_2 << 7) | (SIG_THD_NUM << 4) | (INTER_ME_SIG_NUM << 0))]
	alu[--, --, B, temp]
	cap[fast_wr, ALU, interthread_sig]
	immed[temp, ((ME_3 << 7) | (SIG_THD_NUM << 4) | (INTER_ME_SIG_NUM << 0))]
	alu[--, --, B, temp]
	cap[fast_wr, ALU, interthread_sig]
.end


msf_init_done#:
//****************************************************
// Configure the TIMESTAMP registers and configure
// the FUTURE_COUNT_SIGNAL register
//****************************************************
	local_csr_wr[TIMESTAMP_LOW, 0]
	local_csr_wr[TIMESTAMP_HIGH, 0]
	local_csr_wr[CSR_CTX_POINTER, 0]
	local_csr_wr[INDIRECT_FUTURE_COUNT_SIGNAL, FUTURE_COUNT_SIG_NUM]

.begin
	.reg $temp_reg_val
	.sig cap_sig
	cap[read, $temp_reg_val, MISC_CONTROL], ctx_swap[cap_sig]	// Read the MISC_CONTROL reg
	alu[--, $temp_reg_val, OR, 1, <<7]		// Set the timestamp enable bit
	cap[fast_wr, alu, MISC_CONTROL]			// and write to the MISC_CONTROL register
.end

next_packet#:
	local_csr_wr[CSR_CTX_POINTER, 0]
	alu[future_count_value, future_count_value, +, future_count_incr]
	alu[future_count_value, 0, +16, future_count_value]
	local_csr_wr[INDIRECT_CTX_FUTURE_COUNT, future_count_value]


.set_sig future_count_sig
//*******************************************************
// Write the Transmit Control Word with appropriate data
//*******************************************************
.begin
	.reg temp cur_tbuf_elem

	alu[cur_tbuf_elem, base_element_for_port, +, tbuf_element]
	immed[MsfAddress, TBUF_ELEMENT_CONTROL_V]
	alu[MsfAddress, MsfAddress, OR, cur_tbuf_elem, <<3]

	immed[temp, (TX_CONTROL_SOP | TX_CONTROL_EOP)]
	alu[$TxControlWord0, temp, OR, byte_count, <<24]

	immed[$TxControlWord1, 0]

	ctx_arb[future_count_sig]

	msf[write, $TxControlWord0, MsfAddress, 0, 2], ctx_swap[msf_sig]
.end

	alu[tbuf_element, tbuf_element, +, 1]
	alu[tbuf_element, tbuf_element, AND, (TBUF_ELEM_COUNT_PER_PORT - 1)]

	br[next_packet#]

⌨️ 快捷键说明

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