mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-02-05 07:39:57 +00:00
535.43.02
This commit is contained in:
@@ -315,7 +315,8 @@ NvHdmi_QueryFRLConfig(NvHdmiPkt_Handle libHandle,
|
||||
}
|
||||
|
||||
// if there is no FRL capability reported fail this call
|
||||
if (pSinkCaps->linkMaxFRLRate == HDMI_FRL_DATA_RATE_NONE)
|
||||
if ((pSrcCaps->linkMaxFRLRate == HDMI_FRL_DATA_RATE_NONE) ||
|
||||
(pSinkCaps->linkMaxFRLRate == HDMI_FRL_DATA_RATE_NONE))
|
||||
{
|
||||
return NVHDMIPKT_FAIL;
|
||||
}
|
||||
|
||||
@@ -573,12 +573,13 @@ hdmiPacketWrite9171(NVHDMIPKT_CLASS* pThis,
|
||||
packetLen == 0 || pPacketIn == 0 || pktType9171 == NVHDMIPKT_9171_INVALID_PKT_TYPE)
|
||||
{
|
||||
result = NVHDMIPKT_INVALID_ARG;
|
||||
NvHdmiPkt_Print(pThis, "Invalid arg");
|
||||
goto hdmiPacketWrite9171_exit;
|
||||
}
|
||||
|
||||
if ((result = validateInputPacketLength(pktType9171, packetLen, pPacketIn)) != NVHDMIPKT_SUCCESS)
|
||||
{
|
||||
NvHdmiPkt_Print(pThis, "ERROR - input packet length incorrect");
|
||||
NvHdmiPkt_Print(pThis, "ERROR - input packet length incorrect %d", packetLen);
|
||||
NvHdmiPkt_Assert(0);
|
||||
goto hdmiPacketWrite9171_exit;
|
||||
}
|
||||
|
||||
@@ -460,6 +460,7 @@ static NvBool evaluateIsDSCPossible(NVHDMIPKT_CLASS *pThis,
|
||||
#endif // NVHDMIPKT_RM_CALLS_INTERNAL
|
||||
{
|
||||
bIsDSCPossible = pGetHdmiFrlCapacityComputationParams->dsc.bIsDSCPossible;
|
||||
*pFRLParams = pGetHdmiFrlCapacityComputationParams->input;
|
||||
}
|
||||
|
||||
pThis->callback.free(pThis->cbHandle, pGetHdmiFrlCapacityComputationParams);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -275,7 +275,7 @@ typedef struct _tagDISPLAYID_2_0_TIMING_7_BLOCK
|
||||
|
||||
#define DISPLAYID_2_0_TIMING_DSC_PASSTHRU_TIMING 1
|
||||
|
||||
// the following fields apply to Timing Descriptors 7 (Not all of them are
|
||||
// the following fields apply to Timing 7 Descriptors (Not all of them are
|
||||
// used per descriptor, but the format is the same
|
||||
#define DISPLAYID_2_0_TIMING_ASPECT_RATIO_1_1 0
|
||||
#define DISPLAYID_2_0_TIMING_ASPECT_RATIO_5_4 1
|
||||
@@ -308,29 +308,15 @@ typedef struct _tagDISPLAYID_2_0_TIMING_8_BLOCK_HEADER
|
||||
NvU8 data_bytes; // Values range from 1(0x01) to 248(0xF8)
|
||||
} DISPLAYID_2_0_TIMING_8_BLOCK_HEADER;
|
||||
|
||||
typedef struct _tagDISPLAYID_2_0_TIMING_8_ONE_BYTE_CODE
|
||||
{
|
||||
NvU8 timing_code;
|
||||
} DISPLAYID_2_0_TIMING_8_ONE_BYTE_CODE;
|
||||
|
||||
typedef struct _tagDISPLAYID_2_0_TIMING_8_TWO_BYTE_CODE
|
||||
{
|
||||
NvU8 timing_code[2];
|
||||
} DISPLAYID_2_0_TIMING_8_TWO_BYTE_CODE;
|
||||
|
||||
#define DISPLAYID_2_0_TIMING_8_MAX_CODES 248
|
||||
|
||||
typedef struct _tagDISPLAYID_2_0_TIMING_8_BLOCK
|
||||
{
|
||||
DISPLAYID_2_0_TIMING_8_BLOCK_HEADER header;
|
||||
|
||||
union
|
||||
{
|
||||
DISPLAYID_2_0_TIMING_8_ONE_BYTE_CODE timing_code_1[DISPLAYID_2_0_TIMING_8_MAX_CODES];
|
||||
DISPLAYID_2_0_TIMING_8_TWO_BYTE_CODE timing_code_2[DISPLAYID_2_0_TIMING_8_MAX_CODES / 2];
|
||||
};
|
||||
NvU8 timingCode[DISPLAYID_2_0_TIMING_8_MAX_CODES];
|
||||
} DISPLAYID_2_0_TIMING_8_BLOCK;
|
||||
|
||||
// the following fields apply to Timing 8 Descriptors
|
||||
#define DISPLAYID_2_0_TIMING_CODE_DMT 0
|
||||
#define DISPLAYID_2_0_TIMING_CODE_CTA_VIC 1
|
||||
#define DISPLAYID_2_0_TIMING_CODE_HDMI_VIC 2
|
||||
@@ -353,6 +339,7 @@ typedef struct _TAG_DISPLAYID_2_0_TIMING_9_DESCRIPTOR
|
||||
NvU8 refresh_rate; // 1 Hz to 256 Hz
|
||||
} DISPLAYID_2_0_TIMING_9_DESCRIPTOR;
|
||||
|
||||
// the following fields apply to Timing 9/10 Descriptors
|
||||
#define DISPLAYID_2_0_TIMING_FORMULA_CVT_1_2_STANDARD 0
|
||||
#define DISPLAYID_2_0_TIMING_FORMULA_CVT_1_2_REDUCED_BLANKING_1 1
|
||||
#define DISPLAYID_2_0_TIMING_FORMULA_CVT_2_0_REDUCED_BLANKING_2 2
|
||||
@@ -384,8 +371,8 @@ typedef struct _DISPLAYID_2_0_TIMING_10_6BYTES_DESCRIPTOR
|
||||
{
|
||||
struct {
|
||||
NvU8 timing_formula :3;
|
||||
NvU8 early_vsync :1;
|
||||
NvU8 rr1000div1001_or_hblank :1;
|
||||
NvU8 early_vsync :1;
|
||||
NvU8 rr1000div1001_or_hblank :1;
|
||||
NvU8 stereo_support :2;
|
||||
NvU8 ycc420_support :1;
|
||||
} options;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -61,7 +61,6 @@ static NVT_STATUS parseDisplayId20CtaData(const DISPLAYID_2_0_DATA_BLOCK_HEADER
|
||||
|
||||
// Helper function
|
||||
static NVT_STATUS getPrimaryUseCase(NvU8 product_type, NVT_DISPLAYID_PRODUCT_PRIMARY_USE_CASE *primary_use_case);
|
||||
static NVT_STATUS parseDisplayId20Timing7Descriptor(const DISPLAYID_2_0_TIMING_7_DESCRIPTOR *pDescriptor, NVT_TIMING *pTiming, NvU8 revision, NvU8 count);
|
||||
static NVT_STATUS parseDisplayId20Timing9Descriptor(const DISPLAYID_2_0_TIMING_9_DESCRIPTOR *pDescriptor, NVT_TIMING *pTiming, NvU8 count);
|
||||
static NvU32 greatestCommonDenominator(NvU32 x, NvU32 y);
|
||||
static NvU8 getExistedTimingSeqNumber(NVT_DISPLAYID_2_0_INFO *pDisplayIdInfo, enum NVT_TIMING_TYPE);
|
||||
@@ -625,6 +624,7 @@ parseDisplayId20Timing7(
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
|
||||
revision = pTiming7Block->header.revision;
|
||||
descriptorCount = pDataBlock->data_bytes / (sizeof(DISPLAYID_2_0_TIMING_7_DESCRIPTOR) + pTiming7Block->header.payload_bytes_len);
|
||||
|
||||
if (descriptorCount < 1 || descriptorCount > DISPLAYID_2_0_TIMING_7_MAX_DESCRIPTORS)
|
||||
@@ -641,8 +641,36 @@ parseDisplayId20Timing7(
|
||||
for (i = 0; i < descriptorCount; i++)
|
||||
{
|
||||
NVMISC_MEMSET(&newTiming, 0, sizeof(newTiming));
|
||||
if (parseDisplayId20Timing7Descriptor(&pTiming7Block->descriptors[i], &newTiming, revision, startSeqNumber+i) == NVT_STATUS_SUCCESS)
|
||||
if (parseDisplayId20Timing7Descriptor(&pTiming7Block->descriptors[i], &newTiming, startSeqNumber+i) == NVT_STATUS_SUCCESS)
|
||||
{
|
||||
newTiming.etc.flag |= (revision >= DISPLAYID_2_0_TYPE7_DSC_PASSTHRU_REVISION && pTiming7Block->header.dsc_passthrough == 1) ?
|
||||
NVT_FLAG_DISPLAYID_T7_DSC_PASSTHRU :
|
||||
0;
|
||||
|
||||
if (revision >= DISPLAYID_2_0_TYPE7_YCC420_SUPPORT_REVISION)
|
||||
{
|
||||
newTiming.etc.flag |= pTiming7Block->descriptors[i].options.is_preferred_or_ycc420 ? NVT_FLAG_DISPLAYID_T7_T8_EXPLICT_YUV420 : 0;
|
||||
|
||||
if (pTiming7Block->descriptors[i].options.is_preferred_or_ycc420) // YCC 420 support
|
||||
{
|
||||
UPDATE_BPC_FOR_COLORFORMAT(newTiming.etc.yuv420, 0, 1, 1, 1, 0, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
newTiming.etc.flag |= pTiming7Block->descriptors[i].options.is_preferred_or_ycc420 ? NVT_FLAG_DISPLAYID_DTD_PREFERRED_TIMING : 0;
|
||||
}
|
||||
|
||||
NVT_SNPRINTF((char *)newTiming.etc.name, sizeof(newTiming.etc.name), "DID20-Type7:#%2d:%dx%dx%3d.%03dHz/%s",
|
||||
(int)NVT_GET_TIMING_STATUS_SEQ(newTiming.etc.status),
|
||||
(int)newTiming.HVisible,
|
||||
(int)((newTiming.interlaced ? 2 : 1)*newTiming.VVisible),
|
||||
(int)newTiming.etc.rrx1k/1000,
|
||||
(int)newTiming.etc.rrx1k%1000,
|
||||
(newTiming.interlaced ? "I":"P"));
|
||||
newTiming.etc.name[sizeof(newTiming.etc.name) - 1] = '\0';
|
||||
newTiming.etc.rep = 0x1;
|
||||
|
||||
if (!assignNextAvailableDisplayId20Timing(pDisplayIdInfo, &newTiming))
|
||||
{
|
||||
break;
|
||||
@@ -667,80 +695,50 @@ parseDisplayId20Timing8(
|
||||
NVT_STATUS status = NVT_STATUS_SUCCESS;
|
||||
const DISPLAYID_2_0_TIMING_8_BLOCK *pTiming8Block = NULL;
|
||||
NVT_TIMING newTiming;
|
||||
NvU8 codeType = DISPLAYID_2_0_TIMING_CODE_RSERVED;
|
||||
|
||||
NvU8 codeCount = 0;
|
||||
NvU8 startSeqNumber = 0;
|
||||
NvU8 i;
|
||||
|
||||
pTiming8Block = (const DISPLAYID_2_0_TIMING_8_BLOCK *)pDataBlock;
|
||||
codeCount = pDataBlock->data_bytes;
|
||||
|
||||
// 1-byte descriptor timing code
|
||||
if (pTiming8Block->header.timing_code_size == DISPLAYID_2_0_TIMING_CODE_SIZE_1_BYTE)
|
||||
if (codeCount == 0)
|
||||
{
|
||||
if (pDataBlock->data_bytes % sizeof(DISPLAYID_2_0_TIMING_8_ONE_BYTE_CODE) != 0)
|
||||
{
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
nvt_assert(0 && "No available byte code!");
|
||||
return NVT_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
codeCount = pDataBlock->data_bytes / sizeof(DISPLAYID_2_0_TIMING_8_ONE_BYTE_CODE);
|
||||
if (codeCount < 1 || codeCount > DISPLAYID_2_0_TIMING_8_MAX_CODES)
|
||||
if (codeCount > DISPLAYID_2_0_TIMING_8_MAX_CODES)
|
||||
{
|
||||
nvt_assert(0 && "one byte code is out of range!");
|
||||
return NVT_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (pDisplayIdInfo != NULL)
|
||||
{
|
||||
startSeqNumber = getExistedTimingSeqNumber(pDisplayIdInfo, NVT_TYPE_DISPLAYID_8);
|
||||
}
|
||||
|
||||
for (i = 0; i < codeCount; i++)
|
||||
{
|
||||
NVMISC_MEMSET(&newTiming, 0, sizeof(newTiming));
|
||||
|
||||
if (parseDisplayId20Timing8Descriptor(&pTiming8Block->timingCode, &newTiming,
|
||||
pTiming8Block->header.timing_code_type,
|
||||
pTiming8Block->header.timing_code_size, i, startSeqNumber+i) == NVT_STATUS_SUCCESS)
|
||||
{
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
|
||||
codeType = pTiming8Block->header.timing_code_type;
|
||||
|
||||
if (pDisplayIdInfo != NULL)
|
||||
{
|
||||
startSeqNumber = getExistedTimingSeqNumber(pDisplayIdInfo, NVT_TYPE_DISPLAYID_8);
|
||||
}
|
||||
|
||||
for (i = 0; i < codeCount; i++)
|
||||
{
|
||||
NVMISC_MEMSET(&newTiming, 0, sizeof(newTiming));
|
||||
|
||||
if (codeType == DISPLAYID_2_0_TIMING_CODE_DMT)
|
||||
{
|
||||
if (NvTiming_EnumDMT((NvU32)(pTiming8Block->timing_code_1[i].timing_code),
|
||||
&newTiming) != NVT_STATUS_SUCCESS)
|
||||
{
|
||||
if (pDisplayIdInfo == NULL) return NVT_STATUS_ERR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (codeType == DISPLAYID_2_0_TIMING_CODE_CTA_VIC)
|
||||
{
|
||||
if (NvTiming_EnumCEA861bTiming((NvU32)(pTiming8Block->timing_code_1[i].timing_code),
|
||||
&newTiming) != NVT_STATUS_SUCCESS)
|
||||
{
|
||||
if (pDisplayIdInfo == NULL) return NVT_STATUS_ERR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (codeType == DISPLAYID_2_0_TIMING_CODE_HDMI_VIC)
|
||||
{
|
||||
if (NvTiming_EnumHdmiVsdbExtendedTiming((NvU32)(pTiming8Block->timing_code_1[i].timing_code),
|
||||
&newTiming) != NVT_STATUS_SUCCESS)
|
||||
{
|
||||
if (pDisplayIdInfo == NULL) return NVT_STATUS_ERR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// RESERVED
|
||||
break;
|
||||
}
|
||||
|
||||
newTiming.etc.flag |= ((pTiming8Block->header.revision >= 1) && pTiming8Block->header.is_support_yuv420) ? NVT_FLAG_DISPLAYID_T7_T8_EXPLICT_YUV420 : 0;
|
||||
newTiming.etc.status = NVT_STATUS_DISPLAYID_8N(++startSeqNumber);
|
||||
newTiming.etc.flag |= ((pTiming8Block->header.revision == 1) && pTiming8Block->header.is_support_yuv420) ?
|
||||
NVT_FLAG_DISPLAYID_T7_T8_EXPLICT_YUV420 :
|
||||
0;
|
||||
|
||||
NVT_SNPRINTF((char *)newTiming.etc.name, sizeof(newTiming.etc.name), "DID20-Type8:#%3d:%dx%dx%3d.%03dHz/%s",
|
||||
(int)NVT_GET_TIMING_STATUS_SEQ(newTiming.etc.status),
|
||||
(int)newTiming.HVisible, (int)newTiming.VVisible,
|
||||
(int)newTiming.etc.rrx1k/1000, (int)newTiming.etc.rrx1k%1000,
|
||||
(newTiming.interlaced ? "I":"P"));
|
||||
(int)NVT_GET_TIMING_STATUS_SEQ(newTiming.etc.status),
|
||||
(int)newTiming.HVisible, (int)newTiming.VVisible,
|
||||
(int)newTiming.etc.rrx1k/1000, (int)newTiming.etc.rrx1k%1000,
|
||||
(newTiming.interlaced ? "I":"P"));
|
||||
newTiming.etc.name[sizeof(newTiming.etc.name) - 1] = '\0';
|
||||
newTiming.etc.rep = 0x1;
|
||||
|
||||
if (!assignNextAvailableDisplayId20Timing(pDisplayIdInfo, &newTiming))
|
||||
{
|
||||
@@ -748,11 +746,6 @@ parseDisplayId20Timing8(
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nvt_assert(0);
|
||||
// TODO : 2-byte descriptor timing code did not define yet in DID20.
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -859,11 +852,11 @@ parseDisplayId20Timing10(
|
||||
|
||||
for (i = 0; i < descriptorCount; i++)
|
||||
{
|
||||
startSeqNumber += i;
|
||||
NVMISC_MEMSET(&newTiming, 0, sizeof(newTiming));
|
||||
if (NVT_STATUS_SUCCESS == parseDisplayId20Timing10Descriptor(&pTiming10Block->descriptors[i*eachOfDescriptorsSize],
|
||||
&newTiming,
|
||||
pTiming10Block->header.payload_bytes_len))
|
||||
pTiming10Block->header.payload_bytes_len,
|
||||
startSeqNumber+i))
|
||||
{
|
||||
p6bytesDescriptor = (const DISPLAYID_2_0_TIMING_10_6BYTES_DESCRIPTOR *)&pTiming10Block->descriptors[i*eachOfDescriptorsSize];
|
||||
|
||||
@@ -894,8 +887,8 @@ parseDisplayId20Timing10(
|
||||
(newTiming.interlaced ? "I":"P"));
|
||||
|
||||
}
|
||||
newTiming.etc.status = NVT_STATUS_DISPLAYID_10N(++startSeqNumber);
|
||||
newTiming.etc.name[sizeof(newTiming.etc.name) - 1] = '\0';
|
||||
newTiming.etc.rep = 0x1;
|
||||
|
||||
if (!assignNextAvailableDisplayId20Timing(pDisplayIdInfo, &newTiming))
|
||||
{
|
||||
@@ -1417,9 +1410,9 @@ parseDisplayId20CtaData(
|
||||
parseCea861Hdr10PlusDataBlock(p861Info, pDisplayIdInfo, FROM_DISPLAYID_20_DATA_BLOCK);
|
||||
|
||||
// CEA861-F at 7.5.12 section about VFPDB block.
|
||||
if (p861Info->total_vfpdb > 0)
|
||||
if (p861Info->total_svr > 0)
|
||||
{
|
||||
parse861bShortPreferredTiming(p861Info, pDisplayIdInfo, FROM_DISPLAYID_20_DATA_BLOCK);
|
||||
parseCta861NativeOrPreferredTiming(p861Info, pDisplayIdInfo, FROM_DISPLAYID_20_DATA_BLOCK);
|
||||
}
|
||||
|
||||
return status;
|
||||
@@ -1532,16 +1525,19 @@ assignNextAvailableDisplayId20Timing(
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
static NVT_STATUS
|
||||
NVT_STATUS
|
||||
parseDisplayId20Timing7Descriptor(
|
||||
const DISPLAYID_2_0_TIMING_7_DESCRIPTOR *pDescriptor,
|
||||
const void *pVoidDescriptor,
|
||||
NVT_TIMING *pTiming,
|
||||
NvU8 revision,
|
||||
NvU8 count)
|
||||
{
|
||||
NVT_STATUS status = NVT_STATUS_SUCCESS;
|
||||
NvU32 gdc = 0;
|
||||
|
||||
const DISPLAYID_2_0_TIMING_7_DESCRIPTOR *pDescriptor = NULL;
|
||||
|
||||
pDescriptor = (const DISPLAYID_2_0_TIMING_7_DESCRIPTOR *)pVoidDescriptor;
|
||||
|
||||
// pclk is in 10Khz
|
||||
// pixel_clock is in kHz
|
||||
pTiming->pclk = ((pDescriptor->pixel_clock[2] << 16 |
|
||||
@@ -1636,36 +1632,63 @@ parseDisplayId20Timing7Descriptor(
|
||||
pTiming->etc.rrx1k = NvTiming_CalcRRx1k(pTiming->pclk,
|
||||
pTiming->interlaced,
|
||||
pTiming->HTotal,
|
||||
pTiming->VTotal);
|
||||
pTiming->VTotal);
|
||||
|
||||
pTiming->etc.flag |= (revision >= DISPLAYID_2_0_TYPE7_DSC_PASSTHRU_REVISION ) ? NVT_FLAG_DISPLAYID_T7_DSC_PASSTHRU : 0;
|
||||
pTiming->etc.status = NVT_STATUS_DISPLAYID_7N(++count);
|
||||
|
||||
if (revision >= DISPLAYID_2_0_TYPE7_YCC420_SUPPORT_REVISION)
|
||||
return status;
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
NVT_STATUS
|
||||
parseDisplayId20Timing8Descriptor(
|
||||
const void *pVoidDescriptor,
|
||||
NVT_TIMING *pTiming,
|
||||
NvU8 codeType,
|
||||
NvU8 codeSize,
|
||||
NvU8 idx,
|
||||
NvU8 count)
|
||||
{
|
||||
NVT_STATUS status = NVT_STATUS_SUCCESS;
|
||||
|
||||
const NvU8 *pTimingCode = (const NvU8 *)pVoidDescriptor;
|
||||
const NvU16 *pTiming2ByteCode = (const NvU16 *)pVoidDescriptor;
|
||||
|
||||
if (codeSize == DISPLAYID_2_0_TIMING_CODE_SIZE_1_BYTE)
|
||||
{
|
||||
pTiming->etc.flag |= pDescriptor->options.is_preferred_or_ycc420 ? NVT_FLAG_DISPLAYID_T7_T8_EXPLICT_YUV420 : 0;
|
||||
|
||||
if (pDescriptor->options.is_preferred_or_ycc420) // YCC 420 support
|
||||
switch (codeType)
|
||||
{
|
||||
UPDATE_BPC_FOR_COLORFORMAT(pTiming->etc.yuv420, 0, 1, 1, 1, 0, 1);
|
||||
case DISPLAYID_2_0_TIMING_CODE_DMT: //single-byte DMT ID Codes
|
||||
status = NvTiming_EnumDMT((NvU32)(pTimingCode[idx]), pTiming);
|
||||
break;
|
||||
case DISPLAYID_2_0_TIMING_CODE_CTA_VIC:
|
||||
status = NvTiming_EnumCEA861bTiming((NvU32)(pTimingCode[idx]), pTiming);
|
||||
break;
|
||||
case DISPLAYID_2_0_TIMING_CODE_HDMI_VIC:
|
||||
status = NvTiming_EnumHdmiVsdbExtendedTiming((NvU32)(pTimingCode[idx]), pTiming);
|
||||
break;
|
||||
default:
|
||||
{
|
||||
nvt_assert(0 && "RESERVED timing code type");
|
||||
status = NVT_STATUS_ERR;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (codeSize == DISPLAYID_2_0_TIMING_CODE_SIZE_2_BYTE)
|
||||
{
|
||||
pTiming->etc.flag |= pDescriptor->options.is_preferred_or_ycc420 ? NVT_FLAG_DISPLAYID_DTD_PREFERRED_TIMING : 0;
|
||||
// Standard two-byte codes
|
||||
if (codeType == DISPLAYID_2_0_TIMING_CODE_DMT)
|
||||
{
|
||||
status = NvTiming_EnumStdTwoBytesCode((NvU16)pTiming2ByteCode[idx], pTiming);
|
||||
}
|
||||
}
|
||||
|
||||
pTiming->etc.status = NVT_STATUS_DISPLAYID_7N(++count);
|
||||
|
||||
NVT_SNPRINTF((char *)pTiming->etc.name, sizeof(pTiming->etc.name), "DID20-Type7:#%2d:%dx%dx%3d.%03dHz/%s",
|
||||
(int)NVT_GET_TIMING_STATUS_SEQ(pTiming->etc.status),
|
||||
(int)pTiming->HVisible,
|
||||
(int)((pTiming->interlaced ? 2 : 1)*pTiming->VVisible),
|
||||
(int)pTiming->etc.rrx1k/1000,
|
||||
(int)pTiming->etc.rrx1k%1000,
|
||||
(pTiming->interlaced ? "I":"P"));
|
||||
pTiming->etc.name[sizeof(pTiming->etc.name) - 1] = '\0';
|
||||
|
||||
pTiming->etc.rep = 0x1;
|
||||
if (status == NVT_STATUS_SUCCESS)
|
||||
{
|
||||
pTiming->etc.status = NVT_STATUS_DISPLAYID_8N(++count);
|
||||
return status;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -1733,6 +1756,7 @@ parseDisplayId20Timing9Descriptor(
|
||||
}
|
||||
}
|
||||
pTiming->etc.name[sizeof(pTiming->etc.name) - 1] = '\0';
|
||||
pTiming->etc.rep = 0x1;
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -1742,7 +1766,8 @@ NVT_STATUS
|
||||
parseDisplayId20Timing10Descriptor(
|
||||
const void *pDescriptor,
|
||||
NVT_TIMING *pTiming,
|
||||
NvU8 payloadBytes)
|
||||
NvU8 payloadBytes,
|
||||
NvU8 count)
|
||||
{
|
||||
NVT_STATUS status = NVT_STATUS_SUCCESS;
|
||||
const DISPLAYID_2_0_TIMING_10_6BYTES_DESCRIPTOR* p6bytesDescriptor = NULL;
|
||||
@@ -1810,7 +1835,11 @@ parseDisplayId20Timing10Descriptor(
|
||||
break;
|
||||
}
|
||||
|
||||
if (status == NVT_STATUS_SUCCESS) return status;
|
||||
if (status == NVT_STATUS_SUCCESS)
|
||||
{
|
||||
pTiming->etc.status = NVT_STATUS_DISPLAYID_10N(++count);
|
||||
return status;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
PUSH_SEGMENTS
|
||||
|
||||
// DMT table
|
||||
// DMT table 2-1
|
||||
// Macro to declare a TIMING initializer for given parameters without border
|
||||
#define DMT_TIMING(hv,hfp,hsw,ht,hsp,vv,vfp,vsw,vt,vsp,rr,pclk,id) \
|
||||
{hv,0,hfp,hsw,ht,(hsp)=='-',vv,0,vfp,vsw,vt,(vsp)=='-',NVT_PROGRESSIVE,pclk,{0,rr,set_rrx1k(pclk,ht,vt),0,0x1,{0},{0},{0},{0},NVT_DEF_TIMING_STATUS(NVT_TYPE_DMT,id),"VESA DMT"}}
|
||||
@@ -192,6 +192,43 @@ NVT_STATUS NvTiming_EnumDMT(NvU32 dmtId, NVT_TIMING *pT)
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
NVT_STATUS NvTiming_EnumStdTwoBytesCode(NvU16 std2ByteCode, NVT_TIMING *pT)
|
||||
{
|
||||
NvU32 aspect, width, height, rr;
|
||||
|
||||
if ((pT == NULL) || (std2ByteCode == 0))
|
||||
{
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
|
||||
// The value in the EDID = (Horizontal active pixels/8) - 31
|
||||
width = (std2ByteCode & 0x0FF) + 31;
|
||||
width <<= 3;
|
||||
rr = ((std2ByteCode >> 8) & 0x3F) + 60; // bits 5->0
|
||||
|
||||
// get the height
|
||||
aspect = ((std2ByteCode >> 8) & 0xC0); // aspect ratio at bit 7:6
|
||||
|
||||
if (aspect == 0x00) height = width * 5 / 8; // 16:10
|
||||
else if (aspect == 0x40) height = width * 3 / 4; // 4:3
|
||||
else if (aspect == 0x80) height = width * 4 / 5; // 5:4
|
||||
else height = width * 9 / 16; // 16:9
|
||||
|
||||
// try to get the timing from DMT or DMT_RB
|
||||
if (NvTiming_CalcDMT(width, height, rr, 0, pT) == NVT_STATUS_SUCCESS)
|
||||
{
|
||||
return NVT_STATUS_SUCCESS;
|
||||
}
|
||||
// try to get the timing from DMT_RB2
|
||||
else if (NvTiming_CalcDMT_RB2(width, height, rr, 0, pT) == NVT_STATUS_SUCCESS)
|
||||
{
|
||||
return NVT_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
NVT_STATUS NvTiming_CalcDMT(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT_TIMING *pT)
|
||||
{
|
||||
@@ -269,4 +306,42 @@ NVT_STATUS NvTiming_CalcDMT_RB(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag,
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
NVT_STATUS NvTiming_CalcDMT_RB2(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT_TIMING *pT)
|
||||
{
|
||||
NVT_TIMING *p = (NVT_TIMING *)DMT;
|
||||
|
||||
if (pT == NULL)
|
||||
return NVT_STATUS_ERR;
|
||||
|
||||
if (width == 0 || height == 0 || rr == 0)
|
||||
return NVT_STATUS_ERR;
|
||||
|
||||
// no interlaced DMT timing
|
||||
if ((flag & NVT_PVT_INTERLACED_MASK) != 0)
|
||||
return NVT_STATUS_ERR;
|
||||
|
||||
while (p->HVisible != 0 && p->VVisible != 0)
|
||||
{
|
||||
// select only reduced-bandwidth timing.
|
||||
if (NVT_GET_TIMING_STATUS_TYPE(p->etc.status) == NVT_TYPE_DMT_RB_2)
|
||||
{
|
||||
if ((NvU32)p->HVisible == width &&
|
||||
(NvU32)p->VVisible == height &&
|
||||
(NvU32)p->etc.rr == rr)
|
||||
{
|
||||
NVMISC_MEMSET(pT, 0, sizeof(NVT_TIMING));
|
||||
*pT = *p;
|
||||
pT->etc.rrx1k = axb_div_c((NvU32)pT->pclk, (NvU32)10000*(NvU32)1000, (NvU32)pT->HTotal*(NvU32)pT->VTotal);
|
||||
NVT_SNPRINTF((char *)pT->etc.name, 40, "DMT-RB2:%dx%dx%dHz",width, height, rr);
|
||||
pT->etc.name[39] = '\0';
|
||||
pT->etc.rgb444.bpc.bpc8 = 1;
|
||||
return NVT_STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
p ++;
|
||||
}
|
||||
return NVT_STATUS_ERR;
|
||||
}
|
||||
|
||||
POP_SEGMENTS
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -1079,15 +1079,17 @@ NVT_STATUS NV_STDCALL NvTiming_ParseEDIDInfo(NvU8 *pEdid, NvU32 length, NVT_EDID
|
||||
// add the detailed timings in 18-byte long display descriptor
|
||||
parse861ExtDetailedTiming(pExt, p861Info->basic_caps, pInfo);
|
||||
|
||||
if (p861Info->revision >= NVT_CTA861_REV_H && p861Info->total_did_type10db != 0)
|
||||
if (p861Info->revision >= NVT_CTA861_REV_H)
|
||||
{
|
||||
parseCta861DIDType10VideoTimingDataBlock(p861Info, pInfo);
|
||||
if (p861Info->total_did_type7db != 0) parseCta861DIDType7VideoTimingDataBlock(p861Info, pInfo);
|
||||
if (p861Info->total_did_type8db != 0) parseCta861DIDType8VideoTimingDataBlock(p861Info, pInfo);
|
||||
if (p861Info->total_did_type10db != 0) parseCta861DIDType10VideoTimingDataBlock(p861Info, pInfo);
|
||||
}
|
||||
|
||||
// CEA861-F at 7.5.12 section about VFPDB block.
|
||||
if (p861Info->revision >= NVT_CEA861_REV_F && p861Info->total_vfpdb != 0)
|
||||
if (p861Info->revision >= NVT_CEA861_REV_F && (p861Info->total_svr != 0 || p861Info->valid.NVRDB == 1))
|
||||
{
|
||||
parse861bShortPreferredTiming(p861Info, pInfo, FROM_CTA861_EXTENSION);
|
||||
parseCta861NativeOrPreferredTiming(p861Info, pInfo, FROM_CTA861_EXTENSION);
|
||||
}
|
||||
|
||||
k++;
|
||||
@@ -1175,6 +1177,27 @@ NVT_STATUS NV_STDCALL NvTiming_ParseEDIDInfo(NvU8 *pEdid, NvU32 length, NVT_EDID
|
||||
// find out the total established timings - base EDID and then the LDDs
|
||||
parseEdidEstablishedTiming(pInfo);
|
||||
|
||||
// remove the T8VTDB timing if it co-existed in standard or established timings
|
||||
if (pInfo->ext861.revision >= NVT_CTA861_REV_H && pInfo->ext861.total_did_type8db != 0 && pInfo->total_timings > 1)
|
||||
{
|
||||
for (i = 0; i < pInfo->total_timings; i++)
|
||||
{
|
||||
if (NVT_GET_TIMING_STATUS_TYPE(pInfo->timing[i].etc.status) == NVT_TYPE_CTA861_DID_T8)
|
||||
{
|
||||
if (isMatchedStandardTiming(pInfo, &pInfo->timing[i]) || isMatchedEstablishedTiming(pInfo, &pInfo->timing[i]))
|
||||
{
|
||||
for (j = i; j < pInfo->total_timings - 1; j++)
|
||||
{
|
||||
// remove the entry by moving the next entry up.
|
||||
pInfo->timing[j] = pInfo->timing[j+1];
|
||||
}
|
||||
NVMISC_MEMSET(&pInfo->timing[pInfo->total_timings-1], 0, sizeof(NVT_TIMING));
|
||||
pInfo->total_timings--; i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getEdidHDM1_4bVsdbTiming(pInfo);
|
||||
|
||||
// Assert if no timings were found (due to a bad EDID) or if we mistakenly
|
||||
@@ -1286,7 +1309,38 @@ void updateColorFormatAndBpcTiming(NVT_EDID_INFO *pInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
NvBool isMatchedStandardTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT)
|
||||
{
|
||||
NvU32 j;
|
||||
|
||||
for (j = 0; j < pInfo->total_timings; j++)
|
||||
{
|
||||
if (NVT_GET_TIMING_STATUS_TYPE(pInfo->timing[j].etc.status) == NVT_TYPE_EDID_STD &&
|
||||
NvTiming_IsTimingRelaxedEqual(&pInfo->timing[j], pT))
|
||||
{
|
||||
return NV_TRUE;
|
||||
}
|
||||
}
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
NvBool isMatchedEstablishedTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT)
|
||||
{
|
||||
NvU32 j;
|
||||
|
||||
for (j = 0; j < pInfo->total_timings; j++)
|
||||
{
|
||||
if (NVT_GET_TIMING_STATUS_TYPE(pInfo->timing[j].etc.status) == NVT_TYPE_EDID_EST &&
|
||||
NvTiming_IsTimingRelaxedEqual(&pInfo->timing[j], pT))
|
||||
{
|
||||
return NV_TRUE;
|
||||
}
|
||||
}
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
CODE_SEGMENT(PAGE_DD_CODE)
|
||||
@@ -1390,7 +1444,7 @@ CODE_SEGMENT(PAGE_DD_CODE)
|
||||
NVT_STATUS NvTiming_GetEdidTimingEx(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT_EDID_INFO *pEdidInfo, NVT_TIMING *pT, NvU32 rrx1k)
|
||||
{
|
||||
NvU32 i, j;
|
||||
NvU32 preferred_cea, preferred_displayid_dtd, preferred_dtd1, dtd1, map0, map1, map2, map3, map4, ceaIndex, max, cvt;
|
||||
NvU32 native_cta, preferred_cta, preferred_displayid_dtd, preferred_dtd1, dtd1, map0, map1, map2, map3, map4, ceaIndex, max, cvt;
|
||||
NVT_TIMING *pEdidTiming;
|
||||
NVT_EDID_DD_RANGE_CVT *pCVT = NULL;
|
||||
NVT_TIMING cvtTiming;
|
||||
@@ -1406,7 +1460,9 @@ NVT_STATUS NvTiming_GetEdidTimingEx(NvU32 width, NvU32 height, NvU32 rr, NvU32 f
|
||||
|
||||
// the timing mapping index :
|
||||
//
|
||||
// preferred_cea - the "prefer SVD" in CEA-861-F (i.e. A Sink that prefers a Video Format that is not listed as an SVD in Video Data Block, but instead listed in YCBCR 4:2:0 VDB)
|
||||
// native_cta - the "native resoluiotn of the sink" in the CTA861.6 A Source shall override any other native video resolution indicators
|
||||
// if the Source supports NVRDB and the NVRDB was found in the E-EDID
|
||||
// preferred_cta - the "prefer SVD" in CTA-861-F (i.e. A Sink that prefers a Video Format that is not listed as an SVD in Video Data Block, but instead listed in YCBCR 4:2:0 VDB)
|
||||
// preferred_displayid_dtd - the "prefer detailed timing of DispalyID" extension
|
||||
// preferred_dtd1 - the first deatiled timing and PTM flag is enable
|
||||
// dtd1 - the first detailed timing
|
||||
@@ -1416,7 +1472,7 @@ NVT_STATUS NvTiming_GetEdidTimingEx(NvU32 width, NvU32 height, NvU32 rr, NvU32 f
|
||||
// map3 - the "closest" match to the panel's native timing (i.e. the first DTD timing or the short 861B/C/D timings with "native" flag).
|
||||
// map4 - the "closest" match with the same refresh rate
|
||||
// max - the timing with the max visible area
|
||||
preferred_cea = preferred_displayid_dtd = preferred_dtd1 = dtd1 = map0 = map1 = map2 = map3 = map4 = ceaIndex = pEdidInfo->total_timings;
|
||||
native_cta = preferred_cta = preferred_displayid_dtd = preferred_dtd1 = dtd1 = map0 = map1 = map2 = map3 = map4 = ceaIndex = pEdidInfo->total_timings;
|
||||
max = cvt = 0;
|
||||
for (i = 0; i < pEdidInfo->total_timings; i++)
|
||||
{
|
||||
@@ -1440,7 +1496,7 @@ NVT_STATUS NvTiming_GetEdidTimingEx(NvU32 width, NvU32 height, NvU32 rr, NvU32 f
|
||||
map0 = i;
|
||||
}
|
||||
|
||||
if ( (NVT_PREFERRED_TIMING_IS_CEA(pEdidTiming[i].etc.flag)) ||
|
||||
if ( (NVT_PREFERRED_TIMING_IS_CTA(pEdidTiming[i].etc.flag)) ||
|
||||
((0 == (flag & NVT_FLAG_EDID_861_ST)) && NVT_PREFERRED_TIMING_IS_DTD1(pEdidTiming[i].etc.flag, pEdidTiming[i].etc.status)) ||
|
||||
(NVT_PREFERRED_TIMING_IS_DISPLAYID(pEdidTiming[i].etc.flag)) ||
|
||||
(NVT_IS_NATIVE_TIMING(pEdidTiming[i].etc.status)))
|
||||
@@ -1479,10 +1535,14 @@ NVT_STATUS NvTiming_GetEdidTimingEx(NvU32 width, NvU32 height, NvU32 rr, NvU32 f
|
||||
}
|
||||
|
||||
// find out the preferred timing just in case of cea_vfpdb is existed
|
||||
if (preferred_cea == pEdidInfo->total_timings &&
|
||||
NVT_PREFERRED_TIMING_IS_CEA(pEdidTiming[i].etc.flag))
|
||||
if (native_cta == pEdidInfo->total_timings && NVT_NATIVE_TIMING_IS_CTA(pEdidTiming[i].etc.flag))
|
||||
{
|
||||
preferred_cea = i;
|
||||
native_cta = i;
|
||||
}
|
||||
|
||||
if (preferred_cta == pEdidInfo->total_timings && NVT_PREFERRED_TIMING_IS_CTA(pEdidTiming[i].etc.flag))
|
||||
{
|
||||
preferred_cta = i;
|
||||
}
|
||||
|
||||
// find out the preferred timing just in case
|
||||
@@ -1741,7 +1801,8 @@ NVT_STATUS NvTiming_GetEdidTimingEx(NvU32 width, NvU32 height, NvU32 rr, NvU32 f
|
||||
if (flag & NVT_FLAG_NV_PREFERRED_TIMING)
|
||||
{
|
||||
*pT = (preferred_displayid_dtd != pEdidInfo->total_timings) ? pEdidTiming[preferred_displayid_dtd] :
|
||||
(preferred_cea != pEdidInfo->total_timings) ? pEdidTiming[preferred_cea] :
|
||||
(native_cta != pEdidInfo->total_timings) ? pEdidTiming[native_cta] :
|
||||
(preferred_cta != pEdidInfo->total_timings) ? pEdidTiming[preferred_cta] :
|
||||
(preferred_dtd1 != pEdidInfo->total_timings) ? pEdidTiming[preferred_dtd1] :
|
||||
pEdidTiming[dtd1];
|
||||
// what if DTD1 itself is filtered out, in such case dtd1 index points to an invalid timing[]?
|
||||
@@ -1998,7 +2059,7 @@ NvU32 NvTiming_EDIDValidationMask(NvU8 *pEdid, NvU32 length, NvBool bIsStrongVal
|
||||
{
|
||||
ret |= NVT_EDID_VALIDATION_ERR_MASK(NVT_EDID_VALIDATION_ERR_VERSION);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// check block 0 checksum value
|
||||
if (!isChecksumValid(pEdid))
|
||||
@@ -2313,7 +2374,7 @@ NvU32 NvTiming_EDIDStrongValidationMask(NvU8 *pEdid, NvU32 length)
|
||||
}
|
||||
else if (ctaBlockTag == NVT_CEA861_TAG_EXTENDED_FLAG)
|
||||
{
|
||||
if (*pData_collection == NVT_CEA861_EXT_TAG_HF_EEODB)
|
||||
if (*pData_collection == NVT_CTA861_EXT_TAG_HF_EEODB)
|
||||
{
|
||||
if ((p->bVersionNumber != 0x01) || (p->bRevisionNumber != 0x03))
|
||||
{
|
||||
@@ -2334,7 +2395,7 @@ NvU32 NvTiming_EDIDStrongValidationMask(NvU8 *pEdid, NvU32 length)
|
||||
else
|
||||
pData_collection += ctaPayload;
|
||||
}
|
||||
else if (ctaBlockTag == NVT_CEA861_TAG_RSVD || ctaBlockTag == NVT_CEA861_TAG_RSVD1)
|
||||
else if (ctaBlockTag == NVT_CEA861_TAG_RSVD)
|
||||
{
|
||||
ret |= NVT_EDID_VALIDATION_ERR_MASK(NVT_EDID_VALIDATION_ERR_EXT_CTA_TAG);
|
||||
pData_collection += ctaPayload;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -1372,9 +1372,9 @@ static NVT_STATUS parseDisplayIdCtaData(NvU8 * block, NVT_EDID_INFO *pInfo)
|
||||
// yuv420-only video
|
||||
parse861bShortYuv420Timing(p861info, pInfo, FROM_DISPLAYID_13_DATA_BLOCK);
|
||||
// CEA861-F at 7.5.12 section about VFPDB block.
|
||||
if (p861info->total_vfpdb != 0)
|
||||
if (p861info->total_svr != 0)
|
||||
{
|
||||
parse861bShortPreferredTiming(p861info, pInfo, FROM_DISPLAYID_13_DATA_BLOCK);
|
||||
parseCta861NativeOrPreferredTiming(p861info, pInfo, FROM_DISPLAYID_13_DATA_BLOCK);
|
||||
}
|
||||
|
||||
return NVT_STATUS_SUCCESS;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//****************************************************************************
|
||||
//
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -278,17 +278,17 @@ typedef enum NVT_TIMING_TYPE
|
||||
NVT_TYPE_CVT_RB, // CVT timing with reduced blanking
|
||||
NVT_TYPE_CUST, // Customized timing
|
||||
NVT_TYPE_EDID_DTD, // EDID detailed timing
|
||||
NVT_TYPE_EDID_STD, // EDID standard timing
|
||||
NVT_TYPE_EDID_STD, // = 10 EDID standard timing
|
||||
NVT_TYPE_EDID_EST, // EDID established timing
|
||||
NVT_TYPE_EDID_CVT, // EDID defined CVT timing (EDID 1.4)
|
||||
NVT_TYPE_EDID_861ST, // EDID defined CEA/EIA 861 timing (in the EDID 861 extension)
|
||||
NVT_TYPE_EDID_861ST, // EDID defined CEA/EIA 861 timing (in the CTA861 extension)
|
||||
NVT_TYPE_NV_PREDEFINED, // NV pre-defined timings (PsF timings)
|
||||
NVT_TYPE_DMT_RB, // DMT timing with reduced blanking
|
||||
NVT_TYPE_EDID_EXT_DTD, // EDID detailed timing in the extension
|
||||
NVT_TYPE_SDTV, // SDTV timing (including NTSC, PAL etc)
|
||||
NVT_TYPE_HDTV, // HDTV timing (480p,480i,720p, 1080i etc)
|
||||
NVT_TYPE_SMPTE, // deprecated ? still used by drivers\unix\nvkms\src\nvkms-dpy.c
|
||||
NVT_TYPE_EDID_VTB_EXT, // EDID defined VTB extension timing
|
||||
NVT_TYPE_EDID_VTB_EXT, // = 20 EDID defined VTB extension timing
|
||||
NVT_TYPE_EDID_VTB_EXT_STD, // EDID defined VTB extension standard timing
|
||||
NVT_TYPE_EDID_VTB_EXT_DTD, // EDID defined VTB extension detailed timing
|
||||
NVT_TYPE_EDID_VTB_EXT_CVT, // EDID defined VTB extension cvt timing
|
||||
@@ -298,13 +298,16 @@ typedef enum NVT_TIMING_TYPE
|
||||
NVT_TYPE_HDMI_EXT, // EDID defined HDMI extended resolution timing (UHDTV - 4k, 8k etc.)
|
||||
NVT_TYPE_CUST_AUTO, // Customized timing generated automatically by NVCPL
|
||||
NVT_TYPE_CUST_MANUAL, // Customized timing entered manually by user
|
||||
NVT_TYPE_CVT_RB_2, // CVT timing with reduced blanking V2
|
||||
NVT_TYPE_CVT_RB_2, // = 30 CVT timing with reduced blanking V2
|
||||
NVT_TYPE_DMT_RB_2, // DMT timing with reduced blanking V2
|
||||
NVT_TYPE_DISPLAYID_7, // DisplayID 2.0 detailed timing - Type VII
|
||||
NVT_TYPE_DISPLAYID_8, // DisplayID 2.0 enumerated timing - Type VIII
|
||||
NVT_TYPE_DISPLAYID_9, // DisplayID 2.0 formula-based timing - Type IX
|
||||
NVT_TYPE_DISPLAYID_10, // DisplayID 2.0 formula-based timing - Type X
|
||||
NVT_TYPE_CVT_RB_3, // CVT timing with reduced blanking V3
|
||||
NVT_TYPE_CTA861_DID_T7, // EDID defined CTA861 DisplayID Type VII timing (in the CTA861 extension)
|
||||
NVT_TYPE_CTA861_DID_T8, // EDID defined CTA861 DisplayID Type VIII timing (in the CTA861 extension)
|
||||
NVT_TYPE_CTA861_DID_T10 // EDID defined CTA861 DisplayID Type X timing (in the CTA861 extension)
|
||||
}NVT_TIMING_TYPE;
|
||||
//
|
||||
// 5. the timing sequence number like the TV format and EIA861B predefined timing format
|
||||
@@ -424,7 +427,9 @@ typedef enum NVT_TV_FORMAT
|
||||
#define NVT_STATUS_DISPLAYID_9N(n) NVT_DEF_TIMING_STATUS(NVT_TYPE_DISPLAYID_9, n)
|
||||
#define NVT_STATUS_DISPLAYID_10N(n) NVT_DEF_TIMING_STATUS(NVT_TYPE_DISPLAYID_10, n)
|
||||
#define NVT_STATUS_HDMI_EXTn(n) NVT_DEF_TIMING_STATUS(NVT_TYPE_HDMI_EXT, n)
|
||||
|
||||
#define NVT_STATUS_CTA861_DID_T7N(n) NVT_DEF_TIMING_STATUS(NVT_TYPE_CTA861_DID_T7, n)
|
||||
#define NVT_STATUS_CTA861_DID_T8N(n) NVT_DEF_TIMING_STATUS(NVT_TYPE_CTA861_DID_T8, n)
|
||||
#define NVT_STATUS_CTA861_DID_T10N(n) NVT_DEF_TIMING_STATUS(NVT_TYPE_CTA861_DID_T10, n)
|
||||
|
||||
//********************************
|
||||
// CEA/EIA 861 related EDID info
|
||||
@@ -456,7 +461,7 @@ typedef enum NVT_TV_FORMAT
|
||||
#define NVT_CEA861_SHORT_DESCRIPTOR_TAG_MASK 0xE0
|
||||
#define NVT_CEA861_SHORT_DESCRIPTOR_TAG_SHIFT 5
|
||||
//
|
||||
// the descriptor type tags
|
||||
// the CTA Tag Codes
|
||||
#define NVT_CEA861_TAG_RSVD 0 // reserved block
|
||||
#define NVT_CEA861_TAG_NONE 0 // reserved block
|
||||
#define NVT_CEA861_TAG_AUDIO 1 // Audio Data Block
|
||||
@@ -476,33 +481,34 @@ typedef enum NVT_TV_FORMAT
|
||||
#define NVT_CEA861_EXT_TAG_COLORIMETRY 5 // Colorimetry Data Block
|
||||
#define NVT_CEA861_EXT_TAG_HDR_STATIC_METADATA 6 // HDR Static Metadata Data Block CEA861.3 HDR extension for HDMI 2.0a
|
||||
#define NVT_CTA861_EXT_TAG_HDR_DYNAMIC_METADATA 7 // CTA861-H HDR Dynamic Metadata Data Block
|
||||
#define NVT_CTA861_EXT_TAG_VIDEO_RSVD_MIN 8 // 8...12 : Reserved for video-related blocks
|
||||
#define NVT_CTA861_EXT_TAG_NATIVE_VIDEO_RESOLUTION 8 // CTA861.6 Native Video Resolution Data Block
|
||||
#define NVT_CTA861_EXT_TAG_VIDEO_RSVD_MIN 9 // 9...12 : Reserved for video-related blocks
|
||||
#define NVT_CTA861_EXT_TAG_VIDEO_RSVD_MAX 12
|
||||
#define NVT_CEA861_EXT_TAG_VIDEO_FORMAT_PREFERENCE 13 // CEA861F Video Format Preference Data Block
|
||||
#define NVT_CEA861_EXT_TAG_YCBCR420_VIDEO 14 // CEA861F YCBCR 4:2:0 Video Data Block
|
||||
#define NVT_CEA861_EXT_TAG_YCBCR420_CAP 15 // CEA861F YCBCR 4:2:0 Capability Map Data Block
|
||||
#define NVT_CEA861_EXT_TAG_MISC_AUDIO 16 // CEA Miscellaneous Audio Fields
|
||||
#define NVT_CEA861_EXT_TAG_VENDOR_SPECIFIC_AUDIO 17 // Vendor-Specific Audio Data Block
|
||||
#define NVT_CEA861_EXT_TAG_HDMI_AUDIO 18 // Reserved for HDMI Audio Data Block
|
||||
#define NVT_CTA861_EXT_TAG_HDMI_AUDIO 18 // Reserved for HDMI Audio Data Block
|
||||
#define NVT_CTA861_EXT_TAG_ROOM_CONFIGURATION 19 // CTA861-H Room Configuration Data Block
|
||||
#define NVT_CTA861_EXT_TAG_SPEACKER_LOCATION 20 // CTA861-H Speaker Location Data Block
|
||||
#define NVT_CTA861_EXT_TAG_AUDIO_RSVD_MIN 21 // 21...31 : Reserved for audio-related blocks
|
||||
#define NVT_CTA861_EXT_TAG_AUDIO_RSVD_MAX 31
|
||||
#define NVT_CEA861_EXT_TAG_INFOFRAME 32 // Infoframe Data Block
|
||||
#define NVT_CEA861_EXT_TAG_RSVD 33 // Reserved
|
||||
#define NVT_CTA861_EXT_TAG_RSVD 33 // Reserved
|
||||
#define NVT_CTA861_EXT_TAG_DID_TYPE_VII 34 // DisplayID Type VII Video Timing Data Block
|
||||
#define NVT_CTA861_EXT_TAG_DID_TYPE_VIII 35 // DisplayID Type VIII Video Timing Data Block
|
||||
#define NVT_CTA861_EXT_TAG_RSVD_MIN_1 36 // 36...41 : Reserved for general
|
||||
#define NVT_CTA861_EXT_TAG_RSVD_MAX_1 41
|
||||
#define NVT_CTA861_EXT_TAG_DID_TYPE_X 42 // DisplayID Type X Video Timing Data Block
|
||||
#define NVT_CTA861_EXT_TAG_RSVD_MIN_2 43 // 43...119 : Reserved for general
|
||||
#define NVT_CEA861_EXT_TAG_RSVD_MAX_2 119
|
||||
#define NVT_CEA861_EXT_TAG_HF_EEODB 120 // HDMI Forum Edid Extension Override Data Block
|
||||
#define NVT_CTA861_EXT_TAG_RSVD_MAX_2 119
|
||||
#define NVT_CTA861_EXT_TAG_HF_EEODB 120 // HDMI Forum Edid Extension Override Data Block
|
||||
#define NVT_CTA861_EXT_TAG_SCDB 121 // 0x79 == Tag for Sink Capability Data Block
|
||||
#define NVT_CEA861_EXT_TAG_HDMI_RSVD_MIN 122 // 122...127 : Reserved for HDMI
|
||||
#define NVT_CEA861_EXT_TAG_HDMI_RSVD_MAX 127
|
||||
#define NVT_CEA861_EXT_TAG_RSVD_MIN_3 128 // 128...255 : Reserved for general
|
||||
#define NVT_CEA861_EXT_TAG_RSVD_MAX_3 255
|
||||
#define NVT_CTA861_EXT_TAG_HDMI_RSVD_MIN 122 // 122...127 : Reserved for HDMI
|
||||
#define NVT_CTA861_EXT_TAG_HDMI_RSVD_MAX 127
|
||||
#define NVT_CTA861_EXT_TAG_RSVD_MIN_3 128 // 128...255 : Reserved for general
|
||||
#define NVT_CTA861_EXT_TAG_RSVD_MAX_3 255
|
||||
//
|
||||
//the extended tag payload size; the size includes the extended tag code
|
||||
#define NVT_CEA861_EXT_VIDEO_CAP_SD_SIZE 2
|
||||
@@ -1008,8 +1014,10 @@ typedef struct tagNVT_HDR10PLUS_INFO
|
||||
#define NVT_CEA861_COLORIMETRY_BT2020YCC 0x40 // BT2020 Y'CbCr capable
|
||||
#define NVT_CEA861_COLORIMETRY_BT2020RGB 0x80 // BT2020 RGB capable
|
||||
// Colorimetry capabilities - byte 4
|
||||
#define NVT_CEA861_COLORIMETRY_DCI_P3 0x80 // DCI-P3
|
||||
|
||||
#define NVT_CEA861_COLORIMETRY_defaultRGB 0x10 // based on the default chromaticity in Basic Display Parameters and Feature Block
|
||||
#define NVT_CEA861_COLORIMETRY_sRGB 0x20 // IEC 61966-2-1
|
||||
#define NVT_CEA861_COLORIMETRY_ICtCp 0x40 // ITU-R BT.2100 ICtCp
|
||||
#define NVT_CEA861_COLORIMETRY_ST2113RGB 0x80 // SMPTE ST 2113 R'G'B'
|
||||
//
|
||||
// gamut-related metadata capabilities - byte 4
|
||||
#define NVT_CEA861_GAMUT_METADATA_MASK 0x8F // the colorimetry or gamut-related metadata block mask
|
||||
@@ -1121,14 +1129,58 @@ typedef struct tagNVT_2BYTES
|
||||
NvU8 byte2;
|
||||
} NVT_2BYTES;
|
||||
|
||||
#pragma pack(1)
|
||||
#define NVT_CTA861_DID_MAX_DATA_BLOCK 4
|
||||
//***********************
|
||||
// DisplayID 10 Timing Data Block
|
||||
// DisplayID VII Video Timing Data Block (T7VDB)
|
||||
//***********************
|
||||
#define NVT_CTA861_DID_TYPE7_DESCRIPTORS_MIN 1
|
||||
#define NVT_CTA861_DID_TYPE7_DESCRIPTORS_MAX 1
|
||||
#define NVT_CTA861_DID_TYPE7_DESCRIPTORS_LENGTH 20
|
||||
|
||||
typedef struct tagDID_TYPE7_DATA
|
||||
{
|
||||
struct {
|
||||
NvU8 revision : 3;
|
||||
NvU8 dsc_pt : 1;
|
||||
NvU8 t7_m : 3;
|
||||
NvU8 F37 : 1;
|
||||
} version;
|
||||
|
||||
NvU8 total_descriptors;
|
||||
NvU8 payload[29]; // t7_m=0 so only 20byte used
|
||||
} DID_TYPE7_DATA;
|
||||
|
||||
//***********************
|
||||
// DisplayID VIII Video Timing Data Block (T8VDB)
|
||||
//***********************
|
||||
#define NVT_CTA861_DID_TYPE8_ONE_BYTE_DESCRIPTOR 1
|
||||
#define NVT_CTA861_DID_TYPE8_TWO_BYTE_DESCRIPTOR 2
|
||||
#define NVT_CTA861_DID_TYPE8_DESCRIPTORS_MIN 1
|
||||
#define NVT_CTA861_DID_TYPE8_ONE_BYTE_DESCRIPTORS_MAX 28
|
||||
#define NVT_CTA861_DID_TYPE8_TWO_BYTE_DESCRIPTORS_MAX 14
|
||||
|
||||
typedef struct tagDID_TYPE8_DATA
|
||||
{
|
||||
struct {
|
||||
NvU8 revision : 3;
|
||||
NvU8 tcs : 1;
|
||||
NvU8 F34 : 1;
|
||||
NvU8 t8y420 : 1;
|
||||
NvU8 code_type : 2;
|
||||
} version;
|
||||
|
||||
NvU8 total_descriptors;
|
||||
NvU8 payload[NVT_CTA861_DID_TYPE8_ONE_BYTE_DESCRIPTORS_MAX]; // used one_byte descriptor length
|
||||
} DID_TYPE8_DATA;
|
||||
|
||||
//***********************
|
||||
// DisplayID X Video Timing Data Block (T10VDB)
|
||||
//***********************
|
||||
#define NVT_CTA861_DID_TYPE10_DESCRIPTORS_MIN 1
|
||||
#define NVT_CTA861_DID_TYPE10_DESCRIPTORS_MAX 4
|
||||
#define NVT_CTA861_DID_TYPE10_MAX_DATA_BLOCK 4
|
||||
|
||||
typedef struct DID_TYPE10_DATA
|
||||
typedef struct tagDID_TYPE10_DATA
|
||||
{
|
||||
struct {
|
||||
NvU8 revision : 3;
|
||||
@@ -1138,11 +1190,34 @@ typedef struct DID_TYPE10_DATA
|
||||
} version;
|
||||
|
||||
NvU8 total_descriptors;
|
||||
|
||||
NvU8 payload[28]; // given the 7bytes * 4 space
|
||||
} DID_TYPE10_DATA;
|
||||
|
||||
// See CEA-861E, Table 42, 43 Extended Tags; indicates that the corresponding CEA extended data block value is valid, e.g. if colorimetry is set, then NVT_EDID_CEA861_INFO::colorimetry is valid
|
||||
//***********************
|
||||
// Native Video Resolution Data Block (NVRDB)
|
||||
//***********************
|
||||
typedef struct tagNATIVE_VIDEO_RESOLUTION_DATA
|
||||
{
|
||||
NvU8 native_svr;
|
||||
|
||||
struct {
|
||||
NvU8 img_size : 1;
|
||||
NvU8 f41 : 1;
|
||||
NvU8 f42 : 1;
|
||||
NvU8 f43 : 1;
|
||||
NvU8 f44 : 1;
|
||||
NvU8 f45 : 1;
|
||||
NvU8 f46 : 1;
|
||||
NvU8 sz_prec : 1;
|
||||
} option;
|
||||
|
||||
NvU8 image_size[4];
|
||||
} NATIVE_VIDEO_RESOLUTION_DATA;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
// See CEA-861E, Table 42, 43 Extended Tags; indicates that the corresponding CEA extended data block value is valid,
|
||||
// e.g. if colorimetry is set, then NVT_EDID_CEA861_INFO::colorimetry is valid
|
||||
typedef struct tagNVT_VALID_EXTENDED_BLOCKS
|
||||
{
|
||||
NvU32 VCDB : 1;
|
||||
@@ -1158,6 +1233,7 @@ typedef struct tagNVT_VALID_EXTENDED_BLOCKS
|
||||
NvU32 HF_EEODB : 1;
|
||||
NvU32 nvda_vsdb : 1;
|
||||
NvU32 msft_vsdb : 1;
|
||||
NvU32 NVRDB : 1;
|
||||
} NVT_VALID_EXTENDED_BLOCKS;
|
||||
|
||||
//*************************
|
||||
@@ -1223,9 +1299,12 @@ typedef struct tagEDID_CEA861_INFO
|
||||
NVT_5BYTES hdr_static_metadata;
|
||||
|
||||
// VFPDB extended block. See CEA861-H, Section 7.5.12 Video Format Preference Data Block
|
||||
NvU8 total_vfpdb;
|
||||
NvU8 total_svr;
|
||||
NvU8 svr_vfpdb[NVT_CEA861_VFPDB_MAX_DESCRIPTOR]; // svr of preferred video formats
|
||||
|
||||
// NVRDB extended block. see CTA861.6, Section 7.5.18 Native Video Resolution Data Block
|
||||
NATIVE_VIDEO_RESOLUTION_DATA native_video_resolution_db;
|
||||
|
||||
// Y420VDB extended block. See CEA861-F, Section 7.5.10 YCBCR 4:2:0 Video Data Block
|
||||
NvU8 total_y420vdb;
|
||||
NvU8 svd_y420vdb[NVT_CEA861_Y420VDB_MAX_DESCRIPTOR]; // svd of video formats that only support YCbCr 4:2:0
|
||||
@@ -1238,9 +1317,17 @@ typedef struct tagEDID_CEA861_INFO
|
||||
NvU32 hfscdbSize;
|
||||
NvU8 hfscdb[NVT_CTA861_EXT_SCDB_PAYLOAD_MAX_LENGTH];
|
||||
|
||||
// DID Type X Video extended block, see CTA861-H, section 3.5.17.3 DisplayID Type X Video Timing Data Block
|
||||
NvU8 total_did_type10db;
|
||||
DID_TYPE10_DATA did_type10_data_block[NVT_CTA861_DID_TYPE10_MAX_DATA_BLOCK];
|
||||
// DID Type VII Video extended block, see 7.5.17.1 in CTA861-H
|
||||
NvU8 total_did_type7db;
|
||||
DID_TYPE7_DATA did_type7_data_block[NVT_CTA861_DID_MAX_DATA_BLOCK];
|
||||
|
||||
// DID Type VIII Video extended block, see 7.5.17.2 in CTA861-H
|
||||
NvU8 total_did_type8db;
|
||||
DID_TYPE8_DATA did_type8_data_block[NVT_CTA861_DID_MAX_DATA_BLOCK];
|
||||
|
||||
// DID Type X Video extended block, see 7.5.17.3 in CTA861-H
|
||||
NvU8 total_did_type10db;
|
||||
DID_TYPE10_DATA did_type10_data_block[NVT_CTA861_DID_MAX_DATA_BLOCK];
|
||||
|
||||
NvU8 hfeeodb; // HDMI Forum Edid Extension Override Data Block.
|
||||
} NVT_EDID_CEA861_INFO;
|
||||
@@ -2153,12 +2240,14 @@ typedef struct tagNVT_HDMI_FORUM_INFO
|
||||
NvU8 cnmvrr : 1;
|
||||
NvU8 cinemaVrr : 1;
|
||||
NvU8 m_delta : 1;
|
||||
NvU8 qms : 1;
|
||||
NvU8 fapa_end_extended : 1;
|
||||
NvU8 rsvd : 1;
|
||||
|
||||
NvU16 vrr_min : 6;
|
||||
NvU16 vrr_max : 10;
|
||||
|
||||
NvU8 qms_tfr_min : 1;
|
||||
NvU8 qms_tfr_max : 1;
|
||||
NvU16 dsc_MaxSlices : 6;
|
||||
NvU16 dsc_MaxPclkPerSliceMHz : 10;
|
||||
|
||||
@@ -2804,6 +2893,7 @@ typedef struct tagNVT_VIDEO_INFOFRAME_CTRL
|
||||
NvU16 left_bar;
|
||||
NvU16 right_bar;
|
||||
}NVT_VIDEO_INFOFRAME_CTRL;
|
||||
|
||||
//
|
||||
typedef struct tagNVT_AUDIO_INFOFRAME_CTRL
|
||||
{
|
||||
@@ -2818,14 +2908,16 @@ typedef struct tagNVT_AUDIO_INFOFRAME_CTRL
|
||||
|
||||
typedef struct tagNVT_VENDOR_SPECIFIC_INFOFRAME_CTRL
|
||||
{
|
||||
NvU32 Enable;
|
||||
NvU8 HDMIFormat;
|
||||
NvU8 HDMI_VIC;
|
||||
NvU8 ThreeDStruc;
|
||||
NvU8 ThreeDDetail;
|
||||
NvU8 MetadataPresent;
|
||||
NvU8 MetadataType;
|
||||
NvU8 Metadata[8]; // type determines length
|
||||
NvU32 Enable;
|
||||
NvU8 HDMIRevision;
|
||||
NvU8 HDMIFormat;
|
||||
NvU8 HDMI_VIC;
|
||||
NvBool ALLMEnable;
|
||||
NvU8 ThreeDStruc;
|
||||
NvU8 ThreeDDetail;
|
||||
NvU8 MetadataPresent;
|
||||
NvU8 MetadataType;
|
||||
NvU8 Metadata[8]; // type determines length
|
||||
|
||||
} NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL;
|
||||
#define NVT_3D_METADTATA_TYPE_PARALAX 0x00
|
||||
@@ -2841,8 +2933,17 @@ typedef struct tagNVT_EXTENDED_METADATA_PACKET_INFOFRAME_CTRL
|
||||
NvU32 BaseVFP;
|
||||
NvU32 ReducedBlanking;
|
||||
NvU32 BaseRefreshRate;
|
||||
NvU32 EnableQMS;
|
||||
} NVT_EXTENDED_METADATA_PACKET_INFOFRAME_CTRL;
|
||||
|
||||
typedef struct tagNVT_ADAPTIVE_SYNC_SDP_CTRL
|
||||
{
|
||||
NvU32 minVTotal;
|
||||
NvU32 targetRefreshRate;
|
||||
NvBool bFixedVTotal;
|
||||
NvBool bRefreshRateDivider;
|
||||
}NVT_ADAPTIVE_SYNC_SDP_CTRL;
|
||||
|
||||
//***********************************
|
||||
// the actual Auido/Video Infoframe
|
||||
//***********************************
|
||||
@@ -2915,7 +3016,6 @@ typedef struct tagNVT_VIDEO_INFOFRAME
|
||||
NvU8 left_bar_high;
|
||||
NvU8 right_bar_low;
|
||||
NvU8 right_bar_high;
|
||||
|
||||
}NVT_VIDEO_INFOFRAME;
|
||||
//
|
||||
#define NVT_VIDEO_INFOFRAME_VERSION_1 1
|
||||
@@ -2949,8 +3049,9 @@ typedef struct tagNVT_VIDEO_INFOFRAME
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_RGB 0
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_YCbCr422 1
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_YCbCr444 2
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_YCbCr420 3
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_FUTURE 3 // nvlEscape still uses this lline 4266
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_YCbCr420 3
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_FUTURE 3 // nvlEscape still uses this line 4266
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y2Y1Y0_IDODEFINED 7
|
||||
// CEA-861-F - Unix still used this one
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y1Y0_MASK 0x60
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE1_Y1Y0_SHIFT 0x5
|
||||
@@ -3069,14 +3170,17 @@ typedef struct tagNVT_VIDEO_INFOFRAME
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE5_RESERVED_V1_MASK 0xFF
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE5_RESERVED_V1_SHIFT 0
|
||||
//
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_RESERVED_V4_MASK 0xF0
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_RESERVED_V4_SHIFT 4
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_0 0
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_1 1
|
||||
//
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_RESERVED_MASK 0x0F
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_RESERVED_SHIFT 0
|
||||
//
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_3_MASK 0xF0
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_3_SHIFT 4
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_3_P3D65RGB 0
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_3_P3DCIRGB 1
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_3_BT2100_ICtCp 2
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_3_sRGB 3
|
||||
#define NVT_VIDEO_INFOFRAME_BYTE14_ACE0_3_defaultRGB 4
|
||||
//
|
||||
#define NVT_VIDEO_INFOFRAME_CONTENT_VIDEO 0
|
||||
#define NVT_VIDEO_INFOFRAME_CONTENT_GRAPHICS 1
|
||||
#define NVT_VIDEO_INFOFRAME_CONTENT_PHOTO 2
|
||||
@@ -3474,6 +3578,33 @@ typedef struct tagNVT_VENDOR_SPECIFIC_INFOFRAME
|
||||
//
|
||||
#define NVT_HDMI_VS_INFOFRAME_VERSION_1 1
|
||||
|
||||
#define NVT_HDMI_VS_HB0_MASK 0xFF
|
||||
#define NVT_HDMI_VS_HB0_SHIFT 0x00
|
||||
#define NVT_HDMI_VS_HB0_VALUE 0x01
|
||||
|
||||
#define NVT_HDMI_VS_HB1_MASK 0xFF
|
||||
#define NVT_HDMI_VS_HB1_SHIFT 0x00
|
||||
#define NVT_HDMI_VS_HB1_VALUE 0x01
|
||||
|
||||
#define NVT_HDMI_VS_HB2_MASK 0xFF
|
||||
#define NVT_HDMI_VS_HB2_SHIFT 0x00
|
||||
#define NVT_HDMI_VS_HB2_VALUE 0x06
|
||||
|
||||
#define NVT_HDMI_VS_BYTE1_OUI_MASK 0xff
|
||||
#define NVT_HDMI_VS_BYTE1_OUI_SHIFT 0x00
|
||||
#define NVT_HDMI_VS_BYTE1_OUI_VER_1_4 0x03
|
||||
#define NVT_HDMI_VS_BYTE1_OUI_VER_2_0 0xD8
|
||||
|
||||
#define NVT_HDMI_VS_BYTE2_OUI_MASK 0xff
|
||||
#define NVT_HDMI_VS_BYTE2_OUI_SHIFT 0x00
|
||||
#define NVT_HDMI_VS_BYTE2_OUI_VER_1_4 0x0C
|
||||
#define NVT_HDMI_VS_BYTE2_OUI_VER_2_0 0x5D
|
||||
|
||||
#define NVT_HDMI_VS_BYTE3_OUI_MASK 0xff
|
||||
#define NVT_HDMI_VS_BYTE3_OUI_SHIFT 0x00
|
||||
#define NVT_HDMI_VS_BYTE3_OUI_VER_1_4 0x00
|
||||
#define NVT_HDMI_VS_BYTE3_OUI_VER_2_0 0xC4
|
||||
|
||||
//
|
||||
#define NVT_HDMI_VS_BYTE4_RSVD_MASK 0x1f
|
||||
#define NVT_HDMI_VS_BYTE4_RSVD_SHIFT 0x00
|
||||
@@ -3500,6 +3631,10 @@ typedef struct tagNVT_VENDOR_SPECIFIC_INFOFRAME
|
||||
#define NVT_HDMI_VS_BYTE5_3D_META_PRESENT_SHIFT 0x03
|
||||
#define NVT_HDMI_VS_BYTE5_HDMI_META_PRESENT_NOTPRES 0x00 // HDMI Metadata is not present
|
||||
#define NVT_HDMI_VS_BYTE5_HDMI_META_PRESENT_PRES 0x01 // HDMI Metadata is present
|
||||
#define NVT_HDMI_VS_BYTE5_ALLM_MODE_MASK 0x02 // ALLM is field of length 1 bit at Bit Number 1
|
||||
#define NVT_HDMI_VS_BYTE5_ALLM_MODE_DIS 0x00
|
||||
#define NVT_HDMI_VS_BYTE5_ALLM_MODE_EN 0x01
|
||||
#define NVT_HDMI_VS_BYTE5_ALLM_MODE_SHIFT 0x01 // ALLM is byte5 bit position 1, so shift 1 bit
|
||||
#define NVT_HDMI_VS_BYTE5_HDMI_3DS_MASK 0xf0
|
||||
#define NVT_HDMI_VS_BYTE5_HDMI_3DS_SHIFT 0x04
|
||||
#define NVT_HDMI_VS_BYTE5_HDMI_3DS_NA 0xfe
|
||||
@@ -3566,83 +3701,184 @@ typedef struct tagNVT_EXTENDED_METADATA_PACKET_INFOFRAME
|
||||
NVT_EXTENDED_METADATA_PACKET_INFOFRAME_PAYLOAD Data;
|
||||
} NVT_EXTENDED_METADATA_PACKET_INFOFRAME;
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE1_RSVD_MASK 0x01
|
||||
#define NVT_HDMI_EMP_BYTE1_RSVD_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE1_RSVD_MASK 0x01
|
||||
#define NVT_HDMI_EMP_BYTE1_RSVD_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_MASK 0x02
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_SHIFT 1
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_MASK 0x02
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_SHIFT 1
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_SYNC_ENABLE 1
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_MASK 0x04
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_SHIFT 2
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_MASK 0x04
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_SHIFT 2
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_VFR_ENABLE 1
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_MASK 0x08
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_SHIFT 3
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_MASK 0x08
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_SHIFT 3
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_AFR_ENABLE 1
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_MASK 0x30
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_SHIFT 4
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_PERIODIC_PSEUDO_STATIC 0
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_PERIODIC_DYNAMIC 1
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_UNIQUE 2
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_RSVD 3
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_MASK 0x30
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_SHIFT 4
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_PERIODIC_PSEUDO_STATIC 0
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_PERIODIC_DYNAMIC 1
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_UNIQUE 2
|
||||
#define NVT_HDMI_EMP_BYTE1_DS_TYPE_RSVD 3
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE1_END_MASK 0x40
|
||||
#define NVT_HDMI_EMP_BYTE1_END_SHIFT 6
|
||||
#define NVT_HDMI_EMP_BYTE1_END_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_END_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE1_END_MASK 0x40
|
||||
#define NVT_HDMI_EMP_BYTE1_END_SHIFT 6
|
||||
#define NVT_HDMI_EMP_BYTE1_END_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_END_ENABLE 1
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_MASK 0x80
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_SHIFT 7
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_MASK 0x80
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_SHIFT 7
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE1_NEW_ENABLE 1
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE2_RSVD_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE2_RSVD_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE2_RSVD_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE2_RSVD_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_VENDOR_SPECIFIC 0
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_SPEC_DEFINED 1
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_CTA_DEFINED 2
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_VESA_DEFINED 3
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_VENDOR_SPECIFIC 0
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_SPEC_DEFINED 1
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_CTA_DEFINED 2
|
||||
#define NVT_HDMI_EMP_BYTE3_ORGANIZATION_ID_VESA_DEFINED 3
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE4_DATA_SET_TAG_MSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE4_DATA_SET_TAG_MSB_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE4_DATA_SET_TAG_MSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE4_DATA_SET_TAG_MSB_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE5_DATA_SET_TAG_LSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE5_DATA_SET_TAG_LSB_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE5_DATA_SET_TAG_LSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE5_DATA_SET_TAG_LSB_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE6_DATA_SET_LENGTH_MSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE6_DATA_SET_LENGTH_MSB_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE6_DATA_SET_LENGTH_MSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE6_DATA_SET_LENGTH_MSB_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE7_DATA_SET_LENGTH_LSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE7_DATA_SET_LENGTH_LSB_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE7_DATA_SET_LENGTH_LSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE7_DATA_SET_LENGTH_LSB_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_MASK 0x01
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_MASK 0x01
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_VRR_EN_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_M_CONST_MASK 0x01
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_M_CONST_SHIFT 1
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_QMS_EN_MASK 0x01
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_QMS_EN_SHIFT 2
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_QMS_EN_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD0_QMS_EN_ENABLE 1
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE8_MD1_BASE_VFRONT_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE8_MD1_BASE_VFRONT_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD1_BASE_VFRONT_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE8_MD1_BASE_VFRONT_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_MASK 0x04
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_SHIFT 2
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_ENABLE 1
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_MASK 0x04
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_SHIFT 2
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_DISABLE 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_RB_ENABLE 1
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_BASE_RR_MSB_MASK 0x03
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_BASE_RR_MSB_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_BASE_RR_MSB_MASK 0x03
|
||||
#define NVT_HDMI_EMP_BYTE8_MD2_BASE_RR_MSB_SHIFT 0
|
||||
|
||||
#define NVT_HDMI_EMP_BYTE8_MD3_BASE_RR_LSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE8_MD3_BASE_RR_LSB_SHIFT 0
|
||||
#define NVT_HDMI_EMP_BYTE8_MD3_BASE_RR_LSB_MASK 0xff
|
||||
#define NVT_HDMI_EMP_BYTE8_MD3_BASE_RR_LSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_PACKET_TYPE 0x22
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_VERSION 0x2
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_LENGTH 0x9
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_VARIABLE_FRAME_RATE_MASK 0x3
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_VARIABLE_FRAME_RATE_SHIFT 0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_VARIABLE_FRAME_RATE_AVT_VARIABLE 0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_VARIABLE_FRAME_RATE_AVT_FIXED 1
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_VARIABLE_FRAME_RATE_FAVT_TARGET_NOT_REACHED 2
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_VARIABLE_FRAME_RATE_FAVT_TARGET_REACHED 3
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_MASK 0x4
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_SHIFT 2
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_SOURCE_SINK_SYNC_ENABLED 0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_SOURCE_SINK_SYNC_DISABLED 1
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_RFB_UPDATE_MASK 0x8
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_RFB_UPDATE_SHIFT 3
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_RFB_UPDATE_NO_UPDATE 0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_DISABLE_PR_ACTIVE_RFB_UPDATE_UPDATE 1
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_RSVD_MASK 0xf0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB0_RSVD_SHIFT 4
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB1_MIN_VTOTAL_LSB_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB1_MIN_VTOTAL_LSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB2_MIN_VTOTAL_MSB_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB2_MIN_VTOTAL_MSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB3_TARGET_RR_LSB_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB3_TARGET_RR_LSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_TARGET_RR_MSB_MASK 0x01
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_TARGET_RR_MSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_RSVD_MASK 0x1c
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_RSVD_SHIFT 2
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_TARGET_RR_DIVIDER_MASK 0x20
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_TARGET_RR_DIVIDER_SHIFT 5
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_TARGET_RR_DIVIDER_DISABLE 0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_TARGET_RR_DIVIDER_ENABLE 1
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_INC_MASK 0x40
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_INC_SHIFT 6
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_INC_DISABLE 0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_INC_ENABLE 1
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_DEC_MASK 0x80
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_DEC_SHIFT 7
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_DEC_DISABLE 0
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB4_SUCCESSIVE_FRAME_DEC_ENABLE 1
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB5_DURATION_INCREASE_CONSTRAINT_LSB_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB5_DURATION_INCREASE_CONSTRAINT_LSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB6_DURATION_INCREASE_CONSTRAINT_MSB_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB6_DURATION_INCREASE_CONSTRAINT_MSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB7_PR_COASTING_VTOTAL_LSB_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB7_PR_COASTING_VTOTAL_LSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB8_PR_COASTING_VTOTAL_MSB_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB8_PR_COASTING_VTOTAL_MSB_SHIFT 0
|
||||
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB1_MIN_VTOTAL_BYTE2_MASK 0xff
|
||||
#define NVT_DP_ADAPTIVE_SYNC_SDP_DB1_MIN_VTOTAL_BYTE2_SHIFT 0
|
||||
|
||||
typedef struct tagNVT_ADAPTIVE_SYNC_SDP_HEADER
|
||||
{
|
||||
NvU8 hb0;
|
||||
NvU8 type;
|
||||
NvU8 version;
|
||||
NvU8 length;
|
||||
}NVT_ADAPTIVE_SYNC_SDP_HEADER;
|
||||
|
||||
typedef struct tagNVT_ADAPTIVE_SYNC_SDP_PAYLOAD
|
||||
{
|
||||
NvU8 db0; // operatingMode
|
||||
NvU8 db1; // minVTotalLSB
|
||||
NvU8 db2; // minVTotalMSB
|
||||
NvU8 db3; // targetRefreshRateLSB
|
||||
NvU8 db4; // targetRefreshRateMSB, rsvd, targetRRDivider, frameInc/Dec Config
|
||||
NvU8 db5; // frameDurationIncMs
|
||||
NvU8 db6; // frameDurationDecreaseMs
|
||||
NvU8 db7; // coastingVTotalPrLSB
|
||||
NvU8 db8; // coastingVTotalPrMSB
|
||||
|
||||
NvU8 rsvd[23];
|
||||
}NVT_ADAPTIVE_SYNC_SDP_PAYLOAD;
|
||||
|
||||
typedef struct tagADAPTIVE_SYNC_SDP
|
||||
{
|
||||
NVT_ADAPTIVE_SYNC_SDP_HEADER header;
|
||||
NVT_ADAPTIVE_SYNC_SDP_PAYLOAD payload;
|
||||
}NVT_ADAPTIVE_SYNC_SDP;
|
||||
|
||||
// the Vendor-Specific-Data-Block header
|
||||
typedef struct tagNVT_CEA861_VSDB_HEADER
|
||||
@@ -3814,7 +4050,7 @@ typedef struct tagNVT_HDMI_FORUM_VSDB_PAYLOAD
|
||||
NvU8 CNMVRR : 1;
|
||||
NvU8 CinemaVRR : 1;
|
||||
NvU8 M_delta : 1;
|
||||
NvU8 Rsvd_2 : 1;
|
||||
NvU8 QMS : 1;
|
||||
NvU8 FAPA_End_Extended : 1;
|
||||
|
||||
// sixth byte
|
||||
@@ -3827,7 +4063,8 @@ typedef struct tagNVT_HDMI_FORUM_VSDB_PAYLOAD
|
||||
NvU8 DSC_12bpc : 1;
|
||||
NvU8 DSC_16bpc : 1;
|
||||
NvU8 DSC_All_bpp : 1;
|
||||
NvU8 Rsvd_3 : 2;
|
||||
NvU8 QMS_TFR_min : 1;
|
||||
NvU8 QMS_TFR_max : 1;
|
||||
NvU8 DSC_Native_420 : 1;
|
||||
NvU8 DSC_1p2 : 1;
|
||||
// ninth byte
|
||||
@@ -5344,13 +5581,11 @@ typedef enum
|
||||
#define NVT_FLAG_NV_PREFERRED_TIMING 0x00040000
|
||||
#define NVT_FLAG_DTD1_PREFERRED_TIMING 0x00080000
|
||||
#define NVT_FLAG_DISPLAYID_DTD_PREFERRED_TIMING 0x00100000
|
||||
#define NVT_FLAG_CEA_PREFERRED_TIMING 0x00200000
|
||||
#define NVT_FLAG_CTA_PREFERRED_TIMING 0x00200000
|
||||
#define NVT_FLAG_DISPLAYID_T7_DSC_PASSTHRU 0x00400000
|
||||
#define NVT_FLAG_DISPLAYID_2_0_TIMING 0x00800000 // this one for the CTA861 embedded in DID20
|
||||
#define NVT_FLAG_DISPLAYID_T7_T8_EXPLICT_YUV420 0x01000000 // DID2 E7 spec. supported yuv420 indicated
|
||||
#define NVT_FLAG_DISPLAYID_T7_TIMING 0x02000000
|
||||
#define NVT_FLAG_DISPLAYID_T8_TIMING 0x04000000
|
||||
#define NVT_FLAG_DISPLAYID_T10_TIMING 0x08000000
|
||||
#define NVT_FLAG_CTA_NATIVE_TIMING 0x02000000 // NVRDB defined
|
||||
|
||||
#define NVT_FLAG_INTERLACED_MASK (NVT_FLAG_INTERLACED_TIMING | NVT_FLAG_INTERLACED_TIMING2)
|
||||
|
||||
@@ -5377,8 +5612,10 @@ NVT_STATUS NvTiming_CalcGTF(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT
|
||||
|
||||
// DMT timing calculation
|
||||
NVT_STATUS NvTiming_EnumDMT(NvU32 dmtId, NVT_TIMING *pT);
|
||||
NVT_STATUS NvTiming_EnumStdTwoBytesCode(NvU16 std2ByteCodes, NVT_TIMING *pT);
|
||||
NVT_STATUS NvTiming_CalcDMT(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT_TIMING *pT);
|
||||
NVT_STATUS NvTiming_CalcDMT_RB(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT_TIMING *pT);
|
||||
NVT_STATUS NvTiming_CalcDMT_RB2(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT_TIMING *pT);
|
||||
|
||||
// CVT timing calculation
|
||||
NVT_STATUS NvTiming_CalcCVT(NvU32 width, NvU32 height, NvU32 rr, NvU32 flag, NVT_TIMING *pT);
|
||||
@@ -5427,9 +5664,7 @@ NvU32 NvTiming_DisplayID2ValidationMask(NVT_DISPLAYID_2_0_INFO *pDisplayIdInfo,
|
||||
NVT_STATUS NvTiming_DisplayID2ValidationDataBlocks(NVT_DISPLAYID_2_0_INFO *pDisplayIdInfo, NvBool bIsStrongValidation);
|
||||
|
||||
NVT_STATUS NvTiming_Get18ByteLongDescriptorIndex(NVT_EDID_INFO *pEdidInfo, NvU8 tag, NvU32 *dtdIndex);
|
||||
NVT_STATUS NvTiming_GetProductName(const NVT_EDID_INFO *pEdidInfo,
|
||||
NvU8 *pProductName,
|
||||
const NvU32 productNameLength);
|
||||
NVT_STATUS NvTiming_GetProductName(const NVT_EDID_INFO *pEdidInfo, NvU8 *pProductName, const NvU32 productNameLength);
|
||||
NvU32 NvTiming_CalculateEDIDCRC32(NvU8* pEDIDBuffer, NvU32 edidsize);
|
||||
NvU32 NvTiming_CalculateCommonEDIDCRC32(NvU8* pEDIDBuffer, NvU32 edidVersion);
|
||||
NVT_STATUS NvTiming_CalculateEDIDLimits(NVT_EDID_INFO *pEdidInfo, NVT_EDID_RANGE_LIMIT *pLimit);
|
||||
@@ -5442,17 +5677,18 @@ NvU32 a_div_b(NvU32 a, NvU32 b);
|
||||
NvU32 calculateCRC32(NvU8* pBuf, NvU32 bufsize);
|
||||
void patchChecksum(NvU8* pBuf);
|
||||
NvBool isChecksumValid(NvU8* pBuf);
|
||||
|
||||
NvU32 RRx1kToPclk (NVT_TIMING *pT);
|
||||
|
||||
NVT_STATUS NvTiming_ComposeCustTimingString(NVT_TIMING *pT);
|
||||
|
||||
// Infoframe composer
|
||||
NVT_STATUS NvTiming_ConstructVideoInfoframeCtrl(const NVT_TIMING *pTiming, NVT_VIDEO_INFOFRAME_CTRL *pCtrl);
|
||||
NVT_STATUS NvTiming_ConstructVideoInfoframe(NVT_EDID_INFO *pEdidInfo, NVT_VIDEO_INFOFRAME_CTRL *pCtrl, NVT_VIDEO_INFOFRAME *pContext, NVT_VIDEO_INFOFRAME *p);
|
||||
NVT_STATUS NvTiming_ConstructAudioInfoframe(NVT_AUDIO_INFOFRAME_CTRL *pCtrl, NVT_AUDIO_INFOFRAME *pContext, NVT_AUDIO_INFOFRAME *p);
|
||||
NVT_STATUS NvTiming_ConstructVendorSpecificInfoframe(NVT_EDID_INFO *pEdidInfo, NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pCtrl, NVT_VENDOR_SPECIFIC_INFOFRAME *p);
|
||||
NVT_STATUS NvTiming_ConstructExtendedMetadataPacketInfoframe(NVT_EXTENDED_METADATA_PACKET_INFOFRAME_CTRL *pCtrl, NVT_EXTENDED_METADATA_PACKET_INFOFRAME *p);
|
||||
// Infoframe/SDP composer
|
||||
NVT_STATUS NvTiming_ConstructVideoInfoframeCtrl(const NVT_TIMING *pTiming, NVT_VIDEO_INFOFRAME_CTRL *pCtrl);
|
||||
NVT_STATUS NvTiming_ConstructVideoInfoframe(NVT_EDID_INFO *pEdidInfo, NVT_VIDEO_INFOFRAME_CTRL *pCtrl, NVT_VIDEO_INFOFRAME *pContext, NVT_VIDEO_INFOFRAME *p);
|
||||
NVT_STATUS NvTiming_ConstructAudioInfoframe(NVT_AUDIO_INFOFRAME_CTRL *pCtrl, NVT_AUDIO_INFOFRAME *pContext, NVT_AUDIO_INFOFRAME *p);
|
||||
NVT_STATUS NvTiming_ConstructVendorSpecificInfoframe(NVT_EDID_INFO *pEdidInfo, NVT_VENDOR_SPECIFIC_INFOFRAME_CTRL *pCtrl, NVT_VENDOR_SPECIFIC_INFOFRAME *p);
|
||||
NVT_STATUS NvTiming_ConstructExtendedMetadataPacketInfoframe(NVT_EXTENDED_METADATA_PACKET_INFOFRAME_CTRL *pCtrl, NVT_EXTENDED_METADATA_PACKET_INFOFRAME *p);
|
||||
void NvTiming_ConstructAdaptiveSyncSDP(const NVT_ADAPTIVE_SYNC_SDP_CTRL *pCtrl, NVT_ADAPTIVE_SYNC_SDP *p);
|
||||
|
||||
|
||||
// Get specific timing from parsed EDID
|
||||
NVT_STATUS NvTiming_GetDTD1Timing (NVT_EDID_INFO * pEdidInfo, NVT_TIMING * pT);
|
||||
@@ -5460,15 +5696,22 @@ NVT_STATUS NvTiming_GetDTD1Timing (NVT_EDID_INFO * pEdidInfo, NVT_TIMING * pT);
|
||||
#define NVT_IS_DTD(d) (NVT_GET_TIMING_STATUS_TYPE((d)) == NVT_TYPE_EDID_DTD)
|
||||
#define NVT_IS_EXT_DTD(d) (NVT_GET_TIMING_STATUS_TYPE((d)) == NVT_TYPE_EDID_EXT_DTD)
|
||||
#define NVT_IS_CTA861(d) (NVT_GET_TIMING_STATUS_TYPE((d)) == NVT_TYPE_EDID_861ST)
|
||||
#define NVT_IS_CTA861_DID_T7(d) (NVT_GET_TIMING_STATUS_TYPE((d)) == NVT_TYPE_CTA861_DID_T7)
|
||||
#define NVT_IS_CTA861_DID_T8(d) (NVT_GET_TIMING_STATUS_TYPE((d)) == NVT_TYPE_CTA861_DID_T8)
|
||||
#define NVT_IS_CTA861_DID_T10(d) (NVT_GET_TIMING_STATUS_TYPE((d)) == NVT_TYPE_CTA861_DID_T10)
|
||||
|
||||
#define NVT_IS_DTD1(d) ((NVT_IS_DTD((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == 1))
|
||||
#define NVT_IS_DTDn(d, n) ((NVT_IS_DTD((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == n))
|
||||
#define NVT_IS_EXT_DTDn(d, n) ((NVT_IS_EXT_DTD((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == n))
|
||||
#define NVT_IS_DTD1(d) ((NVT_IS_DTD((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == 1))
|
||||
#define NVT_IS_DTDn(d, n) ((NVT_IS_DTD((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == n))
|
||||
#define NVT_IS_EXT_DTDn(d, n) ((NVT_IS_EXT_DTD((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == n))
|
||||
#define NVT_IS_CTA861_DID_T7n(d, n) ((NVT_IS_CTA861_DID_T7((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == n))
|
||||
#define NVT_IS_CTA861_DID_T8_1(d) ((NVT_IS_CTA861_DID_T8((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == 1))
|
||||
#define NVT_IS_CTA861_DID_T10n(d, n) ((NVT_IS_CTA861_DID_T10((d))) && (NVT_GET_TIMING_STATUS_SEQ((d)) == n))
|
||||
|
||||
#define NVT_DID20_TIMING_IS_CTA861(flag, status) ((NVT_IS_CTA861((status))) && (0 != (NVT_FLAG_DISPLAYID_2_0_TIMING & (flag))))
|
||||
#define NVT_PREFERRED_TIMING_IS_DTD1(flag, status) ((NVT_IS_DTD1((status))) && (0 != (NVT_FLAG_DTD1_PREFERRED_TIMING & (flag))))
|
||||
#define NVT_PREFERRED_TIMING_IS_DISPLAYID(flag) (0 != (NVT_FLAG_DISPLAYID_DTD_PREFERRED_TIMING & flag))
|
||||
#define NVT_PREFERRED_TIMING_IS_CEA(flag) (0 != (NVT_FLAG_CEA_PREFERRED_TIMING & flag))
|
||||
#define NVT_PREFERRED_TIMING_IS_CTA(flag) (0 != (NVT_FLAG_CTA_PREFERRED_TIMING & flag))
|
||||
#define NVT_NATIVE_TIMING_IS_CTA(flag) (0 != (NVT_FLAG_CTA_NATIVE_TIMING & flag))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -68,7 +68,7 @@ NVT_STATUS parseCta861DataBlockInfo(NvU8 *pEdid, NvU32 size, NVT_EDID_CEA861_INF
|
||||
void parse861ExtDetailedTiming(NvU8 *pEdidExt, NvU8 basicCaps, NVT_EDID_INFO *pInfo);
|
||||
void parse861bShortTiming(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parse861bShortYuv420Timing(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parse861bShortPreferredTiming(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parseCta861NativeOrPreferredTiming(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parseCta861VsdbBlocks(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parseCta861HfScdb(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parseCta861HfEeodb(NVT_EDID_CEA861_INFO *pExt861, NvU32 *pTotalEdidExtensions);
|
||||
@@ -81,8 +81,12 @@ void parseEdidNvidiaVSDBBlock(VSDB_DATA *pVsdb, NVDA_VSDB_PARSED_INFO *vsd
|
||||
void parseCea861HdrStaticMetadataDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parseCea861DvStaticMetadataDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parseCea861Hdr10PlusDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag);
|
||||
void parseCta861DIDType7VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo);
|
||||
void parseCta861DIDType8VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo);
|
||||
void parseCta861DIDType10VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo);
|
||||
NvBool isMatchedCTA861Timing(NVT_EDID_INFO *pInfo, NVT_TIMING *pT);
|
||||
NvBool isMatchedStandardTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT);
|
||||
NvBool isMatchedEstablishedTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT);
|
||||
NvU32 isHdmi3DStereoType(NvU8 StereoStructureType);
|
||||
NvU32 getCEA861TimingAspectRatio(NvU32 vic);
|
||||
void SetActiveSpaceForHDMI3DStereo(const NVT_TIMING *pTiming, NVT_EXT_TIMING *pExtTiming);
|
||||
@@ -96,7 +100,9 @@ NVT_STATUS getDisplayIdEDIDExtInfo(NvU8* pEdid, NvU32 edidSize, NVT_EDID_INFO* p
|
||||
NVT_STATUS parseDisplayIdBlock(NvU8* pBlock, NvU8 max_length, NvU8* pLength, NVT_EDID_INFO* pEdidInfo);
|
||||
NVT_STATUS getDisplayId20EDIDExtInfo(NvU8* pDisplayid, NvU32 edidSize, NVT_EDID_INFO* pEdidInfo);
|
||||
NVT_STATUS parseDisplayId20EDIDExtDataBlocks(NvU8* pDataBlock, NvU8 remainSectionLength, NvU8* pCurrentDBLength, NVT_EDID_INFO* pEdidInfo);
|
||||
NVT_STATUS parseDisplayId20Timing10Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 payloadBytes);
|
||||
NVT_STATUS parseDisplayId20Timing7Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 count);
|
||||
NVT_STATUS parseDisplayId20Timing8Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 codeType, NvU8 codeSize, NvU8 index, NvU8 count);
|
||||
NVT_STATUS parseDisplayId20Timing10Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 payloadBytes, NvU8 count);
|
||||
void updateColorFormatForDisplayIdExtnTimings(NVT_EDID_INFO* pInfo, NvU32 timingIdx);
|
||||
void updateColorFormatForDisplayId20ExtnTimings(NVT_EDID_INFO* pInfo, NvU32 timingIdx);
|
||||
NvBool assignNextAvailableDisplayId20Timing(NVT_DISPLAYID_2_0_INFO *pDisplayIdInfo, const NVT_TIMING *pTiming);
|
||||
|
||||
Reference in New Issue
Block a user