1 //***************************************************************************** 2 // 3 // SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 4 // SPDX-License-Identifier: MIT 5 // 6 // Permission is hereby granted, free of charge, to any person obtaining a 7 // copy of this software and associated documentation files (the "Software"), 8 // to deal in the Software without restriction, including without limitation 9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 // and/or sell copies of the Software, and to permit persons to whom the 11 // Software is furnished to do so, subject to the following conditions: 12 // 13 // The above copyright notice and this permission notice shall be included in 14 // all copies or substantial portions of the Software. 15 // 16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 // DEALINGS IN THE SOFTWARE. 23 // 24 // File: nvtiming_pvt.h 25 // 26 // Purpose: the private functions/structures which are only used inside 27 // the nv timing library. 28 // 29 //***************************************************************************** 30 31 #ifndef __NVTIMING_PVT_H_ 32 #define __NVTIMING_PVT_H_ 33 34 #include "nvtiming.h" 35 36 #if defined(NVT_USE_NVKMS) 37 #include "nvidia-modeset-os-interface.h" 38 #define NVT_SNPRINTF nvkms_snprintf 39 #else 40 #include <string.h> 41 #include <stdio.h> 42 #define NVT_SNPRINTF snprintf 43 #endif 44 45 #define nvt_assert(p) ((void)0) 46 47 #include <stddef.h> // NULL 48 49 #ifdef __cplusplus 50 extern "C" { 51 #endif 52 53 // EDID related private functions 54 NvU32 getEdidVersion(NvU8 *pData, NvU32 *pVer); 55 NvBool assignNextAvailableTiming(NVT_EDID_INFO *pInfo, const NVT_TIMING *pTiming); 56 void parseEdidCvtTiming(NVT_EDID_INFO *pInfo); 57 void parseEdidEstablishedTiming(NVT_EDID_INFO *pInfo); 58 void parseEdidStandardTiming(NVT_EDID_INFO *pInfo); 59 void parseEdidDetailedTiming(NvU8 *pEdid, NVT_EDID_INFO *pInfo); 60 NVT_STATUS parseEdidDetailedTimingDescriptor(NvU8 *pDTD, NVT_TIMING *pT); 61 void parseEdidCvt3ByteDescriptor(NvU8 *p, NVT_EDID_INFO *pInfo, NvU32 *vtbCount); 62 void parseEdidStandardTimingDescriptor(NvU16 timing, NVT_EDID_INFO *pInfo, NvU32 count, NVT_TIMING * pT); 63 void parseVTBExtension(NvU8 *pEdidExt, NVT_EDID_INFO *pInfo); 64 void updateHDMILLCDeepColorForTiming(NVT_EDID_INFO *pInfo, NvU32 index); 65 void updateBpcForTiming(NVT_EDID_INFO *pInfo, NvU32 index); 66 void updateColorFormatAndBpcTiming(NVT_EDID_INFO *pInfo); 67 // End EDID 68 69 // CTA861 related private functions 70 NVT_STATUS get861ExtInfo(NvU8 *pEdid, NvU32 edidSize, NVT_EDID_CEA861_INFO *p); 71 NVT_STATUS parseCta861DataBlockInfo(NvU8 *pEdid, NvU32 size, NVT_EDID_CEA861_INFO *p); 72 void parse861ExtDetailedTiming(NvU8 *pEdidExt, NvU8 basicCaps, NVT_EDID_INFO *pInfo); 73 void parse861bShortTiming(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 74 void parse861bShortYuv420Timing(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 75 void parseCta861VideoFormatDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo); 76 void parseCta861NativeOrPreferredTiming(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 77 void parseCta861VsdbBlocks(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 78 void parseCta861VsvdbBlocks(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 79 void parseCta861HfScdb(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 80 void parseCta861HfEeodb(NVT_EDID_CEA861_INFO *pExt861, NvU32 *pTotalEdidExtensions); 81 void parseEdidMsftVsdbBlock(VSDB_DATA *pVsdb, MSFT_VSDB_PARSED_INFO *vsdbInfo); 82 void parseEdidHdmiLlcBasicInfo(VSDB_DATA *pVsdb, NVT_HDMI_LLC_INFO *pHdmiLlc); 83 void parseEdidHdmiForumVSDB(VSDB_DATA *pVsdb, NVT_HDMI_FORUM_INFO *pHdmiInfo); 84 void getEdidHDM1_4bVsdbTiming(NVT_EDID_INFO *pInfo); 85 void parseEdidHDMILLCTiming(NVT_EDID_INFO *pInfo, VSDB_DATA *pVsdb, NvU32 *pSupported, HDMI3DSUPPORTMAP * pM); 86 void parseEdidNvidiaVSDBBlock(VSDB_DATA *pVsdb, NVDA_VSDB_PARSED_INFO *vsdbInfo); 87 void parseCea861HdrStaticMetadataDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 88 void parseCta861DvStaticMetadataDataBlock(VSVDB_DATA* pVsvdb, NVT_DV_STATIC_METADATA* pDvInfo); 89 void parseCta861Hdr10PlusDataBlock(VSVDB_DATA* pVsvdb, NVT_HDR10PLUS_INFO* pHdr10PlusInfo); 90 void parseCta861DIDType7VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo); 91 void parseCta861DIDType8VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo); 92 void parseCta861DIDType10VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo); 93 NvBool isMatchedCTA861Timing(NVT_EDID_INFO *pInfo, NVT_TIMING *pT); 94 NvBool isMatchedStandardTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT); 95 NvBool isMatchedEstablishedTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT); 96 NvU32 isHdmi3DStereoType(NvU8 StereoStructureType); 97 NvU32 getCEA861TimingAspectRatio(NvU32 vic); 98 NvU8 getHighestPrioritySVRIdx(const NVT_EDID_CEA861_INFO *pExt861); 99 void SetActiveSpaceForHDMI3DStereo(const NVT_TIMING *pTiming, NVT_EXT_TIMING *pExtTiming); 100 void AddModeToSupportMap(HDMI3DSUPPORTMAP * pMap, NvU8 vic, NvU8 structure, NvU8 Detail); 101 void getMonitorDescriptorString(NvU8 *pEdid, NvU8 tag, char *str, int onceOnly); 102 // End CTA861 103 104 // DispalyID base / extension related functions 105 NvU32 getDID2Version(NvU8 *pData, NvU32 *pVer); 106 NVT_STATUS getDisplayIdEDIDExtInfo(NvU8* pEdid, NvU32 edidSize, NVT_EDID_INFO* pEdidInfo); 107 NVT_STATUS parseDisplayIdBlock(NvU8* pBlock, NvU8 max_length, NvU8* pLength, NVT_EDID_INFO* pEdidInfo); 108 NVT_STATUS getDisplayId20EDIDExtInfo(NvU8* pDisplayid, NvU32 edidSize, NVT_EDID_INFO* pEdidInfo); 109 NVT_STATUS parseDisplayId20EDIDExtDataBlocks(NvU8* pDataBlock, NvU8 remainSectionLength, NvU8* pCurrentDBLength, NVT_EDID_INFO* pEdidInfo); 110 NVT_STATUS parseDisplayId20Timing7Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 count); 111 NVT_STATUS parseDisplayId20Timing8Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 codeType, NvU8 codeSize, NvU8 index, NvU8 count); 112 NVT_STATUS parseDisplayId20Timing9Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 count); 113 NVT_STATUS parseDisplayId20Timing10Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 payloadBytes, NvU8 count); 114 void updateColorFormatForDisplayIdExtnTimings(NVT_EDID_INFO* pInfo, NvU32 timingIdx); 115 void updateColorFormatForDisplayId20ExtnTimings(NVT_EDID_INFO* pInfo, NvU32 timingIdx); 116 NvBool assignNextAvailableDisplayId20Timing(NVT_DISPLAYID_2_0_INFO *pDisplayIdInfo, const NVT_TIMING *pTiming); 117 void updateColorFormatForDisplayId20Timings(NVT_DISPLAYID_2_0_INFO* pDisplayId2Info, NvU32 timingIdx); 118 // End DisplayID 119 #ifdef __cplusplus 120 } 121 #endif 122 123 NvU32 axb_div_c_old(NvU32 a, NvU32 b, NvU32 c); 124 125 #define NVT_EDID_BLOCK_SIZE 128 126 127 #define NVT_PVT_INTERLACED_MASK 0xF 128 #define NVT_PVT_DOUBLESCAN_MASK 0x10 129 #define NVT_PVT_RB_MASK 0x20 130 131 #define NVT_PVT_DOUBLE_SCAN_HEIGHT 384 132 #define NVT_PVT_DOUBLE_SCAN_HEIGHT_VGA 600 133 #define NVT_PVT_DOUBLE_SCAN_PCLK_MIN 1200 //in 10KHz 134 135 #define abs(a) ((a)>0?(a):-(a)) 136 #define set_rrx1k(a,b,c) ((b)*(c)==0?(0):(NvU32)(((NvU64)(a)*10000*1000+(b)*(c)/2)/((b)*(c)))) 137 #define frame_height(a) ((NvU32)((a).VVisible * ((a).interlaced!=0?2:1))) 138 #define nvt_is_wideaspect(width,height) ((width)*5 >= (height)*8) 139 140 #ifndef MIN 141 #define MIN(x, y) ((x)>(y) ? (y) : (x)) 142 #endif 143 #ifndef MAX 144 #define MAX(x,y) ((x) > (y) ? (x) : (y)) 145 #endif 146 147 148 #ifndef COUNT 149 #define COUNT(a) (sizeof(a)/sizeof(a[0])) 150 #endif 151 #ifndef offsetof 152 #define offsetof(st, m) ((size_t) ( (char *)&((st *)(0))->m - (char *)0 )) 153 #endif 154 #define nvt_nvu8_set_bits(d, s, m, shift) {(d)&=(NvU8)((NvU8)(m)^0xFFU);(d)|=((s)<<(shift))&(m);} 155 #define nvt_get_bits(d, m, shift) (((d)&(m))>>shift) 156 #define nvt_lowest_bit(n) ((n)&(~((n)-1))) 157 #define nvt_aspect_x(n) ((n)>>16) 158 #define nvt_aspect_y(n) ((n)&0xFFFF) 159 160 // Sentinel values for NVT_TIMING 161 #define NVT_TIMINGEXT_SENTINEL {0,0,0,0,0,{0},{0},{0},{0},0,""} 162 #define NVT_TIMING_SENTINEL {0,0,0,0,0,0,0,0,0,0,0,0,0,0,NVT_TIMINGEXT_SENTINEL} 163 164 #endif //__NVTIMING_PVT_H_ 165 166