#include "lm5710.h"
#include "general_atten_bits.h"
#include "aeu_inputs.h"
#include "command.h"
static INLINE void lm_inc_er_debug_idx(lm_device_t * pdev)
{
pdev->debug_info.curr_er_debug_idx++;
if (pdev->debug_info.curr_er_debug_idx == MAX_ER_DEBUG_ENTRIES)
{
pdev->debug_info.curr_er_debug_idx=0;
}
}
u8_t lm_recoverable_error(lm_device_t *pdev, u32_t * attn_sig, u32_t arr_size)
{
lm_er_debug_info_t * debug_info = NULL;
u32_t i;
if (!pdev->params.enable_error_recovery || CHIP_IS_E1x(pdev))
{
return FALSE;
}
ASSERT_STATIC(ARRSIZE(debug_info->attn_sig) >= MAX_ATTN_REGS);
DbgBreakIf(arr_size < MAX_ATTN_REGS);
if ((attn_sig[0] & HW_PRTY_ASSERT_SET_0) || (attn_sig[1] & HW_PRTY_ASSERT_SET_1) ||
(attn_sig[2] & HW_PRTY_ASSERT_SET_2) || (attn_sig[3] & HW_PRTY_ASSERT_SET_3))
{
debug_info = &((pdev)->debug_info.er_debug_info[pdev->debug_info.curr_er_debug_idx]);
for (i = 0; i < arr_size; i++)
{
debug_info->attn_sig[i] = attn_sig[i];
}
lm_inc_er_debug_idx(pdev);
DbgMessage(pdev, FATAL, "lm_recoverable_error: funcid:%d, 0:0x%x, 0:0x%x, 0:0x%x, 0:0x%x\n",
ABS_FUNC_ID(pdev), attn_sig[0], attn_sig[1], attn_sig[2], attn_sig[3]);
return TRUE;
}
if (attn_sig[1] & HW_INTERRUT_ASSERT_SET_1)
{
if (attn_sig[1] & AEU_INPUTS_ATTN_BITS_QM_HW_INTERRUPT)
{
debug_info = &((pdev)->debug_info.er_debug_info[pdev->debug_info.curr_er_debug_idx]);
for (i = 0; i < arr_size; i++)
{
debug_info->attn_sig[i] = attn_sig[i];
}
lm_inc_er_debug_idx(pdev);
DbgMessage(pdev, FATAL, "lm_recoverable_error: funcid:%d, 0:0x%x, 0:0x%x, 0:0x%x, 0:0x%x\n",
ABS_FUNC_ID(pdev), attn_sig[0], attn_sig[1], attn_sig[2], attn_sig[3]);
return TRUE;
}
}
if (attn_sig[3] & EVEREST_GEN_ATTN_IN_USE_MASK)
{
if ( GENERAL_ATTEN_OFFSET(ERROR_RECOVERY_ATTENTION_BIT) & attn_sig[3])
{
debug_info = &((pdev)->debug_info.er_debug_info[pdev->debug_info.curr_er_debug_idx]);
for (i = 0; i < arr_size; i++)
{
debug_info->attn_sig[i] = attn_sig[i];
}
lm_inc_er_debug_idx(pdev);
DbgMessage(pdev, FATAL, "lm_recoverable_error: funcid:%d, 0:0x%x, 0:0x%x, 0:0x%x, 0:0x%x\n",
ABS_FUNC_ID(pdev), attn_sig[0], attn_sig[1], attn_sig[2], attn_sig[3]);
return TRUE;
}
}
return FALSE;
}
void enable_blocks_attention(struct _lm_device_t *pdev)
{
u32_t val = 0;
REG_WR(pdev,PXP_REG_PXP_INT_MASK_0,0);
if (!CHIP_IS_E1x(pdev))
{
REG_WR(pdev,PXP_REG_PXP_INT_MASK_1, (PXP_PXP_INT_MASK_1_REG_HST_INCORRECT_ACCESS
| PXP_PXP_INT_MASK_1_REG_HST_VF_DISABLED_ACCESS
| PXP_PXP_INT_MASK_1_REG_HST_PERMISSION_VIOLATION) );
}
REG_WR(pdev,DORQ_REG_DORQ_INT_MASK,0);
REG_WR(pdev,BRB1_REG_BRB1_INT_MASK ,0xFC00);
REG_WR(pdev,QM_REG_QM_INT_MASK ,0);
REG_WR(pdev,TM_REG_TM_INT_MASK ,0);
REG_WR(pdev,XSDM_REG_XSDM_INT_MASK_0 ,0);
REG_WR(pdev,XSDM_REG_XSDM_INT_MASK_1 ,0);
REG_WR(pdev,XCM_REG_XCM_INT_MASK ,0);
REG_WR(pdev,USDM_REG_USDM_INT_MASK_0 ,0);
REG_WR(pdev,USDM_REG_USDM_INT_MASK_1 ,0);
REG_WR(pdev,UCM_REG_UCM_INT_MASK ,0);
REG_WR(pdev,GRCBASE_UPB+PB_REG_PB_INT_MASK ,0);
REG_WR(pdev,CSDM_REG_CSDM_INT_MASK_0 ,0);
REG_WR(pdev,CSDM_REG_CSDM_INT_MASK_1 ,0);
REG_WR(pdev,CCM_REG_CCM_INT_MASK ,0);
val = PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_AFT |
PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_OF |
PXP2_PXP2_INT_MASK_0_REG_PGL_PCIE_ATTN;
if (!CHIP_IS_E1x(pdev))
{
val |= PXP2_PXP2_INT_MASK_0_REG_PGL_READ_BLOCKED |
PXP2_PXP2_INT_MASK_0_REG_PGL_WRITE_BLOCKED;
}
REG_WR(pdev, PXP2_REG_PXP2_INT_MASK_0, val);
REG_WR(pdev,TSDM_REG_TSDM_INT_MASK_0 ,0);
REG_WR(pdev,TSDM_REG_TSDM_INT_MASK_1 ,0);
REG_WR(pdev,TCM_REG_TCM_INT_MASK ,0);
REG_WR(pdev,CDU_REG_CDU_INT_MASK ,0);
REG_WR(pdev,DMAE_REG_DMAE_INT_MASK ,0);
REG_WR(pdev,PBF_REG_PBF_INT_MASK ,0X18);
}
void disable_blocks_attention(struct _lm_device_t *pdev)
{
#define MASK_VALUE_GENERATE(_val) ((u32_t)((((u64_t)0x1)<<_val)-1))
typedef struct _block_mask_info_t
{
u32_t reg_offset;
u32_t mask_value[3];
} block_mask_info_t;
u8_t chip_idx = 0;
u32_t mask_idx = 0;
u32_t val = 0;
u32_t offset = 0;
u32_t mask_value = 0;
static const block_mask_info_t init_mask_values_arr[] =
{
{ ATC_REG_ATC_INT_MASK, { 0,
0,
6 } },
{ BRB1_REG_BRB1_INT_MASK, { 19,
19,
19} },
{ CCM_REG_CCM_INT_MASK, { 11,
11,
11 } },
{ CDU_REG_CDU_INT_MASK, { 7,
7,
7 } },
{ CFC_REG_CFC_INT_MASK, { 2,
2,
2 } },
{ CSDM_REG_CSDM_INT_MASK_0, { 32,
32,
32 } },
{ CSDM_REG_CSDM_INT_MASK_1, { 10,
10,
11 } },
#if 0
{ CSEM_REG_CSEM_INT_MASK_0, { 32,
32,
32 } },
{ CSEM_REG_CSEM_INT_MASK_1, { 10,
11,
11} },
{ DBG_REG_DBG_INT_MASK, { 2,
2,
2 } },
#endif
{ DMAE_REG_DMAE_INT_MASK, { 2,
2,
2 } },
{ DORQ_REG_DORQ_INT_MASK, { 5,
5,
6 } },
#if 0
{ HC_REG_HC_INT_MASK, { 7,
7,
7 } },
#endif
{ IGU_REG_IGU_INT_MASK, { 0,
0,
11 } },
#if 0
{ MISC_REGISTERS_MISC_INT_MASK, { 4,
4,
8 } },
{ NIG_REGISTERS_NIG_INT_MASK_0, { 32,
32,
32 } },
{ NIG_REGISTERS_NIG_INT_MASK_1, { 2,
4,
14 } },
{ PB_REGISTERS_PB_INT_MASK, { 2,
2,
2} },
#endif
{ PBF_REG_PBF_INT_MASK, { 5,
5,
7 } },
{ PGLUE_B_REG_PGLUE_B_INT_MASK, { 0,
0,
9 } },
#if 0
{ PRS_REG_PRS_INT_MASK, { 1,
1,
1 } },
#endif
{ PXP2_REG_PXP2_INT_MASK_0, { 25,
32,
32 } },
#if 0
{ PXP2_REG_PXP2_INT_MASK_1, { 0,
6,
16} },
#endif
{ PXP_REG_PXP_INT_MASK_0, { 32,
32,
32 } },
{ PXP_REG_PXP_INT_MASK_1, { 5,
5,
8 } },
{ QM_REG_QM_INT_MASK, { 2,
2,
14 } },
#if 0
{ SEM_FAST_REG_SEM_FAST_INT_MASK, { 1,
1,
1} },
{ SRC_REG_SRC_INT_MASK, { 1,
3,
3 } },
#endif
{ TCM_REG_TCM_INT_MASK, { 11,
11,
11 } },
{ TM_REG_TM_INT_MASK, { 1,
1,
1} },
{ TSDM_REG_TSDM_INT_MASK_0, { 32,
32,
32 } },
{ TSDM_REG_TSDM_INT_MASK_1, { 10,
10,
11 } },
#if 0
{ TSEM_REG_TSEM_INT_MASK_0, { 32,
32,
32 } },
{ TSEM_REG_TSEM_INT_MASK_1, { 10,
11,
13 } },
#endif
{ UCM_REG_UCM_INT_MASK, { 11,
11,
11} },
{ USDM_REG_USDM_INT_MASK_0, { 32,
32,
32 } },
{ USDM_REG_USDM_INT_MASK_1, { 10,
10,
11 } },
#if 0
{ USEM_REG_USEM_INT_MASK_0, { 32,
32,
32 } },
{ USEM_REG_USEM_INT_MASK_1, { 10,
11,
11 } },
#endif
{ VFC_REG_VFC_INT_MASK, { 0,
0,
1 } },
{ XCM_REG_XCM_INT_MASK, { 14,
14,
14 } },
{ XSDM_REG_XSDM_INT_MASK_0, { 32,
32,
32 } },
{ XSDM_REG_XSDM_INT_MASK_1, { 10,
10,
11} },
#if 0
{ XSEM_REG_XSEM_INT_MASK_0, { 32,
32,
32 } },
{ XSEM_REG_XSEM_INT_MASK_1, { 10,
11,
13 } } ,
#endif
};
if (IS_VFDEV(pdev))
{
return;
}
if CHIP_IS_E1( pdev )
{
chip_idx = 0;
}
else if CHIP_IS_E1H(pdev)
{
chip_idx = 1;
}
else if CHIP_IS_E2E3(pdev)
{
chip_idx = 2;
}
else
{
DbgBreakIf(1);
}
DbgBreakIf( chip_idx >= ARRSIZE( init_mask_values_arr[0].mask_value ) );
for( mask_idx = 0; mask_idx < ARRSIZE(init_mask_values_arr); mask_idx++ )
{
mask_value = init_mask_values_arr[mask_idx].mask_value[chip_idx] ;
if( mask_value )
{
val = MASK_VALUE_GENERATE(mask_value);
offset = init_mask_values_arr[mask_idx].reg_offset;
REG_WR(pdev, offset, val );
}
}
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_1,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_2,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_3,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_1,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_2,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_3,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_4,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_5,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_6,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_7,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_4,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_5,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_6,0);
REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_7,0);
}
void lm_reset_mask_attn(struct _lm_device_t *pdev)
{
REG_WR(pdev,PXP_REG_PXP_INT_MASK_0,0xffffffff);
if (CHIP_IS_E1x(pdev))
{
REG_WR(pdev,PXP_REG_PXP_INT_MASK_1,0x1f);
}
else
{
REG_WR(pdev,PXP_REG_PXP_INT_MASK_1,0xff);
}
REG_WR(pdev,PXP2_REG_PXP2_INT_MASK_0,0xffffffff);
}
static void lm_latch_attn_everest_processing(lm_device_t *pdev, u32_t sig_word_aft_inv)
{
u32_t latch_bit_to_clr = 0;
u32_t val = 0;
u32_t offset = 0;
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCR);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x1;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCR received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCT);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x2;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCT received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCN);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x4;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCN received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCU);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x8;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCU received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCP);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x10;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCP received!!! \n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_TIMEOUT_GRC);
if ( offset & sig_word_aft_inv)
{
#define GRC_TIMEOUT_MASK_ADDRESS(_val) ( (_val) & ((1<<19)-1))
#define GRC_TIMEOUT_MASK_FUNCTION(_val) ( (_val>>20) & ((1<<3)-1))
#define GRC_TIMEOUT_MASK_MASTER(_val) ( (_val>>24) & ((1<<4)-1))
u32_t addr = 0;
u32_t func = 0;
u32_t master = 0;
u32_t grc_timeout_cnt = 0;
u8_t b_assert = TRUE;
u8_t b_nig_reset_called = lm_is_nig_reset_called(pdev);
const u32_t grc_timeout_max_ignore = pdev->params.grc_timeout_max_ignore;
latch_bit_to_clr = 0x20;
if( b_nig_reset_called )
{
b_assert = FALSE;
}
if (!CHIP_IS_E1(pdev))
{
val = REG_RD(pdev, MISC_REG_GRC_TIMEOUT_ATTN);
addr = GRC_TIMEOUT_MASK_ADDRESS(val);
func = GRC_TIMEOUT_MASK_FUNCTION(val);
master = GRC_TIMEOUT_MASK_MASTER(val);
if( 2 != master )
{
b_assert = TRUE;
}
}
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_TIMEOUT_GRC received!!! val=0x%08x master=0x%x func=0x%x addr=0x%xx4=0x%X)\n"
,val, master, func, addr, addr*4 );
grc_timeout_cnt = lm_inc_cnt_grc_timeout_ignore(pdev, val);
if( grc_timeout_cnt >= grc_timeout_max_ignore )
{
b_assert = TRUE;
}
else
{
b_assert = FALSE;
}
if( b_assert )
{
DbgBreakIf(1);
}
if( b_nig_reset_called )
{
lm_clear_nig_reset_called(pdev);
}
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RSVD_GRC);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x40;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RSVD_GRC received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_ROM_PARITY_MCP);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x80;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
val = lm_mcp_check(pdev);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_ROM_PARITY_MCP received!!!\n");
if (CHIP_IS_E1x(pdev))
{
DbgBreakIfAll(1);
}
else
{
DbgBreakIf(1);
}
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_UM_RX_PARITY_MCP);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x100;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
val = lm_mcp_check(pdev);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_UM_RX_PARITY_MCP received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_UM_TX_PARITY_MCP);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x200;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
val = lm_mcp_check(pdev);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_UM_TX_PARITY_MCP received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_SCPAD_PARITY_MCP);
if ( offset & sig_word_aft_inv)
{
latch_bit_to_clr = 0x400;
REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
val = lm_mcp_check(pdev);
DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_SCPAD_PARITY_MCP received!!!\n");
DbgBreakIfAll(1);
}
}
static void lm_hard_wired_processing(lm_device_t *pdev, u16_t assertion_proc_flgs)
{
if (PORT_ID(pdev) == 0)
{
#if 0
if (assertion_proc_flgs & ATTN_SW_TIMER_4_FUNC)
{
}
#endif
if (assertion_proc_flgs & GPIO_2_FUNC)
{
DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_1_FUNC!\n");
}
if (assertion_proc_flgs & GPIO_3_FUNC)
{
DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_2_FUNC!\n");
}
if (assertion_proc_flgs & GPIO_4_FUNC)
{
DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_3_FUNC0!\n");
}
if (assertion_proc_flgs & ATTN_GENERAL_ATTN_1)
{
DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_1! and clean it!!!\n");
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_1,0x0);
}
if (assertion_proc_flgs & ATTN_GENERAL_ATTN_2)
{
DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_2! and clean it!!!\n");
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_2,0x0);
}
if (assertion_proc_flgs & ATTN_GENERAL_ATTN_3)
{
DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_3! and clean it!!!\n");
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_3,0x0);
}
}
else
{
DbgBreakIf(PORT_ID(pdev) != 1);
if (assertion_proc_flgs & ATTN_SW_TIMER_4_FUNC1)
{
}
if (assertion_proc_flgs & GPIO_2_FUNC1)
{
DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_1_FUNC1!\n");
}
if (assertion_proc_flgs & GPIO_3_FUNC1)
{
DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_2_FUNC1!\n");
}
if (assertion_proc_flgs & GPIO_4_FUNC1)
{
DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_3_FUNC1!\n");
}
if (assertion_proc_flgs & ATTN_GENERAL_ATTN_4)
{
DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_4! and clean it!!!\n");
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_4,0x0);
}
if (assertion_proc_flgs & ATTN_GENERAL_ATTN_5)
{
DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_5! and clean it!!!\n");
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_5,0x0);
}
if (assertion_proc_flgs & ATTN_GENERAL_ATTN_6)
{
DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_6! and clean it!!!\n");
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_6,0x0);
}
}
}
static void lm_nig_processing(lm_device_t *pdev)
{
u32_t nig_status_port = 0;
u32_t unicore_val = 0;
u32_t is_unicore_intr_asserted = 0;
lm_link_update(pdev);
if (PORT_ID(pdev) == 0)
{
nig_status_port = REG_RD(pdev, NIG_REG_STATUS_INTERRUPT_PORT0);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_MI_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_CFG_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_CFG_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_CFG_CHANGE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_STATUS_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_LINK_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_CHANGE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_ATTN, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_ATTN, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_ATTN_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MAC_CRS_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_AUTONEG_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_FIBER_RXACT_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_AN_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_RX_SIGDET_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_REMOTEMDIOREQ, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_REMOTEMDIOREQ, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_REMOTEMDIOREQ_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_AUTONEG_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_FIBER_RXACT_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_AN_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_RX_SIGDET_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MAC_CRS_SIZE);
REG_WR(pdev, NIG_REG_STATUS_INTERRUPT_PORT0, nig_status_port);
}
else
{
DbgBreakIf(PORT_ID(pdev) != 1);
nig_status_port = REG_RD(pdev, NIG_REG_STATUS_INTERRUPT_PORT1);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_MI_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_MI_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_MI_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_CFG_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_CFG_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_CFG_CHANGE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_STATUS_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_LINK_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_CHANGE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_ATTN, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_ATTN, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_ATTN_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MAC_CRS_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_AUTONEG_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_FIBER_RXACT_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_AN_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_RX_SIGDET_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_REMOTEMDIOREQ, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_REMOTEMDIOREQ, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_REMOTEMDIOREQ_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_AUTONEG_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_FIBER_RXACT_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_AN_COMPLETE_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_MR_PAGE_RX_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_RX_SIGDET_SIZE);
HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MAC_CRS_SIZE);
REG_WR(pdev, NIG_REG_STATUS_INTERRUPT_PORT1, nig_status_port);
}
}
void lm_handle_assertion_processing(lm_device_t *pdev, u16_t assertion_proc_flgs)
{
u32_t val = 0;
u32_t port_reg_name = 0;
u32_t mask_val = 0;
u32_t nig_mask = 0;
DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: assertion_proc_flgs:%d\n", assertion_proc_flgs);
DbgBreakIf(pdev->vars.attn_state & assertion_proc_flgs);
ASSERT_STATIC( HW_LOCK_RESOURCE_PORT0_ATT_MASK +1 == HW_LOCK_RESOURCE_PORT1_ATT_MASK );
ASSERT_STATIC( NIG_REG_MASK_INTERRUPT_PORT0 + 4 == NIG_REG_MASK_INTERRUPT_PORT1 );
lm_hw_lock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev), TRUE);
port_reg_name = PORT_ID(pdev) ? MISC_REG_AEU_MASK_ATTN_FUNC_1 : MISC_REG_AEU_MASK_ATTN_FUNC_0;
mask_val=REG_RD(pdev, port_reg_name);
pdev->vars.aeu_mask_attn_func = mask_val & 0xff;
DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: BEFORE: aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
pdev->vars.aeu_mask_attn_func &= ~(assertion_proc_flgs & 0xff);
REG_WR(pdev, port_reg_name, pdev->vars.aeu_mask_attn_func);
DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: AFTER : aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
lm_hw_unlock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev));
DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: BEFORE: attn_state:0x%x\n", pdev->vars.attn_state);
pdev->vars.attn_state |= assertion_proc_flgs;
DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: AFTER : attn_state:0x%x\n", pdev->vars.attn_state);
if (assertion_proc_flgs & ATTN_HARD_WIRED_MASK)
{
lm_hard_wired_processing(pdev, assertion_proc_flgs);
}
if (assertion_proc_flgs & ATTN_NIG_FOR_FUNC)
{
MM_ACQUIRE_PHY_LOCK(pdev);
nig_mask = REG_RD(pdev, NIG_REG_MASK_INTERRUPT_PORT0 + 4*PORT_ID(pdev));
REG_WR(pdev, NIG_REG_MASK_INTERRUPT_PORT0 + 4*PORT_ID(pdev), 0);
if( nig_mask )
{
lm_nig_processing(pdev);
}
else
{
DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: got attention when nig_mask is 0\n" );
}
}
val = assertion_proc_flgs;
if (INTR_BLK_TYPE(pdev) == INTR_BLK_HC)
{
REG_WR(pdev, HC_REG_COMMAND_REG + PORT_ID(pdev)*32 + COMMAND_REG_ATTN_BITS_SET,val);
}
else
{
u32_t cmd_addr = IGU_CMD_ATTN_BIT_SET_UPPER;
if (INTR_BLK_ACCESS(pdev) == INTR_BLK_ACCESS_IGUMEM)
{
REG_WR(pdev, BAR_IGU_INTMEM + cmd_addr*8, val);
}
else
{
struct igu_ctrl_reg cmd_ctrl;
u8_t igu_func_id = 0;
igu_func_id = IGU_FUNC_ID(pdev);
cmd_ctrl.ctrl_data =
((cmd_addr << IGU_CTRL_REG_ADDRESS_SHIFT) |
(igu_func_id << IGU_CTRL_REG_FID_SHIFT) |
(IGU_CTRL_CMD_TYPE_WR << IGU_CTRL_REG_TYPE_SHIFT));
REG_WR(pdev, IGU_REG_COMMAND_REG_32LSB_DATA, val);
REG_WR(pdev, IGU_REG_COMMAND_REG_CTRL, cmd_ctrl.ctrl_data);
}
}
if (assertion_proc_flgs & ATTN_NIG_FOR_FUNC)
{
u8_t blk_type = INTR_BLK_TYPE(pdev);
u8_t blk_access = INTR_BLK_ACCESS(pdev);
if ( ( blk_type != INTR_BLK_HC ) && ( blk_access == INTR_BLK_ACCESS_IGUMEM ))
{
u32 cnt = 0;
do
{
val = REG_RD(pdev, IGU_REG_ATTENTION_ACK_BITS);
}
while (((val & ATTN_NIG_FOR_FUNC) == 0) && (++cnt < MAX_IGU_ATTN_ACK_TO));
if (!val)
{
DbgMessage(pdev, FATAL, "Failed to verify IGU ack on time\n");
}
}
REG_WR(pdev, NIG_REG_MASK_INTERRUPT_PORT0 + 4*PORT_ID(pdev), nig_mask);
MM_RELEASE_PHY_LOCK(pdev);
}
}
static u32_t lm_cfc_attn_everest_processing(lm_device_t *pdev)
{
u32_t val, valc;
val = REG_RD(pdev,CFC_REG_CFC_INT_STS);
DbgMessage(pdev, FATAL, "CFC hw attention 0x%x\n",val);
if (val) {
pdev->vars.cfc_int_status_cnt++;
if (val & 0x2)
{
}
}
valc = REG_RD(pdev,CFC_REG_CFC_INT_STS_CLR);
return val;
}
static void lm_pxp_attn_everest_processing(lm_device_t *pdev)
{
u32_t val = REG_RD(pdev,PXP_REG_PXP_INT_STS_0);
DbgMessage(pdev, FATAL, "PXP hw attention 0x%x\n",val);
if (val & 0x18000)
{
DbgBreakIfAll(1);
}
}
static void lm_spio5_attn_everest_processing(lm_device_t *pdev)
{
u32_t val = 0;
u32_t offset = 0;
u32_t ext_phy_config = 0;
const u8_t port_id = PORT_ID(pdev);
PHY_HW_LOCK(pdev);
elink_hw_reset_phy(&pdev->params.link);
PHY_HW_UNLOCK(pdev);
offset = ( 0 == port_id ) ? MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0 : MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 ;
val = REG_RD(pdev, offset );
DbgMessage(pdev, FATAL, "lm_spio5_attn_everest_processing: SPIO5 hw attention 0x%x\n",val);
RESET_FLAGS(val, AEU_INPUTS_ATTN_BITS_SPIO5 ) ;
REG_WR(pdev, offset, val ) ;
MM_ACQUIRE_PHY_LOCK(pdev);
offset = OFFSETOF(shmem_region_t,dev_info.port_hw_config[port_id].external_phy_config);
LM_SHMEM_READ(pdev, offset, &ext_phy_config);
RESET_FLAGS(ext_phy_config, PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK ) ;
SET_FLAGS(ext_phy_config, PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE ) ;
LM_SHMEM_WRITE(pdev, offset, ext_phy_config);
DbgMessage(pdev, WARN, "lm_spio5_attn_everest_processing: external_phy_type 0x%x\n",ext_phy_config);
pdev->vars.link_status = LM_STATUS_LINK_DOWN;
mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
MM_RELEASE_PHY_LOCK(pdev);
mm_event_log_generic( pdev, LM_LOG_ID_FAN_FAILURE );
mm_indicate_hw_failure(pdev);
}
void lm_check_fan_failure(struct _lm_device_t *pdev)
{
u32_t val = 0;
if (IS_VFDEV(pdev))
{
return;
}
val = REG_RD(pdev, MISC_REG_AEU_AFTER_INVERT_1_FUNC_0 + PORT_ID(pdev)*4);
if( GET_FLAGS(val, AEU_INPUTS_ATTN_BITS_SPIO5))
{
lm_spio5_attn_everest_processing(pdev);
}
}
static void lm_pmf_or_link_event(lm_device_t *pdev, u32_t drv_status)
{
u32_t val = 0;
DbgMessage(pdev, WARN, "lm_pmf_or_link_event: sync general attention received!!! for func%d\n",FUNC_ID(pdev));
MM_ACQUIRE_PHY_LOCK(pdev);
elink_link_status_update(&pdev->params.link,&pdev->vars.link);
lm_link_report(pdev);
MM_RELEASE_PHY_LOCK(pdev);
if (!IS_PMF(pdev) && GET_FLAGS(drv_status,DRV_STATUS_PMF))
{
pdev->vars.is_pmf = PMF_MIGRATION;
MM_ACQUIRE_PHY_LOCK(pdev);
lm_stats_on_pmf_update(pdev,TRUE);
MM_RELEASE_PHY_LOCK(pdev);
val = (0xff0f | (1 << (VNIC_ID(pdev) + 4)));
if (INTR_BLK_TYPE(pdev) == INTR_BLK_HC)
{
REG_WR(pdev, (PORT_ID(pdev) ? HC_REG_TRAILING_EDGE_1 : HC_REG_TRAILING_EDGE_0), val);
REG_WR(pdev, (PORT_ID(pdev) ? HC_REG_LEADING_EDGE_1 : HC_REG_LEADING_EDGE_0) , val);
}
else
{
if (CHIP_IS_E3(pdev))
{
val &= ~ATTN_SW_TIMER_4_FUNC;
}
REG_WR(pdev, IGU_REG_TRAILING_EDGE_LATCH, val);
REG_WR(pdev, IGU_REG_LEADING_EDGE_LATCH, val);
}
if(TRUE == IS_DCB_ENABLED(pdev))
{
lm_dcbx_pmf_migration(pdev);
}
}
}
static void lm_dcc_event(lm_device_t *pdev, u32_t dcc_event)
{
u32_t val = 0;
u32_t event_val_current = 0;
u32_t fw_resp = 0 ;
lm_status_t lm_status = LM_STATUS_FAILURE ;
DbgMessage(pdev, WARN, "lm_dcc_event: dcc_event=0x%x\n",dcc_event);
if( !IS_MULTI_VNIC(pdev) )
{
DbgBreakIf(1);
return;
}
LM_MFCFG_READ(pdev, OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].config), &val);
pdev->hw_info.mf_info.func_mf_cfg = val ;
event_val_current = DRV_STATUS_DCC_DISABLE_ENABLE_PF ;
if GET_FLAGS( dcc_event, event_val_current )
{
if( GET_FLAGS( pdev->hw_info.mf_info.func_mf_cfg, FUNC_MF_CFG_FUNC_DISABLED ) )
{
DbgMessage(pdev, WARN, "lm_dcc_event: mf_cfg function disabled val=0x%x\n",val);
}
else
{
DbgMessage(pdev, WARN, "lm_dcc_event: mf_cfg function enabled val=0x%x\n",val);
}
lm_status = LM_STATUS_SUCCESS ;
RESET_FLAGS( dcc_event, event_val_current );
}
event_val_current = DRV_STATUS_DCC_BANDWIDTH_ALLOCATION ;
if GET_FLAGS(dcc_event, event_val_current)
{
if( !IS_PMF(pdev) )
{
DbgBreakIf(1);
return;
}
lm_status = LM_STATUS_SUCCESS ;
RESET_FLAGS( dcc_event, event_val_current );
}
if (dcc_event)
{
lm_status = lm_mcp_cmd_send_recieve( pdev, lm_mcp_mb_header, DRV_MSG_CODE_DCC_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &fw_resp ) ;
}
else
{
if( LM_STATUS_SUCCESS == lm_status )
{
MM_ACQUIRE_PHY_LOCK(pdev);
elink_link_status_update(&pdev->params.link,&pdev->vars.link);
lm_link_report(pdev);
MM_RELEASE_PHY_LOCK(pdev);
}
lm_status = lm_mcp_cmd_send_recieve( pdev, lm_mcp_mb_header, DRV_MSG_CODE_DCC_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &fw_resp ) ;
}
DbgBreakIf( lm_status != LM_STATUS_SUCCESS );
}
static lm_status_t lm_set_bandwidth_event(lm_device_t *pdev)
{
u32_t mcp_resp = 0;
lm_status_t lm_status = LM_STATUS_SUCCESS;
DbgBreakIf(!IS_SD_UFP_MODE(pdev) && (!IS_MULTI_VNIC(pdev) || !pdev->vars.is_pmf));
MM_ACQUIRE_PHY_LOCK(pdev);
lm_reload_link_and_cmng(pdev);
lm_mcp_cmd_send_recieve(pdev,lm_mcp_mb_header, DRV_MSG_CODE_SET_MF_BW_ACK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
if ( mcp_resp != FW_MSG_CODE_SET_MF_BW_DONE)
{
DbgBreakIf(mcp_resp != FW_MSG_CODE_SET_MF_BW_DONE);
lm_status = LM_STATUS_FAILURE;
goto _exit;
}
mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
sync_link_status(pdev);
_exit:
MM_RELEASE_PHY_LOCK(pdev);
return lm_status;
}
typedef enum drv_info_opcode drv_info_opcode_t;
lm_status_t lm_stats_drv_info_to_mfw_event( struct _lm_device_t* pdev )
{
u32_t val = 0;
u32_t drv_msg = 0;
u32_t ver = 0;
u32_t fw_resp = 0 ;
lm_status_t lm_status = LM_STATUS_SUCCESS ;
drv_info_opcode_t drv_info_op = -1;
if( !LM_SHMEM2_HAS(pdev, drv_info_control) )
{
DbgBreakIfAll(!LM_SHMEM2_HAS(pdev, drv_info_control));
return LM_STATUS_FAILURE;
}
LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t, drv_info_control), &val );
ver = ( GET_FLAGS( val, DRV_INFO_CONTROL_VER_MASK ) ) >> DRV_INFO_CONTROL_VER_SHIFT ;
do
{
if( DRV_INFO_CUR_VER != ver )
{
drv_msg = DRV_MSG_CODE_DRV_INFO_NACK;
break;
}
drv_info_op = ( GET_FLAGS( val, DRV_INFO_CONTROL_OP_CODE_MASK ) ) >> DRV_INFO_CONTROL_OP_CODE_SHIFT;
lm_status = lm_stats_drv_info_to_mfw_assign(pdev, drv_info_op );
if( LM_STATUS_SUCCESS != lm_status )
{
drv_msg = DRV_MSG_CODE_DRV_INFO_NACK;
break;
}
LM_SHMEM2_WRITE(pdev, OFFSETOF(shmem2_region_t, drv_info_host_addr_lo), pdev->vars.stats.stats_collect.drv_info_to_mfw.drv_info_to_mfw_phys_addr.as_u32.low );
LM_SHMEM2_WRITE(pdev, OFFSETOF(shmem2_region_t, drv_info_host_addr_hi), pdev->vars.stats.stats_collect.drv_info_to_mfw.drv_info_to_mfw_phys_addr.as_u32.high );
drv_msg = DRV_MSG_CODE_DRV_INFO_ACK;
} while(0);
lm_status = lm_mcp_cmd_send_recieve( pdev, lm_mcp_mb_header, drv_msg, 0, MCP_CMD_DEFAULT_TIMEOUT, &fw_resp );
return lm_status;
}
static lm_status_t lm_ufp_pf_disable(lm_device_t *pdev)
{
lm_status_t status = LM_STATUS_SUCCESS;
u32_t mcp_resp = 0;
MM_ACQUIRE_PHY_LOCK(pdev);
pdev->vars.link_status = LM_STATUS_LINK_DOWN;
mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
MM_RELEASE_PHY_LOCK(pdev);
if(status == LM_STATUS_SUCCESS)
lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
else
lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
DbgBreakIf(mcp_resp != FW_MSG_CODE_OEM_ACK);
return status;
}
static void lm_ufp_pf_enable(lm_device_t *pdev)
{
lm_status_t status = LM_STATUS_SUCCESS;
u32_t mcp_resp = 0;
struct function_update_data *data = LM_SLOWPATH(pdev, ufp_function_update_data);
const lm_address_t data_phys = LM_SLOWPATH_PHYS(pdev, ufp_function_update_data);
lm_hardware_mf_info_t *mf_info = &pdev->hw_info.mf_info;
u32_t tag = 0;
MM_ACQUIRE_PHY_LOCK(pdev);
lm_reload_link_and_cmng(pdev);
MM_RELEASE_PHY_LOCK(pdev);
LM_MFCFG_READ(pdev, OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].e1hov_tag),&tag);
mf_info->ext_id = (u16_t)tag;
pdev->params.ovlan = (u16_t)tag;
init_nig_func(pdev);
DbgBreakIf(pdev->slowpath_info.ufp_func_ramrod_state != UFP_RAMROD_NOT_POSTED);
data->sd_vlan_tag_change_flg = TRUE;
data->sd_vlan_tag = mm_cpu_to_le16((u16_t)tag);
data->echo = FUNC_UPDATE_RAMROD_SOURCE_UFP;
status = lm_eq_ramrod_post_sync(pdev,
RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
data_phys.as_u64,CMD_PRIORITY_NORMAL,
&pdev->slowpath_info.ufp_func_ramrod_state,
UFP_RAMROD_PF_LINK_UPDATE_POSTED,
UFP_RAMROD_COMPLETED);
if(status == LM_STATUS_SUCCESS)
lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
else
lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
DbgBreakIf(mcp_resp != FW_MSG_CODE_OEM_ACK);
pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_NOT_POSTED;
}
static lm_status_t lm_oem_event(lm_device_t *pdev, u32_t event)
{
lm_status_t lm_status = LM_STATUS_SUCCESS;
const u32_t offset = OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].config);
u32_t config = 0;
DbgMessage(pdev, INFORM, "oem_event 0x%x\n", event);
LM_MFCFG_READ(pdev, offset, &config);
pdev->hw_info.mf_info.func_mf_cfg = config ;
if (event & DRV_STATUS_OEM_DISABLE_ENABLE_PF)
{
if((config & FUNC_MF_CFG_FUNC_DISABLED) || (config & FUNC_MF_CFG_FUNC_DELETED))
{
lm_status = lm_ufp_pf_disable(pdev);
if (lm_status != LM_STATUS_SUCCESS)
{
DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
return lm_status;
}
}
else
{
#ifdef EDIAG
lm_ufp_pf_enable(pdev);
#else
lm_status = MM_REGISTER_LPME(pdev, lm_ufp_pf_enable, TRUE, TRUE);
#endif
if (lm_status != LM_STATUS_SUCCESS)
{
DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
return lm_status;
}
}
}
else if (event & DRV_STATUS_OEM_BANDWIDTH_ALLOCATION)
{
lm_status = lm_set_bandwidth_event(pdev);
if (lm_status != LM_STATUS_SUCCESS)
{
DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
return lm_status;
}
}
return lm_status;
}
static void lm_update_svid(lm_device_t *pdev)
{
lm_hardware_mf_info_t *mf_info = &pdev->hw_info.mf_info;
u32_t tag = 0;
u32_t mcp_resp = 0;
lm_status_t lm_status = LM_STATUS_SUCCESS;
struct function_update_data *data = LM_SLOWPATH(pdev, ufp_function_update_data);
const lm_address_t data_phys = LM_SLOWPATH_PHYS(pdev, ufp_function_update_data);
LM_MFCFG_READ(pdev, OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].e1hov_tag),&tag);
mf_info->ext_id = (u16_t)tag;
pdev->params.ovlan = (u16_t)tag;
init_nig_func(pdev);
DbgBreakIf(pdev->slowpath_info.ufp_func_ramrod_state != UFP_RAMROD_NOT_POSTED);
data->sd_vlan_tag_change_flg = TRUE;
data->sd_vlan_tag = mm_cpu_to_le16((u16_t)tag);
data->echo = FUNC_UPDATE_RAMROD_SOURCE_UFP;
lm_status = lm_eq_ramrod_post_sync(pdev,
RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
data_phys.as_u64,CMD_PRIORITY_NORMAL,
&pdev->slowpath_info.ufp_func_ramrod_state,
UFP_RAMROD_PF_UPDATE_POSTED,
UFP_RAMROD_COMPLETED);
if(lm_status == LM_STATUS_SUCCESS)
lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_UPDATE_SVID_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
else
lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_UPDATE_SVID_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
DbgBreakIf(mcp_resp != DRV_MSG_CODE_OEM_UPDATE_SVID_ACK);
pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_NOT_POSTED;
}
#ifndef EDIAG
static void lm_ufp_update_priority(lm_device_t *pdev)
{
lm_hardware_mf_info_t *mf_info = &pdev->hw_info.mf_info;
u32_t new_priority = 0;
u32_t mcp_resp = 0;
lm_status_t lm_status = LM_STATUS_SUCCESS;
struct function_update_data *data = LM_SLOWPATH(pdev, ufp_function_update_data);
const lm_address_t data_phys = LM_SLOWPATH_PHYS(pdev, ufp_function_update_data);
DbgBreakIf(pdev->slowpath_info.ufp_func_ramrod_state != UFP_RAMROD_NOT_POSTED);
data->sd_vlan_force_pri_change_flg = TRUE;
data->sd_vlan_force_pri_flg = TRUE;
data->echo = FUNC_UPDATE_RAMROD_SOURCE_UFP;
lm_status = lm_eq_ramrod_post_sync(pdev,
RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
data_phys.as_u64,CMD_PRIORITY_NORMAL,
&pdev->slowpath_info.ufp_func_ramrod_state,
UFP_RAMROD_PF_UPDATE_POSTED,
UFP_RAMROD_COMPLETED);
pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_NOT_POSTED;
}
#endif
static lm_status_t lm_svid_event(lm_device_t *pdev)
{
lm_status_t lm_status = LM_STATUS_SUCCESS;
#ifdef EDIAG
lm_update_svid(pdev);
#else
lm_status = MM_REGISTER_LPME(pdev, lm_update_svid, TRUE, TRUE);
#endif
if (lm_status != LM_STATUS_SUCCESS)
{
DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
return lm_status;
}
return lm_status;
}
static void lm_generic_event(lm_device_t *pdev)
{
u32_t val = 0;
u32_t offset = 0;
u8_t call_pmf_or_link = FALSE;
const u8_t func_id = FUNC_ID(pdev);
offset = MISC_REG_AEU_GENERAL_ATTN_12 + 4*func_id;
REG_WR(pdev, offset ,0x0);
offset = OFFSETOF(shmem_region_t, func_mb[FUNC_MAILBOX_ID(pdev)].drv_status) ;
LM_SHMEM_READ(pdev,
offset,
&val);
if (GET_FLAGS( val, DRV_STATUS_VF_DISABLED))
{
u32_t mcp_vf_disabled[E2_VF_MAX / 32] = {0};
u32_t i, fw_resp = 0;
for (i = 0; i < ARRSIZE(mcp_vf_disabled); i++)
{
LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t,mcp_vf_disabled[i]), &mcp_vf_disabled[i]);
}
DbgMessage(pdev, FATAL, "lm_generic_event: DRV_STATUS_VF_DISABLED received for vfs bitmap %x %x!!!\n", mcp_vf_disabled[0], mcp_vf_disabled[1]);
for (i = 0; i < ARRSIZE(mcp_vf_disabled) ; i++)
{
LM_SHMEM2_WRITE(pdev, OFFSETOF(shmem2_region_t,drv_ack_vf_disabled[FUNC_MAILBOX_ID(pdev)][i]), mcp_vf_disabled[i]);
}
lm_mcp_cmd_send_recieve( pdev,
lm_mcp_mb_header,
DRV_MSG_CODE_VF_DISABLED_DONE,
0,
MCP_CMD_DEFAULT_TIMEOUT,
&fw_resp);
return;
}
if(IS_MULTI_VNIC(pdev))
{
if( GET_FLAGS( val, DRV_STATUS_DCC_EVENT_MASK ) )
{
lm_dcc_event(pdev, (DRV_STATUS_DCC_EVENT_MASK & val) );
}
if (GET_FLAGS(val, DRV_STATUS_SET_MF_BW ))
{
lm_set_bandwidth_event(pdev);
}
if ( GET_FLAGS(val, DRV_STATUS_AFEX_EVENT_MASK) )
{
lm_niv_event(pdev, GET_FLAGS(val, DRV_STATUS_AFEX_EVENT_MASK) );
}
}
if GET_FLAGS(val, DRV_STATUS_DRV_INFO_REQ)
{
lm_stats_drv_info_to_mfw_event(pdev);
}
call_pmf_or_link = IS_MULTI_VNIC(pdev) && !pdev->vars.is_pmf;
if (GET_FLAGS(pdev->vars.link.periodic_flags, ELINK_PERIODIC_FLAGS_LINK_EVENT))
{
DbgMessage(pdev, WARN, "lm_generic_event: ELINK_PERIODIC_FLAGS_LINK_EVENT func_id=%d!!!\n", func_id );
MM_ACQUIRE_PHY_LOCK_DPC(pdev);
RESET_FLAGS(pdev->vars.link.periodic_flags, ELINK_PERIODIC_FLAGS_LINK_EVENT);
MM_RELEASE_PHY_LOCK_DPC(pdev);
call_pmf_or_link = TRUE;
}
if(call_pmf_or_link)
{
lm_pmf_or_link_event(pdev, val);
}
if GET_FLAGS(val, DRV_STATUS_OEM_EVENT_MASK)
{
lm_oem_event(pdev, val);
}
if GET_FLAGS(val, DRV_STATUS_OEM_UPDATE_SVID)
{
lm_svid_event(pdev);
}
lm_dcbx_event(pdev,val);
}
static void lm_gen_attn_everest_processing(lm_device_t *pdev, u32_t sig_word_aft_inv)
{
u32_t offset = 0;
u32_t val = 0;
offset = GENERAL_ATTEN_OFFSET(TSTORM_FATAL_ASSERT_ATTENTION_BIT) ;
if ( offset & sig_word_aft_inv)
{
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_7,0x0);
DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: TSTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(USTORM_FATAL_ASSERT_ATTENTION_BIT);
if ( offset & sig_word_aft_inv)
{
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_8,0x0);
DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: USTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(CSTORM_FATAL_ASSERT_ATTENTION_BIT);
if ( offset & sig_word_aft_inv)
{
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_9,0x0);
DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: CSTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(XSTORM_FATAL_ASSERT_ATTENTION_BIT);
if ( offset & sig_word_aft_inv)
{
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_10,0x0);
DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: XSTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
DbgBreakIfAll(1);
}
offset = GENERAL_ATTEN_OFFSET(MCP_FATAL_ASSERT_ATTENTION_BIT);
if ( offset & sig_word_aft_inv)
{
REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_11,0x0);
val = lm_mcp_check(pdev);
DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: MCP_FATAL_ASSERT_ATTENTION_BIT received mcp_check=0x%x!!!\n" , val);
DbgBreakIfAll(1);
}
if (!CHIP_IS_E1(pdev))
{
offset = GENERAL_ATTEN_OFFSET(LINK_SYNC_ATTENTION_BIT_FUNC_0 + FUNC_ID(pdev));
if ( offset & sig_word_aft_inv)
{
lm_generic_event(pdev);
}
}
}
void lm_read_attn_regs(lm_device_t *pdev, u32_t * attn_sig_af_inv_arr, u32_t arr_size)
{
u8_t i;
DbgBreakIf( pdev->vars.num_attn_sig_regs > arr_size );
DbgBreakIf( pdev->vars.num_attn_sig_regs > ARRSIZE(pdev->vars.attn_sig_af_inv_reg_addr) );
for (i = 0; i < pdev->vars.num_attn_sig_regs; i++)
{
attn_sig_af_inv_arr[i] = REG_RD(pdev, pdev->vars.attn_sig_af_inv_reg_addr[i]);
}
DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: attn_sig_aft_invert_1:0x%x; attn_sig_aft_invert_2:0x%x; attn_sig_aft_invert_3:0x%x; attn_sig_aft_invert_4:0x%x,attn_sig_aft_invert_5:0x%x\n",
attn_sig_af_inv_arr[0],
attn_sig_af_inv_arr[1],
attn_sig_af_inv_arr[2],
attn_sig_af_inv_arr[3],
attn_sig_af_inv_arr[4]);
}
void lm_get_attn_info(lm_device_t *pdev, u16_t *attn_bits, u16_t *attn_ack)
{
volatile struct atten_sp_status_block * attention_sb = NULL;
u16_t lcl_attn_sb_index = 0;
DbgBreakIf(!(pdev && attn_bits && attn_ack));
attention_sb = lm_get_attention_status_block(pdev);
do
{
lcl_attn_sb_index = mm_le16_to_cpu(attention_sb->attn_bits_index);
*attn_bits = (u16_t)mm_le32_to_cpu(attention_sb->attn_bits);
*attn_ack = (u16_t)mm_le32_to_cpu(attention_sb->attn_bits_ack);
} while (lcl_attn_sb_index != mm_le16_to_cpu(attention_sb->attn_bits_index));
DbgMessage(pdev,
INFORMi,
"lm_get_attn_info: def_sb->attn_bits:0x%x, def_sb->attn_ack:0x%x, attn_bits:0x%x, attn_ack:0x%x\n",
mm_le32_to_cpu(attention_sb->attn_bits),
mm_le32_to_cpu(attention_sb->attn_bits_ack),
*attn_bits,
*attn_ack);
}
static u32_t lm_dq_attn_everest_processing(lm_device_t *pdev)
{
u32_t val,valc;
val=REG_RD(pdev,DORQ_REG_DORQ_INT_STS);
DbgMessage(pdev, FATAL, "DB hw attention 0x%x\n",val);
if (val) {
pdev->vars.dq_int_status_cnt++;
if (val & DORQ_DORQ_INT_STS_REG_DB_DISCARD)
{
pdev->vars.dq_int_status_discard_cnt++;
}
if (val & DORQ_DORQ_INT_STS_REG_TYPE_VAL_ERR)
{
pdev->vars.dq_int_status_vf_val_err_cnt++;
pdev->vars.dq_vf_type_val_err_fid = REG_RD(pdev,DORQ_REG_VF_TYPE_VAL_ERR_FID);
pdev->vars.dq_vf_type_val_err_mcid = REG_RD(pdev,DORQ_REG_VF_TYPE_VAL_ERR_MCID);
}
}
valc = REG_RD(pdev,DORQ_REG_DORQ_INT_STS_CLR);
return val;
}
void lm_handle_deassertion_processing(lm_device_t *pdev, u16_t deassertion_proc_flgs)
{
lm_status_t lm_status = LM_STATUS_SUCCESS;
u32_t val = 0;
u32_t port_reg_name = 0;
u8_t index = 0;
u8_t i = 0;
u32_t mask_val = 0;
u32_t attn_sig_af_inv_arr[MAX_ATTN_REGS] = {0};
u32_t group_mask_arr[MAX_ATTN_REGS] = {0};
u32_t mask_arr_val[MAX_ATTN_REGS] = {0};
u32_t dq_int_sts, cfc_int_sts;
DbgBreakIf(!pdev);
DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: deassertion_proc_flgs:%d\n", deassertion_proc_flgs);
acquire_split_alr(pdev);
lm_read_attn_regs(pdev, attn_sig_af_inv_arr, ARRSIZE(attn_sig_af_inv_arr));
if (lm_recoverable_error(pdev, attn_sig_af_inv_arr,ARRSIZE(attn_sig_af_inv_arr)))
{
DbgMessage(pdev, WARNer, "Starting lm recover flow ");
lm_status = mm_er_initiate_recovery(pdev);
if (lm_status == LM_STATUS_SUCCESS)
{
lm_disable_int(pdev);
release_split_alr(pdev);
return;
}
DbgMessage(pdev, WARNer, "mm_er_initiate_recovery returned status %d ", lm_status);
}
for (index = 0; index < ARRSIZE(pdev->vars.attn_groups_output); index++)
{
if (deassertion_proc_flgs & (1 << index))
{
for (i = 0; i < ARRSIZE(group_mask_arr); i++)
{
group_mask_arr[i] = pdev->vars.attn_groups_output[index].attn_sig_dword[i];
}
DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: group #%d got attention on it!\n", index);
DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: mask1:0x%x, mask2:0x%x, mask3:0x%x, mask4:0x%x,mask5:0x%x\n",
group_mask_arr[0],
group_mask_arr[1],
group_mask_arr[2],
group_mask_arr[3],
group_mask_arr[4]);
DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: attn1:0x%x, attn2:0x%x, attn3:0x%x, attn4:0x%x,attn5:0x%x\n",
attn_sig_af_inv_arr[0],
attn_sig_af_inv_arr[1],
attn_sig_af_inv_arr[2],
attn_sig_af_inv_arr[3],
attn_sig_af_inv_arr[4]);
if (attn_sig_af_inv_arr[3] & EVEREST_GEN_ATTN_IN_USE_MASK & group_mask_arr[3])
{
lm_gen_attn_everest_processing(pdev, attn_sig_af_inv_arr[3]);
}
if (attn_sig_af_inv_arr[1] & AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT & group_mask_arr[1])
{
dq_int_sts = lm_dq_attn_everest_processing(pdev);
}
if (attn_sig_af_inv_arr[2] & AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT & group_mask_arr[2])
{
cfc_int_sts = lm_cfc_attn_everest_processing(pdev);
}
if (attn_sig_af_inv_arr[2] & AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT & group_mask_arr[2])
{
lm_pxp_attn_everest_processing(pdev);
}
if (attn_sig_af_inv_arr[0] & AEU_INPUTS_ATTN_BITS_SPIO5 & group_mask_arr[0])
{
lm_spio5_attn_everest_processing(pdev);
}
if (attn_sig_af_inv_arr[0] & pdev->vars.link.aeu_int_mask & group_mask_arr[0])
{
if (IS_PMF(pdev))
{
MM_ACQUIRE_PHY_LOCK(pdev);
PHY_HW_LOCK(pdev);
elink_handle_module_detect_int(&pdev->params.link);
PHY_HW_UNLOCK(pdev);
MM_RELEASE_PHY_LOCK(pdev);
}
}
if (attn_sig_af_inv_arr[3] & EVEREST_LATCHED_ATTN_IN_USE_MASK & group_mask_arr[3])
{
lm_latch_attn_everest_processing(pdev, attn_sig_af_inv_arr[3]);
}
i = 0;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_0 & group_mask_arr[i];
i = 1;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_1 & group_mask_arr[i];
i = 2;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_2 & group_mask_arr[i];
i = 4;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_4 & group_mask_arr[i];
if (mask_arr_val[2] & AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT) {
pdev->vars.pxp_hw_interrupts_cnt++;
}
if ( (mask_arr_val[0]) ||
(mask_arr_val[1] & ~AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT) ||
(mask_arr_val[2] & ~(AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT | AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT)) ||
(mask_arr_val[4]) )
{
DbgMessage(pdev, FATAL, "hw block attention:\n");
DbgMessage(pdev, FATAL, "0: 0x%08x\n", mask_arr_val[0]);
DbgMessage(pdev, FATAL, "1: 0x%08x\n", mask_arr_val[1]);
DbgMessage(pdev, FATAL, "2: 0x%08x\n", mask_arr_val[2]);
DbgMessage(pdev, FATAL, "4: 0x%08x\n", mask_arr_val[4]);
DbgBreakIfAll(1);
}
i = 0;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_0 & group_mask_arr[i];
i = 1;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_1 & group_mask_arr[i];
i = 2;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_2 & group_mask_arr[i];
i = 4;
mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_4 & group_mask_arr[i];
if ( (mask_arr_val[0]) ||
(mask_arr_val[1]) ||
(mask_arr_val[2]) ||
(mask_arr_val[4]) )
{
DbgMessage(pdev, FATAL, "hw block parity attention\n");
DbgMessage(pdev, FATAL, "0: 0x%08x\n", mask_arr_val[0]);
DbgMessage(pdev, FATAL, "1: 0x%08x\n", mask_arr_val[1]);
DbgMessage(pdev, FATAL, "2: 0x%08x\n", mask_arr_val[2]);
DbgMessage(pdev, FATAL, "4: 0x%08x\n", mask_arr_val[4]);
DbgBreakIfAll(1);
}
}
}
release_split_alr(pdev);
val = ~deassertion_proc_flgs;
if (INTR_BLK_TYPE(pdev) == INTR_BLK_HC)
{
REG_WR(pdev, HC_REG_COMMAND_REG + PORT_ID(pdev)*32 + COMMAND_REG_ATTN_BITS_CLR,val);
}
else
{
u32_t cmd_addr = IGU_CMD_ATTN_BIT_CLR_UPPER;
if (INTR_BLK_ACCESS(pdev) == INTR_BLK_ACCESS_IGUMEM)
{
REG_WR(pdev, BAR_IGU_INTMEM + cmd_addr*8, val);
}
else
{
struct igu_ctrl_reg cmd_ctrl;
u8_t igu_func_id = 0;
igu_func_id = IGU_FUNC_ID(pdev);
cmd_ctrl.ctrl_data =
((cmd_addr << IGU_CTRL_REG_ADDRESS_SHIFT) |
(igu_func_id << IGU_CTRL_REG_FID_SHIFT) |
(IGU_CTRL_CMD_TYPE_WR << IGU_CTRL_REG_TYPE_SHIFT));
REG_WR(pdev, IGU_REG_COMMAND_REG_32LSB_DATA, val);
REG_WR(pdev, IGU_REG_COMMAND_REG_CTRL, cmd_ctrl.ctrl_data);
}
}
DbgBreakIf(~pdev->vars.attn_state & deassertion_proc_flgs);
port_reg_name = PORT_ID(pdev) ? MISC_REG_AEU_MASK_ATTN_FUNC_1 : MISC_REG_AEU_MASK_ATTN_FUNC_0;
lm_hw_lock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev), TRUE);
mask_val = REG_RD(pdev, port_reg_name);
pdev->vars.aeu_mask_attn_func = mask_val & 0xff;
DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: BEFORE: aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
pdev->vars.aeu_mask_attn_func |= (deassertion_proc_flgs & 0xff);
DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: AFTER : aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
REG_WR(pdev, port_reg_name, pdev->vars.aeu_mask_attn_func);
lm_hw_unlock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev));
DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: BEFORE: attn_state:0x%x\n", pdev->vars.attn_state);
pdev->vars.attn_state &= ~deassertion_proc_flgs;
DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: AFTER : attn_state:0x%x\n", pdev->vars.attn_state);
}