580.82.07

This commit is contained in:
Maneet Singh
2025-09-02 10:35:52 -07:00
parent 288f16e614
commit 6387af3092
67 changed files with 1665 additions and 838 deletions

View File

@@ -51,7 +51,8 @@ NvBool nvValidateModeForModeset(NVDpyEvoRec *pDpyEvo,
const struct NvKmsRect *pViewPortOut,
NVDpyAttributeColor *pDpyColor,
NVHwModeTimingsEvo *pTimingsEvo,
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl);
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl,
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pVSInfoFrameCtrl);
const NVT_TIMING *nvFindEdidNVT_TIMING(
const NVDpyEvoRec *pDpyEvo,

View File

@@ -37,7 +37,8 @@ nvGetHwModeTimings(const NVDispEvoRec *pDispEvo,
const struct NvKmsSetModeOneHeadRequest *pRequestHead,
NVHwModeTimingsEvo *pTimings,
NVDpyAttributeColor *pDpyColor,
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl);
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl,
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pVSInfoFrameCtrl);
NvBool nvGetAllowHeadSurfaceInNvKms(const NVDevEvoRec *pDevEvo,
const struct NvKmsPerOpenDev *pOpenDev,

View File

@@ -1843,6 +1843,7 @@ typedef struct _NVDispHeadAudioStateEvoRec {
typedef struct _NVDispHeadInfoFrameStateEvoRec {
NVT_VIDEO_INFOFRAME_CTRL ctrl;
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL vendorSpecificCtrl;
NvBool hdTimings;
} NVDispHeadInfoFrameStateEvoRec;
@@ -2568,6 +2569,15 @@ static inline NvBool nvIs3DVisionStereoEvo(const enum NvKmsStereoMode stereo)
stereo == NVKMS_STEREO_NVIDIA_3D_VISION_PRO);
}
static inline NvBool nvGetPreferHdmiFrlMode(
const NVDevEvoRec *pDevEvo,
const struct NvKmsModeValidationParams *pParams)
{
const NvBool preferHDMIFrlMode =
!!(pParams->overrides & NVKMS_MODE_VALIDATION_PREFER_HDMI_FRL_MODE);
return preferHDMIFrlMode;
}
/*
* Utility macro for iterating over all head bits set in a head bit mask
*/

View File

