// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: dll_ctrl_mgmt.cpp
// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 2 of the License.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// For the avoidance of doubt, and except that if any non-GPL license
// choice is available it will apply instead, Sun elects to use only
// the General Public License version 2 (GPLv2) at this time for any
// software where a choice of GPL license versions is made
// available with the language indicating that GPLv2 or any later version
// may be used, or where a choice of which version of the GPL is applied is
// otherwise unspecified.
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// ========== Copyright Header End ============================================
/** This function initializes values to be used at DLL **/
DO_NAK_SCHEDULED_CHECK
= 0;
pl_consumer_ph
= sc_spawn(sc_bind(&dll_top::pl_consumer
,this));
tl_consumer_ph
= sc_spawn(sc_bind(&dll_top::tl_consumer
,this));
tl_producer_ph
= sc_spawn(sc_bind(&dll_top::tl_producer
,this));
pl_dllp_producer_ph
= sc_spawn(sc_bind(&dll_top::pl_dllp_producer
,this));
pl_tlp_producer_ph
= sc_spawn(sc_bind(&dll_top::pl_tlp_producer
,this));
ltssm_state_check_ph
= sc_spawn(sc_bind(&dll_top::ltssm_state_check
,this));
fc_init_ph
= sc_spawn(sc_bind(&dll_top::fc_init
,this));
fc_update_ph
= sc_spawn(sc_bind(&dll_top::fc_update
,this));
dll_ctrl_mgmt_ph
= sc_spawn(sc_bind(&dll_top::dll_ctrl_mgmt
,this));
LOG_DEBUG
<< "DLL: SW Reset : threads re-spawned" ;
void dll_top::reset_handler()
csr_port
.set_notify_event(PEU_CSR_A_CORE_STATUS_HW_ADDR
,&csr_core_status_ev
);
csr_port
.set_notify_event(PEU_CSR_A_TLU_ECL_HW_ADDR
,&tlu_ecl_ev
);
//Step 1: Detect reset event
switch(*global_event_type
){
//Step 2: SW Reset activities
LOG_DEBUG
<< "\tDLL: WMR/POR_RESET enter signal..." ;
//Wait for all thread to terminate
if(pl_consumer_ph
.terminated() && tl_consumer_ph
.terminated() &&
tl_producer_ph
.terminated() && pl_dllp_producer_ph
.terminated() &&
pl_tlp_producer_ph
.terminated() && ltssm_state_check_ph
.terminated() &&
fc_init_ph
.terminated() && fc_update_ph
.terminated() &&
dll_ctrl_mgmt_ph
.terminated() )
wait(pl_consumer_ph
.terminated_event()|tl_consumer_ph
.terminated_event()|tl_producer_ph
.terminated_event()|pl_dllp_producer_ph
.terminated_event()|pl_tlp_producer_ph
.terminated_event()|ltssm_state_check_ph
.terminated_event()|fc_init_ph
.terminated_event()|fc_update_ph
.terminated_event()|dll_ctrl_mgmt_ph
.terminated_event());
LOG_DEBUG
<< "DLL: WMR/POR Reset threads terminated" ;
while(!queueTL
.empty()) queueTL
.pop();
while(!queue_DLLP
.empty()) queue_DLLP
.pop();
while(!queue_TLP
.empty()) queue_TLP
.pop();
LOG_DEBUG
<< "DLL: WMR/POR Reset dbs cleared" ;
LOG_DEBUG
<< "\tDLL: WMR/POR_RESET exit signal..." ;
//while((csr_port.read_csr(PEU_CSR_A_CORE_STATUS_HW_ADDR)).range(48,44)!=16) wait(csr_core_status_ev);
//cs2_ev.notify(); //notify FC_INIT that its good to go.
LOG_DEBUG
<<"DLL: SW_RESET_ENTER";
LOG_DEBUG
<<"DLL: SW_RESET_EXIT";
void dll_top::dll_ctrl_mgmt()
LOG_DEBUG
<<"DLL: dll_ctrl_mgmt begins...";
WAIT1(csr_core_status_ev
);
csr_data_reg
= csr_port
.read_csr(PEU_CSR_A_CORE_STATUS_HW_ADDR
);
LOG_DEBUG
<< " Entered DL_INACTIVE state";
if ( csr_data_reg
.range(48,44) == 16 ) // L) state
LOG_DEBUG
<< " Entered DL_INIT stage" ;
if ( INIT_State
== FC_INIT1
) {
Csr_Write_Mask
.range(53,52) = MASK3
;
Csr_Write_Data
.range(53,52) = MASK1
;
csr_port
.write_csr_mask(PEU_CSR_A_CORE_STATUS_HW_ADDR
,Csr_Write_Data
,Csr_Write_Mask
);
else if ( INIT_State
== FC_INIT2
)
Csr_Write_Mask
.range(53,52) = MASK3
;
Csr_Write_Data
.range(53,52) = MASK3
;
csr_port
.write_csr_mask(PEU_CSR_A_CORE_STATUS_HW_ADDR
,Csr_Write_Data
,Csr_Write_Mask
);
if ( FC_Init_Complete
& (csr_data_reg
.range(48,44) == 16) )
Csr_Write_Mask
.range(53,52) = MASK3
;
Csr_Write_Data
.range(53,52) = MASK2
;
csr_port
.write_csr_mask(PEU_CSR_A_CORE_STATUS_HW_ADDR
,Csr_Write_Data
,Csr_Write_Mask
);
if ( csr_data_reg
.range(48,44) != 16 )
Csr_Write_Mask
.range(53,52) = MASK3
;
Csr_Write_Data
.range(53,52) = MASK0
;
csr_port
.write_csr_mask(PEU_CSR_A_CORE_STATUS_HW_ADDR
,Csr_Write_Data
,Csr_Write_Mask
);
LOG_DEBUG
<< " Entered DL_ACTIVE stage";
DL_Status
= 1; // Report DL_UP to TL
if ( csr_data_reg
.range(48,44) != 16 )
Csr_Write_Mask
.range(53,52) = MASK3
;
Csr_Write_Data
.range(53,52) = MASK0
;
csr_port
.write_csr_mask(PEU_CSR_A_CORE_STATUS_HW_ADDR
,Csr_Write_Data
,Csr_Write_Mask
);
LOG_DEBUG
<<"DLL: Out of dll_ctrl_mgmt";