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