mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-02-06 08:09:58 +00:00
535.43.02
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -121,8 +121,13 @@ nvswitch_init_lpwr_regs_ls10
|
||||
// IC Enter Threshold
|
||||
if (device->regkeys.lp_threshold == NV_SWITCH_REGKEY_SET_LP_THRESHOLD_DEFAULT)
|
||||
{
|
||||
//
|
||||
// TODO: get from bios. Refer Bug 3626523 for more info.
|
||||
lpEntryThreshold = 100;
|
||||
//
|
||||
// The threshold is measured in 100us unit. So lpEntryThreshold = 1
|
||||
// means the threshold is set to 100us in the register.
|
||||
//
|
||||
lpEntryThreshold = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -505,7 +510,7 @@ nvswitch_reset_persistent_link_hw_state_ls10
|
||||
NvU32 clocksMask = NVSWITCH_PER_LINK_CLOCK_SET(RXCLK)|NVSWITCH_PER_LINK_CLOCK_SET(TXCLK)|
|
||||
NVSWITCH_PER_LINK_CLOCK_SET(NCISOCCLK);
|
||||
nvlink_link *link = nvswitch_get_link(device, linkNumber);
|
||||
if (nvswitch_is_link_in_reset(device, link))
|
||||
if ((link == NULL) || nvswitch_is_link_in_reset(device, link))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1225,11 +1230,13 @@ nvswitch_configure_error_rate_threshold_interrupt_ls10
|
||||
if (bEnable)
|
||||
{
|
||||
link->errorThreshold.bInterruptTrigerred = NV_FALSE;
|
||||
intrRegVal |= DRF_DEF(_NVLDL_TOP, _INTR_NONSTALL_EN, _RX_SHORT_ERROR_RATE, _ENABLE);
|
||||
intrRegVal = FLD_SET_DRF_NUM(_NVLDL_TOP, _INTR_NONSTALL_EN, _RX_SHORT_ERROR_RATE, 1,
|
||||
intrRegVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
intrRegVal |= DRF_DEF(_NVLDL_TOP, _INTR_NONSTALL_EN, _RX_SHORT_ERROR_RATE, _DISABLE);
|
||||
intrRegVal = FLD_SET_DRF_NUM(_NVLDL_TOP, _INTR_NONSTALL_EN, _RX_SHORT_ERROR_RATE, 0,
|
||||
intrRegVal);
|
||||
}
|
||||
|
||||
NVSWITCH_LINK_WR32_LS10(device, linkNumber, NVLDL,
|
||||
@@ -1249,12 +1256,29 @@ nvswitch_init_dlpl_interrupts_ls10
|
||||
NVSWITCH_LINK_WR32_LS10(device, linkNumber, NVLDL, _NVLDL_TOP, _INTR, 0xffffffff);
|
||||
NVSWITCH_LINK_WR32_LS10(device, linkNumber, NVLDL, _NVLDL_TOP, _INTR_SW2, 0xffffffff);
|
||||
|
||||
// Set the interrupt bits
|
||||
nvswitch_set_dlpl_interrupts_ls10(link);
|
||||
|
||||
// Setup error rate thresholds
|
||||
nvswitch_set_error_rate_threshold_ls10(link, NV_TRUE);
|
||||
nvswitch_configure_error_rate_threshold_interrupt_ls10(link, NV_TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
nvswitch_set_dlpl_interrupts_ls10
|
||||
(
|
||||
nvlink_link *link
|
||||
)
|
||||
{
|
||||
nvswitch_device *device = link->dev->pDevInfo;
|
||||
NvU32 linkNumber = link->linkNumber;
|
||||
// Stall tree routes to INTR_A which is connected to NVLIPT fatal tree
|
||||
|
||||
NVSWITCH_LINK_WR32_LS10(device, linkNumber, NVLDL, _NVLDL_TOP, _INTR_STALL_EN,
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_STALL_EN, _TX_REPLAY, _DISABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_STALL_EN, _TX_RECOVERY_SHORT, _DISABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_STALL_EN, _LTSSM_FAULT_UP, _ENABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_STALL_EN, _LTSSM_FAULT_DOWN, _ENABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_STALL_EN, _TX_FAULT_RAM, _ENABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_STALL_EN, _TX_FAULT_INTERFACE, _ENABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_STALL_EN, _TX_FAULT_SUBLINK_CHANGE, _DISABLE) |
|
||||
@@ -1281,9 +1305,6 @@ nvswitch_init_dlpl_interrupts_ls10
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_NONSTALL_EN, _RX_CRC_COUNTER, _ENABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_NONSTALL_EN, _LTSSM_PROTOCOL, _DISABLE) |
|
||||
DRF_DEF(_NVLDL_TOP, _INTR_NONSTALL_EN, _MINION_REQUEST, _DISABLE));
|
||||
|
||||
nvswitch_set_error_rate_threshold_ls10(link, NV_TRUE);
|
||||
nvswitch_configure_error_rate_threshold_interrupt_ls10(link, NV_TRUE);
|
||||
}
|
||||
|
||||
static NvU32
|
||||
@@ -1433,7 +1454,7 @@ nvswitch_execute_unilateral_link_shutdown_ls10
|
||||
NvU32 link_state_request;
|
||||
NvU32 link_state;
|
||||
NvU32 stat_data = 0;
|
||||
NvU32 link_intr_subcode;
|
||||
NvU32 link_intr_subcode = MINION_OK;
|
||||
|
||||
if (!NVSWITCH_IS_LINK_ENG_VALID_LS10(device, NVLDL, link->linkNumber))
|
||||
{
|
||||
@@ -1470,7 +1491,6 @@ nvswitch_execute_unilateral_link_shutdown_ls10
|
||||
NV_NVLSTAT_MN00, 0, &stat_data) == NVL_SUCCESS)
|
||||
{
|
||||
link_intr_subcode = DRF_VAL(_NVLSTAT, _MN00, _LINK_INTR_SUBCODE, stat_data);
|
||||
}
|
||||
|
||||
if ((link_state == NV_NVLIPT_LNK_CTRL_LINK_STATE_REQUEST_STATUS_MINION_REQUEST_FAIL) &&
|
||||
(link_intr_subcode == MINION_ALARM_BUSY))
|
||||
@@ -1488,6 +1508,13 @@ nvswitch_execute_unilateral_link_shutdown_ls10
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Querying MINION for link_intr_subcode failed so retry
|
||||
retry_count--;
|
||||
}
|
||||
|
||||
|
||||
} while (retry_count);
|
||||
|
||||
@@ -1510,7 +1537,7 @@ nvswitch_reset_and_train_link_ls10
|
||||
NvU32 link_state_request;
|
||||
NvU32 link_state;
|
||||
NvU32 stat_data;
|
||||
NvU32 link_intr_subcode;
|
||||
NvU32 link_intr_subcode = MINION_OK;
|
||||
|
||||
nvswitch_execute_unilateral_link_shutdown_ls10(link);
|
||||
nvswitch_corelib_clear_link_state_ls10(link);
|
||||
@@ -1537,7 +1564,6 @@ nvswitch_reset_and_train_link_ls10
|
||||
NV_NVLSTAT_MN00, 0, &stat_data) == NVL_SUCCESS)
|
||||
{
|
||||
link_intr_subcode = DRF_VAL(_NVLSTAT, _MN00, _LINK_INTR_SUBCODE, stat_data);
|
||||
}
|
||||
|
||||
if ((link_state == NV_NVLIPT_LNK_CTRL_LINK_STATE_REQUEST_STATUS_MINION_REQUEST_FAIL) &&
|
||||
(link_intr_subcode == MINION_ALARM_BUSY))
|
||||
@@ -1557,6 +1583,12 @@ nvswitch_reset_and_train_link_ls10
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// failed to query minion for the link_intr_subcode so retry
|
||||
retry_count--;
|
||||
}
|
||||
}
|
||||
} while(retry_count);
|
||||
|
||||
if (status != NVL_SUCCESS)
|
||||
@@ -1625,3 +1657,24 @@ nvswitch_are_link_clocks_on_ls10
|
||||
return NV_TRUE;
|
||||
}
|
||||
|
||||
NvBool
|
||||
nvswitch_does_link_need_termination_enabled_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
nvlink_link *link
|
||||
)
|
||||
{
|
||||
// Not defined for LS10
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
NvlStatus
|
||||
nvswitch_link_termination_setup_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
nvlink_link* link
|
||||
)
|
||||
{
|
||||
// Not supported for LS10
|
||||
return -NVL_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "regkey_nvswitch.h"
|
||||
#include "haldef_nvswitch.h"
|
||||
#include "nvlink_inband_msg.h"
|
||||
#include "rmsoecmdif.h"
|
||||
|
||||
#include "ls10/ls10.h"
|
||||
#include "lr10/lr10.h"
|
||||
@@ -63,9 +64,11 @@
|
||||
#include "nvswitch/ls10/dev_multicasttstate_ip.h"
|
||||
#include "nvswitch/ls10/dev_reductiontstate_ip.h"
|
||||
#include "ls10/minion_nvlink_defines_public_ls10.h"
|
||||
#include "nvswitch/ls10/dev_pmgr.h"
|
||||
#include "nvswitch/ls10/dev_timer_ip.h"
|
||||
|
||||
#define NVSWITCH_IFR_MIN_BIOS_VER_LS10 0x9610170000ull
|
||||
#define NVSWITCH_SMBPBI_MIN_BIOS_VER_LS10 0x9610170000ull
|
||||
#define NVSWITCH_SMBPBI_MIN_BIOS_VER_LS10 0x9610220000ull
|
||||
|
||||
void *
|
||||
nvswitch_alloc_chipdevice_ls10
|
||||
@@ -113,7 +116,7 @@ nvswitch_pri_ring_init_ls10
|
||||
{
|
||||
keepPolling = (nvswitch_timeout_check(&timeout)) ? NV_FALSE : NV_TRUE;
|
||||
|
||||
command = NVSWITCH_REG_RD32(device, _GFW_GLOBAL, _BOOT_PARTITION_PROGRESS);
|
||||
command = NVSWITCH_REG_RD32(device, _GFW_GLOBAL, _BOOT_PARTITION_PROGRESS);
|
||||
if (FLD_TEST_DRF(_GFW_GLOBAL, _BOOT_PARTITION_PROGRESS, _VALUE, _SUCCESS, command))
|
||||
{
|
||||
break;
|
||||
@@ -914,7 +917,7 @@ nvswitch_ctrl_get_sw_info_ls10
|
||||
switch (p->index[i])
|
||||
{
|
||||
case NVSWITCH_GET_SW_INFO_INDEX_INFOROM_NVL_SUPPORTED:
|
||||
p->info[i] = NV_FALSE; //TODO: Enable once NVL support is present (CTK-4163)
|
||||
p->info[i] = NV_TRUE;
|
||||
break;
|
||||
case NVSWITCH_GET_SW_INFO_INDEX_INFOROM_BBX_SUPPORTED:
|
||||
p->info[i] = NV_TRUE;
|
||||
@@ -1103,10 +1106,17 @@ nvswitch_link_disable_interrupts_ls10
|
||||
instance = link / NVSWITCH_LINKS_PER_NVLIPT_LS10;
|
||||
localLinkIdx = link % NVSWITCH_LINKS_PER_NVLIPT_LS10;
|
||||
|
||||
NVSWITCH_NPORT_WR32_LS10(device, link, _NPORT, _ERR_CONTROL_COMMON_NPORT,
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _CORRECTABLEENABLE, 0x0) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _FATALENABLE, 0x0) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _NONFATALENABLE, 0x0));
|
||||
if (nvswitch_is_soe_supported(device))
|
||||
{
|
||||
nvswitch_soe_set_nport_interrupts_ls10(device, link, NV_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVSWITCH_NPORT_WR32_LS10(device, link, _NPORT, _ERR_CONTROL_COMMON_NPORT,
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _CORRECTABLEENABLE, 0x0) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _FATALENABLE, 0x0) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _NONFATALENABLE, 0x0));
|
||||
}
|
||||
|
||||
NVSWITCH_ENG_WR32(device, NVLW, , instance, _NVLW, _LINK_INTR_0_MASK(localLinkIdx),
|
||||
DRF_NUM(_NVLW, _LINK_INTR_0_MASK, _FATAL, 0x0) |
|
||||
@@ -1138,31 +1148,38 @@ _nvswitch_link_reset_interrupts_ls10
|
||||
NvU32 eng_instance = link / NVSWITCH_LINKS_PER_NVLIPT_LS10;
|
||||
NvU32 localLinkNum = link % NVSWITCH_LINKS_PER_NVLIPT_LS10;
|
||||
|
||||
NVSWITCH_NPORT_WR32_LS10(device, link, _NPORT, _ERR_CONTROL_COMMON_NPORT,
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _CORRECTABLEENABLE, 0x1) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _FATALENABLE, 0x1) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _NONFATALENABLE, 0x1));
|
||||
if (nvswitch_is_soe_supported(device))
|
||||
{
|
||||
nvswitch_soe_set_nport_interrupts_ls10(device, link, NV_TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
NVSWITCH_NPORT_WR32_LS10(device, link, _NPORT, _ERR_CONTROL_COMMON_NPORT,
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _CORRECTABLEENABLE, 0x1) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _FATALENABLE, 0x1) |
|
||||
DRF_NUM(_NPORT, _ERR_CONTROL_COMMON_NPORT, _NONFATALENABLE, 0x1));
|
||||
}
|
||||
|
||||
NVSWITCH_ENG_WR32(device, NVLW, , eng_instance, _NVLW, _LINK_INTR_0_MASK(localLinkNum),
|
||||
DRF_NUM(_NVLW, _LINK_INTR_0_MASK, _FATAL, 0x1) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_0_MASK, _NONFATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_0_MASK, _CORRECTABLE, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR0, 0x1) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR1, 0x0));
|
||||
NVSWITCH_ENG_WR32(device, NVLW, , eng_instance, _NVLW, _LINK_INTR_0_MASK(localLinkNum),
|
||||
DRF_NUM(_NVLW, _LINK_INTR_0_MASK, _FATAL, 0x1) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_0_MASK, _NONFATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_0_MASK, _CORRECTABLE, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR0, 0x1) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR1, 0x0));
|
||||
|
||||
NVSWITCH_ENG_WR32(device, NVLW, , eng_instance, _NVLW, _LINK_INTR_1_MASK(localLinkNum),
|
||||
DRF_NUM(_NVLW, _LINK_INTR_1_MASK, _FATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_1_MASK, _NONFATAL, 0x1) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_1_MASK, _CORRECTABLE, 0x1) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR0, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR1, 0x1));
|
||||
NVSWITCH_ENG_WR32(device, NVLW, , eng_instance, _NVLW, _LINK_INTR_1_MASK(localLinkNum),
|
||||
DRF_NUM(_NVLW, _LINK_INTR_1_MASK, _FATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_1_MASK, _NONFATAL, 0x1) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_1_MASK, _CORRECTABLE, 0x1) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR0, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_0_MASK, _INTR1, 0x1));
|
||||
|
||||
NVSWITCH_ENG_WR32(device, NVLW, , eng_instance, _NVLW, _LINK_INTR_2_MASK(localLinkNum),
|
||||
DRF_NUM(_NVLW, _LINK_INTR_2_MASK, _FATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_2_MASK, _NONFATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_2_MASK, _CORRECTABLE, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_2_MASK, _INTR0, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_2_MASK, _INTR1, 0x0));
|
||||
NVSWITCH_ENG_WR32(device, NVLW, , eng_instance, _NVLW, _LINK_INTR_2_MASK(localLinkNum),
|
||||
DRF_NUM(_NVLW, _LINK_INTR_2_MASK, _FATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_2_MASK, _NONFATAL, 0x0) |
|
||||
DRF_NUM(_NVLW, _LINK_INTR_2_MASK, _CORRECTABLE, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_2_MASK, _INTR0, 0x0) |
|
||||
DRF_NUM(_NVLW_LINK, _INTR_2_MASK, _INTR1, 0x0));
|
||||
|
||||
// NVLIPT_LNK
|
||||
regval = NVSWITCH_LINK_RD32_LS10(device, link, NVLIPT_LNK, _NVLIPT_LNK, _INTR_CONTROL_LINK);
|
||||
@@ -1353,10 +1370,15 @@ nvswitch_reset_and_drain_links_ls10
|
||||
NvU32 link;
|
||||
NvU32 data32;
|
||||
NvU32 retry_count = 3;
|
||||
NvU32 link_state_request;
|
||||
NvU32 link_state;
|
||||
NvU32 stat_data;
|
||||
NvU32 link_intr_subcode;
|
||||
NvU32 link_state_request;
|
||||
NvU32 link_state;
|
||||
NvU32 stat_data;
|
||||
NvU32 link_intr_subcode;
|
||||
NvBool bKeepPolling;
|
||||
NvBool bIsLinkInEmergencyShutdown;
|
||||
NvBool bAreDlClocksOn;
|
||||
NVSWITCH_TIMEOUT timeout;
|
||||
|
||||
|
||||
if (link_mask == 0)
|
||||
{
|
||||
@@ -1425,10 +1447,9 @@ nvswitch_reset_and_drain_links_ls10
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
nvswitch_destroy_link(link_info);
|
||||
return status;
|
||||
}
|
||||
|
||||
return -NVL_ERR_INVALID_STATE;
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1438,10 +1459,42 @@ nvswitch_reset_and_drain_links_ls10
|
||||
|
||||
//
|
||||
// Step 3.0 :
|
||||
// Prior to starting port reset, perform unilateral shutdown on the
|
||||
// LS10 side of the link, in case the links are not shutdown.
|
||||
// Prior to starting port reset, ensure the links is in emergency shutdown
|
||||
//
|
||||
nvswitch_execute_unilateral_link_shutdown_ls10(link_info);
|
||||
bIsLinkInEmergencyShutdown = NV_FALSE;
|
||||
nvswitch_timeout_create(10 * NVSWITCH_INTERVAL_1MSEC_IN_NS, &timeout);
|
||||
do
|
||||
{
|
||||
bKeepPolling = (nvswitch_timeout_check(&timeout)) ? NV_FALSE : NV_TRUE;
|
||||
|
||||
status = nvswitch_minion_get_dl_status(device, link_info->linkNumber,
|
||||
NV_NVLSTAT_UC01, 0, &stat_data);
|
||||
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
link_state = DRF_VAL(_NVLSTAT, _UC01, _LINK_STATE, stat_data);
|
||||
|
||||
bIsLinkInEmergencyShutdown = (link_state == LINKSTATUS_EMERGENCY_SHUTDOWN) ?
|
||||
NV_TRUE:NV_FALSE;
|
||||
|
||||
if (bIsLinkInEmergencyShutdown == NV_TRUE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(bKeepPolling);
|
||||
|
||||
if (bIsLinkInEmergencyShutdown == NV_FALSE)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: link %d failed to enter emergency shutdown\n",
|
||||
__FUNCTION__, link);
|
||||
continue;
|
||||
}
|
||||
|
||||
nvswitch_corelib_clear_link_state_ls10(link_info);
|
||||
|
||||
//
|
||||
@@ -1483,6 +1536,10 @@ nvswitch_reset_and_drain_links_ls10
|
||||
{
|
||||
link_intr_subcode = DRF_VAL(_NVLSTAT, _MN00, _LINK_INTR_SUBCODE, stat_data);
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((link_state == NV_NVLIPT_LNK_CTRL_LINK_STATE_REQUEST_STATUS_MINION_REQUEST_FAIL) &&
|
||||
(link_intr_subcode == MINION_ALARM_BUSY))
|
||||
@@ -1515,9 +1572,8 @@ nvswitch_reset_and_drain_links_ls10
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
nvswitch_destroy_link(link_info);
|
||||
return status;
|
||||
}
|
||||
return status;
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1538,12 +1594,15 @@ nvswitch_reset_and_drain_links_ls10
|
||||
status = nvlink_lib_register_link(device->nvlink_device, link_info);
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: Failed to register link: 0x%x with the corelib\n",
|
||||
__FUNCTION__, link);
|
||||
nvswitch_destroy_link(link_info);
|
||||
return status;
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Launch ALI training to re-initialize and train the links
|
||||
// Step 9.0: Launch ALI training to re-initialize and train the links
|
||||
// nvswitch_launch_ALI_link_training(device, link_info);
|
||||
//
|
||||
// Request active, but don't block. FM will come back and check
|
||||
@@ -1558,7 +1617,44 @@ nvswitch_reset_and_drain_links_ls10
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: TL link state request to active for ALI failed for link: 0x%x\n",
|
||||
__FUNCTION__, link);
|
||||
continue;
|
||||
}
|
||||
|
||||
bAreDlClocksOn = NV_FALSE;
|
||||
nvswitch_timeout_create(NVSWITCH_INTERVAL_1MSEC_IN_NS, &timeout);
|
||||
do
|
||||
{
|
||||
bKeepPolling = (nvswitch_timeout_check(&timeout)) ? NV_FALSE : NV_TRUE;
|
||||
|
||||
status = nvswitch_minion_get_dl_status(device, link_info->linkNumber,
|
||||
NV_NVLSTAT_UC01, 0, &stat_data);
|
||||
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
link_state = DRF_VAL(_NVLSTAT, _UC01, _LINK_STATE, stat_data);
|
||||
|
||||
bAreDlClocksOn = (link_state != LINKSTATUS_INITPHASE1) ?
|
||||
NV_TRUE:NV_FALSE;
|
||||
|
||||
if (bAreDlClocksOn == NV_TRUE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(bKeepPolling);
|
||||
|
||||
if (!bAreDlClocksOn)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: link: 0x%x doesn't have the TX/RX clocks on, skipping setting DL interrupts!\n",
|
||||
__FUNCTION__, link);
|
||||
continue;
|
||||
}
|
||||
|
||||
nvswitch_set_dlpl_interrupts_ls10(link_info);
|
||||
}
|
||||
FOR_EACH_INDEX_IN_MASK_END;
|
||||
|
||||
@@ -1575,6 +1671,7 @@ nvswitch_set_nport_port_config_ls10
|
||||
)
|
||||
{
|
||||
NvU32 val;
|
||||
NvlStatus status = NVL_SUCCESS;
|
||||
|
||||
if (p->requesterLinkID >= NVBIT(
|
||||
DRF_SIZE(NV_NPORT_REQLINKID_REQROUTINGID) +
|
||||
@@ -1624,156 +1721,162 @@ nvswitch_set_nport_port_config_ls10
|
||||
|
||||
if (p->type == CONNECT_TRUNK_SWITCH)
|
||||
{
|
||||
if (IS_RTLSIM(device) || IS_EMULATION(device) || IS_FMODEL(device))
|
||||
if (!nvswitch_is_soe_supported(device))
|
||||
{
|
||||
// Set trunk specific settings (TPROD) on PRE-SILION
|
||||
|
||||
// NPORT
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _NPORT, _CTRL);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _EGDRAINENB, _DISABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _ENEGRESSDBI, _ENABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _ENROUTEDBI, _ENABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _RTDRAINENB, _DISABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _SPARE, _INIT, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _TRUNKLINKENB, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _NPORT, _CTRL, val);
|
||||
// NPORT
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _NPORT, _CTRL);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _EGDRAINENB, _DISABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _ENEGRESSDBI, _ENABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _ENROUTEDBI, _ENABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _RTDRAINENB, _DISABLE, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _SPARE, _INIT, val);
|
||||
val = FLD_SET_DRF(_NPORT, _CTRL, _TRUNKLINKENB, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _NPORT, _CTRL, val);
|
||||
|
||||
// EGRESS
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _CTRL);
|
||||
val = FLD_SET_DRF(_EGRESS, _CTRL, _CTO_ENB, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _CTRL, val);
|
||||
// EGRESS
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _CTRL);
|
||||
val = FLD_SET_DRF(_EGRESS, _CTRL, _CTO_ENB, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _CTRL, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_CONTAIN_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _CREDIT_TIME_OUT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _HWRSPERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _INVALIDVCSET_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _REQTGTIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _RSPREQIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _URRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_CONTAIN_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_CONTAIN_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _CREDIT_TIME_OUT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _HWRSPERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _INVALIDVCSET_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _REQTGTIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _RSPREQIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_CONTAIN_EN_0, _URRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_CONTAIN_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _CREDIT_TIME_OUT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _HWRSPERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _INVALIDVCSET_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _REQTGTIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _RSPREQIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _URRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_FATAL_REPORT_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _CREDIT_TIME_OUT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _HWRSPERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _INVALIDVCSET_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _REQTGTIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _RSPREQIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_FATAL_REPORT_EN_0, _URRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_FATAL_REPORT_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_LOG_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _CREDIT_TIME_OUT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _HWRSPERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _INVALIDVCSET_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _REQTGTIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _RSPREQIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _URRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_LOG_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_LOG_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _CREDIT_TIME_OUT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _HWRSPERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _INVALIDVCSET_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _REQTGTIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _RSPREQIDMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_LOG_EN_0, _URRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_LOG_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_NON_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_NON_FATAL_REPORT_EN_0, _PRIVRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_NON_FATAL_REPORT_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _EGRESS, _ERR_NON_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_EGRESS, _ERR_NON_FATAL_REPORT_EN_0, _PRIVRSPERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _EGRESS, _ERR_NON_FATAL_REPORT_EN_0, val);
|
||||
|
||||
// INGRESS
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_CONTAIN_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _EXTAREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _EXTBREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _INVALIDVCSET, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _MCREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _REMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_CONTAIN_EN_0, val);
|
||||
// INGRESS
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_CONTAIN_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _EXTAREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _EXTBREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _INVALIDVCSET, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _MCREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_CONTAIN_EN_0, _REMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_CONTAIN_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _EXTAREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _EXTBREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _INVALIDVCSET, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _MCREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _REMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_FATAL_REPORT_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _EXTAREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _EXTBREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _INVALIDVCSET, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _MCREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_FATAL_REPORT_EN_0, _REMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_FATAL_REPORT_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _EXTAREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _EXTBREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _INVALIDVCSET, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _MCREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _REMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _EXTAREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _EXTBREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _INVALIDVCSET, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _MCREMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_0, _REMAPTAB_ECC_DBE_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_1);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTAREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTAREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTBREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTBREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _MCCMDTOUCADDRERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _MCREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _MCREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _READMCREFLECTMEMERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_1, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_1);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTAREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTAREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTBREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _EXTBREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _MCCMDTOUCADDRERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _MCREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _MCREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_LOG_EN_1, _READMCREFLECTMEMERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_LOG_EN_1, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_INDEX_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_INDEX_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_INDEX_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _REMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_INDEX_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTAREMAPTAB_REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_INDEX_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _EXTBREMAPTAB_REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_ACLFAIL, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_ADDRBOUNDSERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_INDEX_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _MCREMAPTAB_REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _REMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_0, _REQCONTEXTMISMATCHERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_1);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTAREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTAREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTBREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTBREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _MCCMDTOUCADDRERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _MCREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _MCREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _READMCREFLECTMEMERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_1, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_1);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTAREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTAREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTBREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _EXTBREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _MCCMDTOUCADDRERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _MCREMAPTAB_ADDRTYPEERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _MCREMAPTAB_ECC_LIMIT_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_INGRESS, _ERR_NON_FATAL_REPORT_EN_1, _READMCREFLECTMEMERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _INGRESS, _ERR_NON_FATAL_REPORT_EN_1, val);
|
||||
|
||||
// SOURCETRACK
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_CONTAIN_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _DUP_CREQ_TCEN0_TAG_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _INVALID_TCEN0_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _INVALID_TCEN1_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _SOURCETRACK_TIME_OUT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_CONTAIN_EN_0, val);
|
||||
// SOURCETRACK
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_CONTAIN_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _DUP_CREQ_TCEN0_TAG_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _INVALID_TCEN0_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _INVALID_TCEN1_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_CONTAIN_EN_0, _SOURCETRACK_TIME_OUT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_CONTAIN_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _DUP_CREQ_TCEN0_TAG_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _INVALID_TCEN0_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _INVALID_TCEN1_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _SOURCETRACK_TIME_OUT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_FATAL_REPORT_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _DUP_CREQ_TCEN0_TAG_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _INVALID_TCEN0_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _INVALID_TCEN1_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_FATAL_REPORT_EN_0, _SOURCETRACK_TIME_OUT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_FATAL_REPORT_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_LOG_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _DUP_CREQ_TCEN0_TAG_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _INVALID_TCEN0_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _INVALID_TCEN1_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _SOURCETRACK_TIME_OUT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_LOG_EN_0, val);
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_LOG_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_DBE_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _DUP_CREQ_TCEN0_TAG_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _INVALID_TCEN0_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _INVALID_TCEN1_RSP_ERR, __TPROD, val);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_LOG_EN_0, _SOURCETRACK_TIME_OUT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_LOG_EN_0, val);
|
||||
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_NON_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_NON_FATAL_REPORT_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_LIMIT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_NON_FATAL_REPORT_EN_0, val);
|
||||
}
|
||||
else
|
||||
{
|
||||
val = NVSWITCH_LINK_RD32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_NON_FATAL_REPORT_EN_0);
|
||||
val = FLD_SET_DRF(_SOURCETRACK, _ERR_NON_FATAL_REPORT_EN_0, _CREQ_TCEN0_CRUMBSTORE_ECC_LIMIT_ERR, __TPROD, val);
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _SOURCETRACK, _ERR_NON_FATAL_REPORT_EN_0, val);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Set trunk specific settings (TPROD) in SOE
|
||||
// nvswitch_set_nport_tprod_state_ls10(device, p->portNum);
|
||||
status = nvswitch_set_nport_tprod_state_ls10(device, p->portNum);
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: Failed to set NPORT TPROD state\n",
|
||||
__FUNCTION__);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1784,7 +1887,7 @@ nvswitch_set_nport_port_config_ls10
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _NPORT, _SRC_PORT_TYPE0, NvU64_LO32(p->trunkSrcMask));
|
||||
NVSWITCH_LINK_WR32(device, p->portNum, NPORT, _NPORT, _SRC_PORT_TYPE1, NvU64_HI32(p->trunkSrcMask));
|
||||
|
||||
return NVL_SUCCESS;
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2567,7 +2670,6 @@ nvswitch_get_nvlink_ecc_errors_ls10
|
||||
NvU32 sublinkWidth;
|
||||
|
||||
link = nvswitch_get_link(device, i);
|
||||
sublinkWidth = device->hal.nvswitch_get_sublink_width(device, i);
|
||||
|
||||
if ((link == NULL) ||
|
||||
!NVSWITCH_IS_LINK_ENG_VALID_LS10(device, NVLDL, link->linkNumber) ||
|
||||
@@ -2576,6 +2678,8 @@ nvswitch_get_nvlink_ecc_errors_ls10
|
||||
return -NVL_BAD_ARGS;
|
||||
}
|
||||
|
||||
sublinkWidth = device->hal.nvswitch_get_sublink_width(device, i);
|
||||
|
||||
minion_enabled = nvswitch_is_minion_initialized(device,
|
||||
NVSWITCH_GET_LINK_ENG_INST(device, link->linkNumber, MINION));
|
||||
|
||||
@@ -2649,6 +2753,48 @@ nvswitch_get_num_links_per_nvlipt_ls10
|
||||
return NVSWITCH_LINKS_PER_NVLIPT_LS10;
|
||||
}
|
||||
|
||||
|
||||
NvlStatus
|
||||
nvswitch_ctrl_get_fom_values_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
NVSWITCH_GET_FOM_VALUES_PARAMS *p
|
||||
)
|
||||
{
|
||||
NvlStatus status;
|
||||
NvU32 statData;
|
||||
nvlink_link *link;
|
||||
|
||||
link = nvswitch_get_link(device, p->linkId);
|
||||
if (link == NULL)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "%s: link #%d invalid\n",
|
||||
__FUNCTION__, p->linkId);
|
||||
return -NVL_BAD_ARGS;
|
||||
}
|
||||
|
||||
if (nvswitch_is_link_in_reset(device, link))
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "%s: link #%d is in reset\n",
|
||||
__FUNCTION__, p->linkId);
|
||||
return -NVL_ERR_INVALID_STATE;
|
||||
}
|
||||
|
||||
status = nvswitch_minion_get_dl_status(device, p->linkId,
|
||||
NV_NVLSTAT_TR16, 0, &statData);
|
||||
p->figureOfMeritValues[0] = (NvU16) (statData & 0xFFFF);
|
||||
p->figureOfMeritValues[1] = (NvU16) ((statData >> 16) & 0xFFFF);
|
||||
|
||||
status = nvswitch_minion_get_dl_status(device, p->linkId,
|
||||
NV_NVLSTAT_TR17, 0, &statData);
|
||||
p->figureOfMeritValues[2] = (NvU16) (statData & 0xFFFF);
|
||||
p->figureOfMeritValues[3] = (NvU16) ((statData >> 16) & 0xFFFF);
|
||||
|
||||
p->numLanes = nvswitch_get_sublink_width(device, p->linkId);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void
|
||||
nvswitch_set_fatal_error_ls10
|
||||
(
|
||||
@@ -2798,7 +2944,7 @@ nvswitch_is_inforom_supported_ls10
|
||||
{
|
||||
NVSWITCH_PRINT(device, INFO,
|
||||
"INFOROM is not supported since SOE is not supported\n");
|
||||
return NV_FALSE;
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
status = _nvswitch_get_bios_version(device, &version);
|
||||
@@ -2806,8 +2952,8 @@ nvswitch_is_inforom_supported_ls10
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "%s: Error getting BIOS version\n",
|
||||
__FUNCTION__);
|
||||
return NV_FALSE;
|
||||
}
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
if (version >= NVSWITCH_IFR_MIN_BIOS_VER_LS10)
|
||||
{
|
||||
@@ -2839,6 +2985,41 @@ nvswitch_is_spi_supported_ls10
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
NvBool
|
||||
nvswitch_is_bios_supported_ls10
|
||||
(
|
||||
nvswitch_device *device
|
||||
)
|
||||
{
|
||||
if (IS_RTLSIM(device) || IS_EMULATION(device) || IS_FMODEL(device))
|
||||
{
|
||||
NVSWITCH_PRINT(device, INFO,
|
||||
"BIOS is not supported on non-silicon platforms\n");
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
if (!nvswitch_is_soe_supported(device))
|
||||
{
|
||||
NVSWITCH_PRINT(device, INFO,
|
||||
"BIOS is not supported since SOE is not supported\n");
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
return NV_TRUE;
|
||||
}
|
||||
|
||||
NvlStatus
|
||||
nvswitch_get_bios_size_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
NvU32 *pSize
|
||||
)
|
||||
{
|
||||
*pSize = SOE_CORE_BIOS_SIZE_LS10;
|
||||
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* @Brief : Check if SMBPBI is supported
|
||||
*
|
||||
@@ -2849,21 +3030,14 @@ nvswitch_is_smbpbi_supported_ls10
|
||||
nvswitch_device *device
|
||||
)
|
||||
{
|
||||
NvU64 version;
|
||||
NvlStatus status;
|
||||
|
||||
if (!nvswitch_is_smbpbi_supported_lr10(device))
|
||||
{
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Temporary driver WAR to disable SMBPBI on the LS10 NVSwitch driver.
|
||||
// This should be removed once 3875091 is resolved.
|
||||
//
|
||||
return NV_FALSE;
|
||||
|
||||
#if 0
|
||||
NvU64 version;
|
||||
NvlStatus status;
|
||||
|
||||
status = _nvswitch_get_bios_version(device, &version);
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
@@ -2882,7 +3056,6 @@ nvswitch_is_smbpbi_supported_ls10
|
||||
"SMBPBI is not supported on NVSwitch BIOS version %llx.\n", version);
|
||||
return NV_FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4938,7 +5111,7 @@ nvswitch_launch_ALI_ls10
|
||||
}
|
||||
|
||||
nvswitch_launch_ALI_link_training(device, link, NV_FALSE);
|
||||
}
|
||||
}
|
||||
FOR_EACH_INDEX_IN_MASK_END;
|
||||
|
||||
return NVL_SUCCESS;
|
||||
@@ -5065,29 +5238,29 @@ nvswitch_set_training_mode_ls10
|
||||
{
|
||||
|
||||
regVal = NVSWITCH_LINK_RD32_LS10(device, link->linkNumber, NVLIPT_LNK, _NVLIPT_LNK,
|
||||
_CTRL_CAP_LOCAL_LINK_CHANNEL);
|
||||
_CTRL_CAP_LOCAL_LINK_CHANNEL);
|
||||
|
||||
if (!FLD_TEST_DRF(_NVLIPT_LNK, _CTRL_CAP_LOCAL_LINK_CHANNEL, _ALI_SUPPORT, _SUPPORTED, regVal))
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: ALI training not supported! Non-ALI will be used as the default.\n",__FUNCTION__);
|
||||
if (!FLD_TEST_DRF(_NVLIPT_LNK, _CTRL_CAP_LOCAL_LINK_CHANNEL, _ALI_SUPPORT, _SUPPORTED, regVal))
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: ALI training not supported! Non-ALI will be used as the default.\n",__FUNCTION__);
|
||||
#ifdef INCLUDE_NVLINK_LIB
|
||||
device->nvlink_device->enableALI = NV_FALSE;
|
||||
#endif
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
#ifdef INCLUDE_NVLINK_LIB
|
||||
device->nvlink_device->enableALI = NV_TRUE;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: ALI training not enabled! Non-ALI will be used as the default.\n",__FUNCTION__);
|
||||
#ifdef INCLUDE_NVLINK_LIB
|
||||
device->nvlink_device->enableALI = NV_FALSE;
|
||||
device->nvlink_device->enableALI = NV_FALSE;
|
||||
#endif
|
||||
return NVL_SUCCESS;
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
}
|
||||
FOR_EACH_INDEX_IN_MASK_END;
|
||||
@@ -5356,7 +5529,7 @@ nvswitch_ctrl_get_board_part_number_ls10
|
||||
if (!pInforom->OBD.bValid)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "OBD data is not available\n");
|
||||
return -NVL_ERR_GENERIC;
|
||||
return -NVL_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
pOBDObj = &pInforom->OBD.object.v2;
|
||||
|
||||
@@ -954,14 +954,15 @@ nvswitch_minion_get_ali_debug_registers_ls10
|
||||
)
|
||||
{
|
||||
NvU32 localLinkNumber = link->linkNumber % NVSWITCH_LINKS_PER_MINION_LS10;
|
||||
if (!nvswitch_minion_get_dl_status(device, link->linkNumber,
|
||||
NV_NVLSTAT_MN00, 0, &(params->dlstatMn00)) == NVL_SUCCESS)
|
||||
if (nvswitch_minion_get_dl_status(device, link->linkNumber,
|
||||
NV_NVLSTAT_MN00, 0, &(params->dlstatMn00)) != NVL_SUCCESS)
|
||||
{
|
||||
NVSWITCH_PRINT(device, INFO,"%s : Failed to poll DLSTAT _MN00 register for (%s):(%d)\n",
|
||||
__FUNCTION__, device->name, link->linkNumber);
|
||||
}
|
||||
|
||||
if (!nvswitch_minion_get_dl_status(device, link->linkNumber, NV_NVLSTAT_UC01, 0, &(params->dlstatUc01)))
|
||||
if (nvswitch_minion_get_dl_status(device, link->linkNumber,
|
||||
NV_NVLSTAT_UC01, 0, &(params->dlstatUc01)) != NVL_SUCCESS)
|
||||
{
|
||||
NVSWITCH_PRINT(device, INFO,"%s : Failed to poll DLSTAT UC01 register for (%s):(%d)\n",
|
||||
__FUNCTION__, device->name, link->linkNumber);
|
||||
|
||||
@@ -301,7 +301,12 @@ nvswitch_ctrl_i2c_indexed_ls10
|
||||
}
|
||||
return nvswitch_ctrl_i2c_indexed_lr10(device, pParams);
|
||||
}
|
||||
|
||||
|
||||
if (pParams->port == NVSWITCH_I2C_PORT_I2CA)
|
||||
{
|
||||
pParams->flags = FLD_SET_DRF(SWITCH_CTRL, _I2C_FLAGS, _SPEED_MODE, _100KHZ, pParams->flags);
|
||||
}
|
||||
|
||||
if (pI2c->soeI2CSupported)
|
||||
{
|
||||
return soeI2CAccess_HAL(device, pParams);
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "common_nvswitch.h"
|
||||
#include "ls10/ls10.h"
|
||||
#include "ls10/soe_ls10.h"
|
||||
#include "lr10/soe_lr10.h"
|
||||
|
||||
#include "nvswitch/ls10/dev_soe_ip.h"
|
||||
#include "nvswitch/ls10/dev_soe_ip_addendum.h"
|
||||
@@ -344,10 +343,17 @@ nvswitch_set_nport_tprod_state_ls10
|
||||
NVSWITCH_TIMEOUT timeout;
|
||||
RM_SOE_CORE_CMD_NPORT_TPROD_STATE *nportTprodState;
|
||||
|
||||
if (!NVSWITCH_ENG_IS_VALID(device, NPORT, nport))
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "%s: NPORT #%d invalid\n",
|
||||
__FUNCTION__, nport);
|
||||
return -NVL_BAD_ARGS;
|
||||
}
|
||||
|
||||
nvswitch_os_memset(&cmd, 0, sizeof(cmd));
|
||||
|
||||
cmd.hdr.unitId = RM_SOE_UNIT_CORE;
|
||||
cmd.hdr.size = sizeof(cmd);
|
||||
cmd.hdr.size = RM_SOE_CMD_SIZE(CORE, NPORT_TPROD_STATE);
|
||||
|
||||
nportTprodState = &cmd.cmd.core.nportTprodState;
|
||||
nportTprodState->nport = nport;
|
||||
@@ -401,7 +407,7 @@ nvswitch_soe_init_l2_state_ls10
|
||||
|
||||
nvswitch_os_memset(&cmd, 0, sizeof(cmd));
|
||||
cmd.hdr.unitId = RM_SOE_UNIT_CORE;
|
||||
cmd.hdr.size = sizeof(cmd);
|
||||
cmd.hdr.size = RM_SOE_CMD_SIZE(CORE, L2_STATE);
|
||||
|
||||
pL2State = &cmd.cmd.core.l2State;
|
||||
pL2State->cmdType = RM_SOE_CORE_CMD_INIT_L2_STATE;
|
||||
@@ -421,6 +427,136 @@ nvswitch_soe_init_l2_state_ls10
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @Brief : Enable/Disable NPORT interrupts
|
||||
*
|
||||
* @param[in] device
|
||||
* @param[in] nport
|
||||
*/
|
||||
NvlStatus
|
||||
nvswitch_soe_set_nport_interrupts_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
NvU32 nport,
|
||||
NvBool bEnable
|
||||
)
|
||||
{
|
||||
FLCN *pFlcn;
|
||||
NvU32 cmdSeqDesc = 0;
|
||||
NV_STATUS status;
|
||||
RM_FLCN_CMD_SOE cmd;
|
||||
NVSWITCH_TIMEOUT timeout;
|
||||
RM_SOE_CORE_CMD_NPORT_INTRS *pNportIntrs;
|
||||
|
||||
if (!nvswitch_is_soe_supported(device))
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: SOE is not supported\n",
|
||||
__FUNCTION__);
|
||||
return -NVL_ERR_INVALID_STATE;
|
||||
}
|
||||
|
||||
pFlcn = device->pSoe->pFlcn;
|
||||
|
||||
nvswitch_os_memset(&cmd, 0, sizeof(cmd));
|
||||
cmd.hdr.unitId = RM_SOE_UNIT_CORE;
|
||||
cmd.hdr.size = RM_SOE_CMD_SIZE(CORE, NPORT_INTRS);
|
||||
|
||||
pNportIntrs = &cmd.cmd.core.nportIntrs;
|
||||
pNportIntrs->cmdType = RM_SOE_CORE_CMD_SET_NPORT_INTRS;
|
||||
pNportIntrs->nport = nport;
|
||||
pNportIntrs->bEnable = bEnable;
|
||||
|
||||
nvswitch_timeout_create(NVSWITCH_INTERVAL_5MSEC_IN_NS, &timeout);
|
||||
status = flcnQueueCmdPostBlocking(device, pFlcn,
|
||||
(PRM_FLCN_CMD)&cmd,
|
||||
NULL, // pMsg
|
||||
NULL, // pPayload
|
||||
SOE_RM_CMDQ_LOG_ID,
|
||||
&cmdSeqDesc,
|
||||
&timeout);
|
||||
if (status != NV_OK)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: Failed to send SET_NPORT_INTRS command to SOE, status 0x%x\n",
|
||||
__FUNCTION__, status);
|
||||
return -NVL_ERR_GENERIC;
|
||||
}
|
||||
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* @Brief : Disable NPORT Fatal Interrupt in SOE
|
||||
*
|
||||
* @param[in] device
|
||||
* @param[in] nport
|
||||
* @param[in] nportIntrEnable
|
||||
* @param[in] nportIntrType
|
||||
*/
|
||||
void
|
||||
nvswitch_soe_disable_nport_fatal_interrupts_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
NvU32 nport,
|
||||
NvU32 nportIntrEnable,
|
||||
NvU8 nportIntrType
|
||||
)
|
||||
{
|
||||
FLCN *pFlcn;
|
||||
NvU32 cmdSeqDesc = 0;
|
||||
NV_STATUS status;
|
||||
RM_FLCN_CMD_SOE cmd;
|
||||
NVSWITCH_TIMEOUT timeout;
|
||||
RM_SOE_CORE_CMD_NPORT_FATAL_INTR *pNportIntrDisable;
|
||||
NVSWITCH_GET_BIOS_INFO_PARAMS p = { 0 };
|
||||
NvlStatus stat;
|
||||
|
||||
stat = device->hal.nvswitch_ctrl_get_bios_info(device, &p);
|
||||
if ((stat != NVL_SUCCESS) || ((p.version & SOE_VBIOS_VERSION_MASK) <
|
||||
SOE_VBIOS_REVLOCK_DISABLE_NPORT_FATAL_INTR))
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: Skipping DISABLE_NPORT_FATAL_INTR command to SOE. Update firmware "
|
||||
"from .%02X to .%02X\n",
|
||||
__FUNCTION__, (NvU32)((p.version & SOE_VBIOS_VERSION_MASK) >> 16),
|
||||
SOE_VBIOS_REVLOCK_DISABLE_NPORT_FATAL_INTR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!nvswitch_is_soe_supported(device))
|
||||
{
|
||||
NVSWITCH_PRINT(device, INFO, "%s: SOE is not supported\n",
|
||||
__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
|
||||
pFlcn = device->pSoe->pFlcn;
|
||||
|
||||
nvswitch_os_memset(&cmd, 0, sizeof(cmd));
|
||||
cmd.hdr.unitId = RM_SOE_UNIT_CORE;
|
||||
cmd.hdr.size = RM_SOE_CMD_SIZE(CORE, NPORT_FATAL_INTR);
|
||||
|
||||
pNportIntrDisable = &cmd.cmd.core.nportDisableIntr;
|
||||
pNportIntrDisable->cmdType = RM_SOE_CORE_CMD_DISABLE_NPORT_FATAL_INTR;
|
||||
pNportIntrDisable->nport = nport;
|
||||
pNportIntrDisable->nportIntrEnable = nportIntrEnable;
|
||||
pNportIntrDisable->nportIntrType = nportIntrType;
|
||||
|
||||
nvswitch_timeout_create(NVSWITCH_INTERVAL_5MSEC_IN_NS, &timeout);
|
||||
status = flcnQueueCmdPostBlocking(device, pFlcn,
|
||||
(PRM_FLCN_CMD)&cmd,
|
||||
NULL, // pMsg
|
||||
NULL, // pPayload
|
||||
SOE_RM_CMDQ_LOG_ID,
|
||||
&cmdSeqDesc,
|
||||
&timeout);
|
||||
if (status != NV_OK)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "%s: Failed to send DISABLE_NPORT_FATAL_INTR command to SOE, status 0x%x\n",
|
||||
__FUNCTION__, status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @Brief : Init sequence for SOE FSP RISCV image
|
||||
@@ -482,14 +618,6 @@ nvswitch_init_soe_ls10
|
||||
return status;
|
||||
}
|
||||
|
||||
//
|
||||
// Set TRACEPC to stack mode for better ucode trace
|
||||
// In Vulcan CR firmware, this is set to reduced mode in the SOE's manifest
|
||||
//
|
||||
data = flcnRiscvRegRead_HAL(device, pFlcn, NV_PRISCV_RISCV_TRACECTL);
|
||||
data = FLD_SET_DRF(_PRISCV, _RISCV_TRACECTL, _MODE, _STACK, data);
|
||||
flcnRiscvRegWrite_HAL(device, pFlcn, NV_PRISCV_RISCV_TRACECTL, data);
|
||||
|
||||
// Sanity the command and message queues as a final check
|
||||
if (_nvswitch_soe_send_test_cmd(device) != NV_OK)
|
||||
{
|
||||
@@ -555,7 +683,7 @@ nvswitch_soe_register_event_callbacks_ls10
|
||||
device, pFlcn,
|
||||
RM_SOE_UNIT_THERM,
|
||||
NULL,
|
||||
nvswitch_therm_soe_callback_lr10,
|
||||
nvswitch_therm_soe_callback_ls10,
|
||||
NULL,
|
||||
&pSoe->thermEvtDesc);
|
||||
if (status != NV_OK)
|
||||
|
||||
@@ -361,6 +361,103 @@ nvswitch_monitor_thermal_alert_ls10
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Callback function to recieve thermal messages from SOE.
|
||||
*/
|
||||
void
|
||||
nvswitch_therm_soe_callback_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
RM_FLCN_MSG *pGenMsg,
|
||||
void *pParams,
|
||||
NvU32 seqDesc,
|
||||
NV_STATUS status
|
||||
)
|
||||
{
|
||||
RM_SOE_THERM_MSG_SLOWDOWN_STATUS slowdown_status;
|
||||
RM_SOE_THERM_MSG_SHUTDOWN_STATUS shutdown_status;
|
||||
RM_FLCN_MSG_SOE *pMsg = (RM_FLCN_MSG_SOE *)pGenMsg;
|
||||
NvU32 temperature;
|
||||
NvU32 threshold;
|
||||
|
||||
switch (pMsg->msg.soeTherm.msgType)
|
||||
{
|
||||
case RM_SOE_THERM_MSG_ID_SLOWDOWN_STATUS:
|
||||
{
|
||||
slowdown_status = pMsg->msg.soeTherm.slowdown;
|
||||
if (slowdown_status.bSlowdown)
|
||||
{
|
||||
if (slowdown_status.source.bTsense) // TSENSE_THERM_ALERT
|
||||
{
|
||||
temperature = RM_SOE_NV_TEMP_TO_CELSIUS_TRUNCED(slowdown_status.maxTemperature);
|
||||
threshold = RM_SOE_NV_TEMP_TO_CELSIUS_TRUNCED(slowdown_status.warnThreshold);
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_START,
|
||||
"NVSWITCH Temperature %dC | TSENSE WARN Threshold %dC\n",
|
||||
temperature, threshold);
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_START,
|
||||
"Thermal Slowdown Engaged | Temp higher than WARN Threshold\n");
|
||||
}
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_START,
|
||||
"Thermal Slowdown Engaged | Links Thermal Mode %s\n", (slowdown_status.bLinksL1Status ? "ON" : "OFF"));
|
||||
|
||||
if (slowdown_status.source.bPmgr) // PMGR_THERM_ALERT
|
||||
{
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_START,
|
||||
"Thermal Slowdown Engaged | PMGR WARN Threshold reached\n");
|
||||
}
|
||||
}
|
||||
else // REVERT_SLOWDOWN
|
||||
{
|
||||
temperature = RM_SOE_NV_TEMP_TO_CELSIUS_TRUNCED(slowdown_status.maxTemperature);
|
||||
threshold = RM_SOE_NV_TEMP_TO_CELSIUS_TRUNCED(slowdown_status.warnThreshold);
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_END,
|
||||
"NVSWITCH Temperature %dC | TSENSE WARN Threshold %dC\n",
|
||||
temperature, threshold);
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_END,
|
||||
"Thermal Slowdown Disengaged | Links Thermal Mode %s\n", (slowdown_status.bLinksL1Status ? "ON" : "OFF"));
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_END,
|
||||
"Thermal slowdown Disengaged\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case RM_SOE_THERM_MSG_ID_SHUTDOWN_STATUS:
|
||||
{
|
||||
shutdown_status = pMsg->msg.soeTherm.shutdown;
|
||||
if (shutdown_status.source.bTsense) // TSENSE_THERM_SHUTDOWN
|
||||
{
|
||||
temperature = RM_SOE_NV_TEMP_TO_CELSIUS_TRUNCED(shutdown_status.maxTemperature);
|
||||
threshold = RM_SOE_NV_TEMP_TO_CELSIUS_TRUNCED(shutdown_status.overtThreshold);
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_SHUTDOWN,
|
||||
"NVSWITCH Temperature %dC | OVERT Threshold %dC\n",
|
||||
temperature, threshold);
|
||||
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_SHUTDOWN,
|
||||
"TSENSE OVERT Threshold reached. Shutting Down\n");
|
||||
}
|
||||
|
||||
if (shutdown_status.source.bPmgr) // PMGR_THERM_SHUTDOWN
|
||||
{
|
||||
NVSWITCH_PRINT_SXID(device, NVSWITCH_ERR_HW_HOST_THERMAL_EVENT_START,
|
||||
"PMGR OVERT Threshold reached. Shutting Down\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "%s Unknown message Id\n", __FUNCTION__);
|
||||
NVSWITCH_ASSERT(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// nvswitch_therm_read_voltage
|
||||
//
|
||||
@@ -445,3 +542,86 @@ nvswitch_ctrl_therm_read_voltage_ls10
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
|
||||
//
|
||||
// nvswitch_therm_read_power
|
||||
//
|
||||
// Power is only available on SKUs which have thermal and
|
||||
// voltage sensors.
|
||||
//
|
||||
NvlStatus
|
||||
nvswitch_ctrl_therm_read_power_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
NVSWITCH_GET_POWER_PARAMS *pParams
|
||||
)
|
||||
{
|
||||
FLCN *pFlcn;
|
||||
NvU32 cmdSeqDesc;
|
||||
NV_STATUS status;
|
||||
NvU8 flcnStatus;
|
||||
RM_FLCN_CMD_SOE cmd;
|
||||
RM_FLCN_MSG_SOE msg;
|
||||
RM_SOE_CORE_CMD_GET_POWER *pGetPowerCmd;
|
||||
NVSWITCH_TIMEOUT timeout;
|
||||
|
||||
if (!nvswitch_is_soe_supported(device))
|
||||
{
|
||||
return -NVL_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
if (pParams == NULL)
|
||||
{
|
||||
return -NVL_BAD_ARGS;
|
||||
}
|
||||
|
||||
pFlcn = device->pSoe->pFlcn;
|
||||
|
||||
nvswitch_os_memset(pParams, 0, sizeof(NVSWITCH_GET_POWER_PARAMS));
|
||||
nvswitch_os_memset(&cmd, 0, sizeof(RM_FLCN_CMD_SOE));
|
||||
nvswitch_os_memset(&msg, 0, sizeof(RM_FLCN_MSG_SOE));
|
||||
|
||||
cmd.hdr.unitId = RM_SOE_UNIT_CORE;
|
||||
cmd.hdr.size = RM_SOE_CMD_SIZE(CORE, GET_POWER);
|
||||
|
||||
msg.hdr.unitId = RM_SOE_UNIT_CORE;
|
||||
msg.hdr.size = RM_SOE_MSG_SIZE(CORE, GET_POWER);
|
||||
|
||||
pGetPowerCmd = &cmd.cmd.core.getPower;
|
||||
pGetPowerCmd->cmdType = RM_SOE_CORE_CMD_GET_POWER_VALUES;
|
||||
|
||||
cmdSeqDesc = 0;
|
||||
|
||||
nvswitch_timeout_create(NVSWITCH_INTERVAL_1SEC_IN_NS * 5, &timeout);
|
||||
status = flcnQueueCmdPostBlocking(device, pFlcn,
|
||||
(PRM_FLCN_CMD)&cmd,
|
||||
(PRM_FLCN_MSG)&msg, // pMsg
|
||||
NULL, // pPayload
|
||||
SOE_RM_CMDQ_LOG_ID,
|
||||
&cmdSeqDesc,
|
||||
&timeout);
|
||||
if (status != NV_OK)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR, "%s: Failed to read power 0x%x\n",
|
||||
__FUNCTION__, status);
|
||||
return -NVL_ERR_INVALID_STATE;
|
||||
}
|
||||
|
||||
flcnStatus = msg.msg.core.getPower.flcnStatus;
|
||||
if (flcnStatus != FLCN_OK)
|
||||
{
|
||||
if (flcnStatus == FLCN_ERR_MORE_PROCESSING_REQUIRED)
|
||||
{
|
||||
return -NVL_MORE_PROCESSING_REQUIRED;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -NVL_ERR_GENERIC;
|
||||
}
|
||||
}
|
||||
|
||||
pParams->vdd_w = msg.msg.core.getPower.vdd_w;
|
||||
pParams->dvdd_w = msg.msg.core.getPower.dvdd_w;
|
||||
pParams->hvdd_w = msg.msg.core.getPower.hvdd_w;
|
||||
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
Reference in New Issue
Block a user