515.65.01

This commit is contained in:
Andy Ritger
2022-08-02 08:35:13 -07:00
parent 1e2a1b5fbe
commit 9855350159
35 changed files with 382 additions and 263 deletions

View File

@@ -122,6 +122,8 @@ namespace DisplayPort
ConnectorType connectorType;
Address address;
GUID guid;
GUID guid2;
bool bVirtualPeerDevice;
NvU8 peerDevice;
NvU8 dpcdRevisionMajor;
NvU8 dpcdRevisionMinor;
@@ -357,6 +359,29 @@ namespace DisplayPort
return hal->setIgnoreMSATimingParamters(msaTimingParamIgnoreEn);
}
bool isVirtualPeerDevice()
{
return bVirtualPeerDevice;
}
bool isBranchDevice()
{
return !isVideoSink() && !isAudioSink();
}
bool isAtLeastVersion(unsigned major, unsigned minor)
{
if (dpcdRevisionMajor > major)
return true;
if (dpcdRevisionMajor < major)
return false;
return dpcdRevisionMinor >= minor;
}
virtual void queryGUID2();
virtual bool getSDPExtnForColorimetrySupported();
virtual bool isPowerSuspended();
@@ -447,6 +472,7 @@ namespace DisplayPort
unsigned getDscPeakThroughputModel();
unsigned getDscMaxSliceWidth();
unsigned getDscDecoderColorDepthSupportMask();
void setDscDecompressionDevice(bool bDscCapBasedOnParent);
};
class DeviceHDCPDetection : public Object, MessageManager::Message::MessageEventSink, Timer::TimerCallback
{

View File

@@ -624,132 +624,36 @@ create:
if (existingDev && existingDev->complianceDeviceEdidReadTest)
existingDev->lazyExitNow = true;
if(newDev->isBranchDevice() && newDev->isAtLeastVersion(1,4))
{
//
// GUID_2 will be non-zero for a virtual peer device and 0 for others.
// This will help identify if a device is virtual peer device or not.
//
newDev->queryGUID2();
}
// Read panel DSC support only if GPU supports DSC
bool bGpuDscSupported;
main->getDscCaps(&bGpuDscSupported);
if (bGpuDscSupported && newDev->getDSCSupport())
if (bGpuDscSupported)
{
// Read and parse DSC caps only if panel supports DSC
newDev->readAndParseDSCCaps();
// Read and Parse Branch Specific DSC Caps
if (!newDev->isVideoSink() && !newDev->isAudioSink())
if (newDev->getDSCSupport())
{
newDev->readAndParseBranchSpecificDSCCaps();
}
}
// Read and parse DSC caps only if panel supports DSC
newDev->readAndParseDSCCaps();
// Decide if DSC stream can be sent to new device
newDev->bDSCPossible = false;
newDev->devDoingDscDecompression = NULL;
if (bGpuDscSupported && !processedEdid.WARFlags.bIgnoreDscCap)
{
if (newDev->multistream)
{
if ((newDev->peerDevice == Dongle) &&
(newDev->dpcdRevisionMajor != 0) &&
!bDscCapBasedOnParent)
// Read and Parse Branch Specific DSC Caps
if (!newDev->isVideoSink() && !newDev->isAudioSink())
{
// For Peer Type 4 device with LAM DPCD rev != 0.0, check only the device's own DSC capability.
if (newDev->isDSCSupported())
{
newDev->bDSCPossible = true;
newDev->devDoingDscDecompression = newDev;
}
}
else
{
if (this->bDscMstEnablePassThrough)
{
//
// Check the device's own and its parent's DSC capability.
// - Sink device will do DSC cecompression when
// 1. Sink device is capable of DSC decompression and parent
// supports DSC pass through.
//
// - Sink device's parent will do DSC decompression
// 1. If sink device supports DSC decompression but it's parent does not support
// DSC Pass through, but supports DSC decompression.
// 2. If the device does not support DSC decompression, but parent supports it.
//
if (newDev->isDSCSupported())
{
if (newDev->videoSink && newDev->parent)
{
if (newDev->parent->isDSCPassThroughSupported())
{
//
// This condition takes care of DSC capable sink devices
// connected behind a DSC Pass through capable branch
//
newDev->devDoingDscDecompression = newDev;
newDev->bDSCPossible = true;
}
else if (newDev->parent->isDSCSupported())
{
//
// This condition takes care of DSC capable sink devices
// connected behind a branch device that is not capable
// of DSC pass through but can do DSC decompression.
//
newDev->bDSCPossible = true;
newDev->devDoingDscDecompression = newDev->parent;
}
}
else
{
// This condition takes care of branch device capable of DSC.
newDev->devDoingDscDecompression = newDev;
newDev->bDSCPossible = true;
}
}
else if (newDev->parent && newDev->parent->isDSCSupported())
{
//
// This condition takes care of sink devices not capable of DSC
// but parent is capable of DSC decompression.
//
newDev->bDSCPossible = true;
newDev->devDoingDscDecompression = newDev->parent;
}
}
else
{
//
// Revert to old code if DSC Pass through support is not requested.
// This code will be deleted once DSC Pass through support will be enabled
// by default which will be done when 2Head1OR MST (GR-133) will be in production.
//
// Check the device's own and its parent's DSC capability. Parent of the device can do
// DSC decompression and send uncompressed stream to downstream device
//
if (newDev->isDSCSupported() || (newDev->parent && newDev->parent->isDSCSupported()))
{
newDev->bDSCPossible = true;
}
// For multistream device, determine who will do the DSC decompression
if (newDev->bDSCPossible)
{
if(!newDev->isDSCSupported())
{
newDev->devDoingDscDecompression = newDev->parent;
}
else
{
newDev->devDoingDscDecompression = newDev;
}
}
}
newDev->readAndParseBranchSpecificDSCCaps();
}
}
else
if (!processedEdid.WARFlags.bIgnoreDscCap)
{
if (newDev->isDSCSupported())
{
newDev->bDSCPossible = true;
newDev->devDoingDscDecompression = newDev;
}
// Check if DSC is possible for the device and if so, set DSC Decompression device.
newDev->setDscDecompressionDevice(this->bDscCapBasedOnParent);
}
}
@@ -1953,8 +1857,9 @@ void ConnectorImpl::fireEvents()
void ConnectorImpl::fireEventsInternal()
{
ListElement * next;
Address::StringBuffer sb;
Address::StringBuffer sb, sb1;
DP_USED(sb);
DP_USED(sb1);
for (ListElement * e = deviceList.begin(); e != deviceList.end(); e = next)
{
next = e->next;
@@ -2096,7 +2001,7 @@ void ConnectorImpl::fireEventsInternal()
DP_LOG(("DPCONN> New device %s | Native DSC Capability - %s | DSC Decompression Device - %s",
dev->address.toString(sb),
(dev->isDSCSupported() ? "Capable" : "Not Capable"),
(dev->devDoingDscDecompression) ? dev->devDoingDscDecompression->address.toString(sb):"NA"));
(dev->devDoingDscDecompression) ? dev->devDoingDscDecompression->address.toString(sb1):"NA"));
}
else
{

View File

@@ -81,6 +81,7 @@ DeviceImpl::DeviceImpl(DPCDHAL * hal, ConnectorImpl * connector, DeviceImpl * pa
activeGroup(0),
connector(connector),
address(),
bVirtualPeerDevice(false),
plugged(false),
friendlyAux(this),
isHDCPCap(False),
@@ -1445,6 +1446,8 @@ NvBool DeviceImpl::getDSCSupport()
NvU8 byte = 0;
unsigned size = 0;
unsigned nakReason = NakUndefined;
Address::StringBuffer sb;
DP_USED(sb);
dscCaps.bDSCSupported = false;
@@ -1462,6 +1465,11 @@ NvBool DeviceImpl::getDSCSupport()
}
}
else
{
DP_LOG(("DP-DEV> DSC Support AUX READ failed for %s!", address.toString(sb)));
}
return dscCaps.bDSCSupported;
}
@@ -1737,16 +1745,40 @@ bool DeviceImpl::readAndParseDSCCaps()
unsigned sizeCompleted = 0;
unsigned nakReason = NakUndefined;
Address::StringBuffer sb;
DP_USED(sb);
if(AuxBus::success != this->getDpcdData(NV_DPCD14_DSC_SUPPORT,
&rawDscCaps[0], sizeof(rawDscCaps), &sizeCompleted, &nakReason))
{
DP_LOG(("DP-DEV> Error querying DSC Caps on %s!", this->address.toString(sb)));
return false;
}
return parseDscCaps(&rawDscCaps[0], sizeof(rawDscCaps));
}
void DeviceImpl::queryGUID2()
{
unsigned sizeCompleted = 0;
unsigned nakReason = NakUndefined;
Address::StringBuffer sb;
DP_USED(sb);
if(AuxBus::success == this->getDpcdData(NV_DPCD20_GUID_2,
&this->guid2.data[0], DPCD_GUID_SIZE, &sizeCompleted, &nakReason))
{
if (!(this->guid2.isGuidZero()))
{
this->bVirtualPeerDevice = true;
}
}
else
{
DP_LOG(("DP-DEV> Error querying GUID2 on %s!", this->address.toString(sb)));
}
}
bool DeviceImpl::readAndParseBranchSpecificDSCCaps()
{
unsigned sizeCompleted = 0;
@@ -1785,7 +1817,7 @@ bool DeviceImpl::getDscEnable(bool *pEnable)
if (status != AuxBus::success)
{
DP_LOG(("DP> Error querying DSC Enable State!"));
DP_LOG(("DP-DEV> Error querying DSC Enable State!"));
return false;
}
@@ -1793,13 +1825,110 @@ bool DeviceImpl::getDscEnable(bool *pEnable)
return true;
}
void DeviceImpl::setDscDecompressionDevice(bool bDscCapBasedOnParent)
{
// Decide if DSC stream can be sent to new device
this->bDSCPossible = false;
this->devDoingDscDecompression = NULL;
if (this->multistream)
{
if ((this->peerDevice == Dongle) &&
(this->dpcdRevisionMajor != 0) &&
!bDscCapBasedOnParent)
{
// For Peer Type 4 device with LAM DPCD rev != 0.0, check only the device's own DSC capability.
if (this->isDSCSupported())
{
this->bDSCPossible = true;
this->devDoingDscDecompression = this;
}
}
else
{
//
// Check the device's own and its parent's DSC capability.
// - Sink device will do DSC cecompression when
// 1. Sink device is capable of DSC decompression
// 2. Sink is on a logical port (8-15)
//
// OR
//
// 1. Sink device is capable of DSC decompression
// 2. Parent of sink is a Virtual Peer device
// 3. Parent of sink supports DSC Pass through
//
// - Sink device's parent will do DSC decompression
// 1. Above conditions are not true.
// 2. Parent of sink supports DSC decompression.
//
if (this->isDSCSupported())
{
if (this->isVideoSink() && this->getParent() != NULL)
{
if (this->isLogical())
{
this->devDoingDscDecompression = this;
this->bDSCPossible = true;
}
else if (this->parent->isVirtualPeerDevice() &&
this->parent->isDSCPassThroughSupported())
{
//
// This condition takes care of DSC capable sink devices
// connected behind a DSC Pass through capable branch
//
this->devDoingDscDecompression = this;
this->bDSCPossible = true;
}
else if (this->parent->isDSCSupported())
{
//
// This condition takes care of DSC capable sink devices
// connected behind a branch device that is not capable
// of DSC pass through but can do DSC decompression.
//
this->bDSCPossible = true;
this->devDoingDscDecompression = this->parent;
}
}
else
{
// This condition takes care of branch device capable of DSC.
this->devDoingDscDecompression = this;
this->bDSCPossible = true;
}
}
else if (this->parent && this->parent->isDSCSupported())
{
//
// This condition takes care of sink devices not capable of DSC
// but parent is capable of DSC decompression.
//
this->bDSCPossible = true;
this->devDoingDscDecompression = this->parent;
}
}
}
else
{
if (this->isDSCSupported())
{
this->bDSCPossible = true;
this->devDoingDscDecompression = this;
}
}
}
bool DeviceImpl::setDscEnable(bool enable)
{
NvU8 byte = 0;
NvU8 dscEnableByte = 0;
NvU8 dscPassthroughByte = 0;
unsigned size = 0;
unsigned nakReason = NakUndefined;
bool bCurrDscEnable = false;
bool bDscPassThrough = false;
bool bDscPassThroughUpdated = true;
Address::StringBuffer buffer;
DP_USED(buffer);
@@ -1809,12 +1938,13 @@ bool DeviceImpl::setDscEnable(bool enable)
return false;
}
if ((this->devDoingDscDecompression == this) && this->parent != NULL && this->connector->bDscMstEnablePassThrough)
if ((this->devDoingDscDecompression == this) && !this->isLogical() && this->parent != NULL && this->connector->bDscMstEnablePassThrough)
{
//
// If the device has a parent, that means the sink is on a MST link and
// and on a MST link if DSC is possible on the path and devDoingDscDecompression
// is the sink itself, then the parent should be DSC Pass through capable..
// is the sink itself and sink is not on a logical port, then the parent should be
// DSC Pass through capable.
//
bDscPassThrough = true;
}
@@ -1829,7 +1959,7 @@ bool DeviceImpl::setDscEnable(bool enable)
//
if (!getDscEnable(&bCurrDscEnable))
{
DP_LOG(("DP> Not able to get DSC Enable State!"));
DP_LOG(("DP-DEV> Not able to get DSC Enable State!"));
return false;
}
}
@@ -1838,66 +1968,59 @@ bool DeviceImpl::setDscEnable(bool enable)
{
if(bDscPassThrough)
{
byte = FLD_SET_DRF(_DPCD20, _DSC_PASS_THROUGH, _ENABLE, _YES, byte);
dscPassthroughByte = FLD_SET_DRF(_DPCD20, _DSC_PASS_THROUGH, _ENABLE, _YES, dscPassthroughByte);
DP_LOG(("DP-DEV> Enabling DSC Pass through on branch device - %s",
this->parent->getTopologyAddress().toString(buffer)));
}
if (!bCurrDscEnable)
{
dscEnableByte = FLD_SET_DRF(_DPCD14, _DSC_ENABLE, _SINK, _YES, dscEnableByte);
DP_LOG(("DP-DEV> Enabling DSC decompression on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
}
else
{
if (!bCurrDscEnable)
{
byte = FLD_SET_DRF(_DPCD14, _DSC_ENABLE, _SINK, _YES, byte);
DP_LOG(("DP-DEV> Enabling DSC decompression on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
}
else
{
DP_LOG(("DP-DEV> DSC decompression is already enabled on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
return true;
}
DP_LOG(("DP-DEV> DSC decompression is already enabled on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
return true;
}
}
else
{
if(bDscPassThrough)
{
byte = FLD_SET_DRF(_DPCD20, _DSC_PASS_THROUGH, _ENABLE, _NO, byte);
dscPassthroughByte = FLD_SET_DRF(_DPCD20, _DSC_PASS_THROUGH, _ENABLE, _NO, dscPassthroughByte);
DP_LOG(("DP-DEV> Disabling DSC Pass through on branch device - %s",
this->parent->getTopologyAddress().toString(buffer)));
}
if (bCurrDscEnable)
{
dscEnableByte = FLD_SET_DRF(_DPCD14, _DSC_ENABLE, _SINK, _NO, dscEnableByte);
DP_LOG(("DP-DEV> Disabling DSC decompression on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
}
else
{
if (bCurrDscEnable)
{
byte = FLD_SET_DRF(_DPCD14, _DSC_ENABLE, _SINK, _NO, byte);
DP_LOG(("DP-DEV> Disabling DSC decompression on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
}
else
{
DP_LOG(("DP-DEV> DSC decompression is already disabled on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
return true;
}
DP_LOG(("DP-DEV> DSC decompression is already disabled on device - %s",
this->devDoingDscDecompression->getTopologyAddress().toString(buffer)));
return true;
}
}
if (bDscPassThrough)
{
//
// When sink is DSC decompression capable and parent is DSC pass through capable
// source needs to only enable DSC pass through on the parent branch and parent
// branch will take care of enabling DSC decompression on the sink.
//
return (!this->parent->setDpcdData(NV_DPCD20_DSC_PASS_THROUGH,
&byte, sizeof byte, &size, &nakReason));
}
else
{
return (!this->devDoingDscDecompression->setDpcdData(NV_DPCD14_DSC_ENABLE,
&byte, sizeof byte, &size, &nakReason));
if(this->parent->setDpcdData(NV_DPCD20_DSC_PASS_THROUGH,
&dscPassthroughByte, sizeof dscPassthroughByte, &size, &nakReason))
{
DP_LOG(("DP-DEV> Setting DSC Passthrough state on parent branch failed"));
bDscPassThroughUpdated = false;
}
}
return (!this->devDoingDscDecompression->setDpcdData(NV_DPCD14_DSC_ENABLE,
&dscEnableByte, sizeof dscEnableByte, &size, &nakReason)) && bDscPassThroughUpdated;
}
unsigned DeviceImpl::getDscVersionMajor()

View File

@@ -651,9 +651,19 @@ void DiscoveryManager::BranchDetection::handleLinkAddressDownReply()
if (child[i].isInputPort)
{
parentDevice.peerDevice = child[i].peerDeviceType;
parentDevice.dpcdRevisionMajor = child[i].dpcdRevisionMajor;
parentDevice.dpcdRevisionMinor = child[i].dpcdRevisionMinor;
parentDevice.portMap.inputMap |= (1 << child[i].portNumber);
if (address == Address(0))
{
//
// For immediate branch device, we will have already read DPCD version
// in notifyHPD. So we can just use that to populate here.
// For the remaining devices, LAM to parent branch will report the child
// DPCD version in reply and we are populating it in
// BranchDetection::detectCompleted.
//
parentDevice.dpcdRevisionMajor = parent->hal->getRevisionMajor();
parentDevice.dpcdRevisionMinor = parent->hal->getRevisionMinor();
}
}
}

View File

@@ -82,8 +82,6 @@ ParseResponseStatus LinkAddressMessage::parseResponseAck(EncodedMessage * messag
else
{
reader->readOrDefault(6 /*zeroes*/, 0x0);
reply.res[i].dpcdRevisionMajor = 1;
reply.res[i].dpcdRevisionMinor = 2;
}
}

View File

@@ -31,6 +31,8 @@
#define NV_DPCD20_DSC_PASS_THROUGH_ENABLE_NO (0x00000000) /* R-XUV */
#define NV_DPCD20_DSC_PASS_THROUGH_ENABLE_YES (0x00000001) /* R-XUV */
#define NV_DPCD20_GUID_2 (0x00000040) /* R-XUR */
// PANEL REPLAY RELATED DPCD
#define NV_DPCD20_PANEL_REPLAY_CAPABILITY (0x000000B0)
#define NV_DPCD20_PANEL_REPLAY_CAPABILITY_SUPPORTED 0:0

View File

@@ -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 r515_00
#define NV_BUILD_BRANCH r516_87
#endif
#ifndef NV_PUBLIC_BRANCH
#define NV_PUBLIC_BRANCH r515_00
#define NV_PUBLIC_BRANCH r516_87
#endif
#if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS)
#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r515/r515_00-269"
#define NV_BUILD_CHANGELIST_NUM (31485447)
#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r515/r516_87-317"
#define NV_BUILD_CHANGELIST_NUM (31589401)
#define NV_BUILD_TYPE "Official"
#define NV_BUILD_NAME "rel/gpu_drv/r515/r515_00-269"
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31485447)
#define NV_BUILD_NAME "rel/gpu_drv/r515/r516_87-317"
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31589401)
#else /* Windows builds */
#define NV_BUILD_BRANCH_VERSION "r515_00-210"
#define NV_BUILD_CHANGELIST_NUM (31485447)
#define NV_BUILD_BRANCH_VERSION "r516_87-1"
#define NV_BUILD_CHANGELIST_NUM (31588177)
#define NV_BUILD_TYPE "Official"
#define NV_BUILD_NAME "516.56"
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31485447)
#define NV_BUILD_NAME "516.90"
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (31588177)
#define NV_BUILD_BRANCH_BASE_VERSION R515
#endif
// End buildmeister python edited section

View File

@@ -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.57"
#define NV_VERSION_STRING "515.65.01"
#else

View File

@@ -3424,7 +3424,7 @@ nvlink_lib_ctrl_get_device_link_states
NvU32 i = 0;
nvlink_link **links = (nvlink_link **)nvlink_malloc(
sizeof(nvlink_link *) * NVLINK_MAX_NVLINK_ENDPOINTS);
sizeof(nvlink_link *) * NVLINK_MAX_SYSTEM_LINK_NUM);
if (links == NULL)
{
return NVL_NO_MEM;

View File

@@ -63,6 +63,7 @@ CHIPSET_SETUP_FUNC(Intel_A301_setupFunc)
CHIPSET_SETUP_FUNC(Intel_0685_setupFunc)
CHIPSET_SETUP_FUNC(Intel_4381_setupFunc)
CHIPSET_SETUP_FUNC(Intel_7A82_setupFunc)
CHIPSET_SETUP_FUNC(Intel_7A04_setupFunc)
CHIPSET_SETUP_FUNC(SiS_656_setupFunc)
CHIPSET_SETUP_FUNC(ATI_RS400_setupFunc)
CHIPSET_SETUP_FUNC(ATI_RS480_setupFunc)
@@ -182,6 +183,8 @@ CSINFO chipsetInfo[] =
{PCI_VENDOR_ID_INTEL, 0x7A82, CS_INTEL_7A82, "Intel-AlderLake", Intel_7A82_setupFunc},
{PCI_VENDOR_ID_INTEL, 0x7A84, CS_INTEL_7A82, "Intel-AlderLake", Intel_7A82_setupFunc},
{PCI_VENDOR_ID_INTEL, 0x1B81, CS_INTEL_1B81, "Intel-SapphireRapids", NULL},
{PCI_VENDOR_ID_INTEL, 0x18DC, CS_INTEL_18DC, "Intel-IceLake", NULL},
{PCI_VENDOR_ID_INTEL, 0x7A04, CS_INTEL_7A04, "Intel-RaptorLake", Intel_7A04_setupFunc},
{PCI_VENDOR_ID_NVIDIA, 0x0FAE, CS_NVIDIA_T210, "T210", Nvidia_T210_setupFunc},
{PCI_VENDOR_ID_NVIDIA, 0x0FAF, CS_NVIDIA_T210, "T210", Nvidia_T210_setupFunc},

View File

@@ -642,6 +642,8 @@ enum {
, CS_PHYTIUM_S2500
, CS_MELLANOX_BLUEFIELD2
, CS_INTEL_1B81
, CS_INTEL_18DC
, CS_INTEL_7A04
, CS_MAX_PCIE
};

View File

@@ -943,6 +943,7 @@ NvBool NV_API_CALL rm_disable_iomap_wc(void);
void NV_API_CALL rm_init_dynamic_power_management(nvidia_stack_t *, nv_state_t *, NvBool);
void NV_API_CALL rm_cleanup_dynamic_power_management(nvidia_stack_t *, nv_state_t *);
void NV_API_CALL rm_enable_dynamic_power_management(nvidia_stack_t *, nv_state_t *);
NV_STATUS NV_API_CALL rm_ref_dynamic_power(nvidia_stack_t *, nv_state_t *, nv_dynamic_power_mode_t);
void NV_API_CALL rm_unref_dynamic_power(nvidia_stack_t *, nv_state_t *, nv_dynamic_power_mode_t);
NV_STATUS NV_API_CALL rm_transition_dynamic_power(nvidia_stack_t *, nv_state_t *, NvBool);

View File

@@ -50,6 +50,13 @@ void NV_API_CALL rm_cleanup_dynamic_power_management(
{
}
void NV_API_CALL rm_enable_dynamic_power_management(
nvidia_stack_t *sp,
nv_state_t *nv
)
{
}
NV_STATUS NV_API_CALL rm_ref_dynamic_power(
nvidia_stack_t *sp,
nv_state_t *nv,

View File

@@ -178,6 +178,7 @@
--undefined=rm_schedule_gpu_wakeup
--undefined=rm_init_dynamic_power_management
--undefined=rm_cleanup_dynamic_power_management
--undefined=rm_enable_dynamic_power_management
--undefined=rm_ref_dynamic_power
--undefined=rm_unref_dynamic_power
--undefined=rm_transition_dynamic_power

View File

@@ -868,6 +868,8 @@ static const CHIPS_RELEASED sChipsReleased[] = {
{ 0x2233, 0x165a, 0x10de, "NVIDIA RTX A5500" },
{ 0x2233, 0x165a, 0x17aa, "NVIDIA RTX A5500" },
{ 0x2235, 0x145a, 0x10de, "NVIDIA A40" },
{ 0x2236, 0x1482, 0x10de, "NVIDIA A10" },
{ 0x2237, 0x152f, 0x10de, "NVIDIA A10G" },
{ 0x2238, 0x1677, 0x10de, "NVIDIA A10M" },
{ 0x2414, 0x0000, 0x0000, "NVIDIA GeForce RTX 3060 Ti" },
{ 0x2420, 0x0000, 0x0000, "NVIDIA GeForce RTX 3080 Ti Laptop GPU" },

View File

@@ -491,6 +491,7 @@ struct RS_CPU_UNMAP_PARAMS
NvP64 pLinearAddress; ///< [in] Address of mapped memory
NvU32 flags; ///< [in] Resource-specific flags
NvU32 processId;
NvBool bTeardown; ///< [in] Unmap operation is due to client teardown
/// [in] hContext Handle of resource that provides a context for the mapping (e.g., subdevice for channel map)
NvHandle hContext;

View File

@@ -465,6 +465,7 @@ struct RS_CPU_UNMAP_PARAMS
NvP64 pLinearAddress; ///< [in] Address of mapped memory
NvU32 flags; ///< [in] Resource-specific flags
NvU32 processId;
NvBool bTeardown; ///< [in] Unmap operation is due to client teardown
/// [in] hContext Handle of resource that provides a context for the mapping (e.g., subdevice for channel map)
NvHandle hContext;

View File

@@ -56,6 +56,8 @@ dispsfConstruct_IMPL
return NV_ERR_INSUFFICIENT_PERMISSIONS;
}
NV_CHECK_OR_RETURN(LEVEL_ERROR, pKernelDisplay != NULL, NV_ERR_NOT_SUPPORTED);
// Set sf user RegBase offset
kdispGetDisplaySfUserBaseAndSize_HAL(pGpu, pKernelDisplay,
&pDispSfUser->ControlOffset,

View File

@@ -3713,6 +3713,7 @@ gvaspaceWalkUserCtxRelease_IMPL
{
// If current context doesn't match, must have nested acquires (not allowed).
NV_ASSERT_OR_RETURN_VOID(pUserCtx->pGpuState);
NV_ASSERT_OR_RETURN_VOID(pUserCtx->pGpuState->pWalk);
NV_ASSERT(pUserCtx == mmuWalkGetUserCtx(pUserCtx->pGpuState->pWalk));
mmuWalkSetUserCtx(pUserCtx->pGpuState->pWalk, NULL);
}

View File

@@ -880,6 +880,18 @@ Intel_7A82_setupFunc
return NV_OK;
}
// Intel Z790 platform (Raptor Lake)
static NV_STATUS
Intel_7A04_setupFunc
(
OBJCL *pCl
)
{
pCl->setProperty(pCl, PDB_PROP_CL_HAS_RESIZABLE_BAR_ISSUE, NV_TRUE);
return NV_OK;
}
static NV_STATUS
Nvidia_T210_setupFunc
(

View File

@@ -974,11 +974,24 @@ serverUnmap_Prologue
{
rmStatus = osAttachToProcess(&pProcessHandle, ProcessId);
if (rmStatus != NV_OK)
return rmStatus;
{
if (pUnmapParams->bTeardown)
pProcessHandle = NULL;
else
return rmStatus;
}
pUnmapParams->pProcessHandle = pProcessHandle;
}
// Don't do any filtering if this is a tear-down path
if (pUnmapParams->bTeardown)
{
pUnmapParams->fnFilter = NULL;
return NV_OK;
}
pUnmapParams->fnFilter = bKernel
? serverutilMappingFilterKernel
: serverutilMappingFilterCurrentUserProc;

View File

@@ -205,7 +205,10 @@ mmuWalkLevelInstancesForceFree
MMU_WALK *pWalk
)
{
_mmuWalkLevelInstancesForceFree(pWalk, &pWalk->root);
if (pWalk != NULL)
{
_mmuWalkLevelInstancesForceFree(pWalk, &pWalk->root);
}
}
/*----------------------------Private Functions--------------------------------*/

View File

@@ -110,6 +110,8 @@ mmuWalkReleaseEntries
MMU_WALK_OP_PARAMS opParams = {0};
NV_STATUS status = NV_OK;
NV_ASSERT_OR_RETURN(NULL != pWalk, NV_ERR_INVALID_ARGUMENT);
NV_ASSERT_OR_RETURN(NULL != mmuWalkFindLevel(pWalk, pLevelFmt),
NV_ERR_INVALID_ARGUMENT);
NV_ASSERT_OR_RETURN(NV_IS_ALIGNED(vaLo, mmuFmtLevelPageSize(pLevelFmt)),

View File

@@ -1084,7 +1084,8 @@ _clientUnmapResourceRefMappings
: pCpuMapping->pContextRef->hResource;
params.hMemory = pResourceRef->hResource;
params.pLinearAddress = pCpuMapping->pLinearAddress;
params.processId = pCpuMapping->processId;
params.processId = pCpuMapping->processId;
params.bTeardown = NV_TRUE;
params.flags = pCpuMapping->flags;
params.pSecInfo = &pCallContext->secInfo;
params.pLockInfo = &lockInfo;
@@ -1147,6 +1148,7 @@ _clientUnmapBackRefMappings
params.hMemory = pBackRef->hResource;
params.pLinearAddress = pCpuMapping->pLinearAddress;
params.processId = pCpuMapping->processId;
params.bTeardown = NV_TRUE;
params.flags = pCpuMapping->flags;
params.pSecInfo = &pCallContext->secInfo;
params.pLockInfo = &lockInfo;