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