@@ -362,6 +362,7 @@ enum NvKmsModeValidationOverrides {
NVKMS_MODE_VALIDATION_ALLOW_DP_INTERLACED = (1 << 17),
NVKMS_MODE_VALIDATION_NO_INTERLACED_MODES = (1 << 18),
NVKMS_MODE_VALIDATION_MAX_ONE_HARDWARE_HEAD = (1 << 19),
NVKMS_MODE_VALIDATION_PREFER_HDMI_FRL_MODE = (1 << 20),
};
/*!

View File

@@ -42,8 +42,21 @@ void dpFree(void *p)
static NVEvoLogType dpSeverityToNvkmsMap(DP_LOG_LEVEL severity)
{
NVEvoLogType level = EVO_LOG_INFO;
return level;
switch (severity) {
case DP_SILENT:
case DP_INFO:
case DP_NOTICE:
return EVO_LOG_INFO;
case DP_WARNING:
return EVO_LOG_WARN;
case DP_ERROR:
case DP_HW_ERROR:
case DP_FATAL:
return EVO_LOG_ERROR;
}
nvAssert(!"Invalid DP_LOG_LEVEL enumerant passed");
return EVO_LOG_ERROR;
}
void dpPrintf(DP_LOG_LEVEL severity, const char *format, ...)

View File

@@ -6893,17 +6893,18 @@ static NvBool GetDefaultFrlDpyColor(
return FALSE;
}
static NvBool GetDfpHdmiProtocol(const NVDpyEvoRec *pDpyEvo,
const NvU32 overrides,
NVDpyAttributeColor *pDpyColor,
NVHwModeTimingsEvoPtr pTimings,
enum nvKmsTimingsProtocol *pTimingsProtocol)
static NvBool GetDfpHdmiProtocol(
const NVDpyEvoRec *pDpyEvo,
const struct NvKmsModeValidationParams *pValidationParams,
NVDpyAttributeColor *pDpyColor,
NVHwModeTimingsEvoPtr pTimings,
enum nvKmsTimingsProtocol *pTimingsProtocol)
{
NVConnectorEvoPtr pConnectorEvo = pDpyEvo->pConnectorEvo;
const NVDevEvoRec *pDevEvo = pConnectorEvo->pDispEvo->pDevEvo;
const NvU32 rmProtocol = pConnectorEvo->or.protocol;
const NvKmsDpyOutputColorFormatInfo colorFormatsInfo =
nvDpyGetOutputColorFormatInfo(pDpyEvo);
const NvBool forceHdmiFrlIfSupported = FALSE;
nvAssert(rmProtocol == NV0073_CTRL_SPECIFIC_OR_PROTOCOL_SOR_DUAL_TMDS ||
rmProtocol == NV0073_CTRL_SPECIFIC_OR_PROTOCOL_SOR_SINGLE_TMDS_A ||
@@ -6911,11 +6912,12 @@ static NvBool GetDfpHdmiProtocol(const NVDpyEvoRec *pDpyEvo,
/* Override protocol if this mode requires HDMI FRL. */
/* If we don't require boot clocks... */
if (((overrides & NVKMS_MODE_VALIDATION_REQUIRE_BOOT_CLOCKS) == 0) &&
if (((pValidationParams->overrides &
NVKMS_MODE_VALIDATION_REQUIRE_BOOT_CLOCKS) == 0) &&
(!nvHdmiIsTmdsPossible(pDpyEvo, pTimings, pDpyColor) ||
forceHdmiFrlIfSupported) &&
/* If FRL is supported... */
nvHdmiDpySupportsFrl(pDpyEvo)) {
nvGetPreferHdmiFrlMode(pDevEvo, pValidationParams)) &&
/* If FRL is supported... */
nvHdmiDpySupportsFrl(pDpyEvo)) {
/* Hardware does not support HDMI FRL with YUV422 */
if ((pDpyColor->format ==
@@ -6977,7 +6979,7 @@ static NvBool GetDfpProtocol(const NVDpyEvoRec *pDpyEvo,
if (pConnectorEvo->or.type == NV0073_CTRL_SPECIFIC_OR_TYPE_SOR) {
if (nvDpyIsHdmiEvo(pDpyEvo)) {
if (!GetDfpHdmiProtocol(pDpyEvo, overrides, pDpyColor, pTimings,
if (!GetDfpHdmiProtocol(pDpyEvo, pParams, pDpyColor, pTimings,
&timingsProtocol)) {
return FALSE;
}

View File

@@ -427,38 +427,28 @@ static void SendVideoInfoFrame(const NVDispEvoRec *pDispEvo,
}
/*
* SendHDMI3DVendorSpecificInfoFrame() - Construct vendor specific infoframe
* using provided EDID and call ->SendHdmiInfoFrame() to send it to RM. Currently
* hardcoded to send the infoframe necessary for HDMI 3D.
* SendVendorSpecificInfoFrame() - Construct vendor specific infoframe using
* provided EDID and call ->SendHdmiInfoFrame() to send it to RM.
*/
static void
SendHDMI3DVendorSpecificInfoFrame(const NVDispEvoRec *pDispEvo,
const NvU32 head, NVT_EDID_INFO *pEdidInfo)
SendVendorSpecificInfoFrame(const NVDispEvoRec *pDispEvo,
const NvU32 head,
const NVDispHeadInfoFrameStateEvoRec *pInfoFrameState,
NVT_EDID_INFO *pEdidInfo)
{
const NVDevEvoRec *pDevEvo = pDispEvo->pDevEvo;
const NVDispHeadStateEvoRec *pHeadState =
&pDispEvo->headState[head];
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL vendorCtrl = {
.Enable = 1,
.HDMIFormat = NVT_HDMI_VS_BYTE4_HDMI_VID_FMT_3D,
.HDMI_VIC = NVT_HDMI_VS_BYTE5_HDMI_VIC_NA,
.ThreeDStruc = NVT_HDMI_VS_BYTE5_HDMI_3DS_FRAMEPACK,
.ThreeDDetail = NVT_HDMI_VS_BYTE_OPT1_HDMI_3DEX_NA,
.MetadataPresent = 0,
.MetadataType = NVT_HDMI_VS_BYTE_OPT2_HDMI_METADATA_TYPE_NA,
};
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL vendorCtrl = pInfoFrameState->vendorSpecificCtrl;
NVT_VENDOR_SPECIFIC_INFOFRAME vendorInfoFrame;
NVT_STATUS status;
if (!pEdidInfo->HDMI3DSupported) {
// Only send the HDMI 3D infoframe if the display supports HDMI 3D
return;
}
// Send the infoframe with HDMI 3D configured if we're setting an HDMI 3D
// mode.
if (!pHeadState->timings.hdmi3D) {
/*
* Disable the vendor specific infoframe if not requested to be
* enabled, or if HDMI 3D is requested but not supported by the monitor.
*/
if (!vendorCtrl.Enable ||
((vendorCtrl.HDMIFormat == NVT_HDMI_VS_BYTE4_HDMI_VID_FMT_3D) &&
!pEdidInfo->HDMI3DSupported)) {
pDevEvo->hal->DisableHdmiInfoFrame(pDispEvo, head,
NVT_INFOFRAME_TYPE_VENDOR_SPECIFIC);
return;
@@ -575,9 +565,10 @@ void nvUpdateHdmiInfoFrames(const NVDispEvoRec *pDispEvo,
pInfoFrameState,
&pDpyEvo->parsedEdid.info);
SendHDMI3DVendorSpecificInfoFrame(pDispEvo,
head,
&pDpyEvo->parsedEdid.info);
SendVendorSpecificInfoFrame(pDispEvo,
head,
pInfoFrameState,
&pDpyEvo->parsedEdid.info);
SendHDRInfoFrame(pDispEvo,
head,
@@ -2146,7 +2137,9 @@ static NvBool nvHdmiFrlQueryConfigOneBpc(
nvAssert(nvDpyIsHdmiEvo(pDpyEvo));
nvAssert(nvHdmiDpySupportsFrl(pDpyEvo));
nvAssert(!nvHdmiIsTmdsPossible(pDpyEvo, pHwTimings, pDpyColor));
nvAssert(!nvHdmiIsTmdsPossible(pDpyEvo, pHwTimings, pDpyColor) ||
nvGetPreferHdmiFrlMode(pDevEvo, pValidationParams));
/* See if we can find an NVT_TIMING for this mode from the EDID. */
pNvtTiming = nvFindEdidNVT_TIMING(pDpyEvo, pModeTimings, pValidationParams);

View File

@@ -833,7 +833,8 @@ NvBool nvHsConfigInitModeset(
if (!nvGetHwModeTimings(pDispEvo, apiHead, pRequestHead,
pTimings, NULL /* pDpyColor */,
NULL /* pInfoFrameCtrl */)) {
NULL /* pInfoFrameCtrl */,
NULL /* pVSInfoFrameCtrl */)) {
nvPreallocRelease(pDevEvo, PREALLOC_TYPE_HS_INIT_CONFIG_HW_TIMINGS);
return FALSE;
}
@@ -1250,7 +1251,8 @@ NvBool nvHsConfigDowngrade(
if (!nvGetHwModeTimings(pDispEvo, apiHead, pRequestHead,
pTimings, NULL /* pDpyColor */,
NULL /* pInfoFrameCtrl */)) {
NULL /* pInfoFrameCtrl */,
NULL /* pVSInfoFrameCtrl */)) {
nvPreallocRelease(pDevEvo, PREALLOC_TYPE_HS_INIT_CONFIG_HW_TIMINGS);
return FALSE;
}

View File

@@ -71,7 +71,8 @@ static NvBool ConstructModeTimingsMetaData(
const struct NvKmsModeValidationParams *pParams,
struct NvKmsMode *pKmsMode,
EvoValidateModeFlags *pFlags,
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl);
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl,
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pVSInfoFrameCtrl);
static NvBool ValidateMode(NVDpyEvoPtr pDpyEvo,
const struct NvKmsMode *pKmsMode,
@@ -143,7 +144,6 @@ nvValidateModeEvo(NVDpyEvoPtr pDpyEvo,
.timings = pRequest->mode.timings,
};
EvoValidateModeFlags evoFlags;
NVT_VIDEO_INFOFRAME_CTRL dummyInfoFrameCtrl;
nvkms_memset(pReply, 0, sizeof(*pReply));
@@ -151,7 +151,8 @@ nvValidateModeEvo(NVDpyEvoPtr pDpyEvo,
&pRequest->modeValidation,
&kmsMode,
&evoFlags,
&dummyInfoFrameCtrl)) {
NULL /* pInfoFrameCtrl */,
NULL /* pVSInfoFrameCtrl */)) {
pReply->valid = FALSE;
return;
}
@@ -1837,13 +1838,27 @@ const NVT_TIMING *nvFindEdidNVT_TIMING
const struct NvKmsModeValidationParams *pParams
)
{
const NVParsedEdidEvoRec *pParsedEdid = &pDpyEvo->parsedEdid;
const NVT_HDMI_FORUM_INFO *pHdmiInfo = &pParsedEdid->info.hdmiForumInfo;
NvModeTimings tmpModeTimings;
int match861stOnly;
int i;
if (!pDpyEvo->parsedEdid.valid) {
return NULL;
}
/*
* In the first pass, attempt to match the pModeTimings with CEA/CTA 861
* video formats if the monitor prefers them, or if HDMI 3D is requested.
*/
if (nvDpyIsHdmiEvo(pDpyEvo) &&
(pModeTimings->hdmi3D || pHdmiInfo->uhd_vic)) {
match861stOnly = 1;
} else {
match861stOnly = 0;
}
tmpModeTimings = *pModeTimings;
/*
@@ -1860,22 +1875,62 @@ const NVT_TIMING *nvFindEdidNVT_TIMING
*/
tmpModeTimings.yuv420Mode = NV_YUV420_MODE_NONE;
for (i = 0; i < pDpyEvo->parsedEdid.info.total_timings; i++) {
const NVT_TIMING *pTiming = &pDpyEvo->parsedEdid.info.timing[i];
if (NVT_TIMINGmatchesNvModeTimings(pTiming, &tmpModeTimings, pParams) &&
/*
* Only consider the mode a match if the yuv420
* configuration of pTiming would match pModeTimings.
*/
(pModeTimings->yuv420Mode ==
GetYUV420Value(pDpyEvo, pParams, pTiming))) {
return pTiming;
for (; match861stOnly >= 0; match861stOnly--) {
for (i = 0; i < pDpyEvo->parsedEdid.info.total_timings; i++) {
const NVT_TIMING *pTiming = &pDpyEvo->parsedEdid.info.timing[i];
if (match861stOnly &&
(NVT_GET_TIMING_STATUS_TYPE(pTiming->etc.status) !=
NVT_TYPE_EDID_861ST)) {
continue;
}
if (NVT_TIMINGmatchesNvModeTimings(pTiming, &tmpModeTimings, pParams) &&
/*
* Only consider the mode a match if the yuv420
* configuration of pTiming would match pModeTimings.
*/
(pModeTimings->yuv420Mode ==
GetYUV420Value(pDpyEvo, pParams, pTiming))) {
return pTiming;
}
}
}
return NULL;
}
static void ConstructVSInfoFrameCtrls(
const NVT_TIMING *pTiming,
const NvBool hdmi3D,
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pVSCtrl)
{
if (!hdmi3D && (NVT_GET_TIMING_STATUS_TYPE(pTiming->etc.status) !=
NVT_TYPE_HDMI_EXT)) {
pVSCtrl->Enable = FALSE;
pVSCtrl->VSIFVersion = NVT_VSIF_VERSION_NONE;
return;
}
pVSCtrl->Enable = TRUE;
pVSCtrl->VSIFVersion = NVT_VSIF_VERSION_H14B_VSIF;
if (hdmi3D) {
pVSCtrl->HDMIFormat = NVT_HDMI_VS_BYTE4_HDMI_VID_FMT_3D;
pVSCtrl->HDMI_VIC = NVT_HDMI_VS_BYTE5_HDMI_VIC_NA;
pVSCtrl->ThreeDStruc = NVT_HDMI_VS_BYTE5_HDMI_3DS_FRAMEPACK;
} else if (NVT_GET_TIMING_STATUS_TYPE(pTiming->etc.status) ==
NVT_TYPE_HDMI_EXT) {
pVSCtrl->HDMIFormat = NVT_HDMI_VS_BYTE4_HDMI_VID_FMT_EXT;
pVSCtrl->HDMI_VIC = NVT_GET_TIMING_STATUS_SEQ(pTiming->etc.status);
pVSCtrl->ThreeDStruc = NVT_HDMI_VS_BYTE5_HDMI_3DS_NA;
}
pVSCtrl->ThreeDDetail = NVT_HDMI_VS_BYTE_OPT1_HDMI_3DEX_NA;
pVSCtrl->MetadataPresent = 0;
pVSCtrl->MetadataType = NVT_HDMI_VS_BYTE_OPT2_HDMI_METADATA_TYPE_NA;
}
/*!
* Construct mode-timing's meta data required for mode validation
* logic. This meta data involves EvoValidateModeFlags, patched stereo
@@ -1896,11 +1951,13 @@ static NvBool ConstructModeTimingsMetaData(
const struct NvKmsModeValidationParams *pParams,
struct NvKmsMode *pKmsMode,
EvoValidateModeFlags *pFlags,
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl)
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl,
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pVSInfoFrameCtrl)
{
const NVDispEvoRec *pDispEvo = pDpyEvo->pDispEvo;
EvoValidateModeFlags flags = { 0 };
NVT_VIDEO_INFOFRAME_CTRL infoFrameCtrl;
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL vsInfoFrameCtrl = { };
NvModeTimings modeTimings = pKmsMode->timings;
const NVT_TIMING *pTiming;
@@ -1981,6 +2038,7 @@ static NvBool ConstructModeTimingsMetaData(
*/
if (nvDpyIsHdmiEvo(pDpyEvo)) {
NvTiming_ConstructVideoInfoframeCtrl(&timing, &infoFrameCtrl);
ConstructVSInfoFrameCtrls(&timing, hdmi3D, &vsInfoFrameCtrl);
}
goto done;
@@ -2000,7 +2058,12 @@ static NvBool ConstructModeTimingsMetaData(
done:
*pFlags = flags;
*pInfoFrameCtrl = infoFrameCtrl;
if (pInfoFrameCtrl != NULL) {
*pInfoFrameCtrl = infoFrameCtrl;
}
if (pVSInfoFrameCtrl != NULL) {
*pVSInfoFrameCtrl = vsInfoFrameCtrl;
}
pKmsMode->timings = modeTimings;
return TRUE;
@@ -2024,11 +2087,11 @@ NvBool nvValidateModeForModeset(NVDpyEvoRec *pDpyEvo,
const struct NvKmsRect *pViewPortOut,
NVDpyAttributeColor *pDpyColor,
NVHwModeTimingsEvo *pTimingsEvo,
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl)
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl,
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pVSInfoFrameCtrl)
{
EvoValidateModeFlags flags;
struct NvKmsMode kmsMode = *pKmsMode;
NVT_VIDEO_INFOFRAME_CTRL infoFrameCtrl;
struct NvKmsModeValidationValidSyncs dummyValidSyncs;
nvkms_memset(pTimingsEvo, 0, sizeof(*pTimingsEvo));
@@ -2037,7 +2100,8 @@ NvBool nvValidateModeForModeset(NVDpyEvoRec *pDpyEvo,
pParams,
&kmsMode,
&flags,
&infoFrameCtrl)) {
pInfoFrameCtrl,
pVSInfoFrameCtrl)) {
return FALSE;
}
@@ -2062,9 +2126,5 @@ NvBool nvValidateModeForModeset(NVDpyEvoRec *pDpyEvo,
return FALSE;
}
if (pInfoFrameCtrl != NULL) {
*pInfoFrameCtrl = infoFrameCtrl;
}
return TRUE;
}

View File

@@ -180,7 +180,8 @@ nvGetHwModeTimings(const NVDispEvoRec *pDispEvo,
const struct NvKmsSetModeOneHeadRequest *pRequestHead,
NVHwModeTimingsEvo *pTimings,
NVDpyAttributeColor *pDpyColor,
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl)
NVT_VIDEO_INFOFRAME_CTRL *pInfoFrameCtrl,
NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pVSInfoFrameCtrl)
{
NVDpyEvoPtr pDpyEvo;
NVDpyAttributeColor dpyColor = { };
@@ -208,7 +209,8 @@ nvGetHwModeTimings(const NVDispEvoRec *pDispEvo,
&pRequestHead->viewPortOut : NULL,
&dpyColor,
pTimings,
pInfoFrameCtrl)) {
pInfoFrameCtrl,
pVSInfoFrameCtrl)) {
return FALSE;
}
@@ -1128,7 +1130,8 @@ AssignProposedModeSetHwState(NVDevEvoRec *pDevEvo,
pRequestHead,
&pProposedApiHead->timings,
&pProposedApiHead->attributes.color,
&pProposedApiHead->infoFrame.ctrl)) {
&pProposedApiHead->infoFrame.ctrl,
&pProposedApiHead->infoFrame.vendorSpecificCtrl)) {
pReply->disp[sd].head[apiHead].status =
NVKMS_SET_MODE_ONE_HEAD_STATUS_INVALID_MODE;
ret = FALSE;