This commit is contained in:
Bernhard Stoeckner
2023-08-08 18:26:28 +02:00
parent 29f830f1bb
commit 12c0739352
85 changed files with 33144 additions and 32566 deletions

View File

@@ -1394,6 +1394,12 @@ typedef struct _NVHwModeTimingsEvo {
NVHwModeViewPortEvo viewPort;
} NVHwModeTimingsEvo;
static inline NvBool nvIsAdaptiveSyncDpyVrrType(enum NvKmsDpyVRRType type)
{
return ((type == NVKMS_DPY_VRR_TYPE_ADAPTIVE_SYNC_DEFAULTLISTED) ||
(type == NVKMS_DPY_VRR_TYPE_ADAPTIVE_SYNC_NON_DEFAULTLISTED));
}
static inline NvU64 nvEvoFrametimeUsFromTimings(const NVHwModeTimingsEvo *pTimings)
{
NvU64 pixelsPerFrame = pTimings->rasterSize.x * pTimings->rasterSize.y;

View File

@@ -232,6 +232,10 @@ static void SetDPMSATiming(const NVDispEvoRec *pDispEvo,
NV0073_CTRL_CMD_DP_SET_MSA_PROPERTIES_PARAMS *msaParams,
const NVHwModeTimingsEvo *pTimings)
{
NV0073_CTRL_DP_MSA_PROPERTIES_MASK *featureMask = &msaParams->featureMask;
NV0073_CTRL_DP_MSA_PROPERTIES_VALUES *featureValues =
&msaParams->featureValues;
nvkms_memset(msaParams, 0, sizeof(*msaParams));
/*
@@ -244,12 +248,16 @@ static void SetDPMSATiming(const NVDispEvoRec *pDispEvo,
msaParams->subDeviceInstance = pDispEvo->displayOwner;
msaParams->displayId = displayId;
if ((pTimings->yuv420Mode == NV_YUV420_MODE_SW) && displayId != 0) {
NV0073_CTRL_DP_MSA_PROPERTIES_MASK *featureMask = &msaParams->featureMask;
NV0073_CTRL_DP_MSA_PROPERTIES_VALUES *featureValues = &msaParams->featureValues;
if ((displayId == 0x0) ||
((pTimings->yuv420Mode != NV_YUV420_MODE_SW) &&
!nvIsAdaptiveSyncDpyVrrType(pTimings->vrr.type))) {
return;
}
msaParams->bEnableMSA = 1;
msaParams->bCacheMsaOverrideForNextModeset = 1;
msaParams->bEnableMSA = 1;
msaParams->bCacheMsaOverrideForNextModeset = 1;
if (pTimings->yuv420Mode == NV_YUV420_MODE_SW) {
featureMask->bRasterTotalHorizontal = true;
featureMask->bActiveStartHorizontal = true;
featureMask->bSurfaceTotalHorizontal = true;
@@ -259,6 +267,15 @@ static void SetDPMSATiming(const NVDispEvoRec *pDispEvo,
featureValues->surfaceTotalHorizontal = 2 * nvEvoVisibleWidth(pTimings);
featureValues->syncWidthHorizontal = 2 * (pTimings->rasterSyncEnd.x + 1);
}
/*
* In case of Adaptive-Sync VRR, override VTotal field of MSA (Main Stream
* Attributes) to workaround bug 4164132.
*/
if (nvIsAdaptiveSyncDpyVrrType(pTimings->vrr.type)) {
featureMask->bRasterTotalVertical = true;
featureValues->rasterTotalVertical = pTimings->rasterSize.y;
}
}
static void InitDpModesetParams(

View File

@@ -2117,7 +2117,10 @@ IsProposedModeSetStateOneApiHeadIncompatible(
&pDispEvo->apiHeadState[apiHead];
const NVDpyEvoRec *pDpyEvo =
nvGetOneArbitraryDpyEvo(pApiHeadState->activeDpys, pDispEvo);
const NvBool bCurrent2Heads1Or =
(nvPopCount32(pApiHeadState->hwHeadsMask) > 1);
const NvBool bProposed2Heads1Or =
(nvPopCount32(pProposedApiHead->hwHeadsMask) > 1);
nvAssert(pDpyEvo != NULL);
/*
@@ -2127,11 +2130,22 @@ IsProposedModeSetStateOneApiHeadIncompatible(
*
* Consider this api-head incompatible if there is change in the api-head
* to hardware-head(s) mapping.
*
* Mark api-head incompatible if its current or proposed modeset state is
* using 2Heads1OR configuration:
* Even if there is no change in the hardware heads or modetimings, it is
* not possible to do modeset on the active 2Heads1OR api-head without
* shutting it down first. The modeset code path is ready to handle the
* glitchless 2Heads1OR modeset, for example NV0073_CTRL_CMD_DFP_ASSIGN_SOR
* does not handles the assignment of secondary SORs if display is already
* active and returns incorrect information which leads to segfault in
* NVKMS.
*/
if (nvConnectorUsesDPLib(pDpyEvo->pConnectorEvo) ||
((pProposedApiHead->hwHeadsMask != 0x0) &&
(pProposedApiHead->hwHeadsMask != pApiHeadState->hwHeadsMask))) {
(pProposedApiHead->hwHeadsMask != pApiHeadState->hwHeadsMask)) ||
bCurrent2Heads1Or || bProposed2Heads1Or) {
return TRUE;
}

View File

@@ -183,13 +183,6 @@ static NvBool DpyIsGsync(const NVDpyEvoRec *pDpyEvo)
return pDpyEvo->vrr.type == NVKMS_DPY_VRR_TYPE_GSYNC;
}
static NvBool IsAdaptiveSyncDpyVrrType(enum NvKmsDpyVRRType type)
{
return ((type == NVKMS_DPY_VRR_TYPE_ADAPTIVE_SYNC_DEFAULTLISTED) ||
(type == NVKMS_DPY_VRR_TYPE_ADAPTIVE_SYNC_NON_DEFAULTLISTED));
}
static NvBool AnyEnabledAdaptiveSyncDpys(const NVDevEvoRec *pDevEvo)
{
NVDispEvoPtr pDispEvo;
@@ -202,7 +195,7 @@ static NvBool AnyEnabledAdaptiveSyncDpys(const NVDevEvoRec *pDevEvo)
const NVDispHeadStateEvoRec *pHeadState =
&pDispEvo->headState[head];
if (IsAdaptiveSyncDpyVrrType(pHeadState->timings.vrr.type)) {
if (nvIsAdaptiveSyncDpyVrrType(pHeadState->timings.vrr.type)) {
return TRUE;
}
}
@@ -286,7 +279,7 @@ void nvAdjustHwModeTimingsForVrrEvo(NVHwModeTimingsEvoPtr pTimings,
// Allow overriding the EDID min refresh rate on Adaptive-Sync
// displays.
if (IsAdaptiveSyncDpyVrrType(vrrType) && vrrOverrideMinRefreshRate) {
if (nvIsAdaptiveSyncDpyVrrType(vrrType) && vrrOverrideMinRefreshRate) {
NvU32 minMinRefreshRate, maxMinRefreshRate;
NvU32 clampedMinRefreshRate;
@@ -737,7 +730,7 @@ void nvDisableVrr(NVDevEvoPtr pDevEvo)
NVDispHeadStateEvoRec *pHeadState = &pDispEvo->headState[head];
if ((pHeadState->pConnectorEvo != NULL) &&
IsAdaptiveSyncDpyVrrType(pHeadState->timings.vrr.type)) {
nvIsAdaptiveSyncDpyVrrType(pHeadState->timings.vrr.type)) {
if (nvConnectorUsesDPLib(pHeadState->pConnectorEvo)) {
nvDPLibSetAdaptiveSync(pDispEvo, head, FALSE);
} else {
@@ -799,7 +792,7 @@ void nvGetDpyMinRefreshRateValidValues(
{
NvU32 edidMinRefreshRate;
if (IsAdaptiveSyncDpyVrrType(vrrType)) {
if (nvIsAdaptiveSyncDpyVrrType(vrrType)) {
/*
* Adaptive-Sync monitors must always define a nonzero minimum refresh
* rate in the EDID, and a modeset may override this within a range
@@ -860,7 +853,7 @@ void nvEnableVrr(NVDevEvoPtr pDevEvo)
NVDispHeadStateEvoRec *pHeadState = &pDispEvo->headState[head];
if ((pHeadState->pConnectorEvo != NULL) &&
IsAdaptiveSyncDpyVrrType(pHeadState->timings.vrr.type)) {
nvIsAdaptiveSyncDpyVrrType(pHeadState->timings.vrr.type)) {
if (nvConnectorUsesDPLib(pHeadState->pConnectorEvo)) {
nvDPLibSetAdaptiveSync(pDispEvo, head, TRUE);
} else {