Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/common/modeset/timing/nvt_dsc_pps.c
Original file line number Diff line number Diff line change
Expand Up @@ -1010,7 +1010,7 @@ DSC_PpsCalcBase
}
else
{
RANGE_CHECK("pic_width", in->pic_width, 32, 5120);
RANGE_CHECK("pic_width", in->pic_width, 32, DSC_MAX_SINGLE_HEAD_WIDTH);
}
}

Expand Down
1 change: 1 addition & 0 deletions src/common/modeset/timing/nvt_dsc_pps.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

/* ------------------------ Macros ----------------------------------------- */
#define DSC_MAX_PPS_SIZE_DWORD 32
#define DSC_MAX_SINGLE_HEAD_WIDTH 5120

/* ------------------------ Datatypes -------------------------------------- */
typedef struct
Expand Down
7 changes: 5 additions & 2 deletions src/nvidia-modeset/include/nvkms-evo.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,8 +196,8 @@ NvBool nvDowngradeColorFormatAndBpc(
const NvBool colorBpcSpecified,
NVDpyAttributeColor *pDpyColor);

NvBool nvDPValidateModeEvo(NVDpyEvoPtr pDpyEvo,
NVHwModeTimingsEvoPtr pTimings,
NvBool nvDPValidateModeEvo(const NVDpyEvoRec *pDpyEvo,
const NVHwModeTimingsEvo *pTimings,
const NvBool colorFormatSpecified,
const NvBool colorBpcSpecified,
NVDpyAttributeColor *pDpyColor,
Expand Down Expand Up @@ -435,6 +435,9 @@ NvBool nvEvoGetSingleMergeHeadSectionHwModeTimings(

NvBool nvEvoUse2Heads1OR(const NVDpyEvoRec *pDpyEvo,
const NVHwModeTimingsEvo *pTimings,
const NVDpyAttributeColor *pDpyColor,
const NvBool colorFormatSpecified,
const NvBool colorBpcSpecified,
const struct NvKmsModeValidationParams *pParams);

NvU32 nvGetRefreshRate10kHz(const NVHwModeTimingsEvo *pTimings);
Expand Down
33 changes: 28 additions & 5 deletions src/nvidia-modeset/src/nvkms-evo.c
Original file line number Diff line number Diff line change
Expand Up @@ -7032,8 +7032,8 @@ NvBool nvDowngradeColorFormatAndBpc(
* the given mode timings.
*/

NvBool nvDPValidateModeEvo(NVDpyEvoPtr pDpyEvo,
NVHwModeTimingsEvoPtr pTimings,
NvBool nvDPValidateModeEvo(const NVDpyEvoRec *pDpyEvo,
const NVHwModeTimingsEvo *pTimings,
const NvBool colorFormatSpecified,
const NvBool colorBpcSpecified,
NVDpyAttributeColor *pDpyColor,
Expand Down Expand Up @@ -9813,6 +9813,9 @@ NvBool nvEvoGetSingleMergeHeadSectionHwModeTimings(

NvBool nvEvoUse2Heads1OR(const NVDpyEvoRec *pDpyEvo,
const NVHwModeTimingsEvo *pTimings,
const NVDpyAttributeColor *pDpyColor,
const NvBool colorFormatSpecified,
const NvBool colorBpcSpecified,
const struct NvKmsModeValidationParams *pParams)
{
const NVDispEvoRec *pDispEvo = pDpyEvo->pDispEvo;
Expand Down Expand Up @@ -9846,9 +9849,29 @@ NvBool nvEvoUse2Heads1OR(const NVDpyEvoRec *pDpyEvo,
return FALSE;
}

/* Use 2Heads1OR mode only if the required pixel clock is greater than the
* maximum pixel clock support by a head. */
return (pTimings->pixelClock > pHeadCaps->maxPClkKHz);
if (pTimings->pixelClock > pHeadCaps->maxPClkKHz) {
return TRUE;
}

if (!nvDpyUsesDPLib(pDpyEvo) ||
(pParams->dscMode == NVKMS_DSC_MODE_FORCE_DISABLE) ||
(pTimings->yuv420Mode == NV_YUV420_MODE_HW) ||
(nvEvoVisibleWidth(pTimings) <= DSC_MAX_SINGLE_HEAD_WIDTH)) {
return FALSE;
}

/*
* A wide DSC picture needs two heads even when its pixel clock fits one.
* Preserve single-head modes that can already pass DP validation,
* including its existing uncompressed color-depth fallbacks.
*/
NVDpyAttributeColor dpyColor = *pDpyColor;

return !nvDPValidateModeEvo(pDpyEvo, pTimings,
colorFormatSpecified,
colorBpcSpecified,
&dpyColor, FALSE /* b2Heads1Or */,
NULL /* pDscInfo */, pParams);
}

NvBool nvIsLockGroupFlipLocked(const NVLockGroup *pLockGroup)
Expand Down
5 changes: 4 additions & 1 deletion src/nvidia-modeset/src/nvkms-modepool.c
Original file line number Diff line number Diff line change
Expand Up @@ -1721,7 +1721,10 @@ static NvBool ValidateMode(NVDpyEvoPtr pDpyEvo,
goto done;
}

b2Heads1Or = nvEvoUse2Heads1OR(pDpyEvo, pTimingsEvo, pParams);
b2Heads1Or = nvEvoUse2Heads1OR(pDpyEvo, pTimingsEvo, &dpyColor,
pDpyOutputColorParams->formatSpecified,
pDpyOutputColorParams->bpcSpecified,
pParams);

if (nvDpyIsHdmiEvo(pDpyEvo)) {
NvBool foundFrlConfig = FALSE;
Expand Down
9 changes: 9 additions & 0 deletions src/nvidia-modeset/src/nvkms-modeset.c
Original file line number Diff line number Diff line change
Expand Up @@ -831,6 +831,9 @@ static NvBool AssignProposedHwHeadsGeneric(
if (!nvEvoUse2Heads1OR(
pDpyEvo,
&pProposedApiHead->timings,
&pProposedApiHead->attributes.color,
pProposedApiHead->colorFormatSpecified,
pProposedApiHead->colorBpcSpecified,
&pProposedApiHead->modeValidationParams)) {
continue;
}
Expand All @@ -840,6 +843,9 @@ static NvBool AssignProposedHwHeadsGeneric(
nvAssert(!nvEvoUse2Heads1OR(
pDpyEvo,
&pProposedApiHead->timings,
&pProposedApiHead->attributes.color,
pProposedApiHead->colorFormatSpecified,
pProposedApiHead->colorBpcSpecified,
&pProposedApiHead->modeValidationParams));

NvU32 foundHead = GetFreeHeads(pDevEvo, apiHead, pDpyEvo,
Expand Down Expand Up @@ -908,6 +914,9 @@ void ClearIncompatibleHwHeadsMaskOneDisp(const NVDispEvoRec *pDispEvo,
const NvBool new2Heads1OrState =
nvEvoUse2Heads1OR(pDpyEvo,
&pProposedApiHead->timings,
&pProposedApiHead->attributes.color,
pProposedApiHead->colorFormatSpecified,
pProposedApiHead->colorBpcSpecified,
&pProposedApiHead->modeValidationParams);

if (new2Heads1OrState != current2Heads1OrState) {
Expand Down