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 // EDID related private functions 50 NvU32 getEdidVersion(NvU8 *pData, NvU32 *pVer); 51 NvBool assignNextAvailableTiming(NVT_EDID_INFO *pInfo, const NVT_TIMING *pTiming); 52 void parseEdidCvtTiming(NVT_EDID_INFO *pInfo); 53 void parseEdidEstablishedTiming(NVT_EDID_INFO *pInfo); 54 void parseEdidStandardTiming(NVT_EDID_INFO *pInfo); 55 void parseEdidDetailedTiming(NvU8 *pEdid, NVT_EDID_INFO *pInfo); 56 NVT_STATUS parseEdidDetailedTimingDescriptor(NvU8 *pDTD, NVT_TIMING *pT); 57 void parseEdidCvt3ByteDescriptor(NvU8 *p, NVT_EDID_INFO *pInfo, NvU32 *vtbCount); 58 void parseEdidStandardTimingDescriptor(NvU16 timing, NVT_EDID_INFO *pInfo, NvU32 count, NVT_TIMING * pT); 59 void parseVTBExtension(NvU8 *pEdidExt, NVT_EDID_INFO *pInfo); 60 void updateHDMILLCDeepColorForTiming(NVT_EDID_INFO *pInfo, NvU32 index); 61 void updateBpcForTiming(NVT_EDID_INFO *pInfo, NvU32 index); 62 void updateColorFormatAndBpcTiming(NVT_EDID_INFO *pInfo); 63 // End EDID 64 65 // CTA861 related private functions 66 NVT_STATUS get861ExtInfo(NvU8 *pEdid, NvU32 edidSize, NVT_EDID_CEA861_INFO *p); 67 NVT_STATUS parseCta861DataBlockInfo(NvU8 *pEdid, NvU32 size, NVT_EDID_CEA861_INFO *p); 68 void parse861ExtDetailedTiming(NvU8 *pEdidExt, NvU8 basicCaps, NVT_EDID_INFO *pInfo); 69 void parse861bShortTiming(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 70 void parse861bShortYuv420Timing(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 71 void parseCta861NativeOrPreferredTiming(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 72 void parseCta861VsdbBlocks(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 73 void parseCta861HfScdb(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 74 void parseCta861HfEeodb(NVT_EDID_CEA861_INFO *pExt861, NvU32 *pTotalEdidExtensions); 75 void parseEdidMsftVsdbBlock(VSDB_DATA *pVsdb, MSFT_VSDB_PARSED_INFO *vsdbInfo); 76 void parseEdidHdmiLlcBasicInfo(VSDB_DATA *pVsdb, NVT_HDMI_LLC_INFO *pHdmiLlc); 77 void parseEdidHdmiForumVSDB(VSDB_DATA *pVsdb, NVT_HDMI_FORUM_INFO *pHdmiInfo); 78 void getEdidHDM1_4bVsdbTiming(NVT_EDID_INFO *pInfo); 79 void parseEdidHDMILLCTiming(NVT_EDID_INFO *pInfo, VSDB_DATA *pVsdb, NvU32 *pSupported, HDMI3DSUPPORTMAP * pM); 80 void parseEdidNvidiaVSDBBlock(VSDB_DATA *pVsdb, NVDA_VSDB_PARSED_INFO *vsdbInfo); 81 void parseCea861HdrStaticMetadataDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 82 void parseCea861DvStaticMetadataDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 83 void parseCea861Hdr10PlusDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo, NVT_CTA861_ORIGIN flag); 84 void parseCta861DIDType7VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo); 85 void parseCta861DIDType8VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo); 86 void parseCta861DIDType10VideoTimingDataBlock(NVT_EDID_CEA861_INFO *pExt861, void *pRawInfo); 87 NvBool isMatchedCTA861Timing(NVT_EDID_INFO *pInfo, NVT_TIMING *pT); 88 NvBool isMatchedStandardTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT); 89 NvBool isMatchedEstablishedTiming(NVT_EDID_INFO *pInfo, NVT_TIMING *pT); 90 NvU32 isHdmi3DStereoType(NvU8 StereoStructureType); 91 NvU32 getCEA861TimingAspectRatio(NvU32 vic); 92 void SetActiveSpaceForHDMI3DStereo(const NVT_TIMING *pTiming, NVT_EXT_TIMING *pExtTiming); 93 void AddModeToSupportMap(HDMI3DSUPPORTMAP * pMap, NvU8 vic, NvU8 structure, NvU8 Detail); 94 void getMonitorDescriptorString(NvU8 *pEdid, NvU8 tag, char *str, int onceOnly); 95 // End CTA861 96 97 // DispalyID base / extension related functions 98 NvU32 getDID2Version(NvU8 *pData, NvU32 *pVer); 99 NVT_STATUS getDisplayIdEDIDExtInfo(NvU8* pEdid, NvU32 edidSize, NVT_EDID_INFO* pEdidInfo); 100 NVT_STATUS parseDisplayIdBlock(NvU8* pBlock, NvU8 max_length, NvU8* pLength, NVT_EDID_INFO* pEdidInfo); 101 NVT_STATUS getDisplayId20EDIDExtInfo(NvU8* pDisplayid, NvU32 edidSize, NVT_EDID_INFO* pEdidInfo); 102 NVT_STATUS parseDisplayId20EDIDExtDataBlocks(NvU8* pDataBlock, NvU8 remainSectionLength, NvU8* pCurrentDBLength, NVT_EDID_INFO* pEdidInfo); 103 NVT_STATUS parseDisplayId20Timing7Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 count); 104 NVT_STATUS parseDisplayId20Timing8Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 codeType, NvU8 codeSize, NvU8 index, NvU8 count); 105 NVT_STATUS parseDisplayId20Timing10Descriptor(const void *pDescriptor, NVT_TIMING *pTiming, NvU8 payloadBytes, NvU8 count); 106 void updateColorFormatForDisplayIdExtnTimings(NVT_EDID_INFO* pInfo, NvU32 timingIdx); 107 void updateColorFormatForDisplayId20ExtnTimings(NVT_EDID_INFO* pInfo, NvU32 timingIdx); 108 NvBool assignNextAvailableDisplayId20Timing(NVT_DISPLAYID_2_0_INFO *pDisplayIdInfo, const NVT_TIMING *pTiming); 109 void updateColorFormatForDisplayId20Timings(NVT_DISPLAYID_2_0_INFO* pDisplayId2Info, NvU32 timingIdx); 110 // End DisplayID 111 112 NvU32 axb_div_c_old(NvU32 a, NvU32 b, NvU32 c); 113 114 #define NVT_EDID_BLOCK_SIZE 128 115 116 #define NVT_PVT_INTERLACED_MASK 0xF 117 #define NVT_PVT_DOUBLESCAN_MASK 0x10 118 #define NVT_PVT_RB_MASK 0x20 119 120 #define NVT_PVT_DOUBLE_SCAN_HEIGHT 384 121 #define NVT_PVT_DOUBLE_SCAN_HEIGHT_VGA 600 122 #define NVT_PVT_DOUBLE_SCAN_PCLK_MIN 1200 //in 10KHz 123 124 #define abs(a) ((a)>0?(a):-(a)) 125 #define set_rrx1k(a,b,c) ((b)*(c)==0?(0):(NvU32)(((NvU64)(a)*10000*1000+(b)*(c)/2)/((b)*(c)))) 126 #define frame_height(a) ((NvU32)((a).VVisible * ((a).interlaced!=0?2:1))) 127 #define nvt_is_wideaspect(width,height) ((width)*5 >= (height)*8) 128 129 #ifndef MIN 130 #define MIN(x, y) ((x)>(y) ? (y) : (x)) 131 #endif 132 #ifndef MAX 133 #define MAX(x,y) ((x) > (y) ? (x) : (y)) 134 #endif 135 136 137 #ifndef COUNT 138 #define COUNT(a) (sizeof(a)/sizeof(a[0])) 139 #endif 140 #ifndef offsetof 141 #define offsetof(st, m) ((size_t) ( (char *)&((st *)(0))->m - (char *)0 )) 142 #endif 143 #define nvt_nvu8_set_bits(d, s, m, shift) {(d)&=(NvU8)((NvU8)(m)^0xFFU);(d)|=((s)<<(shift))&(m);} 144 #define nvt_get_bits(d, m, shift) (((d)&(m))>>shift) 145 #define nvt_lowest_bit(n) ((n)&(~((n)-1))) 146 #define nvt_aspect_x(n) ((n)>>16) 147 #define nvt_aspect_y(n) ((n)&0xFFFF) 148 149 // Sentinel values for NVT_TIMING 150 #define NVT_TIMINGEXT_SENTINEL {0,0,0,0,0,{0},{0},{0},{0},0,""} 151 #define NVT_TIMING_SENTINEL {0,0,0,0,0,0,0,0,0,0,0,0,0,0,NVT_TIMINGEXT_SENTINEL} 152 153 #endif //__NVTIMING_PVT_H_ 154