mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-01-26 19:19:47 +00:00
515.76
This commit is contained in:
@@ -36,25 +36,25 @@
|
||||
// and then checked back in. You cannot make changes to these sections without
|
||||
// corresponding changes to the buildmeister script
|
||||
#ifndef NV_BUILD_BRANCH
|
||||
#define NV_BUILD_BRANCH r516_87
|
||||
#define NV_BUILD_BRANCH r515_00
|
||||
#endif
|
||||
#ifndef NV_PUBLIC_BRANCH
|
||||
#define NV_PUBLIC_BRANCH r516_87
|
||||
#define NV_PUBLIC_BRANCH r515_00
|
||||
#endif
|
||||
|
||||
#if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS)
|
||||
#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r515/r516_87-317"
|
||||
#define NV_BUILD_CHANGELIST_NUM (31589401)
|
||||
#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r515/r515_00-409"
|
||||
#define NV_BUILD_CHANGELIST_NUM (31799928)
|
||||
#define NV_BUILD_TYPE "Official"
|
||||
#define NV_BUILD_NAME "rel/gpu_drv/r515/r516_87-317"
|
||||
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31589401)
|
||||
#define NV_BUILD_NAME "rel/gpu_drv/r515/r515_00-409"
|
||||
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31799928)
|
||||
|
||||
#else /* Windows builds */
|
||||
#define NV_BUILD_BRANCH_VERSION "r516_87-1"
|
||||
#define NV_BUILD_CHANGELIST_NUM (31588177)
|
||||
#define NV_BUILD_BRANCH_VERSION "r515_00-323"
|
||||
#define NV_BUILD_CHANGELIST_NUM (31799928)
|
||||
#define NV_BUILD_TYPE "Official"
|
||||
#define NV_BUILD_NAME "516.90"
|
||||
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31588177)
|
||||
#define NV_BUILD_NAME "517.40"
|
||||
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31799928)
|
||||
#define NV_BUILD_BRANCH_BASE_VERSION R515
|
||||
#endif
|
||||
// End buildmeister python edited section
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS) || defined(NV_VMWARE) || defined(NV_QNX) || defined(NV_INTEGRITY) || \
|
||||
(defined(RMCFG_FEATURE_PLATFORM_GSP) && RMCFG_FEATURE_PLATFORM_GSP == 1)
|
||||
|
||||
#define NV_VERSION_STRING "515.65.01"
|
||||
#define NV_VERSION_STRING "515.76"
|
||||
|
||||
#else
|
||||
|
||||
|
||||
@@ -195,6 +195,11 @@ extern NVLOG_LOGGER NvLogLogger;
|
||||
#define NVLOG_BUFFER_FLAGS_FORMAT_LIBOS_LOG 1
|
||||
#define NVLOG_BUFFER_FLAGS_FORMAT_MEMTRACK 2
|
||||
|
||||
// Never deallocate this buffer until RM is unloaded
|
||||
#define NVLOG_BUFFER_FLAGS_PRESERVE 11:11
|
||||
#define NVLOG_BUFFER_FLAGS_PRESERVE_NO 0
|
||||
#define NVLOG_BUFFER_FLAGS_PRESERVE_YES 1
|
||||
|
||||
// Buffer GPU index
|
||||
#define NVLOG_BUFFER_FLAGS_GPU_INSTANCE 31:24
|
||||
|
||||
|
||||
@@ -4091,6 +4091,8 @@ typedef struct tagNVT_GAMUT_METADATA
|
||||
#define NVT_DPCD_ADDRESS_DOWN_REP_BUFFER_FIELD 0x01400
|
||||
#define NVT_DPCD_ADDRESS_UP_REQ_BUFFER_FIELD 0x01600
|
||||
#define NVT_DPCD_ADDRESS_DEVICE_SERVICE_IRQ_VECTOR_ESI0 0x02003
|
||||
#define NVT_DPCD_ADDRESS_DP_TUNNELING_DEVICE_IEEE_OUI 0xE0000
|
||||
#define NVT_DPCD_ADDRESS_DP_TUNNELING_DEVICE_ID_STRING 0xE0003
|
||||
#define NVT_DPCD_ADDRESS_DP_TUNNELING_CAPS_SUPPORT_FIELD 0xE000D
|
||||
#define NVT_DPCD_ADDRESS_DP_IN_ADAPTER_INFO_FIELD 0xE000E
|
||||
#define NVT_DPCD_ADDRESS_USB4_DRIVER_ID_FIELD 0xE000F
|
||||
@@ -5079,7 +5081,7 @@ typedef struct tagNVT_DPCD_CONFIG
|
||||
|
||||
typedef struct tagNVT_DPCD_DP_TUNNELING_CAPS
|
||||
{
|
||||
NvU8 dpTunnelingSupport : 1; // DP Tunneling through USB4 Support
|
||||
NvU8 dpTunneling : 1; // DP Tunneling through USB4 Support
|
||||
NvU8 reserved : 5; // Reserved.
|
||||
NvU8 dpPanelReplayTunnelingOptSupport : 1; // Panel Replay Tunneling Optimization Support
|
||||
NvU8 dpInBwAllocationModeSupport : 1; // DP IN Bandwidth Allocation Mode Support
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
* Total number of nvlink endpoints core library can have
|
||||
* This is mapped to NVLINK_MAX_SYSTEM_LINK_NUM in drivers/nvlink/interface/nvlink.h
|
||||
*/
|
||||
#define NVLINK_MAX_NVLINK_ENDPOINTS 312
|
||||
#define NVLINK_MAX_NVLINK_ENDPOINTS 624
|
||||
|
||||
#define NVLINK_VERSION_STRING_LENGTH 64
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "../nvlink_ctx.h"
|
||||
#include "../nvlink_helper.h"
|
||||
#include "nvlink_lock.h"
|
||||
#include "nvctassert.h"
|
||||
|
||||
#define NVLINK_IOC_GET_BUF(ctrlParams, type) (ctrlParams)->size >= sizeof(type) ? (type *) (ctrlParams)->buf : NULL
|
||||
|
||||
@@ -3423,6 +3424,8 @@ nvlink_lib_ctrl_get_device_link_states
|
||||
NvU32 numLinks = 0;
|
||||
NvU32 i = 0;
|
||||
|
||||
ct_assert(NVLINK_MAX_SYSTEM_LINK_NUM == NVLINK_MAX_NVLINK_ENDPOINTS);
|
||||
|
||||
nvlink_link **links = (nvlink_link **)nvlink_malloc(
|
||||
sizeof(nvlink_link *) * NVLINK_MAX_SYSTEM_LINK_NUM);
|
||||
if (links == NULL)
|
||||
|
||||
@@ -1041,24 +1041,41 @@ static NvBool libosCopyLogToNvlog_nowrap(LIBOS_LOG_DECODE_LOG *pLog)
|
||||
NvU64 putCopy = pLog->physicLogBuffer[0];
|
||||
NvU64 putOffset = putCopy * sizeof(NvU64) + sizeof(NvU64);
|
||||
|
||||
if (putOffset == pNvLogBuffer->pos)
|
||||
//
|
||||
// If RM was not unloaded, we will reuse a preserved nowrap nvlog buffer with the fresh
|
||||
// physical log buffer. In this case, we fix up all the offsets into the nvlog buffer to be
|
||||
// relative to its preserved position rather than the start.
|
||||
//
|
||||
NvU64 nvlogPos = pNvLogBuffer->pos - pLog->preservedNoWrapPos;
|
||||
|
||||
if (putOffset < nvlogPos)
|
||||
{
|
||||
// Buffer put counter unexpectedly reset. Terminate nowrap log collection.
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
if (putOffset == nvlogPos)
|
||||
{
|
||||
// No new data
|
||||
return NV_TRUE;
|
||||
}
|
||||
|
||||
if (putOffset > pNvLogBuffer->size - NV_OFFSETOF(LIBOS_LOG_NVLOG_BUFFER, data) - sizeof(NvU64))
|
||||
if (putOffset + pLog->preservedNoWrapPos >
|
||||
pNvLogBuffer->size - NV_OFFSETOF(LIBOS_LOG_NVLOG_BUFFER, data) - sizeof(NvU64))
|
||||
{
|
||||
// Are we done filling nowrap?
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
NvU64 len = putOffset - pNvLogBuffer->pos;
|
||||
NvU8 *pSrc = ((NvU8 *)pLog->physicLogBuffer) + pNvLogBuffer->pos;
|
||||
NvU64 len = putOffset - nvlogPos;
|
||||
NvU8 *pSrc = ((NvU8 *)pLog->physicLogBuffer) + nvlogPos;
|
||||
NvU8 *pDst = pNoWrapBuf->data + pNvLogBuffer->pos;
|
||||
|
||||
pLog->bDidPush = NV_TRUE;
|
||||
|
||||
portMemCopy(pDst, len, pSrc, len);
|
||||
pNvLogBuffer->pos = putOffset; // TODO: usage of NVLOG_BUFFER::pos is sus here, reconsider?
|
||||
*(NvU64 *)(pNoWrapBuf->data) = putCopy;
|
||||
pNvLogBuffer->pos = putOffset + pLog->preservedNoWrapPos; // TODO: usage of NVLOG_BUFFER::pos is sus here, reconsider?
|
||||
*(NvU64 *)(pNoWrapBuf->data) = putCopy + pLog->preservedNoWrapPos / sizeof(NvU64);
|
||||
return NV_TRUE;
|
||||
}
|
||||
|
||||
@@ -1095,6 +1112,46 @@ static void libosExtractLogs_nvlog(LIBOS_LOG_DECODE *logDecode, NvBool bSyncNvLo
|
||||
}
|
||||
}
|
||||
|
||||
void libosPreserveLogs(LIBOS_LOG_DECODE *pLogDecode)
|
||||
{
|
||||
NvU64 i;
|
||||
for (i = 0; i < pLogDecode->numLogBuffers; i++)
|
||||
{
|
||||
LIBOS_LOG_DECODE_LOG *pLog = &pLogDecode->log[i];
|
||||
|
||||
if (pLog->bDidPush)
|
||||
{
|
||||
NvHandle hNvlog = pLog->hNvLogNoWrap;
|
||||
NVLOG_BUFFER *pNvLogBuffer = NvLogLogger.pBuffers[hNvlog];
|
||||
|
||||
if (hNvlog == 0 || pNvLogBuffer == NULL)
|
||||
continue;
|
||||
|
||||
pNvLogBuffer->flags |= DRF_DEF(LOG, _BUFFER_FLAGS, _PRESERVE, _YES);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static NvBool findPreservedNvlogBuffer(NvU32 tag, NvU32 gpuInstance, NVLOG_BUFFER_HANDLE *pHandle)
|
||||
{
|
||||
NVLOG_BUFFER_HANDLE handle = 0;
|
||||
NV_STATUS status = nvlogGetBufferHandleFromTag(tag, &handle);
|
||||
|
||||
if (status != NV_OK)
|
||||
return NV_FALSE;
|
||||
|
||||
NVLOG_BUFFER *pNvLogBuffer = NvLogLogger.pBuffers[handle];
|
||||
if (FLD_TEST_DRF(LOG_BUFFER, _FLAGS, _PRESERVE, _YES, pNvLogBuffer->flags) &&
|
||||
DRF_VAL(LOG, _BUFFER_FLAGS, _GPU_INSTANCE, pNvLogBuffer->flags) == gpuInstance &&
|
||||
(pNvLogBuffer->pos < pNvLogBuffer->size - NV_OFFSETOF(LIBOS_LOG_NVLOG_BUFFER, data) - sizeof(NvU64)))
|
||||
{
|
||||
*pHandle = handle;
|
||||
return NV_TRUE;
|
||||
}
|
||||
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
#endif // LIBOS_LOG_TO_NVLOG
|
||||
|
||||
/**
|
||||
@@ -1211,39 +1268,60 @@ void libosLogAddLogEx(LIBOS_LOG_DECODE *logDecode, void *buffer, NvU64 bufferSiz
|
||||
pLog->hNvLogWrap = 0;
|
||||
pLog->bNvLogNoWrap = NV_FALSE;
|
||||
|
||||
pLog->bDidPush = NV_FALSE;
|
||||
pLog->preservedNoWrapPos = 0;
|
||||
|
||||
LIBOS_LOG_NVLOG_BUFFER *pNoWrapBuf;
|
||||
NvU32 tag = LIBOS_LOG_NVLOG_BUFFER_TAG(logDecode->sourceName, i * 2);
|
||||
NvBool bFoundPreserved = findPreservedNvlogBuffer(tag, gpuInstance, &pLog->hNvLogNoWrap);
|
||||
|
||||
status = nvlogAllocBuffer(
|
||||
bufferSize + NV_OFFSETOF(LIBOS_LOG_NVLOG_BUFFER, data), libosNoWrapBufferFlags,
|
||||
LIBOS_LOG_NVLOG_BUFFER_TAG(logDecode->sourceName, i * 2),
|
||||
&pLog->hNvLogNoWrap);
|
||||
|
||||
if (status == NV_OK)
|
||||
if (!bFoundPreserved)
|
||||
{
|
||||
pNoWrapBuf = (LIBOS_LOG_NVLOG_BUFFER *)NvLogLogger.pBuffers[pLog->hNvLogNoWrap]->data;
|
||||
if (name)
|
||||
status = nvlogAllocBuffer(
|
||||
bufferSize + NV_OFFSETOF(LIBOS_LOG_NVLOG_BUFFER, data), libosNoWrapBufferFlags,
|
||||
tag,
|
||||
&pLog->hNvLogNoWrap);
|
||||
|
||||
if (status == NV_OK)
|
||||
{
|
||||
portStringCopy(
|
||||
pNoWrapBuf->taskPrefix, sizeof pNoWrapBuf->taskPrefix, name, sizeof pNoWrapBuf->taskPrefix);
|
||||
pNoWrapBuf = (LIBOS_LOG_NVLOG_BUFFER *)NvLogLogger.pBuffers[pLog->hNvLogNoWrap]->data;
|
||||
if (name)
|
||||
{
|
||||
portStringCopy(
|
||||
pNoWrapBuf->taskPrefix, sizeof pNoWrapBuf->taskPrefix, name, sizeof pNoWrapBuf->taskPrefix);
|
||||
}
|
||||
|
||||
pNoWrapBuf->gpuArch = gpuArch;
|
||||
pNoWrapBuf->gpuImpl = gpuImpl;
|
||||
|
||||
NvLogLogger.pBuffers[pLog->hNvLogNoWrap]->pos = sizeof(NvU64); // offset to account for put pointer
|
||||
pLog->bNvLogNoWrap = NV_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("nvlogAllocBuffer nowrap failed\n");
|
||||
}
|
||||
|
||||
pNoWrapBuf->gpuArch = gpuArch;
|
||||
pNoWrapBuf->gpuImpl = gpuImpl;
|
||||
|
||||
NvLogLogger.pBuffers[pLog->hNvLogNoWrap]->pos = sizeof(NvU64); // offset to account for put pointer
|
||||
pLog->bNvLogNoWrap = NV_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("nvlogAllocBuffer nowrap failed\n");
|
||||
pLog->bNvLogNoWrap = NV_TRUE;
|
||||
pLog->preservedNoWrapPos = NvLogLogger.pBuffers[pLog->hNvLogNoWrap]->pos;
|
||||
|
||||
//
|
||||
// The 0th NvU64 is the last value of put pointer from the physical log buffer, which is
|
||||
// the number of NvU64 log buffer elements in it plus one.
|
||||
// Subtract one NvU64 from it to avoid off-by-one error.
|
||||
//
|
||||
if (pLog->preservedNoWrapPos >= sizeof(NvU64))
|
||||
pLog->preservedNoWrapPos -= sizeof(NvU64);
|
||||
}
|
||||
|
||||
LIBOS_LOG_NVLOG_BUFFER *pWrapBuf;
|
||||
tag = LIBOS_LOG_NVLOG_BUFFER_TAG(logDecode->sourceName, i * 2 + 1);
|
||||
|
||||
status = nvlogAllocBuffer(
|
||||
bufferSize + NV_OFFSETOF(LIBOS_LOG_NVLOG_BUFFER, data), libosWrapBufferFlags,
|
||||
LIBOS_LOG_NVLOG_BUFFER_TAG(logDecode->sourceName, i * 2 + 1),
|
||||
&pLog->hNvLogWrap);
|
||||
tag, &pLog->hNvLogWrap);
|
||||
|
||||
if (status == NV_OK)
|
||||
{
|
||||
@@ -1349,13 +1427,13 @@ void libosLogDestroy(LIBOS_LOG_DECODE *logDecode)
|
||||
|
||||
if (pLog->hNvLogNoWrap != 0)
|
||||
{
|
||||
nvlogDeallocBuffer(pLog->hNvLogNoWrap);
|
||||
nvlogDeallocBuffer(pLog->hNvLogNoWrap, NV_FALSE);
|
||||
pLog->hNvLogNoWrap = 0;
|
||||
}
|
||||
|
||||
if (pLog->hNvLogWrap != 0)
|
||||
{
|
||||
nvlogDeallocBuffer(pLog->hNvLogWrap);
|
||||
nvlogDeallocBuffer(pLog->hNvLogWrap, NV_FALSE);
|
||||
pLog->hNvLogWrap = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,6 +108,9 @@ struct LIBOS_LOG_DECODE_LOG
|
||||
NvU32 hNvLogNoWrap; // No wrap buffer captures first records.
|
||||
NvU32 hNvLogWrap; // Wrap buffer captures last records.
|
||||
NvBool bNvLogNoWrap; // NV_TRUE if no wrap buffer not full.
|
||||
|
||||
NvBool bDidPush; // NV_TRUE if this buffer was ever pushed to
|
||||
NvU64 preservedNoWrapPos; // Position in preserved nvlog buffer
|
||||
#endif
|
||||
|
||||
#if LIBOS_LOG_DECODE_ENABLE
|
||||
@@ -170,6 +173,8 @@ void libosLogDestroy(LIBOS_LOG_DECODE *logDecode);
|
||||
|
||||
void libosExtractLogs(LIBOS_LOG_DECODE *logDecode, NvBool bSyncNvLog);
|
||||
|
||||
void libosPreserveLogs(LIBOS_LOG_DECODE *pLogDecode);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -110,6 +110,7 @@ typedef struct {
|
||||
} set_maxval;
|
||||
} NvKmsSyncPtOpParams;
|
||||
|
||||
NvBool nvkms_output_rounding_fix(void);
|
||||
|
||||
void nvkms_call_rm (void *ops);
|
||||
void* nvkms_alloc (size_t size,
|
||||
|
||||
@@ -1288,6 +1288,8 @@ static void EvoSetOCsc0C5(NVDispEvoPtr pDispEvo, const NvU32 head)
|
||||
|
||||
const float32_t zeroF32 = NvU32viewAsF32(NV_FLOAT_ZERO);
|
||||
const float32_t oneF32 = NvU32viewAsF32(NV_FLOAT_ONE);
|
||||
const float32_t inv2048F32 = f32_div(NvU32viewAsF32(NV_FLOAT_HALF),
|
||||
NvU32viewAsF32(NV_FLOAT_1024));
|
||||
/* divide satCos by the default setting of 1024 */
|
||||
const float32_t satCos = f32_div(i32_to_f32(pHeadState->procAmp.satCos),
|
||||
NvU32viewAsF32(NV_FLOAT_1024));
|
||||
@@ -1324,6 +1326,12 @@ static void EvoSetOCsc0C5(NVDispEvoPtr pDispEvo, const NvU32 head)
|
||||
ocsc0Matrix = nvMultiply3x4Matrix(&satHueMatrix, &ocsc0Matrix);
|
||||
ocsc0Matrix = nvMultiply3x4Matrix(&CrYCbtoRGBMatrix, &ocsc0Matrix);
|
||||
|
||||
if (nvkms_output_rounding_fix()) {
|
||||
ocsc0Matrix.m[0][3] = f32_add(ocsc0Matrix.m[0][3], inv2048F32);
|
||||
ocsc0Matrix.m[1][3] = f32_add(ocsc0Matrix.m[1][3], inv2048F32);
|
||||
ocsc0Matrix.m[2][3] = f32_add(ocsc0Matrix.m[2][3], inv2048F32);
|
||||
}
|
||||
|
||||
nvDmaSetStartEvoMethod(pChannel, NVC57D_HEAD_SET_OCSC0COEFFICIENT_C00(head), 12);
|
||||
nvDmaSetEvoMethodData(pChannel, DRF_NUM(C57D, _HEAD_SET_OCSC0COEFFICIENT_C00, _VALUE, cscCoefConvertS514(ocsc0Matrix.m[0][0])));
|
||||
nvDmaSetEvoMethodData(pChannel, DRF_NUM(C57D, _HEAD_SET_OCSC0COEFFICIENT_C01, _VALUE, cscCoefConvertS514(ocsc0Matrix.m[0][1])));
|
||||
@@ -1965,11 +1973,13 @@ static inline NvU32 GetMaxPixelsFetchedPerLine(NvU16 inWidth,
|
||||
static void SetScalingUsageBoundsOneWindow5(
|
||||
NVDevEvoPtr pDevEvo, NvU32 window,
|
||||
const struct NvKmsScalingUsageBounds *pScaling,
|
||||
NvBool layerUsable,
|
||||
const NVHwModeViewPortEvo *pViewPort,
|
||||
NVEvoUpdateState *updateState)
|
||||
{
|
||||
NVEvoChannelPtr pChannel = pDevEvo->core;
|
||||
NvU32 setWindowUsageBounds = NV_EVO3_DEFAULT_WINDOW_USAGE_BOUNDS_C5;
|
||||
NvU32 maxPixelsFetchedPerLine;
|
||||
|
||||
nvUpdateUpdateState(pDevEvo, updateState, pChannel);
|
||||
|
||||
@@ -1981,10 +1991,15 @@ static void SetScalingUsageBoundsOneWindow5(
|
||||
DRF_NUM(C57D, _WINDOW_SET_MAX_INPUT_SCALE_FACTOR, _VERTICAL,
|
||||
pScaling->maxVDownscaleFactor));
|
||||
|
||||
if (layerUsable) {
|
||||
maxPixelsFetchedPerLine = GetMaxPixelsFetchedPerLine(pViewPort->in.width,
|
||||
pScaling->maxHDownscaleFactor);
|
||||
} else {
|
||||
maxPixelsFetchedPerLine = 0;
|
||||
}
|
||||
|
||||
setWindowUsageBounds |=
|
||||
(DRF_NUM(C57D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _MAX_PIXELS_FETCHED_PER_LINE,
|
||||
GetMaxPixelsFetchedPerLine(pViewPort->in.width,
|
||||
pScaling->maxHDownscaleFactor))) |
|
||||
(DRF_NUM(C57D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _MAX_PIXELS_FETCHED_PER_LINE,maxPixelsFetchedPerLine)) |
|
||||
(pScaling->vTaps >= NV_EVO_SCALER_5TAPS ?
|
||||
DRF_DEF(C57D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _INPUT_SCALER_TAPS, _TAPS_5) :
|
||||
DRF_DEF(C57D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _INPUT_SCALER_TAPS, _TAPS_2)) |
|
||||
@@ -2056,8 +2071,9 @@ static NvBool EvoSetUsageBoundsC5(NVDevEvoPtr pDevEvo, NvU32 sd, NvU32 head,
|
||||
needCoreUpdate = EvoSetUsageBounds3(pDevEvo, sd, head, pUsage, updateState);
|
||||
|
||||
for (layer = 0; layer < pDevEvo->head[head].numLayers; layer++) {
|
||||
if (!nvEvoScalingUsageBoundsEqual(&pCurrentUsage->layer[layer].scaling,
|
||||
&pUsage->layer[layer].scaling)) {
|
||||
if ((pCurrentUsage->layer[layer].usable != pUsage->layer[layer].usable) ||
|
||||
(!nvEvoScalingUsageBoundsEqual(&pCurrentUsage->layer[layer].scaling,
|
||||
&pUsage->layer[layer].scaling))) {
|
||||
const NVHwModeViewPortEvo *pViewPort =
|
||||
&pDevEvo->gpus[sd].pDispEvo->headState[head].timings.viewPort;
|
||||
|
||||
@@ -2066,6 +2082,7 @@ static NvBool EvoSetUsageBoundsC5(NVDevEvoPtr pDevEvo, NvU32 sd, NvU32 head,
|
||||
NV_EVO_CHANNEL_MASK_WINDOW_NUMBER(
|
||||
pDevEvo->head[head].layer[layer]->channelMask),
|
||||
&pUsage->layer[layer].scaling,
|
||||
pUsage->layer[layer].usable,
|
||||
pViewPort,
|
||||
updateState);
|
||||
needCoreUpdate = TRUE;
|
||||
@@ -4383,7 +4400,9 @@ static void EvoSetLUTContextDmaC5(const NVDispEvoRec *pDispEvo,
|
||||
|
||||
nvDmaSetStartEvoMethod(pChannel, NVC57D_HEAD_SET_OLUT_CONTROL(head), 1);
|
||||
nvDmaSetEvoMethodData(pChannel,
|
||||
DRF_DEF(C57D, _HEAD_SET_OLUT_CONTROL, _INTERPOLATE, _ENABLE) |
|
||||
(!nvkms_output_rounding_fix() ?
|
||||
DRF_DEF(C57D, _HEAD_SET_OLUT_CONTROL, _INTERPOLATE, _ENABLE) :
|
||||
DRF_DEF(C57D, _HEAD_SET_OLUT_CONTROL, _INTERPOLATE, _DISABLE)) |
|
||||
DRF_DEF(C57D, _HEAD_SET_OLUT_CONTROL, _MIRROR, _DISABLE) |
|
||||
DRF_DEF(C57D, _HEAD_SET_OLUT_CONTROL, _MODE, _DIRECT10) |
|
||||
DRF_NUM(C57D, _HEAD_SET_OLUT_CONTROL, _SIZE, NV_LUT_VSS_HEADER_SIZE +
|
||||
@@ -5180,13 +5199,11 @@ static NvBool EvoSetViewportInOut3(NVDevEvoPtr pDevEvo, const int head,
|
||||
const NVHwModeViewPortEvo *pViewPortMin,
|
||||
const NVHwModeViewPortEvo *pViewPort,
|
||||
const NVHwModeViewPortEvo *pViewPortMax,
|
||||
NVEvoUpdateState *updateState,
|
||||
NvU32 setWindowUsageBounds)
|
||||
NVEvoUpdateState *updateState)
|
||||
{
|
||||
const NVEvoCapabilitiesPtr pEvoCaps = &pDevEvo->gpus[0].capabilities;
|
||||
NVEvoChannelPtr pChannel = pDevEvo->core;
|
||||
struct NvKmsScalingUsageBounds scalingUsageBounds = { };
|
||||
NvU32 win;
|
||||
|
||||
/* These methods should only apply to a single pDpy */
|
||||
nvAssert(pDevEvo->subDevMaskStackDepth > 0);
|
||||
@@ -5232,31 +5249,6 @@ static NvBool EvoSetViewportInOut3(NVDevEvoPtr pDevEvo, const int head,
|
||||
DRF_NUM(C37D, _HEAD_SET_MAX_OUTPUT_SCALE_FACTOR, _VERTICAL,
|
||||
scalingUsageBounds.maxVDownscaleFactor));
|
||||
|
||||
/*
|
||||
* Program MAX_PIXELS_FETCHED_PER_LINE window usage bounds
|
||||
* for each window that’s attached to the head.
|
||||
*
|
||||
* Precomp will clip the post-scaled window to the input viewport, reverse-scale
|
||||
* this cropped size back to the input surface domain, and isohub will fetch
|
||||
* this cropped size. This function assumes that there's no window scaling yet,
|
||||
* so the MAX_PIXELS_FETCHED_PER_LINE will be bounded by the input viewport
|
||||
* width. SetScalingUsageBoundsOneWindow5() will take care of updating
|
||||
* MAX_PIXELS_FETCHED_PER_LINE, if window scaling is enabled later.
|
||||
*/
|
||||
setWindowUsageBounds |=
|
||||
DRF_NUM(C37D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _MAX_PIXELS_FETCHED_PER_LINE,
|
||||
GetMaxPixelsFetchedPerLine(pViewPort->in.width,
|
||||
NV_EVO_SCALE_FACTOR_1X));
|
||||
|
||||
for (win = 0; win < pDevEvo->numWindows; win++) {
|
||||
if (head != pDevEvo->headForWindow[win]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
nvDmaSetStartEvoMethod(pChannel, NVC37D_WINDOW_SET_WINDOW_USAGE_BOUNDS(win), 1);
|
||||
nvDmaSetEvoMethodData(pChannel, setWindowUsageBounds);
|
||||
}
|
||||
|
||||
return scalingUsageBounds.vUpscalingAllowed;
|
||||
}
|
||||
|
||||
@@ -5267,10 +5259,11 @@ static void EvoSetViewportInOutC3(NVDevEvoPtr pDevEvo, const int head,
|
||||
NVEvoUpdateState *updateState)
|
||||
{
|
||||
NVEvoChannelPtr pChannel = pDevEvo->core;
|
||||
NvU32 win;
|
||||
NvU32 setWindowUsageBounds = NV_EVO3_DEFAULT_WINDOW_USAGE_BOUNDS_C3;
|
||||
NvBool verticalUpscalingAllowed =
|
||||
EvoSetViewportInOut3(pDevEvo, head, pViewPortMin, pViewPort,
|
||||
pViewPortMax, updateState,
|
||||
NV_EVO3_DEFAULT_WINDOW_USAGE_BOUNDS_C3);
|
||||
pViewPortMax, updateState);
|
||||
|
||||
nvDmaSetStartEvoMethod(pChannel,
|
||||
NVC37D_HEAD_SET_HEAD_USAGE_BOUNDS(head), 1);
|
||||
@@ -5280,6 +5273,34 @@ static void EvoSetViewportInOutC3(NVDevEvoPtr pDevEvo, const int head,
|
||||
(verticalUpscalingAllowed ?
|
||||
DRF_DEF(C37D, _HEAD_SET_HEAD_USAGE_BOUNDS, _UPSCALING_ALLOWED, _TRUE) :
|
||||
DRF_DEF(C37D, _HEAD_SET_HEAD_USAGE_BOUNDS, _UPSCALING_ALLOWED, _FALSE)));
|
||||
/*
|
||||
* Program MAX_PIXELS_FETCHED_PER_LINE window usage bounds
|
||||
* for each window that is attached to the head.
|
||||
*
|
||||
* Precomp will clip the post-scaled window to the input viewport, reverse-scale
|
||||
* this cropped size back to the input surface domain, and isohub will fetch
|
||||
* this cropped size. This function assumes that there's no window scaling yet,
|
||||
* so the MAX_PIXELS_FETCHED_PER_LINE will be bounded by the input viewport
|
||||
* width. SetScalingUsageBoundsOneWindow5() will take care of updating
|
||||
* MAX_PIXELS_FETCHED_PER_LINE, if window scaling is enabled later.
|
||||
* On Volta, Program for each window that is attached to head. For turing+,
|
||||
* SetScalingUsageBoundsOneWindow5() will take care of programming window
|
||||
* usage bounds only for the layers/windows in use.
|
||||
*/
|
||||
|
||||
setWindowUsageBounds |=
|
||||
DRF_NUM(C37D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _MAX_PIXELS_FETCHED_PER_LINE,
|
||||
GetMaxPixelsFetchedPerLine(pViewPort->in.width,
|
||||
NV_EVO_SCALE_FACTOR_1X));
|
||||
|
||||
for (win = 0; win < pDevEvo->numWindows; win++) {
|
||||
if (head != pDevEvo->headForWindow[win]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
nvDmaSetStartEvoMethod(pChannel, NVC37D_WINDOW_SET_WINDOW_USAGE_BOUNDS(win), 1);
|
||||
nvDmaSetEvoMethodData(pChannel, setWindowUsageBounds);
|
||||
}
|
||||
}
|
||||
|
||||
static void EvoSetViewportInOutC5(NVDevEvoPtr pDevEvo, const int head,
|
||||
@@ -5289,13 +5310,9 @@ static void EvoSetViewportInOutC5(NVDevEvoPtr pDevEvo, const int head,
|
||||
NVEvoUpdateState *updateState)
|
||||
{
|
||||
NVEvoChannelPtr pChannel = pDevEvo->core;
|
||||
NvU32 setWindowUsageBounds =
|
||||
(NV_EVO3_DEFAULT_WINDOW_USAGE_BOUNDS_C5 |
|
||||
DRF_DEF(C57D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _INPUT_SCALER_TAPS, _TAPS_2) |
|
||||
DRF_DEF(C57D, _WINDOW_SET_WINDOW_USAGE_BOUNDS, _UPSCALING_ALLOWED, _FALSE));
|
||||
NvU32 verticalUpscalingAllowed =
|
||||
EvoSetViewportInOut3(pDevEvo, head, pViewPortMin, pViewPort,
|
||||
pViewPortMax, updateState, setWindowUsageBounds);
|
||||
pViewPortMax, updateState);
|
||||
|
||||
nvDmaSetStartEvoMethod(pChannel,
|
||||
NVC57D_HEAD_SET_HEAD_USAGE_BOUNDS(head), 1);
|
||||
|
||||
@@ -619,27 +619,33 @@ typedef enum
|
||||
#define NV_GET_NV_STATE(pGpu) \
|
||||
(nv_state_t *)((pGpu) ? (pGpu)->pOsGpuInfo : NULL)
|
||||
|
||||
#define IS_REG_OFFSET(nv, offset, length) \
|
||||
(((offset) >= (nv)->regs->cpu_address) && \
|
||||
(((offset) + ((length)-1)) <= \
|
||||
(nv)->regs->cpu_address + ((nv)->regs->size-1)))
|
||||
static inline NvBool IS_REG_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
|
||||
{
|
||||
return ((offset >= nv->regs->cpu_address) &&
|
||||
((offset + (length - 1)) <= (nv->regs->cpu_address + (nv->regs->size - 1))));
|
||||
}
|
||||
|
||||
#define IS_FB_OFFSET(nv, offset, length) \
|
||||
(((nv)->fb) && ((offset) >= (nv)->fb->cpu_address) && \
|
||||
(((offset) + ((length)-1)) <= (nv)->fb->cpu_address + ((nv)->fb->size-1)))
|
||||
static inline NvBool IS_FB_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
|
||||
{
|
||||
return ((nv->fb) && (offset >= nv->fb->cpu_address) &&
|
||||
((offset + (length - 1)) <= (nv->fb->cpu_address + (nv->fb->size - 1))));
|
||||
}
|
||||
|
||||
#define IS_UD_OFFSET(nv, offset, length) \
|
||||
(((nv)->ud.cpu_address != 0) && ((nv)->ud.size != 0) && \
|
||||
((offset) >= (nv)->ud.cpu_address) && \
|
||||
(((offset) + ((length)-1)) <= (nv)->ud.cpu_address + ((nv)->ud.size-1)))
|
||||
static inline NvBool IS_UD_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
|
||||
{
|
||||
return ((nv->ud.cpu_address != 0) && (nv->ud.size != 0) &&
|
||||
(offset >= nv->ud.cpu_address) &&
|
||||
((offset + (length - 1)) <= (nv->ud.cpu_address + (nv->ud.size - 1))));
|
||||
}
|
||||
|
||||
#define IS_IMEM_OFFSET(nv, offset, length) \
|
||||
(((nv)->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address != 0) && \
|
||||
((nv)->bars[NV_GPU_BAR_INDEX_IMEM].size != 0) && \
|
||||
((offset) >= (nv)->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address) && \
|
||||
(((offset) + ((length) - 1)) <= \
|
||||
(nv)->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address + \
|
||||
((nv)->bars[NV_GPU_BAR_INDEX_IMEM].size - 1)))
|
||||
static inline NvBool IS_IMEM_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
|
||||
{
|
||||
return ((nv->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address != 0) &&
|
||||
(nv->bars[NV_GPU_BAR_INDEX_IMEM].size != 0) &&
|
||||
(offset >= nv->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address) &&
|
||||
((offset + (length - 1)) <= (nv->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address +
|
||||
(nv->bars[NV_GPU_BAR_INDEX_IMEM].size - 1))));
|
||||
}
|
||||
|
||||
#define NV_RM_MAX_MSIX_LINES 8
|
||||
|
||||
|
||||
@@ -780,10 +780,8 @@ static NV_STATUS RmAccessRegistry(
|
||||
RmStatus = NV_ERR_INVALID_STRING_LENGTH;
|
||||
goto done;
|
||||
}
|
||||
|
||||
// get access to client's parmStr
|
||||
RMAPI_PARAM_COPY_INIT(parmStrParamCopy, tmpParmStr, clientParmStrAddress, ParmStrLength, 1);
|
||||
parmStrParamCopy.flags |= RMAPI_PARAM_COPY_FLAGS_ZERO_BUFFER;
|
||||
RmStatus = rmapiParamsAcquire(&parmStrParamCopy, NV_TRUE);
|
||||
if (RmStatus != NV_OK)
|
||||
{
|
||||
@@ -2026,6 +2024,7 @@ static NV_STATUS RmGetAllocPrivate(
|
||||
PMEMORY_DESCRIPTOR pMemDesc;
|
||||
NvU32 pageOffset;
|
||||
NvU64 pageCount;
|
||||
NvU64 endingOffset;
|
||||
RsResourceRef *pResourceRef;
|
||||
RmResource *pRmResource;
|
||||
void *pMemData;
|
||||
@@ -2086,8 +2085,9 @@ static NV_STATUS RmGetAllocPrivate(
|
||||
if (rmStatus != NV_OK)
|
||||
goto done;
|
||||
|
||||
pageCount = ((pageOffset + length) / os_page_size);
|
||||
pageCount += (*pPageIndex + (((pageOffset + length) % os_page_size) ? 1 : 0));
|
||||
endingOffset = pageOffset + length;
|
||||
pageCount = (endingOffset / os_page_size);
|
||||
pageCount += (*pPageIndex + ((endingOffset % os_page_size) ? 1 : 0));
|
||||
|
||||
if (pageCount > NV_RM_PAGES_TO_OS_PAGES(pMemDesc->PageCount))
|
||||
{
|
||||
|
||||
@@ -362,10 +362,6 @@ osHandleGpuLost
|
||||
pmc_boot_0 = NV_PRIV_REG_RD32(nv->regs->map_u, NV_PMC_BOOT_0);
|
||||
if (pmc_boot_0 != nvp->pmc_boot_0)
|
||||
{
|
||||
RM_API *pRmApi = rmapiGetInterface(RMAPI_GPU_LOCK_INTERNAL);
|
||||
NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS *pBoardInfoParams;
|
||||
NV_STATUS status;
|
||||
|
||||
//
|
||||
// This doesn't support PEX Reset and Recovery yet.
|
||||
// This will help to prevent accessing registers of a GPU
|
||||
@@ -376,24 +372,11 @@ osHandleGpuLost
|
||||
|
||||
NV_DEV_PRINTF(NV_DBG_ERRORS, nv, "GPU has fallen off the bus.\n");
|
||||
|
||||
pBoardInfoParams = portMemAllocNonPaged(sizeof(*pBoardInfoParams));
|
||||
if (pBoardInfoParams != NULL)
|
||||
if (pGpu->boardInfo != NULL && pGpu->boardInfo->serialNumber[0] != '\0')
|
||||
{
|
||||
portMemSet(pBoardInfoParams, 0, sizeof(*pBoardInfoParams));
|
||||
|
||||
status = pRmApi->Control(pRmApi, nv->rmapi.hClient,
|
||||
nv->rmapi.hSubDevice,
|
||||
NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO,
|
||||
pBoardInfoParams,
|
||||
sizeof(*pBoardInfoParams));
|
||||
if (status == NV_OK)
|
||||
{
|
||||
NV_DEV_PRINTF(NV_DBG_ERRORS, nv,
|
||||
"GPU serial number is %s.\n",
|
||||
pBoardInfoParams->serialNumber);
|
||||
}
|
||||
|
||||
portMemFree(pBoardInfoParams);
|
||||
NV_DEV_PRINTF(NV_DBG_ERRORS, nv,
|
||||
"GPU serial number is %s.\n",
|
||||
pGpu->boardInfo->serialNumber);
|
||||
}
|
||||
|
||||
gpuSetDisconnectedProperties(pGpu);
|
||||
|
||||
@@ -60,6 +60,7 @@ typedef struct GPUATTACHARG GPUATTACHARG;
|
||||
* */
|
||||
#include "ctrl/ctrl0080/ctrl0080gpu.h" // NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS (form hal)
|
||||
#include "ctrl/ctrl2080/ctrl2080internal.h" // NV2080_CTRL_CMD_INTERNAL_MAX_BSPS/NVENCS
|
||||
#include "ctrl/ctrl2080/ctrl2080ecc.h"
|
||||
#include "ctrl/ctrl2080/ctrl2080nvd.h"
|
||||
#include "class/cl2080.h"
|
||||
#include "class/cl90cd.h"
|
||||
|
||||
@@ -301,6 +301,7 @@ struct KernelGsp {
|
||||
LIBOS_LOG_DECODE logDecode;
|
||||
RM_LIBOS_LOG_MEM rmLibosLogMem[2];
|
||||
void *pLogElf;
|
||||
NvBool bInInit;
|
||||
MEMORY_DESCRIPTOR *pMemDesc_simAccessBuf;
|
||||
SimAccessBuffer *pSimAccessBuf;
|
||||
NvP64 pSimAccessBufPriv;
|
||||
|
||||
@@ -806,6 +806,8 @@ static const CHIPS_RELEASED sChipsReleased[] = {
|
||||
{ 0x20B0, 0x1450, 0x10de, "NVIDIA A100-PG509-200" },
|
||||
{ 0x20B2, 0x1463, 0x10de, "NVIDIA A100-SXM4-80GB" },
|
||||
{ 0x20B2, 0x147f, 0x10de, "NVIDIA A100-SXM4-80GB" },
|
||||
{ 0x20B2, 0x1622, 0x10de, "NVIDIA A100-SXM4-80GB" },
|
||||
{ 0x20B2, 0x1623, 0x10de, "NVIDIA A100-SXM4-80GB" },
|
||||
{ 0x20B3, 0x14a7, 0x10de, "NVIDIA PG506-242" },
|
||||
{ 0x20B3, 0x14a8, 0x10de, "NVIDIA PG506-243" },
|
||||
{ 0x20B5, 0x1533, 0x10de, "NVIDIA A100 80GB PCIe" },
|
||||
@@ -907,6 +909,7 @@ static const CHIPS_RELEASED sChipsReleased[] = {
|
||||
{ 0x2507, 0x0000, 0x0000, "NVIDIA GeForce RTX 3050" },
|
||||
{ 0x2508, 0x0000, 0x0000, "NVIDIA GeForce RTX 3050 OEM" },
|
||||
{ 0x2520, 0x0000, 0x0000, "NVIDIA GeForce RTX 3060 Laptop GPU" },
|
||||
{ 0x2521, 0x0000, 0x0000, "NVIDIA GeForce RTX 3060 Laptop GPU" },
|
||||
{ 0x2523, 0x0000, 0x0000, "NVIDIA GeForce RTX 3050 Ti Laptop GPU" },
|
||||
{ 0x2531, 0x151d, 0x1028, "NVIDIA RTX A2000" },
|
||||
{ 0x2531, 0x151d, 0x103c, "NVIDIA RTX A2000" },
|
||||
|
||||
@@ -86,8 +86,9 @@ NV_STATUS nvlogAllocBuffer(NvU32 size, NvU32 flags, NvU32 tag, NVLOG_BUFFER_HAND
|
||||
* @brief Deallocate a buffer with the given handle
|
||||
*
|
||||
* @param[in] hBuffer Handle of the buffer to deallocate
|
||||
* @param[in] bDeallocPreserved Deallocate preserved buffers
|
||||
*/
|
||||
void nvlogDeallocBuffer(NVLOG_BUFFER_HANDLE hBuffer);
|
||||
void nvlogDeallocBuffer(NVLOG_BUFFER_HANDLE hBuffer, NvBool bDeallocPreserved);
|
||||
|
||||
/**
|
||||
* @brief Write to a buffer with the given handle
|
||||
|
||||
@@ -265,8 +265,11 @@ static NV_STATUS _issueRpcLarge
|
||||
// should not be called in broadcast mode
|
||||
NV_ASSERT_OR_RETURN(!gpumgrGetBcEnabledStatus(pGpu), NV_ERR_INVALID_STATE);
|
||||
|
||||
//
|
||||
// Copy the initial buffer
|
||||
entryLength = NV_MIN(bufSize, pRpc->maxRpcSize);
|
||||
// Temporary black magic WAR for bug 3594082: reducing the size by 1
|
||||
//
|
||||
entryLength = NV_MIN(bufSize, pRpc->maxRpcSize - 1);
|
||||
|
||||
if ((NvU8 *)vgpu_rpc_message_header_v != pBuf8)
|
||||
portMemCopy(vgpu_rpc_message_header_v, entryLength, pBuf8, entryLength);
|
||||
@@ -291,8 +294,11 @@ static NV_STATUS _issueRpcLarge
|
||||
remainingSize -= entryLength;
|
||||
pBuf8 += entryLength;
|
||||
|
||||
//
|
||||
// Copy the remaining buffers
|
||||
entryLength = pRpc->maxRpcSize - sizeof(rpc_message_header_v);
|
||||
// Temporary black magic WAR for bug 3594082: reducing the size by 1
|
||||
//
|
||||
entryLength = pRpc->maxRpcSize - sizeof(rpc_message_header_v) - 1;
|
||||
while (remainingSize != 0)
|
||||
{
|
||||
if (entryLength > remainingSize)
|
||||
|
||||
@@ -103,7 +103,7 @@ nvlogDestroy()
|
||||
tlsShutdown();
|
||||
for (i = 0; i < NVLOG_MAX_BUFFERS; i++)
|
||||
{
|
||||
nvlogDeallocBuffer(i);
|
||||
nvlogDeallocBuffer(i, NV_TRUE);
|
||||
}
|
||||
if (NvLogLogger.mainLock != NULL)
|
||||
{
|
||||
@@ -261,7 +261,8 @@ nvlogAllocBuffer
|
||||
void
|
||||
nvlogDeallocBuffer
|
||||
(
|
||||
NVLOG_BUFFER_HANDLE hBuffer
|
||||
NVLOG_BUFFER_HANDLE hBuffer,
|
||||
NvBool bDeallocPreserved
|
||||
)
|
||||
{
|
||||
NVLOG_BUFFER *pBuffer;
|
||||
@@ -271,6 +272,12 @@ nvlogDeallocBuffer
|
||||
|
||||
pBuffer = NvLogLogger.pBuffers[hBuffer];
|
||||
|
||||
if (FLD_TEST_DRF(LOG_BUFFER, _FLAGS, _PRESERVE, _YES, pBuffer->flags) &&
|
||||
!bDeallocPreserved)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pBuffer->flags = FLD_SET_DRF(LOG_BUFFER, _FLAGS, _DISABLED,
|
||||
_YES, pBuffer->flags);
|
||||
|
||||
|
||||
@@ -2502,15 +2502,19 @@ kbusFlushSingle_GM107
|
||||
if (IS_GSP_CLIENT(pGpu))
|
||||
{
|
||||
//
|
||||
// on GSP client, we only support PCIE_READ to do flush
|
||||
// a sysmembar flush should call kbusSendSysmembarSingle_HAL explicitly
|
||||
// on GSP client, we should use PCIE_READ to do video memory flush.
|
||||
// A sysmembar flush that touches registers is done through RPC and has
|
||||
// lower effeciency. For cases where it needs sysmembar, the caller site
|
||||
// should use kbusSendSysmembarSingle_HAL explicitly.
|
||||
//
|
||||
NV_ASSERT_OR_RETURN(0, NV_ERR_INVALID_PATH);
|
||||
}
|
||||
else
|
||||
{
|
||||
return kbusSendSysmembarSingle_HAL(pGpu, pKernelBus);
|
||||
NV_ASSERT(0);
|
||||
|
||||
// This will dump a stack trace to assist debug on certain
|
||||
// platforms.
|
||||
osAssertFailed();
|
||||
}
|
||||
|
||||
return kbusSendSysmembarSingle_HAL(pGpu, pKernelBus);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3750,6 +3750,7 @@ kchannelUpdateWorkSubmitTokenNotifIndex_IMPL
|
||||
Memory *pMemory;
|
||||
ContextDma *pContextDma;
|
||||
NvU32 addressSpace;
|
||||
NvU64 notificationBufferSize;
|
||||
NV_STATUS status;
|
||||
|
||||
hNotifier = pKernelChannel->hErrorContext;
|
||||
@@ -3758,6 +3759,8 @@ kchannelUpdateWorkSubmitTokenNotifIndex_IMPL
|
||||
NV_CHECK_OR_RETURN(LEVEL_INFO, index != NV_CHANNELGPFIFO_NOTIFICATION_TYPE_ERROR,
|
||||
NV_ERR_INVALID_ARGUMENT);
|
||||
|
||||
notificationBufferSize = (index + 1) * sizeof(NvNotification);
|
||||
|
||||
status = deviceGetByInstance(pClient, gpuGetDeviceInstance(pGpu), &pDevice);
|
||||
if (status != NV_OK)
|
||||
return NV_ERR_INVALID_DEVICE;
|
||||
@@ -3766,7 +3769,7 @@ kchannelUpdateWorkSubmitTokenNotifIndex_IMPL
|
||||
{
|
||||
addressSpace = memdescGetAddressSpace(pMemory->pMemDesc);
|
||||
|
||||
NV_CHECK_OR_RETURN(LEVEL_INFO, pMemory->Length >= ((index + 1) * sizeof(NvNotification)),
|
||||
NV_CHECK_OR_RETURN(LEVEL_INFO, pMemory->Length >= notificationBufferSize,
|
||||
NV_ERR_OUT_OF_RANGE);
|
||||
switch (addressSpace)
|
||||
{
|
||||
@@ -3784,7 +3787,7 @@ kchannelUpdateWorkSubmitTokenNotifIndex_IMPL
|
||||
&pDmaMappingInfo),
|
||||
NV_ERR_GENERIC);
|
||||
|
||||
NV_CHECK_OR_RETURN(LEVEL_INFO, pDmaMappingInfo->pMemDesc->Size >= ((index + 1) * sizeof(NvNotification)),
|
||||
NV_CHECK_OR_RETURN(LEVEL_INFO, pDmaMappingInfo->pMemDesc->Size >= notificationBufferSize,
|
||||
NV_ERR_OUT_OF_RANGE);
|
||||
break;
|
||||
}
|
||||
@@ -3799,7 +3802,7 @@ kchannelUpdateWorkSubmitTokenNotifIndex_IMPL
|
||||
}
|
||||
else if (NV_OK == ctxdmaGetByHandle(pClient, hNotifier, &pContextDma))
|
||||
{
|
||||
NV_CHECK_OR_RETURN(LEVEL_INFO, pContextDma->Limit >= (((index + 1) * sizeof(NvNotification)) - 1),
|
||||
NV_CHECK_OR_RETURN(LEVEL_INFO, pContextDma->Limit >= (notificationBufferSize - 1),
|
||||
NV_ERR_OUT_OF_RANGE);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -1923,26 +1923,6 @@ gpuStatePreInit_IMPL
|
||||
}
|
||||
}
|
||||
|
||||
pGpu->boardInfo = portMemAllocNonPaged(sizeof(*pGpu->boardInfo));
|
||||
if (pGpu->boardInfo)
|
||||
{
|
||||
// To avoid potential race of xid reporting with the control, zero it out
|
||||
portMemSet(pGpu->boardInfo, '\0', sizeof(*pGpu->boardInfo));
|
||||
|
||||
RM_API *pRmApi = GPU_GET_PHYSICAL_RMAPI(pGpu);
|
||||
|
||||
if (pRmApi->Control(pRmApi,
|
||||
pGpu->hInternalClient,
|
||||
pGpu->hInternalSubdevice,
|
||||
NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO,
|
||||
pGpu->boardInfo,
|
||||
sizeof(*pGpu->boardInfo)) != NV_OK)
|
||||
{
|
||||
portMemFree(pGpu->boardInfo);
|
||||
pGpu->boardInfo = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return rmStatus;
|
||||
}
|
||||
|
||||
@@ -2291,6 +2271,26 @@ gpuStatePostLoad
|
||||
goto gpuStatePostLoad_exit;
|
||||
}
|
||||
|
||||
pGpu->boardInfo = portMemAllocNonPaged(sizeof(*pGpu->boardInfo));
|
||||
if (pGpu->boardInfo)
|
||||
{
|
||||
// To avoid potential race of xid reporting with the control, zero it out
|
||||
portMemSet(pGpu->boardInfo, '\0', sizeof(*pGpu->boardInfo));
|
||||
|
||||
RM_API *pRmApi = GPU_GET_PHYSICAL_RMAPI(pGpu);
|
||||
|
||||
if(pRmApi->Control(pRmApi,
|
||||
pGpu->hInternalClient,
|
||||
pGpu->hInternalSubdevice,
|
||||
NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO,
|
||||
pGpu->boardInfo,
|
||||
sizeof(*pGpu->boardInfo)) != NV_OK)
|
||||
{
|
||||
portMemFree(pGpu->boardInfo);
|
||||
pGpu->boardInfo = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
gpuStatePostLoad_exit:
|
||||
return rmStatus;
|
||||
}
|
||||
@@ -2326,6 +2326,9 @@ gpuStatePreUnload
|
||||
NvU32 curEngDescIdx;
|
||||
NV_STATUS rmStatus = NV_OK;
|
||||
|
||||
portMemFree(pGpu->boardInfo);
|
||||
pGpu->boardInfo = NULL;
|
||||
|
||||
engDescriptorList = gpuGetUnloadEngineDescriptors(pGpu);
|
||||
numEngDescriptors = gpuGetNumEngDescriptors(pGpu);
|
||||
|
||||
@@ -2648,9 +2651,6 @@ gpuStateDestroy_IMPL
|
||||
_gpuFreeInternalObjects(pGpu);
|
||||
gpuDestroyGenericKernelFalconList(pGpu);
|
||||
|
||||
portMemFree(pGpu->boardInfo);
|
||||
pGpu->boardInfo = NULL;
|
||||
|
||||
portMemFree(pGpu->gspSupportedEngines);
|
||||
pGpu->gspSupportedEngines = NULL;
|
||||
|
||||
|
||||
@@ -1047,7 +1047,7 @@ _kgspInitLibosLoggingStructures
|
||||
|
||||
//
|
||||
// Setup logging memory for each task.
|
||||
// Use MEMDESC_FLAGS_CPU_ONLY -- to early to call memdescMapIommu.
|
||||
// Use MEMDESC_FLAGS_CPU_ONLY -- too early to call memdescMapIommu.
|
||||
//
|
||||
NV_ASSERT_OK_OR_GOTO(nvStatus,
|
||||
memdescCreate(&pLog->pTaskLogDescriptor,
|
||||
@@ -1258,6 +1258,8 @@ kgspInitRm_IMPL
|
||||
return NV_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
pKernelGsp->bInInit = NV_TRUE;
|
||||
|
||||
// Need to hold the GPU instance lock in order to write to the RPC queue
|
||||
NV_ASSERT_OK_OR_GOTO(status,
|
||||
rmGpuGroupLockAcquire(pGpu->gpuInstance, GPU_LOCK_GRP_SUBDEVICE,
|
||||
@@ -1278,7 +1280,7 @@ kgspInitRm_IMPL
|
||||
{
|
||||
KernelGspVbiosImg *pVbiosImg = NULL;
|
||||
|
||||
// Try and extract a VBIOS image.
|
||||
// Try and extract a VBIOS image.
|
||||
status = kgspExtractVbiosFromRom_HAL(pGpu, pKernelGsp, &pVbiosImg);
|
||||
|
||||
if (status == NV_OK)
|
||||
@@ -1403,6 +1405,14 @@ kgspInitRm_IMPL
|
||||
NV_CHECK_OK_OR_GOTO(status, LEVEL_ERROR, kgspStartLogPolling(pGpu, pKernelGsp), done);
|
||||
|
||||
done:
|
||||
pKernelGsp->bInInit = NV_FALSE;
|
||||
|
||||
if (status != NV_OK)
|
||||
{
|
||||
// Preserve any captured gsp-rm logs
|
||||
libosPreserveLogs(&pKernelGsp->logDecode);
|
||||
}
|
||||
|
||||
if (gpusLockedMask != 0)
|
||||
{
|
||||
rmGpuGroupLockRelease(gpusLockedMask, GPUS_LOCK_FLAGS_NONE);
|
||||
@@ -1520,7 +1530,7 @@ kgspDumpGspLogs_IMPL
|
||||
NvBool bSyncNvLog
|
||||
)
|
||||
{
|
||||
if (pKernelGsp->pLogElf || bSyncNvLog)
|
||||
if (pKernelGsp->bInInit || pKernelGsp->pLogElf || bSyncNvLog)
|
||||
libosExtractLogs(&pKernelGsp->logDecode, bSyncNvLog);
|
||||
}
|
||||
|
||||
|
||||
@@ -1959,6 +1959,7 @@ memmgrFillComprInfo_IMPL
|
||||
{
|
||||
const MEMORY_SYSTEM_STATIC_CONFIG *pMemorySystemConfig =
|
||||
kmemsysGetStaticConfig(pGpu, GPU_GET_KERNEL_MEMORY_SYSTEM(pGpu));
|
||||
NvU32 size;
|
||||
|
||||
portMemSet(pComprInfo, 0, sizeof(*pComprInfo));
|
||||
|
||||
@@ -1969,10 +1970,12 @@ memmgrFillComprInfo_IMPL
|
||||
|
||||
NV_ASSERT(compTagStartOffset != ~(NvU32)0);
|
||||
|
||||
size = pageSize * pageCount;
|
||||
|
||||
pComprInfo->compPageShift = pMemorySystemConfig->comprPageShift;
|
||||
pComprInfo->compTagLineMin = compTagStartOffset;
|
||||
pComprInfo->compPageIndexLo = (NvU32)(surfOffset >> pComprInfo->compPageShift);
|
||||
pComprInfo->compPageIndexHi = (NvU32)((surfOffset + pageSize * pageCount - 1) >> pComprInfo->compPageShift);
|
||||
pComprInfo->compPageIndexHi = (NvU32)((surfOffset + size - 1) >> pComprInfo->compPageShift);
|
||||
pComprInfo->compTagLineMultiplier = 1;
|
||||
|
||||
return NV_OK;
|
||||
|
||||
@@ -751,6 +751,8 @@ NvBool gpumgrIsDeviceRmFirmwareCapable
|
||||
0x2236, // A10 SKU215 Pris-24
|
||||
0x2237, // A10G SKU215 Pris-24
|
||||
0x25B6, // A16
|
||||
0x20F5, // A800-80
|
||||
0x20F6, // A800-40
|
||||
};
|
||||
NvU32 count = NV_ARRAY_ELEMENTS(defaultGspRmGpus);
|
||||
NvU32 i;
|
||||
|
||||
Reference in New Issue
Block a user