mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-02-02 14:37:43 +00:00
535.161.07
This commit is contained in:
@@ -41,6 +41,11 @@
|
||||
#include "nvswitch/ls10/dev_minion_ip_addendum.h"
|
||||
#include "ls10/minion_nvlink_defines_public_ls10.h"
|
||||
|
||||
#define NV_NVLINK_TLREQ_TIMEOUT_ACTIVE 10000
|
||||
#define NV_NVLINK_TLREQ_TIMEOUT_SHUTDOWN 10
|
||||
#define NV_NVLINK_TLREQ_TIMEOUT_RESET 4
|
||||
#define NV_NVLINK_TLREQ_TIMEOUT_L2 5
|
||||
|
||||
static void
|
||||
_nvswitch_configure_reserved_throughput_counters
|
||||
(
|
||||
@@ -144,7 +149,7 @@ nvswitch_init_lpwr_regs_ls10
|
||||
if (nvswitch_lib_get_bios_version(device, &biosVersion) != NVL_SUCCESS)
|
||||
{
|
||||
NVSWITCH_PRINT(device, WARN, "%s Get VBIOS version failed.\n",
|
||||
__FUNCTION__);
|
||||
__FUNCTION__);
|
||||
biosVersion = 0;
|
||||
}
|
||||
|
||||
@@ -1713,6 +1718,39 @@ nvswitch_are_link_clocks_on_ls10
|
||||
return NV_TRUE;
|
||||
}
|
||||
|
||||
static
|
||||
NvlStatus
|
||||
_nvswitch_tl_request_get_timeout_value_ls10
|
||||
(
|
||||
nvswitch_device *device,
|
||||
NvU32 tlLinkState,
|
||||
NvU32 *timeoutVal
|
||||
)
|
||||
{
|
||||
switch (tlLinkState)
|
||||
{
|
||||
case NV_NVLIPT_LNK_CTRL_LINK_STATE_REQUEST_REQUEST_ACTIVE:
|
||||
*timeoutVal = NV_NVLINK_TLREQ_TIMEOUT_ACTIVE;
|
||||
break;
|
||||
case NV_NVLIPT_LNK_CTRL_LINK_STATE_REQUEST_REQUEST_RESET:
|
||||
*timeoutVal = NV_NVLINK_TLREQ_TIMEOUT_RESET;
|
||||
break;
|
||||
case NV_NVLIPT_LNK_CTRL_LINK_STATE_REQUEST_REQUEST_SHUTDOWN:
|
||||
*timeoutVal = NV_NVLINK_TLREQ_TIMEOUT_SHUTDOWN;
|
||||
break;
|
||||
case NV_NVLIPT_LNK_CTRL_LINK_STATE_REQUEST_REQUEST_L2:
|
||||
*timeoutVal = NV_NVLINK_TLREQ_TIMEOUT_L2;
|
||||
break;
|
||||
default:
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: Invalid tlLinkState %d provided!\n",
|
||||
__FUNCTION__, tlLinkState);
|
||||
return NVL_BAD_ARGS;
|
||||
}
|
||||
|
||||
return NVL_SUCCESS;
|
||||
}
|
||||
|
||||
NvlStatus
|
||||
nvswitch_request_tl_link_state_ls10
|
||||
(
|
||||
@@ -1726,6 +1764,9 @@ nvswitch_request_tl_link_state_ls10
|
||||
NvU32 linkStatus;
|
||||
NvU32 lnkErrStatus;
|
||||
NvU32 bit;
|
||||
NvU32 timeoutVal;
|
||||
NVSWITCH_TIMEOUT timeout;
|
||||
NvBool keepPolling;
|
||||
|
||||
if (!NVSWITCH_IS_LINK_ENG_VALID_LS10(device, NVLIPT_LNK, link->linkNumber))
|
||||
{
|
||||
@@ -1759,25 +1800,53 @@ nvswitch_request_tl_link_state_ls10
|
||||
|
||||
if (bSync)
|
||||
{
|
||||
// Wait for the TL link state register to complete
|
||||
status = nvswitch_wait_for_tl_request_ready_lr10(link);
|
||||
|
||||
// setup timeouts for the TL request
|
||||
status = _nvswitch_tl_request_get_timeout_value_ls10(device, tlLinkState, &timeoutVal);
|
||||
if (status != NVL_SUCCESS)
|
||||
{
|
||||
return status;
|
||||
return NVL_ERR_INVALID_STATE;
|
||||
}
|
||||
|
||||
// Check for state requested
|
||||
linkStatus = NVSWITCH_LINK_RD32_LS10(device, link->linkNumber,
|
||||
nvswitch_timeout_create(NVSWITCH_INTERVAL_1MSEC_IN_NS * timeoutVal, &timeout);
|
||||
status = NVL_MORE_PROCESSING_REQUIRED;
|
||||
|
||||
do
|
||||
{
|
||||
keepPolling = (nvswitch_timeout_check(&timeout)) ? NV_FALSE : NV_TRUE;
|
||||
|
||||
// Check for state requested
|
||||
linkStatus = NVSWITCH_LINK_RD32_LS10(device, link->linkNumber,
|
||||
NVLIPT_LNK , _NVLIPT_LNK , _CTRL_LINK_STATE_STATUS);
|
||||
|
||||
if (DRF_VAL(_NVLIPT_LNK, _CTRL_LINK_STATE_STATUS, _CURRENTLINKSTATE, linkStatus) !=
|
||||
tlLinkState)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: TL link state request to state 0x%x for link #%d did not complete!\n",
|
||||
__FUNCTION__, tlLinkState, link->linkNumber);
|
||||
return -NVL_ERR_GENERIC;
|
||||
if (DRF_VAL(_NVLIPT_LNK, _CTRL_LINK_STATE_STATUS, _CURRENTLINKSTATE, linkStatus) ==
|
||||
tlLinkState)
|
||||
{
|
||||
status = NVL_SUCCESS;
|
||||
break;
|
||||
}
|
||||
|
||||
nvswitch_os_sleep(1);
|
||||
}
|
||||
while(keepPolling);
|
||||
|
||||
// Do one final check if the polling loop didn't see the target linkState
|
||||
if (status == NVL_MORE_PROCESSING_REQUIRED)
|
||||
{
|
||||
// Check for state requested
|
||||
linkStatus = NVSWITCH_LINK_RD32_LS10(device, link->linkNumber,
|
||||
NVLIPT_LNK , _NVLIPT_LNK , _CTRL_LINK_STATE_STATUS);
|
||||
|
||||
if (DRF_VAL(_NVLIPT_LNK, _CTRL_LINK_STATE_STATUS, _CURRENTLINKSTATE, linkStatus) !=
|
||||
tlLinkState)
|
||||
{
|
||||
NVSWITCH_PRINT(device, ERROR,
|
||||
"%s: TL link state request to state 0x%x for link #%d did not complete!\n",
|
||||
__FUNCTION__, tlLinkState, link->linkNumber);
|
||||
return -NVL_ERR_GENERIC;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
Reference in New Issue
Block a user