From 2b01eca81157871222eb8c59634dd1ebd75bdee9 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Thu, 17 Dec 2020 01:44:02 +0300 Subject: [PATCH 01/39] Fork-specific changes. Respect to all previous authors, but this is fork. --- .gitignore | 7 +++ App.config | 6 +-- PolarisBiosEditor.cs | 2 + PolarisBiosEditor.csproj | 4 +- Properties/Resources.Designer.cs | 44 +++++++----------- Properties/Settings.Designer.cs | 22 ++++----- README.md | 5 +- bin/Debug/PolarisBiosEditor.exe | Bin 74752 -> 77824 bytes bin/Debug/PolarisBiosEditor.exe.config | 6 +-- bin/Debug/PolarisBiosEditor.pdb | Bin 44544 -> 48640 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 7253 -> 0 bytes ...arisBiosEditor.PolarisBiosEditor.resources | Bin 15652 -> 0 bytes ...sBiosEditor.Properties.Resources.resources | Bin 180 -> 0 bytes ...sBiosEditor.csproj.CoreCompileInputs.cache | 1 - ...arisBiosEditor.csproj.FileListAbsolute.txt | 10 ---- ...isBiosEditor.csproj.GenerateResource.cache | Bin 1024 -> 0 bytes ...isBiosEditor.csprojAssemblyReference.cache | Bin 11633 -> 0 bytes obj/Debug/PolarisBiosEditor.exe | Bin 74752 -> 0 bytes obj/Debug/PolarisBiosEditor.pdb | Bin 44544 -> 0 bytes ...sBiosEditor.csproj.CoreCompileInputs.cache | 1 - ...isBiosEditor.csprojAssemblyReference.cache | Bin 11633 -> 0 bytes 21 files changed, 49 insertions(+), 59 deletions(-) create mode 100644 .gitignore delete mode 100644 obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache delete mode 100644 obj/Debug/PolarisBiosEditor.PolarisBiosEditor.resources delete mode 100644 obj/Debug/PolarisBiosEditor.Properties.Resources.resources delete mode 100644 obj/Debug/PolarisBiosEditor.csproj.CoreCompileInputs.cache delete mode 100644 obj/Debug/PolarisBiosEditor.csproj.FileListAbsolute.txt delete mode 100644 obj/Debug/PolarisBiosEditor.csproj.GenerateResource.cache delete mode 100644 obj/Debug/PolarisBiosEditor.csprojAssemblyReference.cache delete mode 100644 obj/Debug/PolarisBiosEditor.exe delete mode 100644 obj/Debug/PolarisBiosEditor.pdb delete mode 100644 obj/x86/Debug/PolarisBiosEditor.csproj.CoreCompileInputs.cache delete mode 100644 obj/x86/Debug/PolarisBiosEditor.csprojAssemblyReference.cache diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b92bd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/.vs +/obj +*.rom diff --git a/App.config b/App.config index 3a4868f..4543795 100644 --- a/App.config +++ b/App.config @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 049ef8a..5c6f0b9 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -488,6 +488,7 @@ public PolarisBiosEditor() InitializeComponent(); this.Text = this.programTitle + " " + this.version + " " + "Tweaked By VASKE"; +#if !DEBUG try { @@ -523,6 +524,7 @@ public PolarisBiosEditor() } catch (System.Net.WebException) { this.Text += " (offline mode)"; } +#endif rc.Add("MT51J256M3", "MICRON"); rc.Add("EDW4032BAB", "ELPIDA"); diff --git a/PolarisBiosEditor.csproj b/PolarisBiosEditor.csproj index fc7a2b8..d12352c 100644 --- a/PolarisBiosEditor.csproj +++ b/PolarisBiosEditor.csproj @@ -8,9 +8,10 @@ WinExe PolarisBiosEditor PolarisBiosEditor - v4.6.2 + v4.6.1 512 true + AnyCPU @@ -68,6 +69,7 @@ True Resources.resx + True SettingsSingleFileGenerator diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index c87c7f8..6ab416a 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -8,10 +8,10 @@ // //------------------------------------------------------------------------------ -namespace PolarisBiosEditor.Properties -{ - - +namespace PolarisBiosEditor.Properties { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,51 +19,43 @@ namespace PolarisBiosEditor.Properties // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PolarisBiosEditor.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index 803d2fd..d6adae3 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -8,21 +8,17 @@ // //------------------------------------------------------------------------------ -namespace PolarisBiosEditor.Properties -{ - - +namespace PolarisBiosEditor.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } diff --git a/README.md b/README.md index 8383f27..23e74f9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# PolarisBiosEditor v1.7.3 +# PolarisBiosEditor - fork with additional data views + +# Below is readme for upstream version. + ### PolarisBiosEditor tweaked by vaske version 3.8 with pro timings can buy on miningbios.com ## https://www.miningbios.com diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index 991fe40d4de05985683045c05a63ced0a2b9ae85..ae9a9f3f3649653828be8029bf07f284e568c401 100644 GIT binary patch delta 23098 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 delta 21217 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 diff --git a/bin/Debug/PolarisBiosEditor.exe.config b/bin/Debug/PolarisBiosEditor.exe.config index 3a4868f..4543795 100644 --- a/bin/Debug/PolarisBiosEditor.exe.config +++ b/bin/Debug/PolarisBiosEditor.exe.config @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff --git a/bin/Debug/PolarisBiosEditor.pdb b/bin/Debug/PolarisBiosEditor.pdb index 1377bb9ccf93ee7b7c6b031078239e90a6f0e10e..43832dd9d62ec3414ae024374286b1616d14c919 100644 GIT binary patch literal 48640 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%0A3e7&9Ti@9ZcYDMB(C7uP+J&4 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 diff --git a/obj/Debug/PolarisBiosEditor.Properties.Resources.resources b/obj/Debug/PolarisBiosEditor.Properties.Resources.resources deleted file mode 100644 index 6c05a9776bd7cbae976fdcec7e3a254e93018279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/obj/Debug/PolarisBiosEditor.csproj.CoreCompileInputs.cache b/obj/Debug/PolarisBiosEditor.csproj.CoreCompileInputs.cache deleted file mode 100644 index d02d9ba..0000000 --- a/obj/Debug/PolarisBiosEditor.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -5de2e88d6e57cf3dbb2f0c4f84a0fc6b967b8697 diff --git a/obj/Debug/PolarisBiosEditor.csproj.FileListAbsolute.txt b/obj/Debug/PolarisBiosEditor.csproj.FileListAbsolute.txt deleted file mode 100644 index 6146e1e..0000000 --- a/obj/Debug/PolarisBiosEditor.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,10 +0,0 @@ -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\obj\Debug\PolarisBiosEditor.csprojAssemblyReference.cache -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\obj\Debug\PolarisBiosEditor.Properties.Resources.resources -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\obj\Debug\PolarisBiosEditor.csproj.GenerateResource.cache -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\bin\Debug\PolarisBiosEditor.exe.config -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\bin\Debug\PolarisBiosEditor.exe -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\bin\Debug\PolarisBiosEditor.pdb -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\obj\Debug\PolarisBiosEditor.PolarisBiosEditor.resources -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\obj\Debug\PolarisBiosEditor.csproj.CoreCompileInputs.cache -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\obj\Debug\PolarisBiosEditor.exe -C:\Users\VASKE\Desktop\PolarisBiosEditor-master\obj\Debug\PolarisBiosEditor.pdb diff --git a/obj/Debug/PolarisBiosEditor.csproj.GenerateResource.cache b/obj/Debug/PolarisBiosEditor.csproj.GenerateResource.cache deleted file mode 100644 index 7dcee336bb67844a8eb1986c8564c2f57250f2d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcma)4QEL-H5WZ`2Y3`ERuif>`CJ< z@VEKyqxf3H|DZERTS|LK=V5Md=G*(`oBKT9^Sr+l{N$*wQ93@BR0%^cFfw7Zk^lNU*^ zC;MHoBLXISUd-_x@C~H9u!K}XI#YmU0*4mx!=BQB&84wUOf?*;sTG#`TT_Abmd-&k zVpmz1Ib&C?i4zXEG$cU#48ba))mM<03d&{Qds;ljO@3a;Jz;B%4NIJO>L>{Ke2>e# zkh;7fy7XkSLI(@lxz?nI7LM`0z|Xn%oFc}jX!h&ru#mGn)Tk}OpuvIQhXlZ5on^-v!Is+uik{1NEY7y7L)wiA%C^)$D{Xg$s zzG691l*`}&!zv}81+g9m(Blda(lLxEH5ke_D>X`wY2YPTM}GK37BZQg0mkH-^GcoC zkH$umS#YQfzLtul=e-6q<;&clL->GFg9$hqOu`XxuUG7oyKZe$DR(OWnVP<~C2n1N zYQ>&xCzMjLfbCm#EzlhqsS*Y9;jJE=D|A>Pw`}T|8OL|;_I9@?A;}U1A`g%7CdYC|9za4!j?2Xa$PuzfAaLZE+nv3e+`ck1 zd&z}I00ji1fC36wf+biArBI56Sc)ZBiltZzg;rF%>BP#&!ZpT*PBE#kx0Bp1xJ+GZDh7?aEo5uua|@TxlOlH$`9K9xS#Ka+1IQDP0v|bbDDu?SGqbkHb*LM@qA};us-h8R*rNpE-x*g zQSRv}E$y}!+Z|}^7`~0dq#rodLSP3DRHE!wobasuNcktai%P{Q26PL4ex2=)1@=hA z!Ci}XGAWq8EL5M7wcZd9SNJsQZr*S(oE}l2Am+jE(jW7 zYl2#vn90`G*nypgDL6s@&cLZ*fcRnC7PUP(qiuWk4!1TMHa3eItIlL&m$XTKc7KBfRnQTT!IA*L1+}d`uHV?BUdZIWOW=9gd+3Vj-FIv1Bv{ydl%!I5->+hZCkc;BA@?C&J+* zIGjAy0dL-PI0X)i;LtVI0bj{lEQZ4pI4qs& zfSzJHEQ7-ta5!_S1A3L|a26bv!(qi#2lPPG;cPgpgu^*g9nf1%hgEP`O(xw-M*Y$m z^qK@Z5CV!+*S_?`Ft9q8+(aMD8kl}EIdnpl40>1y$8q1`Ido2p-}G8Cvum`nxTTt% zuT>i957L!cxKb+@!wc*7UMPhZ)<-_I^0<_or(6j&8T9Dz2E+Jp-=F?`au*lCY#@`v z*g(mk;~&Ud9UymcA{%r5!-h%`n|CKHwL zsggVCM(|{~n%qGZ+?k5QIw*0sQtjZ@3lF31!uATqrk1#k{vh^{iHbz~D%xYv{iK)Z z+o^U4_bn}P2mMLh8IkEI;WZUrW#CxLB>XO_DWCUlIu-YjiHZceDsYSeVqKKLd#M(` z*Zb&1+#j*%C~+kfS7dNlVI}S}RGSq)yysZr0lFd{Boh_M99EfI879_Q$^0DElxKd3 zPQ}9!jgAs{nF`#(0I_CE;1{SC-6TG~CB8^k#3N*)BAFMf%t3~U5I{1&M78)mewj|h zV-bsv61P#sUC7`NOi0{Us21HKHt;O*Rk|XcAQKhIJYQv=$1o96NamANQ{Lm(=~O%w z(da0FYgJ%B11ykK0>4SM_?f>&C*o-`QIWV_6}Otf4U%5szC*QX2F^3|C-H1VrlW+P zt-@C@aKt?l{ynNG5C45S70;20iUgja0+%sB#849WL#jn{{~EcQV~HQpMe%&Zq@%>1 zu3~!_ETS@r{R!3PwgynaDK=?on6$)C>8f~vOjIQIRF&Jsa1rQ9?n_j&THJ7=`x#vj zFGoB&O5{l@@&lF62bufLj}Ig0E;njHaW+`?jYdi7`VTxxVIP_ zawhr6IdayA-N9haH<)j#%r_XO6EhDb=Xh?Mq)^>0TH-KZ4>z!XP_eHwSma{zR*xWO z828g^)0z1h$ewD`nx6r`-O2xgx;E*9o-0|eB^_~-eJkdb@Tt&Xj zAdzoMuMD~&M{MNKO=-D-&exSq;NtRdxcE7>?hRS}5Vb^2!I&wBY|9WuGGq_(z#muPk1=p;S;!Z%iJT9evd;9`#WDK5%Mu0P2MzqAD*h1$@5T5_ z$XTDTE(LRo!Th|+e3)VSF>{EV7qo759VotAM@QzRPkb#Qy86-CRB=TeA9Q|JlHs-X%?P%l?gH*^1Gi1ZxeRW1jQbQh>)+~LFz+*%j>;^V%(>SS6MJNBPwpDpykNEZBKOfkI4nQ-x+5=fEAQh`)0bFmSoHIT%v z7#cC8w;9qs(@F1$q>rx}-kp2NTAsw76-&K4l15LM#BLNTz0Z(hr-_w5U`QXFPWq4` z#nuo@#U_vbvasXBO0j{XOR<~7O0h4aOR-7AO0najOR@dJO0k=wOR=@WN}q|O@z=se z2`j~}hfaNNIw^KCLTOCJwgyYZ=7cWAP6aE)rh|S1*nwcB*ig`=*j-?yuNusv&q|S->ry1@tP~lwE=79HN|7sv(s*nkab~5+e03_)U{;EZR;MDp zWu?efbtw{8R*F1Smm(=;rARMzDRNC#ij*;w#+?xPBP&HRs8f*{vQi{^x)fO-D@6jQ zOOeg7QsiX16bTwDMVb{#tQ5(SE=8uqN|E&FQe;4^6giA8MMA?$ zk(TIEi3EOmz5$^)v1VESt){0U5bd5l_I#* hrHC|HDMCbDig=NgBK*^(hy__GqB>oQ5Ra42`Y)u;fDr%y diff --git a/obj/Debug/PolarisBiosEditor.exe b/obj/Debug/PolarisBiosEditor.exe deleted file mode 100644 index 991fe40d4de05985683045c05a63ced0a2b9ae85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 From 48b22b8ee3c736b9cef2a804d4175dbcc87ad3fa Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Thu, 17 Dec 2020 02:30:42 +0300 Subject: [PATCH 02/39] Introduce text output, fix ATOM_Polaris_PowerTune_Table --- PolarisBiosEditor.cs | 39 ++++++++++++++++++++++++++++---- PolarisBiosEditor.csproj | 5 +++- bin/Debug/PolarisBiosEditor.exe | Bin 77824 -> 78336 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 48640 -> 48640 bytes 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 5c6f0b9..61c29c0 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -9,6 +9,7 @@ using System.Linq; using System.ComponentModel; using System.Net; +using System.Diagnostics; namespace PolarisBiosEditor { @@ -97,7 +98,7 @@ public class VRAM_TIMING_RX ATOM_POWERPLAY_TABLE atom_powerplay_table; int atom_powertune_offset; - ATOM_POWERTUNE_TABLE atom_powertune_table; + ATOM_Polaris_PowerTune_Table atom_powertune_table; int atom_fan_offset; ATOM_FAN_TABLE atom_fan_table; @@ -320,7 +321,7 @@ struct ATOM_FAN_TABLE }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_POWERTUNE_TABLE + public struct ATOM_Polaris_PowerTune_Table { public Byte ucRevId; public UInt16 usTDP; @@ -349,7 +350,11 @@ struct ATOM_POWERTUNE_TABLE public Byte ucVr_I2C_Line; public Byte ucPlx_I2C_address; public Byte ucPlx_I2C_Line; - public UInt16 usReserved; + public UInt16 usBoostPowerLimit; + public Byte ucCKS_LDO_REFSEL; + public Byte ucHotSpotOnly; + public Byte ucReserve; + public UInt16 usReserve; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -450,6 +455,28 @@ public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) } } + private void Print(object output) + { + //Create our own namespaces for the output + var xs = new System.Xml.Serialization.XmlSerializer(output.GetType()); + using (var sw = new System.IO.StringWriter()) + { + try + { + var ns = new System.Xml.Serialization.XmlSerializerNamespaces(); + + //Add an empty namespace and empty value + ns.Add("", ""); + xs.Serialize(sw, output, ns); + Console.WriteLine(sw.ToString()); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + } + private ListViewItem handler; private void listView_ChangeSelection(object sender, EventArgs e) @@ -579,7 +606,6 @@ private void editSubItem2_Click(object sender, EventArgs e) private void OpenFileDialog_Click(object sender, EventArgs e) { - Console.WriteLine("OpenFileDialog"); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "BIOS (.rom)|*.rom|All Files (*.*)|*.*"; openFileDialog.FilterIndex = 1; @@ -653,7 +679,10 @@ private void OpenFileDialog_Click(object sender, EventArgs e) atom_powerplay_table = fromBytes(buffer.Skip(atom_powerplay_offset).ToArray()); atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; - atom_powertune_table = fromBytes(buffer.Skip(atom_powertune_offset).ToArray()); + atom_powertune_table = fromBytes(buffer.Skip(atom_powertune_offset).ToArray()); + Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); + + Print(atom_powertune_table); atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; atom_fan_table = fromBytes(buffer.Skip(atom_fan_offset).ToArray()); diff --git a/PolarisBiosEditor.csproj b/PolarisBiosEditor.csproj index d12352c..5e44305 100644 --- a/PolarisBiosEditor.csproj +++ b/PolarisBiosEditor.csproj @@ -5,7 +5,7 @@ Debug AnyCPU {7D2BA443-2896-4CCE-89B6-5B39C49F2289} - WinExe + Exe PolarisBiosEditor PolarisBiosEditor v4.6.1 @@ -37,6 +37,9 @@ favicon.ico + + + diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index ae9a9f3f3649653828be8029bf07f284e568c401..a95ae82ba219558c923eb9488078162efb485e65 100644 GIT binary patch delta 21053 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 delta 20496 zcmcJ1378bs)%LCG>gr{td%C)(m)W`-7>1siW>pERvMM<22muk4h$bM=P(xH4#+ngL z#7GF1njj$xZh*lhBPxkYOf-pG6h0G!pYek{8U#%uSw#)}?>SXn-8}>UZ=V18M*Gw` z=br7Jd+XkFZ_m*2p3-qh`OeL~|Fz-mONIS&Nc0wE(jXy@fib~iF7j^PJw%c>|GrPK z+$)Lc#7#@$qp_QNManxQQ4ab|RT8!4_Q$j4e5s#*$p<8Y&oT2Bsag8Sd_w9c4KUx8 zdN+)L1^StUk1X86yHtpe;GVensDJ;J5Qj#?QjzizHG`=)GimR_X8Yvs!=9MRbk6OrdA3-rr5nI{jmQCiSk#Dlt+%{b~;*eto!? zkuv>rLfSEmirk8+=5JRSMW_7jUPgxy>LXNt&S(D8J-~Msr%BFKnu zQJ+}Fz0aLPf^r*kPZ5`LRKkt=!EFX8;f^Hk%dyT+acRIx z+#NhE_b;dAy34v*Ft~R$%m&CC#;jFhxuI49F!KroCRu?%$_oSnD-cL~fk4I!1QK2# zMjD{xlPX3~ZT%7r#W2g~s59_KoPj_541Ab7t$p}n{`~Ha(dW}DU^1MB-{co~S6u=x zhVam0qO8ICL5s<7Gv|$2Z!Ti?r!G4wm3y=2*h>Mwuo(@`1NwO6-PgCj(oos#&W(hu zz8ahiGT_gQ258`STGR~kio3&DGsum;okY$>t7ttB(68#x(eRBSjvCKlrs5eha^o1u zjmIN?QY!Nd{|=lYh>`)OzVR}b!#Yh04*FIqLW5i^ zQM+-hxyzR}%F5~Wu2yps5e_X4Um`~4d{EY_s^%^LUhd6J!Xr&NSvDZzP>NV~Qi`3# zb`cBsvQeRrgu4C*fLLl!W-?S7gtryTt3RR$SyL>&BMVRL8s-LW}fW#$6Rdjo;V8H+X- z26h%VVN-URYJw$A!J?*v!PQcY*-}xZ+Gdtjj2ZG7Vwo2y7g`+Q$F;b;t`|6MHIh)U z*Cn(>|DCejh7nZkmYDfY#qhj^noy(ki8(R!C4=_hM1DhY2Wfi5_5OHTL$MCqzM?yW zm6-?e9j$n`{W%Phzd>$urnqC}te#e`I+GRS%w{I`G_(9nX3lKo%RQ|uDY9Z*cVkhSfpksZAVY9*JBTH7*3X4A$w3_ zFwyoR*;!aJx|F4!YJH2;1}bg8fL?0Jg3O{XpgPw4OJ&sfB9aS>oG5L-`VV|KgUG#l zwWp?GuUb8O)>h*5z!y!(wi311{$FZFeyM%EMDL}Zk)AQoBPE(I{|B0)o!A_x$VikLGy)pV|j7^%@gr{N!mND!Y&p`HZOp}2q816`wu#JQ zw8?EaMk`u+Q-o}gNbW0O$5Q?rwjzI|w{@V>dgrjg`6KmOeKrC?I);FE1@ZcbW}nd4 zBWXb8Hq^jMj@)X!brVdjkG=(u%p5+tU5SPU)J16&7-=nCT440m`i_`%>eMOANG$hN z2n!S(Z1QU$+UsFlZW~1|tUQ@pt7?o-K&KK*BK?Y*^0^Q9%b?o#>)Q~6+=gmj(Hb^k z+mhQzD-CbrQfyw4OgO`WT zHn5l&R7}v}%Mlw=Owi%WX`#cHO$cvp8MzSe1~et>#Z?8$AHR49KB-tT5;@c{6ai83 zJV7gx(?W#PLYunNLWI*o)7NPs!fByh*l8icX&GS@H_?Q3nno745aG1YFgoUluv?nM z*jfw_O6tocA+TiaTJ)-7;76qHrP9aJ)S4b}2y;cbF3Rony;|7)UkCB$(w+m5M{%TYE}{V~GF zFkW;jn*(`VHLU_a(YhM2+}o<-5r{?H#;}Qq+8zj=rMO7Kl;^7^>q5$-sYQ1}){T@` z^XOFLTDMX-RAd`r!;7wI-drox@1KX0YQ%4qd76KJJC(m;7?vjiRjO+()o7Vk)>GHK zJ6Wqz*_vrGpHD^>7AyvBi^2WvRKtqqMKDK|sb#K0tH?H-E|QR~7uw%WMXP9TfF9MN z@Gv+PG1egFcI-C_;&bCY!J(_DuFv0}g|+aAADldODi(=>Z~x5K)Q#KvcpIfg^|{hI+dwbB5Bc$;w(z_s+Qj0Za$L^s8o(3 zoHx?FRH`t6{tGA-96*!3l1)?yTKZTVv*99rDhfsO`S3wiAH=Whl~k#c1A0rZMwQpc zthujO@&ZD&MynT1T9eg_W+2^rk+pk~E$T&oty!nKjsoi4OQl*3=)~Uj>R1cS0j1&! z+$})u;C~L3svmIw1U0H?fL8YDrBaasbY!1;m8uS)R{%vBLFgu+R3!l2*C(mc&JXnW zKxs1vD%B@d+Mt2H3<;;5;Vk)l}bIhk3ss?-lS$lV!!aJ!p zqn-9gp-sVSK1G{S6mKqTy83k$Ur$i2lE1llwcq^WCM>E>)5uIoQ}NBk?#z_@jl<`e zanfhzd5y6e`-)PxW2)0RE#-*AUCQI)_ufXcJI%)@iN+|zxg2dp>BS9s4NinnMN#g>yzo13$h zl?U3(QQC@OH^aVHpNg=te%zc*#XQ7rzSyfTW*$PL%RqBeHdcM0UFOEDS6}TkdNpsh zhD@UQ6vD)0h|lw@MKNQ_*YvNVi+V~izsbd|6W{_}bV}OT5NsU|WuusS{@i+ilL~G{ z{p#==c~2@5v@2mJQ~7e2dyn$9#hw;a-OFwDG%X@X?K(8k={sOUwMH+?w&|;evqILLKM@vV+Kyfzk z3RAUt2$M$AOleT0mX_<%Nf`@7G3j`j9W*FDys&O^xrVvr6KTm3wyv%x87En667aa;gDB=YPD}=re z{n0-IsLtGokm-Aem=?=63B6ZDtinm>CUEt|zzbhQMdGp=%fx8A63v-X$yZ7x6SASk zZBgN|T~}#U*><6yQ`y6HwN{-SA@r}KB`jI4p9EfT-5`5Xe#@RdFbe&505ab|j13%0 zvE~QVGzy!H{q-4C%Q7+Z`m2^qW@HFuTcJfCvhh-7n? zbNDujhntQMdFP%pIQKZtA$dC-hHc5;l{)V&Yo3%Z@7-(nypPt0rrOY|e9{ePuFn(V+W3|CAJ}?SHK)*#?D(h^tKclx2moAdzRxCaKcDm7#Tfa>xzCyN8!{2^h zK^U7vUYJhLw(yt&iZu;fHcam#DXwgW7)!V zYh(+YUqCM?$evY@rOP5)c2WVIT#%(pFxxI|f0nG#exZZ6w=lYi5=51hElj0}ZFoun zoysUDep&&Y&M1$}i~>57(eIGmS%mWKUT!mJVaRQibc>MND5-gzl9tCQCwZLuoX4q8 zHlAU7avM#KRC%hr^)}egndHP`>h*P)lD8Kasg_jSXuX5P?ksR)x$hPTeE{iTlI4xW zbKffv_zey}=5gy5uyS`r5$fZ?)R)iGX_? zKuX=yOQ2r@Eh<>Ywr-`!zHdcFP3ed6;-!Lx+!#m>>#Qk?ju@#WsmhYv5Hpbvj$W`- zMQ)pAnW!^3rKWTg^+>9s;1oVt<<>f3I3vQ65xnr-{1U$=?{@%*+z;T@z5=`33V_%t zU#hXh1u^v}in>LNv=6bQZ$%cY&JD9ip4zI4y~J|&6m07+6paHdBf0HnYGkdk!xAA* zP430M8 zMk5& z6`HZ1caNHyoYY!`omw_?aZzf?y%QG4vK@0Fu`x+^BDle!J&V7op&e^SECr0`t;!e};TghCerrP{mCc?=$2&0g4imW8%6k$oqX_IjJ#yf_Ua@uC| zQ<>P9%JaJCoA~;zMG+Gt?K3Ff)g*ie(v;sCsLjc@McDafGj|o`n|wPlaUiAnrhT9D zO`HCXoV|#UAg6n9Z(yZMH??)oH_Pwf=*|7-MN2jkYOBlVmk1}nL^v~=0x3x^1yqt= z-gm8xQZ16tD6y?o-C1(+yE<6bsX>3dD5WgPGx(M6lYp9>j9P@9QMU54qKvZd(j-zn z#7U%T2uYl3EpH_0EE+_dVFpuE_l&am%T`7Qk1fq8wI%ZzCBn%l5l%)aD*YWYVK2TE zo&H`CgR2)Sqg1iwGfHf0S@;*_={EGn$QLivrXSqHG*IljG^12Caz?3UL`IE*q?1unJ3~gPse49QTul`gG-B|YkXl+2Iq_4ze13^4 z>~2Ik38o-R5=_CCB$!IVLTSPUqLpsG^RZXqA~sdJ`B5lhj}-k&`RQ6233ui@XOZOf zB=^tEjgPhzFBsJ342DJ6gTYz@NXs4!imVVa$GP2neSGZ%dubrf8M01IRq6ftIg_6< ztTD_AY~X~_sZ4FDvV5+Ia^^A-PO2{iQIhHwVq8o{?a57y)XIEiL5Ym#s~{o@AsZ!y zs3o}5nqEY7pEj(#hNCYCrSS(6A{8r{HYAuT&v%6=)WnreO}s0w-NX$Mr(w6%Kqs42 zAirVr73_9%`9!AzAx@zaC4Hc#s#J5y{>|dwC<>bx9CjKbU%H)86Mi@3yM;iUK^Q5F zqEVPaF%*|`Sm;XE=xJmsnC}HqXNZ{vm!xmRJT8fwRqiT^+aON*9mL$N7AL-Q2AE#r zm#8!NWkFy1(e8d(Hr? zaedzkm|8RK#CW*CNR_9zb{65dhjR(@fZuH&vv02`#ps~mNP$MZpK>CNylEgZ4Tw3lrxw(hPCY5LbU#t z3eomh${EswGpGk=U=PlK9vnI~=kB)hZ@cf`LkKD8=Dw*1hhDwX5b32T<t`>+gs>wBHA}F z8>|b#+&(C@{@5JWl9r<8{Fc;^7^}>IioaQ?O}*vJPuTd})--ySc^bqT1?n9nLd{Q^ zyIYz@(_Ltv>xH--&z+F$GkcA`bmdoD5ri0p17LkG@aD`Gmwj1?5O{qqm@^rLvseXs zovBUf7hMSo$|8j~pf{eF1>$LQ>Xf*Fkofnn5H)?p$vA|B+r~9KiH_hSL>InPq#sp$ zUbZ}@ilyZQU-OTMRfx}FN)^Gf;hHL5X7~`p8Rf*OWq1z5bD96Ce`-uM#Aa8Sg(*p^9Ht5j0|nBQT^TsM#ANH+w4Pxm0m}K`nNc_f4H(8hMIh2ZUVz2oSV6R%1vM3L1Fmis45;so>cK<<*k6f3x6I8 ziVQAy(VN2z|KvLo@{3=G$jwz1l$8zTM=DyyH5h|dVE|q#7BYOff>Ql@fI{DnKKaE5 z+`m`28}FmXs%Y_2YdN~)7jcHahg!Q9-R+JfyYGOInXH=Y4gaD<~FWIAY@M=rIiC^5_wCPlSoz zR5cbzD1PW8p;1|1)(lV)qdweILUwjV^{GtkdiisUw zQvSS-B!7t>$3$z0+{{f6*Mi~`BRK_bFvJb{Wj<#zHSWP9&xQzAO>^L!96dWfq`W zc`@KqViDkz;w!|LNIp?@C7`QrDPTj4;5f!-S1t#Bzh@QTeCGJPYk>czmSkS^Tnkvs z{7*gWfInz(!`q$?5Od=<0zS)}W1bDbzZTyJ_#Ni#_1p%$IesT#mQ8d;wgSH{emCIg z_y8^hZe<^*-)eTJ8&sekJP!6o7)w&_eao$i56l1CjbC2b5_%WJBMi^2JnU9O%Y5&HGp_0=;D}m+W(~pJ3{NosU55Kr z;tyfGLMHrUiC`mZt*Ivb5{5rk$;&{7r>Z{!-iPE3@eV7nV-fO^!d(%9?}Z6o6(IN% z#y2X2k7axo%WP!)3dZXhpUf6sbdlr%hIcamR+bsX@K?;al%bJg);GfoYJQmzld>Hidq-&pj^Z7HEw;M;aKK8!1!>6n;1rz-;ePN zs|_+SQT+?x%{(?+g2Y+L4i>rzpTMC^q}@ zq)98w_^ovm#PuB3b#-KOj)z)TBV5e?E4gPocygW1Mt{a?k5`aTalhB_g!&4@Cwbbw z$^-OchIMSToZ%tnw6LAwJj6NX{F3L#C7h=l2pT9Q$;~Saf5bsd;2>US`c%DBWmvjSc2L0?0I(icN=R)G5bE>F4<{2pZ! zdr@idM0=0t4nxOX0%j9o!L;mHk>joFGHE zTp{WW1B$icKHR|)Ss#juq<9oJh(g>cejHfrN{M%D%AX#nro~0LOe7bHxGH*y8*u?f zdUqhSUQVEofa)Wb;97>--id$c>MLeUwW!;~hpv8N6pm`tc7Mf+kA34oJ!ezD@J$Bw zE2i%B`jRu$f#QFd`UY7s#6a-@lbaKtM(3dMWT6plbofZ)#Ercjb)+OBIAlm-cajb& zLxH=*A5rf}Vl^roSu_UzQyj-$N$ja2<$r0RkV}k66K7{Raft6?zGCxFvg4loV)qY2 zR}!~ySkI>ZZvj1q`WtR;XCV*{UTm%yKg9jpS?&{u@P)MosER5;zi0#uiNOqqGaSos zGQ*h+=QCUk7{xz}K=P}FL65aeYyhmrt3*a6iC`yST5Mo^Gs7)_8L^%5=K%+Z{ZcwS zLL8Ku1Cs$~RZIhn$7Tawk-ix4(u&Ign*(c@(;K6zRCRiVlMNQNLYD|rAo@%IVhNX)O~4(ww1 z7{e_LeeyF^hjD0cavz0OK#htj`B2n24nnQ?m#C7WVXx$q*8~qB#-9hs*)vr^sZs8i zib{j!v~RZ5i~BuX9*>+2mv6*jx|j6ps;C$%*9YfG$EAPbNYzXFnb*=?1o?5^B~qib zCb*34tds`B!aBew;_IdP^3Nh03_NPn_ee|Sp9i|&{!sKOz`luR!M{22b7?HQ94l>A ze}Cn$Z$Htix|$Ak0QH^ z2a@~eSmF!9^KD!EdepS~LK`HFQAYI3iax63+uxm~_2bwKQb(Y>Nk z()>8@$#KBLVq4;7`FT0ze?XpW=VrE-alLV#xoNm&jY>m*c}AI@*6OAUQZFj|xq9Y4XnK9M?g4jeEN5Fb1VdI*cF|LwSe# zRo78u3uk2co8{NIHp?^{Xs}*zJ#PgH{B_rH`TNPYTw8cCTZ&NLbG^i~VL!uzH2>KY)5<~dZX^o7oAHO6%3#;!p8jZ#R-COI7B|AsVNsqM zsT}87eO$C))VIr3n6XF2YwlC7?eaRn)$B%-KP$&fhO=?X32^|~I>Dyrb0{aozunW7 zEy5f4#I;L$p{gF4xGXdm96u~*@{36WQOgI=OCOKlT4`4LtI96mE0mX*v)VO7?NDSf zRonx(kl_kIFaDXPtx8&aORV(t6YBvR#ZN@5cK~+GWmxeeq7|?PRpI~~MYjSriyr}= z#c-r}3ix=j)xe`gyb3s*8x}CUTpR`GDiQGvz|BY6Gnq|aE*=tZc`nCcdL`gi!1XqK zNK|?6m5Fn&d@o>U)D*3r$Hh4JU!{re26>X(iz|#BSduTpj^f7hOg~uWg!$B^9ma3P zNl`0plD{Y4Bkz$XxGr(6aJ9R><@&DcUDrb8>q?vAf~bPMK;ZUfKJL-q_FW1XNM51J zq85Bv)Unwlpp4rD50=)qh0;N*KXMB_>qo+tg(#e#4ayb;dq8()D|Wo@yd${t>CRik zmWvJErX0f_Vf|1qx4|L(E+pZv0H^R!kRw1D|2B(^&}3mwSv+*=5!YzZCbo$0OIz_# zafxy-)^-)gGrS-8{1KlI@%b1Zx2)pVn^aMOPbEH8_$2Y^gHJ|&L}a>NU%XcK&Y1q? ziL)-6GtC^iEm=CsZ9cwob=SaLnbb9A)e@=ek=2IObwO*rVy?ety!qxe zZ+89k+8aFPMIG0fZ+6T#&+a_8Yi*|?ndq6Q=15PJfnDIuUzi&hF1r@;f2AVEW6Vp-0=^0S_&`p zy3!)Z^a+OlhKX>eWbVFyh!OC4lyJvJS*~-VP3y$vrz?mbOgF7#TX3kSDcrGH4tLyv z&z2xqvJ7my*Xsh}b^fyva_sf_WCeRNd4xRXZ?Mkteh1?42k_hRFdWo6`)Zwys1hX! z))8l&+Zzr^ax~mISV{`};dS{XcOWE5br#FK>4EeJYEKHZP%aRROYuuunm|2)2?WLv z$a)3ZpV2x;qdQ(;=KBvU^6+o@cTP1ge6U_xXyzX5dF1*$f*k(Ppm#5uQuzal6dB4`V%WcW;u^x~4JT8R&8~o1(_IhY`ggf_g zTn80I7ozTW?!*6GU)eQDQh%eU;f{mmqq~QDNw_xLvBCW3?)t{ZaD7f@2p&Z5(656E z2o#t?!eT^i1P^wNe<&_@U9#uB(b@bz(TBS|tVTk7jBk@a{y>OXvnR~%`e;G_a}w82 zx$X7^KaG6v?D1X8KlDoBv+aLpk6!m_gr_(6ipgWVT|f9}m1G|J=xbfUKYuz_zHC_6 L{*OizW8eP)zCUBG diff --git a/bin/Debug/PolarisBiosEditor.pdb b/bin/Debug/PolarisBiosEditor.pdb index 43832dd9d62ec3414ae024374286b1616d14c919..4c6d0bf965672ce2d3815c1a1bf9677fbaa6da04 100644 GIT binary patch literal 48640 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 delta 15095 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 Kz_yU1j{gB=-;|&L From 3a38f97f1a148e604e3000a3dcac114bcc6307b5 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 21 Dec 2020 00:33:53 +0300 Subject: [PATCH 03/39] structures added mem reader refactored with debug ouput --- PolarisBiosEditor.cs | 247 ++++++++++++++++++++++++++------ bin/Debug/PolarisBiosEditor.exe | Bin 78336 -> 81408 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 48640 -> 52736 bytes 3 files changed, 205 insertions(+), 42 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 61c29c0..4e24d42 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -10,6 +10,8 @@ using System.ComponentModel; using System.Net; using System.Diagnostics; +using System.Xml.Linq; +using System.Xml.Serialization; namespace PolarisBiosEditor { @@ -86,7 +88,6 @@ public class VRAM_TIMING_RX UInt32Converter uint32 = new UInt32Converter(); string deviceID = ""; - Boolean hasInternetAccess = false; int atom_rom_checksum_offset = 0x21; int atom_rom_header_ptr = 0x48; @@ -124,7 +125,7 @@ public class VRAM_TIMING_RX int atom_vram_timing_offset; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_COMMON_TABLE_HEADER + public struct ATOM_COMMON_TABLE_HEADER { public Int16 usStructureSize; public Byte ucTableFormatRevision; @@ -132,7 +133,7 @@ struct ATOM_COMMON_TABLE_HEADER } [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_ROM_HEADER + public struct ATOM_ROM_HEADER { public ATOM_COMMON_TABLE_HEADER sHeader; //public UInt32 uaFirmWareSignature; @@ -161,7 +162,7 @@ struct ATOM_ROM_HEADER String BIOS_BootupMessage; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_DATA_TABLES + public struct ATOM_DATA_TABLES { public ATOM_COMMON_TABLE_HEADER sHeader; public UInt16 UtilityPipeLine; @@ -202,7 +203,7 @@ struct ATOM_DATA_TABLES }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - unsafe struct ATOM_POWERPLAY_TABLE + unsafe public struct ATOM_POWERPLAY_TABLE { public ATOM_COMMON_TABLE_HEADER sHeader; public Byte ucTableRevision; @@ -235,7 +236,7 @@ unsafe struct ATOM_POWERPLAY_TABLE }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_MCLK_ENTRY + public struct ATOM_MCLK_ENTRY { public Byte ucVddcInd; public UInt16 usVddci; @@ -246,7 +247,7 @@ struct ATOM_MCLK_ENTRY }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_MCLK_TABLE + public struct ATOM_MCLK_TABLE { public Byte ucRevId; public Byte ucNumEntries; @@ -254,7 +255,7 @@ struct ATOM_MCLK_TABLE }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_SCLK_ENTRY + public struct ATOM_SCLK_ENTRY { public Byte ucVddInd; public UInt16 usVddcOffset; @@ -267,7 +268,7 @@ struct ATOM_SCLK_ENTRY }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_SCLK_TABLE + public struct ATOM_SCLK_TABLE { public Byte ucRevId; public Byte ucNumEntries; @@ -275,7 +276,7 @@ struct ATOM_SCLK_TABLE }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_VOLTAGE_ENTRY + public struct ATOM_VOLTAGE_ENTRY { public UInt16 usVdd; public UInt16 usCACLow; @@ -284,7 +285,7 @@ struct ATOM_VOLTAGE_ENTRY }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_VOLTAGE_TABLE + public struct ATOM_VOLTAGE_TABLE { public Byte ucRevId; public Byte ucNumEntries; @@ -292,7 +293,7 @@ struct ATOM_VOLTAGE_TABLE }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_FAN_TABLE + public struct ATOM_FAN_TABLE { public Byte ucRevId; public Byte ucTHyst; @@ -358,7 +359,125 @@ public struct ATOM_Polaris_PowerTune_Table }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_VRAM_TIMING_ENTRY + public struct ATOM_DISPLAY_OBJECT_PATH + { + UInt16 usDeviceTag; //supported device + UInt16 usSize; //the size of ATOM_DISPLAY_OBJECT_PATH + UInt16 usConnObjectId; //Connector Object ID + UInt16 usGPUObjectId; //GPU ID + //UInt16 usGraphicObjIds[1]; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector. + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_DISPLAY_OBJECT_PATH_TABLE + { + Byte ucNumOfDispPath; + Byte ucVersion; + UInt16 ucPadding2; + //ATOM_DISPLAY_OBJECT_PATH asDispPath[1]; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT //each object has this structure + { + UInt16 usObjectID; + UInt16 usSrcDstTableOffset; + UInt16 usRecordOffset; //this pointing to a bunch of records defined below + UInt16 usReserved; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT_TABLE + { + Byte ucNumberOfObjects; + Byte ucPadding0; + Byte ucPadding1; + Byte ucPadding2; + //ATOM_OBJECT asObjects[1]; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VOLTAGE_CONTROL + { + Byte ucVoltageControlId; //Indicate it is controlled by I2C or GPIO or HW state machine + Byte ucVoltageControlI2cLine; + Byte ucVoltageControlAddress; + Byte ucVoltageControlOffset; + UInt16 usGpioPin_AIndex; //GPIO_PAD register index + UInt64 ucGpioPinBitShiftN8; //at most 8 pin support 255 VIDs, termintate with 0xff + Byte ucGpioPinBitShiftTermination; + Byte ucReserved; + }; +/* +// Define ucVoltageControlId +#define VOLTAGE_CONTROLLED_BY_HW 0x00 +#define VOLTAGE_CONTROLLED_BY_I2C_MASK 0x7F +#define VOLTAGE_CONTROLLED_BY_GPIO 0x80 +#define VOLTAGE_CONTROL_ID_LM64 0x01 //I2C control, used for R5xx Core Voltage +#define VOLTAGE_CONTROL_ID_DAC 0x02 //I2C control, used for R5xx/R6xx MVDDC,MVDDQ or VDDCI +#define VOLTAGE_CONTROL_ID_VT116xM 0x03 //I2C control, used for R6xx Core Voltage +#define VOLTAGE_CONTROL_ID_DS4402 0x04 +#define VOLTAGE_CONTROL_ID_UP6266 0x05 +#define VOLTAGE_CONTROL_ID_SCORPIO 0x06 +#define VOLTAGE_CONTROL_ID_VT1556M 0x07 +#define VOLTAGE_CONTROL_ID_CHL822x 0x08 +#define VOLTAGE_CONTROL_ID_VT1586M 0x09 +#define VOLTAGE_CONTROL_ID_UP1637 0x0A +#define VOLTAGE_CONTROL_ID_CHL8214 0x0B +#define VOLTAGE_CONTROL_ID_UP1801 0x0C +#define VOLTAGE_CONTROL_ID_ST6788A 0x0D +#define VOLTAGE_CONTROL_ID_CHLIR3564SVI2 0x0E +#define VOLTAGE_CONTROL_ID_AD527x 0x0F +#define VOLTAGE_CONTROL_ID_NCP81022 0x10 +#define VOLTAGE_CONTROL_ID_LTC2635 0x11 +#define VOLTAGE_CONTROL_ID_NCP4208 0x12 +#define VOLTAGE_CONTROL_ID_IR35xx 0x13 +#define VOLTAGE_CONTROL_ID_RT9403 0x14 + +#define VOLTAGE_CONTROL_ID_GENERIC_I2C 0x40 +*/ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VOLTAGE_OBJECT_START + { + Byte ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI + Byte ucSize; //Size of Object + ATOM_VOLTAGE_CONTROL asControl; //describ how to control + //ATOM_VOLTAGE_FORMULA_SOME_VERSIONS asFormula; //Indicate How to convert real Voltage to VID + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_GPIO_I2C_ASSIGMENT + { + UInt16 usClkMaskRegisterIndex; + UInt16 usClkEnRegisterIndex; + UInt16 usClkY_RegisterIndex; + UInt16 usClkA_RegisterIndex; + UInt16 usDataMaskRegisterIndex; + UInt16 usDataEnRegisterIndex; + UInt16 usDataY_RegisterIndex; + UInt16 usDataA_RegisterIndex; + Byte sucI2cId; + Byte ucClkMaskShift; + Byte ucClkEnShift; + Byte ucClkY_Shift; + Byte ucClkA_Shift; + Byte ucDataMaskShift; + Byte ucDataEnShift; + Byte ucDataY_Shift; + Byte ucDataA_Shift; + Byte ucReserved1; + Byte ucReserved2; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_GPIO_I2C_INFO + { + ATOM_COMMON_TABLE_HEADER sHeader; + //ATOM_GPIO_I2C_ASSIGMENT asGPIO_Info[16]; + }; + + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VRAM_TIMING_ENTRY { public UInt32 ulClkRange; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x30)] @@ -366,7 +485,7 @@ struct ATOM_VRAM_TIMING_ENTRY }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_VRAM_ENTRY + public struct ATOM_VRAM_ENTRY { public UInt32 ulChannelMapCfg; public UInt16 usModuleSize; @@ -394,11 +513,13 @@ struct ATOM_VRAM_ENTRY public UInt32 ulBankMapCfg; public UInt32 ulReserved; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + [XmlIgnore] public Byte[] strMemPNString; + public string FullName => Encoding.UTF8.GetString(strMemPNString.TakeWhile(c => c != 0).ToArray()); }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ATOM_VRAM_INFO + public struct ATOM_VRAM_INFO { public ATOM_COMMON_TABLE_HEADER sHeader; public UInt16 usMemAdjustTblOffset; @@ -414,6 +535,32 @@ struct ATOM_VRAM_INFO // public ATOM_VRAM_ENTRY aVramInfo[ucNumOfVRAMModule]; } + class ConsecutiveReader + { + public ConsecutiveReader(Byte[] entire_buffer, int offset) + { + buffer = new ArraySegment(entire_buffer); + Jump(offset); + } + public T Read() + { + T obj = default(T); + int size = Marshal.SizeOf(obj); + IntPtr ptr = Marshal.AllocHGlobal(size); + + Marshal.Copy(buffer.Array, buffer.Offset, ptr, size); + obj = (T)Marshal.PtrToStructure(ptr, obj.GetType()); + Marshal.FreeHGlobal(ptr); + + return obj; + } + public void Jump(int relative_offset) + { + int offset = buffer.Offset + relative_offset; + buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); + } + ArraySegment buffer; + } [STAThread] static void Main(string[] args) { @@ -436,15 +583,7 @@ static byte[] getBytes(object obj) static T fromBytes(byte[] arr) { - T obj = default(T); - int size = Marshal.SizeOf(obj); - IntPtr ptr = Marshal.AllocHGlobal(size); - - Marshal.Copy(arr, 0, ptr, size); - obj = (T)Marshal.PtrToStructure(ptr, obj.GetType()); - Marshal.FreeHGlobal(ptr); - - return obj; + return new ConsecutiveReader(arr, 0).Read(); } public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) @@ -457,24 +596,41 @@ public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) private void Print(object output) { - //Create our own namespaces for the output - var xs = new System.Xml.Serialization.XmlSerializer(output.GetType()); - using (var sw = new System.IO.StringWriter()) + try { - try + if (output.GetType().IsPrimitive || output.GetType() == typeof(string)) + { + Console.WriteLine(output); + } + else { - var ns = new System.Xml.Serialization.XmlSerializerNamespaces(); + //Create our own namespaces for the output + var ns = new XmlSerializerNamespaces(); + var xs = new XmlSerializer(output.GetType()); //Add an empty namespace and empty value ns.Add("", ""); - xs.Serialize(sw, output, ns); - Console.WriteLine(sw.ToString()); - } - catch (Exception ex) - { - Console.WriteLine(ex); + + var doc = new XDocument(); + using (var writer = doc.CreateWriter()) + { + xs.Serialize(writer, output, ns); + } + foreach(var e in doc.Descendants()) + { + if (e.Elements().Any()) continue; + if (Int64.TryParse(e.Value, out Int64 parsed) && parsed != 0 && parsed != 1) + { + e.Value = string.Format("{0} = 0x{0:X} = 0b{1}", parsed, Convert.ToString(parsed, 2)); + } + } + Console.WriteLine(doc); } } + catch (Exception ex) + { + Console.WriteLine(ex); + } } private ListViewItem handler; @@ -546,7 +702,6 @@ public PolarisBiosEditor() myStream.Close(); - hasInternetAccess = true; } catch (System.Net.WebException) { this.Text += " (offline mode)"; @@ -714,12 +869,15 @@ private void OpenFileDialog_Click(object sender, EventArgs e) atom_vram_info_offset = atom_data_table.VRAM_Info; atom_vram_info = fromBytes(buffer.Skip(atom_vram_info_offset).ToArray()); atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; - var atom_vram_entry_offset = atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO)); + var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) { - atom_vram_entries[i] = fromBytes(buffer.Skip(atom_vram_entry_offset).ToArray()); - atom_vram_entry_offset += atom_vram_entries[i].usModuleSize; + atom_vram_entries[i] = atom_vram_entry_reader.Read(); + Print(atom_vram_entries[i].FullName + ":"); + Print(atom_vram_entries[i]); + atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); } + Print("End of mem\n"); atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; @@ -919,8 +1077,8 @@ private void OpenFileDialog_Click(object sender, EventArgs e) { if (atom_vram_entries[i].strMemPNString[0] != 0) { - - var mem_id = Encoding.UTF8.GetString(atom_vram_entries[i].strMemPNString).Substring(0, 10); + var mem_id_full = atom_vram_entries[i].FullName; + var mem_id = mem_id_full.Substring(0, 10); string mem_vendor; if (rc.ContainsKey(mem_id)) { @@ -931,7 +1089,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) mem_vendor = "UNKNOWN"; } - listVRAM.Items.Add(mem_id + " (" + mem_vendor + ")"); + listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); } } listVRAM.SelectedIndex = 0; @@ -985,6 +1143,11 @@ private void OpenFileDialog_Click(object sender, EventArgs e) tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } + ConsecutiveReader Reader(int offset) + { + return new ConsecutiveReader(buffer, offset); + } + public Int32 getValueAtPosition(int bits, int position, bool isFrequency = false) { int value = 0; diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index a95ae82ba219558c923eb9488078162efb485e65..f47f9d135f06ba1e257f025416220ef9d1658886 100644 GIT binary patch delta 27456 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 delta 24458 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 diff --git a/bin/Debug/PolarisBiosEditor.pdb b/bin/Debug/PolarisBiosEditor.pdb index 4c6d0bf965672ce2d3815c1a1bf9677fbaa6da04..690e29f1e0cb479fc45312790d5006b33d3b419b 100644 GIT binary patch literal 52736 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 From 7ed9d90a0d2208ef487c4429d39225b075855719 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 21 Dec 2020 01:23:42 +0300 Subject: [PATCH 04/39] output offset end and length in readprint --- PolarisBiosEditor.cs | 104 +++++++++++++++++++++----------- bin/Debug/PolarisBiosEditor.exe | Bin 81408 -> 81920 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 52736 -> 54784 bytes 3 files changed, 69 insertions(+), 35 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 4e24d42..6c8b0f8 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -32,7 +32,7 @@ public partial class PolarisBiosEditor : Form "MICRON" }; - string[] supportedDeviceID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; + string[] supportedID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; string[] timings = new string[] { @@ -87,8 +87,6 @@ public class VRAM_TIMING_RX Int32Converter int32 = new Int32Converter(); UInt32Converter uint32 = new UInt32Converter(); - string deviceID = ""; - int atom_rom_checksum_offset = 0x21; int atom_rom_header_ptr = 0x48; int atom_rom_header_offset; @@ -155,8 +153,8 @@ public struct ATOM_ROM_HEADER public Byte ucExtendedFunctionCode; public Byte ucReserved; public UInt32 ulPSPDirTableOffset; - public UInt16 usVendorID; public UInt16 usDeviceID; + public UInt16 usVendorID; } String BIOS_BootupMessage; @@ -232,7 +230,7 @@ unsafe public struct ATOM_POWERPLAY_TABLE public UInt16 usHardLimitTableOffset; public UInt16 usPCIETableOffset; public UInt16 usGPIOTableOffset; - public fixed UInt16 usReserved[6]; + [XmlIgnore] public fixed UInt16 usReserved[6]; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -481,7 +479,19 @@ public struct ATOM_VRAM_TIMING_ENTRY { public UInt32 ulClkRange; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x30)] - public Byte[] ucLatency; + [XmlIgnore]public Byte[] ucLatency; + public string LatencyString + { + get + { + return ByteArrayToString(ucLatency); + } + set + { + throw new NotImplementedException(); + } + } + }; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -515,7 +525,17 @@ public struct ATOM_VRAM_ENTRY [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] [XmlIgnore] public Byte[] strMemPNString; - public string FullName => Encoding.UTF8.GetString(strMemPNString.TakeWhile(c => c != 0).ToArray()); + public string FullName + { + get + { + return Encoding.UTF8.GetString(strMemPNString.TakeWhile(c => c != 0).ToArray()); + } + set + { + throw new NotImplementedException(); + } + } }; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -537,9 +557,10 @@ public struct ATOM_VRAM_INFO class ConsecutiveReader { - public ConsecutiveReader(Byte[] entire_buffer, int offset) + public ConsecutiveReader(Byte[] entire_buffer, int offset, PolarisBiosEditor a_editor) { buffer = new ArraySegment(entire_buffer); + editor = a_editor; Jump(offset); } public T Read() @@ -554,12 +575,20 @@ public T Read() return obj; } + public T ReadPrint() + { + T result = Read(); + int size = Marshal.SizeOf(typeof(T)); + editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len=0x{2:X}={2}", buffer.Offset, buffer.Offset + size, size)); + return result; + } public void Jump(int relative_offset) { int offset = buffer.Offset + relative_offset; buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); } ArraySegment buffer; + PolarisBiosEditor editor; } [STAThread] static void Main(string[] args) @@ -581,9 +610,9 @@ static byte[] getBytes(object obj) return arr; } - static T fromBytes(byte[] arr) + T fromBytes(byte[] arr) { - return new ConsecutiveReader(arr, 0).Read(); + return new ConsecutiveReader(arr, 0, this).Read(); } public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) @@ -594,13 +623,18 @@ public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) } } - private void Print(object output) + public void Print(object output, string desc_name = "", string desc = "") { try { if (output.GetType().IsPrimitive || output.GetType() == typeof(string)) { - Console.WriteLine(output); + var s = output.ToString(); + if (!string.IsNullOrWhiteSpace(desc_name)) + { + s = desc_name + "=" + desc +" "+ s; + } + Console.WriteLine(s); } else { @@ -624,6 +658,10 @@ private void Print(object output) e.Value = string.Format("{0} = 0x{0:X} = 0b{1}", parsed, Convert.ToString(parsed, 2)); } } + if (!string.IsNullOrWhiteSpace(desc)) + { + doc.Root.Add(new XAttribute(desc_name, desc)); + } Console.WriteLine(doc); } } @@ -791,8 +829,8 @@ private void OpenFileDialog_Click(object sender, EventArgs e) buffer = br.ReadBytes((int)fileStream.Length); atom_rom_header_offset = getValueAtPosition(16, atom_rom_header_ptr); - atom_rom_header = fromBytes(buffer.Skip(atom_rom_header_offset).ToArray()); - deviceID = atom_rom_header.usDeviceID.ToString("X"); + atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); + string vendorId = atom_rom_header.usVendorID.ToString("X"); fixChecksum(false); String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); @@ -802,9 +840,9 @@ private void OpenFileDialog_Click(object sender, EventArgs e) } DialogResult msgSuported = DialogResult.Yes; - if (!supportedDeviceID.Contains(deviceID)) + if (!supportedID.Contains(vendorId)) { - msgSuported = MessageBox.Show("Unsupported DeviceID 0x" + deviceID + " - Continue?", "WARNING", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + msgSuported = MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); } if (msgSuported == DialogResult.Yes) { @@ -829,52 +867,48 @@ private void OpenFileDialog_Click(object sender, EventArgs e) txtBIOSBootupMessage.Text = BIOS_BootupMessage; txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; - atom_data_table = fromBytes(buffer.Skip(atom_rom_header.usMasterDataTableOffset).ToArray()); + atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); atom_powerplay_offset = atom_data_table.PowerPlayInfo; - atom_powerplay_table = fromBytes(buffer.Skip(atom_powerplay_offset).ToArray()); + atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; - atom_powertune_table = fromBytes(buffer.Skip(atom_powertune_offset).ToArray()); + atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); - Print(atom_powertune_table); - atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; - atom_fan_table = fromBytes(buffer.Skip(atom_fan_offset).ToArray()); + atom_fan_table = Reader(atom_fan_offset).ReadPrint(); atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; - atom_mclk_table = fromBytes(buffer.Skip(atom_mclk_table_offset).ToArray()); + atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint(); atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; for (var i = 0; i < atom_mclk_entries.Length; i++) { - atom_mclk_entries[i] = fromBytes(buffer.Skip(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ToArray()); + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); } atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; - atom_sclk_table = fromBytes(buffer.Skip(atom_sclk_table_offset).ToArray()); + atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint(); atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; for (var i = 0; i < atom_sclk_entries.Length; i++) { - atom_sclk_entries[i] = fromBytes(buffer.Skip(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ToArray()); + atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); } atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; - atom_vddc_table = fromBytes(buffer.Skip(atom_vddc_table_offset).ToArray()); + atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint(); atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) { - atom_vddc_entries[i] = fromBytes(buffer.Skip(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ToArray()); + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); } atom_vram_info_offset = atom_data_table.VRAM_Info; - atom_vram_info = fromBytes(buffer.Skip(atom_vram_info_offset).ToArray()); + atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) { - atom_vram_entries[i] = atom_vram_entry_reader.Read(); - Print(atom_vram_entries[i].FullName + ":"); - Print(atom_vram_entries[i]); + atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); } Print("End of mem\n"); @@ -883,7 +917,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; for (var i = 0; i < MAX_VRAM_ENTRIES; i++) { - atom_vram_timing_entries[i] = fromBytes(buffer.Skip(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ToArray()); + atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); // atom_vram_timing_entries have an undetermined length // attempt to determine the last entry in the array @@ -1101,7 +1135,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, - ByteArrayToString (atom_vram_timing_entries [i].ucLatency) + atom_vram_timing_entries [i].LatencyString } )); } @@ -1145,7 +1179,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) ConsecutiveReader Reader(int offset) { - return new ConsecutiveReader(buffer, offset); + return new ConsecutiveReader(buffer, offset, this); } public Int32 getValueAtPosition(int bits, int position, bool isFrequency = false) diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index f47f9d135f06ba1e257f025416220ef9d1658886..5d983299d0423f53b14c3c253b24e6563ea3924a 100644 GIT binary patch delta 25598 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 v9NE7YsT^Bd6Oy-uGFN|lP3G|PbkUGQj{scEZa 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 NBgtn9*T>t&{{Y12bHe}t delta 15733 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 From e17a736bd0294146d5cd1438bb9c4d91e38ae4f7 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 21 Dec 2020 14:26:52 +0300 Subject: [PATCH 05/39] Added connectors and encoders dump --- PolarisBiosEditor.cs | 180 ++++++++++++++++++++++++++++++-- bin/Debug/PolarisBiosEditor.exe | Bin 81920 -> 87040 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 54784 -> 58880 bytes 3 files changed, 170 insertions(+), 10 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 6c8b0f8..c971123 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -15,6 +15,86 @@ namespace PolarisBiosEditor { + public enum KIND_CONNECTOR + { + CONNECTOR_OBJECT_ID_NONE = 0x00, + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I = 0x01, + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I = 0x02, + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D = 0x03, + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x04, + CONNECTOR_OBJECT_ID_VGA = 0x05, + CONNECTOR_OBJECT_ID_COMPOSITE = 0x06, + CONNECTOR_OBJECT_ID_SVIDEO = 0x07, + CONNECTOR_OBJECT_ID_YPbPr = 0x08, + CONNECTOR_OBJECT_ID_D_CONNECTOR = 0x09, + CONNECTOR_OBJECT_ID_9PIN_DIN = 0x0A, /* Supports both CV & TV */ + CONNECTOR_OBJECT_ID_SCART = 0x0B, + CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0x0C, + CONNECTOR_OBJECT_ID_HDMI_TYPE_B = 0x0D, + CONNECTOR_OBJECT_ID_LVDS = 0x0E, + CONNECTOR_OBJECT_ID_7PIN_DIN = 0x0F, + CONNECTOR_OBJECT_ID_PCIE_CONNECTOR = 0x10, + CONNECTOR_OBJECT_ID_CROSSFIRE = 0x11, + CONNECTOR_OBJECT_ID_HARDCODE_DVI = 0x12, + CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13, + CONNECTOR_OBJECT_ID_eDP = 0x14, + CONNECTOR_OBJECT_ID_MXM = 0x15, + CONNECTOR_OBJECT_ID_LVDS_eDP = 0x16 + } + + public enum KIND_ENCODER + { + ENCODER_OBJECT_ID_NONE =0x00, + + /* Radeon Class Display Hardware */ + ENCODER_OBJECT_ID_INTERNAL_LVDS =0x01, + ENCODER_OBJECT_ID_INTERNAL_TMDS1 =0x02, + ENCODER_OBJECT_ID_INTERNAL_TMDS2 =0x03, + ENCODER_OBJECT_ID_INTERNAL_DAC1 =0x04, + ENCODER_OBJECT_ID_INTERNAL_DAC2 =0x05, /* TV/CV DAC */ + ENCODER_OBJECT_ID_INTERNAL_SDVOA =0x06, + ENCODER_OBJECT_ID_INTERNAL_SDVOB =0x07, + + /* External Third Party Encoders */ + ENCODER_OBJECT_ID_SI170B =0x08, + ENCODER_OBJECT_ID_CH7303 =0x09, + ENCODER_OBJECT_ID_CH7301 =0x0A, + ENCODER_OBJECT_ID_INTERNAL_DVO1 =0x0B, /* This belongs to Radeon Class Display Hardware */ + ENCODER_OBJECT_ID_EXTERNAL_SDVOA =0x0C, + ENCODER_OBJECT_ID_EXTERNAL_SDVOB =0x0D, + ENCODER_OBJECT_ID_TITFP513 =0x0E, + ENCODER_OBJECT_ID_INTERNAL_LVTM1 =0x0F, /* not used for Radeon */ + ENCODER_OBJECT_ID_VT1623 =0x10, + ENCODER_OBJECT_ID_HDMI_SI1930 =0x11, + ENCODER_OBJECT_ID_HDMI_INTERNAL =0x12, + ENCODER_OBJECT_ID_ALMOND =0x22, + ENCODER_OBJECT_ID_TRAVIS =0x23, + ENCODER_OBJECT_ID_NUTMEG =0x22, + ENCODER_OBJECT_ID_HDMI_ANX9805 =0x26, + + /* Kaleidoscope (KLDSCP) Class Display Hardware (internal) */ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 =0x13, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 =0x14, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 =0x15, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 =0x16, /* Shared with CV/TV and CRT */ + ENCODER_OBJECT_ID_SI178 =0X17, /* External TMDS (dual link, no HDCP.) */ + ENCODER_OBJECT_ID_MVPU_FPGA =0x18, /* MVPU FPGA chip */ + ENCODER_OBJECT_ID_INTERNAL_DDI =0x19, + ENCODER_OBJECT_ID_VT1625 =0x1A, + ENCODER_OBJECT_ID_HDMI_SI1932 =0x1B, + ENCODER_OBJECT_ID_DP_AN9801 =0x1C, + ENCODER_OBJECT_ID_DP_DP501 =0x1D, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY =0x1E, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA =0x1F, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 =0x20, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 =0x21, + ENCODER_OBJECT_ID_INTERNAL_VCE =0x24, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 =0x25, + ENCODER_OBJECT_ID_INTERNAL_AMCLK =0x27, + + ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO =0xFF, + } + public partial class PolarisBiosEditor : Form { @@ -356,21 +436,79 @@ public struct ATOM_Polaris_PowerTune_Table public UInt16 usReserve; }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT_HEADER_V3 + { + public ATOM_COMMON_TABLE_HEADER sHeader; + public UInt16 usDeviceSupport; + public UInt16 usConnectorObjectTableOffset; + public UInt16 usRouterObjectTableOffset; + public UInt16 usEncoderObjectTableOffset; + public UInt16 usProtectionObjectTableOffset; //only available when Protection block is independent. + public UInt16 usDisplayPathTableOffset; + public UInt16 usMiscObjectTableOffset; + } + + + public enum GRAPH_OBJECT_TYPE + { + GRAPH_OBJECT_TYPE_NONE = 0x0, + GRAPH_OBJECT_TYPE_GPU = 0x1, + GRAPH_OBJECT_TYPE_ENCODER = 0x2, + GRAPH_OBJECT_TYPE_CONNECTOR = 0x3, + GRAPH_OBJECT_TYPE_ROUTER = 0x4, + /* deleted */ + GRAPH_OBJECT_TYPE_DISPLAY_PATH = 0x6, + GRAPH_OBJECT_TYPE_GENERIC = 0x7, + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT_ID + { + [XmlIgnore]public Byte KindInNamespaceRaw; + [XmlIgnore]public Byte NamespaceAndIndex; + public GRAPH_OBJECT_TYPE Namespace + { + get { return (GRAPH_OBJECT_TYPE)(NamespaceAndIndex >> 4); } + set { throw new NotImplementedException(); } + } + public string KindInNamespace + { + get { + var type_name = Namespace.ToString().Split('_').Last(); + var type = Type.GetType("PolarisBiosEditor.KIND_" + type_name); + if (type != null) + { + return Enum.ToObject(type, KindInNamespaceRaw).ToString(); + } + return KindInNamespaceRaw.ToString(); + } + set { throw new NotImplementedException(); } + } + public int Index + { + get { return NamespaceAndIndex & 7; } + set { throw new NotImplementedException(); } + } + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_DISPLAY_OBJECT_PATH { - UInt16 usDeviceTag; //supported device - UInt16 usSize; //the size of ATOM_DISPLAY_OBJECT_PATH - UInt16 usConnObjectId; //Connector Object ID - UInt16 usGPUObjectId; //GPU ID - //UInt16 usGraphicObjIds[1]; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector. + public UInt16 usDeviceTag; //supported device + public UInt16 usSize; //the size of ATOM_DISPLAY_OBJECT_PATH + public ATOM_OBJECT_ID usConnObjectId; //Connector Object ID + public ATOM_OBJECT_ID usGPUObjectId; //GPU ID + public ATOM_OBJECT_ID usGraphicObjIdsFirst; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector. + //usGraphicObjIdsOthers } + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_DISPLAY_OBJECT_PATH_TABLE { - Byte ucNumOfDispPath; - Byte ucVersion; - UInt16 ucPadding2; + public Byte ucNumOfDispPath; + public Byte ucVersion; + public UInt16 ucPadding2; //ATOM_DISPLAY_OBJECT_PATH asDispPath[1]; } @@ -557,6 +695,11 @@ public struct ATOM_VRAM_INFO class ConsecutiveReader { + public static ConsecutiveReader From(ConsecutiveReader other) + { + return new ConsecutiveReader(other.buffer.Array, other.buffer.Offset, other.editor); + } + public ConsecutiveReader(Byte[] entire_buffer, int offset, PolarisBiosEditor a_editor) { buffer = new ArraySegment(entire_buffer); @@ -582,13 +725,18 @@ public T ReadPrint() editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len=0x{2:X}={2}", buffer.Offset, buffer.Offset + size, size)); return result; } + public void Jump1Structure() + { + Jump(Marshal.SizeOf()); + } + public void Jump(int relative_offset) { int offset = buffer.Offset + relative_offset; buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); } - ArraySegment buffer; - PolarisBiosEditor editor; + public ArraySegment buffer; + public PolarisBiosEditor editor; } [STAThread] static void Main(string[] args) @@ -928,6 +1076,18 @@ private void OpenFileDialog_Click(object sender, EventArgs e) } } + var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); + + var display_object_path_table_reader = Reader(atom_data_table.Object_Header + atom_object_header.usDisplayPathTableOffset); + var display_object_path_table = display_object_path_table_reader.ReadPrint(); + display_object_path_table_reader.Jump1Structure(); + var display_object_path_reader = ConsecutiveReader.From(display_object_path_table_reader); + for (var i = 0; i < display_object_path_table.ucNumOfDispPath; i++) + { + var display_object_path = display_object_path_reader.ReadPrint(); + display_object_path_reader.Jump(display_object_path.usSize); + } + tableROM.Items.Add(new ListViewItem(new string[] { "BootupMessageOffset", "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index 5d983299d0423f53b14c3c253b24e6563ea3924a..6e4d73020083f5345c3fb57d835a2e4c8ac35715 100644 GIT binary patch delta 28751 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 Uum1=AUOQRa_099T)o()o51z^a4gdfE delta 23864 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 LZvMn2J^TLv_S=hm diff --git a/bin/Debug/PolarisBiosEditor.pdb b/bin/Debug/PolarisBiosEditor.pdb index be67010eaa6b2874e7fdd664d299756e5c976a13..f910f1820dffa5ae2f7dd947587debe3159d8943 100644 GIT binary patch delta 17728 zcmajn37k&VANcWepV`OEWXxusVP*`*%*2?*o^2S6o$OL$7}*&N5%oL?Az_>rgphuf z>_e7p*@`4eB}tSDMQEXo|L1$3^9=o7|KI=r^g7<>oO_nLoO_>p?wu$18XxyjpZO`F zb17@R9d)HI47O+3G-n8TU{ytWqC^3iv|xW&hJz( za?rSGjFA^tF`0K21%x zHGMq&jrL&wTZ3*(z4fKr_CrS%wjFg(=brAnu(K}^q^`Goyxy1<#Mx@0aDp~QmB{I z*6bYF%Ku(V{ccMAx>;sBBV}Llxp()b(n6}Y1=-HFqY4L2RH~7-va|H)lpuYswr{q# zg(;?md)Fb27V3Ljkah61VD@tPAkV?GRG2Qvh!}dxQf}E3Vu&${0~w>*srIUax&YDAk>iOs>Lc6|1^oBMxYVvbFXci?X%O;sD-V?eA$! zHeI}TwPl4ohrsM4*JV>ul$|7cYSdA6RlTzAJiEQDyMOieqiI9*_Vz1n1rlT}8R5D>bJ23#QEfZ9J?nHCF1OsR{aMW}T8QxeL-l>Q0fh=Tmmd5oZ+mH}#HI z8SfnmiU*AvIH_Cl*rB5a-#hNFwGB!9$*!-;Mxi8Y(n4p`g3jC$p{v$x669&pQsJ@* z6^hIXjluh(R zO^eXI)B8EH^7Py3>CP-hF8kTO8lJ>N5=q!BPv1_T>lmJ==hmL!n2@LaGai&i`ew9{ zs>?EF%d)GXBFjf*cB;ID9ybu)C;UY4<*JiNXh7&LUlt`@A{V5GRF|P5pBf(Q ze`~X6mU#DV>#?Ip>J_zX>me!Sh$$?H;J^6UgWQj8f{r58_vf5c2^q8!Oj+tcq z;BDr?K?Q{rk}Lfw9Kp6dgx=-RTv$n}_=mEpZF1YdfL{^*?udig~cbvlJ$cLj` z_Q|5J7JOaF{!`Ld7luKxr@zf)HlU7__m+_hxfD&%i?ZXa1X_>K?`P-L_kM$2G=1EA ziOr^uH@$td8$YrrlfgEAVDb2|gY1iB|E%(j=9`OqJ!#y0>QHa%z4geK{UC>>3+1Kk z)^>V!wo{L&(6}ob6eZO<8;R@Y{*coC=^$WS# z{-=n!%IjmfY5pgP4k@p1=RWRtoaoc~iB^MM$&6%Y z6=Y5RM}@NT-Y(>XC@RN5;Cr$Q^|FI>T5G2+-@1HMAP2ZVS)T=auaAl0(fUN|gy6A}LK>qDeUfa*e4Z^{i9+dg}3SrCgJ~QTlm`M){o%bmTA=M`sI5-nwT=ieAwsCUz%v`m?l%r6u;hKhRF=MU&(aM2L|$#{vJUT?ZSBU7){2fg zv~7C+igVV=UXB%?TYFW@fe!xZORQBfu~x&0wHZpR%_qe2^5mbz^3Nsm+D6NQ{v_KU z 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

=tr z%gP4oTI-uxf%>UKks*>jlY(RiOGdCM7in4gt@R@Ur7fClt`jy~55GYC8sTq3AT=U& zm5uwYiTeD;+KmFK7)eMZ)Fk8*x)6AKu7(hJJ8r*}nu7}os|XtiJNX4mmbGAWP5u-^ zeu7u_qgq{VORUSOs)y5={05V?`1enDqgCoX%QEU^@X2B(pJeKEVHbGX{O=#a${)&l z>UzqUy4-Vm>&gX+{#>lk|E}yQWGXX3i8dXtvMbBRcz*rr?aY&J%5#_REnkt{;Mur; zm#^r{*MzS!6$*6x=CPK)F4-KXJM0JwC}ciDhy04@j#bjdZ{;>e!#V6Je|s;r9zSA) z?8&=Z>RD#mB0t`&EPX3K{m146y=HSz`2lwqxa|d*TjIj(n0GY>>b_h4vtUPqfB+@G z>f=x2-l_6%F=Yc(`oQARW6O4}C(qMiHgD7_m=0yO5n%tk?(WKY@=V#xyL(1{br+yZ zc0{=Bm{|vYfn2uw@<*`&>fb-4ql2=w@GLhi^L6Z9i=WEs-7V|MGiB@C9SrOu2Pe&y z9aZ@XH;e0+I^XH(sDF~@B9^@|^24aRO?mP?WitleZAyNI!jIW>!tTmWPu!H@XnMz< zZv}mJSCUg+u3M(N3=Wug@l1QM1DfuR4sISHrMeYN7^Iu-a@O-CJ#A*P)4k`9{ItOO zuiqSahvmsidfo152S406v^(A@zaa2-n|aTU-WIQK?~Zps{GMpXngm^MPm)vq+P|zY zdo0-;<4RTZ*geUWD^a@M__2yT-r!P)M@0R;km;8VKoxHbK-|G6wz0r*+!3Jx0m%_n5wT*_)Mzye>X`;d-t=FF8vnl3yH0$LgvP*?+cxb6S>~WTa%hp zU8Ae-YZ4Np7N*JA;Kr(r9<{HqT%?lAj(mpbcMl|MpZ(3sg{upmET$(pTZ5T!-Ghzn;EzpoJB!A2|55Rlao3!ReL{fApz4uaEMZ!Q-O{F8wini-?`FWAdY@ z({@aL^;AP*@;?38drrsA8mwQ0et3O=-^~=>-Pon%Y2t9Z6c6p1zVGx~!4`kQZ@pvu zI&mQbpfIMbs>*rYyxmgaC<^0LNbvVx2sw*Fk^GnU+YfhIOj`5RU zHaE0m!-~Ptlv{F-Kzb-Xp$NfW%z#quLst9m}Qm?uQGN z{S(@1|6|z?)O+ZEENjv3?(dNQyG{AUYS`U+e7%{EbSOUv_U8O|Mfv?G!_fW&=ns!1 zIBvAlSC2$!NKUSz7h0j3W0a#QZL;wH) delta 15424 zcmajmd0-7!-@x%RH_4TxNr-HcNJNm0L_)+)VvQ}tzDFcTBKBy}a<8@8Dw2busJ67a zXc0=4qT55MQnae7w5m^OmFl7>@Ao%%F5dT__j2+%=Qn50>@#O(?sXpVaK7oWG{JwY zQtFPuA3i0Owe5$EZ8m?KakJ8}{ccp)gCB`d_wIQz@ZLR-%D^@kj0*4I%3%91Muo3u zjn6*&E>FhIpZZLP?8sg1XCErpn->I+s;ueTz#bFZ^XmG3BZCG_s9r7f#Wg!CeocI| z;o(y?llrcR+?4ZL)Re7RD~)Z{y?uRGcaflahHN#SZrI|^wHoBGGlL@QEXQfYbCGZm>Z_IRc2 zjk9%J>KuCl*~!`Zt<>H=jkA?9_}5mKCjAjyq$15}5E(P7EU$Zh*{Jaa)BBW7E*?Kd zsZiw+DC=}R7yY1UZd7NuGS0{D07^6$#Bi_ zPgs@l|BHdDx(ZRvX|KBaomeWVfh>dXWvliTLzkpQ2mHbSKPFt4)WO)A;Alb#asc4t{nuK7KQF%)8PPiK8MeX;Goo%P}-kJ@f@*7l6vGV0)r zb~5U^jHhMT)szU`p=p8)AKx@5U??L`BrPPpY3K!M85QY%5rs4-pSmv0zlp5A>DhWk zv#v&_zR)bFM-qXx?)BMwRKAQP>#zv#kcN=l!$Vb!xhW!CtCk^3O&D3CB8W3(6``}5 zM;Z}&So6F#el~NkVw2qe)Mr{ZAD&h(wpp2LdL3xsAW7=q%+@I_BXn?!YDOeY2I*!k zvU5{Zk~#71R>K+hn`L9ra2|WQ%!KMXb=*Xdg{Vf|GLqDF50{yhYBhE1mP5LXAUEBd zCFA~jvJ;aXT|TMoq*X8ty|EDnV`GfObgY9-biGz}Y-_W1*H#f(O$o}ZG(#V3j@7UQ zhG8pgf~_$J+h9M;#6g&)H@0fn(Y2suI=po) zf0oZ$d_!gENh^ZFyE0tH?}oCMcSo6{9(qUXIZ9G0>}$yWSXJNcKErDzS*2(87!xHM zd*UNB@26BRf{j`2GFjPU1N4EMS|QmC8A0Sr-v>jg>++tpLY}aOI2qqPPOuE|-NKLp z#!2$imvfSQFItWN?5Cr9CK)yK)}BG^?b1eff2HPA(=X&f8&T#ECqt$(S`vM*{`F0a%&lNbz*L$QBQZwt?#>xS{r3zVftvV z*zi<}OG$GG1+#m(mmyK_$ZcqRp^tZNY;4fsy_0qC-pPITy=dFF(%7%Ew%Pde8oBnb zlIsviuEPTPbDBRLZ-YjZi(RPc8pH*s}`R?@u#Es4nmGxGgxIawP{+oN;e-DLeM?bHC zYmApbP%8cwp)2~O_@`Fq>`15|p=kYCzcK!$MEY`omoVAJI;(#j|MNt85ot@LrJmHk zAiP?TQd>xMnVf@@fP01e>e>S$17zq$Yv}Gs9XcS+4Ar0s8R5@J-E}~mztrk(g_8Bm z0SyCW%E9a;=c%-|rrtduHeetXsu7aCWMfTzdB7aA)=5HBndrOKn;q=NL>ld zkJ7IXbk$nMKD3tO?DuHhVo+?rX=*GbG?~z?Xk9YMRjZU8<`T^>sjY8OYb7;`2)#$> zx!O8u@M?37bl~vaMrf)&KDbW6L@Hzwd6LM?SZy2Ps#KG$8o)fH=+}nS@z1704I)2K zDMNof3$=|MhuKLt0?ITx<71rdwGIBGa@>mh?;&>k->!Q`Edao2ze8#Pv}sBZjnDD z;$SV;sIlg(yYlQA_B#psXnu5)q12v86&ZXd!MzGR0#_0*B_2ck-}`ab#jm=~?H}a7 zg&IZF_=h$L^L8vZ1Tvh*6 z&^n@3tZV4``<0Ypm$BcVT46-okr;YawOu><4Hi=-B^$t#*hSJg%74_?vkGGaYDzWI zPC~cq>$eIo586_PJfHLCU)LXYHT#JM)~3y$II(nkURm)tx`R{F%$75mp`nZ?XiFl?8tOL1ab~4VLWzWe^(3oO84>z!YH6B&r8v$UZ<96N_i6f!HQre( z$jL;9cJgNTrRB6+!LDta0=uLD8a;jHD zk$p)GN7>)=P$oPAQ*k7wV}b55u3O+}N~}gT2IbmOq+c7?xa(LeN`J-aLG^K87^zoQ8977S6?I{&+<;Z>)1$*D1>`^(M;p+KjR*y@j1|3+AHC zem~qwxj$~hLafBeNY~dn9e3airRu1iWF99V6LeTEL1{?iE}MRT(hR+;rC-V;R#RQoU+_hT14VAGQ)cgp3IDP2dJ0hSRmrlmU(pnMealA7L_njOq9Z_Qzkb6tChO{0&#)HGB)N<45>A zp1~V<4gWwpN6DX96aT_S_%~+bP2|{is9R(>P}ObZ$WeE2KK_gBY3eSrq18QPiz(&7 zPL2jLlgb0np(ipC<%Izp?RJdAD%b|Su|N9Yc=W{ujI8{0e%Tv7RVgyt-1Ub{ZI~Zy zl|oQ{>Ojp%v$(slqACp&x-AFcL>&O&o(!ScK7f>uNB=9h}G25Hg&%O&8%%%A6n7Fyy?ahT~ey!*$pf zH=#5rheJMPIUEY`Fc#wXI2t*0)EH#nRz)a>LkYIWu^!6dWG+-Gfhou_;arLn@Kv0I zAK_&D2C3t`j%D}<$_)I4Qz`$Ak76@Vu7cPcrCwXh9w_y5aXRtwIK#ui&PV2P0?*?U zxDKV_dYno5MVy7-qXU0HsrR$x-zfEO<80zJxV+E7hBy~H;ylbosn-?fQ|^Wfq`^gG zp2TNSDr(COC?jmbr-;9cPvbFs1~1_v^yKh;7OSAt_rb-KeQ^m!BWu;!49l@OO8vIz zkW4Q!GGbq>pj?8>a6T@_3S5E9QR+R1&rx29EAbGn!SmMei@27uoLAQ24SWIr#24`| zl=kk}IsPT%$(cnO_Qsbz)Vv(rgv)RbJ6YW`aMkn!I__LF)4#X}hD zqtsCxgeMtZf~P3Ih-dILeuq_kIsPw_>BJM5pK&H$#qD?lui!s2r+ABUV=jL8a2$Gi zs(G)X4_?3kjO45tguSr_K7~>EA;#jr7>`Zq?l!>j4l-$EHev>z#g-V#MLElp69u-z zB$PEI4`|v`PR0(@lZPx_D3_zud(KiGSV{diu^aKd*d6y<@ehzA!s+;sOpZ*DtA8H? zVJH=&EK^V#YJ~lWx5xh2$%=Qw0hGJrKpbVoi*XR;5*&=Pa0ot)!*CVSuEV*O%y0th zFb_B52;71raVr+!E-b`%aWtOBG59qW;Te<}J8yX%WyWt}F>x;*z?5JpmSQ}P^W^wX zA|n+WA}0lBDo()8IFU881*cNpisNvn<;N)F9l^(le~r`d5>Ce(I0F?o1COIWK7kQ9 z6XS7~gG@RZu?ae{70$-CC==*r*&XK)?}2l1FwVmET z9k>KPz!po%d`_kU&!WbkaXJ2lE6{^}!Ah)#t1t>zdsfbv)y$^b&8|^toBe@d^9a|o z#ziEqWjGf>#aYz63wi;4lrQ&p?UndD!(ylqs(t20CcR|Uei=D`s|^^8ve?qM*+^M> z8LxQioVlSTuT#vX_y%^x%{T(z!jZTI7vNT0h?Te-x8ojs2lt^g{~_+Ad>D7(G2D%( z@I6m`bnZxp>zSaT&JdE1%!za<F|H*$+a<$%wYoK@CZ)8qbNQ8&+$n-hSG03jw|s5zJw=n3!Xw* z<}Xo}^(*`gzs4`{8~h5-qH9CR?WVj<(JAvs_dm#HkiMbJvwS$is!}t@DU?xU9h^tm zdKZwR&0J=75%oP~=_~$#+&QQpQP#mFPkniQlEd{h)VTkYRC;rAzLL++RF$SLqpa2| zC{6u>weTvsS6@TQzfn%bYbf`-*RccMz|JUJygU9uxd;9!t2dv_Uj$02LO zLFO4UvWm(rUqu;F?y7>Z0^>>tPATq1?sE zj8C$B5@o!_m_VH82WFY>twSXe;Qn7F;Tu>VxuI4K@E|7RS)?cDyo}Ni_n<13GWVb= z4Y@^BjnIPwpfLub)C<9M%Awc<>tY5bVN+~I*VC-nia;|0+?S~4$nAq_fw|Zc^H3Tr zz*dwCu{F{sR&9{JuWE~PQR>l?RGE|)ViwZBQtfaRwnyn#OT9N7WI7Od6X~NmcVj2q zi=FW>O2yBSzN_;X@;K3X4(Y=>=|Cy^u+H-+tM-!R9hC7rI4$-dZbvCUf;p7^uqQfV z$n+wUh`HDrdt)y4#XOV|3$P#MLhO%|aR73$RRfW0pIMJ861pja0qgdQA3fd zgISNOfg0w;@xO!2a0YyWdB`bNjleS~6F!IelsV6-k;utK6(HvfRfrtAW<3s3HHtEa zrW%bL0cs4gBda1zL1~ZuL={tJKT#!K4sMLej3vP8R;9>NniW|JHI6b%p~fSPs0m13 zO~fZq8g$|$%Cm7YR^Sv|iDmc-O1;-{D&;ruQQU)%$?^XInQ3?orQ%7PPWcqhz)Scz z{(?-@c?+f9U7Shz9?n94di2s>HDspDTMnrgOPQH-*1o&_CvXwYMA_-)TCPGFZ#^z1{<2lxB)1+*2)ssM zDelE``~+Ez&NHa-Ixa&mu0ks?9G}BB$ZB?WL76}gTt!)KT~=d0K93`D4HlrxK(VEx zigo-iAh3=BPoXrl7+;{g1lQxs_#(cEFX4WC8Nb2}cm>(c&U^SO26Khpgdr&HMp~w! zwBHQbADnF+WY{5`?W_Tv@lDFvxEY7yTQ~~e#_6~P=ioM6iqhaRtfaggx8ok%fj{Cq zC^u!h@MnA%=?1FZ=rG8Bb|x37n4wCEY-3TnyVQ15ub?rQR4x82icLGU*ku3 z7N!0<{Fw50_z5=PChk9&jMQ^D8@n>j4k#mJ;~^?^v&ud2Q_4Ab7@x-@xCW)(OO}-= zOaRA_@7iq0%6-X1w5ogMH? zEWxjEHlD^gDD@Xwu0m;VEuJC13%|kltoU9$E63~mWWL4Qcn-Ql{Fr^rWZ5_4boq1OMeC zeLJ(`hn#fG?5}8cD^a@CzhMks$5@mZtc$->u7@`;4gbJKDD^TdTcOm?#6M*p=xYUd zLaqLy;voDROYkO2*ZUuwf->S`c#HBhyp2!c9bAL|;#$0m>rv`&zt>;*+_9X8RI#Vn_DA+zZSV}v+^Q`woW@#WHp;|uuodN=*cwM*8@rmf72D$t%*GD1-2<0nZ#<3zsQ(3W z-Lww6SPr&&q~VOE^p#b~HeQWKtd4LDp$awCFsrKj?p(gO=XwWjsPi%spNH>!M_A+K zwMX%Hhc++`RKGLN>6&Tvpi`iwQJGuIc72a4E`8Hy#Jz1eCd- zh;&%jQuz^DKJ8OpPEzf%z zCv@)WNXJYn%i5WR4=<&Ivh21_l%<@FvXpaBmU1q}<9w9eSf(Khxqz}P0VOSueXDVL)x8C`p2p{`in1NQru;I}1#@n<;_u-%l;tVTS(MYKOi&Kg zZz;=Dn{y}!sKhVhca*Q-dAwuA6-#`9vLSDNz9&O;TTO!GEIM4*!cC@iKP7E7%=>MR{Iy73Eg_8V&qsXW-0ghGJ{J|RdK!AlJZ*024#6!Z9_+; zRZ;HgJqXAhjPy!fI%n|48y9FYhX1@ zw&H0RScQ|eyo#;P0C~3+gaa`ci!cP`UOo)v9aaroh;+ZrH?k4PyMGml%P3%!ECKF5G2dsmaupa(|aVYon@#v2U7=Vc=@3QJ+ILZX0 zumR<0Ovc7myeXzo=GCNXh=~V-fC$?%3^2AmR!2>AuKgOYyKfz(hqenFyd2XokkmrVK z1Xkk=C-sB9>T*FK5JF%i#$W-~#!;A!W2#ij!$rU8zctmsq{FN@U((liq9}wAT147TIzqZgxW#C;+iJD* znl)Z?tK7sKk88>)YmVitDI-p|D$4ai%D-9-dRg&$R=li>#ysVJ%-X+O3P0hCgtE?r+vKo*}v<#QWd*UD~{WmPPb2zN5vrct z-Kj++FExc<9CeynTAGtTZWOn0D)FIV);RP)qpfjd&OCMVk80`c_x=3cQF(yx$ z1I(OzS{ZuvN3T?R?Z0i5_wst_1DnqLxLFmxXJ1e@VY2>iU#NpFZFQ^RA{w?U*Uxp_ zGvSI^Gm$Sd=bCZ3b#c{o{oKY~-xas&k9^Q}HCDUb`W214uEfIa?l~>sQvT2qR^gW) zb@ZZ-gDVey(%lv@kB+Nh&f6%tXS~0X=2g`xheB{pYM9Rm&i5Dwe)Fe z4>sAZn!4oE=-%>GZubPz8a)^+-`F;k>&Iq&C$yVhHY#iK+iR-#P{-NnVwEqMrNW4Sw zl!+6juqEyqla3aP-KR6-WKT!<66R8tPJEIL|Q7bB2`uL<1Vy zpz9rN?H8)D6Djan-${=@T4)666GtaJQcYcSMd^DUI3A~`eBSnv>gKPJB)o`NmY#8} znMa_ysnd>i(RYuf`vvojOV>zy4Bh7VG$TasJU-W`TG{f8`34UK4x9*+SLf%xi0}#x z=NivBBg{))JfAUh2YLM(FS#o6wv?ZV=+EB`v6aO$tswpFyH$8tH2Y+vS2^ortXWMS z#l#wBwJOm(@;TwkdtI+DC#2jHH9X0jH`|u4otwET@=fwCUgk(%(%JDhhx@Rv)HfSV zC&!nmW!he^be68o^;2P9ZY04dWI9rIr==zr*Cma&>jqS7BcAtH2>~l&>@vtjaw6UORgg|U9h@&eL3N+X@9~j_MQ{3VtS9Bc^u0LaR8iiP;MQ85fYG{BWYE`s%HxBlO>=-`BIE1NFD$$HhESx$oN_FCx~?k9d^qN~T3DWmvsJ4b8`sfffyQ00?Gk_t$L lBspY8SFSqW)2Ka^>=4pm(lF9+QXXjpNj}Au#{PT8{{ToJfII*I From 7e73a7f8d3f6bf0099f2ffe10673d81cb1598be6 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 21 Dec 2020 18:32:40 +0300 Subject: [PATCH 06/39] listing monitors via i2c lines --- PolarisBiosEditor.cs | 165 +++++++++++++++++++++++++------- bin/Debug/PolarisBiosEditor.exe | Bin 87040 -> 90112 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 58880 -> 62976 bytes 3 files changed, 128 insertions(+), 37 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index c971123..5435673 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -467,24 +467,25 @@ public struct ATOM_OBJECT_ID { [XmlIgnore]public Byte KindInNamespaceRaw; [XmlIgnore]public Byte NamespaceAndIndex; - public GRAPH_OBJECT_TYPE Namespace - { - get { return (GRAPH_OBJECT_TYPE)(NamespaceAndIndex >> 4); } - set { throw new NotImplementedException(); } - } public string KindInNamespace { - get { + get + { var type_name = Namespace.ToString().Split('_').Last(); var type = Type.GetType("PolarisBiosEditor.KIND_" + type_name); if (type != null) { - return Enum.ToObject(type, KindInNamespaceRaw).ToString(); + return Enum.ToObject(type, KindInNamespaceRaw).ToString() + " = 0x" + KindInNamespaceRaw.ToString("X"); } return KindInNamespaceRaw.ToString(); } set { throw new NotImplementedException(); } } + public GRAPH_OBJECT_TYPE Namespace + { + get { return (GRAPH_OBJECT_TYPE)(NamespaceAndIndex >> 4); } + set { throw new NotImplementedException(); } + } public int Index { get { return NamespaceAndIndex & 7; } @@ -515,33 +516,71 @@ public struct ATOM_DISPLAY_OBJECT_PATH_TABLE [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_OBJECT //each object has this structure { - UInt16 usObjectID; - UInt16 usSrcDstTableOffset; - UInt16 usRecordOffset; //this pointing to a bunch of records defined below - UInt16 usReserved; + public ATOM_OBJECT_ID usObjectID; + public UInt16 usSrcDstTableOffset; + public UInt16 usRecordOffset; //this pointing to a bunch of records defined below + public UInt16 usReserved; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_OBJECT_TABLE { - Byte ucNumberOfObjects; - Byte ucPadding0; - Byte ucPadding1; - Byte ucPadding2; + public Byte ucNumberOfObjects; + public Byte ucPadding0; + public Byte ucPadding1; + public Byte ucPadding2; //ATOM_OBJECT asObjects[1]; } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_COMMON_RECORD_HEADER + { + [XmlIgnore]public Byte ucRecordType; //An emun to indicate the record type + public string RecordType + { + get { return ((AtomRecordType)ucRecordType).ToString() + " = 0x" + ucRecordType.ToString("X"); } + set { throw new NotImplementedException(); } + } + public Byte ucRecordSize; //The size of the whole record in byte + } + + + public enum AtomRecordType { + ATOM_I2C_RECORD_TYPE =1, + ATOM_HPD_INT_RECORD_TYPE =2, + ATOM_OUTPUT_PROTECTION_RECORD_TYPE =3, + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE =4, + ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD_TYPE =5, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_ENCODER_FPGA_CONTROL_RECORD_TYPE =6, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD_TYPE =7, + ATOM_JTAG_RECORD_TYPE =8, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_OBJECT_GPIO_CNTL_RECORD_TYPE =9, + ATOM_ENCODER_DVO_CF_RECORD_TYPE =10, + ATOM_CONNECTOR_CF_RECORD_TYPE =11, + ATOM_CONNECTOR_HARDCODE_DTD_RECORD_TYPE =12, + ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE =13, + ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE =14, + ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE =15, + ATOM_CONNECTOR_HPDPIN_LUT_RECORD_TYPE =16, //This is for the case when connectors are not known to object table + ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE =17, //This is for the case when connectors are not known to object table + ATOM_OBJECT_LINK_RECORD_TYPE =18, //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record + ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE =19, + ATOM_ENCODER_CAP_RECORD_TYPE =20, + ATOM_BRACKET_LAYOUT_RECORD_TYPE =21, + ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD_TYPE =22, + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_VOLTAGE_CONTROL { - Byte ucVoltageControlId; //Indicate it is controlled by I2C or GPIO or HW state machine - Byte ucVoltageControlI2cLine; - Byte ucVoltageControlAddress; - Byte ucVoltageControlOffset; - UInt16 usGpioPin_AIndex; //GPIO_PAD register index - UInt64 ucGpioPinBitShiftN8; //at most 8 pin support 255 VIDs, termintate with 0xff - Byte ucGpioPinBitShiftTermination; - Byte ucReserved; + public Byte ucVoltageControlId; //Indicate it is controlled by I2C or GPIO or HW state machine + public Byte ucVoltageControlI2cLine; + public Byte ucVoltageControlAddress; + public Byte ucVoltageControlOffset; + public UInt16 usGpioPin_AIndex; //GPIO_PAD register index + public UInt64 ucGpioPinBitShiftN8; //at most 8 pin support 255 VIDs, termintate with 0xff + public Byte ucGpioPinBitShiftTermination; + public Byte ucReserved; }; /* // Define ucVoltageControlId @@ -735,6 +774,15 @@ public void Jump(int relative_offset) int offset = buffer.Offset + relative_offset; buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); } + public void JumpPrintExtra(int relative_offset) + { + int done_size = Marshal.SizeOf(); + if (done_size < relative_offset) + { + editor.Print(string.Format("Extra at 0x{0:x}:", buffer.Offset + done_size) + ByteArrayToString(buffer.Skip(done_size).Take(relative_offset - done_size).ToArray())); + } + Jump(relative_offset); + } public ArraySegment buffer; public PolarisBiosEditor editor; } @@ -996,15 +1044,20 @@ private void OpenFileDialog_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); - Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset+2; + Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; while (ptr != -1) { Char c = (Char)buffer[ptr]; - if (c == '\0') { + if (c == '\0') + { ptr = -1; - } else if(c == '\n' || c == '\r') { + } + else if (c == '\n' || c == '\r') + { ptr++; - } else { + } + else + { sb.Append(c); ptr++; } @@ -1078,15 +1131,13 @@ private void OpenFileDialog_Click(object sender, EventArgs e) var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - var display_object_path_table_reader = Reader(atom_data_table.Object_Header + atom_object_header.usDisplayPathTableOffset); - var display_object_path_table = display_object_path_table_reader.ReadPrint(); - display_object_path_table_reader.Jump1Structure(); - var display_object_path_reader = ConsecutiveReader.From(display_object_path_table_reader); - for (var i = 0; i < display_object_path_table.ucNumOfDispPath; i++) - { - var display_object_path = display_object_path_reader.ReadPrint(); - display_object_path_reader.Jump(display_object_path.usSize); - } + ReadPrintTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + Print("Encoders:"); + ReadPrintTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Connectors:"); + ReadPrintTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Routers:"); + ReadPrintTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); tableROM.Items.Add(new ListViewItem(new string[] { "BootupMessageOffset", @@ -1173,7 +1224,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) Convert.ToString (atom_powertune_table.usClockStretchAmount) } )); - + tableFAN.Items.Clear(); tableFAN.Items.Add(new ListViewItem(new string[] { "Temp. Hysteresis", @@ -1337,6 +1388,46 @@ atom_vram_timing_entries [i].LatencyString tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } + private int PrintAndReturnLen(ATOM_OBJECT o) + { + if (o.usRecordOffset != 0) + { + var reader = Reader(atom_data_table.Object_Header + o.usRecordOffset); + while(true) + { + var first = reader.buffer.First(); + if (first == 0 || first == 255) + { + break; + } + if (reader.buffer.Skip(1).First() < 2) + { + break; + } + var rec = reader.ReadPrint(); + reader.JumpPrintExtra(rec.ucRecordSize); + } + } + return Marshal.SizeOf(o); + } + private void ReadPrintTable(UInt16 offset, Func entry_count, Func entry_size) + { + if (offset == 0) + { + Print("Table not present:" + typeof(TTable).Name); + return; + } + var table_reader = Reader(atom_data_table.Object_Header + offset); + var table = table_reader.ReadPrint(); + table_reader.Jump1Structure(); + var object_reader = ConsecutiveReader.From(table_reader); + for (var i = 0; i < entry_count(table); i++) + { + var atom_object = object_reader.ReadPrint(); + object_reader.Jump(entry_size(atom_object)); + } + } + ConsecutiveReader Reader(int offset) { return new ConsecutiveReader(buffer, offset, this); diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index 6e4d73020083f5345c3fb57d835a2e4c8ac35715..b24414c338503bda7843e8f9fd65c1296024150b 100644 GIT binary patch delta 24078 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 delta 20694 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 diff --git a/bin/Debug/PolarisBiosEditor.pdb b/bin/Debug/PolarisBiosEditor.pdb index f910f1820dffa5ae2f7dd947587debe3159d8943..343c07d67decd388ea6f30dd3064c35719e8ee25 100644 GIT binary patch literal 62976 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

Yx3ZzqYx5#W4SxZ~V3Q#@7BdcFwBU z+PVIPH^eU7=x-Pp+tAy;^v|(NpYyNyQ|yXo{j1u=u6{LkRZD-HH|(Vte}2!W;qUTk z_;x;xe3eh5viLOW0sf4xt3M~;HhMLGMm~>qY#;sE>|r0r;O zdc?o(QvdpVDpuup*Q;-tS7fd=f5Sg?{gkOK!#42Dx_wAt-sCv5R^ixqVOal9Gsw3P zR^gnk+NBn5n-SA4HV$2v)Se9Y#GLNt8-+<#Jjg6`$|GT7Nnw~nOUrQ6d`+_?#g|*D zoey@+6l>^D@Pn`Y6-UR)yTr%WL@Mc{D=# z1O5s>R(_}I-K`nlvGpEVYG}Wca<2c;U zP3!ff{rLyvb2?!a&gr_d5Bf=>t)pxG{d(_;{4qAwer7MmwCDLvV%^#o#foAp$0quz z8{0=};f8rNg!#)bODUtW)dxJz7n1XT5bHxv$#5Dlu6?jR7OW4?Ra_o+*gSMHsfT~4 zfRypv5ZzNAG$(W;+(tyt(u#R7 z>OOmko@WX7oKg4W^`5&2t^Cd+%~4$M=Tj*UMAEE5d7^Q+`Qat>v(O)e{-ai3^MlsB zQT^n7aLpwD=suXGb)~RwY$$)#S?_E{+M`p0c2U1kop3#=6sB;|LNk6{m{)9=!I3a( z&S)N!!_=c(O6Rml80MJ0h8b+b+!YB!8dZkT{33DnUW-Az1KoB!6y?gLX(yUTSMOs< zr#kxg;NR8itKK!lqWa18PIFcAkJdX?RLQTR-cuWqTqQqOSJC`GNq!cQ@oK3R`PWMQ?rp-TG6`KMYd`A73lHB|D8=AR@g`BjzwHC*Jb;(D~SO-24Y zCxvtQf113nLcaw4!0IdiT60Fro1FiyN&eCNcT4h%=D&NAUsd^^#hT+i^qSIXsa7*C zj!6pV^1qI}&qV(r{99Xn<$qw3escZ?CHY75KRC%Rn*Sk5ehcTFYVtQU*?n<%-HrCE zeq3XJiQYGnat%)k=gO5wnR=nW8vkk?!g^4-MkMJcmuqB_f3#eqlKi6O8lB|l$~7k0 zy^3-*WNm)ajZgBAmTN+iU$k5kllUmPI~`&>P>Wq90C83a4^K+jyxB^Kc~0w0(rR&4%fAWJNmD_Yr0XVY1P= zD-z~}eS~Skq%;$q?wu>rkv%%jU3pwxO!oJ2ZpgfmwC=6ep1#0dGI+!z)pM~kOZ+o`9Xo4&to&ww^)deHtNqp6 z{WbOcHKSu|&WW8pKDM?=Y;`Yx?T7w3WBha0_~+d3pYv60UEkQcKgZ5JEq30Z*m)nu z&c7+Per{~-4*!Dw{skNS3!d>W_?LfS|Ja4gV;8lFUG#M9;w7;S?PDAM5W6IZUD_{p z>D#f(&Wl}sbnNmsV^^$(~JIf)%@!Q``0axU3W=rQz!q%3u8B)?cem9 z*i8@mTXx2_eB|G9dF+<;{%uFaZcC@WRkv>6wMCP?j3zp3xK^h8)3%W}Cx7X%dGXu@ zr7Q$6y2dW$;xSd>2;=lLH^`qqiM3d6B%Ir?M*ZD=O8L=@mBL2XQg@QxMAAz|rzIB# zWmRKb`_*WC(Y|vKd)1iY_nZ1t{2=gy&9UIhSb5!8`5mzpmxOiZ*5A{mh|x9H8P*Fa z|Fn7Ybc1n7NlDJKsYUKR4b|Iil%aWQ7|!Xc9EyW=aH8JkaYIRMbP#*4a4&OM<^96g zHeoIogfM?uzoZ<-MO1a^g_)dMl*o73&NEZ-Bdo$XUAJGLk0kOtJ93ZuGQxa|==wat z#;-D}eWPKbZFSK5wBQ@n!{(m91@Yz_c|53_mxc%qv`(7ZvC6Ce5_T zL&llYTE3ae^zDh1H;=Fi=XBL}>u{fidn)cLBjr-ew0)v3R4(anMt>&y|G>W1>T8S; zypn$MbtabNAHB|~zem%GUT3N&`9;??s+Y<8I+G*eqj+oL`4ui(>kP`iA5n=HY6o#7(~|^MgD6;0?b#7Ax-% zTk)tlS5Ta;&Nu5I9J9mx4gaugO_|Zdws)mE&oJY%7wt5Wa0=t}RObb_kHuYeeu53Z zw>n>i{wVZS=Q&pY$57|%wK2ntt`SmySyHDQ#lpgjbH3NEtf(-<-Q8B*ZlRuDVm+ZS zPS2g)FefMab7{`P(nW=Hv-w&nJyK!LVijiMYc6>J>VTFdp^is7}0~ zI6p6^vX1(6RA=6@!u+M#83`q&rDE@{lUYe8rAnQim2_%Wsgo!cX;f>pgL=D+_4R2~ z!gyQ1y8hNm3hU}iVVa|VF`{3GSz^PeAJ<6=vmm~VG*TPYO>!@_@5yMKxjZ~geEj!5 z&j{OC;dG7>tp|6#abfggn8LKotO&zgyw@83jf6Zh5*#l!|Ulcogdu(mD*jjFXy&F4ceC(V@V(a?FR=*otUl?0| zlYhYk|H9(fMGIpW-4wgzv)H9a#x8$4c0~>U%5AZYTVor)@~{3y?3$Zn*SzUpyT;#i zL+rXMW7ppt+k9tuJ$2``)mgX5aK4@}Z2MAH^bYHqXNw9KjLn%HFUZK|yVMq#uOr|d z`@vjC-7}HPZJHJ)UDnwt=esns@=J^PvQv5N*V#0B4H35{(6bjhuZ-2MT-JU%G{Tgy zz;cFdN6LdP-O+_SEU0gVizmK*PI~I^`ogSTh{8I3T?^#TI7!TJiEl8)U47(0*7vFd zmv?_)82$_58Kp!pKK~90KYE(S2H4Ms@&1M8P`*+cBFz(dQ5l9K$_sl3V>FK|KAA4WrLuK}s^o5oxQ8auQJz-+2k&KkZJA zTbmt`>N2e7Yw3`S(Nn(M^PQ^ii)}~kOMEKZQBY3(q2^QNPh;a~?CP?7e?h=>=^X=) zvHpYMK)|+f8ypXBhZEof za3b6am9Hl)e+MVw{*>h_*8Np$e;ZE5{~b65svj%-*VeuZPQ|??6(IM+;c?iHfYab$ zcsv{er^BI8>5YTZ*R!7D32+APackFo`V+A0p3I4GC7cOY!IR)RcrrW}X2bPx7Q7JV zz>DB)cqPn*SHnCQ_Gi7PrJkk%ulJjJAcKru@1e9{M2bz#yJvd8SvqnXinK?1@Qm@% zP`dpMO=!hY*%3!WTl?UiD0X>{6ox~hdn-@hjlh8=0x zl(({#5B1ghZ1lrE8@`X_`e_r&7(N&3n`cDBICvfocbR<3uaEPg=7R-L<6V}C$k64*JX)Ya0{$S#&3a#z+2&A zka11Ebgk%#)J3LSj)A?Aen@xZNTiLPne+%|-Y3!+#?IV27#DM_`r}Ne4b3 zhs;EdN2Xdi0ZOKtv^5WFRtcZw)jNWr5!>6(FOpZP)_d9HxlSV7-MEF%*!qd*bhU1z zFB$WS4fkiLe(@?)pVT#rx}$-u>p8_hCqT#sQ)=OxCp8%OKwxo2g4^W3cT>rlv5xXZjt+$!^XuqJ#T9tuBz zy4rsT+rf`ucc{E8&mUt~>Yu~tLz5~{Ue9x&@4}J_AK>e7(A<(DOC|@-o@8p0?_fIQy=X53YCh-*hrwQu^@!ISmcqVpJ?sZ>g8dz_4yFGM9D}>w(LNUTfMelsNZP?DD7`UoJoaPZ1gQ6OCc<-}^e(d845hyX zPR9KKI0Zfjr^5H(agaTcHx1T=(ytAV$6g2WeJsJ@a0b+SE+@dFp!5e>PJ{|K6`qLu ze0UN(6P^q&gxPQdl-{Lq7WT_v4*VUA!yVTD9XJQOp1q$7zl8JPS8zW38Y;eTEqSKY z#9Ip%;GPQg{cCzBrUGC*Qb?Pxx&_{Z|3h#K_AlV=urmvaU&2}NK6okI z3ZI3K!Wzt(Pe47x{xspo!Dp~*E`0(13jPW1g4Vp!7bl z{0Ef&zu@7xH)zQG0UJTN9|}{kH-T-G9_)yH9+Y08P{weAnXZrC4!-Qgc#8vF}Phku2N_fwdG{WF*ezk@xY--!7H#$X><8}@~D;8CzM z><@L9>}c2(Dqk6vL!sgy4F}*p4ITsM!a;B;91Kr`(hJ}a?B#GMybKPbUi`+)7uaJ^ z`n4>ZL4|7#nG1q0khvh}3&+ANI1WyN z(ef&I9PU@cY4BEfJiH&yfRDoy;0uuNlnCB{C&7T$l>uusfUs z`@?x~B+Q3X;R2Wg3t%B!2*WkXP}V5p5Uuahk-=P?-Fl@X>l1wkR+<%kmS~@%{fNHH zWF0aZiS9S=!QPm)w!Y&;d&^g&b|t3ip9$W7nQk-@SEI#QhfQ9(5bc zzH+M33HO=(5@#Cv=CC%bJH@t~C&`3voeaazY3PJ@g>PX_ZS_3#0A!Sjy9I9zw(uq( z#mMQ%Qltzy1vwd6iOfZ^NvTsLFHhpul6PFkP(#D5`+?}5LHPN|?4)>~H}M|JU98U3 zw@eGZNxp@bhvXvXCFvhed1vC@l2S}2%s3mS2W~1$PLlrJ=!ZIC9ZfKGr0|0{7wBy3 zvW0gVVedz}AvYpv$QGn4as$$857H;eJ=vZdE}hZ@)XCHmIKlc)flIM#gfD~B z;A!v_>(5z%w;a394NiwT`#1yY%q4*9U^zS&mca|*3V0D*39o{yU^xGUV>di+D#6F? z&-zlQ+A(oWHs@eR!03D>dnR&>nd97dIO*Kj)tSzv!goRZ#JeO-h)?GlGG~zo)!Ayu z63o;YOCWCzc9uBa*-$xH3;RIUr@X$&gS$9?b$OCeGk-xq%$nlh0gFB&`UKZ z_cY;MeQ2bF?{ZXqhJG38sy;4<>N{5?@-Zw?r|NIvI~Trr|3V2gLv%JMbCr$bYRERk zy9TPxRW|MEuf?u?@+PR#$^8gR^}`!*9|doOs_QLq7Q7j%Zf}KW!Q0>(cn5qC{tw&= ze*qtXiuX70m)L&~?}E?4d*I9PUKrN# +xVUV&7?lU_dxu_`ync~_TVxPkiI@X2-z-~{IZ<)9>QK9ZiUK;%F!M^jJ*T= z71W54duK~sjed>0#_eyQ&P*SN>XT1E^}XN1BKSL~Gt;NwYWRD2349t}2A_r3!9Tz| z;d4;+`8-rTz5t(rFToe!AK{rot*^f{{vd+64P9$la7i0jXq zcfxm9D!${6txn?1^;PnuI{ph(U)&B4fvP*riLYTl6uu5Mm+pY7<2PYN-$=)$qHoma zn&Z;f`;p=MC%$z9gI;h>8HT&vFnW3OJQt7A9jW@sOwfW*dI!NAY`8& z=-rkYa0*O;IgovOkOynQ5-9z}kbQix1hS9k4SCL*;96J@o&!}s7g*jT5>98q4e04X#ksHKLj2IkATf#Ti61oL#5XX zw#2TptDnK)uocwVa%(sZN>681oI?aB!Xu#0rc&X2*aqtCS@}N2ay3-A^I$vNFR*r< zNwvq$_hWk<;H|JD)OVV9f=|LD;da;s@?DH3o=;&{?4QAI@L#Yyti}LIgN>llYYKZ{ zZwC2pw4goAfL&lF><6Vc0QSVrJx7o4s0ogRz2PL-2WCU*<-)$$^C0Ih0rz@5&R>E> zus>W0rN{ZdcQkg+|Gfe55_k-}91es!3zOchkaL^hHaHk^p6?BT55u95b9STm2RIBn z=jvV-+D5Bmu)AF>bjI7bT#;R49I(dY%R0DC!H2rq<% zkTr-`1iAhjy<1>0cCP#0DUj=;R|2`-d8Lr+lhNaPJ`+A${NbIi!z!XF&Rx(W4J(@feJR z<&d`XRzTXwTM4NnqemThtFTiC-kFfJyt5!_c&j04nEpl>!^@%aaV|Ld)N3tWr+ zW_S*K7_Ng)z;ofN@I3f8cs{Jbh35j;0$vCQ!i(T&sQAahi?NS~8(b((4Crz+n+FTis6B3uEbzsB-%sQ9jeFXMhc{3CqGx<3s6g#B0W75EMOGyE1xPY-g54WZ&` z0{?=&4}1;Ig0I7Q@C~>Kz6qDZx8O?nHq_blJ1|`T>1S>U*J;0f%r`myiP zD$ea!2eS{*a{_vfqnmMe&sXT2L7!XNdy%`lhwJ1D_u*E*cTzmZTKDKac#3h;Ip5Jd z6VS$<-Br%p2y|TDbQTysKN6;Qyp3~EBrWGQIO3*r!)BDbF(-ssq!a4zJ)N$R@U9NR z^>moFbJNb$?enMG{AkDR+_J3O?&WS-=~otE|q zxG>+YeWH1EZqd3`y{p};(un~Z=B6b zv<|~I*?S+0)}hi@dV`P|NQX$d=zn3K(X%?0`=In) z*nZ}7MO!XpZ@JKdaBRH3C!`PJ3_qaFmRwMfU@wP}SBRU&$ z``2~sb;5V{_`rV|&1h!R3g2fQl=BBr`{oa!&LsW{Q{l(3E!2G59)5ydE&VCXfS|U+XslVx_qBfk=VSj8>g-}CEVX(|;8)nS_x~E64gU@|!d>tx z_z!q3R63jCKe68czkyrfw@_yo|ANoL@8I|Fdl=69dbUdEYpv;RI<;~0zMh?Fz}*Jj z-w6A3eS0q;JipZQs|^U#DiWqA^?tf>uTQI0#5Dl-P+#Z4u1!Xv5WWxSlSXK&1J#>M ztY+9I)gVg~uR2r?S?Afj>-pKviTK{ZFMMCm*E3(n=xpy5`}z2Mcs=Y0 zZ-kwo&S9i?A3PHK{jf899(I8*!LIO4D7|-KH|+1h?oj+zW}Geu>a|qIgRg=3FXGSey6(0ZlW@|a_DLrzEfEB zGjh|2pJcr0HXRpE=fmN9e!jN@e;M^XcRqZg4L1{VBw@;{dN|3%!(JXrKO3sA&Vm}J z?B9Y;Fc+%ts-84n^RR2hF$Ye8bD_p1`?}zGI3KFy3t%=}2m@FIuZD`}I>`6Anm$|t zAI4q^e+Bv8SaVLS{Qd^J_zG0GH{c@dDtqO=mqp#G?{z@ho6o31^}T6^;pa~Fa~?cV zDpqHdq1r?DNLzF7Lnd0s;d^~m*YQ&Fq_$ZGqjh|$$t&jpP<6ZGs^gzS)iH;< zmFl=0yXtr)R2{E^s$=%brjA!b)$tmrI$jF{xDH0^_+0GQQA~ZK8yWu_y?#Jx7-K9=dcfgJR4>1y}bZ6_r3_Pw0i2t zFJV_5zYI0!DEve4kJzkC6d=>jg@GtON>rPd8+p%jd zehoH;(r*S|$FAq6-+)J2cb$>%z^><=--LR8Q~Ek1e+&Ci_%<94--V;$dvGlL0BX+o z5b7-bBX~Ug80wvePvOb%GnfPa2J_$-a4y^l^$x^WP|tz>9Tvk~@D%tDsIz$0|58hx z!7G33;WxPJc~RM~g5P4-yAc0^cUgCxxqpXU&yjN86TA$)TAal~AHE5z!M9*__&uxv zYsI)X0BggVP-pVB;h|9J9R_*!Eoctw!tT~R1J=W?=ez4eJulh-PKSrUd9WeWS$kus z=RyyKYar)P<~eW9p@NIBH-mZ)r#aN~o=W#R*aG|YuqC|Tx^IP?TLllpR`AcTHGCT$ z4&Q^Rkl#!4+Q4cIh_{q}(@PDlPU9c~9p0)Ql zk27cLN5NOI_lK{+0Z?b`e3x&)Gs)gSm{OgydRP+;K%Sp*pP`$`b{9`kU>*; z64Y7x$*>Ka1xLZzP;+(oT)x&Fde&dkzLGSyXH2@rHR681On6OP#x?Rpq`Pqo_p{;N zUeCI;w&w=nvqa%pgL_6s0Xnd6?ritDo!QTHw|mR(to1UyktWXGJp1D8q0TTHZjcwo zrFEU2_tLXON>k5c=$)k=iRo*xN&HG29TDi`kZg#AFmHSxBvLe%ex9cX%+Nl)ub z7q0yt%6KDsVf@l<>Rq3(@1D;M#Ft^q9gXio-1Tgs>hg|AI@epbti+m0d%5tPULU{E zFpLQunmGNI>DikDb-kXO=*K!D51&<9ihKBuuFvYuyz9esUvXca>${1gA=Dnzj2X!1 zK-YS%`#~FcC~OOxK!e@~WSwNL@q^)V>_gycI22w8 zhe2J_v)~pu9O{}r0{#jzO9a1zqoD4ikA^$o82B+f7Vd&$Vf7euGUP{1cnUCl2aDM( zI1>9rsNaW}3bWvG@HoiY+1wXre-bRgJ{{^BJp*olC&1g`$?(@O8@>ob~!pq@(-0Yq0Cub2j9;cyBG#{o8Y( zUxWPuYyr=O9pQOU_hp&gg2C`2I0;@1v*Bg17;c2C;Z>05vdp`FcfxD1^BjW+h75_9j=CVK<+7e{{uI{J0bVlw6_nq zhsD#YtR3K1iq5?m?^oD4|?zr3D5r1dy4#R zgwNo9AAA6Y^ENHs_qUw}*d&{UCExFdBXd^WaXX zcQU?$KZjq#bKpPWM))1P9mag#0fNi{=6+#y_z8B-dIJ3}2G8OIO<_&g7V`X~xnEe% z_g2ir&ik7|K5PhA!A9^h$o?d_86FBBgFMR@JP&!VEO;HVZwWqvoFxU{!oy+xx~yGc zd)N*Rg3Lj|MA!k&gB{@_*a_->AN!r)BFKJc#a75%75omS!*^f?+yygX?Rw0Aunp`5 zd%)gM?~?R^qan`}1t-9PZ~+`jyvrbSUZD5*M!=ikNT_#BM!`Qq_D{k4a14yqXP$zG zK=xBXD>x2zhm(l!XgC$-LH1R_8E`th1oHk|a1&&o75o}9w+7Ea&US*=;7RbWFb94E zuAQ(YWZxBZf(zhKSO6zL_F+LTEQDpS2(E+d%YrK)`?BDdkbPP36kP0k<*z{Y zXDj?en166@1)0->ba*-(0)Gx?!ZYA}$VD(%0?XklcqZHc+1~{>!gGoDZg@WSKS1_- z!Taz6xC?TP2pTqIzJaabrRaBs><5Dp@CtY`yb>0{jc_&OnquC8xfL;5N7fJ_^r=kHZ__6YxIx zTlhQpB>W5Hni+fopMu{*o<$299m-h;YzLo#z2UP^?~wcf&VbLs1@L)zI(z}14_}0v z;7jl>$o@Kb9R3k*hkt?}z*pc-_-9zN31=6u3H%Fe1GmF8_!>MKz79vhH{fxQYkM#o zz6s~Ux8N!89jLWeeeV+FXe-0uSY!|~1UbdZa5!==_Naaddd{xT&YopI%RU$x9kDAd z-M4q?Nmnue(S03#)_0Bcu%gdS^uDytft7dd$)w*Nk$WFR&+sSv>3cn#pZt$SdLknb z-9yr|1A5n5&-JV96A;~_(Y+s+7v)#qccOfV%7en|y#Z10d`nkpDSds`a|w!H;MDqvC3Z z?5m90wMv?5=_%gnh}vDx=Bo{~M^k(0v*J`7idS`|`cVIH?XEbLzanG-qBzwClMtn= zc2hW|seYl)ic{{=RljrXDgAB{ch_f}`waXxB8o%h(AevMs1B4z>0g7WkI7AKDm|s6 z_EZ^Fj$07YAG$|rGtN?&DDxFZmkw%Sc1 zcPFZkj!0XxN8IVL210y9hJA!FpYxYzv-I4O?s>D2GWXJS-%R(9%x}|irte*b+=*}| z?0t@K)~Itkor&q3$yv zeRenUH1aW0o%NB{Tmuljce@n17SZ!kT0`l1sOGF~(vgXXo_EqSO&gKNknPA$M8Ct7 zj{Ic)@6^Een3lDB{7ug)??8O|mip-5=s#jP?Ju55`-wNRClp)oM|{TmH;sk%2j~lO z&#>|6Sw-3Jv3if&cvv4Ach<#*FWY!$*m%yg;d%bj_}8}Kd4AE@hgki~iCghMW6Ae> z7<;+Z%eVFpwmhHMaQYqtg?rT6d0x=iwYQS{aGTyFo8LuN??amo>k*?j#Fme*po3Bll4_M~d^iE=Lto(Jb?yuSWanHfHZ?fqO zxB1*)^|dEdIPS3;=2-hDwwzztczE8%_-9yNZvAxzpz!)03h~d@ez}eB0vlfk*Zz!i z>9I~W^eyvU{MO#u)&uXF8@)Ge{P$S?!&3KI6rbKv5cTZ8p-t~3o6ihej^Q@G+b#cP z^)}da|6$3x*~G&=1;cl(UO8#trF&O~kJ@%Vjp67FO>UHvB!-pZ8u& zd~Ixg-?jC2vt@l-Z#rvH`numBo@-gd=5Lwh1vb5_Y1 zFwpZ-&0qa7;n(N`_uZmt+s`ijCMJFpYyy96LSV3Q)1OrLDR3XeXqH^=2UnCs$taJ? z8%^R$XtG+J$c;Y=a&W<=Cc`nc;lBP1j+8uEH`Sz2Ih&C(p&lTqh%qXSvb&q1dzkOR zY7f&9&SzOsne$I?7A!!PBCC+~2aQk{y_Ijz1YOXstCw`njk7STP_Jfs*| zj_5pA_eZZq^!+!w7y20T9HMuRbPl@{@t7m(Aze5t)h1L&}f<(fz;6kj==Q$X4V@ zGt=IL8K!v0^~ zOYf78$>c_X3!6?`RM!ua?ImoeW5f32+|Q=F*@RWP6)C#(LO&aZ8xbx{E7~YbZ}%{v zpAD0vyocq}yI*1X%y+UU$`ra={n-`z>IY#OmGwh+tDjquC)HmyQ-4|UIXR08sM=XQe&IaRGn40iBG-c2-hirp z1$^M_?Cie%veOfDmFAt=Zr))&ba4d6eQ$B-_Y%VEN~mk|kyjCi)*yS&M`j|9P}j!6 zyy)_=luo_(IC>`H2z6~7b1LH4xz9LyCE^Hm!#H}e5Ia0lrzvLc9?Q?d6y`3oKiuQ$ zK=qj7uC1i)!l`ajO#4+GF7&r~CcVay^kQC`xwJ&nh}kqUNW)#fFD8wc$=l?3Y0;vR z-1xYh!koErU6fqdP$x_$lXTp*xPZC|!w%!3x2Pn#UI_hcn8-DWvwgy7y|8T{+SzWHbZVhoa z`3`l>4+SUcCUm#@JV=pfJLc3{-k3!Ti!*5LMY*Yfh5j}iF}gmc`098Aw9s=Ck>--jzDaXQ9owG0BJHWLzBeu>zp!%te5;#I z-*RoF@#m{t`mL$b3jNSM%vU=7%IUvku6uLnS789x-$Qq+PhMO(w72lpca3`FM}#AF z7wXusk-nxqg&+PnccPv{H>*ou>uASsKUV8LKY&nLHZ4ECBs=^Kp~O!cRg^2#v*GD` zZd~$=GvUJ@s4>5r5XoQYXTwDLT^3hEKWW^AZdR9m=klj#6(~zlK~712>CpV5(&2ge zEMv3B7Uj@eD)JZV+3@r~SC6gCIYyj7Qx?r0T^3)M>3-3rB5bH*!_uo=*m~w{rK-zQ zMc7cshMir}fAt&awhb!%K)P%9(BFpRdgjK99whV4JQ4Yk@JKmBe;bY(aQ#c)Cm4n^ z(`lmJLwBnm87KN3YSVwGCH+WsB&|@#hKXwvFXNGt*#1R@xv`H zz0lq2GbUYo21dW?A6#)^LmeB|Tp3mRAD+=3Z%OS89naH7_0Id5_g-ErR$n@Ix|3^6 zH{5k*=S(v`v@n)Ww>h`(zYjktE`4(L(3Nl4R3w1sG`GAh^+u#;^&Qr4i0RUa@>HE( zBXcII$OGhn(wh=5D>FaGchrb}L;4NN8m?F>>aXhb4)OA;hk8%%U-^=+!D&OLP8gRx zVd$9Q!=`4B&hmO@r4Q*nWC(+MpJ^ZFeGn#Xo}}N8vR0io$Bg49jL)7teAtA^S=pn8 z56K!n*&8~dcfYK@y_v^l_TI)#%o()wv`0PYe3)O~oH}~k=^*-{@*xO~a{u6nyi4RR5mU&eAe)jWb`aX1HbnbmHbug@`ur!{#s4RbRd~!S| zFJ3Y$!|T&?NJe_EVO-rpv-fs5)SSsn^JC;-@-Sdvu9rEicdv}$J-H%H}@%| zIRH7BG)@0EZExy5O?l|kuUC4XUPJe@?i+IU8=B@Ic}^RUl~XvE-zJ-zRg}AEVZ5-c zv`c1Y&z`+{&d%$e)35hY-Fs!^^z43AdTx66qw?nDWTa=z$;dgX_du`jh@n|SGP79z zc-t}S>>niX5Fv{ zKYdSW6;YaS`u@>Z_7G0rx%uiI{PbOso%Z0T?{U;~70E{V)OTc(zNetAl#+~`Hgk>Una+HuD?lDW#6_Jzu)e~@7cZhy}TE{?fAL2apOsOiSe(#GDNQ2y7f(Tb>B$Fxruen z=#Ftev^sI=-8#KfSBG&HBXsh=FoHJ3{UP!E(!{psKTKm@fMoTbxp3xgi~ZeQ(sE1p zq+2w5{>-fS>_u~Dri~vybwmmGQ{)KScg|w`AY5v^8c**_+OYCa)E8K1?_Gn_f7xdY8 zpQ)K`Q}f9hHEd`an8pr2JKvx9f3yZJPRsC{-nS!L?YaERoLhFxzj4HkJ^FX}>mluL zg+y$Y-ocw}#X^%V&y5g`0&F0Kk$G1f# zySu30ns^Q{SYD*x???E=#(rkvmv7S!Itq?W&0hTgW6&g$7fvFD@v=FINn~;5NhHTk zA~}^Nkpn8Diz467Cz_qLB2deIZ7&})_$>Ffh^{2tk-Es`NF6Kg3aVNDa01tZx?(E| zJ+)gO%50z1Q&In9e$X|beMBlUkjtz#;MsH;QAXdpJ(D(`$LFf#NZj-2E~!xW#xFzk zycF;3>30;psdSk&eBOqC85_%O*awr&D7ui=uZs}vH`U`7B85m1QjDB}lpv*u)Yyr*pUa@U6`zY;&xnWONGC+)?TmCmx*}R@bVt$(`wGUcVktZoPlbS{@u#sn)-B zq0SoT=bX*AunTp*dno0L>@GXs4`}G!+jL}kti@-hsdOdhped!Ov{G z*IV##a@+Dvvj$#?+iiWgHD{&uazt=w=(X-r5~Z$nC$}rs%kja^;JMiyLl%8{+|mW9 zX*xUki1W-t_dKPeYG3W1sZy(n^;yZ8E8GYBv#wIEb-7B}L1T)_@_QFdD4JSYP*|i? zbrn!eDz%0{iL)-Zd|;j4mfnfL znba#5rU7Bed8T4hb<_RPdQ!c{5&nWTGX;xs>KE%(cckR$=j&%#b@kEKk@~Ot!R}d7 zajuFqauyFlmQdm#be)aaTKGDX+AoFifcLOo?$wo3wO$PMSbrG4rmQ?!VN^uKtn{fNed!;^Rz1%3#;Yy-m@5|NonoN(Zjd!8x z6sk#KVcDc9_I(o*=}`U#$NWl@jv+o%OGWG1%_DWsrpH{3F&vnu>!o$%ZWgC?a5X{k z2sKFSSkr&={fP{;`-i1EXscypwY3gk6Rd;nDc}>jae9n{sMIE8g9+TI3tA@V1?jW2 zGqaY9+u_P0v&^oh>v&N%LU~)B-k90-e{>UU|HyQwmYT#S!z$!714tY zml^YEl6QC`21ifaDBN7fvYaW)TP3>U$TNi&Y!&YSU0aQF#iMDKt6y!^B&C^YPZ`h0 z$S#o^oeVn|y_?}B_rAKW+`5|;rw6poa3v6Ze6C*7x}$DT7N$?PuH#BXH9c3m+H{PN z>?+<3@*L8pql5g`wOQmK-jyb9-MMW82lf-&_KsgeS-0T!1 zZ~UU*LSw>Kq70~XSkY?NXPE_c>CmP9hp(34a8U?Cg_l? zSSx`jk-Ak@8WD=KGF%x%c&@wNm?fR-tE}3t<|wvz*Wn%Ft8M>R3bDFn=#wRJ--P*)bt+n@(9rFUyHcd6O`igZ98+xEDsjw_q%M8!~3p zK7BH~wu2V=C)=I#E=sA)doTpj?B1&I0E~ejz!vZz>q2v2yy3SH$yhHGw#=EwfezadR*9p9ys`^mBRM#=QW2@?a`rYk1 zg7^L^`o7zjcrxi=NHW9U=%u5Ir~^78RD|mll+b%`Yn$SyGfgrKn(3(GJM?-Ax{w^`Fv9$q!uBGQ3OmU;4bKo5^qQ8!zv_` zkT%dCl0-7>jxoJ{kF6t?=(gP%@c`^Ebj=;?E=A!_hZ$VnFs! zsJ4TUX@u0RZbEeWz(~Emf7R$w+}2kJdBGn--VOYvi{3@N5m=OBanxAE>kY&W9$3|C zsA~?4wHoOb0~8A%awZ7FGhGkg0bjTg4 zo>ebdPmHmi_{v(p+S<^|TC~lv=#t~XT*sm!Yk4)t@?dMl^Ntl8tjD@I9&2Zr#fV%Xoa}w{8=&=*l)dKax85FM5G%eoei4$UrwwLi;-54};uW*Q%O2 zbZC5ZXJT)|N${$gzBY2}zJnum$?#x3Xy_pKT$8}53JK8suE}oQdzf2a7~03(&g5Oc zf(fna>Jf`ceB}kC@H+AKydb*F)@>$QLu>OlN>6#L&U3VtOWs~L%CS?hp z0_El<(+R{hTz9!MAqEZ#5{vV3;g76m1-I(xX&BCnE2-RCxEpv>su zx?p%r+z5HB5VH<&P*H!^W3XfKW2w)gxv^+p!9rT&ro~ueF{6S7wW?sT##n5rU_mot zk)EGm*KrgBx}rh&1LI!XnoOG#`X2Kc0oNAiQI?T;g4 z^woT+cY1zIk_>Wb$vO<5X_7oE27fLT$>cJY91^kUPEfG1kX*>nqQv83|nl5!)L285o)u>@528VkuK^+qnTMl(qdId`g2Je>Aa;sP8fT){WR!k+x8k6Yu~FC z48fPt{9YmFF1Cf-t3Bkp6pIJYsM@}=NzPqu3+azXMpo>PEJ>;Dk0WEbSCtE6`1I#f z!n__%18y~`$hhfgTT4DG$zv=Q=h5t}kWVjvK7qY$pVV+qp}&S_3vaDq!IUX>4g1=* ze;4{{xSn(;q3KcgX504nrQ1KoZi8dS;L2vD#VOe|U`~g1C|;Idd^@xID&MO)DK$ zP*yasUrw+5qKRcwib-2i-bAW<5`FRfwxYj;ei!;g((|V1KgPIqyOQ8Ig=z=xzlyGJ zl9p~SxkfNWC0G$RreJB(2%SDI7F~LNtR6dVgnLaAO0JJ3g1MN~TpLpLm*d9Otif25 z%i)9l$#mr^)91#;=vm`?7A$5A$aU8K^nEZ1xTZHUeWReXv}9&}S@DG8iDPI!sY@+V zZACnZ?#Lbnrop9%F>HPWtXBvp;IB6YQi34Eqc z^b{z@iCkyxPu~Xl*Er6-iew5}L)YT1-qR=1L4gZenEFE{m-USiWZh%JwKu^477V$yC}aDysX zEX9J3tsYCiX~9^iV6hJid5lFiyJc46 zohEjFOeA=FhOY|JbHp@SpPSmviq$D)E!|(UTa{6I2?oJ$U^x8Nq3Kc^x`Uy%oe}*)+`V}^Zzd7`^vhERoAWG_gLdp6shweSCS>AP{Rsr^o z*ggXcB-lcBK?jsV1VG7E?3i0^(n7Yq%*;-GVA^e-AVMXR5a@uRP+DD17NzkjAv3a7 z7^EdsW!TVu`tOh5;2zVEaf_5*4_aVo?2c?s^@vK2n3qA?s;3gOk zH^T(D6DI1t(_=hINbe&FPe3W=DI=eU$>=Y@+VGkQ|JBI9!#e2Q)K}ug!@9@`upZ2Y z^nq>xEMBp55cBzDNKXQ zVLH^X8GIaOz;&>>-h0<|PirIu)dosWY76BawukgrUo~JBvh=8ID0eFdN>AztyTQ(| zFO+HwfL)Mfk~kj!@;mQ90CWz*{}r8fpg&fa3!1z zUxf4EJ~$tqf)Bu}Z~^3~QZ0n?24@j$1|NjEa4{V2P#(1e&v+CM!x?ZXoClY|<#0KC z0&2Jku7Eq?Barhp^%&$pOAe>JjA6A3GA`6=NXJr-L++4T0|&yja3Wj>=QB*zdL20H zg^(u^DYklA@0``N;8`O*2j$j34`uR@mgkA2UO<+vz-gGbsnIi2s?EqUP+x?d;Y)Bd z+yckIt#B-SS?Ar`)^j3^mjuij7XLOxpysMdAr7LK>lLh}Os_(j;kHAWOm;x#Q?(P; zhOa{&v3BVs_g%=+0e8b3_$KTJ_rOB97nX5crryFc55?Q?QOLob_doC*xC6cm55WCU zwgB(LX!rqa1*JLK!h^`|;D_)wcnJ1^hv6W21TuitQ8)p94Ch#M>0@|Sq4)%Dfydzv zcmlo;Pr}cjWW?(ibqe_`{0x2vPs8uw8TbSI0$Oweu@8i2k);=&gZ1E-us%Ewn|Sbu zVGDQxMJD_TwufIsIqaA4-tZgb+u*lw2>cEfnD8PakA~l)FNT+4iQ&Ca(wS}KIU*D8 zS%BvUJP#T!hF6gvg+D?$y}t%!7yA?B1&O)@pM{d342NHkWjOo>IbK%3!!O|<@E`am ztU@pU3(9c#2X=zj1C+q}yi=hAGWJve{0|I-^atgFG`9+Z6iN!28}haA6nH^2z^C5(jU zq1b(6_!|`aKVdZb8a#`u!=^9>c7ZiuE)=`&uqJX3==R`Qj3*X81jSGrJ_RMhvoH?* zP8bi5zyx>^CPF8}Hwgwou@8aC$f2+{jE8k#D_9q{hGO3Vdc@NQk3{Sb>miSW4d6VO z0++*7_y`oc$6!O`m9P;!0Mp=E6Mg}vBg?$f4E_W&;4iQR{1r-if4La{;&C#wNW#Ie zC2}I<{(0NNHn1~n3wy$LZ~$x%2SJH91ZE)*h1_rND3}eW!W>uz#r|%?2cX1zFo^Nr z$*JZZMUe|*m}u!JbMJ)x;FItU_zfK9RPz!;IMF7dbT|tAcvuXdhIFX8r(qf4m*F(z zI-yG44TnN*_1xufE<6AiLgnFUxdcy3sNqDoiUdTz8u?ZD1iT8Lf^wAp92^B-gzI2A z`~>cRVJwGt!>;fxC@)~%gRjAZ@JDzQHsI-e9D4Hce1>NgJV(aQLwdS*Gn6KJ3DV=e zTi^xkB6*yDgB%6L&TZHbihWb~9r|qeJ?v!kUEpQpt|Ci*@FyqZe>EO4TyMBl3`pn| z_zU`X;ji$3(I0{gIqzZkJG^A{-^2eRUxt4`i&I60q_;Bs8`gr7ZX)~#ISF2u@t=lA z1@g><4%i$9z_!o{+d&r`3WMM<7!2=(Qm{h9GAJ3`149U307Ky_7zUq*mEmS6b}z$l z4~lX;Rp9%uYM`2%!CF5WxjB>wZ47gvM7#~gpdSXAY`n#=CY%o4@O~Hzm%>_bEsTTD z!+5wICcquglZfX{JW22^C>b0wJPec3AAz;u=dcd^7S@Bm!TQk2x*-KtgQ+kcHi8Xd zW7rBZ8+yCIG}sR|gZU9G|1+TO8xy#l-WA-6n&^-@=Td2viJ&j5QJ%rn5-ozPxz1ndn*!ai_5>`lKimZe z!Z)F${x-Y=`2#oz9)UyPCvd2q@KB*=G6j%ooI)d)tlMO1B-d~(#hVX#fY~WB8LAP; z%oVBt#v6SdI1;%oEQHdUQi2r2JU9mZ?QkrVjmEe@#&|xS@hB$15;zG?gtF6^1RsE< zP}YBw;Yv6aZiHoU3!Da}%G04#^)C1!oC!aI_rOo#EEu9fITw&Ut{kK2LrX>v=s~5W z4SYR-5lm2tZNMNPinM_j%DtNnnMLfn(eupN6sU8JGh917&Z=BF5VWN(Nc*Ib?ZH^*p>C zz5om0CO8UihEt%}Plqoe-vwWS3*i>H2yT^|_aGi=qGg8vff7+Rhvn$E8u?YY4S73! z1%3cug~#A_cnR)+f5F#aD2rD~CmgHvzzP`nRc zfFHnZ@F3g|KZK{@VfZbSgs#9N$ec{6qwsI|5e%UJe+;WZv5SVskgLN_U>$fIrovBQ zs{mF|V%QGF2^5?YsFSb^8Y}eGcknNiK z4zf+NoA#n1n-x1=0JGv{!r6n^GJ6Yk1vw1<06i?h)m1zx@JGl(Q(c3y(fAqWL%Zhi z7vxd!S2zX!24}$E;e04|i{O8eAB2CvHSkZk5&i|YK(X5f|CaIp3Z8!mco$xWtn*m0 za1;W?@C>w&zkm*S6$U^SFN(c`*U3IY?1Et+atL%mH)K!YO@zU)2^2dX-HJViHv@*c zSV86Bsf3~%41)up7!HP&k%z!=I2Klc6Jb?23yPf=@{-y+8%Dt8FcPkWQINUBwqveP z(a6jdsybvSsu&L*hL)-U>Cv_!Jyz93rpGEbq(7)w_&uxzX;#~gR#S1vw3=d<APItfIDk$;R!zP43Y2;^R2h|kCb12f_Zb<38@4{yA6wH7>LQ3lm zW=3$ict=0VAz7i53v?G4+&0@xOggzaD3tYx!zW=5+yrSY?;h9*ehNFo?;x$`y$)$TZxj#cTo?@{-B`nPDCxI?-O+dO;OT*< zqY3B+dm`t;UT_%f4U6Dya3*BK>zxDp!KF|VTmf%Kegv`+_U?k*KJQm>AiM;*jb7Ob z4u@;Tei28V-Xg@J^TtrC@1>U7=*u3+AIQg(IMb1@Kik5}t&kpzI~Z{tPTa z{sPi}yp7m9j)9FKb{=nr&*SY3B|PB2c^`)*a19i@jfUk=;%|o& z(Z6QoU2qceZdeLK*^5qwmEc4f|J7^{k3%R4)Pqwo$bw}s$LKr3X~>=7bT|&)1!uz< za1Ipv1%|7jq_-B{jeZAYqk{+*{Xc~s$))%?}a+c2L8*HfU{SA za4|7O{ScI8W5(>Tn3Y&l&}uuxW!u+YM2gJz-CbFG7V*SBKFzv5$Oc|jbadd z6vM%ga~gY5xDv|Jn_0v=)!4}^nbpWM;Nx&1Tm#p@wQwz52iHT%=qdOF^3#x6$lir) zfU*SN=&GW;hwv~hd9TB#^z0`daPVb-(DiQje^5&GnXBw`Y^ExEC-l5aXRUWTc;i20 zz1y?dSiJ}7sy=1Qc7c%+7bhHfYkli(*V zJ#ym`&j#**Y^MC*P>|iuHk@21h>E2;38isP!J6MK7zNisDZoY;jV!l32JVJ6;2V$!xV;^g0>6zc zJfWEPB;pq++&br(sk+b8PLJ;k6W0G)?>M4Kd&R?w^-e&RdM84ucM_C(Cqo&AwV~9z zE~MT!s$CCRs@(uewNrxBM7!P%QAoWTL8*6RDD`d%y)YeCtameHsdsZI^=<*B-kI=C zCidYUBOO=oK}djcm!wtvPriP)LO8 z@P6bNI2SfBdfA@OLzY*sEaU9AX<{$ib56?b*We3a7vx1S4?YNc!iS(7C9&MIxA9Bi z9mvbz5Dy-WXEPl)S90a$)vG5fr`~2-tUeoP> z3*b&DFP&e58omx!z}-;ZzDdR#;TymxR<55_avUTP@IQv!;A18 z$QM`CyHNJ~@4?D&KMaQlpuDd80M>+(VH`Y&91lN)8Ajg{9zt#f4?|w;t0QnYJSx4j z0MEy8Bs>OXyZ#B}oxC~@7r{^AgYYDL1WJao&p(B{8h!>}GWv3O8hIQ19Lje73_JzD zfS<#2P`3A;FY)m5QJse_C+7q(2z~{5H>kdbyyCMnjE0wxtHW;~FSu-dQ}``1FSyiq zP~Ibc4+p}_a4`G<4uMzUUGPWfbu#|1;hBx%CpZWG0vAK6;Zpc3@-p}v+zfw*+u?s9 zuXEI&a4!`5ci>;h@4~+!Z(r0ukhd-BI^-pa9BX>3GQ){|RA6l$3n-#dIA9_SfJu<= ze%mi3gUTxnDHEx@h8ZNr_$aX=zR0kS!k{iW=@)GXWz97{7< zxu~CUVNBO`aP4p-a7?H&RmfmcCvdcUp^`mgBb;pgM&RTLz7n?scLet{E{yrUIj$#e z25u>C6K)^w0`4zdjZikzxIws5+ydNs+`iDQIa${7J;9zdI+eVr4y5?fQom3{;cRjc zF2q{ci(w`#F!~Uh#nzLHu!V_Vmnw+7)7ZUZ;%`PN`gtau9AA8o94y-bvON|9=_JAd z6iS$cvt>iR6k^Nsj9rQ;unaS?lh^yg2}b_J*zGiSc_yF1cENbC+>5nDkcWZrq=`7d zMCfG-$Qhq6+|+QUsd61|laPFoLE_5tYRp1+Mg$wXUd!rw8x z*Tk=By3i{oUQJUh9y@k+GY#7tZt&UnlP})b27!jH4Of|ZR5k@*+iBaSn~W-(gxFlz zdW!-w?XU#+=IuIG_OhJnm6MS=D<`uQGnG!?7jG%uXJ2#(YpWgk_zp>S6C(sw}TwWX~Wgl3}{MMsE>X4I_be$t(9 zOwAxu*bL5Q{56$t&<5$*M-!|deeOtP`u8HM?$aie-b~r2GbuN}*6?Z|*TpLM$Z(^!*;x-{3yIFR8S`n@P#99noCE6J}; zEH%1#MyIhwh2y7An?NmZ6yFXracEHx+M7*_BU;Z?vwX?1yFmhU1*`$f-`JGCN3&-DR z4quo_fT8U#{nZ9iyj@dj45-j{w$fih#hP2vnee`}pi z(bZ2Thszh5|oYpAd#HPyvYZsm}#KPh=3!*Pq+r0bq)9~PrlrXq0V zcGDA2jpC;dAD=pBdG#xw%?yZCS9SX7&ie1uyThX83$yms*`eR~EK~pWdB;lCZ~Tpm zc6#sWobrFpykQ0K4OBg8Uv!{+@gkCWKPFIq@ixC}&0v+eprY&e}dXCGq*> zcO7}UZ>LD@-RE@5(pXP^BT9t8#Rv`UH2I;xp)cKmDY+c==$!L0f%1nITHC(y_$rA{ z{sKbQdAEbVS25(gJ5c^!MYO&XTlu3a;d(0;{CSWU2`Wc1$yV?uIYg0?=eOW5YKS5W zMK#_2LQLRo_=0So{0R%bgmS_DLlsLdxC7UqsINC;^ftaaw(o0vLv3Hj?z}j#eb3Q!fXsvYF?rwDJN`?Loh9 zif{FwO|;XY^04BZ1~& Date: Mon, 11 Jan 2021 01:58:44 +0300 Subject: [PATCH 07/39] i2c-related info --- PolarisBiosEditor.cs | 314 +++++++++++++++++++++----------- bin/Debug/PolarisBiosEditor.exe | Bin 90112 -> 93696 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 62976 -> 69120 bytes 3 files changed, 209 insertions(+), 105 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 5435673..969fa0e 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -5,10 +5,8 @@ using System.Windows.Forms; using System.IO; using System.Runtime.InteropServices; -using System.Windows; using System.Linq; using System.ComponentModel; -using System.Net; using System.Diagnostics; using System.Xml.Linq; using System.Xml.Serialization; @@ -104,7 +102,7 @@ public partial class PolarisBiosEditor : Form string programTitle = "PolarisBiosEditor"; - string[] manufacturers = new string[] + string[] manufacturers = new string[] { "SAMSUNG", "ELPIDA", @@ -114,7 +112,7 @@ public partial class PolarisBiosEditor : Form string[] supportedID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; - string[] timings = new string[] + string[] timings = new string[] { // UberMix 3.1 @@ -465,8 +463,8 @@ public enum GRAPH_OBJECT_TYPE [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_OBJECT_ID { - [XmlIgnore]public Byte KindInNamespaceRaw; - [XmlIgnore]public Byte NamespaceAndIndex; + [XmlIgnore] public Byte KindInNamespaceRaw; + [XmlIgnore] public Byte NamespaceAndIndex; public string KindInNamespace { get @@ -535,7 +533,7 @@ public struct ATOM_OBJECT_TABLE [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_COMMON_RECORD_HEADER { - [XmlIgnore]public Byte ucRecordType; //An emun to indicate the record type + [XmlIgnore] public Byte ucRecordType; //An emun to indicate the record type public string RecordType { get { return ((AtomRecordType)ucRecordType).ToString() + " = 0x" + ucRecordType.ToString("X"); } @@ -546,107 +544,192 @@ public string RecordType public enum AtomRecordType { - ATOM_I2C_RECORD_TYPE =1, - ATOM_HPD_INT_RECORD_TYPE =2, - ATOM_OUTPUT_PROTECTION_RECORD_TYPE =3, - ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE =4, - ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD_TYPE =5, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE - ATOM_ENCODER_FPGA_CONTROL_RECORD_TYPE =6, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE - ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD_TYPE =7, - ATOM_JTAG_RECORD_TYPE =8, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE - ATOM_OBJECT_GPIO_CNTL_RECORD_TYPE =9, - ATOM_ENCODER_DVO_CF_RECORD_TYPE =10, - ATOM_CONNECTOR_CF_RECORD_TYPE =11, - ATOM_CONNECTOR_HARDCODE_DTD_RECORD_TYPE =12, - ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE =13, - ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE =14, - ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE =15, - ATOM_CONNECTOR_HPDPIN_LUT_RECORD_TYPE =16, //This is for the case when connectors are not known to object table - ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE =17, //This is for the case when connectors are not known to object table - ATOM_OBJECT_LINK_RECORD_TYPE =18, //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record - ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE =19, - ATOM_ENCODER_CAP_RECORD_TYPE =20, - ATOM_BRACKET_LAYOUT_RECORD_TYPE =21, - ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD_TYPE =22, + ATOM_I2C_RECORD_TYPE = 1, + ATOM_HPD_INT_RECORD_TYPE = 2, + ATOM_OUTPUT_PROTECTION_RECORD_TYPE = 3, + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 4, + ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD_TYPE = 5, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_ENCODER_FPGA_CONTROL_RECORD_TYPE = 6, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD_TYPE = 7, + ATOM_JTAG_RECORD_TYPE = 8, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_OBJECT_GPIO_CNTL_RECORD_TYPE = 9, + ATOM_ENCODER_DVO_CF_RECORD_TYPE = 10, + ATOM_CONNECTOR_CF_RECORD_TYPE = 11, + ATOM_CONNECTOR_HARDCODE_DTD_RECORD_TYPE = 12, + ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE = 13, + ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE = 14, + ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE = 15, + ATOM_CONNECTOR_HPDPIN_LUT_RECORD_TYPE = 16, //This is for the case when connectors are not known to object table + ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE = 17, //This is for the case when connectors are not known to object table + ATOM_OBJECT_LINK_RECORD_TYPE = 18, //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record + ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE = 19, + ATOM_ENCODER_CAP_RECORD_TYPE = 20, + ATOM_BRACKET_LAYOUT_RECORD_TYPE = 21, + ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD_TYPE = 22, } - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VOLTAGE_CONTROL - { - public Byte ucVoltageControlId; //Indicate it is controlled by I2C or GPIO or HW state machine - public Byte ucVoltageControlI2cLine; - public Byte ucVoltageControlAddress; - public Byte ucVoltageControlOffset; - public UInt16 usGpioPin_AIndex; //GPIO_PAD register index - public UInt64 ucGpioPinBitShiftN8; //at most 8 pin support 255 VIDs, termintate with 0xff - public Byte ucGpioPinBitShiftTermination; - public Byte ucReserved; + public enum atom_voltage_type: Byte + { + VOLTAGE_TYPE_VDDC = 1, + VOLTAGE_TYPE_MVDDC = 2, + VOLTAGE_TYPE_MVDDQ = 3, + VOLTAGE_TYPE_VDDCI = 4, + VOLTAGE_TYPE_VDDGFX = 5, + VOLTAGE_TYPE_PCC = 6, + VOLTAGE_TYPE_MVPP = 7, + VOLTAGE_TYPE_LEDDPM = 8, + VOLTAGE_TYPE_PCC_MVDD = 9, + VOLTAGE_TYPE_PCIE_VDDC = 10, + VOLTAGE_TYPE_PCIE_VDDR = 11, + VOLTAGE_TYPE_GENERIC_I2C_1 = 0x11, + VOLTAGE_TYPE_GENERIC_I2C_2 = 0x12, + VOLTAGE_TYPE_GENERIC_I2C_3 = 0x13, + VOLTAGE_TYPE_GENERIC_I2C_4 = 0x14, + VOLTAGE_TYPE_GENERIC_I2C_5 = 0x15, + VOLTAGE_TYPE_GENERIC_I2C_6 = 0x16, + VOLTAGE_TYPE_GENERIC_I2C_7 = 0x17, + VOLTAGE_TYPE_GENERIC_I2C_8 = 0x18, + VOLTAGE_TYPE_GENERIC_I2C_9 = 0x19, + VOLTAGE_TYPE_GENERIC_I2C_10 = 0x1A, + }; + + public enum atom_voltage_object_mode: Byte + { + VOLTAGE_OBJ_GPIO_LUT = 0, //VOLTAGE and GPIO Lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_VR_I2C_INIT_SEQ = 3, //VOLTAGE REGULATOR INIT sequece through I2C -> ATOM_I2C_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_PHASE_LUT = 4, //Set Vregulator Phase lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_SVID2 = 7, //Indicate voltage control by SVID2 ->ATOM_SVID2_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_EVV = 8, + VOLTAGE_OBJ_MERGED_POWER = 9, + VOLTAGE_OBJ_PWRBOOST_LEAKAGE_LUT = 0x10, //Powerboost Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_HIGH_STATE_LEAKAGE_LUT = 0x11, //High voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_HIGH1_STATE_LEAKAGE_LUT = 0x12, //High1 voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + } + + enum atom_gpio_pin_assignment_gpio_id + { + I2C_HW_LANE_MUX = 0x0f, /* only valid when bit7=1 */ + I2C_HW_ENGINE_ID_MASK = 0x70, /* only valid when bit7=1 */ + I2C_HW_CAP = 0x80, /*only when the I2C_HW_CAP is set, the pin ID is assigned to an I2C pin pair, otherwise, it's an generic GPIO pin */ + + /* gpio_id pre-define id for multiple usage */ + /* GPIO use to control PCIE_VDDC in certain SLT board */ + PCIE_VDDC_CONTROL_GPIO_PINID = 56, + /* if PP_AC_DC_SWITCH_GPIO_PINID in Gpio_Pin_LutTable, AC/DC swithing feature is enable */ + PP_AC_DC_SWITCH_GPIO_PINID = 60, + /* VDDC_REGULATOR_VRHOT_GPIO_PINID in Gpio_Pin_LutTable, VRHot feature is enable */ + VDDC_VRHOT_GPIO_PINID = 61, + /*if VDDC_PCC_GPIO_PINID in GPIO_LUTable, Peak Current Control feature is enabled */ + VDDC_PCC_GPIO_PINID = 62, + /* Only used on certain SLT/PA board to allow utility to cut Efuse. */ + EFUSE_CUT_ENABLE_GPIO_PINID = 63, + /* ucGPIO=DRAM_SELF_REFRESH_GPIO_PIND uses for memory self refresh (ucGPIO=0, DRAM self-refresh; ucGPIO= */ + DRAM_SELF_REFRESH_GPIO_PINID = 64, + /* Thermal interrupt output->system thermal chip GPIO pin */ + THERMAL_INT_OUTPUT_GPIO_PINID = 65, + is_mm_i2c = 0xA0, }; -/* -// Define ucVoltageControlId -#define VOLTAGE_CONTROLLED_BY_HW 0x00 -#define VOLTAGE_CONTROLLED_BY_I2C_MASK 0x7F -#define VOLTAGE_CONTROLLED_BY_GPIO 0x80 -#define VOLTAGE_CONTROL_ID_LM64 0x01 //I2C control, used for R5xx Core Voltage -#define VOLTAGE_CONTROL_ID_DAC 0x02 //I2C control, used for R5xx/R6xx MVDDC,MVDDQ or VDDCI -#define VOLTAGE_CONTROL_ID_VT116xM 0x03 //I2C control, used for R6xx Core Voltage -#define VOLTAGE_CONTROL_ID_DS4402 0x04 -#define VOLTAGE_CONTROL_ID_UP6266 0x05 -#define VOLTAGE_CONTROL_ID_SCORPIO 0x06 -#define VOLTAGE_CONTROL_ID_VT1556M 0x07 -#define VOLTAGE_CONTROL_ID_CHL822x 0x08 -#define VOLTAGE_CONTROL_ID_VT1586M 0x09 -#define VOLTAGE_CONTROL_ID_UP1637 0x0A -#define VOLTAGE_CONTROL_ID_CHL8214 0x0B -#define VOLTAGE_CONTROL_ID_UP1801 0x0C -#define VOLTAGE_CONTROL_ID_ST6788A 0x0D -#define VOLTAGE_CONTROL_ID_CHLIR3564SVI2 0x0E -#define VOLTAGE_CONTROL_ID_AD527x 0x0F -#define VOLTAGE_CONTROL_ID_NCP81022 0x10 -#define VOLTAGE_CONTROL_ID_LTC2635 0x11 -#define VOLTAGE_CONTROL_ID_NCP4208 0x12 -#define VOLTAGE_CONTROL_ID_IR35xx 0x13 -#define VOLTAGE_CONTROL_ID_RT9403 0x14 - -#define VOLTAGE_CONTROL_ID_GENERIC_I2C 0x40 -*/ + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_GPIO_ROLE_I2C_ID + { + public Byte gpio_id; + + public bool bfHW_Capable + { + get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_CAP) != 0; } + set { throw new NotImplementedException(); } + } + public int bfHW_EngineID + { + get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_ENGINE_ID_MASK) >> 4; } + set { throw new NotImplementedException(); } + } + public int bfI2C_LineMux + { + get { return gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_LANE_MUX; } + set { throw new NotImplementedException(); } + } + public string Description + { + get { return ((atom_gpio_pin_assignment_gpio_id)gpio_id).ToString(); } + set { throw new NotImplementedException(); } + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_I2C_SHIFTED_SLAVE_ADDRESS + { + public Byte shifted_i2c_slave_addr; + /* //Not sure if it actually shifted... + public int EffectiveSlaveAddr + { + get { return shifted_i2c_slave_addr >> 1; } + set { throw new NotImplementedException(); } + } + */ + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_i2c_voltage_object_v4_fields + { + public Byte regulator_id; //Indicate Voltage Regulator Id + public ATOM_GPIO_ROLE_I2C_ID i2c_id; + public ATOM_I2C_SHIFTED_SLAVE_ADDRESS i2c_slave_addr; + public Byte i2c_control_offset; + public Byte i2c_flag; // Bit0: 0 - One byte data; 1 - Two byte data + public Byte i2c_speed; // =0, use default i2c speed, otherwise use it in unit of kHz. + public Byte reserved_0xA; + public Byte reserved_0xB; + public UInt16 i2cdatalut_reg_index_ff_to_mark_end; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VOLTAGE_OBJECT_START + public struct atom_voltage_object_header_v4 { - Byte ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI - Byte ucSize; //Size of Object - ATOM_VOLTAGE_CONTROL asControl; //describ how to control - //ATOM_VOLTAGE_FORMULA_SOME_VERSIONS asFormula; //Indicate How to convert real Voltage to VID + public atom_voltage_type ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI + public atom_voltage_object_mode ucVoltageMode; //Indicate voltage control mode: Init/Set/Leakage/Set phase + public UInt16 usSize; //Size of Object + + public atom_i2c_voltage_object_v4_fields AsI2c; + [XmlIgnore] + public bool AsI2cSpecified => ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ; } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VOLTAGE_OBJECT_INFO_V3_1 + { + public ATOM_COMMON_TABLE_HEADER sHeader; + //ATOM_VOLTAGE_OBJECT_V3 asVoltageObj[3]; //Info for Voltage control + } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_GPIO_I2C_ASSIGMENT { - UInt16 usClkMaskRegisterIndex; - UInt16 usClkEnRegisterIndex; - UInt16 usClkY_RegisterIndex; - UInt16 usClkA_RegisterIndex; - UInt16 usDataMaskRegisterIndex; - UInt16 usDataEnRegisterIndex; - UInt16 usDataY_RegisterIndex; - UInt16 usDataA_RegisterIndex; - Byte sucI2cId; - Byte ucClkMaskShift; - Byte ucClkEnShift; - Byte ucClkY_Shift; - Byte ucClkA_Shift; - Byte ucDataMaskShift; - Byte ucDataEnShift; - Byte ucDataY_Shift; - Byte ucDataA_Shift; - Byte ucReserved1; - Byte ucReserved2; + public UInt16 usClkMaskRegisterIndex; + public UInt16 usClkEnRegisterIndex; + public UInt16 usClkY_RegisterIndex; + public UInt16 usClkA_RegisterIndex; + public UInt16 usDataMaskRegisterIndex; + public UInt16 usDataEnRegisterIndex; + public UInt16 usDataY_RegisterIndex; + public UInt16 usDataA_RegisterIndex; + public ATOM_GPIO_ROLE_I2C_ID sucI2cId; + public Byte ucClkMaskShift; + public Byte ucClkEnShift; + public Byte ucClkY_Shift; + public Byte ucClkA_Shift; + public Byte ucDataMaskShift; + public Byte ucDataEnShift; + public Byte ucDataY_Shift; + public Byte ucDataA_Shift; + public Byte ucReserved1; + public Byte ucReserved2; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_GPIO_I2C_INFO { - ATOM_COMMON_TABLE_HEADER sHeader; + public ATOM_COMMON_TABLE_HEADER sHeader; //ATOM_GPIO_I2C_ASSIGMENT asGPIO_Info[16]; }; @@ -1131,13 +1214,29 @@ private void OpenFileDialog_Click(object sender, EventArgs e) var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - ReadPrintTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); Print("Encoders:"); - ReadPrintTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); Print("Connectors:"); - ReadPrintTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); Print("Routers:"); - ReadPrintTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + + var used_volt_obffset = 0; + + ReadPrintTable(atom_data_table.VoltageObjectInfo, + (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), + volt_object => + { + used_volt_obffset += volt_object.usSize; + return volt_object.usSize; + } + ); + + ReadPrintTable(atom_data_table.GPIO_I2C_Info, + (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), + i2c_assigment => Marshal.SizeOf(i2c_assigment) + ); tableROM.Items.Add(new ListViewItem(new string[] { "BootupMessageOffset", @@ -1410,24 +1509,29 @@ private int PrintAndReturnLen(ATOM_OBJECT o) } return Marshal.SizeOf(o); } - private void ReadPrintTable(UInt16 offset, Func entry_count, Func entry_size) + private void ReadPrintTable(int offset, Func continue_parse, Func entry_size) { - if (offset == 0) - { - Print("Table not present:" + typeof(TTable).Name); - return; - } - var table_reader = Reader(atom_data_table.Object_Header + offset); + var table_reader = Reader(offset); var table = table_reader.ReadPrint(); table_reader.Jump1Structure(); var object_reader = ConsecutiveReader.From(table_reader); - for (var i = 0; i < entry_count(table); i++) + for (var i = 0; continue_parse(table, i); i++) { var atom_object = object_reader.ReadPrint(); object_reader.Jump(entry_size(atom_object)); } } + private void ReadPrintObjectTable(UInt16 offset, Func entry_count, Func entry_size) + { + if (offset == 0) + { + Print("Table not present:" + typeof(TTable).Name); + return; + } + ReadPrintTable(atom_data_table.Object_Header + offset, (table, i) => (i < entry_count(table)), entry_size); + } + ConsecutiveReader Reader(int offset) { return new ConsecutiveReader(buffer, offset, this); diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index b24414c338503bda7843e8f9fd65c1296024150b..21c0c30f87b748260914bc263c24c4dcc2880091 100644 GIT binary patch delta 26071 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 QU8eN+8yYjE#|bX}e`qpTSO5S3 delta 22586 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

VcPIr8iD8+$1& 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 literal 62976 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

Yx3ZzqYx5#W4SxZ~V3Q#@7BdcFwBU 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 Date: Tue, 12 Jan 2021 04:12:20 +0300 Subject: [PATCH 08/39] Output more hex values; Output table after i2c voltage object --- PolarisBiosEditor.cs | 129 +++++++++++++++++++------------- bin/Debug/PolarisBiosEditor.exe | Bin 93696 -> 94720 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 69120 -> 71168 bytes 3 files changed, 79 insertions(+), 50 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 969fa0e..77a1e04 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -570,63 +570,63 @@ public enum AtomRecordType { public enum atom_voltage_type: Byte { - VOLTAGE_TYPE_VDDC = 1, - VOLTAGE_TYPE_MVDDC = 2, - VOLTAGE_TYPE_MVDDQ = 3, - VOLTAGE_TYPE_VDDCI = 4, - VOLTAGE_TYPE_VDDGFX = 5, - VOLTAGE_TYPE_PCC = 6, - VOLTAGE_TYPE_MVPP = 7, - VOLTAGE_TYPE_LEDDPM = 8, - VOLTAGE_TYPE_PCC_MVDD = 9, - VOLTAGE_TYPE_PCIE_VDDC = 10, - VOLTAGE_TYPE_PCIE_VDDR = 11, - VOLTAGE_TYPE_GENERIC_I2C_1 = 0x11, - VOLTAGE_TYPE_GENERIC_I2C_2 = 0x12, - VOLTAGE_TYPE_GENERIC_I2C_3 = 0x13, - VOLTAGE_TYPE_GENERIC_I2C_4 = 0x14, - VOLTAGE_TYPE_GENERIC_I2C_5 = 0x15, - VOLTAGE_TYPE_GENERIC_I2C_6 = 0x16, - VOLTAGE_TYPE_GENERIC_I2C_7 = 0x17, - VOLTAGE_TYPE_GENERIC_I2C_8 = 0x18, - VOLTAGE_TYPE_GENERIC_I2C_9 = 0x19, - VOLTAGE_TYPE_GENERIC_I2C_10 = 0x1A, + VOLTAGE_TYPE_VDDC_0x1 = 1, + VOLTAGE_TYPE_MVDDC_0x2 = 2, + VOLTAGE_TYPE_MVDDQ_0x3 = 3, + VOLTAGE_TYPE_VDDCI_0x4 = 4, + VOLTAGE_TYPE_VDDGFX_0x5 = 5, + VOLTAGE_TYPE_PCC_0x6 = 6, + VOLTAGE_TYPE_MVPP_0x7 = 7, + VOLTAGE_TYPE_LEDDPM_0x8 = 8, + VOLTAGE_TYPE_PCC_MVDD_0x9 = 9, + VOLTAGE_TYPE_PCIE_VDDC_0xA = 10, + VOLTAGE_TYPE_PCIE_VDDR_0xB = 11, + VOLTAGE_TYPE_GENERIC_I2C_1_0x11 = 0x11, + VOLTAGE_TYPE_GENERIC_I2C_2_0x12 = 0x12, + VOLTAGE_TYPE_GENERIC_I2C_3_0x13 = 0x13, + VOLTAGE_TYPE_GENERIC_I2C_4_0x14 = 0x14, + VOLTAGE_TYPE_GENERIC_I2C_5_0x15 = 0x15, + VOLTAGE_TYPE_GENERIC_I2C_6_0x16 = 0x16, + VOLTAGE_TYPE_GENERIC_I2C_7_0x17 = 0x17, + VOLTAGE_TYPE_GENERIC_I2C_8_0x18 = 0x18, + VOLTAGE_TYPE_GENERIC_I2C_9_0x19 = 0x19, + VOLTAGE_TYPE_GENERIC_I2C_10_0x1A = 0x1A, }; public enum atom_voltage_object_mode: Byte { - VOLTAGE_OBJ_GPIO_LUT = 0, //VOLTAGE and GPIO Lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_VR_I2C_INIT_SEQ = 3, //VOLTAGE REGULATOR INIT sequece through I2C -> ATOM_I2C_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_PHASE_LUT = 4, //Set Vregulator Phase lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_SVID2 = 7, //Indicate voltage control by SVID2 ->ATOM_SVID2_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_EVV = 8, - VOLTAGE_OBJ_MERGED_POWER = 9, - VOLTAGE_OBJ_PWRBOOST_LEAKAGE_LUT = 0x10, //Powerboost Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_HIGH_STATE_LEAKAGE_LUT = 0x11, //High voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_HIGH1_STATE_LEAKAGE_LUT = 0x12, //High1 voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_GPIO_LUT_0x0 = 0, //VOLTAGE and GPIO Lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3 = 3, //VOLTAGE REGULATOR INIT sequece through I2C -> ATOM_I2C_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_PHASE_LUT_0x4 = 4, //Set Vregulator Phase lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_SVID2_0x7 = 7, //Indicate voltage control by SVID2 ->ATOM_SVID2_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_EVV_0x8 = 8, + VOLTAGE_OBJ_MERGED_POWER_0x9 = 9, + VOLTAGE_OBJ_PWRBOOST_LEAKAGE_LUT_0x10 = 0x10, //Powerboost Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_HIGH_STATE_LEAKAGE_LUT_0x11 = 0x11, //High voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_HIGH1_STATE_LEAKAGE_LUT_0x12 = 0x12, //High1 voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 } enum atom_gpio_pin_assignment_gpio_id { - I2C_HW_LANE_MUX = 0x0f, /* only valid when bit7=1 */ - I2C_HW_ENGINE_ID_MASK = 0x70, /* only valid when bit7=1 */ - I2C_HW_CAP = 0x80, /*only when the I2C_HW_CAP is set, the pin ID is assigned to an I2C pin pair, otherwise, it's an generic GPIO pin */ + I2C_HW_LANE_MUX_0x0F = 0x0f, /* only valid when bit7=1 */ + I2C_HW_ENGINE_ID_MASK_0x70 = 0x70, /* only valid when bit7=1 */ + I2C_HW_CAP_0x80 = 0x80, /*only when the I2C_HW_CAP is set, the pin ID is assigned to an I2C pin pair, otherwise, it's an generic GPIO pin */ /* gpio_id pre-define id for multiple usage */ /* GPIO use to control PCIE_VDDC in certain SLT board */ - PCIE_VDDC_CONTROL_GPIO_PINID = 56, + PCIE_VDDC_CONTROL_GPIO_PINID_0x38 = 56, /* if PP_AC_DC_SWITCH_GPIO_PINID in Gpio_Pin_LutTable, AC/DC swithing feature is enable */ - PP_AC_DC_SWITCH_GPIO_PINID = 60, + PP_AC_DC_SWITCH_GPIO_PINID_0x3C = 60, /* VDDC_REGULATOR_VRHOT_GPIO_PINID in Gpio_Pin_LutTable, VRHot feature is enable */ - VDDC_VRHOT_GPIO_PINID = 61, + VDDC_VRHOT_GPIO_PINID_0x3D = 61, /*if VDDC_PCC_GPIO_PINID in GPIO_LUTable, Peak Current Control feature is enabled */ - VDDC_PCC_GPIO_PINID = 62, + VDDC_PCC_GPIO_PINID_0x3E = 62, /* Only used on certain SLT/PA board to allow utility to cut Efuse. */ - EFUSE_CUT_ENABLE_GPIO_PINID = 63, + EFUSE_CUT_ENABLE_GPIO_PINID_0x3F = 63, /* ucGPIO=DRAM_SELF_REFRESH_GPIO_PIND uses for memory self refresh (ucGPIO=0, DRAM self-refresh; ucGPIO= */ - DRAM_SELF_REFRESH_GPIO_PINID = 64, + DRAM_SELF_REFRESH_GPIO_PINID_0x40 = 64, /* Thermal interrupt output->system thermal chip GPIO pin */ - THERMAL_INT_OUTPUT_GPIO_PINID = 65, + THERMAL_INT_OUTPUT_GPIO_PINID_0x41 = 65, is_mm_i2c = 0xA0, }; @@ -637,17 +637,17 @@ public struct ATOM_GPIO_ROLE_I2C_ID public bool bfHW_Capable { - get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_CAP) != 0; } + get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_CAP_0x80) != 0; } set { throw new NotImplementedException(); } } public int bfHW_EngineID { - get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_ENGINE_ID_MASK) >> 4; } + get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_ENGINE_ID_MASK_0x70) >> 4; } set { throw new NotImplementedException(); } } public int bfI2C_LineMux { - get { return gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_LANE_MUX; } + get { return gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_LANE_MUX_0x0F; } set { throw new NotImplementedException(); } } public string Description @@ -681,9 +681,22 @@ public struct atom_i2c_voltage_object_v4_fields public Byte i2c_speed; // =0, use default i2c speed, otherwise use it in unit of kHz. public Byte reserved_0xA; public Byte reserved_0xB; - public UInt16 i2cdatalut_reg_index_ff_to_mark_end; } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct FINAL_atom_i2c_data_entry + { + public UInt16 final_entry_index; + public static UInt16 ENDING_INDEX_VALUE => 0xff; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_i2c_data_entry + { + public UInt16 i2c_reg_index; // i2c register address, can be up to 16bit + public UInt16 i2c_reg_data; // i2c register data, can be up to 16bit + }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct atom_voltage_object_header_v4 { @@ -693,7 +706,7 @@ public struct atom_voltage_object_header_v4 public atom_i2c_voltage_object_v4_fields AsI2c; [XmlIgnore] - public bool AsI2cSpecified => ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ; + public bool AsI2cSpecified => ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3; } [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -1224,12 +1237,23 @@ private void OpenFileDialog_Click(object sender, EventArgs e) var used_volt_obffset = 0; - ReadPrintTable(atom_data_table.VoltageObjectInfo, + ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), - volt_object => + (volt_object, reader) => { used_volt_obffset += volt_object.usSize; - return volt_object.usSize; + if (volt_object.AsI2cSpecified) + { + var detailed_reader = ConsecutiveReader.From(reader); + detailed_reader.Jump(Marshal.SizeOf(volt_object)); + while(detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) + { + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); + } + ConsecutiveReader.From(detailed_reader).ReadPrint(); + } + reader.Jump(volt_object.usSize); } ); @@ -1509,7 +1533,7 @@ private int PrintAndReturnLen(ATOM_OBJECT o) } return Marshal.SizeOf(o); } - private void ReadPrintTable(int offset, Func continue_parse, Func entry_size) + private void ReadPrintTableDetailed(int offset, Func continue_parse, Action> next_jumper) { var table_reader = Reader(offset); var table = table_reader.ReadPrint(); @@ -1518,10 +1542,15 @@ private void ReadPrintTable(int offset, Func for (var i = 0; continue_parse(table, i); i++) { var atom_object = object_reader.ReadPrint(); - object_reader.Jump(entry_size(atom_object)); + next_jumper(atom_object, object_reader); } } + private void ReadPrintTable(int offset, Func continue_parse, Func entry_size) + { + ReadPrintTableDetailed(offset, continue_parse, (atom_object, object_reader) => object_reader.Jump(entry_size(atom_object))); + } + private void ReadPrintObjectTable(UInt16 offset, Func entry_count, Func entry_size) { if (offset == 0) diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index 21c0c30f87b748260914bc263c24c4dcc2880091..b01cc1c77f5ab9cfadc48c6ca40b8b2b658ec621 100644 GIT binary patch delta 22520 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 delta 21466 zcmbt+33wD`(tmZ&OwW~sOhWEVW^xa?1HmK&1O$X|h8q+&WB~<40tqM>a1ucT1r-`^ zT)|scTn-Q1#RIQ3!U}lfx=IvOl#dk!PsIPPs(U6G{CuAO^L*(1x~{jX-g>Lw?&%(A zJz{J9$ac%>tk+ijQcvce!<0pCrHm+`5Dhkj?+so5*rb@1Llqjsg6Rq!AGkg;eC?5m;5C`-dltQIIe_F{`=II|RS$VtQf&UD{Mn94BIIR$PzE%Nj)}B;+ zI|KHIRV8uf0jHJq@46mWV)bj?)k=4LxBFUU@Xr2Gk64nvR>-<8fZ)q#5Ls2Vr2&Tn zJ@m8P3KLlDiBVfv<4L`l*_OTf`LQX=*ZP#$(zwqtc8afL%JR#2sIP2YzJ6zHhLW%E zicOEthqc-=lZU3?%uLJc`WLZd`+SE%xy4C&*L(}&tX7LjHn$PEa$8w*&8bNBa8_R{ z>Qj1?Cy;hJQa^(AD@1=AMoVmdEAN1PeP=s%f=$r zmi?Ts`>ZyE$6W`%%v`A76qh#k$M8rHXSLC6alJ%l%{4zos?io&^J-DECXh%}h#Fi8 z|BZtnPF`25{~R|23o{^|ah2dc!MN@$nbLhIaC7%+;D>_U6Ie1W;XI%&_=cd8$dW3- zM!|;?+46+Yxk>DyUhq!Aw*{kW> zX@}4B{%OfV25R(6(iWgI-b@?Q*H~}N+m}2uzEEvh-euZo?A*k-!oVGK*kruV4#judYhdm}JNqT9)z$kRJ7GLKX?d#L{l)kJWwa-(? zH)%@a(>NH`mziP4dd8|PI2)~=(TRpVn{4Q`(+?CRR!9orAvj-T{}?Hq;TgO9b#zpu ztZsSx&eTG?s`SvaiUZP!YXf>+af;ENd-cZR#5CUH&RXLy_FP>2kh#OD%l?d9T0Yk| z7yGec?I})`mRp;zcNG8W!e@|{+A^D)b{EKi71Ja&DbSsdPPGNQlC|+!XwZ{)^1<2o zcRrZC0(0!$ar$*7Gqis|-nd&oQIeuPXOPjQ#Yw~XBpB+L`qntL{X>0pby zV%g)ekFYG}MD=gt6ZPMEx-(6)%y?RGUv83d=}}v7B3q5i&-?nq1hI6Omc8{oJ(CT8 zZ~fjMwyMAP#Kbt<{@<(prjs#dIBAMy+%BQK3VNj~iF$cOiSm>_y&~Oc(7BjPyp;-_ z7^XLT?1 z8wFlLX!C0AFv`VNjj!%p(z}O(o%z1=0!gpICjG1upXf;}Dxjv*m^rqtf9f6QB^Rb~ zdsAVcQw-y#d%L3*r-BMx1c*;owWL6ro>S?c8}gOvNiFI_O|=Q|r3C)TgKh-fIVexH z`&<+oc%&QQo~X=JUega$CMf^Z8>$i#w2VM%INNKJ z5Lm+`VylvsRJ})4W_X$zo(!Jm?qpclV9`*O9A^&f(M5b?RSE_^*kxd*Co??IE&~&S z_Haf|^{ZnE!s1Jv9)jUydh- zV-1HUPBlEP2HnMDuIfk);Cv0OPgm1#BTe&EM_M3N-&E~IsbZ@V{MK|c6Q`L-z!NCS zr>48o5YB?B{kJ*^lehPotF-G)eJX=*U`p7@_-fUJ9WR-8n*-R>RJlqv?}gf>Ht)k> zId&MUNzN1UUo7PvO>Gu(zL0OSv{6XhV7Zp_U69&*fXQGdiBk#EHz9E?U(jiMRi{N; zCy9GPHfGy}owiFl4RBK!im|fO7Pr@sN)k&u4RE6uvRy^Nu;b=Va=a?G+5I~-q2~gxYL$zjLb^hXp%upX|2!)d3M)y8ZYZKUe`(9B&1aP=1%e!A!U)) zcapf?BHUZ-S7)+?7p3uS@Yqtg=AaQD3>P(|;G%_Su1SdIIfrPTlSv0mf7~3tC|^|b zJMiE5t`UTVO+R{ZwR*2p;2YsfYJQ)sJ|J>)cs5IHJfxTQ^EQ0gX{esn+&BrE|IM}^ z8FFqs-zDdSVPR8ZMrRnY>KcZlurLWxw)XP|%_uBFl=yR_a8Eat!69xJtpl6?!wGzB zB)}^F6WD-#F%eUhA;Y@lzyjY)U-$4-IR_RdHy+}y2RENhx;1{%$^Ai4HuNW8+xK;g z2+H!N>0N?~VY~{%$ha&|YdmBGYUHkOJPgMCiqa91BORx&M??tjnWh`MgkXW+iCp|^ zQH6-vu_~oA3NPxXovxeiU@y1`<3`F1{Fy$ce|qqUVZ-}GTI119<`0U&b}7Eth%8yw zw7E-`Ebv>nVoM`ZWO-^RMP?EkgP(VXOlthXV0fo$+QAOL>=gI{jmHd*cdw@1UDR?q z871W{tkEnfi+xW2F0NG96NBYVuN(PRgwIE#toNK-RyM}zVMI2VPxX5Sq${84e;*Jo zABPQ>kC{IxAFIwSpO}B&rF<-q^7*loMJ_U{!mR`*h}_HyvMOA`HZTztMS6a;5;X_kM@-%b zc|TxXdT61U30IbxaAi5Mh{|$;5tZdVJX~4X(2dISRWMXp7WTY29?|yM^uoyE@a={ahi^8*J;&ML)YdbHL{^IB=T?ekO@A>e)i5No zQmo4eRf?H#rI-mqL1z6Yg ze3xR0F&E3XETU2@4_C@yKGpkNcy6WmW=kr?w_4#!aW-73whI%2U3-e<=T?ekO&@m2 zhy`+L`sPGr#B!fAR5#|rbz>%6H%_UuZb6*ToLfZU_{OR8iZ8cOMj4kw5h`OBG2ajV zFJito>?-!B^Cdsrp34VJ;ktKhyA+jpPe=yVwp;nL)Q5@nuy?$82<%;C;5C46W3b$E0SRwRcN#|;H9sV_QoHIxPZOy5)+zPz*K56aA{6klP)#Zk;J z>XJ4KByIm@UXQLdXO+(t%AC1y&6n}5Vz}t*po-W+Z(>2$+n}4-RZM6W%>6;mVmQ;k z5`7zyw+xxzCGQ|h{2w9bb8cx_j$3J?dbdQxW$q8+ilNiL?cBIBWObLgEb#j*nEyF( zSrHKztLX}_=KmP^tcOv0s0_^bT>fj%jmh$+`?|yw!wFr!9pR?H(ZW)ktNQK{-uw?c z-6O0$92WKA8;A`OsqvEyBNO_*15xOVV|mj{T_Ul-f0B#Z`Bg0B0Jq2b*pcDyNNkE& z>F37MAx~;NVFYHTi8AF2Q~JQ9l*H!$a`=xswSnhY@J*+{7v;a_+=_^s0=U8V#d4Vu zOZ@SCw#7#DEX%{UO3WlRp42l&WdyyP=eHc|JBj75u;5@VykSX%OLA)qDEp(J8@yLlXEw#PVn% zvGGTP;dzA_o_3hwVul$mQJ68V^ri#jiexZ}0pl3>iJceZsezxFpaN%nnM&2@;S_z~ zm`v>#NSn{-v&Z=Hd~3}ZUoedyWnFU{g18DvE67p5WA*Ghl@Z_zRS+RwcDq!K$_tf=Jp4Y#wt5!1f+_Aop^#ic>bu-Q5 z%M?n5wO?-->kSsDE!&_?Ijdln@T9;!;WU;g?VK+rt(k!&QvZo!V zpbep=S1rvk5H9b=Mz-a#e88(W9Qd_~l`e+gZ1x*RXA`huX<7htDseDnJ+aYv-bAy72ZXBC!hw@Nmb~XhY%5*N1)3c_>YxIV)ZqTaeDf#Ec&3 zOxrTWh4#(W~~`n z29lu*sx2I5Ew)%xGzHmNw5ePIV|Arhr2pjwmGPEJrbMd6oX53l3%`K3wCn`7+>T5P zGJw(+PCaWi+R#F18FQkc0o&2H)+zG(-qHfbIH^mThoNSz-|A0K@b~{`r%xsgp8+gL z;l=QrVF~1cEVuv#zz0g#og$` z5|(fCe;LfzD46*raJrx^i|KxpCz08g%}(!m@o2}%*V1ddNF?;UIh%!WUTU^ zsnKX%-sC(N&Bz-I$yV!6NipJQ3VL#ryui`XXQTSDyi{7tBNOQZqTPg{Hx&i=xG5vxRMDdwDX|1>84V zAi-qPzKV;XgIIO+M|Np-23=fSouknwML{mq-vX?5mVaEFK|QOgb27-EU7h2ixd?`O z6iv>{pbH^)(e+q}%aotd_*c;o3A_@)T-1WT$)KCOJofoYwoJyvGU&HF4zs)FOO(A8 zl|}~?azd}5Klt1j8FcVL;s0>9T-JS4@u)BtBV3B`v9zgpQ}I~*#EVa=SXx*zw{#6{ zBtHhn((9#jOB0maCZ#pfC~tBR=B%N&X<5|S_eI0vd={^ z_m;_Bl*HT#lUpXbQzkc8bl;oYTG9P#a%H0X&E$rQ&Y~FMHwkAmxsTHDeWioECi`dX zz8%yL9PUHteC$`FXo#t^yID8N(ITjeCF&nrw1^72U-qw^wFg z4~`=&!nG+liW>0qIcB$k9Ysq_ZV0Zuqv$4Z{8;`=Y!;~0M}V7#(B<1Hdto51vU zV%g$k`d!gBi}p6AgROPqqNfCSNCuoA&!!{9XcFj9LT^PKhWtc##*Y+6yOpt6=qD^p zZ+9?OI~o0gnvLlP4cc6}m`F-|_H(*WHX|35;uF8L!e9e--2A=&#q_20ZlHIF{J!*f&=sXgz;==BNKXfSVW}T@w@8+! z=Yn>Y_5fZa9v&}MIvAjvFm1@`LAxVD1ve!+e{nRW=CNoCq2mJ8fWj}^?4QNdkev{~?IDu;P2g>hQ1 z6~HVpT`4GmsWgLKtSw;N+k^48Y{vV9ejthIfY5`*W|7d7g?0=5l6aV!$d;D|<*-~7 z*N9QJ;NL`Yp`a#`8llGvPA}xaKbA4J6)~oWyk4*>jV0wmeu&j~=I-A2zFOvZONM`y`N#(^9 zrY}zB%6PtS)M0&+R5}yvOseM8^!0J1n(0`aI1uWP}bNdqGzQ+ z8YJ*7f@EPwuUQ!nCo$e9N!V+c?pMy~ju#}Ez#O6DguYs6ztGFX|0xgKzgok%HkieS z+ob7?Hhe)s{#!a=kKjXss|87L0i$`DR-2%elHW-7g`t( zTNy8t8Na~OGZXC{ts|9Nx-quIFuoS82XRPgEBCm{NNrH=U zpU9sS`AsTInyrj4+Zf9<#^(i-?M$x}{9Z8I!4idT4<|7=@opFHf9{CKp|ymW*3%Zo z`-L9eo#|+yze-^GHDIWi?FhFPV4W|bVlIk z)3BGs-d6LSQ={eCysvy9=hrMr(Ir=nzq@(V{TV?%T$Lv-r01jhGHnrwSLW@P^VQg7 zlEuYvk*^e+LE^ejuwIV3G#OKo-W;NwuN#y6Zge6u84PhaHyjN6lWCbzwm+$x^i zu&#~%QmVNvbU?UOqz7W$Ryt#HeXEk(b~=UUPi(nAKLbCV+lYs6%+=>+xTEMeb3s~_ z+=B1&coM-+lb~FfoZ*h4l_r-A(^xuVa>K#JkslAb*z)PTJa>26XL2#=MeYO&^fPon zr44c?(6B{n`3X~J?=hqqj1K; z^r4NytxvwS_&(?!i_kr3aE`61?bL^A=X3Z~jyO^z^~OgEX98>quQ88cAmY$>CL=hO;4Q_T2I z6+epp5VVE5C$q#?9UH6Cm)_V|3nh!>37n@Y^~d&u@0DGd{~vk>p7|?u8(wW-AM|mU zQgLKRCL(-Si9&xVXUm5I9DZ{Rk6nm8Q5Cs`9tuKXH5H?(yC}NIyQXy&2ID(1p6e*| zeILfI+OG65XjR%LHeKniHcu1=*~lnGDIV_|+5O)zu892{kRo$cEcApd&G)?}X~DyI zTdCqL9QJ?w?NpRVp=V`IMtKdoD;^9DfaU*Gvi;9pBw5K$YANQ|fqX4V0lKhJw-m?X zwLD|B;6TAz!Lfo?={$s3)>}E4Aty zUKItfwHTW?WUw>S*!9a=vB%dm9@3%r#0)8c6D%dY>>9ABdT;Ttk^>k(H>UdSvD7Q zyWq2eTLifV_bEBFI{7h-TAh+W2a(VY(3j`#Ql=_r0_~W)Pp_J#acQ+_G-hetsIh0eP^5CB8LJS@N z+*mqPEh65Sot6{X7peHmhsE_kOW7=Ssd{PIT(wQYv?-0L%T$l$NDiKuiG5$e!GbB4 zZB>t{BZZz2lmoZP8|pNnX9~^}TqL+maHZf{6Zs0TQRqxdpX~mYO+r6_3hhuH7kpB1 zx8N&+`vl(+{7A4?4Zd9die(R&H!Rz+q6aM80q+ZbB-kPNx#c8Q^lM8G3)iVu&CNM! z$)U$BwCjgnGFDSZ1{ zYxxTnE=u8Rh!yf3%2><8zIfZ6VslLGkBjgzbsKE9K(fa6C~$z;vR*Z&y>R4h1zz|OSE9SdO_7SF#5UZI$&DaT5S*3a)Z`E?-nFrTG)Y>gi zrQHkd)wvI8$H)dp$7p`_R_!M_U4No&=<{;RMx2T#sdvgkt=w`Xd7m6U0Ty!#GnEiM7X(@ie&XU&=raf(pwL)68FPisPi-R0=*6yIF zAXyv^yv1<VfNFyf zJtEmXF4=99?4G2Bknf@^fxCr%ky=2%B3Zvqob*0P`hX<;4z)t^0bK|Dh;9HLrkjCB zXe01Tx)XSu{sR1l?gyTtM}R-lRtMg{o}nFJNO=ZmRdxd%${t{p@*40CWiK$<#;cWX zeq(zNc*^zx@JHK+z%#awfI-qe#=)u`20FA)fl=BKV665zu)Fpp zFj@Nwn64cM`n40l9PJxmK>HS0q@4nmY2O1Yv>$r15BebU^Z0)3#ks+i-LTpp-I3&q8LGQL5~;p z#ey^FdPpv(?Z9SwKB`t+-%mSfLG=Cf4+OiP?gzeX;!fHTy+*kkk{LFZuMoUn@MRPK z3i)SD_jPRX>J$~d#mfV>^kCd0*ip!IW;J6&U&iy41I`VWx1Fz9-ouPFD${#hebO%f zj0BbFMyc=95;cQX;ByN; z_u#V)pXcy7h|kArMv%S+@gqJqO9sW^lZj86PCAnq2C1kwtb-THqHtBnKWkP zgn>hc)K8dNr@L3hc*@IYM&rE2SIi$at6}D>rt&g<&&qiH#bA`Z@A=jB^;H$Rztx*m zQC~)V&!16WKX^{_f_V)~2hD3}Zia3`>-nz5GwK><&cyHQjG_Clv+19<4%1&+nYMFV zTaIF>s4v$~tW1;RZ`Y;jr>@->9T8H0ab@o0=?%M7 z-M>0kAGW$o=-XGvIzwJ6O)r(~rCVi00+mwy4QmpRZ57*bw#p4@@l_FKRh$wJPp*!T zS5x0njWZX|n{~eUdE|!2^~M`lPidOfJge!-Su^X)mR!(v{fE@o4H^_F7&U3|;B!QE zgKCG=|6UA<-fwMod}lj}yLx!gUs#urPD3u7IDSa|potUehm0P0!N?)?L+fhC)YsLH z#=2&#P1E-Vz4|33RKsMW}c6ZGw^3A*FKgsKM)M4|hN=%IAR}@cMw0`oFzRDwd$>ILJ zj#~WqTQ8)E_f6$6F;A&#-)iBJqKc`;rl6&VeczWH#Hs~RJ=I1=L8s`WjG zeM+_7aX8R_RE!;A;@U=~TM;Oo2c<{Z9dV0e9B~aXF{*0wQ(W6bn_r1*Kt`aa3SNS| z;@TSYVI4g^bDVZ-T>Ed!Zoo$0ZT_4tB0-C+{b9GVNPXPU{+4k>1eVzy_dE1^$Z>#G(| z>n#q|X^d`N>u_LH>n)zvwJwNQdq<}hUqV=Who^O;e*I@f^KV5n#W=8liW*N?gLoyL zP-RED(Oz3Tb_Z(BYcL-5armDozfFmW^0b}ww4Jtz`NX!L za#@g_b$#U*2{&Kh){eVsLVh<49q_6y{N4CwXA#1q7KcA$jn$4nl{1(k?Q8l}& zIjx$fb(enNtHOcX%oWDT5~8Msso4%UufN&(E~6LF@D4a{-R%%w@B4M{-ic+ZMe;Ga zN_qx;mcU}32G2O$eeN=&G4+?f4pbhJzOV`6?K!Wo(~4F}w%}eDE##TN8w~==flL8jvddG>`0 z%?>CuZv5c!QNQFJntcDOqt*_6-L7072{r!@HA>+0 diff --git a/bin/Debug/PolarisBiosEditor.pdb b/bin/Debug/PolarisBiosEditor.pdb index 6009b5a290a0ac68273ae642d5788c41361314e7..fbcf4d5b43de30a2445b52ee4b9e61bf2ce65121 100644 GIT binary patch delta 20977 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 Date: Tue, 12 Jan 2021 19:27:56 +0300 Subject: [PATCH 09/39] update version and remove unused files --- App.config | 6 - PolarisBiosEditor.Designer.cs | 14 +- PolarisBiosEditor.cs | 8 +- PolarisBiosEditor.csproj | 31 +- PolarisBiosEditor.resx | 377 ------------------------- PolarisBiosEditor.userprefs | 27 -- Properties/AssemblyInfo.cs | 36 --- Properties/Resources.Designer.cs | 63 ----- Properties/Resources.resx | 117 -------- Properties/Settings.Designer.cs | 26 -- Properties/Settings.settings | 7 - bin/Debug/PolarisBiosEditor.exe | Bin 94720 -> 61440 bytes bin/Debug/PolarisBiosEditor.exe.config | 6 - bin/Debug/PolarisBiosEditor.pdb | Bin 71168 -> 67072 bytes favicon.ico | Bin 15086 -> 0 bytes notice | 4 - prov | 1 - version | 1 - 18 files changed, 17 insertions(+), 707 deletions(-) delete mode 100644 App.config delete mode 100644 PolarisBiosEditor.resx delete mode 100644 PolarisBiosEditor.userprefs delete mode 100644 Properties/AssemblyInfo.cs delete mode 100644 Properties/Resources.Designer.cs delete mode 100644 Properties/Resources.resx delete mode 100644 Properties/Settings.Designer.cs delete mode 100644 Properties/Settings.settings delete mode 100644 bin/Debug/PolarisBiosEditor.exe.config delete mode 100644 favicon.ico delete mode 100644 prov delete mode 100644 version diff --git a/App.config b/App.config deleted file mode 100644 index 4543795..0000000 --- a/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/PolarisBiosEditor.Designer.cs b/PolarisBiosEditor.Designer.cs index 9e3be62..0571f1c 100644 --- a/PolarisBiosEditor.Designer.cs +++ b/PolarisBiosEditor.Designer.cs @@ -28,7 +28,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PolarisBiosEditor)); this.open = new System.Windows.Forms.Button(); this.save = new System.Windows.Forms.Button(); this.txtChecksum = new System.Windows.Forms.TextBox(); @@ -135,6 +134,7 @@ private void InitializeComponent() this.columnHeader2}); this.tableROM.Dock = System.Windows.Forms.DockStyle.Fill; this.tableROM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableROM.HideSelection = false; this.tableROM.Location = new System.Drawing.Point(3, 16); this.tableROM.Name = "tableROM"; this.tableROM.Size = new System.Drawing.Size(259, 121); @@ -168,6 +168,7 @@ private void InitializeComponent() this.columnHeader4}); this.tablePOWERPLAY.Dock = System.Windows.Forms.DockStyle.Fill; this.tablePOWERPLAY.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tablePOWERPLAY.HideSelection = false; this.tablePOWERPLAY.Location = new System.Drawing.Point(3, 16); this.tablePOWERPLAY.Name = "tablePOWERPLAY"; this.tablePOWERPLAY.Size = new System.Drawing.Size(259, 138); @@ -203,6 +204,7 @@ private void InitializeComponent() this.columnHeader5, this.columnHeader6}); this.tablePOWERTUNE.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tablePOWERTUNE.HideSelection = false; this.tablePOWERTUNE.Location = new System.Drawing.Point(3, 16); this.tablePOWERTUNE.Name = "tablePOWERTUNE"; this.tablePOWERTUNE.Size = new System.Drawing.Size(254, 233); @@ -238,6 +240,7 @@ private void InitializeComponent() this.columnHeader9, this.columnHeader10}); this.tableFAN.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableFAN.HideSelection = false; this.tableFAN.Location = new System.Drawing.Point(3, 16); this.tableFAN.Name = "tableFAN"; this.tableFAN.Size = new System.Drawing.Size(259, 263); @@ -270,6 +273,7 @@ private void InitializeComponent() this.columnHeader12}); this.tableGPU.Dock = System.Windows.Forms.DockStyle.Fill; this.tableGPU.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableGPU.HideSelection = false; this.tableGPU.Location = new System.Drawing.Point(3, 16); this.tableGPU.Name = "tableGPU"; this.tableGPU.Size = new System.Drawing.Size(254, 184); @@ -302,6 +306,7 @@ private void InitializeComponent() this.columnHeader14}); this.tableMEMORY.Dock = System.Windows.Forms.DockStyle.Fill; this.tableMEMORY.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableMEMORY.HideSelection = false; this.tableMEMORY.Location = new System.Drawing.Point(3, 16); this.tableMEMORY.Name = "tableMEMORY"; this.tableMEMORY.Size = new System.Drawing.Size(254, 105); @@ -341,6 +346,7 @@ private void InitializeComponent() this.columnHeader15, this.columnHeader16}); this.tableVRAM_TIMING.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableVRAM_TIMING.HideSelection = false; this.tableVRAM_TIMING.Location = new System.Drawing.Point(3, 209); this.tableVRAM_TIMING.Name = "tableVRAM_TIMING"; this.tableVRAM_TIMING.Size = new System.Drawing.Size(262, 373); @@ -377,6 +383,7 @@ private void InitializeComponent() this.columnHeader7, this.columnHeader8}); this.tableVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableVRAM.HideSelection = false; this.tableVRAM.Location = new System.Drawing.Point(3, 43); this.tableVRAM.Name = "tableVRAM"; this.tableVRAM.Size = new System.Drawing.Size(262, 160); @@ -442,10 +449,10 @@ private void InitializeComponent() this.linkLabel1.LinkColor = System.Drawing.Color.Red; this.linkLabel1.Location = new System.Drawing.Point(12, 669); this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(275, 16); + this.linkLabel1.Size = new System.Drawing.Size(516, 16); this.linkLabel1.TabIndex = 6; this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "BUY PolariBiosEditor Pro performance"; + this.linkLabel1.Text = "(Link kept from upstream vesrsion) BUY PolariBiosEditor Pro performance"; this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // // PolarisBiosEditor @@ -467,7 +474,6 @@ private void InitializeComponent() this.Controls.Add(this.editSubItem1); this.Controls.Add(this.editSubItem2); this.Controls.Add(this.apply); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "PolarisBiosEditor"; this.Text = "PBE"; this.Load += new System.EventHandler(this.PolarisBiosEditor_Load); diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 77a1e04..9a0cccb 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -98,7 +98,7 @@ public partial class PolarisBiosEditor : Form /* DATA */ - string version = "1.7.3"; + string version = "1.7xml"; string programTitle = "PolarisBiosEditor"; @@ -999,7 +999,7 @@ private void apply_Click(object sender, EventArgs e) public PolarisBiosEditor() { InitializeComponent(); - this.Text = this.programTitle + " " + this.version + " " + "Tweaked By VASKE"; + this.Text = this.programTitle + " " + this.version; #if !DEBUG try @@ -1109,7 +1109,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) tableVRAM.Items.Clear(); tableVRAM_TIMING.Items.Clear(); - this.Text = this.programTitle + " " + this.version + " tweaked by VASKE" + " - " + "[" + openFileDialog.SafeFileName + "]"; + this.Text = this.programTitle + " " + this.version + " - " + "[" + openFileDialog.SafeFileName + "]"; System.IO.Stream fileStream = openFileDialog.OpenFile(); if ((fileStream.Length != 524288) && (fileStream.Length != 524288 / 2)) @@ -2271,7 +2271,7 @@ private void button1_Click(object sender, EventArgs e) } if (samsung4_index == -1 && samsung_index == -1 && hynix_2_index == -1 && hynix_3_index == -1 && hynix_1_index == -1 && elpida_index == -1 && micron_index == -1) { - MessageBox.Show("Sorry, no supported memory found. If you think this is an error, please file a bugreport @ github.com/vvaske/PolarisBiosEditor"); + MessageBox.Show("Sorry, no supported memory found"); } this.tablePOWERPLAY.Items[1].SubItems[1].Text = "2300"; diff --git a/PolarisBiosEditor.csproj b/PolarisBiosEditor.csproj index 5e44305..3fc1e82 100644 --- a/PolarisBiosEditor.csproj +++ b/PolarisBiosEditor.csproj @@ -35,7 +35,8 @@ 4 - favicon.ico + + @@ -60,35 +61,9 @@ PolarisBiosEditor.cs - - - PolarisBiosEditor.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - + \ No newline at end of file diff --git a/PolarisBiosEditor.resx b/PolarisBiosEditor.resx deleted file mode 100644 index fecce2a..0000000 --- a/PolarisBiosEditor.resx +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - AN7+AAAn/wAApf8AAP//AAD4/wAAVuUAAAD+AAAY/gAABf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A - AAD/AAAH/gAABf4AAAT+AAAL/wAAKf8AAIn/AADy/wAA//8AAO7/AABa/wAA4P8AAP//AAC4/gAAI/8A - ANP/AAD//wAA/P8AAFn/AACl/wAA//8AAP//AACi+wAAAf8AAGr/AACJ/gAAEP8AAAAAAAAAAAAAAAAA - AAAAAAAA/wAAAP4AAAD+AAAA/gAAAP4AAAD+AAAf/wAAff8AANP/AAD+/wAA8f8AAEj/AADK/wAA//8A - AOT+AAAo/wAAnf8AAP//AAD//wAAc/8AAK7/AAD//wAA//8AAMX+AAAI/wAAWf8AAPz/AACY/wAADP4A - AAAAAAAAAAAAAAAAAAAAAAAAgoKCAISEhACEhIQAgYWFAP8AAAX/AAAN/wAAI/8AAIf/AADb/wAANv8A - AMX/AAD//wAA9f8AAD3/AABs/wAA//8AAP7/AABu/wAAvv8AAP//AAD//wAAyv8AAAv/AABS/wAA/P8A - APn/AABn/wAAAP8AAAD/AAAA/wAAAAAAAACFhYUAg4ODG4SEhB6Dg4MNgYSEGnSSkgX/AAAA/wAAB/8A - AE//AAAv/wAA3P8AAP//AAD5/wAARf8AAEr/AAD7/wAA8/8AAFn/AADS/wAA//8AAP//AAC6/QAABP8A - AGv/AAD+/wAA//8AAMr/AAAw/wAAUv8AAGv/AABEAAAAAIKCgjaBgYHOgYGB0oGBgaSBgYHSgoKCUAAA - AAB2jY0GgIiIJNYtLQ7/AABb/wAA0v8AAPT/AAA3/wAAOf8AAPf/AADS/wAASP8AAOr/AAD//wAA//8A - AJL+AAAD/gEBpf4BAf//AAD//wAA+f8AAOT/AAD6/wAA1P8AAGr/AAAAgoKCV4CAgLeBgYG2goKCqIGB - gdWBgYEsgoKCAH9/fwCDg4OCgYODgl+oqAj/AAAl/wAAgP8AABj/AAA4/wAA9v8AAIv/AABY/wAA+/8A - AP//AAD6/wAAU/8AADb4Bwfp7xAQ//8AAP//AAD//wAA/f8AAJ3/AAAi/wAAAP8AAAB8iYlDgIGBo4CA - gMOAgIDugICA64GBgUuCgoIigYGBRYCAgMGAgID5gYKCWtExMQAA//8A/wAAAf8AAEf/AADj/wAAN/8A - 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 - ALX/AABM/gAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAD+AAAA/gAAI/8AAN3/AAD//wAA//8AANv+AAA+/wAAuf8A - AP//AAD//wAA/f8AAHH/AACk/wAA//8AAP//AAC7/gAAD/4AAAn/AAC5/wAA//8AAP//AAD//wAAsP4A - AAoAAAAA/gAALv8AAOz/AADt/wAAcf4AAAb+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAP8AAAD+AAAN/gAAMv8AAL3/AAD//wAA//8A - AP//AADC/wAAqf8AAP7/AAD//wAA//8AAKb/AABq/wAA/P8AAP//AAD3/wAAWP8AAAD/AACA/wAA//8A - AP//AAD//wAA8f4AAEf+AAAA/gAAJ/8AAOP/AAD//wAA9P8AAGf9AAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAA/8AAE7/AAC//wAA7f8A - AP7/AAD//wAA//8AAP//AAD//wAA8/8AAP7/AAD//wAA//8AANH+AABF/wAA5/8AAP//AAD//wAAvP4A - AAz+AAA9/wAA8P8AAP//AAD//wAA//8AAKf+AAAG/gAAJP8AAOL/AAD//wAA//8AAOH+AAAw/gAAAP4A - AAD+AAAA/gAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAEP8A - AIH/AACU/wAAi/8AAJH/AACl/wAAyf8AAO7/AAD//wAA//8AAP//AAD//wAA//8AAOr+AAA9/wAAv/8A - AP//AAD//wAA9P8AAEj+AAAL/wAAwf8AAP//AAD//wAA//8AAOv+AAAz/wAAIP8AAOH/AAD//wAA//8A - AP//AACQ/QAAA/4AAAD+AAAg/gAAFv8AAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/wAAAf4AAAL/AAAA/wAAAP8AAAD9AAAD/wAAEP8AADj/AACJ/wAA4/8AAP7/AAD//wAA//8A - APT+AABC/wAAkf8AAP//AAD//wAA//8AAJT5AAAA/wAAev8AAP7/AAD//wAA//8AAP//AABs/gAAIf8A - AOH/AAD//wAA//8AAP//AADT/gAAGf4AAAD+AABL/wAAuP4AAD/yAAAA/gAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA/wAAAP4AAAD+AAAA/gAAAP4AAAD+AAAA/wAAAP4AAAf/AAA9/wAApP8A - APv/AAD//wAA//8AAPj+AABE/wAAaP8AAP7/AAD//wAA//8AAM7+AAAR/wAAO/8AAPH/AAD//wAA//8A - AP//AACQ/gAAKf8AAOb/AAD//wAA//8AAP//AADx/gAAOf4AAAD+AAAq/wAA6v8AAOL/AABU/gAAAf0A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAv4A - AET/AACV/wAAuP8AAOX/AAD//wAA//8AAPX+AABA/wAATv8AAPr/AAD//wAA//8AAOz+AAAx/gAAE/8A - AND/AAD//wAA//8AAP//AACd/gAAM/8AAOz/AAD//wAA//8AAP//AAD6/wAAUAAAAAD+AAAb/wAA2P8A - AP//AADm/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/gAAAf4AAAb+AAAE/gAACv8AAC7/AACS/wAA9P8AAO7/AAAw/gAARv8AAPn/AAD//wAA//8A - APr/AABP/QAAAv8AAKj/AAD//wAA//8AAP//AACO/gAAP/8AAPT/AAD//wAA//8AAP//AAD7/wAAVAAA - AAD+AAAY/wAA1P8AAP//AAD//wAAzP8AAB7+AAAAAAAAAP4AAAD+AAAA/gAAAP4AAAAAAAAAAAAAAIGB - gQCEhIQAhISEAIaGhgCBgYEAhH9/AJBzcwCwUlIA/gAAAP8AAAD+AAAG/wAAd/8AAMz+AAAV/wAAXf8A - APz/AAD//wAA//8AAP//AABj/QAAAP8AAIH/AAD//wAA//8AAP//AABy/wAAU/8AAPv/AAD//wAA//8A - AP//AAD5/wAASwAAAAD+AAAf/wAA3f8AAP//AAD//wAA/v8AAH7xAAAA/wAAAP8AAADCAAAA/wAAAP8A - AAAAAAAAAAAAAIODgwCEhIQdg4ODI4aGhieAgIAFg4ODE4KCghyDg4MEg4ODAAAAAAD9AgIA/wAAC/8A - AEX+AAAI/wAAk/8AAP//AAD//wAA//8AAP//AABkAAAAAP8AAGX/AAD+/wAA//8AAPj+AABH/wAAbv8A - AP//AAD//wAA//8AAP//AADu/gAANP0AAAD+AAA5/wAA8P8AAP//AAD//wAA//8AAND+AAAp/wAASP8A - AH//AACZ/wAAiP8AAEUAAAAAgYGBAIKCgiaCgoLAgYGBy4KCgs6CgoJ1gYGByoGBgdqCgoJrg4ODAQAA - AAB/f38AfIeHDVyrqwUA//8A/wAAKf8AAJn/AADy/wAA//8AAPv+AABRAAAAAP8AAFH/AAD7/wAA//8A - ANr+AAAf/wAAlP8AAP//AAD//wAA//8AAP//AADW/gAAGv8AAAD/AABv/wAA/f8AAP//AAD//wAA//8A - APj/AADX/wAA9f8AAP//AAD//wAA3f8AAHYAAAAAgYGBA4KCgpKAgID/f39//4CAgP+CgoLRgYGBxICA - gPyCgoJ2g4ODAQAAAAB/f38Ag4ODLYSEhIeEhIQp0y4uAP8AAAb/AABU/wAA0P8AAO7/AAA1AAAAAP8A - AEj/AAD4/wAA//8AAJ7+AAAP/wAAvv8AAP//AAD//wAA//8AAP//AACo/gAABf4AAA7/AAC99wgI//oF - Bf//AAD//wAA//8AAP//AAD//wAA//8AAO//AACR/gAAKPsAAAEAAAAAgYGBB4ODg3SAgICWgYGBkoOD - g5KDg4NzgYGBx4KCgtWBgYEZgYGBAIGBgQCAgIAAgICACYKCgr6CgoLSg4ODOdExMQD/AAAA/wAAJf8A - AHr+AAATAAAAAP4AAEr/AAD5/wAA9v4AAEv+AAAj/wAA4/8AAP//AAD//wAA//8AAP3/AABn/wAAAP8A - AGD/AAD34xwc//EODv//AAD//wAA//8AAP//AAD//wAA4P4AAFX9AAAE/gAAAP4AAAAAAAAAYKSkAYKD - gzWBgYFrgYGBioGBgbWAgIDof39//4GBgeKCgoIyhoaGAH5+fgOCgoIIgoKCN4GBgdh/f3//gYGBxIKC - ghj+AAAA/gEBAP8AAAL+AAABAAAAAP4AAFj/AAD+/wAAvv4AAAz/AABZ/wAA+v8AAP//AAD//wAA//8A - AOD+AAAj/wAAL/8AANn+AQH/yTY2/+8QEP//AAD//wAA//8AAP//AAD0/wAAW/8AAAD+AAAAAAAAAAAA - AAD+AAAAhnd3CoOBgbGAgYH/f39//39/f/9/f3//f39//39/f/+BgYHGgoKCXYKCgoaBgYG0gICA5H9/ - f/9/f3//gICA+YKCglCBgYEAhIODAI9ycgCtTk4A/wAAAP8AAHH/AAD5/wAAW/4AAAL/AACg/wAA//8A - AP//AAD//wAA//8AAJP+AAAy/wAAxv8AAP/uERH/sU1N//gHB///AAD//wAA//8AAP//AACn/gAACf4A - AAAAAAAAAAAAAAAAAAD/AAAY/wAAh+IeHsKScHCxf4CA+H9/f/9/f3//f39//39/f/9/f3//gICA9YGB - get/f3/7f39//39/f/9/f3//gICA/IKCglZ/f38ChISEVIKCgmB2gYED/wAAAf8AAJj/AAC7/gAADv4A - ACr/AADj/wAA/v8AAP3/AAD//wAA7v8AAIv/AADS/wAA//8AAP/APj7/t0dH//4BAf//AAD//wAA//8A - AOr/AAA7/gAAAAAAAAAAAAAAAAAAAAAAAADkHByG3yEhvuEgIMjULCx5gIGByn9/f/9/f3//f39//39/ - f/9/f3//gICA94CAgO6AgID5f39//39/f/9/f3//gYGBy4KCgh2CgoIpgoKC5oKCgqBxiYkB/wAAD/8A - ALD/AABI/AAAAf8AAIP/AAD//wAAxv8AAOb/AAD//wAA+P8AAPX/AAD//wAA/+YZGf+Ua2v/3SIi//8A - AP//AAD//wAA/v8AAI/+AAAEAAAAAAAAAAAAAAAAAAAAAAAAAACIfn67gIGB7YCAgO6FfX3RgICA4H9/ - f/9/f3//f39//39/f/2BgYHVgoKCnIKCgneCgoJrgYGBnoGBgcKCgoKfg4ODMoSEhACBgYFcgYGB/oGB - gXe4RUUA/gAANv4AAHf+AAAE/wAANf8AAOT/AAC4/wAAZP8AAO//AAD//wAA//8AAP//AAD/9QkJ/6Jc - XP+qVFT/+wQE//8AAP//AAD//wAA1f4AACT+AAAA/gAAAAAAAAAAAAAAAAAAAAAAAACCg4NOgYGB3n9/ - f/9/f3//f39//39/f/9/f3//f39//4CAgPCBgYHggICA8oCAgPGBgYHDgoKCWoODgxmFhYUCg4ODAIOD - gxOBgYGtgYGB/YGCglf/AAAB/gAASf4AABz+AAAa/wAApf8AAJD+AAAb/wAAjv8AAP//AAD//wAA//8A - AP/7BAT/tUlJ/5JsbP/oFhb//wAA//8AAP//AAD3/wAAZP8AAAD+AAAA/wAAAAAAAAAAAAAAAAAAAAAA - AAB4eHgAg4ODP4GBgcp/f3//f39//39/f/9/f3//f39//4CAgPN/f3//f39//39/f/9/f3//gICA9IGB - gbyCgoKOgoKCh4GBgb2AgID7gICA8oGDgzz/AAAF/gAAGP4AAA3+AABV/gAAQv0AAAT/AABJ/wAA6/8A - AP//AAD//wAA//wDA/++QED/kW1t/9sjI///AAD//wAA//8AAP//AACd/gAACvsAAAH+AAAu/gAAEAAA - AAAAAAAAAAAAAAAAAACBgYEAhISEAIODgyKBgYGbgICA9H9/f/+AgID3goKCmYKCgoqAgID5f39//39/ - f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//gYGB5YCAgCX/AAAA/wAAAP8AAAj+AAAJ/wAAAP8A - AD7/AADX/wAA//8AAP//AAD/+wQE/8E+Pv+cYmL/3yAg//8AAP//AAD//wAA//8AALT+AAAY/gAADP8A - AHH/AACe/gAADAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/AIODgwCDg4MIg4ODVoKCgsSCgoKQg4ODhYKC - gpSCgoKggICA5H9/f/2BgYHJgICAmIGBgZeBgYHAgICA8H9/f/+AgIDWg4ODZYODgwmcXl4A/gAAAP4A - AAD+AAAJ/wAAXP8AAN3/AAD//wAA//8AAP/2CQn/xzg4/7xDQ//vEBD//wAA//8AAP//AAD9/wAAqP4A - AB7/AAA0/wAAqv8AAPT/AABi/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgoIAhYWFAIaG - hhODg4M5goKCuIGBgfOAgIDjgICA7n9/f/6AgIDkgYGBvoODg4mEhIQjg4ODQYKCgpmDg4NChYWFFoOD - gw2EhIQAgICAAP4AAA7/AACQ/wAA9/8AAP//AAD4/wAA9f0CAv/nFxf/5xgY//0CAv//AAD//wAA//8A - AOv/AACB/wAAMf8AAH7/AADj/wAA//8AAK3+AAAP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAe3t7AIWFhQB3d3cBg4ODMoODg5OAgIDuf39//39/f/9/f3//gICA/4KCgrCDg4MSg4ODAIOD - gwOGhoYKhYWFfoKCgr2CgoJWgICABP4AAAX/AABe/wAAv/8AAJj/AACQ/wAA4/8AAP//AAD//wAA//8A - AP//AAD0/wAAt/8AAGb/AAB4/wAA0/8AAP//AAD//wAAwP4AACX+AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38Ag4ODOIODg8KBgYHgf39//39/f/9/f3//gYGB04KC - giGGhoYAd3d3AICAgACAgIAAgYGBOIGBgfSBgYHjgoKCKP4AAAD+AAAS/gAAPv8AAHv/AADc/wAA//8A - AP//AAD//wAA6/8AALv/AACM/wAAlv8AANb/AAD//wAA//8AAPf/AACk/wAAIv8AAAD9AAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAenp6AYKCglmBgYHof39//39/ - f/9/f3//gICA3IKCgi+Li4sAf39/AH9/fwB/f38Ag4ODLYGBgemAgID5gYGBSgAAAAD/AACE/wAA7f8A - AP//AAD7/wAA5/8AAMj/AACq/wAAoP8AALv/AADp/wAA//8AAP//AAD2/wAAwf8AAFv+AAAL/wAAAPwA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAHON - jQKDgYFGhX5+v3+BgfN/f3//f39//4KCgsyEhIQzf39/AHl5eQGGhoYAg4ODJYGBgeKAgID/goKCZgAA - AAD+AAB+/wAAs/8AAKL/AACZ/wAApP8AAMD/AADk/wAA/v8AAP//AADx/wAAz/8AAJT/AABL/gAAEf8A - AAD+AAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAD/AAAA/gAAAP8AAAH/AABM9QsLuL5FRZV/hISWf4ODx4ODg719i4sqPcDABYWFhW+EhIQpg4ODKYGB - geWAgID/goKCY/8AAAD+AAAI/wAAUv8AAKH/AAC9/wAAxf8AALz/AACk/wAAhf8AAF7/AAA0/gAAF/4A - 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 - AAD/QAAAf/8AAP/8AB///wAA//wAH///AAA= - - - \ No newline at end of file diff --git a/PolarisBiosEditor.userprefs b/PolarisBiosEditor.userprefs deleted file mode 100644 index 4acbf64..0000000 --- a/PolarisBiosEditor.userprefs +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs deleted file mode 100644 index 2be103c..0000000 --- a/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("PolarisBiosEditor")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("miningbios.com")] -[assembly: AssemblyProduct("PolarisBiosEditor")] -[assembly: AssemblyCopyright("Copyright © VASKE 2018")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7d2ba443-2896-4cce-89b6-5b39c49f2289")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.6.9.0")] -[assembly: AssemblyFileVersion("1.6.9.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs deleted file mode 100644 index 6ab416a..0000000 --- a/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace PolarisBiosEditor.Properties { - using System; - - - ///

- /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PolarisBiosEditor.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/Properties/Resources.resx b/Properties/Resources.resx deleted file mode 100644 index ffecec8..0000000 --- a/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs deleted file mode 100644 index d6adae3..0000000 --- a/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace PolarisBiosEditor.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/Properties/Settings.settings b/Properties/Settings.settings deleted file mode 100644 index abf36c5..0000000 --- a/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index b01cc1c77f5ab9cfadc48c6ca40b8b2b658ec621..dfa5a3ddaa25cb1f5c1fbf90b170c197fcdd9e41 100644 GIT binary patch literal 61440 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 - - - - - diff --git a/bin/Debug/PolarisBiosEditor.pdb b/bin/Debug/PolarisBiosEditor.pdb index fbcf4d5b43de30a2445b52ee4b9e61bf2ce65121..36286263892fc710935f17d2a3e4ece592f53bb6 100644 GIT binary patch delta 10605 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 Kt0Cf7um1x)vmzS+ diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index f1b14d069bf97b3839c9a5dea2d97261c1fa6844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 J<#vJz`Txg>MB4xW diff --git a/notice b/notice index a330db0..81b65e2 100644 --- a/notice +++ b/notice @@ -2,7 +2,3 @@ IMPORTANT: You need to disable SecureBoot / Activate CSM in your Motherboard UEFI because the modification will make the cryptographic signature invalid. - -If you find an error or missing a feature, feel free -to create an issue at: -https://github.com/vvaske/PolarisBiosEditor/issues diff --git a/prov b/prov deleted file mode 100644 index 91f7cd3..0000000 --- a/prov +++ /dev/null @@ -1 +0,0 @@ - 3.8.1 PRO Performance diff --git a/version b/version deleted file mode 100644 index 661e7ae..0000000 --- a/version +++ /dev/null @@ -1 +0,0 @@ -1.7.3 From c4701fe6696edf4a01c7b22df218504a5b5498f8 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 12 Jan 2021 19:36:19 +0300 Subject: [PATCH 10/39] Update linux build --- .gitignore | 1 + PolarisBiosEditor.cs | 5 ++++- README.md | 21 ++++++++++++--------- bin/Debug/PolarisBiosEditor.exe | Bin 61440 -> 60928 bytes bin/Debug/PolarisBiosEditor.pdb | Bin 67072 -> 0 bytes build.sh | 4 +++- run.sh | 8 ++++++++ 7 files changed, 28 insertions(+), 11 deletions(-) mode change 100644 => 100755 bin/Debug/PolarisBiosEditor.exe delete mode 100644 bin/Debug/PolarisBiosEditor.pdb mode change 100644 => 100755 build.sh mode change 100644 => 100755 run.sh diff --git a/.gitignore b/.gitignore index 4b92bd2..bf93424 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /.vs /obj *.rom +*.mdb diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 9a0cccb..e233dc5 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1036,7 +1036,10 @@ public PolarisBiosEditor() } catch (System.Net.WebException) { this.Text += " (offline mode)"; } +#else + Console.WriteLine("This is a debug build, skipping update check."); #endif + Console.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console"); rc.Add("MT51J256M3", "MICRON"); rc.Add("EDW4032BAB", "ELPIDA"); @@ -2283,4 +2286,4 @@ private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs System.Diagnostics.Process.Start("https://www.miningbios.com/product/polaris-bios-editor-3-4-1-srbpolaris-style/"); } } -} \ No newline at end of file +} diff --git a/README.md b/README.md index 23e74f9..80107d0 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,23 @@ -# PolarisBiosEditor - fork with additional data views +# PolarisBiosEditor 1.7xml: fork with dumping additional data as XML in console. -# Below is readme for upstream version. +Just open vbios file and look in console/stdout for extended xml output. +Editing functionality is identical to the upstream, no new features. -### PolarisBiosEditor tweaked by vaske version 3.8 with pro timings can buy on miningbios.com -## https://www.miningbios.com +Please build the executable yourself if you don't trust -BTC donation address: 181dtEjhFWWxvHDmx2R3N41rnRPedSEUf5 +Prebuilt version works on linux with mono, just type `./run.sh`, also see that file fore dependncies -works on linux with mono, executable is build against .net 3.5 -one click timing feature should be used with care, it maybe not stable for you +# Below is readme kept for upstream version. + +#### PolarisBiosEditor tweaked by vaske version 3.8 with pro timings can buy on miningbios.com +#### https://www.miningbios.com -please build the executable yourself or decompile the existing one if you don't trust +BTC donation address: 181dtEjhFWWxvHDmx2R3N41rnRPedSEUf5 + +one click timing feature should be used with care, it maybe not stable for you -If you want to use PolarisBiosEditor on Ubuntu need to install module: sudo apt install libcanberra-gtk-module libcanberra-gtk3-module ### v1.7.3 diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe old mode 100644 new mode 100755 index dfa5a3ddaa25cb1f5c1fbf90b170c197fcdd9e41..03d2c97120ca0c32370aa90600d948b8bca4f86d GIT binary patch literal 60928 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 literal 61440 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 diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 index 8334254..dd1bf16 --- a/build.sh +++ b/build.sh @@ -1,2 +1,4 @@ #!/bin/bash -mcs -unsafe -lib:/usr/lib/mono/4.0 -r:System.Drawing.dll -r:System.Windows.Forms.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs +mkdir -p bin/Debug +#mono-mcs is required for building +mcs -debug -define:DEBUG -unsafe -lib:/usr/lib/mono/4.0 -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:System.Xml.Linq.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs -out:bin/Debug/PolarisBiosEditor.exe diff --git a/run.sh b/run.sh old mode 100644 new mode 100755 index 3aa1212..844a2ef --- a/run.sh +++ b/run.sh @@ -1,2 +1,10 @@ #!/bin/bash +SELF=`realpath "$0"` +SELF_DIR=`dirname "$SELF"` +cd "$SELF_DIR/bin/Debug" + +# Required mono libs (at least): +# libmono-system-windows-forms4.0-cil +# libmono-system-xml-linq4.0-cil + mono PolarisBiosEditor.exe From f4cea49945c139f737ea57c567d4b39a794927b4 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 12 Jan 2021 21:01:01 +0300 Subject: [PATCH 11/39] Update README.md xml output sample --- README.md | 1106 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1106 insertions(+) diff --git a/README.md b/README.md index 80107d0..2692133 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,1112 @@ Editing functionality is identical to the upstream, no new features. Please build the executable yourself if you don't trust Prebuilt version works on linux with mono, just type `./run.sh`, also see that file fore dependncies +

+ Example XML output (large, ~1k lines) +
+<ATOM_ROM_HEADER of="0x224-0x250  len=0x2C=44">
+  <sHeader>
+    <usStructureSize>36 = 0x24 = 0b100100</usStructureSize>
+    <ucTableFormatRevision>1</ucTableFormatRevision>
+    <ucTableContentRevision>1</ucTableContentRevision>
+  </sHeader>
+  <uaFirmWareSignature>
+    <char>65 = 0x41 = 0b1000001</char>
+    <char>84 = 0x54 = 0b1010100</char>
+    <char>79 = 0x4F = 0b1001111</char>
+    <char>77 = 0x4D = 0b1001101</char>
+  </uaFirmWareSignature>
+  <usBiosRuntimeSegmentAddress>49152 = 0xC000 = 0b1100000000000000</usBiosRuntimeSegmentAddress>
+  <usProtectedModeInfoOffset>969 = 0x3C9 = 0b1111001001</usProtectedModeInfoOffset>
+  <usConfigFilenameOffset>456 = 0x1C8 = 0b111001000</usConfigFilenameOffset>
+  <usCRC_BlockOffset>621 = 0x26D = 0b1001101101</usCRC_BlockOffset>
+  <usBIOS_BootupMessageOffset>284 = 0x11C = 0b100011100</usBIOS_BootupMessageOffset>
+  <usInt10Offset>1006 = 0x3EE = 0b1111101110</usInt10Offset>
+  <usPciBusDevInitCode>0</usPciBusDevInitCode>
+  <usIoBaseAddress>0</usIoBaseAddress>
+  <usSubsystemVendorID>4098 = 0x1002 = 0b1000000000010</usSubsystemVendorID>
+  <usSubsystemID>2871 = 0xB37 = 0b101100110111</usSubsystemID>
+  <usPCI_InfoOffset>584 = 0x248 = 0b1001001000</usPCI_InfoOffset>
+  <usMasterCommandTableOffset>38742 = 0x9756 = 0b1001011101010110</usMasterCommandTableOffset>
+  <usMasterDataTableOffset>38908 = 0x97FC = 0b1001011111111100</usMasterDataTableOffset>
+  <ucExtendedFunctionCode>160 = 0xA0 = 0b10100000</ucExtendedFunctionCode>
+  <ucReserved>0</ucReserved>
+  <ulPSPDirTableOffset>1380533072 = 0x52494350 = 0b1010010010010010100001101010000</ulPSPDirTableOffset>
+  <usDeviceID>4098 = 0x1002 = 0b1000000000010</usDeviceID>
+  <usVendorID>26591 = 0x67DF = 0b110011111011111</usVendorID>
+</ATOM_ROM_HEADER>
+<ATOM_DATA_TABLES of="0x97FC-0x9846  len=0x4A=74">
+  <sHeader>
+    <usStructureSize>74 = 0x4A = 0b1001010</usStructureSize>
+    <ucTableFormatRevision>1</ucTableFormatRevision>
+    <ucTableContentRevision>1</ucTableContentRevision>
+  </sHeader>
+  <UtilityPipeLine>0</UtilityPipeLine>
+  <MultimediaCapabilityInfo>0</MultimediaCapabilityInfo>
+  <MultimediaConfigInfo>0</MultimediaConfigInfo>
+  <StandardVESA_Timing>38982 = 0x9846 = 0b1001100001000110</StandardVESA_Timing>
+  <FirmwareInfo>39210 = 0x992A = 0b1001100100101010</FirmwareInfo>
+  <PaletteData>39318 = 0x9996 = 0b1001100110010110</PaletteData>
+  <LCD_Info>39370 = 0x99CA = 0b1001100111001010</LCD_Info>
+  <DIGTransmitterInfo>0</DIGTransmitterInfo>
+  <SMU_Info>43600 = 0xAA50 = 0b1010101001010000</SMU_Info>
+  <SupportedDevicesInfo>0</SupportedDevicesInfo>
+  <GPIO_I2C_Info>39448 = 0x9A18 = 0b1001101000011000</GPIO_I2C_Info>
+  <VRAM_UsageByFirmware>39668 = 0x9AF4 = 0b1001101011110100</VRAM_UsageByFirmware>
+  <GPIO_Pin_LUT>39680 = 0x9B00 = 0b1001101100000000</GPIO_Pin_LUT>
+  <VESA_ToInternalModeLUT>39712 = 0x9B20 = 0b1001101100100000</VESA_ToInternalModeLUT>
+  <GFX_Info>39880 = 0x9BC8 = 0b1001101111001000</GFX_Info>
+  <PowerPlayInfo>39904 = 0x9BE0 = 0b1001101111100000</PowerPlayInfo>
+  <GPUVirtualizationInfo>0</GPUVirtualizationInfo>
+  <SaveRestoreInfo>43576 = 0xAA38 = 0b1010101000111000</SaveRestoreInfo>
+  <PPLL_SS_Info>0</PPLL_SS_Info>
+  <OemInfo>0</OemInfo>
+  <XTMDS_Info>0</XTMDS_Info>
+  <MclkSS_Info>0</MclkSS_Info>
+  <Object_Header>40744 = 0x9F28 = 0b1001111100101000</Object_Header>
+  <IndirectIOAccess>41818 = 0xA35A = 0b1010001101011010</IndirectIOAccess>
+  <MC_InitParameter>41094 = 0xA086 = 0b1010000010000110</MC_InitParameter>
+  <ASIC_VDDC_Info>0</ASIC_VDDC_Info>
+  <ASIC_InternalSS_Info>43436 = 0xA9AC = 0b1010100110101100</ASIC_InternalSS_Info>
+  <TV_VideoMode>43476 = 0xA9D4 = 0b1010100111010100</TV_VideoMode>
+  <VRAM_Info>41944 = 0xA3D8 = 0b1010001111011000</VRAM_Info>
+  <MemoryTrainingInfo>0</MemoryTrainingInfo>
+  <IntegratedSystemInfo>0</IntegratedSystemInfo>
+  <ASIC_ProfilingInfo>43066 = 0xA83A = 0b1010100000111010</ASIC_ProfilingInfo>
+  <VoltageObjectInfo>43334 = 0xA946 = 0b1010100101000110</VoltageObjectInfo>
+  <PowerSourceInfo>0</PowerSourceInfo>
+  <ServiceInfo>43656 = 0xAA88 = 0b1010101010001000</ServiceInfo>
+</ATOM_DATA_TABLES>
+<ATOM_POWERPLAY_TABLE of="0x9BE0-0x9C2D  len=0x4D=77">
+  <sHeader>
+    <usStructureSize>833 = 0x341 = 0b1101000001</usStructureSize>
+    <ucTableFormatRevision>7 = 0x7 = 0b111</ucTableFormatRevision>
+    <ucTableContentRevision>1</ucTableContentRevision>
+  </sHeader>
+  <ucTableRevision>0</ucTableRevision>
+  <usTableSize>77 = 0x4D = 0b1001101</usTableSize>
+  <ulGoldenPPID>1546 = 0x60A = 0b11000001010</ulGoldenPPID>
+  <ulGoldenRevision>9275 = 0x243B = 0b10010000111011</ulGoldenRevision>
+  <usFormatID>25 = 0x19 = 0b11001</usFormatID>
+  <usVoltageTime>0</usVoltageTime>
+  <ulPlatformCaps>16941056 = 0x1028000 = 0b1000000101000000000000000</ulPlatformCaps>
+  <ulMaxODEngineClock>200000 = 0x30D40 = 0b110000110101000000</ulMaxODEngineClock>
+  <ulMaxODMemoryClock>225000 = 0x36EE8 = 0b110110111011101000</ulMaxODMemoryClock>
+  <usPowerControlLimit>50 = 0x32 = 0b110010</usPowerControlLimit>
+  <usUlvVoltageOffset>50 = 0x32 = 0b110010</usUlvVoltageOffset>
+  <usStateArrayOffset>77 = 0x4D = 0b1001101</usStateArrayOffset>
+  <usFanTableOffset>673 = 0x2A1 = 0b1010100001</usFanTableOffset>
+  <usThermalControllerOffset>664 = 0x298 = 0b1010011000</usThermalControllerOffset>
+  <usReserv>0</usReserv>
+  <usMclkDependencyTableOffset>437 = 0x1B5 = 0b110110101</usMclkDependencyTableOffset>
+  <usSclkDependencyTableOffset>315 = 0x13B = 0b100111011</usSclkDependencyTableOffset>
+  <usVddcLookupTableOffset>119 = 0x77 = 0b1110111</usVddcLookupTableOffset>
+  <usVddgfxLookupTableOffset>249 = 0xF9 = 0b11111001</usVddgfxLookupTableOffset>
+  <usMMDependencyTableOffset>478 = 0x1DE = 0b111011110</usMMDependencyTableOffset>
+  <usVCEStateTableOffset>774 = 0x306 = 0b1100000110</usVCEStateTableOffset>
+  <usPPMTableOffset>0</usPPMTableOffset>
+  <usPowerTuneTableOffset>721 = 0x2D1 = 0b1011010001</usPowerTuneTableOffset>
+  <usHardLimitTableOffset>0</usHardLimitTableOffset>
+  <usPCIETableOffset>800 = 0x320 = 0b1100100000</usPCIETableOffset>
+  <usGPIOTableOffset>826 = 0x33A = 0b1100111010</usGPIOTableOffset>
+</ATOM_POWERPLAY_TABLE>
+<ATOM_Polaris_PowerTune_Table of="0x9EB1-0x9EE6  len=0x35=53">
+  <ucRevId>4 = 0x4 = 0b100</ucRevId>
+  <usTDP>145 = 0x91 = 0b10010001</usTDP>
+  <usConfigurableTDP>0</usConfigurableTDP>
+  <usTDC>132 = 0x84 = 0b10000100</usTDC>
+  <usBatteryPowerLimit>145 = 0x91 = 0b10010001</usBatteryPowerLimit>
+  <usSmallPowerLimit>145 = 0x91 = 0b10010001</usSmallPowerLimit>
+  <usLowCACLeakage>0</usLowCACLeakage>
+  <usHighCACLeakage>0</usHighCACLeakage>
+  <usMaximumPowerDeliveryLimit>145 = 0x91 = 0b10010001</usMaximumPowerDeliveryLimit>
+  <usTjMax>90 = 0x5A = 0b1011010</usTjMax>
+  <usPowerTuneDataSetID>0</usPowerTuneDataSetID>
+  <usEDCLimit>0</usEDCLimit>
+  <usSoftwareShutdownTemp>94 = 0x5E = 0b1011110</usSoftwareShutdownTemp>
+  <usClockStretchAmount>2 = 0x2 = 0b10</usClockStretchAmount>
+  <usTemperatureLimitHotspot>105 = 0x69 = 0b1101001</usTemperatureLimitHotspot>
+  <usTemperatureLimitLiquid1>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid1>
+  <usTemperatureLimitLiquid2>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid2>
+  <usTemperatureLimitVrVddc>115 = 0x73 = 0b1110011</usTemperatureLimitVrVddc>
+  <usTemperatureLimitVrMvdd>115 = 0x73 = 0b1110011</usTemperatureLimitVrMvdd>
+  <usTemperatureLimitPlx>95 = 0x5F = 0b1011111</usTemperatureLimitPlx>
+  <ucLiquid1_I2C_address>0</ucLiquid1_I2C_address>
+  <ucLiquid2_I2C_address>0</ucLiquid2_I2C_address>
+  <ucLiquid_I2C_Line>144 = 0x90 = 0b10010000</ucLiquid_I2C_Line>
+  <ucVr_I2C_address>16 = 0x10 = 0b10000</ucVr_I2C_address>
+  <ucVr_I2C_Line>150 = 0x96 = 0b10010110</ucVr_I2C_Line>
+  <ucPlx_I2C_address>0</ucPlx_I2C_address>
+  <ucPlx_I2C_Line>144 = 0x90 = 0b10010000</ucPlx_I2C_Line>
+  <usBoostPowerLimit>0</usBoostPowerLimit>
+  <ucCKS_LDO_REFSEL>6 = 0x6 = 0b110</ucCKS_LDO_REFSEL>
+  <ucHotSpotOnly>0</ucHotSpotOnly>
+  <ucReserve>0</ucReserve>
+  <usReserve>0</usReserve>
+</ATOM_Polaris_PowerTune_Table>
+<ATOM_FAN_TABLE of="0x9E81-0x9EAE  len=0x2D=45">
+  <ucRevId>9 = 0x9 = 0b1001</ucRevId>
+  <ucTHyst>3 = 0x3 = 0b11</ucTHyst>
+  <usTMin>4000 = 0xFA0 = 0b111110100000</usTMin>
+  <usTMed>6500 = 0x1964 = 0b1100101100100</usTMed>
+  <usTHigh>8500 = 0x2134 = 0b10000100110100</usTHigh>
+  <usPWMMin>2000 = 0x7D0 = 0b11111010000</usPWMMin>
+  <usPWMMed>4000 = 0xFA0 = 0b111110100000</usPWMMed>
+  <usPWMHigh>6000 = 0x1770 = 0b1011101110000</usPWMHigh>
+  <usTMax>10900 = 0x2A94 = 0b10101010010100</usTMax>
+  <ucFanControlMode>1</ucFanControlMode>
+  <usFanPWMMax>100 = 0x64 = 0b1100100</usFanPWMMax>
+  <usFanOutputSensitivity>4836 = 0x12E4 = 0b1001011100100</usFanOutputSensitivity>
+  <usFanRPMMax>2200 = 0x898 = 0b100010011000</usFanRPMMax>
+  <ulMinFanSCLKAcousticLimit>91000 = 0x16378 = 0b10110001101111000</ulMinFanSCLKAcousticLimit>
+  <ucTargetTemperature>80 = 0x50 = 0b1010000</ucTargetTemperature>
+  <ucMinimumPWMLimit>20 = 0x14 = 0b10100</ucMinimumPWMLimit>
+  <usFanGainEdge>100 = 0x64 = 0b1100100</usFanGainEdge>
+  <usFanGainHotspot>100 = 0x64 = 0b1100100</usFanGainHotspot>
+  <usFanGainLiquid>100 = 0x64 = 0b1100100</usFanGainLiquid>
+  <usFanGainVrVddc>100 = 0x64 = 0b1100100</usFanGainVrVddc>
+  <usFanGainVrMvdd>100 = 0x64 = 0b1100100</usFanGainVrMvdd>
+  <usFanGainPlx>100 = 0x64 = 0b1100100</usFanGainPlx>
+  <usFanGainHbm>100 = 0x64 = 0b1100100</usFanGainHbm>
+  <usReserved>10752 = 0x2A00 = 0b10101000000000</usReserved>
+</ATOM_FAN_TABLE>
+<ATOM_MCLK_TABLE of="0x9D95-0x9D97  len=0x2=2">
+  <ucRevId>0</ucRevId>
+  <ucNumEntries>3 = 0x3 = 0b11</ucNumEntries>
+</ATOM_MCLK_TABLE>
+<ATOM_MCLK_ENTRY of="0x9D97-0x9DA4  len=0xD=13">
+  <ucVddcInd>0</ucVddcInd>
+  <usVddci>800 = 0x320 = 0b1100100000</usVddci>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
+  <ulMclk>30000 = 0x7530 = 0b111010100110000</ulMclk>
+  <usReserved>0</usReserved>
+</ATOM_MCLK_ENTRY>
+<ATOM_MCLK_ENTRY of="0x9DA4-0x9DB1  len=0xD=13">
+  <ucVddcInd>9 = 0x9 = 0b1001</ucVddcInd>
+  <usVddci>850 = 0x352 = 0b1101010010</usVddci>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
+  <ulMclk>100000 = 0x186A0 = 0b11000011010100000</ulMclk>
+  <usReserved>0</usReserved>
+</ATOM_MCLK_ENTRY>
+<ATOM_MCLK_ENTRY of="0x9DB1-0x9DBE  len=0xD=13">
+  <ucVddcInd>12 = 0xC = 0b1100</ucVddcInd>
+  <usVddci>950 = 0x3B6 = 0b1110110110</usVddci>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
+  <ulMclk>200000 = 0x30D40 = 0b110000110101000000</ulMclk>
+  <usReserved>0</usReserved>
+</ATOM_MCLK_ENTRY>
+<ATOM_SCLK_TABLE of="0x9D1B-0x9D1D  len=0x2=2">
+  <ucRevId>1</ucRevId>
+  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
+</ATOM_SCLK_TABLE>
+<ATOM_SCLK_ENTRY of="0x9D1D-0x9D2C  len=0xF=15">
+  <ucVddInd>0</ucVddInd>
+  <usVddcOffset>0</usVddcOffset>
+  <ulSclk>30000 = 0x7530 = 0b111010100110000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>128 = 0x80 = 0b10000000</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D2C-0x9D3B  len=0xF=15">
+  <ucVddInd>1</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>60000 = 0xEA60 = 0b1110101001100000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D3B-0x9D4A  len=0xF=15">
+  <ucVddInd>2 = 0x2 = 0b10</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>90000 = 0x15F90 = 0b10101111110010000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D4A-0x9D59  len=0xF=15">
+  <ucVddInd>3 = 0x3 = 0b11</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>114500 = 0x1BF44 = 0b11011111101000100</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D59-0x9D68  len=0xF=15">
+  <ucVddInd>4 = 0x4 = 0b100</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>121500 = 0x1DA9C = 0b11101101010011100</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D68-0x9D77  len=0xF=15">
+  <ucVddInd>5 = 0x5 = 0b101</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>125700 = 0x1EB04 = 0b11110101100000100</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D77-0x9D86  len=0xF=15">
+  <ucVddInd>6 = 0x6 = 0b110</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>130000 = 0x1FBD0 = 0b11111101111010000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D86-0x9D95  len=0xF=15">
+  <ucVddInd>7 = 0x7 = 0b111</ucVddInd>
+  <usVddcOffset>0</usVddcOffset>
+  <ulSclk>134000 = 0x20B70 = 0b100000101101110000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_VOLTAGE_TABLE of="0x9C57-0x9C59  len=0x2=2">
+  <ucRevId>0</ucRevId>
+  <ucNumEntries>16 = 0x10 = 0b10000</ucNumEntries>
+</ATOM_VOLTAGE_TABLE>
+<ATOM_VOLTAGE_ENTRY of="0x9C59-0x9C61  len=0x8=8">
+  <usVdd>750 = 0x2EE = 0b1011101110</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C61-0x9C69  len=0x8=8">
+  <usVdd>65282 = 0xFF02 = 0b1111111100000010</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C69-0x9C71  len=0x8=8">
+  <usVdd>65283 = 0xFF03 = 0b1111111100000011</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C71-0x9C79  len=0x8=8">
+  <usVdd>65284 = 0xFF04 = 0b1111111100000100</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C79-0x9C81  len=0x8=8">
+  <usVdd>65285 = 0xFF05 = 0b1111111100000101</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C81-0x9C89  len=0x8=8">
+  <usVdd>65286 = 0xFF06 = 0b1111111100000110</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C89-0x9C91  len=0x8=8">
+  <usVdd>65287 = 0xFF07 = 0b1111111100000111</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C91-0x9C99  len=0x8=8">
+  <usVdd>65288 = 0xFF08 = 0b1111111100001000</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9C99-0x9CA1  len=0x8=8">
+  <usVdd>800 = 0x320 = 0b1100100000</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CA1-0x9CA9  len=0x8=8">
+  <usVdd>850 = 0x352 = 0b1101010010</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CA9-0x9CB1  len=0x8=8">
+  <usVdd>900 = 0x384 = 0b1110000100</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CB1-0x9CB9  len=0x8=8">
+  <usVdd>950 = 0x3B6 = 0b1110110110</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CB9-0x9CC1  len=0x8=8">
+  <usVdd>1000 = 0x3E8 = 0b1111101000</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CC1-0x9CC9  len=0x8=8">
+  <usVdd>1050 = 0x41A = 0b10000011010</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CC9-0x9CD1  len=0x8=8">
+  <usVdd>1100 = 0x44C = 0b10001001100</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CD1-0x9CD9  len=0x8=8">
+  <usVdd>1150 = 0x47E = 0b10001111110</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VRAM_INFO of="0xA3D8-0xA3EC  len=0x14=20">
+  <sHeader>
+    <usStructureSize>1121 = 0x461 = 0b10001100001</usStructureSize>
+    <ucTableFormatRevision>2 = 0x2 = 0b10</ucTableFormatRevision>
+    <ucTableContentRevision>2 = 0x2 = 0b10</ucTableContentRevision>
+  </sHeader>
+  <usMemAdjustTblOffset>75 = 0x4B = 0b1001011</usMemAdjustTblOffset>
+  <usMemClkPatchTblOffset>90 = 0x5A = 0b1011010</usMemClkPatchTblOffset>
+  <usMcAdjustPerTileTblOffset>764 = 0x2FC = 0b1011111100</usMcAdjustPerTileTblOffset>
+  <usMcPhyInitTableOffset>946 = 0x3B2 = 0b1110110010</usMcPhyInitTableOffset>
+  <usDramDataRemapTblOffset>810 = 0x32A = 0b1100101010</usDramDataRemapTblOffset>
+  <usReserved1>0</usReserved1>
+  <ucNumOfVRAMModule>1</ucNumOfVRAMModule>
+  <ucMemoryClkPatchTblVer>1</ucMemoryClkPatchTblVer>
+  <ucVramModuleVer>8 = 0x8 = 0b1000</ucVramModuleVer>
+  <ucMcPhyTileNum>4 = 0x4 = 0b100</ucMcPhyTileNum>
+</ATOM_VRAM_INFO>
+<ATOM_VRAM_ENTRY of="0xA3EC-0xA42C  len=0x40=64">
+  <ulChannelMapCfg>1985220658 = 0x76541032 = 0b1110110010101000001000000110010</ulChannelMapCfg>
+  <usModuleSize>55 = 0x37 = 0b110111</usModuleSize>
+  <usMcRamCfg>24738 = 0x60A2 = 0b110000010100010</usMcRamCfg>
+  <usEnableChannels>255 = 0xFF = 0b11111111</usEnableChannels>
+  <ucExtMemoryID>0</ucExtMemoryID>
+  <ucMemoryType>80 = 0x50 = 0b1010000</ucMemoryType>
+  <ucChannelNum>3 = 0x3 = 0b11</ucChannelNum>
+  <ucChannelWidth>5 = 0x5 = 0b101</ucChannelWidth>
+  <ucDensity>99 = 0x63 = 0b1100011</ucDensity>
+  <ucBankCol>10 = 0xA = 0b1010</ucBankCol>
+  <ucMisc>4 = 0x4 = 0b100</ucMisc>
+  <ucVREFI>0</ucVREFI>
+  <usReserved>0</usReserved>
+  <usMemorySize>8192 = 0x2000 = 0b10000000000000</usMemorySize>
+  <ucMcTunningSetId>0</ucMcTunningSetId>
+  <ucRowNum>11 = 0xB = 0b1011</ucRowNum>
+  <usEMRS2Value>16384 = 0x4000 = 0b100000000000000</usEMRS2Value>
+  <usEMRS3Value>24832 = 0x6100 = 0b110000100000000</usEMRS3Value>
+  <ucMemoryVenderID>33 = 0x21 = 0b100001</ucMemoryVenderID>
+  <ucRefreshRateFactor>2 = 0x2 = 0b10</ucRefreshRateFactor>
+  <ucFIFODepth>2 = 0x2 = 0b10</ucFIFODepth>
+  <ucCDR_Bandwidth>0</ucCDR_Bandwidth>
+  <ulChannelMapCfg1>0</ulChannelMapCfg1>
+  <ulBankMapCfg>484675 = 0x76543 = 0b1110110010101000011</ulBankMapCfg>
+  <ulReserved>0</ulReserved>
+  <FullName>K4G80325FB</FullName>
+</ATOM_VRAM_ENTRY>
+End of mem
+
+<ATOM_VRAM_TIMING_ENTRY of="0xA460-0xA494  len=0x34=52">
+  <ulClkRange>25000 = 0x61A8 = 0b110000110101000</ulClkRange>
+  <LatencyString>333000000000000022CC1C00628C110B10570A080EC3B00100204100220114209A8800A000000000040308091B0D0F0E</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA494-0xA4C8  len=0x34=52">
+  <ulClkRange>40000 = 0x9C40 = 0b1001110001000000</ulClkRange>
+  <LatencyString>333000000000000022CC1C006394121120570A091144B102002042002A021420AA8800A00000000006040C0E2B10120F</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA4C8-0xA4FC  len=0x34=52">
+  <ulClkRange>60000 = 0xEA60 = 0b1110101001100000</ulClkRange>
+  <LatencyString>333000000000000022CC1C00A520241A40570B0B97051204002264003A051420CA8800A0000000000906121541151810</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA4FC-0xA530  len=0x34=52">
+  <ulClkRange>90000 = 0x15F90 = 0b10101111110010000</ulClkRange>
+  <LatencyString>333000000000000022CC1C00E7B4362780570B0F9F072306002485005A091420DA8800A0000000000E081A20621D2012</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA530-0xA564  len=0x34=52">
+  <ulClkRange>100000 = 0x186A0 = 0b11000011010100000</ulClkRange>
+  <LatencyString>333000000000000022CC1C000839372B90570B102148D30600448600620A14206A8900A0000000000F091D236D1F2213</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA564-0xA598  len=0x34=52">
+  <ulClkRange>112500 = 0x1B774 = 0b11011011101110100</ulClkRange>
+  <LatencyString>333000000000000022CC1C0029414831A0570C1125C9B3070046A6006A0C14206A8900A000000000110A21287B222614</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA598-0xA5CC  len=0x34=52">
+  <ulClkRange>125000 = 0x1E848 = 0b11110100001001000</ulClkRange>
+  <LatencyString>333000000000000022CC1C004A494937B0570C12294A94080046A700720E14207A8900A000000000130B252D89252A14</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA5CC-0xA600  len=0x34=52">
+  <ulClkRange>137500 = 0x2191C = 0b100001100100011100</ulClkRange>
+  <LatencyString>333000000000000022CC1C008C515A3DC0570D132DCB74090048C7007A0014207A8900A002000000150D293197282E15</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA600-0xA634  len=0x34=52">
+  <ulClkRange>150000 = 0x249F0 = 0b100100100111110000</ulClkRange>
+  <LatencyString>555000000000000022CC1C00AD595B41C0570E14B00B450A0068C70003011420FA8900A003000000170E2B34A42A3116</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA634-0xA668  len=0x34=52">
+  <ulClkRange>162500 = 0x27AC4 = 0b100111101011000100</ulClkRange>
+  <LatencyString>555000000000000022CC1C00CE616C47D0570F15B48C250B006AE7000B031420FA8900A003000000190F2F39B22D3517</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA668-0xA69C  len=0x34=52">
+  <ulClkRange>175000 = 0x2AB98 = 0b101010101110011000</ulClkRange>
+  <LatencyString>777000000000000022CC1C00106A6D4DD0571016B90D060C006AE70014051420FA8900A0030000001B11333DC0303A17</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA69C-0xA6D0  len=0x34=52">
+  <ulClkRange>200000 = 0x30D40 = 0b110000110101000000</ulClkRange>
+  <LatencyString>777000000000000022CC1C0031F67E57F05711183FCFB60D006C070124081420FA8900A0030000001E123A46DB354019</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA6D0-0xA704  len=0x34=52">
+  <ulClkRange>0</ulClkRange>
+  <LatencyString>060008000E0044FFFF00FFFFFF001F000000FFFFFF011F000000FFFFFF021F000000FFFFFF031F00000000000000E1B4</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_OBJECT_HEADER_V3 of="0x9F28-0x9F3A  len=0x12=18">
+  <sHeader>
+    <usStructureSize>350 = 0x15E = 0b101011110</usStructureSize>
+    <ucTableFormatRevision>1</ucTableFormatRevision>
+    <ucTableContentRevision>3 = 0x3 = 0b11</ucTableContentRevision>
+  </sHeader>
+  <usDeviceSupport>3720 = 0xE88 = 0b111010001000</usDeviceSupport>
+  <usConnectorObjectTableOffset>72 = 0x48 = 0b1001000</usConnectorObjectTableOffset>
+  <usRouterObjectTableOffset>0</usRouterObjectTableOffset>
+  <usEncoderObjectTableOffset>251 = 0xFB = 0b11111011</usEncoderObjectTableOffset>
+  <usProtectionObjectTableOffset>0</usProtectionObjectTableOffset>
+  <usDisplayPathTableOffset>18 = 0x12 = 0b10010</usDisplayPathTableOffset>
+  <usMiscObjectTableOffset>0</usMiscObjectTableOffset>
+</ATOM_OBJECT_HEADER_V3>
+<ATOM_DISPLAY_OBJECT_PATH_TABLE of="0x9F3A-0x9F3E  len=0x4=4">
+  <ucNumOfDispPath>5 = 0x5 = 0b101</ucNumOfDispPath>
+  <ucVersion>1</ucVersion>
+  <ucPadding2>0</ucPadding2>
+</ATOM_DISPLAY_OBJECT_PATH_TABLE>
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F3E-0x9F48  len=0xA=10">
+  <usDeviceTag>8 = 0x8 = 0b1000</usDeviceTag>
+  <usSize>10 = 0xA = 0b1010</usSize>
+  <usConnObjectId>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>1</Index>
+  </usConnObjectId>
+  <usGPUObjectId>
+    <KindInNamespace>0</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
+    <Index>1</Index>
+  </usGPUObjectId>
+  <usGraphicObjIdsFirst>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usGraphicObjIdsFirst>
+</ATOM_DISPLAY_OBJECT_PATH>
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F48-0x9F52  len=0xA=10">
+  <usDeviceTag>128 = 0x80 = 0b10000000</usDeviceTag>
+  <usSize>10 = 0xA = 0b1010</usSize>
+  <usConnObjectId>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usConnObjectId>
+  <usGPUObjectId>
+    <KindInNamespace>0</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
+    <Index>1</Index>
+  </usGPUObjectId>
+  <usGraphicObjIdsFirst>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usGraphicObjIdsFirst>
+</ATOM_DISPLAY_OBJECT_PATH>
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F52-0x9F5C  len=0xA=10">
+  <usDeviceTag>512 = 0x200 = 0b1000000000</usDeviceTag>
+  <usSize>10 = 0xA = 0b1010</usSize>
+  <usConnObjectId>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>3 = 0x3 = 0b11</Index>
+  </usConnObjectId>
+  <usGPUObjectId>
+    <KindInNamespace>0</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
+    <Index>1</Index>
+  </usGPUObjectId>
+  <usGraphicObjIdsFirst>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usGraphicObjIdsFirst>
+</ATOM_DISPLAY_OBJECT_PATH>
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F5C-0x9F66  len=0xA=10">
+  <usDeviceTag>1024 = 0x400 = 0b10000000000</usDeviceTag>
+  <usSize>10 = 0xA = 0b1010</usSize>
+  <usConnObjectId>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>1</Index>
+  </usConnObjectId>
+  <usGPUObjectId>
+    <KindInNamespace>0</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
+    <Index>1</Index>
+  </usGPUObjectId>
+  <usGraphicObjIdsFirst>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usGraphicObjIdsFirst>
+</ATOM_DISPLAY_OBJECT_PATH>
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F66-0x9F70  len=0xA=10">
+  <usDeviceTag>2048 = 0x800 = 0b100000000000</usDeviceTag>
+  <usSize>10 = 0xA = 0b1010</usSize>
+  <usConnObjectId>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x4</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>1</Index>
+  </usConnObjectId>
+  <usGPUObjectId>
+    <KindInNamespace>0</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
+    <Index>1</Index>
+  </usGPUObjectId>
+  <usGraphicObjIdsFirst>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usGraphicObjIdsFirst>
+</ATOM_DISPLAY_OBJECT_PATH>
+Encoders:
+<ATOM_OBJECT_TABLE of="0xA023-0xA027  len=0x4=4">
+  <ucNumberOfObjects>5 = 0x5 = 0b101</ucNumberOfObjects>
+  <ucPadding0>0</ucPadding0>
+  <ucPadding1>0</ucPadding1>
+  <ucPadding2>0</ucPadding2>
+</ATOM_OBJECT_TABLE>
+<ATOM_OBJECT of="0xA027-0xA02F  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>295 = 0x127 = 0b100100111</usSrcDstTableOffset>
+  <usRecordOffset>301 = 0x12D = 0b100101101</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA055-0xA057  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa057:0F00
+<ATOM_OBJECT of="0xA02F-0xA037  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>306 = 0x132 = 0b100110010</usSrcDstTableOffset>
+  <usRecordOffset>312 = 0x138 = 0b100111000</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA060-0xA062  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa062:0F00
+<ATOM_OBJECT of="0xA037-0xA03F  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>317 = 0x13D = 0b100111101</usSrcDstTableOffset>
+  <usRecordOffset>323 = 0x143 = 0b101000011</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA06B-0xA06D  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa06d:0F00
+<ATOM_OBJECT of="0xA03F-0xA047  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>328 = 0x148 = 0b101001000</usSrcDstTableOffset>
+  <usRecordOffset>334 = 0x14E = 0b101001110</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA076-0xA078  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa078:0F00
+<ATOM_OBJECT of="0xA047-0xA04F  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>339 = 0x153 = 0b101010011</usSrcDstTableOffset>
+  <usRecordOffset>345 = 0x159 = 0b101011001</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA081-0xA083  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa083:0F00
+Connectors:
+<ATOM_OBJECT_TABLE of="0x9F70-0x9F74  len=0x4=4">
+  <ucNumberOfObjects>5 = 0x5 = 0b101</ucNumberOfObjects>
+  <ucPadding0>0</ucPadding0>
+  <ucPadding1>0</ucPadding1>
+  <ucPadding2>0</ucPadding2>
+</ATOM_OBJECT_TABLE>
+<ATOM_OBJECT of="0x9F74-0x9F7C  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>116 = 0x74 = 0b1110100</usSrcDstTableOffset>
+  <usRecordOffset>122 = 0x7A = 0b1111010</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0x9FA2-0x9FA4  len=0x2=2">
+  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
+  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fa4:01001002000008000000
+<ATOM_COMMON_RECORD_HEADER of="0x9FAE-0x9FB0  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fb0:9000
+<ATOM_COMMON_RECORD_HEADER of="0x9FB2-0x9FB4  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fb4:0600
+<ATOM_OBJECT of="0x9F7C-0x9F84  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>143 = 0x8F = 0b10001111</usSrcDstTableOffset>
+  <usRecordOffset>149 = 0x95 = 0b10010101</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0x9FBD-0x9FBF  len=0x2=2">
+  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
+  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fbf:01002002000080000000
+<ATOM_COMMON_RECORD_HEADER of="0x9FC9-0x9FCB  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fcb:9200
+<ATOM_COMMON_RECORD_HEADER of="0x9FCD-0x9FCF  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fcf:0400
+<ATOM_OBJECT of="0x9F84-0x9F8C  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>3 = 0x3 = 0b11</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>170 = 0xAA = 0b10101010</usSrcDstTableOffset>
+  <usRecordOffset>176 = 0xB0 = 0b10110000</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0x9FD8-0x9FDA  len=0x2=2">
+  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
+  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fda:01003002000000020000
+<ATOM_COMMON_RECORD_HEADER of="0x9FE4-0x9FE6  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fe6:9100
+<ATOM_COMMON_RECORD_HEADER of="0x9FE8-0x9FEA  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9fea:0100
+<ATOM_OBJECT of="0x9F8C-0x9F94  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>197 = 0xC5 = 0b11000101</usSrcDstTableOffset>
+  <usRecordOffset>203 = 0xCB = 0b11001011</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0x9FF3-0x9FF5  len=0x2=2">
+  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
+  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0x9ff5:01004002000000040000
+<ATOM_COMMON_RECORD_HEADER of="0x9FFF-0xA001  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa001:9300
+<ATOM_COMMON_RECORD_HEADER of="0xA003-0xA005  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa005:0500
+<ATOM_OBJECT of="0x9F94-0x9F9C  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x4</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>224 = 0xE0 = 0b11100000</usSrcDstTableOffset>
+  <usRecordOffset>230 = 0xE6 = 0b11100110</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA00E-0xA010  len=0x2=2">
+  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
+  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa010:01005002000000080000
+<ATOM_COMMON_RECORD_HEADER of="0xA01A-0xA01C  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa01c:9500
+<ATOM_COMMON_RECORD_HEADER of="0xA01E-0xA020  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa020:0300
+Routers:
+Table not present:ATOM_OBJECT_TABLE
+<ATOM_VOLTAGE_OBJECT_INFO_V3_1 of="0xA946-0xA94A  len=0x4=4">
+  <sHeader>
+    <usStructureSize>102 = 0x66 = 0b1100110</usStructureSize>
+    <ucTableFormatRevision>3 = 0x3 = 0b11</ucTableFormatRevision>
+    <ucTableContentRevision>1</ucTableContentRevision>
+  </sHeader>
+</ATOM_VOLTAGE_OBJECT_INFO_V3_1>
+<atom_voltage_object_header_v4 of="0xA94A-0xA956  len=0xC=12">
+  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
+  <ucVoltageMode>VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3</ucVoltageMode>
+  <usSize>50 = 0x32 = 0b110010</usSize>
+  <AsI2c>
+    <regulator_id>8 = 0x8 = 0b1000</regulator_id>
+    <i2c_id>
+      <gpio_id>150 = 0x96 = 0b10010110</gpio_id>
+      <bfHW_Capable>true</bfHW_Capable>
+      <bfHW_EngineID>1</bfHW_EngineID>
+      <bfI2C_LineMux>6 = 0x6 = 0b110</bfI2C_LineMux>
+      <Description>150 = 0x96 = 0b10010110</Description>
+    </i2c_id>
+    <i2c_slave_addr>
+      <shifted_i2c_slave_addr>16 = 0x10 = 0b10000</shifted_i2c_slave_addr>
+    </i2c_slave_addr>
+    <i2c_control_offset>0</i2c_control_offset>
+    <i2c_flag>0</i2c_flag>
+    <i2c_speed>0</i2c_speed>
+    <reserved_0xA>0</reserved_0xA>
+    <reserved_0xB>0</reserved_0xB>
+  </AsI2c>
+</atom_voltage_object_header_v4>
+<atom_i2c_data_entry of="0xA956-0xA95A  len=0x4=4">
+  <i2c_reg_index>41 = 0x29 = 0b101001</i2c_reg_index>
+  <i2c_reg_data>36 = 0x24 = 0b100100</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA95A-0xA95E  len=0x4=4">
+  <i2c_reg_index>43 = 0x2B = 0b101011</i2c_reg_index>
+  <i2c_reg_data>44 = 0x2C = 0b101100</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA95E-0xA962  len=0x4=4">
+  <i2c_reg_index>51 = 0x33 = 0b110011</i2c_reg_index>
+  <i2c_reg_data>114 = 0x72 = 0b1110010</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA962-0xA966  len=0x4=4">
+  <i2c_reg_index>36 = 0x24 = 0b100100</i2c_reg_index>
+  <i2c_reg_data>28 = 0x1C = 0b11100</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA966-0xA96A  len=0x4=4">
+  <i2c_reg_index>20 = 0x14 = 0b10100</i2c_reg_index>
+  <i2c_reg_data>34 = 0x22 = 0b100010</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA96A-0xA96E  len=0x4=4">
+  <i2c_reg_index>57 = 0x39 = 0b111001</i2c_reg_index>
+  <i2c_reg_data>190 = 0xBE = 0b10111110</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA96E-0xA972  len=0x4=4">
+  <i2c_reg_index>97 = 0x61 = 0b1100001</i2c_reg_index>
+  <i2c_reg_data>3 = 0x3 = 0b11</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA972-0xA976  len=0x4=4">
+  <i2c_reg_index>98 = 0x62 = 0b1100010</i2c_reg_index>
+  <i2c_reg_data>126 = 0x7E = 0b1111110</i2c_reg_data>
+</atom_i2c_data_entry>
+<atom_i2c_data_entry of="0xA976-0xA97A  len=0x4=4">
+  <i2c_reg_index>141 = 0x8D = 0b10001101</i2c_reg_index>
+  <i2c_reg_data>0</i2c_reg_data>
+</atom_i2c_data_entry>
+<FINAL_atom_i2c_data_entry of="0xA97A-0xA97C  len=0x2=2">
+  <final_entry_index>255 = 0xFF = 0b11111111</final_entry_index>
+</FINAL_atom_i2c_data_entry>
+<atom_voltage_object_header_v4 of="0xA97C-0xA988  len=0xC=12">
+  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
+  <ucVoltageMode>VOLTAGE_OBJ_SVID2_0x7</ucVoltageMode>
+  <usSize>12 = 0xC = 0b1100</usSize>
+</atom_voltage_object_header_v4>
+<atom_voltage_object_header_v4 of="0xA988-0xA994  len=0xC=12">
+  <ucVoltageType>VOLTAGE_TYPE_VDDCI_0x4</ucVoltageType>
+  <ucVoltageMode>VOLTAGE_OBJ_GPIO_LUT_0x0</ucVoltageMode>
+  <usSize>36 = 0x24 = 0b100100</usSize>
+</atom_voltage_object_header_v4>
+<ATOM_GPIO_I2C_INFO of="0x9A18-0x9A1C  len=0x4=4">
+  <sHeader>
+    <usStructureSize>220 = 0xDC = 0b11011100</usStructureSize>
+    <ucTableFormatRevision>1</ucTableFormatRevision>
+    <ucTableContentRevision>1</ucTableContentRevision>
+  </sHeader>
+</ATOM_GPIO_I2C_INFO>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A1C-0x9A37  len=0x1B=27">
+  <usClkMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>144 = 0x90 = 0b10010000</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>0</bfI2C_LineMux>
+    <Description>144 = 0x90 = 0b10010000</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A37-0x9A52  len=0x1B=27">
+  <usClkMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>145 = 0x91 = 0b10010001</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>1</bfI2C_LineMux>
+    <Description>145 = 0x91 = 0b10010001</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A52-0x9A6D  len=0x1B=27">
+  <usClkMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>146 = 0x92 = 0b10010010</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>2 = 0x2 = 0b10</bfI2C_LineMux>
+    <Description>146 = 0x92 = 0b10010010</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A6D-0x9A88  len=0x1B=27">
+  <usClkMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>147 = 0x93 = 0b10010011</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>3 = 0x3 = 0b11</bfI2C_LineMux>
+    <Description>147 = 0x93 = 0b10010011</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A88-0x9AA3  len=0x1B=27">
+  <usClkMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>148 = 0x94 = 0b10010100</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>4 = 0x4 = 0b100</bfI2C_LineMux>
+    <Description>148 = 0x94 = 0b10010100</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9AA3-0x9ABE  len=0x1B=27">
+  <usClkMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>149 = 0x95 = 0b10010101</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>5 = 0x5 = 0b101</bfI2C_LineMux>
+    <Description>149 = 0x95 = 0b10010101</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9ABE-0x9AD9  len=0x1B=27">
+  <usClkMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>150 = 0x96 = 0b10010110</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>6 = 0x6 = 0b110</bfI2C_LineMux>
+    <Description>150 = 0x96 = 0b10010110</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>1</ucDataMaskShift>
+  <ucDataEnShift>1</ucDataEnShift>
+  <ucDataY_Shift>1</ucDataY_Shift>
+  <ucDataA_Shift>1</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9AD9-0x9AF4  len=0x1B=27">
+  <usClkMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>151 = 0x97 = 0b10010111</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>7 = 0x7 = 0b111</bfI2C_LineMux>
+    <Description>151 = 0x97 = 0b10010111</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+
+
# Below is readme kept for upstream version. From 6cfef11c4d52e82f5315efee6e6eb6373713bb3b Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Sun, 18 Apr 2021 22:38:14 +0300 Subject: [PATCH 12/39] Fix running linux-built-version on windows .Net --- PolarisBiosEditor.cs | 2 +- bin/Debug/PolarisBiosEditor.exe | Bin 60928 -> 60928 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index e233dc5..98c7096 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -469,7 +469,7 @@ public string KindInNamespace { get { - var type_name = Namespace.ToString().Split('_').Last(); + var type_name = Namespace.ToString().Split(new []{'_'}).Last(); var type = Type.GetType("PolarisBiosEditor.KIND_" + type_name); if (type != null) { diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index 03d2c97120ca0c32370aa90600d948b8bca4f86d..3ea206bf8d733056e099a9253ebbd63cc2fe8d6b 100755 GIT binary patch delta 5099 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 delta 5178 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 A$p8QV From ddfb81a8f64079552ddbe77b53220001b7e94318 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 19 Apr 2021 01:57:45 +0300 Subject: [PATCH 13/39] fix newlines --- PolarisBiosEditor.Designer.cs | 922 +++++++++++++++++----------------- 1 file changed, 461 insertions(+), 461 deletions(-) diff --git a/PolarisBiosEditor.Designer.cs b/PolarisBiosEditor.Designer.cs index 0571f1c..036efe5 100644 --- a/PolarisBiosEditor.Designer.cs +++ b/PolarisBiosEditor.Designer.cs @@ -28,465 +28,465 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.open = new System.Windows.Forms.Button(); - this.save = new System.Windows.Forms.Button(); - this.txtChecksum = new System.Windows.Forms.TextBox(); - this.txtBIOSBootupMessage = new System.Windows.Forms.TextBox(); - this.boxROM = new System.Windows.Forms.GroupBox(); - this.tableROM = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxPOWERPLAY = new System.Windows.Forms.GroupBox(); - this.tablePOWERPLAY = new System.Windows.Forms.ListView(); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxPOWERTUNE = new System.Windows.Forms.GroupBox(); - this.tablePOWERTUNE = new System.Windows.Forms.ListView(); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxFAN = new System.Windows.Forms.GroupBox(); - this.tableFAN = new System.Windows.Forms.ListView(); - this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader10 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxGPU = new System.Windows.Forms.GroupBox(); - this.tableGPU = new System.Windows.Forms.ListView(); - this.columnHeader11 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader12 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxMEM = new System.Windows.Forms.GroupBox(); - this.tableMEMORY = new System.Windows.Forms.ListView(); - this.columnHeader13 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader14 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxVRAM = new System.Windows.Forms.GroupBox(); - this.tableVRAM_TIMING = new System.Windows.Forms.ListView(); - this.columnHeader15 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader16 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.listVRAM = new System.Windows.Forms.ComboBox(); - this.tableVRAM = new System.Windows.Forms.ListView(); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.editSubItem1 = new System.Windows.Forms.TextBox(); - this.editSubItem2 = new System.Windows.Forms.TextBox(); - this.apply = new System.Windows.Forms.Button(); - this.button1 = new System.Windows.Forms.Button(); - this.linkLabel1 = new System.Windows.Forms.LinkLabel(); - this.boxROM.SuspendLayout(); - this.boxPOWERPLAY.SuspendLayout(); - this.boxPOWERTUNE.SuspendLayout(); - this.boxFAN.SuspendLayout(); - this.boxGPU.SuspendLayout(); - this.boxMEM.SuspendLayout(); - this.boxVRAM.SuspendLayout(); - this.SuspendLayout(); - // - // open - // - this.open.Location = new System.Drawing.Point(12, 12); - this.open.Name = "open"; - this.open.Size = new System.Drawing.Size(75, 23); - this.open.TabIndex = 0; - this.open.Text = "OPEN BIOS"; - this.open.UseVisualStyleBackColor = true; - this.open.Click += new System.EventHandler(this.OpenFileDialog_Click); - // - // save - // - this.save.Location = new System.Drawing.Point(93, 12); - this.save.Name = "save"; - this.save.Size = new System.Drawing.Size(75, 23); - this.save.TabIndex = 1; - this.save.Text = "SAVE AS"; - this.save.UseVisualStyleBackColor = true; - this.save.Click += new System.EventHandler(this.SaveFileDialog_Click); - // - // txtChecksum - // - this.txtChecksum.Font = new System.Drawing.Font("Courier New", 8.25F); - this.txtChecksum.Location = new System.Drawing.Point(174, 14); - this.txtChecksum.Name = "txtChecksum"; - this.txtChecksum.Size = new System.Drawing.Size(100, 20); - this.txtChecksum.TabIndex = 2; - // - // txtBIOSBootupMessage - // - this.txtBIOSBootupMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtBIOSBootupMessage.Font = new System.Drawing.Font("Courier New", 8.25F); - this.txtBIOSBootupMessage.Location = new System.Drawing.Point(277, 15); - this.txtBIOSBootupMessage.Name = "txtBIOSBootupMessage"; - this.txtBIOSBootupMessage.Size = new System.Drawing.Size(531, 20); - this.txtBIOSBootupMessage.TabIndex = 5; - // - // boxROM - // - this.boxROM.Controls.Add(this.tableROM); - this.boxROM.Location = new System.Drawing.Point(9, 41); - this.boxROM.Name = "boxROM"; - this.boxROM.Size = new System.Drawing.Size(265, 140); - this.boxROM.TabIndex = 3; - this.boxROM.TabStop = false; - this.boxROM.Text = "ROM"; - // - // tableROM - // - this.tableROM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2}); - this.tableROM.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableROM.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableROM.HideSelection = false; - this.tableROM.Location = new System.Drawing.Point(3, 16); - this.tableROM.Name = "tableROM"; - this.tableROM.Size = new System.Drawing.Size(259, 121); - this.tableROM.TabIndex = 4; - this.tableROM.UseCompatibleStateImageBehavior = false; - this.tableROM.View = System.Windows.Forms.View.Details; - // - // columnHeader1 - // - this.columnHeader1.Text = "Name"; - this.columnHeader1.Width = 40; - // - // columnHeader2 - // - this.columnHeader2.Text = "Value"; - // - // boxPOWERPLAY - // - this.boxPOWERPLAY.Controls.Add(this.tablePOWERPLAY); - this.boxPOWERPLAY.Location = new System.Drawing.Point(9, 184); - this.boxPOWERPLAY.Name = "boxPOWERPLAY"; - this.boxPOWERPLAY.Size = new System.Drawing.Size(265, 157); - this.boxPOWERPLAY.TabIndex = 0; - this.boxPOWERPLAY.TabStop = false; - this.boxPOWERPLAY.Text = "POWERPLAY"; - // - // tablePOWERPLAY - // - this.tablePOWERPLAY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader3, - this.columnHeader4}); - this.tablePOWERPLAY.Dock = System.Windows.Forms.DockStyle.Fill; - this.tablePOWERPLAY.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tablePOWERPLAY.HideSelection = false; - this.tablePOWERPLAY.Location = new System.Drawing.Point(3, 16); - this.tablePOWERPLAY.Name = "tablePOWERPLAY"; - this.tablePOWERPLAY.Size = new System.Drawing.Size(259, 138); - this.tablePOWERPLAY.TabIndex = 5; - this.tablePOWERPLAY.UseCompatibleStateImageBehavior = false; - this.tablePOWERPLAY.View = System.Windows.Forms.View.Details; - // - // columnHeader3 - // - this.columnHeader3.Text = "Name"; - // - // columnHeader4 - // - this.columnHeader4.Text = "Value"; - // - // boxPOWERTUNE - // - this.boxPOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.boxPOWERTUNE.Controls.Add(this.tablePOWERTUNE); - this.boxPOWERTUNE.Location = new System.Drawing.Point(277, 374); - this.boxPOWERTUNE.Name = "boxPOWERTUNE"; - this.boxPOWERTUNE.Size = new System.Drawing.Size(260, 252); - this.boxPOWERTUNE.TabIndex = 0; - this.boxPOWERTUNE.TabStop = false; - this.boxPOWERTUNE.Text = "POWERTUNE"; - // - // tablePOWERTUNE - // - this.tablePOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.tablePOWERTUNE.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader5, - this.columnHeader6}); - this.tablePOWERTUNE.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tablePOWERTUNE.HideSelection = false; - this.tablePOWERTUNE.Location = new System.Drawing.Point(3, 16); - this.tablePOWERTUNE.Name = "tablePOWERTUNE"; - this.tablePOWERTUNE.Size = new System.Drawing.Size(254, 233); - this.tablePOWERTUNE.TabIndex = 6; - this.tablePOWERTUNE.UseCompatibleStateImageBehavior = false; - this.tablePOWERTUNE.View = System.Windows.Forms.View.Details; - // - // columnHeader5 - // - this.columnHeader5.Text = "Name"; - // - // columnHeader6 - // - this.columnHeader6.Text = "Value"; - // - // boxFAN - // - this.boxFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.boxFAN.Controls.Add(this.tableFAN); - this.boxFAN.Location = new System.Drawing.Point(9, 344); - this.boxFAN.Name = "boxFAN"; - this.boxFAN.Size = new System.Drawing.Size(265, 282); - this.boxFAN.TabIndex = 0; - this.boxFAN.TabStop = false; - this.boxFAN.Text = "FAN"; - // - // tableFAN - // - this.tableFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.tableFAN.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader9, - this.columnHeader10}); - this.tableFAN.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableFAN.HideSelection = false; - this.tableFAN.Location = new System.Drawing.Point(3, 16); - this.tableFAN.Name = "tableFAN"; - this.tableFAN.Size = new System.Drawing.Size(259, 263); - this.tableFAN.TabIndex = 7; - this.tableFAN.UseCompatibleStateImageBehavior = false; - this.tableFAN.View = System.Windows.Forms.View.Details; - // - // columnHeader9 - // - this.columnHeader9.Text = "Name"; - // - // columnHeader10 - // - this.columnHeader10.Text = "Value"; - // - // boxGPU - // - this.boxGPU.Controls.Add(this.tableGPU); - this.boxGPU.Location = new System.Drawing.Point(277, 41); - this.boxGPU.Name = "boxGPU"; - this.boxGPU.Size = new System.Drawing.Size(260, 203); - this.boxGPU.TabIndex = 0; - this.boxGPU.TabStop = false; - this.boxGPU.Text = "GPU"; - // - // tableGPU - // - this.tableGPU.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader11, - this.columnHeader12}); - this.tableGPU.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableGPU.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableGPU.HideSelection = false; - this.tableGPU.Location = new System.Drawing.Point(3, 16); - this.tableGPU.Name = "tableGPU"; - this.tableGPU.Size = new System.Drawing.Size(254, 184); - this.tableGPU.TabIndex = 8; - this.tableGPU.UseCompatibleStateImageBehavior = false; - this.tableGPU.View = System.Windows.Forms.View.Details; - // - // columnHeader11 - // - this.columnHeader11.Text = "MHz"; - // - // columnHeader12 - // - this.columnHeader12.Text = "mV"; - // - // boxMEM - // - this.boxMEM.Controls.Add(this.tableMEMORY); - this.boxMEM.Location = new System.Drawing.Point(277, 247); - this.boxMEM.Name = "boxMEM"; - this.boxMEM.Size = new System.Drawing.Size(260, 124); - this.boxMEM.TabIndex = 0; - this.boxMEM.TabStop = false; - this.boxMEM.Text = "MEMORY"; - // - // tableMEMORY - // - this.tableMEMORY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader13, - this.columnHeader14}); - this.tableMEMORY.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableMEMORY.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableMEMORY.HideSelection = false; - this.tableMEMORY.Location = new System.Drawing.Point(3, 16); - this.tableMEMORY.Name = "tableMEMORY"; - this.tableMEMORY.Size = new System.Drawing.Size(254, 105); - this.tableMEMORY.TabIndex = 9; - this.tableMEMORY.UseCompatibleStateImageBehavior = false; - this.tableMEMORY.View = System.Windows.Forms.View.Details; - // - // columnHeader13 - // - this.columnHeader13.Text = "MHz"; - // - // columnHeader14 - // - this.columnHeader14.Text = "mV"; - // - // boxVRAM - // - this.boxVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.boxVRAM.Controls.Add(this.tableVRAM_TIMING); - this.boxVRAM.Controls.Add(this.listVRAM); - this.boxVRAM.Controls.Add(this.tableVRAM); - this.boxVRAM.Location = new System.Drawing.Point(540, 41); - this.boxVRAM.Name = "boxVRAM"; - this.boxVRAM.Size = new System.Drawing.Size(268, 585); - this.boxVRAM.TabIndex = 0; - this.boxVRAM.TabStop = false; - this.boxVRAM.Text = "VRAM"; - // - // tableVRAM_TIMING - // - this.tableVRAM_TIMING.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tableVRAM_TIMING.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader15, - this.columnHeader16}); - this.tableVRAM_TIMING.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableVRAM_TIMING.HideSelection = false; - this.tableVRAM_TIMING.Location = new System.Drawing.Point(3, 209); - this.tableVRAM_TIMING.Name = "tableVRAM_TIMING"; - this.tableVRAM_TIMING.Size = new System.Drawing.Size(262, 373); - this.tableVRAM_TIMING.TabIndex = 11; - this.tableVRAM_TIMING.UseCompatibleStateImageBehavior = false; - this.tableVRAM_TIMING.View = System.Windows.Forms.View.Details; - // - // columnHeader15 - // - this.columnHeader15.Text = "MHz"; - // - // columnHeader16 - // - this.columnHeader16.Text = "Timing Strap"; - this.columnHeader16.Width = 110; - // - // listVRAM - // - this.listVRAM.Dock = System.Windows.Forms.DockStyle.Top; - this.listVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); - this.listVRAM.FormattingEnabled = true; - this.listVRAM.Location = new System.Drawing.Point(3, 16); - this.listVRAM.Name = "listVRAM"; - this.listVRAM.Size = new System.Drawing.Size(262, 22); - this.listVRAM.TabIndex = 12; - this.listVRAM.SelectedIndexChanged += new System.EventHandler(this.listVRAM_SelectedIndexChanged); - this.listVRAM.SelectedValueChanged += new System.EventHandler(this.listVRAM_SelectionChanged); - // - // tableVRAM - // - this.tableVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tableVRAM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader7, - this.columnHeader8}); - this.tableVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableVRAM.HideSelection = false; - this.tableVRAM.Location = new System.Drawing.Point(3, 43); - this.tableVRAM.Name = "tableVRAM"; - this.tableVRAM.Size = new System.Drawing.Size(262, 160); - this.tableVRAM.TabIndex = 10; - this.tableVRAM.UseCompatibleStateImageBehavior = false; - this.tableVRAM.View = System.Windows.Forms.View.Details; - // - // columnHeader7 - // - this.columnHeader7.Text = "Name"; - // - // columnHeader8 - // - this.columnHeader8.Text = "Value"; - // - // editSubItem1 - // - this.editSubItem1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.editSubItem1.Font = new System.Drawing.Font("Courier New", 8.25F); - this.editSubItem1.Location = new System.Drawing.Point(100, 644); - this.editSubItem1.Name = "editSubItem1"; - this.editSubItem1.Size = new System.Drawing.Size(220, 20); - this.editSubItem1.TabIndex = 2; - // - // editSubItem2 - // - this.editSubItem2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.editSubItem2.Font = new System.Drawing.Font("Courier New", 8.25F); - this.editSubItem2.Location = new System.Drawing.Point(9, 688); - this.editSubItem2.Name = "editSubItem2"; - this.editSubItem2.Size = new System.Drawing.Size(799, 20); - this.editSubItem2.TabIndex = 2; - this.editSubItem2.Click += new System.EventHandler(this.editSubItem2_Click); - // - // apply - // - this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.apply.Location = new System.Drawing.Point(10, 642); - this.apply.Name = "apply"; - this.apply.Size = new System.Drawing.Size(84, 23); - this.apply.TabIndex = 0; - this.apply.Text = "APPLY CHG"; - this.apply.UseVisualStyleBackColor = true; - this.apply.Click += new System.EventHandler(this.apply_Click); - // - // button1 - // - this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button1.Location = new System.Drawing.Point(558, 642); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(241, 23); - this.button1.TabIndex = 4; - this.button1.Text = "ONE CLICK TIMING PATCH"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // linkLabel1 - // - this.linkLabel1.AutoSize = true; - this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.linkLabel1.LinkColor = System.Drawing.Color.Red; - this.linkLabel1.Location = new System.Drawing.Point(12, 669); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(516, 16); - this.linkLabel1.TabIndex = 6; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "(Link kept from upstream vesrsion) BUY PolariBiosEditor Pro performance"; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); - // - // PolarisBiosEditor - // - this.ClientSize = new System.Drawing.Size(820, 733); - this.Controls.Add(this.linkLabel1); - this.Controls.Add(this.button1); - this.Controls.Add(this.boxFAN); - this.Controls.Add(this.boxVRAM); - this.Controls.Add(this.boxMEM); - this.Controls.Add(this.boxGPU); - this.Controls.Add(this.boxPOWERTUNE); - this.Controls.Add(this.boxPOWERPLAY); - this.Controls.Add(this.boxROM); - this.Controls.Add(this.txtChecksum); - this.Controls.Add(this.txtBIOSBootupMessage); - this.Controls.Add(this.save); - this.Controls.Add(this.open); - this.Controls.Add(this.editSubItem1); - this.Controls.Add(this.editSubItem2); - this.Controls.Add(this.apply); - this.Name = "PolarisBiosEditor"; - this.Text = "PBE"; - this.Load += new System.EventHandler(this.PolarisBiosEditor_Load); - this.boxROM.ResumeLayout(false); - this.boxPOWERPLAY.ResumeLayout(false); - this.boxPOWERTUNE.ResumeLayout(false); - this.boxFAN.ResumeLayout(false); - this.boxGPU.ResumeLayout(false); - this.boxMEM.ResumeLayout(false); - this.boxVRAM.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - + this.open = new System.Windows.Forms.Button(); + this.save = new System.Windows.Forms.Button(); + this.txtChecksum = new System.Windows.Forms.TextBox(); + this.txtBIOSBootupMessage = new System.Windows.Forms.TextBox(); + this.boxROM = new System.Windows.Forms.GroupBox(); + this.tableROM = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxPOWERPLAY = new System.Windows.Forms.GroupBox(); + this.tablePOWERPLAY = new System.Windows.Forms.ListView(); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxPOWERTUNE = new System.Windows.Forms.GroupBox(); + this.tablePOWERTUNE = new System.Windows.Forms.ListView(); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxFAN = new System.Windows.Forms.GroupBox(); + this.tableFAN = new System.Windows.Forms.ListView(); + this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader10 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxGPU = new System.Windows.Forms.GroupBox(); + this.tableGPU = new System.Windows.Forms.ListView(); + this.columnHeader11 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader12 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxMEM = new System.Windows.Forms.GroupBox(); + this.tableMEMORY = new System.Windows.Forms.ListView(); + this.columnHeader13 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader14 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxVRAM = new System.Windows.Forms.GroupBox(); + this.tableVRAM_TIMING = new System.Windows.Forms.ListView(); + this.columnHeader15 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader16 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.listVRAM = new System.Windows.Forms.ComboBox(); + this.tableVRAM = new System.Windows.Forms.ListView(); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.editSubItem1 = new System.Windows.Forms.TextBox(); + this.editSubItem2 = new System.Windows.Forms.TextBox(); + this.apply = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.boxROM.SuspendLayout(); + this.boxPOWERPLAY.SuspendLayout(); + this.boxPOWERTUNE.SuspendLayout(); + this.boxFAN.SuspendLayout(); + this.boxGPU.SuspendLayout(); + this.boxMEM.SuspendLayout(); + this.boxVRAM.SuspendLayout(); + this.SuspendLayout(); + // + // open + // + this.open.Location = new System.Drawing.Point(12, 12); + this.open.Name = "open"; + this.open.Size = new System.Drawing.Size(75, 23); + this.open.TabIndex = 0; + this.open.Text = "OPEN BIOS"; + this.open.UseVisualStyleBackColor = true; + this.open.Click += new System.EventHandler(this.OpenFileDialog_Click); + // + // save + // + this.save.Location = new System.Drawing.Point(93, 12); + this.save.Name = "save"; + this.save.Size = new System.Drawing.Size(75, 23); + this.save.TabIndex = 1; + this.save.Text = "SAVE AS"; + this.save.UseVisualStyleBackColor = true; + this.save.Click += new System.EventHandler(this.SaveFileDialog_Click); + // + // txtChecksum + // + this.txtChecksum.Font = new System.Drawing.Font("Courier New", 8.25F); + this.txtChecksum.Location = new System.Drawing.Point(174, 14); + this.txtChecksum.Name = "txtChecksum"; + this.txtChecksum.Size = new System.Drawing.Size(100, 20); + this.txtChecksum.TabIndex = 2; + // + // txtBIOSBootupMessage + // + this.txtBIOSBootupMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtBIOSBootupMessage.Font = new System.Drawing.Font("Courier New", 8.25F); + this.txtBIOSBootupMessage.Location = new System.Drawing.Point(277, 15); + this.txtBIOSBootupMessage.Name = "txtBIOSBootupMessage"; + this.txtBIOSBootupMessage.Size = new System.Drawing.Size(531, 20); + this.txtBIOSBootupMessage.TabIndex = 5; + // + // boxROM + // + this.boxROM.Controls.Add(this.tableROM); + this.boxROM.Location = new System.Drawing.Point(9, 41); + this.boxROM.Name = "boxROM"; + this.boxROM.Size = new System.Drawing.Size(265, 140); + this.boxROM.TabIndex = 3; + this.boxROM.TabStop = false; + this.boxROM.Text = "ROM"; + // + // tableROM + // + this.tableROM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.tableROM.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableROM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableROM.HideSelection = false; + this.tableROM.Location = new System.Drawing.Point(3, 16); + this.tableROM.Name = "tableROM"; + this.tableROM.Size = new System.Drawing.Size(259, 121); + this.tableROM.TabIndex = 4; + this.tableROM.UseCompatibleStateImageBehavior = false; + this.tableROM.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "Name"; + this.columnHeader1.Width = 40; + // + // columnHeader2 + // + this.columnHeader2.Text = "Value"; + // + // boxPOWERPLAY + // + this.boxPOWERPLAY.Controls.Add(this.tablePOWERPLAY); + this.boxPOWERPLAY.Location = new System.Drawing.Point(9, 184); + this.boxPOWERPLAY.Name = "boxPOWERPLAY"; + this.boxPOWERPLAY.Size = new System.Drawing.Size(265, 157); + this.boxPOWERPLAY.TabIndex = 0; + this.boxPOWERPLAY.TabStop = false; + this.boxPOWERPLAY.Text = "POWERPLAY"; + // + // tablePOWERPLAY + // + this.tablePOWERPLAY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader3, + this.columnHeader4}); + this.tablePOWERPLAY.Dock = System.Windows.Forms.DockStyle.Fill; + this.tablePOWERPLAY.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tablePOWERPLAY.HideSelection = false; + this.tablePOWERPLAY.Location = new System.Drawing.Point(3, 16); + this.tablePOWERPLAY.Name = "tablePOWERPLAY"; + this.tablePOWERPLAY.Size = new System.Drawing.Size(259, 138); + this.tablePOWERPLAY.TabIndex = 5; + this.tablePOWERPLAY.UseCompatibleStateImageBehavior = false; + this.tablePOWERPLAY.View = System.Windows.Forms.View.Details; + // + // columnHeader3 + // + this.columnHeader3.Text = "Name"; + // + // columnHeader4 + // + this.columnHeader4.Text = "Value"; + // + // boxPOWERTUNE + // + this.boxPOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.boxPOWERTUNE.Controls.Add(this.tablePOWERTUNE); + this.boxPOWERTUNE.Location = new System.Drawing.Point(277, 374); + this.boxPOWERTUNE.Name = "boxPOWERTUNE"; + this.boxPOWERTUNE.Size = new System.Drawing.Size(260, 252); + this.boxPOWERTUNE.TabIndex = 0; + this.boxPOWERTUNE.TabStop = false; + this.boxPOWERTUNE.Text = "POWERTUNE"; + // + // tablePOWERTUNE + // + this.tablePOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.tablePOWERTUNE.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader5, + this.columnHeader6}); + this.tablePOWERTUNE.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tablePOWERTUNE.HideSelection = false; + this.tablePOWERTUNE.Location = new System.Drawing.Point(3, 16); + this.tablePOWERTUNE.Name = "tablePOWERTUNE"; + this.tablePOWERTUNE.Size = new System.Drawing.Size(254, 233); + this.tablePOWERTUNE.TabIndex = 6; + this.tablePOWERTUNE.UseCompatibleStateImageBehavior = false; + this.tablePOWERTUNE.View = System.Windows.Forms.View.Details; + // + // columnHeader5 + // + this.columnHeader5.Text = "Name"; + // + // columnHeader6 + // + this.columnHeader6.Text = "Value"; + // + // boxFAN + // + this.boxFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.boxFAN.Controls.Add(this.tableFAN); + this.boxFAN.Location = new System.Drawing.Point(9, 344); + this.boxFAN.Name = "boxFAN"; + this.boxFAN.Size = new System.Drawing.Size(265, 282); + this.boxFAN.TabIndex = 0; + this.boxFAN.TabStop = false; + this.boxFAN.Text = "FAN"; + // + // tableFAN + // + this.tableFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.tableFAN.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader9, + this.columnHeader10}); + this.tableFAN.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableFAN.HideSelection = false; + this.tableFAN.Location = new System.Drawing.Point(3, 16); + this.tableFAN.Name = "tableFAN"; + this.tableFAN.Size = new System.Drawing.Size(259, 263); + this.tableFAN.TabIndex = 7; + this.tableFAN.UseCompatibleStateImageBehavior = false; + this.tableFAN.View = System.Windows.Forms.View.Details; + // + // columnHeader9 + // + this.columnHeader9.Text = "Name"; + // + // columnHeader10 + // + this.columnHeader10.Text = "Value"; + // + // boxGPU + // + this.boxGPU.Controls.Add(this.tableGPU); + this.boxGPU.Location = new System.Drawing.Point(277, 41); + this.boxGPU.Name = "boxGPU"; + this.boxGPU.Size = new System.Drawing.Size(260, 203); + this.boxGPU.TabIndex = 0; + this.boxGPU.TabStop = false; + this.boxGPU.Text = "GPU"; + // + // tableGPU + // + this.tableGPU.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader11, + this.columnHeader12}); + this.tableGPU.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableGPU.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableGPU.HideSelection = false; + this.tableGPU.Location = new System.Drawing.Point(3, 16); + this.tableGPU.Name = "tableGPU"; + this.tableGPU.Size = new System.Drawing.Size(254, 184); + this.tableGPU.TabIndex = 8; + this.tableGPU.UseCompatibleStateImageBehavior = false; + this.tableGPU.View = System.Windows.Forms.View.Details; + // + // columnHeader11 + // + this.columnHeader11.Text = "MHz"; + // + // columnHeader12 + // + this.columnHeader12.Text = "mV"; + // + // boxMEM + // + this.boxMEM.Controls.Add(this.tableMEMORY); + this.boxMEM.Location = new System.Drawing.Point(277, 247); + this.boxMEM.Name = "boxMEM"; + this.boxMEM.Size = new System.Drawing.Size(260, 124); + this.boxMEM.TabIndex = 0; + this.boxMEM.TabStop = false; + this.boxMEM.Text = "MEMORY"; + // + // tableMEMORY + // + this.tableMEMORY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader13, + this.columnHeader14}); + this.tableMEMORY.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableMEMORY.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableMEMORY.HideSelection = false; + this.tableMEMORY.Location = new System.Drawing.Point(3, 16); + this.tableMEMORY.Name = "tableMEMORY"; + this.tableMEMORY.Size = new System.Drawing.Size(254, 105); + this.tableMEMORY.TabIndex = 9; + this.tableMEMORY.UseCompatibleStateImageBehavior = false; + this.tableMEMORY.View = System.Windows.Forms.View.Details; + // + // columnHeader13 + // + this.columnHeader13.Text = "MHz"; + // + // columnHeader14 + // + this.columnHeader14.Text = "mV"; + // + // boxVRAM + // + this.boxVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.boxVRAM.Controls.Add(this.tableVRAM_TIMING); + this.boxVRAM.Controls.Add(this.listVRAM); + this.boxVRAM.Controls.Add(this.tableVRAM); + this.boxVRAM.Location = new System.Drawing.Point(540, 41); + this.boxVRAM.Name = "boxVRAM"; + this.boxVRAM.Size = new System.Drawing.Size(268, 585); + this.boxVRAM.TabIndex = 0; + this.boxVRAM.TabStop = false; + this.boxVRAM.Text = "VRAM"; + // + // tableVRAM_TIMING + // + this.tableVRAM_TIMING.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableVRAM_TIMING.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader15, + this.columnHeader16}); + this.tableVRAM_TIMING.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableVRAM_TIMING.HideSelection = false; + this.tableVRAM_TIMING.Location = new System.Drawing.Point(3, 209); + this.tableVRAM_TIMING.Name = "tableVRAM_TIMING"; + this.tableVRAM_TIMING.Size = new System.Drawing.Size(262, 373); + this.tableVRAM_TIMING.TabIndex = 11; + this.tableVRAM_TIMING.UseCompatibleStateImageBehavior = false; + this.tableVRAM_TIMING.View = System.Windows.Forms.View.Details; + // + // columnHeader15 + // + this.columnHeader15.Text = "MHz"; + // + // columnHeader16 + // + this.columnHeader16.Text = "Timing Strap"; + this.columnHeader16.Width = 110; + // + // listVRAM + // + this.listVRAM.Dock = System.Windows.Forms.DockStyle.Top; + this.listVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.listVRAM.FormattingEnabled = true; + this.listVRAM.Location = new System.Drawing.Point(3, 16); + this.listVRAM.Name = "listVRAM"; + this.listVRAM.Size = new System.Drawing.Size(262, 22); + this.listVRAM.TabIndex = 12; + this.listVRAM.SelectedIndexChanged += new System.EventHandler(this.listVRAM_SelectedIndexChanged); + this.listVRAM.SelectedValueChanged += new System.EventHandler(this.listVRAM_SelectionChanged); + // + // tableVRAM + // + this.tableVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableVRAM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader7, + this.columnHeader8}); + this.tableVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableVRAM.HideSelection = false; + this.tableVRAM.Location = new System.Drawing.Point(3, 43); + this.tableVRAM.Name = "tableVRAM"; + this.tableVRAM.Size = new System.Drawing.Size(262, 160); + this.tableVRAM.TabIndex = 10; + this.tableVRAM.UseCompatibleStateImageBehavior = false; + this.tableVRAM.View = System.Windows.Forms.View.Details; + // + // columnHeader7 + // + this.columnHeader7.Text = "Name"; + // + // columnHeader8 + // + this.columnHeader8.Text = "Value"; + // + // editSubItem1 + // + this.editSubItem1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.editSubItem1.Font = new System.Drawing.Font("Courier New", 8.25F); + this.editSubItem1.Location = new System.Drawing.Point(100, 644); + this.editSubItem1.Name = "editSubItem1"; + this.editSubItem1.Size = new System.Drawing.Size(220, 20); + this.editSubItem1.TabIndex = 2; + // + // editSubItem2 + // + this.editSubItem2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.editSubItem2.Font = new System.Drawing.Font("Courier New", 8.25F); + this.editSubItem2.Location = new System.Drawing.Point(9, 688); + this.editSubItem2.Name = "editSubItem2"; + this.editSubItem2.Size = new System.Drawing.Size(799, 20); + this.editSubItem2.TabIndex = 2; + this.editSubItem2.Click += new System.EventHandler(this.editSubItem2_Click); + // + // apply + // + this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.apply.Location = new System.Drawing.Point(10, 642); + this.apply.Name = "apply"; + this.apply.Size = new System.Drawing.Size(84, 23); + this.apply.TabIndex = 0; + this.apply.Text = "APPLY CHG"; + this.apply.UseVisualStyleBackColor = true; + this.apply.Click += new System.EventHandler(this.apply_Click); + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.Location = new System.Drawing.Point(558, 642); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(241, 23); + this.button1.TabIndex = 4; + this.button1.Text = "ONE CLICK TIMING PATCH"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // linkLabel1 + // + this.linkLabel1.AutoSize = true; + this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.linkLabel1.LinkColor = System.Drawing.Color.Red; + this.linkLabel1.Location = new System.Drawing.Point(12, 669); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(516, 16); + this.linkLabel1.TabIndex = 6; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "(Link kept from upstream vesrsion) BUY PolariBiosEditor Pro performance"; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // + // PolarisBiosEditor + // + this.ClientSize = new System.Drawing.Size(820, 733); + this.Controls.Add(this.linkLabel1); + this.Controls.Add(this.button1); + this.Controls.Add(this.boxFAN); + this.Controls.Add(this.boxVRAM); + this.Controls.Add(this.boxMEM); + this.Controls.Add(this.boxGPU); + this.Controls.Add(this.boxPOWERTUNE); + this.Controls.Add(this.boxPOWERPLAY); + this.Controls.Add(this.boxROM); + this.Controls.Add(this.txtChecksum); + this.Controls.Add(this.txtBIOSBootupMessage); + this.Controls.Add(this.save); + this.Controls.Add(this.open); + this.Controls.Add(this.editSubItem1); + this.Controls.Add(this.editSubItem2); + this.Controls.Add(this.apply); + this.Name = "PolarisBiosEditor"; + this.Text = "PBE"; + this.Load += new System.EventHandler(this.PolarisBiosEditor_Load); + this.boxROM.ResumeLayout(false); + this.boxPOWERPLAY.ResumeLayout(false); + this.boxPOWERTUNE.ResumeLayout(false); + this.boxFAN.ResumeLayout(false); + this.boxGPU.ResumeLayout(false); + this.boxMEM.ResumeLayout(false); + this.boxVRAM.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + } #endregion @@ -530,7 +530,7 @@ private void InitializeComponent() private System.Windows.Forms.TextBox editSubItem1; private System.Windows.Forms.TextBox editSubItem2; private System.Windows.Forms.Button apply; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.LinkLabel linkLabel1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.LinkLabel linkLabel1; } } From 91b6ea5ae1b97fe8d5a6075652fbc1c35db2bf3f Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 19 Apr 2021 02:00:34 +0300 Subject: [PATCH 14/39] more vddci-related --- PolarisBiosEditor.Designer.cs | 4 +- PolarisBiosEditor.cs | 88 +++++++++++++++++++++++++++----- bin/Debug/PolarisBiosEditor.exe | Bin 60928 -> 61952 bytes 3 files changed, 78 insertions(+), 14 deletions(-) diff --git a/PolarisBiosEditor.Designer.cs b/PolarisBiosEditor.Designer.cs index 036efe5..46b2193 100644 --- a/PolarisBiosEditor.Designer.cs +++ b/PolarisBiosEditor.Designer.cs @@ -297,7 +297,7 @@ private void InitializeComponent() this.boxMEM.Size = new System.Drawing.Size(260, 124); this.boxMEM.TabIndex = 0; this.boxMEM.TabStop = false; - this.boxMEM.Text = "MEMORY"; + this.boxMEM.Text = "MEMORY(Vddci)"; // // tableMEMORY // @@ -320,7 +320,7 @@ private void InitializeComponent() // // columnHeader14 // - this.columnHeader14.Text = "mV"; + this.columnHeader14.Text = "mV(Edits will be ignored, use hexedit to edit in two places)"; // // boxVRAM // diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 98c7096..ad571d0 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -368,6 +368,26 @@ public struct ATOM_VOLTAGE_TABLE // public unsafe fixed byte ATOM_VOLTAGE_ENTRY entries[ucNumEntries]; [8] }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_MM_DEPENDENCY_RECORD + { + public Byte ucVddcInd; /* VDDC voltage */ + public UInt16 usVddgfxOffset; /* Offset relative to VDDC voltage */ + public UInt32 ulDClk; /* UVD D-clock */ + public UInt32 ulVClk; /* UVD V-clock */ + public UInt32 ulEClk; /* VCE clock */ + public UInt32 ulAClk; /* ACP clock */ + public UInt32 ulSAMUClk; /* SAMU clock */ + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_MM_DEPENDENCY_TABLE + { + public Byte ucRevId; + public Byte ucNumEntries; + // public unsafe fixed byte ATOM_VOLTAGE_ENTRY entries[ucNumEntries]; [8] + }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_FAN_TABLE { @@ -697,16 +717,30 @@ public struct atom_i2c_data_entry public UInt16 i2c_reg_data; // i2c register data, can be up to 16bit }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_voltage_gpio_map_lut + { + public UInt32 voltage_gpio_reg_val; // The Voltage ID which is used to program GPIO register + public UInt16 voltage_level_mv; // The corresponding Voltage Value, in mV + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_gpio_voltage_object_v4_fields + { + public Byte gpio_control_id; // default is 0 which indicate control through CG VID mode + public Byte gpio_entry_num; // indiate the entry numbers of Votlage/Gpio value Look up table + public Byte phase_delay_us; // phase delay in unit of micro second + public Byte reserved; + public UInt32 gpio_mask_val; // GPIO Mask value + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct atom_voltage_object_header_v4 { public atom_voltage_type ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI public atom_voltage_object_mode ucVoltageMode; //Indicate voltage control mode: Init/Set/Leakage/Set phase public UInt16 usSize; //Size of Object - - public atom_i2c_voltage_object_v4_fields AsI2c; - [XmlIgnore] - public bool AsI2cSpecified => ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3; + //actual fields depens on ucVoltageMode } [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -1202,6 +1236,20 @@ private void OpenFileDialog_Click(object sender, EventArgs e) atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); } + var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; + var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint(); + for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) + { + Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } + + var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; + var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); + for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) + { + Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + } + atom_vram_info_offset = atom_data_table.VRAM_Info; atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; @@ -1242,13 +1290,16 @@ private void OpenFileDialog_Click(object sender, EventArgs e) ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), - (volt_object, reader) => + (volt_object_header, reader) => { - used_volt_obffset += volt_object.usSize; - if (volt_object.AsI2cSpecified) + used_volt_obffset += volt_object_header.usSize; + if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) { - var detailed_reader = ConsecutiveReader.From(reader); - detailed_reader.Jump(Marshal.SizeOf(volt_object)); + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); while(detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) { detailed_reader.ReadPrint(); @@ -1256,7 +1307,20 @@ private void OpenFileDialog_Click(object sender, EventArgs e) } ConsecutiveReader.From(detailed_reader).ReadPrint(); } - reader.Jump(volt_object.usSize); + else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) + { + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + var gpio_voltage_fields = specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) + { + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); + } + } + reader.Jump(volt_object_header.usSize); } ); @@ -1438,7 +1502,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) { tableMEMORY.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_mclk_entries [i].ulMclk / 100), - Convert.ToString (atom_mclk_entries [i].usMvdd) + Convert.ToString (atom_mclk_entries [i].usVddci) } )); } @@ -1831,7 +1895,7 @@ private void SaveFileDialog_Click(object sender, EventArgs e) var mv = (int)int32.ConvertFromString(value); atom_mclk_entries[i].ulMclk = (UInt32)mhz; - atom_mclk_entries[i].usMvdd = (UInt16)mv; + //atom_mclk_entries[i].usVddci = (UInt16)mv;//usVddci assignment requires edits in several places } updateVRAM_entries(); diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index 3ea206bf8d733056e099a9253ebbd63cc2fe8d6b..c87723b78a66796111f59b522ece70336fa190cd 100755 GIT binary patch delta 20921 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 Hlv@8EI{!1m From 719b7a45fb72fa7cd333665a49b69b7c87c5309b Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Sat, 15 May 2021 22:21:09 +0300 Subject: [PATCH 15/39] Improve memory naming --- PolarisBiosEditor.cs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index ad571d0..daebca7 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -98,7 +98,7 @@ public partial class PolarisBiosEditor : Form /* DATA */ - string version = "1.7xml"; + string version = "1.7xml-2021.05"; string programTitle = "PolarisBiosEditor"; @@ -1075,18 +1075,18 @@ public PolarisBiosEditor() #endif Console.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console"); - rc.Add("MT51J256M3", "MICRON"); - rc.Add("EDW4032BAB", "ELPIDA"); - rc.Add("H5GC4H24AJ", "HYNIX_1"); - rc.Add("H5GQ4H24AJ", "HYNIX_2"); - rc.Add("H5GQ8H24MJ", "HYNIX_2"); - rc.Add("H5GC8H24MJ", "HYNIX_3"); - rc.Add("H5GC8H24AJ", "HYNIX_4"); - rc.Add("K4G80325FB", "SAMSUNG"); - rc.Add("K4G41325FE", "SAMSUNG"); - rc.Add("K4G41325FC", "SAMSUNG"); - rc.Add("K4G41325FS", "SAMSUNG"); - rc.Add("K4G80325FC", "SAMSUNG4"); + rc.Add("MT51J256M3", "MICRON-8G"); + rc.Add("EDW4032BAB", "ELPIDA-4G"); + rc.Add("H5GC4H24AJ", "HYNIX_1-4G"); + rc.Add("H5GQ4H24AJ", "HYNIX_2-4G"); + rc.Add("H5GQ8H24MJ", "HYNIX_2-8G"); + rc.Add("H5GC8H24MJ", "HYNIX_3-8G"); + rc.Add("H5GC8H24AJ", "HYNIX_4-8G"); + rc.Add("K4G80325FB", "SAMSUNG-B-8G"); + rc.Add("K4G41325FE", "SAMSUNG-E-4G"); + rc.Add("K4G41325FC", "SAMSUNG-C-4G"); + rc.Add("K4G41325FS", "SAMSUNG-S-4G"); + rc.Add("K4G80325FC", "SAMSUNG4-C-8G"); save.Enabled = false; boxROM.Enabled = false; From d9b674d89facebb6d2d92165582f12cdc3a9f2fc Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 12 Jul 2021 21:10:58 +0300 Subject: [PATCH 16/39] Reorder tables output to make it correspond to physical order in vbios file --- PolarisBiosEditor.cs | 88 +++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index daebca7..e130d0b 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -887,11 +887,15 @@ public T Read() return obj; } - public T ReadPrint() + public T ReadPrint(string name="") { T result = Read(); int size = Marshal.SizeOf(typeof(T)); - editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len=0x{2:X}={2}", buffer.Offset, buffer.Offset + size, size)); + if (!string.IsNullOrWhiteSpace(name)) + { + name = " Name=" + name; + } + editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len=0x{2:X}={2}{3}", buffer.Offset, buffer.Offset + size, size, name)); return result; } public void Jump1Structure() @@ -1202,45 +1206,44 @@ private void OpenFileDialog_Click(object sender, EventArgs e) txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); + + ReadPrintTable(atom_data_table.GPIO_I2C_Info, + (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), + i2c_assigment => Marshal.SizeOf(i2c_assigment) + ); + atom_powerplay_offset = atom_data_table.PowerPlayInfo; atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); - atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; - atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); - Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); - - atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; - atom_fan_table = Reader(atom_fan_offset).ReadPrint(); + atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; + atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); + atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; + for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + { + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; - atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint(); - atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; - for (var i = 0; i < atom_mclk_entries.Length; i++) + var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; + var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); + for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) { - atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); } atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; - atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint(); + atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; for (var i = 0; i < atom_sclk_entries.Length; i++) { atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); } - atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; - atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint(); - atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; - for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) - { - atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } - - var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; - var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint(); - for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) + atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; + atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); + atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; + for (var i = 0; i < atom_mclk_entries.Length; i++) { - Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); } var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; @@ -1250,6 +1253,23 @@ private void OpenFileDialog_Click(object sender, EventArgs e) Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); } + atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; + atom_fan_table = Reader(atom_fan_offset).ReadPrint(); + + atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; + atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); + Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); + + var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); + + ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + Print("Connectors:"); + ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Encoders:"); + ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Routers:"); + ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + atom_vram_info_offset = atom_data_table.VRAM_Info; atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; @@ -1259,7 +1279,6 @@ private void OpenFileDialog_Click(object sender, EventArgs e) atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); } - Print("End of mem\n"); atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; @@ -1276,16 +1295,6 @@ private void OpenFileDialog_Click(object sender, EventArgs e) } } - var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - - ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); - Print("Encoders:"); - ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Connectors:"); - ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Routers:"); - ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - var used_volt_obffset = 0; ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, @@ -1324,11 +1333,6 @@ private void OpenFileDialog_Click(object sender, EventArgs e) } ); - ReadPrintTable(atom_data_table.GPIO_I2C_Info, - (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), - i2c_assigment => Marshal.SizeOf(i2c_assigment) - ); - tableROM.Items.Add(new ListViewItem(new string[] { "BootupMessageOffset", "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") From 656d0c30f1505c5fb03de1974b3c6f2cf16c5cb2 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 12 Jul 2021 21:57:03 +0300 Subject: [PATCH 17/39] refactoring: prepare to factoring out parsing and updating gui from open dialog handler --- PolarisBiosEditor.cs | 719 ++++++++++++++++++++++--------------------- 1 file changed, 361 insertions(+), 358 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index e130d0b..b679fe4 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -165,8 +165,11 @@ public class VRAM_TIMING_RX Int32Converter int32 = new Int32Converter(); UInt32Converter uint32 = new UInt32Converter(); - int atom_rom_checksum_offset = 0x21; - int atom_rom_header_ptr = 0x48; + const int ATOM_ROM_CHECKSUM_OFFSET = 0x21; + const int ATOM_ROM_HEADER_PTR = 0x48; + + #region VBIOS-fields-kept-for-later-saving + int atom_rom_header_offset; ATOM_ROM_HEADER atom_rom_header; ATOM_DATA_TABLES atom_data_table; @@ -196,7 +199,9 @@ public class VRAM_TIMING_RX ATOM_VRAM_INFO atom_vram_info; ATOM_VRAM_ENTRY[] atom_vram_entries; ATOM_VRAM_TIMING_ENTRY[] atom_vram_timing_entries; - int atom_vram_index = 0; + #endregion VBIOS-fields-kept-for-later-saving + + int atom_vram_index = 0; // index selected in supported memory list const int MAX_VRAM_ENTRIES = 48; // e.g. MSI-Armor-RX-580-4GB has 36 entries int atom_vram_timing_offset; @@ -1161,7 +1166,7 @@ private void OpenFileDialog_Click(object sender, EventArgs e) { buffer = br.ReadBytes((int)fileStream.Length); - atom_rom_header_offset = getValueAtPosition(16, atom_rom_header_ptr); + atom_rom_header_offset = getValueAtPosition(16, ATOM_ROM_HEADER_PTR); atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); string vendorId = atom_rom_header.usVendorID.ToString("X"); fixChecksum(false); @@ -1172,390 +1177,388 @@ private void OpenFileDialog_Click(object sender, EventArgs e) MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); } - DialogResult msgSuported = DialogResult.Yes; if (!supportedID.Contains(vendorId)) { - msgSuported = MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } - if (msgSuported == DialogResult.Yes) - { - StringBuilder sb = new StringBuilder(); - Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; - while (ptr != -1) - { - Char c = (Char)buffer[ptr]; - if (c == '\0') - { - ptr = -1; - } - else if (c == '\n' || c == '\r') - { - ptr++; - } - else - { - sb.Append(c); - ptr++; - } - } - - BIOS_BootupMessage = sb.ToString(); - - txtBIOSBootupMessage.Text = BIOS_BootupMessage; - txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; + atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); - atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); + ReadPrintTable(atom_data_table.GPIO_I2C_Info, + (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), + i2c_assigment => Marshal.SizeOf(i2c_assigment) + ); - ReadPrintTable(atom_data_table.GPIO_I2C_Info, - (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), - i2c_assigment => Marshal.SizeOf(i2c_assigment) - ); - - atom_powerplay_offset = atom_data_table.PowerPlayInfo; - atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); - - atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; - atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); - atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; - for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) - { - atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } + atom_powerplay_offset = atom_data_table.PowerPlayInfo; + atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); - var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; - var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); - for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) - { - Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } - - atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; - atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); - atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; - for (var i = 0; i < atom_sclk_entries.Length; i++) - { - atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); - } + atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; + atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); + atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; + for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + { + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; - atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); - atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; - for (var i = 0; i < atom_mclk_entries.Length; i++) - { - atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); - } + var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; + var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); + for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) + { + Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; - var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); - for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) - { - Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); - } + atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; + atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); + atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; + for (var i = 0; i < atom_sclk_entries.Length; i++) + { + atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); + } - atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; - atom_fan_table = Reader(atom_fan_offset).ReadPrint(); + atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; + atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); + atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; + for (var i = 0; i < atom_mclk_entries.Length; i++) + { + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + } - atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; - atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); - Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); + var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; + var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); + for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) + { + Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + } - var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); + atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; + atom_fan_table = Reader(atom_fan_offset).ReadPrint(); - ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); - Print("Connectors:"); - ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Encoders:"); - ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Routers:"); - ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; + atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); + Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); - atom_vram_info_offset = atom_data_table.VRAM_Info; - atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); - atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; - var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); - atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); - } + var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; - atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; - for (var i = 0; i < MAX_VRAM_ENTRIES; i++) - { - atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + Print("Connectors:"); + ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Encoders:"); + ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Routers:"); + ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - // atom_vram_timing_entries have an undetermined length - // attempt to determine the last entry in the array - if (atom_vram_timing_entries[i].ulClkRange == 0) - { - Array.Resize(ref atom_vram_timing_entries, i); - break; - } - } + atom_vram_info_offset = atom_data_table.VRAM_Info; + atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); + atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; + var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); + atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); + } - var used_volt_obffset = 0; + atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; + atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; + for (var i = 0; i < MAX_VRAM_ENTRIES; i++) + { + atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + + // atom_vram_timing_entries have an undetermined length + // attempt to determine the last entry in the array + if (atom_vram_timing_entries[i].ulClkRange == 0) + { + Array.Resize(ref atom_vram_timing_entries, i); + break; + } + } - ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, - (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), - (volt_object_header, reader) => - { - used_volt_obffset += volt_object_header.usSize; - if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) + var used_volt_obffset = 0; + + ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, + (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), + (volt_object_header, reader) => + { + used_volt_obffset += volt_object_header.usSize; + if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) + { + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + while(detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - while(detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) - { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); - } - ConsecutiveReader.From(detailed_reader).ReadPrint(); + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); } - else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) + ConsecutiveReader.From(detailed_reader).ReadPrint(); + } + else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) + { + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + var gpio_voltage_fields = specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - var gpio_voltage_fields = specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) - { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); - } + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); } - reader.Jump(volt_object_header.usSize); - } - ); + } + reader.Jump(volt_object_header.usSize); + } + ); - tableROM.Items.Add(new ListViewItem(new string[] { - "BootupMessageOffset", - "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") - } - )); - tableROM.Items.Add(new ListViewItem(new string[] { - "VendorID", - "0x" + atom_rom_header.usVendorID.ToString ("X") - } - )); - tableROM.Items.Add(new ListViewItem(new string[] { - "DeviceID", - "0x" + atom_rom_header.usDeviceID.ToString ("X") - } - )); - tableROM.Items.Add(new ListViewItem(new string[] { - "Sub ID", - "0x" + atom_rom_header.usSubsystemID.ToString ("X") - } - )); - tableROM.Items.Add(new ListViewItem(new string[] { - "Sub VendorID", - "0x" + atom_rom_header.usSubsystemVendorID.ToString ("X") - } - )); - tableROM.Items.Add(new ListViewItem(new string[] { - "Firmware Signature", - //"0x" + atom_rom_header.uaFirmWareSignature.ToString ("X") - new string(atom_rom_header.uaFirmWareSignature) - } - )); + StringBuilder bios_bootup_builder = new StringBuilder(); - tablePOWERPLAY.Items.Clear(); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { - "Max GPU Freq. (MHz)", - Convert.ToString (atom_powerplay_table.ulMaxODEngineClock / 100) - } - )); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { - "Max Memory Freq. (MHz)", - Convert.ToString (atom_powerplay_table.ulMaxODMemoryClock / 100) - } - )); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { - "Power Control Limit (%)", - Convert.ToString (atom_powerplay_table.usPowerControlLimit) - } - )); + Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; + while (ptr != -1) + { + Char c = (Char)buffer[ptr]; + if (c == '\0') + { + ptr = -1; + } + else if (c == '\n' || c == '\r') + { + ptr++; + } + else + { + bios_bootup_builder.Append(c); + ptr++; + } + } - tablePOWERTUNE.Items.Clear(); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "TDP (W)", - Convert.ToString (atom_powertune_table.usTDP) - } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "TDC (A)", - Convert.ToString (atom_powertune_table.usTDC) - } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Max Power Limit (W)", - Convert.ToString (atom_powertune_table.usMaximumPowerDeliveryLimit) - } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Max Temp. (C)", - Convert.ToString (atom_powertune_table.usTjMax) - } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Shutdown Temp. (C)", - Convert.ToString (atom_powertune_table.usSoftwareShutdownTemp) - } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Hotspot Temp. (C)", - Convert.ToString (atom_powertune_table.usTemperatureLimitHotspot) - } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Clock Stretch Amount", - Convert.ToString (atom_powertune_table.usClockStretchAmount) - } - )); + BIOS_BootupMessage = bios_bootup_builder.ToString(); - tableFAN.Items.Clear(); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Temp. Hysteresis", - Convert.ToString (atom_fan_table.ucTHyst) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Min Temp. (C)", - Convert.ToString (atom_fan_table.usTMin / 100) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Med Temp. (C)", - Convert.ToString (atom_fan_table.usTMed / 100) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "High Temp. (C)", - Convert.ToString (atom_fan_table.usTHigh / 100) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Max Temp. (C)", - Convert.ToString (atom_fan_table.usTMax / 100) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Target Temp. (C)", - Convert.ToString (atom_fan_table.ucTargetTemperature) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Legacy or Fuzzy Fan Mode", - Convert.ToString (atom_fan_table.ucFanControlMode) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Min PWM (%)", - Convert.ToString (atom_fan_table.usPWMMin / 100) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Med PWM (%)", - Convert.ToString (atom_fan_table.usPWMMed / 100) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "High PWM (%)", - Convert.ToString (atom_fan_table.usPWMHigh / 100) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Max PWM (%)", - Convert.ToString (atom_fan_table.usFanPWMMax) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Max RPM", - Convert.ToString (atom_fan_table.usFanRPMMax) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Sensitivity", - Convert.ToString (atom_fan_table.usFanOutputSensitivity) - } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Acoustic Limit (MHz)", - Convert.ToString (atom_fan_table.ulMinFanSCLKAcousticLimit / 100) - } - )); + txtBIOSBootupMessage.Text = BIOS_BootupMessage; + txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; - tableGPU.Items.Clear(); - for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) - { - tableGPU.Items.Add(new ListViewItem(new string[] { - Convert.ToString (atom_sclk_entries [i].ulSclk / 100), - Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) - } - )); - } + tableROM.Items.Add(new ListViewItem(new string[] { + "BootupMessageOffset", + "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") + } + )); + tableROM.Items.Add(new ListViewItem(new string[] { + "VendorID", + "0x" + atom_rom_header.usVendorID.ToString ("X") + } + )); + tableROM.Items.Add(new ListViewItem(new string[] { + "DeviceID", + "0x" + atom_rom_header.usDeviceID.ToString ("X") + } + )); + tableROM.Items.Add(new ListViewItem(new string[] { + "Sub ID", + "0x" + atom_rom_header.usSubsystemID.ToString ("X") + } + )); + tableROM.Items.Add(new ListViewItem(new string[] { + "Sub VendorID", + "0x" + atom_rom_header.usSubsystemVendorID.ToString ("X") + } + )); + tableROM.Items.Add(new ListViewItem(new string[] { + "Firmware Signature", + //"0x" + atom_rom_header.uaFirmWareSignature.ToString ("X") + new string(atom_rom_header.uaFirmWareSignature) + } + )); - tableMEMORY.Items.Clear(); - for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) - { - tableMEMORY.Items.Add(new ListViewItem(new string[] { - Convert.ToString (atom_mclk_entries [i].ulMclk / 100), - Convert.ToString (atom_mclk_entries [i].usVddci) - } - )); - } + tablePOWERPLAY.Items.Clear(); + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + "Max GPU Freq. (MHz)", + Convert.ToString (atom_powerplay_table.ulMaxODEngineClock / 100) + } + )); + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + "Max Memory Freq. (MHz)", + Convert.ToString (atom_powerplay_table.ulMaxODMemoryClock / 100) + } + )); + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + "Power Control Limit (%)", + Convert.ToString (atom_powerplay_table.usPowerControlLimit) + } + )); - listVRAM.Items.Clear(); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - if (atom_vram_entries[i].strMemPNString[0] != 0) - { - var mem_id_full = atom_vram_entries[i].FullName; - var mem_id = mem_id_full.Substring(0, 10); - string mem_vendor; - if (rc.ContainsKey(mem_id)) - { - mem_vendor = rc[mem_id]; - } - else - { - mem_vendor = "UNKNOWN"; - } + tablePOWERTUNE.Items.Clear(); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "TDP (W)", + Convert.ToString (atom_powertune_table.usTDP) + } + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "TDC (A)", + Convert.ToString (atom_powertune_table.usTDC) + } + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Max Power Limit (W)", + Convert.ToString (atom_powertune_table.usMaximumPowerDeliveryLimit) + } + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Max Temp. (C)", + Convert.ToString (atom_powertune_table.usTjMax) + } + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Shutdown Temp. (C)", + Convert.ToString (atom_powertune_table.usSoftwareShutdownTemp) + } + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Hotspot Temp. (C)", + Convert.ToString (atom_powertune_table.usTemperatureLimitHotspot) + } + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Clock Stretch Amount", + Convert.ToString (atom_powertune_table.usClockStretchAmount) + } + )); - listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); - } - } - listVRAM.SelectedIndex = 0; - atom_vram_index = listVRAM.SelectedIndex; + tableFAN.Items.Clear(); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Temp. Hysteresis", + Convert.ToString (atom_fan_table.ucTHyst) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Min Temp. (C)", + Convert.ToString (atom_fan_table.usTMin / 100) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Med Temp. (C)", + Convert.ToString (atom_fan_table.usTMed / 100) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "High Temp. (C)", + Convert.ToString (atom_fan_table.usTHigh / 100) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Max Temp. (C)", + Convert.ToString (atom_fan_table.usTMax / 100) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Target Temp. (C)", + Convert.ToString (atom_fan_table.ucTargetTemperature) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Legacy or Fuzzy Fan Mode", + Convert.ToString (atom_fan_table.ucFanControlMode) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Min PWM (%)", + Convert.ToString (atom_fan_table.usPWMMin / 100) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Med PWM (%)", + Convert.ToString (atom_fan_table.usPWMMed / 100) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "High PWM (%)", + Convert.ToString (atom_fan_table.usPWMHigh / 100) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Max PWM (%)", + Convert.ToString (atom_fan_table.usFanPWMMax) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Max RPM", + Convert.ToString (atom_fan_table.usFanRPMMax) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Sensitivity", + Convert.ToString (atom_fan_table.usFanOutputSensitivity) + } + )); + tableFAN.Items.Add(new ListViewItem(new string[] { + "Acoustic Limit (MHz)", + Convert.ToString (atom_fan_table.ulMinFanSCLKAcousticLimit / 100) + } + )); - tableVRAM_TIMING.Items.Clear(); - for (var i = 0; i < atom_vram_timing_entries.Length; i++) - { - uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; - tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { - tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, - atom_vram_timing_entries [i].LatencyString - } - )); - } + tableGPU.Items.Clear(); + for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) + { + tableGPU.Items.Add(new ListViewItem(new string[] { + Convert.ToString (atom_sclk_entries [i].ulSclk / 100), + Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) + } + )); + } - save.Enabled = true; - boxROM.Enabled = true; - boxPOWERPLAY.Enabled = true; - boxPOWERTUNE.Enabled = true; - boxFAN.Enabled = true; - boxGPU.Enabled = true; - boxMEM.Enabled = true; - boxVRAM.Enabled = true; + tableMEMORY.Items.Clear(); + for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) + { + tableMEMORY.Items.Add(new ListViewItem(new string[] { + Convert.ToString (atom_mclk_entries [i].ulMclk / 100), + Convert.ToString (atom_mclk_entries [i].usVddci) + } + )); } - fileStream.Close(); + + listVRAM.Items.Clear(); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + if (atom_vram_entries[i].strMemPNString[0] != 0) + { + var mem_id_full = atom_vram_entries[i].FullName; + var mem_id = mem_id_full.Substring(0, 10); + string mem_vendor; + if (rc.ContainsKey(mem_id)) + { + mem_vendor = rc[mem_id]; + } + else + { + mem_vendor = "UNKNOWN"; + } + + listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); + } + } + listVRAM.SelectedIndex = 0; + atom_vram_index = listVRAM.SelectedIndex; + + tableVRAM_TIMING.Items.Clear(); + for (var i = 0; i < atom_vram_timing_entries.Length; i++) + { + uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; + tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { + tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, + atom_vram_timing_entries [i].LatencyString + } + )); + } + + save.Enabled = true; + boxROM.Enabled = true; + boxPOWERPLAY.Enabled = true; + boxPOWERTUNE.Enabled = true; + boxFAN.Enabled = true; + boxGPU.Enabled = true; + boxMEM.Enabled = true; + boxVRAM.Enabled = true; } + fileStream.Close(); + } tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); @@ -1969,7 +1972,7 @@ private void SaveFileDialog_Click(object sender, EventArgs e) private void fixChecksum(bool save) { - Byte checksum = buffer[atom_rom_checksum_offset]; + Byte checksum = buffer[ATOM_ROM_CHECKSUM_OFFSET]; int size = buffer[0x02] * 512; Byte offset = 0; @@ -1977,7 +1980,7 @@ private void fixChecksum(bool save) { offset += buffer[i]; } - if (checksum == (buffer[atom_rom_checksum_offset] - offset)) + if (checksum == (buffer[ATOM_ROM_CHECKSUM_OFFSET] - offset)) { txtChecksum.ForeColor = Color.Green; } @@ -1988,10 +1991,10 @@ private void fixChecksum(bool save) } if (save) { - buffer[atom_rom_checksum_offset] -= offset; + buffer[ATOM_ROM_CHECKSUM_OFFSET] -= offset; txtChecksum.ForeColor = Color.Green; } - txtChecksum.Text = "0x" + buffer[atom_rom_checksum_offset].ToString("X"); + txtChecksum.Text = "0x" + buffer[ATOM_ROM_CHECKSUM_OFFSET].ToString("X"); } public static string ByteArrayToString(byte[] ba) From 31cb66fa6de71ba9cb9b7143b64fdaf7f6bafe30 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 12 Jul 2021 21:59:58 +0300 Subject: [PATCH 18/39] Sort usings and fixed whitespace (via editorconfig) --- .editorconfig | 12 + PolarisBiosEditor.cs | 4315 +++++++++++++++++++------------------- PolarisBiosEditor.csproj | 3 + PolarisBiosEditor.sln | 9 +- 4 files changed, 2180 insertions(+), 2159 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..be0ff70 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index b679fe4..9c3a13f 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1,118 +1,118 @@ using System; using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; using System.Drawing; -using System.Text; -using System.Windows.Forms; using System.IO; -using System.Runtime.InteropServices; using System.Linq; -using System.ComponentModel; -using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; using System.Xml.Linq; using System.Xml.Serialization; namespace PolarisBiosEditor -{ - public enum KIND_CONNECTOR - { - CONNECTOR_OBJECT_ID_NONE = 0x00, - CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I = 0x01, - CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I = 0x02, - CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D = 0x03, - CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x04, - CONNECTOR_OBJECT_ID_VGA = 0x05, - CONNECTOR_OBJECT_ID_COMPOSITE = 0x06, - CONNECTOR_OBJECT_ID_SVIDEO = 0x07, - CONNECTOR_OBJECT_ID_YPbPr = 0x08, - CONNECTOR_OBJECT_ID_D_CONNECTOR = 0x09, - CONNECTOR_OBJECT_ID_9PIN_DIN = 0x0A, /* Supports both CV & TV */ - CONNECTOR_OBJECT_ID_SCART = 0x0B, - CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0x0C, - CONNECTOR_OBJECT_ID_HDMI_TYPE_B = 0x0D, - CONNECTOR_OBJECT_ID_LVDS = 0x0E, - CONNECTOR_OBJECT_ID_7PIN_DIN = 0x0F, - CONNECTOR_OBJECT_ID_PCIE_CONNECTOR = 0x10, - CONNECTOR_OBJECT_ID_CROSSFIRE = 0x11, - CONNECTOR_OBJECT_ID_HARDCODE_DVI = 0x12, - CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13, - CONNECTOR_OBJECT_ID_eDP = 0x14, - CONNECTOR_OBJECT_ID_MXM = 0x15, - CONNECTOR_OBJECT_ID_LVDS_eDP = 0x16 - } - - public enum KIND_ENCODER - { - ENCODER_OBJECT_ID_NONE =0x00, - - /* Radeon Class Display Hardware */ - ENCODER_OBJECT_ID_INTERNAL_LVDS =0x01, - ENCODER_OBJECT_ID_INTERNAL_TMDS1 =0x02, - ENCODER_OBJECT_ID_INTERNAL_TMDS2 =0x03, - ENCODER_OBJECT_ID_INTERNAL_DAC1 =0x04, - ENCODER_OBJECT_ID_INTERNAL_DAC2 =0x05, /* TV/CV DAC */ - ENCODER_OBJECT_ID_INTERNAL_SDVOA =0x06, - ENCODER_OBJECT_ID_INTERNAL_SDVOB =0x07, - - /* External Third Party Encoders */ - ENCODER_OBJECT_ID_SI170B =0x08, - ENCODER_OBJECT_ID_CH7303 =0x09, - ENCODER_OBJECT_ID_CH7301 =0x0A, - ENCODER_OBJECT_ID_INTERNAL_DVO1 =0x0B, /* This belongs to Radeon Class Display Hardware */ - ENCODER_OBJECT_ID_EXTERNAL_SDVOA =0x0C, - ENCODER_OBJECT_ID_EXTERNAL_SDVOB =0x0D, - ENCODER_OBJECT_ID_TITFP513 =0x0E, - ENCODER_OBJECT_ID_INTERNAL_LVTM1 =0x0F, /* not used for Radeon */ - ENCODER_OBJECT_ID_VT1623 =0x10, - ENCODER_OBJECT_ID_HDMI_SI1930 =0x11, - ENCODER_OBJECT_ID_HDMI_INTERNAL =0x12, - ENCODER_OBJECT_ID_ALMOND =0x22, - ENCODER_OBJECT_ID_TRAVIS =0x23, - ENCODER_OBJECT_ID_NUTMEG =0x22, - ENCODER_OBJECT_ID_HDMI_ANX9805 =0x26, - - /* Kaleidoscope (KLDSCP) Class Display Hardware (internal) */ - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 =0x13, - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 =0x14, - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 =0x15, - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 =0x16, /* Shared with CV/TV and CRT */ - ENCODER_OBJECT_ID_SI178 =0X17, /* External TMDS (dual link, no HDCP.) */ - ENCODER_OBJECT_ID_MVPU_FPGA =0x18, /* MVPU FPGA chip */ - ENCODER_OBJECT_ID_INTERNAL_DDI =0x19, - ENCODER_OBJECT_ID_VT1625 =0x1A, - ENCODER_OBJECT_ID_HDMI_SI1932 =0x1B, - ENCODER_OBJECT_ID_DP_AN9801 =0x1C, - ENCODER_OBJECT_ID_DP_DP501 =0x1D, - ENCODER_OBJECT_ID_INTERNAL_UNIPHY =0x1E, - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA =0x1F, - ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 =0x20, - ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 =0x21, - ENCODER_OBJECT_ID_INTERNAL_VCE =0x24, - ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 =0x25, - ENCODER_OBJECT_ID_INTERNAL_AMCLK =0x27, - - ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO =0xFF, - } - - public partial class PolarisBiosEditor : Form - { - - /* DATA */ - - string version = "1.7xml-2021.05"; - string programTitle = "PolarisBiosEditor"; - - - string[] manufacturers = new string[] +{ + public enum KIND_CONNECTOR + { + CONNECTOR_OBJECT_ID_NONE = 0x00, + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I = 0x01, + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I = 0x02, + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D = 0x03, + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x04, + CONNECTOR_OBJECT_ID_VGA = 0x05, + CONNECTOR_OBJECT_ID_COMPOSITE = 0x06, + CONNECTOR_OBJECT_ID_SVIDEO = 0x07, + CONNECTOR_OBJECT_ID_YPbPr = 0x08, + CONNECTOR_OBJECT_ID_D_CONNECTOR = 0x09, + CONNECTOR_OBJECT_ID_9PIN_DIN = 0x0A, /* Supports both CV & TV */ + CONNECTOR_OBJECT_ID_SCART = 0x0B, + CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0x0C, + CONNECTOR_OBJECT_ID_HDMI_TYPE_B = 0x0D, + CONNECTOR_OBJECT_ID_LVDS = 0x0E, + CONNECTOR_OBJECT_ID_7PIN_DIN = 0x0F, + CONNECTOR_OBJECT_ID_PCIE_CONNECTOR = 0x10, + CONNECTOR_OBJECT_ID_CROSSFIRE = 0x11, + CONNECTOR_OBJECT_ID_HARDCODE_DVI = 0x12, + CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13, + CONNECTOR_OBJECT_ID_eDP = 0x14, + CONNECTOR_OBJECT_ID_MXM = 0x15, + CONNECTOR_OBJECT_ID_LVDS_eDP = 0x16 + } + + public enum KIND_ENCODER + { + ENCODER_OBJECT_ID_NONE = 0x00, + + /* Radeon Class Display Hardware */ + ENCODER_OBJECT_ID_INTERNAL_LVDS = 0x01, + ENCODER_OBJECT_ID_INTERNAL_TMDS1 = 0x02, + ENCODER_OBJECT_ID_INTERNAL_TMDS2 = 0x03, + ENCODER_OBJECT_ID_INTERNAL_DAC1 = 0x04, + ENCODER_OBJECT_ID_INTERNAL_DAC2 = 0x05, /* TV/CV DAC */ + ENCODER_OBJECT_ID_INTERNAL_SDVOA = 0x06, + ENCODER_OBJECT_ID_INTERNAL_SDVOB = 0x07, + + /* External Third Party Encoders */ + ENCODER_OBJECT_ID_SI170B = 0x08, + ENCODER_OBJECT_ID_CH7303 = 0x09, + ENCODER_OBJECT_ID_CH7301 = 0x0A, + ENCODER_OBJECT_ID_INTERNAL_DVO1 = 0x0B, /* This belongs to Radeon Class Display Hardware */ + ENCODER_OBJECT_ID_EXTERNAL_SDVOA = 0x0C, + ENCODER_OBJECT_ID_EXTERNAL_SDVOB = 0x0D, + ENCODER_OBJECT_ID_TITFP513 = 0x0E, + ENCODER_OBJECT_ID_INTERNAL_LVTM1 = 0x0F, /* not used for Radeon */ + ENCODER_OBJECT_ID_VT1623 = 0x10, + ENCODER_OBJECT_ID_HDMI_SI1930 = 0x11, + ENCODER_OBJECT_ID_HDMI_INTERNAL = 0x12, + ENCODER_OBJECT_ID_ALMOND = 0x22, + ENCODER_OBJECT_ID_TRAVIS = 0x23, + ENCODER_OBJECT_ID_NUTMEG = 0x22, + ENCODER_OBJECT_ID_HDMI_ANX9805 = 0x26, + + /* Kaleidoscope (KLDSCP) Class Display Hardware (internal) */ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 = 0x13, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 = 0x14, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 = 0x15, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 = 0x16, /* Shared with CV/TV and CRT */ + ENCODER_OBJECT_ID_SI178 = 0X17, /* External TMDS (dual link, no HDCP.) */ + ENCODER_OBJECT_ID_MVPU_FPGA = 0x18, /* MVPU FPGA chip */ + ENCODER_OBJECT_ID_INTERNAL_DDI = 0x19, + ENCODER_OBJECT_ID_VT1625 = 0x1A, + ENCODER_OBJECT_ID_HDMI_SI1932 = 0x1B, + ENCODER_OBJECT_ID_DP_AN9801 = 0x1C, + ENCODER_OBJECT_ID_DP_DP501 = 0x1D, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E, + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA = 0x1F, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21, + ENCODER_OBJECT_ID_INTERNAL_VCE = 0x24, + ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 = 0x25, + ENCODER_OBJECT_ID_INTERNAL_AMCLK = 0x27, + + ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO = 0xFF, + } + + public partial class PolarisBiosEditor : Form + { + + /* DATA */ + + string version = "1.7xml-2021.05"; + string programTitle = "PolarisBiosEditor"; + + + string[] manufacturers = new string[] { "SAMSUNG", "ELPIDA", "HYNIX", - "MICRON" - }; - - string[] supportedID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; - - string[] timings = new string[] + "MICRON" + }; + + string[] supportedID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; + + string[] timings = new string[] { // UberMix 3.1 @@ -150,900 +150,901 @@ public partial class PolarisBiosEditor : Form "777000000000000022CC1C00106A5D4DD0571016B90D060C0060070014051420FA8900A0030000001011333DC0303A17", //new, please test //Samsung K4G80325FC // let's call it samsung4 basic timing - "777000000000000022CC1C00106A6D4DD0571016B90D060C0060070014051420FA8900A0030000001B11333DC0303A17" //new, please test - }; - - Dictionary rc = new Dictionary(); - - [StructLayout(LayoutKind.Explicit, Size = 96, CharSet = CharSet.Ansi)] - public class VRAM_TIMING_RX - { - - } - - Byte[] buffer; - Int32Converter int32 = new Int32Converter(); - UInt32Converter uint32 = new UInt32Converter(); - - const int ATOM_ROM_CHECKSUM_OFFSET = 0x21; - const int ATOM_ROM_HEADER_PTR = 0x48; - + "777000000000000022CC1C00106A6D4DD0571016B90D060C0060070014051420FA8900A0030000001B11333DC0303A17" //new, please test + }; + + Dictionary rc = new Dictionary(); + + [StructLayout(LayoutKind.Explicit, Size = 96, CharSet = CharSet.Ansi)] + public class VRAM_TIMING_RX + { + + } + + Byte[] buffer; + Int32Converter int32 = new Int32Converter(); + UInt32Converter uint32 = new UInt32Converter(); + + const int ATOM_ROM_CHECKSUM_OFFSET = 0x21; + const int ATOM_ROM_HEADER_PTR = 0x48; + #region VBIOS-fields-kept-for-later-saving - - int atom_rom_header_offset; - ATOM_ROM_HEADER atom_rom_header; - ATOM_DATA_TABLES atom_data_table; - - int atom_powerplay_offset; - ATOM_POWERPLAY_TABLE atom_powerplay_table; - - int atom_powertune_offset; - ATOM_Polaris_PowerTune_Table atom_powertune_table; - - int atom_fan_offset; - ATOM_FAN_TABLE atom_fan_table; - - int atom_mclk_table_offset; - ATOM_MCLK_TABLE atom_mclk_table; - ATOM_MCLK_ENTRY[] atom_mclk_entries; - - int atom_sclk_table_offset; - ATOM_SCLK_TABLE atom_sclk_table; - ATOM_SCLK_ENTRY[] atom_sclk_entries; - - int atom_vddc_table_offset; - ATOM_VOLTAGE_TABLE atom_vddc_table; - ATOM_VOLTAGE_ENTRY[] atom_vddc_entries; - - int atom_vram_info_offset; - ATOM_VRAM_INFO atom_vram_info; - ATOM_VRAM_ENTRY[] atom_vram_entries; - ATOM_VRAM_TIMING_ENTRY[] atom_vram_timing_entries; + + int atom_rom_header_offset; + ATOM_ROM_HEADER atom_rom_header; + ATOM_DATA_TABLES atom_data_table; + + int atom_powerplay_offset; + ATOM_POWERPLAY_TABLE atom_powerplay_table; + + int atom_powertune_offset; + ATOM_Polaris_PowerTune_Table atom_powertune_table; + + int atom_fan_offset; + ATOM_FAN_TABLE atom_fan_table; + + int atom_mclk_table_offset; + ATOM_MCLK_TABLE atom_mclk_table; + ATOM_MCLK_ENTRY[] atom_mclk_entries; + + int atom_sclk_table_offset; + ATOM_SCLK_TABLE atom_sclk_table; + ATOM_SCLK_ENTRY[] atom_sclk_entries; + + int atom_vddc_table_offset; + ATOM_VOLTAGE_TABLE atom_vddc_table; + ATOM_VOLTAGE_ENTRY[] atom_vddc_entries; + + int atom_vram_info_offset; + ATOM_VRAM_INFO atom_vram_info; + ATOM_VRAM_ENTRY[] atom_vram_entries; + ATOM_VRAM_TIMING_ENTRY[] atom_vram_timing_entries; #endregion VBIOS-fields-kept-for-later-saving - - int atom_vram_index = 0; // index selected in supported memory list - const int MAX_VRAM_ENTRIES = 48; // e.g. MSI-Armor-RX-580-4GB has 36 entries - int atom_vram_timing_offset; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_COMMON_TABLE_HEADER - { - public Int16 usStructureSize; - public Byte ucTableFormatRevision; - public Byte ucTableContentRevision; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_ROM_HEADER - { - public ATOM_COMMON_TABLE_HEADER sHeader; - //public UInt32 uaFirmWareSignature; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x4)] - public Char[] uaFirmWareSignature; - public UInt16 usBiosRuntimeSegmentAddress; - public UInt16 usProtectedModeInfoOffset; - public UInt16 usConfigFilenameOffset; - public UInt16 usCRC_BlockOffset; - public UInt16 usBIOS_BootupMessageOffset; - public UInt16 usInt10Offset; - public UInt16 usPciBusDevInitCode; - public UInt16 usIoBaseAddress; - public UInt16 usSubsystemVendorID; - public UInt16 usSubsystemID; - public UInt16 usPCI_InfoOffset; - public UInt16 usMasterCommandTableOffset; - public UInt16 usMasterDataTableOffset; - public Byte ucExtendedFunctionCode; - public Byte ucReserved; - public UInt32 ulPSPDirTableOffset; - public UInt16 usDeviceID; - public UInt16 usVendorID; - } - - String BIOS_BootupMessage; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_DATA_TABLES - { - public ATOM_COMMON_TABLE_HEADER sHeader; - public UInt16 UtilityPipeLine; - public UInt16 MultimediaCapabilityInfo; - public UInt16 MultimediaConfigInfo; - public UInt16 StandardVESA_Timing; - public UInt16 FirmwareInfo; - public UInt16 PaletteData; - public UInt16 LCD_Info; - public UInt16 DIGTransmitterInfo; - public UInt16 SMU_Info; - public UInt16 SupportedDevicesInfo; - public UInt16 GPIO_I2C_Info; - public UInt16 VRAM_UsageByFirmware; - public UInt16 GPIO_Pin_LUT; - public UInt16 VESA_ToInternalModeLUT; - public UInt16 GFX_Info; - public UInt16 PowerPlayInfo; - public UInt16 GPUVirtualizationInfo; - public UInt16 SaveRestoreInfo; - public UInt16 PPLL_SS_Info; - public UInt16 OemInfo; - public UInt16 XTMDS_Info; - public UInt16 MclkSS_Info; - public UInt16 Object_Header; - public UInt16 IndirectIOAccess; - public UInt16 MC_InitParameter; - public UInt16 ASIC_VDDC_Info; - public UInt16 ASIC_InternalSS_Info; - public UInt16 TV_VideoMode; - public UInt16 VRAM_Info; - public UInt16 MemoryTrainingInfo; - public UInt16 IntegratedSystemInfo; - public UInt16 ASIC_ProfilingInfo; - public UInt16 VoltageObjectInfo; - public UInt16 PowerSourceInfo; - public UInt16 ServiceInfo; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - unsafe public struct ATOM_POWERPLAY_TABLE - { - public ATOM_COMMON_TABLE_HEADER sHeader; - public Byte ucTableRevision; - public UInt16 usTableSize; - public UInt32 ulGoldenPPID; - public UInt32 ulGoldenRevision; - public UInt16 usFormatID; - public UInt16 usVoltageTime; - public UInt32 ulPlatformCaps; - public UInt32 ulMaxODEngineClock; - public UInt32 ulMaxODMemoryClock; - public UInt16 usPowerControlLimit; - public UInt16 usUlvVoltageOffset; - public UInt16 usStateArrayOffset; - public UInt16 usFanTableOffset; - public UInt16 usThermalControllerOffset; - public UInt16 usReserv; - public UInt16 usMclkDependencyTableOffset; - public UInt16 usSclkDependencyTableOffset; - public UInt16 usVddcLookupTableOffset; - public UInt16 usVddgfxLookupTableOffset; - public UInt16 usMMDependencyTableOffset; - public UInt16 usVCEStateTableOffset; - public UInt16 usPPMTableOffset; - public UInt16 usPowerTuneTableOffset; - public UInt16 usHardLimitTableOffset; - public UInt16 usPCIETableOffset; - public UInt16 usGPIOTableOffset; - [XmlIgnore] public fixed UInt16 usReserved[6]; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_MCLK_ENTRY - { - public Byte ucVddcInd; - public UInt16 usVddci; - public UInt16 usVddgfxOffset; - public UInt16 usMvdd; - public UInt32 ulMclk; - public UInt16 usReserved; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_MCLK_TABLE - { - public Byte ucRevId; - public Byte ucNumEntries; - // public unsafe fixed byte ATOM_MCLK_ENTRY entries[ucNumEntries]; [3] - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_SCLK_ENTRY - { - public Byte ucVddInd; - public UInt16 usVddcOffset; - public UInt32 ulSclk; - public UInt16 usEdcCurrent; - public Byte ucReliabilityTemperature; - public Byte ucCKSVOffsetandDisable; - public UInt32 ulSclkOffset; - // Polaris Only, remove for compatibility with Fiji - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_SCLK_TABLE - { - public Byte ucRevId; - public Byte ucNumEntries; - // public unsafe fixed byte ATOM_SCLK_ENTRY entries[ucNumEntries]; [8] - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VOLTAGE_ENTRY - { - public UInt16 usVdd; - public UInt16 usCACLow; - public UInt16 usCACMid; - public UInt16 usCACHigh; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VOLTAGE_TABLE - { - public Byte ucRevId; - public Byte ucNumEntries; - // public unsafe fixed byte ATOM_VOLTAGE_ENTRY entries[ucNumEntries]; [8] - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_MM_DEPENDENCY_RECORD - { - public Byte ucVddcInd; /* VDDC voltage */ - public UInt16 usVddgfxOffset; /* Offset relative to VDDC voltage */ - public UInt32 ulDClk; /* UVD D-clock */ - public UInt32 ulVClk; /* UVD V-clock */ - public UInt32 ulEClk; /* VCE clock */ - public UInt32 ulAClk; /* ACP clock */ - public UInt32 ulSAMUClk; /* SAMU clock */ - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_MM_DEPENDENCY_TABLE - { - public Byte ucRevId; - public Byte ucNumEntries; - // public unsafe fixed byte ATOM_VOLTAGE_ENTRY entries[ucNumEntries]; [8] - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_FAN_TABLE - { - public Byte ucRevId; - public Byte ucTHyst; - public UInt16 usTMin; - public UInt16 usTMed; - public UInt16 usTHigh; - public UInt16 usPWMMin; - public UInt16 usPWMMed; - public UInt16 usPWMHigh; - public UInt16 usTMax; - public Byte ucFanControlMode; - public UInt16 usFanPWMMax; - public UInt16 usFanOutputSensitivity; - public UInt16 usFanRPMMax; - public UInt32 ulMinFanSCLKAcousticLimit; - public Byte ucTargetTemperature; - public Byte ucMinimumPWMLimit; - public UInt16 usFanGainEdge; - public UInt16 usFanGainHotspot; - public UInt16 usFanGainLiquid; - public UInt16 usFanGainVrVddc; - public UInt16 usFanGainVrMvdd; - public UInt16 usFanGainPlx; - public UInt16 usFanGainHbm; - public UInt16 usReserved; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_Polaris_PowerTune_Table - { - public Byte ucRevId; - public UInt16 usTDP; - public UInt16 usConfigurableTDP; - public UInt16 usTDC; - public UInt16 usBatteryPowerLimit; - public UInt16 usSmallPowerLimit; - public UInt16 usLowCACLeakage; - public UInt16 usHighCACLeakage; - public UInt16 usMaximumPowerDeliveryLimit; - public UInt16 usTjMax; - public UInt16 usPowerTuneDataSetID; - public UInt16 usEDCLimit; - public UInt16 usSoftwareShutdownTemp; - public UInt16 usClockStretchAmount; - public UInt16 usTemperatureLimitHotspot; - public UInt16 usTemperatureLimitLiquid1; - public UInt16 usTemperatureLimitLiquid2; - public UInt16 usTemperatureLimitVrVddc; - public UInt16 usTemperatureLimitVrMvdd; - public UInt16 usTemperatureLimitPlx; - public Byte ucLiquid1_I2C_address; - public Byte ucLiquid2_I2C_address; - public Byte ucLiquid_I2C_Line; - public Byte ucVr_I2C_address; - public Byte ucVr_I2C_Line; - public Byte ucPlx_I2C_address; - public Byte ucPlx_I2C_Line; - public UInt16 usBoostPowerLimit; - public Byte ucCKS_LDO_REFSEL; - public Byte ucHotSpotOnly; - public Byte ucReserve; - public UInt16 usReserve; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_OBJECT_HEADER_V3 - { - public ATOM_COMMON_TABLE_HEADER sHeader; - public UInt16 usDeviceSupport; - public UInt16 usConnectorObjectTableOffset; - public UInt16 usRouterObjectTableOffset; - public UInt16 usEncoderObjectTableOffset; - public UInt16 usProtectionObjectTableOffset; //only available when Protection block is independent. - public UInt16 usDisplayPathTableOffset; - public UInt16 usMiscObjectTableOffset; - } - - - public enum GRAPH_OBJECT_TYPE - { - GRAPH_OBJECT_TYPE_NONE = 0x0, - GRAPH_OBJECT_TYPE_GPU = 0x1, - GRAPH_OBJECT_TYPE_ENCODER = 0x2, - GRAPH_OBJECT_TYPE_CONNECTOR = 0x3, - GRAPH_OBJECT_TYPE_ROUTER = 0x4, - /* deleted */ - GRAPH_OBJECT_TYPE_DISPLAY_PATH = 0x6, - GRAPH_OBJECT_TYPE_GENERIC = 0x7, - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_OBJECT_ID - { - [XmlIgnore] public Byte KindInNamespaceRaw; - [XmlIgnore] public Byte NamespaceAndIndex; - public string KindInNamespace - { - get - { - var type_name = Namespace.ToString().Split(new []{'_'}).Last(); - var type = Type.GetType("PolarisBiosEditor.KIND_" + type_name); - if (type != null) - { - return Enum.ToObject(type, KindInNamespaceRaw).ToString() + " = 0x" + KindInNamespaceRaw.ToString("X"); - } - return KindInNamespaceRaw.ToString(); - } - set { throw new NotImplementedException(); } - } - public GRAPH_OBJECT_TYPE Namespace - { - get { return (GRAPH_OBJECT_TYPE)(NamespaceAndIndex >> 4); } - set { throw new NotImplementedException(); } - } - public int Index - { - get { return NamespaceAndIndex & 7; } - set { throw new NotImplementedException(); } - } - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_DISPLAY_OBJECT_PATH - { - public UInt16 usDeviceTag; //supported device - public UInt16 usSize; //the size of ATOM_DISPLAY_OBJECT_PATH - public ATOM_OBJECT_ID usConnObjectId; //Connector Object ID - public ATOM_OBJECT_ID usGPUObjectId; //GPU ID - public ATOM_OBJECT_ID usGraphicObjIdsFirst; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector. - //usGraphicObjIdsOthers - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_DISPLAY_OBJECT_PATH_TABLE - { - public Byte ucNumOfDispPath; - public Byte ucVersion; - public UInt16 ucPadding2; - //ATOM_DISPLAY_OBJECT_PATH asDispPath[1]; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_OBJECT //each object has this structure - { - public ATOM_OBJECT_ID usObjectID; - public UInt16 usSrcDstTableOffset; - public UInt16 usRecordOffset; //this pointing to a bunch of records defined below - public UInt16 usReserved; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_OBJECT_TABLE - { - public Byte ucNumberOfObjects; - public Byte ucPadding0; - public Byte ucPadding1; - public Byte ucPadding2; - //ATOM_OBJECT asObjects[1]; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_COMMON_RECORD_HEADER - { - [XmlIgnore] public Byte ucRecordType; //An emun to indicate the record type - public string RecordType - { - get { return ((AtomRecordType)ucRecordType).ToString() + " = 0x" + ucRecordType.ToString("X"); } - set { throw new NotImplementedException(); } - } - public Byte ucRecordSize; //The size of the whole record in byte - } - - - public enum AtomRecordType { - ATOM_I2C_RECORD_TYPE = 1, - ATOM_HPD_INT_RECORD_TYPE = 2, - ATOM_OUTPUT_PROTECTION_RECORD_TYPE = 3, - ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 4, - ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD_TYPE = 5, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE - ATOM_ENCODER_FPGA_CONTROL_RECORD_TYPE = 6, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE - ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD_TYPE = 7, - ATOM_JTAG_RECORD_TYPE = 8, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE - ATOM_OBJECT_GPIO_CNTL_RECORD_TYPE = 9, - ATOM_ENCODER_DVO_CF_RECORD_TYPE = 10, - ATOM_CONNECTOR_CF_RECORD_TYPE = 11, - ATOM_CONNECTOR_HARDCODE_DTD_RECORD_TYPE = 12, - ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE = 13, - ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE = 14, - ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE = 15, - ATOM_CONNECTOR_HPDPIN_LUT_RECORD_TYPE = 16, //This is for the case when connectors are not known to object table - ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE = 17, //This is for the case when connectors are not known to object table - ATOM_OBJECT_LINK_RECORD_TYPE = 18, //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record - ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE = 19, - ATOM_ENCODER_CAP_RECORD_TYPE = 20, - ATOM_BRACKET_LAYOUT_RECORD_TYPE = 21, - ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD_TYPE = 22, - } - - public enum atom_voltage_type: Byte - { - VOLTAGE_TYPE_VDDC_0x1 = 1, - VOLTAGE_TYPE_MVDDC_0x2 = 2, - VOLTAGE_TYPE_MVDDQ_0x3 = 3, - VOLTAGE_TYPE_VDDCI_0x4 = 4, - VOLTAGE_TYPE_VDDGFX_0x5 = 5, - VOLTAGE_TYPE_PCC_0x6 = 6, - VOLTAGE_TYPE_MVPP_0x7 = 7, - VOLTAGE_TYPE_LEDDPM_0x8 = 8, - VOLTAGE_TYPE_PCC_MVDD_0x9 = 9, - VOLTAGE_TYPE_PCIE_VDDC_0xA = 10, - VOLTAGE_TYPE_PCIE_VDDR_0xB = 11, - VOLTAGE_TYPE_GENERIC_I2C_1_0x11 = 0x11, - VOLTAGE_TYPE_GENERIC_I2C_2_0x12 = 0x12, - VOLTAGE_TYPE_GENERIC_I2C_3_0x13 = 0x13, - VOLTAGE_TYPE_GENERIC_I2C_4_0x14 = 0x14, - VOLTAGE_TYPE_GENERIC_I2C_5_0x15 = 0x15, - VOLTAGE_TYPE_GENERIC_I2C_6_0x16 = 0x16, - VOLTAGE_TYPE_GENERIC_I2C_7_0x17 = 0x17, - VOLTAGE_TYPE_GENERIC_I2C_8_0x18 = 0x18, - VOLTAGE_TYPE_GENERIC_I2C_9_0x19 = 0x19, - VOLTAGE_TYPE_GENERIC_I2C_10_0x1A = 0x1A, - }; - - public enum atom_voltage_object_mode: Byte - { - VOLTAGE_OBJ_GPIO_LUT_0x0 = 0, //VOLTAGE and GPIO Lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3 = 3, //VOLTAGE REGULATOR INIT sequece through I2C -> ATOM_I2C_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_PHASE_LUT_0x4 = 4, //Set Vregulator Phase lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_SVID2_0x7 = 7, //Indicate voltage control by SVID2 ->ATOM_SVID2_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_EVV_0x8 = 8, - VOLTAGE_OBJ_MERGED_POWER_0x9 = 9, - VOLTAGE_OBJ_PWRBOOST_LEAKAGE_LUT_0x10 = 0x10, //Powerboost Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_HIGH_STATE_LEAKAGE_LUT_0x11 = 0x11, //High voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 - VOLTAGE_OBJ_HIGH1_STATE_LEAKAGE_LUT_0x12 = 0x12, //High1 voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 - } - - enum atom_gpio_pin_assignment_gpio_id - { - I2C_HW_LANE_MUX_0x0F = 0x0f, /* only valid when bit7=1 */ - I2C_HW_ENGINE_ID_MASK_0x70 = 0x70, /* only valid when bit7=1 */ - I2C_HW_CAP_0x80 = 0x80, /*only when the I2C_HW_CAP is set, the pin ID is assigned to an I2C pin pair, otherwise, it's an generic GPIO pin */ - - /* gpio_id pre-define id for multiple usage */ - /* GPIO use to control PCIE_VDDC in certain SLT board */ - PCIE_VDDC_CONTROL_GPIO_PINID_0x38 = 56, - /* if PP_AC_DC_SWITCH_GPIO_PINID in Gpio_Pin_LutTable, AC/DC swithing feature is enable */ - PP_AC_DC_SWITCH_GPIO_PINID_0x3C = 60, - /* VDDC_REGULATOR_VRHOT_GPIO_PINID in Gpio_Pin_LutTable, VRHot feature is enable */ - VDDC_VRHOT_GPIO_PINID_0x3D = 61, - /*if VDDC_PCC_GPIO_PINID in GPIO_LUTable, Peak Current Control feature is enabled */ - VDDC_PCC_GPIO_PINID_0x3E = 62, - /* Only used on certain SLT/PA board to allow utility to cut Efuse. */ - EFUSE_CUT_ENABLE_GPIO_PINID_0x3F = 63, - /* ucGPIO=DRAM_SELF_REFRESH_GPIO_PIND uses for memory self refresh (ucGPIO=0, DRAM self-refresh; ucGPIO= */ - DRAM_SELF_REFRESH_GPIO_PINID_0x40 = 64, - /* Thermal interrupt output->system thermal chip GPIO pin */ - THERMAL_INT_OUTPUT_GPIO_PINID_0x41 = 65, - is_mm_i2c = 0xA0, - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_GPIO_ROLE_I2C_ID - { - public Byte gpio_id; - - public bool bfHW_Capable - { - get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_CAP_0x80) != 0; } - set { throw new NotImplementedException(); } - } - public int bfHW_EngineID - { - get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_ENGINE_ID_MASK_0x70) >> 4; } - set { throw new NotImplementedException(); } - } - public int bfI2C_LineMux - { - get { return gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_LANE_MUX_0x0F; } - set { throw new NotImplementedException(); } - } - public string Description - { - get { return ((atom_gpio_pin_assignment_gpio_id)gpio_id).ToString(); } - set { throw new NotImplementedException(); } - } - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_I2C_SHIFTED_SLAVE_ADDRESS - { - public Byte shifted_i2c_slave_addr; - /* //Not sure if it actually shifted... - public int EffectiveSlaveAddr - { - get { return shifted_i2c_slave_addr >> 1; } - set { throw new NotImplementedException(); } - } - */ - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct atom_i2c_voltage_object_v4_fields - { - public Byte regulator_id; //Indicate Voltage Regulator Id - public ATOM_GPIO_ROLE_I2C_ID i2c_id; - public ATOM_I2C_SHIFTED_SLAVE_ADDRESS i2c_slave_addr; - public Byte i2c_control_offset; - public Byte i2c_flag; // Bit0: 0 - One byte data; 1 - Two byte data - public Byte i2c_speed; // =0, use default i2c speed, otherwise use it in unit of kHz. - public Byte reserved_0xA; - public Byte reserved_0xB; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct FINAL_atom_i2c_data_entry - { - public UInt16 final_entry_index; - public static UInt16 ENDING_INDEX_VALUE => 0xff; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct atom_i2c_data_entry - { - public UInt16 i2c_reg_index; // i2c register address, can be up to 16bit - public UInt16 i2c_reg_data; // i2c register data, can be up to 16bit - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct atom_voltage_gpio_map_lut - { - public UInt32 voltage_gpio_reg_val; // The Voltage ID which is used to program GPIO register - public UInt16 voltage_level_mv; // The corresponding Voltage Value, in mV - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct atom_gpio_voltage_object_v4_fields - { - public Byte gpio_control_id; // default is 0 which indicate control through CG VID mode - public Byte gpio_entry_num; // indiate the entry numbers of Votlage/Gpio value Look up table - public Byte phase_delay_us; // phase delay in unit of micro second - public Byte reserved; - public UInt32 gpio_mask_val; // GPIO Mask value - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct atom_voltage_object_header_v4 - { - public atom_voltage_type ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI - public atom_voltage_object_mode ucVoltageMode; //Indicate voltage control mode: Init/Set/Leakage/Set phase - public UInt16 usSize; //Size of Object - //actual fields depens on ucVoltageMode - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VOLTAGE_OBJECT_INFO_V3_1 - { - public ATOM_COMMON_TABLE_HEADER sHeader; - //ATOM_VOLTAGE_OBJECT_V3 asVoltageObj[3]; //Info for Voltage control - } - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_GPIO_I2C_ASSIGMENT - { - public UInt16 usClkMaskRegisterIndex; - public UInt16 usClkEnRegisterIndex; - public UInt16 usClkY_RegisterIndex; - public UInt16 usClkA_RegisterIndex; - public UInt16 usDataMaskRegisterIndex; - public UInt16 usDataEnRegisterIndex; - public UInt16 usDataY_RegisterIndex; - public UInt16 usDataA_RegisterIndex; - public ATOM_GPIO_ROLE_I2C_ID sucI2cId; - public Byte ucClkMaskShift; - public Byte ucClkEnShift; - public Byte ucClkY_Shift; - public Byte ucClkA_Shift; - public Byte ucDataMaskShift; - public Byte ucDataEnShift; - public Byte ucDataY_Shift; - public Byte ucDataA_Shift; - public Byte ucReserved1; - public Byte ucReserved2; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_GPIO_I2C_INFO - { - public ATOM_COMMON_TABLE_HEADER sHeader; - //ATOM_GPIO_I2C_ASSIGMENT asGPIO_Info[16]; - }; - - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VRAM_TIMING_ENTRY - { - public UInt32 ulClkRange; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x30)] - [XmlIgnore]public Byte[] ucLatency; - public string LatencyString - { - get - { - return ByteArrayToString(ucLatency); - } - set - { - throw new NotImplementedException(); - } - } - - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VRAM_ENTRY - { - public UInt32 ulChannelMapCfg; - public UInt16 usModuleSize; - public UInt16 usMcRamCfg; - public UInt16 usEnableChannels; - public Byte ucExtMemoryID; - public Byte ucMemoryType; - public Byte ucChannelNum; - public Byte ucChannelWidth; - public Byte ucDensity; - public Byte ucBankCol; - public Byte ucMisc; - public Byte ucVREFI; - public UInt16 usReserved; - public UInt16 usMemorySize; - public Byte ucMcTunningSetId; - public Byte ucRowNum; - public UInt16 usEMRS2Value; - public UInt16 usEMRS3Value; - public Byte ucMemoryVenderID; - public Byte ucRefreshRateFactor; - public Byte ucFIFODepth; - public Byte ucCDR_Bandwidth; - public UInt32 ulChannelMapCfg1; - public UInt32 ulBankMapCfg; - public UInt32 ulReserved; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] - [XmlIgnore] - public Byte[] strMemPNString; - public string FullName - { - get - { - return Encoding.UTF8.GetString(strMemPNString.TakeWhile(c => c != 0).ToArray()); - } - set - { - throw new NotImplementedException(); - } - } - }; - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct ATOM_VRAM_INFO - { - public ATOM_COMMON_TABLE_HEADER sHeader; - public UInt16 usMemAdjustTblOffset; - public UInt16 usMemClkPatchTblOffset; - public UInt16 usMcAdjustPerTileTblOffset; - public UInt16 usMcPhyInitTableOffset; - public UInt16 usDramDataRemapTblOffset; - public UInt16 usReserved1; - public Byte ucNumOfVRAMModule; - public Byte ucMemoryClkPatchTblVer; - public Byte ucVramModuleVer; - public Byte ucMcPhyTileNum; - // public ATOM_VRAM_ENTRY aVramInfo[ucNumOfVRAMModule]; - } - - class ConsecutiveReader - { - public static ConsecutiveReader From(ConsecutiveReader other) - { - return new ConsecutiveReader(other.buffer.Array, other.buffer.Offset, other.editor); - } - - public ConsecutiveReader(Byte[] entire_buffer, int offset, PolarisBiosEditor a_editor) - { - buffer = new ArraySegment(entire_buffer); - editor = a_editor; - Jump(offset); - } - public T Read() - { - T obj = default(T); - int size = Marshal.SizeOf(obj); - IntPtr ptr = Marshal.AllocHGlobal(size); - - Marshal.Copy(buffer.Array, buffer.Offset, ptr, size); - obj = (T)Marshal.PtrToStructure(ptr, obj.GetType()); - Marshal.FreeHGlobal(ptr); - - return obj; - } - public T ReadPrint(string name="") - { - T result = Read(); - int size = Marshal.SizeOf(typeof(T)); - if (!string.IsNullOrWhiteSpace(name)) - { - name = " Name=" + name; - } - editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len=0x{2:X}={2}{3}", buffer.Offset, buffer.Offset + size, size, name)); - return result; - } - public void Jump1Structure() - { - Jump(Marshal.SizeOf()); - } - - public void Jump(int relative_offset) - { - int offset = buffer.Offset + relative_offset; - buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); - } - public void JumpPrintExtra(int relative_offset) - { - int done_size = Marshal.SizeOf(); - if (done_size < relative_offset) - { - editor.Print(string.Format("Extra at 0x{0:x}:", buffer.Offset + done_size) + ByteArrayToString(buffer.Skip(done_size).Take(relative_offset - done_size).ToArray())); - } - Jump(relative_offset); - } - public ArraySegment buffer; - public PolarisBiosEditor editor; - } - [STAThread] - static void Main(string[] args) - { - PolarisBiosEditor pbe = new PolarisBiosEditor(); - Application.Run(pbe); - } - - static byte[] getBytes(object obj) - { - int size = Marshal.SizeOf(obj); - byte[] arr = new byte[size]; - IntPtr ptr = Marshal.AllocHGlobal(size); - - Marshal.StructureToPtr(obj, ptr, true); - Marshal.Copy(ptr, arr, 0, size); - Marshal.FreeHGlobal(ptr); - - return arr; - } - - T fromBytes(byte[] arr) - { - return new ConsecutiveReader(arr, 0, this).Read(); - } - - public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) - { - for (var i = 0; i < src.Length; i++) - { - dest[ptr + i] = src[i]; - } - } - - public void Print(object output, string desc_name = "", string desc = "") - { - try - { - if (output.GetType().IsPrimitive || output.GetType() == typeof(string)) - { - var s = output.ToString(); - if (!string.IsNullOrWhiteSpace(desc_name)) - { - s = desc_name + "=" + desc +" "+ s; - } - Console.WriteLine(s); - } - else - { - //Create our own namespaces for the output - var ns = new XmlSerializerNamespaces(); - var xs = new XmlSerializer(output.GetType()); - - //Add an empty namespace and empty value - ns.Add("", ""); - - var doc = new XDocument(); - using (var writer = doc.CreateWriter()) - { - xs.Serialize(writer, output, ns); - } - foreach(var e in doc.Descendants()) - { - if (e.Elements().Any()) continue; - if (Int64.TryParse(e.Value, out Int64 parsed) && parsed != 0 && parsed != 1) - { - e.Value = string.Format("{0} = 0x{0:X} = 0b{1}", parsed, Convert.ToString(parsed, 2)); - } - } - if (!string.IsNullOrWhiteSpace(desc)) - { - doc.Root.Add(new XAttribute(desc_name, desc)); - } - Console.WriteLine(doc); - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - } - - private ListViewItem handler; - - private void listView_ChangeSelection(object sender, EventArgs e) - { - ListView lb = sender as ListView; - String sel_name = lb.SelectedItems[0].Text; - - for (var i = 0; i < lb.Items.Count; i++) - { - - ListViewItem container = lb.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - - if (name == sel_name) - { - editSubItem1.Text = name; - editSubItem2.Text = value; - handler = container; - } - - } - } - - private void apply_Click(object sender, EventArgs e) - { - if (handler != null) - { - handler.Text = editSubItem1.Text; - handler.SubItems[1].Text = editSubItem2.Text; - } - } - - public PolarisBiosEditor() - { - InitializeComponent(); - this.Text = this.programTitle + " " + this.version; - + + int atom_vram_index = 0; // index selected in supported memory list + const int MAX_VRAM_ENTRIES = 48; // e.g. MSI-Armor-RX-580-4GB has 36 entries + int atom_vram_timing_offset; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_COMMON_TABLE_HEADER + { + public Int16 usStructureSize; + public Byte ucTableFormatRevision; + public Byte ucTableContentRevision; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_ROM_HEADER + { + public ATOM_COMMON_TABLE_HEADER sHeader; + //public UInt32 uaFirmWareSignature; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x4)] + public Char[] uaFirmWareSignature; + public UInt16 usBiosRuntimeSegmentAddress; + public UInt16 usProtectedModeInfoOffset; + public UInt16 usConfigFilenameOffset; + public UInt16 usCRC_BlockOffset; + public UInt16 usBIOS_BootupMessageOffset; + public UInt16 usInt10Offset; + public UInt16 usPciBusDevInitCode; + public UInt16 usIoBaseAddress; + public UInt16 usSubsystemVendorID; + public UInt16 usSubsystemID; + public UInt16 usPCI_InfoOffset; + public UInt16 usMasterCommandTableOffset; + public UInt16 usMasterDataTableOffset; + public Byte ucExtendedFunctionCode; + public Byte ucReserved; + public UInt32 ulPSPDirTableOffset; + public UInt16 usDeviceID; + public UInt16 usVendorID; + } + + String BIOS_BootupMessage; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_DATA_TABLES + { + public ATOM_COMMON_TABLE_HEADER sHeader; + public UInt16 UtilityPipeLine; + public UInt16 MultimediaCapabilityInfo; + public UInt16 MultimediaConfigInfo; + public UInt16 StandardVESA_Timing; + public UInt16 FirmwareInfo; + public UInt16 PaletteData; + public UInt16 LCD_Info; + public UInt16 DIGTransmitterInfo; + public UInt16 SMU_Info; + public UInt16 SupportedDevicesInfo; + public UInt16 GPIO_I2C_Info; + public UInt16 VRAM_UsageByFirmware; + public UInt16 GPIO_Pin_LUT; + public UInt16 VESA_ToInternalModeLUT; + public UInt16 GFX_Info; + public UInt16 PowerPlayInfo; + public UInt16 GPUVirtualizationInfo; + public UInt16 SaveRestoreInfo; + public UInt16 PPLL_SS_Info; + public UInt16 OemInfo; + public UInt16 XTMDS_Info; + public UInt16 MclkSS_Info; + public UInt16 Object_Header; + public UInt16 IndirectIOAccess; + public UInt16 MC_InitParameter; + public UInt16 ASIC_VDDC_Info; + public UInt16 ASIC_InternalSS_Info; + public UInt16 TV_VideoMode; + public UInt16 VRAM_Info; + public UInt16 MemoryTrainingInfo; + public UInt16 IntegratedSystemInfo; + public UInt16 ASIC_ProfilingInfo; + public UInt16 VoltageObjectInfo; + public UInt16 PowerSourceInfo; + public UInt16 ServiceInfo; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + unsafe public struct ATOM_POWERPLAY_TABLE + { + public ATOM_COMMON_TABLE_HEADER sHeader; + public Byte ucTableRevision; + public UInt16 usTableSize; + public UInt32 ulGoldenPPID; + public UInt32 ulGoldenRevision; + public UInt16 usFormatID; + public UInt16 usVoltageTime; + public UInt32 ulPlatformCaps; + public UInt32 ulMaxODEngineClock; + public UInt32 ulMaxODMemoryClock; + public UInt16 usPowerControlLimit; + public UInt16 usUlvVoltageOffset; + public UInt16 usStateArrayOffset; + public UInt16 usFanTableOffset; + public UInt16 usThermalControllerOffset; + public UInt16 usReserv; + public UInt16 usMclkDependencyTableOffset; + public UInt16 usSclkDependencyTableOffset; + public UInt16 usVddcLookupTableOffset; + public UInt16 usVddgfxLookupTableOffset; + public UInt16 usMMDependencyTableOffset; + public UInt16 usVCEStateTableOffset; + public UInt16 usPPMTableOffset; + public UInt16 usPowerTuneTableOffset; + public UInt16 usHardLimitTableOffset; + public UInt16 usPCIETableOffset; + public UInt16 usGPIOTableOffset; + [XmlIgnore] public fixed UInt16 usReserved[6]; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_MCLK_ENTRY + { + public Byte ucVddcInd; + public UInt16 usVddci; + public UInt16 usVddgfxOffset; + public UInt16 usMvdd; + public UInt32 ulMclk; + public UInt16 usReserved; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_MCLK_TABLE + { + public Byte ucRevId; + public Byte ucNumEntries; + // public unsafe fixed byte ATOM_MCLK_ENTRY entries[ucNumEntries]; [3] + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_SCLK_ENTRY + { + public Byte ucVddInd; + public UInt16 usVddcOffset; + public UInt32 ulSclk; + public UInt16 usEdcCurrent; + public Byte ucReliabilityTemperature; + public Byte ucCKSVOffsetandDisable; + public UInt32 ulSclkOffset; + // Polaris Only, remove for compatibility with Fiji + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_SCLK_TABLE + { + public Byte ucRevId; + public Byte ucNumEntries; + // public unsafe fixed byte ATOM_SCLK_ENTRY entries[ucNumEntries]; [8] + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VOLTAGE_ENTRY + { + public UInt16 usVdd; + public UInt16 usCACLow; + public UInt16 usCACMid; + public UInt16 usCACHigh; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VOLTAGE_TABLE + { + public Byte ucRevId; + public Byte ucNumEntries; + // public unsafe fixed byte ATOM_VOLTAGE_ENTRY entries[ucNumEntries]; [8] + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_MM_DEPENDENCY_RECORD + { + public Byte ucVddcInd; /* VDDC voltage */ + public UInt16 usVddgfxOffset; /* Offset relative to VDDC voltage */ + public UInt32 ulDClk; /* UVD D-clock */ + public UInt32 ulVClk; /* UVD V-clock */ + public UInt32 ulEClk; /* VCE clock */ + public UInt32 ulAClk; /* ACP clock */ + public UInt32 ulSAMUClk; /* SAMU clock */ + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_MM_DEPENDENCY_TABLE + { + public Byte ucRevId; + public Byte ucNumEntries; + // public unsafe fixed byte ATOM_VOLTAGE_ENTRY entries[ucNumEntries]; [8] + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_FAN_TABLE + { + public Byte ucRevId; + public Byte ucTHyst; + public UInt16 usTMin; + public UInt16 usTMed; + public UInt16 usTHigh; + public UInt16 usPWMMin; + public UInt16 usPWMMed; + public UInt16 usPWMHigh; + public UInt16 usTMax; + public Byte ucFanControlMode; + public UInt16 usFanPWMMax; + public UInt16 usFanOutputSensitivity; + public UInt16 usFanRPMMax; + public UInt32 ulMinFanSCLKAcousticLimit; + public Byte ucTargetTemperature; + public Byte ucMinimumPWMLimit; + public UInt16 usFanGainEdge; + public UInt16 usFanGainHotspot; + public UInt16 usFanGainLiquid; + public UInt16 usFanGainVrVddc; + public UInt16 usFanGainVrMvdd; + public UInt16 usFanGainPlx; + public UInt16 usFanGainHbm; + public UInt16 usReserved; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_Polaris_PowerTune_Table + { + public Byte ucRevId; + public UInt16 usTDP; + public UInt16 usConfigurableTDP; + public UInt16 usTDC; + public UInt16 usBatteryPowerLimit; + public UInt16 usSmallPowerLimit; + public UInt16 usLowCACLeakage; + public UInt16 usHighCACLeakage; + public UInt16 usMaximumPowerDeliveryLimit; + public UInt16 usTjMax; + public UInt16 usPowerTuneDataSetID; + public UInt16 usEDCLimit; + public UInt16 usSoftwareShutdownTemp; + public UInt16 usClockStretchAmount; + public UInt16 usTemperatureLimitHotspot; + public UInt16 usTemperatureLimitLiquid1; + public UInt16 usTemperatureLimitLiquid2; + public UInt16 usTemperatureLimitVrVddc; + public UInt16 usTemperatureLimitVrMvdd; + public UInt16 usTemperatureLimitPlx; + public Byte ucLiquid1_I2C_address; + public Byte ucLiquid2_I2C_address; + public Byte ucLiquid_I2C_Line; + public Byte ucVr_I2C_address; + public Byte ucVr_I2C_Line; + public Byte ucPlx_I2C_address; + public Byte ucPlx_I2C_Line; + public UInt16 usBoostPowerLimit; + public Byte ucCKS_LDO_REFSEL; + public Byte ucHotSpotOnly; + public Byte ucReserve; + public UInt16 usReserve; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT_HEADER_V3 + { + public ATOM_COMMON_TABLE_HEADER sHeader; + public UInt16 usDeviceSupport; + public UInt16 usConnectorObjectTableOffset; + public UInt16 usRouterObjectTableOffset; + public UInt16 usEncoderObjectTableOffset; + public UInt16 usProtectionObjectTableOffset; //only available when Protection block is independent. + public UInt16 usDisplayPathTableOffset; + public UInt16 usMiscObjectTableOffset; + } + + + public enum GRAPH_OBJECT_TYPE + { + GRAPH_OBJECT_TYPE_NONE = 0x0, + GRAPH_OBJECT_TYPE_GPU = 0x1, + GRAPH_OBJECT_TYPE_ENCODER = 0x2, + GRAPH_OBJECT_TYPE_CONNECTOR = 0x3, + GRAPH_OBJECT_TYPE_ROUTER = 0x4, + /* deleted */ + GRAPH_OBJECT_TYPE_DISPLAY_PATH = 0x6, + GRAPH_OBJECT_TYPE_GENERIC = 0x7, + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT_ID + { + [XmlIgnore] public Byte KindInNamespaceRaw; + [XmlIgnore] public Byte NamespaceAndIndex; + public string KindInNamespace + { + get + { + var type_name = Namespace.ToString().Split(new[] { '_' }).Last(); + var type = Type.GetType("PolarisBiosEditor.KIND_" + type_name); + if (type != null) + { + return Enum.ToObject(type, KindInNamespaceRaw).ToString() + " = 0x" + KindInNamespaceRaw.ToString("X"); + } + return KindInNamespaceRaw.ToString(); + } + set { throw new NotImplementedException(); } + } + public GRAPH_OBJECT_TYPE Namespace + { + get { return (GRAPH_OBJECT_TYPE)(NamespaceAndIndex >> 4); } + set { throw new NotImplementedException(); } + } + public int Index + { + get { return NamespaceAndIndex & 7; } + set { throw new NotImplementedException(); } + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_DISPLAY_OBJECT_PATH + { + public UInt16 usDeviceTag; //supported device + public UInt16 usSize; //the size of ATOM_DISPLAY_OBJECT_PATH + public ATOM_OBJECT_ID usConnObjectId; //Connector Object ID + public ATOM_OBJECT_ID usGPUObjectId; //GPU ID + public ATOM_OBJECT_ID usGraphicObjIdsFirst; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector. + //usGraphicObjIdsOthers + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_DISPLAY_OBJECT_PATH_TABLE + { + public Byte ucNumOfDispPath; + public Byte ucVersion; + public UInt16 ucPadding2; + //ATOM_DISPLAY_OBJECT_PATH asDispPath[1]; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT //each object has this structure + { + public ATOM_OBJECT_ID usObjectID; + public UInt16 usSrcDstTableOffset; + public UInt16 usRecordOffset; //this pointing to a bunch of records defined below + public UInt16 usReserved; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_OBJECT_TABLE + { + public Byte ucNumberOfObjects; + public Byte ucPadding0; + public Byte ucPadding1; + public Byte ucPadding2; + //ATOM_OBJECT asObjects[1]; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_COMMON_RECORD_HEADER + { + [XmlIgnore] public Byte ucRecordType; //An emun to indicate the record type + public string RecordType + { + get { return ((AtomRecordType)ucRecordType).ToString() + " = 0x" + ucRecordType.ToString("X"); } + set { throw new NotImplementedException(); } + } + public Byte ucRecordSize; //The size of the whole record in byte + } + + + public enum AtomRecordType + { + ATOM_I2C_RECORD_TYPE = 1, + ATOM_HPD_INT_RECORD_TYPE = 2, + ATOM_OUTPUT_PROTECTION_RECORD_TYPE = 3, + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 4, + ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD_TYPE = 5, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_ENCODER_FPGA_CONTROL_RECORD_TYPE = 6, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD_TYPE = 7, + ATOM_JTAG_RECORD_TYPE = 8, //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE + ATOM_OBJECT_GPIO_CNTL_RECORD_TYPE = 9, + ATOM_ENCODER_DVO_CF_RECORD_TYPE = 10, + ATOM_CONNECTOR_CF_RECORD_TYPE = 11, + ATOM_CONNECTOR_HARDCODE_DTD_RECORD_TYPE = 12, + ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE = 13, + ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE = 14, + ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE = 15, + ATOM_CONNECTOR_HPDPIN_LUT_RECORD_TYPE = 16, //This is for the case when connectors are not known to object table + ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE = 17, //This is for the case when connectors are not known to object table + ATOM_OBJECT_LINK_RECORD_TYPE = 18, //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record + ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE = 19, + ATOM_ENCODER_CAP_RECORD_TYPE = 20, + ATOM_BRACKET_LAYOUT_RECORD_TYPE = 21, + ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD_TYPE = 22, + } + + public enum atom_voltage_type : Byte + { + VOLTAGE_TYPE_VDDC_0x1 = 1, + VOLTAGE_TYPE_MVDDC_0x2 = 2, + VOLTAGE_TYPE_MVDDQ_0x3 = 3, + VOLTAGE_TYPE_VDDCI_0x4 = 4, + VOLTAGE_TYPE_VDDGFX_0x5 = 5, + VOLTAGE_TYPE_PCC_0x6 = 6, + VOLTAGE_TYPE_MVPP_0x7 = 7, + VOLTAGE_TYPE_LEDDPM_0x8 = 8, + VOLTAGE_TYPE_PCC_MVDD_0x9 = 9, + VOLTAGE_TYPE_PCIE_VDDC_0xA = 10, + VOLTAGE_TYPE_PCIE_VDDR_0xB = 11, + VOLTAGE_TYPE_GENERIC_I2C_1_0x11 = 0x11, + VOLTAGE_TYPE_GENERIC_I2C_2_0x12 = 0x12, + VOLTAGE_TYPE_GENERIC_I2C_3_0x13 = 0x13, + VOLTAGE_TYPE_GENERIC_I2C_4_0x14 = 0x14, + VOLTAGE_TYPE_GENERIC_I2C_5_0x15 = 0x15, + VOLTAGE_TYPE_GENERIC_I2C_6_0x16 = 0x16, + VOLTAGE_TYPE_GENERIC_I2C_7_0x17 = 0x17, + VOLTAGE_TYPE_GENERIC_I2C_8_0x18 = 0x18, + VOLTAGE_TYPE_GENERIC_I2C_9_0x19 = 0x19, + VOLTAGE_TYPE_GENERIC_I2C_10_0x1A = 0x1A, + }; + + public enum atom_voltage_object_mode : Byte + { + VOLTAGE_OBJ_GPIO_LUT_0x0 = 0, //VOLTAGE and GPIO Lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3 = 3, //VOLTAGE REGULATOR INIT sequece through I2C -> ATOM_I2C_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_PHASE_LUT_0x4 = 4, //Set Vregulator Phase lookup table ->ATOM_GPIO_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_SVID2_0x7 = 7, //Indicate voltage control by SVID2 ->ATOM_SVID2_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_EVV_0x8 = 8, + VOLTAGE_OBJ_MERGED_POWER_0x9 = 9, + VOLTAGE_OBJ_PWRBOOST_LEAKAGE_LUT_0x10 = 0x10, //Powerboost Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_HIGH_STATE_LEAKAGE_LUT_0x11 = 0x11, //High voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + VOLTAGE_OBJ_HIGH1_STATE_LEAKAGE_LUT_0x12 = 0x12, //High1 voltage state Voltage and LeakageId lookup table->ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 + } + + enum atom_gpio_pin_assignment_gpio_id + { + I2C_HW_LANE_MUX_0x0F = 0x0f, /* only valid when bit7=1 */ + I2C_HW_ENGINE_ID_MASK_0x70 = 0x70, /* only valid when bit7=1 */ + I2C_HW_CAP_0x80 = 0x80, /*only when the I2C_HW_CAP is set, the pin ID is assigned to an I2C pin pair, otherwise, it's an generic GPIO pin */ + + /* gpio_id pre-define id for multiple usage */ + /* GPIO use to control PCIE_VDDC in certain SLT board */ + PCIE_VDDC_CONTROL_GPIO_PINID_0x38 = 56, + /* if PP_AC_DC_SWITCH_GPIO_PINID in Gpio_Pin_LutTable, AC/DC swithing feature is enable */ + PP_AC_DC_SWITCH_GPIO_PINID_0x3C = 60, + /* VDDC_REGULATOR_VRHOT_GPIO_PINID in Gpio_Pin_LutTable, VRHot feature is enable */ + VDDC_VRHOT_GPIO_PINID_0x3D = 61, + /*if VDDC_PCC_GPIO_PINID in GPIO_LUTable, Peak Current Control feature is enabled */ + VDDC_PCC_GPIO_PINID_0x3E = 62, + /* Only used on certain SLT/PA board to allow utility to cut Efuse. */ + EFUSE_CUT_ENABLE_GPIO_PINID_0x3F = 63, + /* ucGPIO=DRAM_SELF_REFRESH_GPIO_PIND uses for memory self refresh (ucGPIO=0, DRAM self-refresh; ucGPIO= */ + DRAM_SELF_REFRESH_GPIO_PINID_0x40 = 64, + /* Thermal interrupt output->system thermal chip GPIO pin */ + THERMAL_INT_OUTPUT_GPIO_PINID_0x41 = 65, + is_mm_i2c = 0xA0, + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_GPIO_ROLE_I2C_ID + { + public Byte gpio_id; + + public bool bfHW_Capable + { + get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_CAP_0x80) != 0; } + set { throw new NotImplementedException(); } + } + public int bfHW_EngineID + { + get { return (gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_ENGINE_ID_MASK_0x70) >> 4; } + set { throw new NotImplementedException(); } + } + public int bfI2C_LineMux + { + get { return gpio_id & (Byte)atom_gpio_pin_assignment_gpio_id.I2C_HW_LANE_MUX_0x0F; } + set { throw new NotImplementedException(); } + } + public string Description + { + get { return ((atom_gpio_pin_assignment_gpio_id)gpio_id).ToString(); } + set { throw new NotImplementedException(); } + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_I2C_SHIFTED_SLAVE_ADDRESS + { + public Byte shifted_i2c_slave_addr; + /* //Not sure if it actually shifted... + public int EffectiveSlaveAddr + { + get { return shifted_i2c_slave_addr >> 1; } + set { throw new NotImplementedException(); } + } + */ + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_i2c_voltage_object_v4_fields + { + public Byte regulator_id; //Indicate Voltage Regulator Id + public ATOM_GPIO_ROLE_I2C_ID i2c_id; + public ATOM_I2C_SHIFTED_SLAVE_ADDRESS i2c_slave_addr; + public Byte i2c_control_offset; + public Byte i2c_flag; // Bit0: 0 - One byte data; 1 - Two byte data + public Byte i2c_speed; // =0, use default i2c speed, otherwise use it in unit of kHz. + public Byte reserved_0xA; + public Byte reserved_0xB; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct FINAL_atom_i2c_data_entry + { + public UInt16 final_entry_index; + public static UInt16 ENDING_INDEX_VALUE => 0xff; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_i2c_data_entry + { + public UInt16 i2c_reg_index; // i2c register address, can be up to 16bit + public UInt16 i2c_reg_data; // i2c register data, can be up to 16bit + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_voltage_gpio_map_lut + { + public UInt32 voltage_gpio_reg_val; // The Voltage ID which is used to program GPIO register + public UInt16 voltage_level_mv; // The corresponding Voltage Value, in mV + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_gpio_voltage_object_v4_fields + { + public Byte gpio_control_id; // default is 0 which indicate control through CG VID mode + public Byte gpio_entry_num; // indiate the entry numbers of Votlage/Gpio value Look up table + public Byte phase_delay_us; // phase delay in unit of micro second + public Byte reserved; + public UInt32 gpio_mask_val; // GPIO Mask value + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct atom_voltage_object_header_v4 + { + public atom_voltage_type ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI + public atom_voltage_object_mode ucVoltageMode; //Indicate voltage control mode: Init/Set/Leakage/Set phase + public UInt16 usSize; //Size of Object + //actual fields depens on ucVoltageMode + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VOLTAGE_OBJECT_INFO_V3_1 + { + public ATOM_COMMON_TABLE_HEADER sHeader; + //ATOM_VOLTAGE_OBJECT_V3 asVoltageObj[3]; //Info for Voltage control + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_GPIO_I2C_ASSIGMENT + { + public UInt16 usClkMaskRegisterIndex; + public UInt16 usClkEnRegisterIndex; + public UInt16 usClkY_RegisterIndex; + public UInt16 usClkA_RegisterIndex; + public UInt16 usDataMaskRegisterIndex; + public UInt16 usDataEnRegisterIndex; + public UInt16 usDataY_RegisterIndex; + public UInt16 usDataA_RegisterIndex; + public ATOM_GPIO_ROLE_I2C_ID sucI2cId; + public Byte ucClkMaskShift; + public Byte ucClkEnShift; + public Byte ucClkY_Shift; + public Byte ucClkA_Shift; + public Byte ucDataMaskShift; + public Byte ucDataEnShift; + public Byte ucDataY_Shift; + public Byte ucDataA_Shift; + public Byte ucReserved1; + public Byte ucReserved2; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_GPIO_I2C_INFO + { + public ATOM_COMMON_TABLE_HEADER sHeader; + //ATOM_GPIO_I2C_ASSIGMENT asGPIO_Info[16]; + }; + + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VRAM_TIMING_ENTRY + { + public UInt32 ulClkRange; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x30)] + [XmlIgnore] public Byte[] ucLatency; + public string LatencyString + { + get + { + return ByteArrayToString(ucLatency); + } + set + { + throw new NotImplementedException(); + } + } + + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VRAM_ENTRY + { + public UInt32 ulChannelMapCfg; + public UInt16 usModuleSize; + public UInt16 usMcRamCfg; + public UInt16 usEnableChannels; + public Byte ucExtMemoryID; + public Byte ucMemoryType; + public Byte ucChannelNum; + public Byte ucChannelWidth; + public Byte ucDensity; + public Byte ucBankCol; + public Byte ucMisc; + public Byte ucVREFI; + public UInt16 usReserved; + public UInt16 usMemorySize; + public Byte ucMcTunningSetId; + public Byte ucRowNum; + public UInt16 usEMRS2Value; + public UInt16 usEMRS3Value; + public Byte ucMemoryVenderID; + public Byte ucRefreshRateFactor; + public Byte ucFIFODepth; + public Byte ucCDR_Bandwidth; + public UInt32 ulChannelMapCfg1; + public UInt32 ulBankMapCfg; + public UInt32 ulReserved; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + [XmlIgnore] + public Byte[] strMemPNString; + public string FullName + { + get + { + return Encoding.UTF8.GetString(strMemPNString.TakeWhile(c => c != 0).ToArray()); + } + set + { + throw new NotImplementedException(); + } + } + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_VRAM_INFO + { + public ATOM_COMMON_TABLE_HEADER sHeader; + public UInt16 usMemAdjustTblOffset; + public UInt16 usMemClkPatchTblOffset; + public UInt16 usMcAdjustPerTileTblOffset; + public UInt16 usMcPhyInitTableOffset; + public UInt16 usDramDataRemapTblOffset; + public UInt16 usReserved1; + public Byte ucNumOfVRAMModule; + public Byte ucMemoryClkPatchTblVer; + public Byte ucVramModuleVer; + public Byte ucMcPhyTileNum; + // public ATOM_VRAM_ENTRY aVramInfo[ucNumOfVRAMModule]; + } + + class ConsecutiveReader + { + public static ConsecutiveReader From(ConsecutiveReader other) + { + return new ConsecutiveReader(other.buffer.Array, other.buffer.Offset, other.editor); + } + + public ConsecutiveReader(Byte[] entire_buffer, int offset, PolarisBiosEditor a_editor) + { + buffer = new ArraySegment(entire_buffer); + editor = a_editor; + Jump(offset); + } + public T Read() + { + T obj = default(T); + int size = Marshal.SizeOf(obj); + IntPtr ptr = Marshal.AllocHGlobal(size); + + Marshal.Copy(buffer.Array, buffer.Offset, ptr, size); + obj = (T)Marshal.PtrToStructure(ptr, obj.GetType()); + Marshal.FreeHGlobal(ptr); + + return obj; + } + public T ReadPrint(string name = "") + { + T result = Read(); + int size = Marshal.SizeOf(typeof(T)); + if (!string.IsNullOrWhiteSpace(name)) + { + name = " Name=" + name; + } + editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len=0x{2:X}={2}{3}", buffer.Offset, buffer.Offset + size, size, name)); + return result; + } + public void Jump1Structure() + { + Jump(Marshal.SizeOf()); + } + + public void Jump(int relative_offset) + { + int offset = buffer.Offset + relative_offset; + buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); + } + public void JumpPrintExtra(int relative_offset) + { + int done_size = Marshal.SizeOf(); + if (done_size < relative_offset) + { + editor.Print(string.Format("Extra at 0x{0:x}:", buffer.Offset + done_size) + ByteArrayToString(buffer.Skip(done_size).Take(relative_offset - done_size).ToArray())); + } + Jump(relative_offset); + } + public ArraySegment buffer; + public PolarisBiosEditor editor; + } + [STAThread] + static void Main(string[] args) + { + PolarisBiosEditor pbe = new PolarisBiosEditor(); + Application.Run(pbe); + } + + static byte[] getBytes(object obj) + { + int size = Marshal.SizeOf(obj); + byte[] arr = new byte[size]; + IntPtr ptr = Marshal.AllocHGlobal(size); + + Marshal.StructureToPtr(obj, ptr, true); + Marshal.Copy(ptr, arr, 0, size); + Marshal.FreeHGlobal(ptr); + + return arr; + } + + T fromBytes(byte[] arr) + { + return new ConsecutiveReader(arr, 0, this).Read(); + } + + public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) + { + for (var i = 0; i < src.Length; i++) + { + dest[ptr + i] = src[i]; + } + } + + public void Print(object output, string desc_name = "", string desc = "") + { + try + { + if (output.GetType().IsPrimitive || output.GetType() == typeof(string)) + { + var s = output.ToString(); + if (!string.IsNullOrWhiteSpace(desc_name)) + { + s = desc_name + "=" + desc + " " + s; + } + Console.WriteLine(s); + } + else + { + //Create our own namespaces for the output + var ns = new XmlSerializerNamespaces(); + var xs = new XmlSerializer(output.GetType()); + + //Add an empty namespace and empty value + ns.Add("", ""); + + var doc = new XDocument(); + using (var writer = doc.CreateWriter()) + { + xs.Serialize(writer, output, ns); + } + foreach (var e in doc.Descendants()) + { + if (e.Elements().Any()) continue; + if (Int64.TryParse(e.Value, out Int64 parsed) && parsed != 0 && parsed != 1) + { + e.Value = string.Format("{0} = 0x{0:X} = 0b{1}", parsed, Convert.ToString(parsed, 2)); + } + } + if (!string.IsNullOrWhiteSpace(desc)) + { + doc.Root.Add(new XAttribute(desc_name, desc)); + } + Console.WriteLine(doc); + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + private ListViewItem handler; + + private void listView_ChangeSelection(object sender, EventArgs e) + { + ListView lb = sender as ListView; + String sel_name = lb.SelectedItems[0].Text; + + for (var i = 0; i < lb.Items.Count; i++) + { + + ListViewItem container = lb.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + + if (name == sel_name) + { + editSubItem1.Text = name; + editSubItem2.Text = value; + handler = container; + } + + } + } + + private void apply_Click(object sender, EventArgs e) + { + if (handler != null) + { + handler.Text = editSubItem1.Text; + handler.SubItems[1].Text = editSubItem2.Text; + } + } + + public PolarisBiosEditor() + { + InitializeComponent(); + this.Text = this.programTitle + " " + this.version; + #if !DEBUG try { @@ -1080,1281 +1081,1281 @@ public PolarisBiosEditor() this.Text += " (offline mode)"; } #else - Console.WriteLine("This is a debug build, skipping update check."); + Console.WriteLine("This is a debug build, skipping update check."); #endif - Console.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console"); - - rc.Add("MT51J256M3", "MICRON-8G"); - rc.Add("EDW4032BAB", "ELPIDA-4G"); - rc.Add("H5GC4H24AJ", "HYNIX_1-4G"); - rc.Add("H5GQ4H24AJ", "HYNIX_2-4G"); - rc.Add("H5GQ8H24MJ", "HYNIX_2-8G"); - rc.Add("H5GC8H24MJ", "HYNIX_3-8G"); - rc.Add("H5GC8H24AJ", "HYNIX_4-8G"); - rc.Add("K4G80325FB", "SAMSUNG-B-8G"); - rc.Add("K4G41325FE", "SAMSUNG-E-4G"); - rc.Add("K4G41325FC", "SAMSUNG-C-4G"); - rc.Add("K4G41325FS", "SAMSUNG-S-4G"); - rc.Add("K4G80325FC", "SAMSUNG4-C-8G"); - - save.Enabled = false; - boxROM.Enabled = false; - boxPOWERPLAY.Enabled = false; - boxPOWERTUNE.Enabled = false; - boxFAN.Enabled = false; - boxGPU.Enabled = false; - boxMEM.Enabled = false; - boxVRAM.Enabled = false; - - tableVRAM.MouseClick += new MouseEventHandler(listView_ChangeSelection); - tableVRAM_TIMING.MouseClick += new MouseEventHandler(listView_ChangeSelection); - tableMEMORY.MouseClick += new MouseEventHandler(listView_ChangeSelection); - tableGPU.MouseClick += new MouseEventHandler(listView_ChangeSelection); - tableFAN.MouseClick += new MouseEventHandler(listView_ChangeSelection); - tablePOWERTUNE.MouseClick += new MouseEventHandler(listView_ChangeSelection); - tablePOWERPLAY.MouseClick += new MouseEventHandler(listView_ChangeSelection); - tableROM.MouseClick += new MouseEventHandler(listView_ChangeSelection); - - } - - private void PolarisBiosEditor_Load(object sender, EventArgs e) - { - - } - - private void editSubItem2_Click(object sender, EventArgs e) - { - MouseEventArgs me = (MouseEventArgs)e; - if (me.Button == MouseButtons.Right) - { - if (editSubItem2.Text.Length == 96) - { - byte[] decode = StringToByteArray(editSubItem2.Text); - MessageBox.Show("Decode Memory Timings " + decode + " / not implemented yet!"); - } - } - } - - private void OpenFileDialog_Click(object sender, EventArgs e) - { - OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "BIOS (.rom)|*.rom|All Files (*.*)|*.*"; - openFileDialog.FilterIndex = 1; - openFileDialog.Multiselect = false; - - if (openFileDialog.ShowDialog() == DialogResult.OK) - { - save.Enabled = false; - - tableROM.Items.Clear(); - tablePOWERPLAY.Items.Clear(); - tablePOWERTUNE.Items.Clear(); - tableFAN.Items.Clear(); - tableGPU.Items.Clear(); - tableMEMORY.Items.Clear(); - tableVRAM.Items.Clear(); - tableVRAM_TIMING.Items.Clear(); - - this.Text = this.programTitle + " " + this.version + " - " + "[" + openFileDialog.SafeFileName + "]"; - - System.IO.Stream fileStream = openFileDialog.OpenFile(); - if ((fileStream.Length != 524288) && (fileStream.Length != 524288 / 2)) - { - MessageBox.Show("This BIOS is non standard size.\nFlashing this BIOS may corrupt your graphics card.", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - using (BinaryReader br = new BinaryReader(fileStream)) - { - buffer = br.ReadBytes((int)fileStream.Length); - - atom_rom_header_offset = getValueAtPosition(16, ATOM_ROM_HEADER_PTR); - atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); - string vendorId = atom_rom_header.usVendorID.ToString("X"); - fixChecksum(false); - - String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); - if (!firmwareSignature.Equals("ATOM")) - { - MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); - } - - if (!supportedID.Contains(vendorId)) - { - MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); - - ReadPrintTable(atom_data_table.GPIO_I2C_Info, - (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), - i2c_assigment => Marshal.SizeOf(i2c_assigment) - ); - - atom_powerplay_offset = atom_data_table.PowerPlayInfo; - atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); - - atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; - atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); - atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; - for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) - { - atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } - - var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; - var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); - for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) - { - Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } - - atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; - atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); - atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; - for (var i = 0; i < atom_sclk_entries.Length; i++) - { - atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); - } - - atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; - atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); - atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; - for (var i = 0; i < atom_mclk_entries.Length; i++) - { - atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); - } - - var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; - var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); - for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) - { - Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); - } - - atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; - atom_fan_table = Reader(atom_fan_offset).ReadPrint(); - - atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; - atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); - Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); - - var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - - ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); - Print("Connectors:"); - ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Encoders:"); - ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Routers:"); - ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - - atom_vram_info_offset = atom_data_table.VRAM_Info; - atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); - atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; - var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); - atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); - } - - atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; - atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; - for (var i = 0; i < MAX_VRAM_ENTRIES; i++) - { - atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); - - // atom_vram_timing_entries have an undetermined length - // attempt to determine the last entry in the array - if (atom_vram_timing_entries[i].ulClkRange == 0) - { - Array.Resize(ref atom_vram_timing_entries, i); - break; - } - } - - var used_volt_obffset = 0; - - ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, - (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), - (volt_object_header, reader) => - { - used_volt_obffset += volt_object_header.usSize; - if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) - { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - while(detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) - { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); - } - ConsecutiveReader.From(detailed_reader).ReadPrint(); - } - else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) - { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - var gpio_voltage_fields = specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) - { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); - } - } - reader.Jump(volt_object_header.usSize); - } - ); - - StringBuilder bios_bootup_builder = new StringBuilder(); - - Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; - while (ptr != -1) - { - Char c = (Char)buffer[ptr]; - if (c == '\0') - { - ptr = -1; - } - else if (c == '\n' || c == '\r') - { - ptr++; - } - else - { - bios_bootup_builder.Append(c); - ptr++; - } - } - - BIOS_BootupMessage = bios_bootup_builder.ToString(); - - txtBIOSBootupMessage.Text = BIOS_BootupMessage; - txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; - + Console.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console"); + + rc.Add("MT51J256M3", "MICRON-8G"); + rc.Add("EDW4032BAB", "ELPIDA-4G"); + rc.Add("H5GC4H24AJ", "HYNIX_1-4G"); + rc.Add("H5GQ4H24AJ", "HYNIX_2-4G"); + rc.Add("H5GQ8H24MJ", "HYNIX_2-8G"); + rc.Add("H5GC8H24MJ", "HYNIX_3-8G"); + rc.Add("H5GC8H24AJ", "HYNIX_4-8G"); + rc.Add("K4G80325FB", "SAMSUNG-B-8G"); + rc.Add("K4G41325FE", "SAMSUNG-E-4G"); + rc.Add("K4G41325FC", "SAMSUNG-C-4G"); + rc.Add("K4G41325FS", "SAMSUNG-S-4G"); + rc.Add("K4G80325FC", "SAMSUNG4-C-8G"); + + save.Enabled = false; + boxROM.Enabled = false; + boxPOWERPLAY.Enabled = false; + boxPOWERTUNE.Enabled = false; + boxFAN.Enabled = false; + boxGPU.Enabled = false; + boxMEM.Enabled = false; + boxVRAM.Enabled = false; + + tableVRAM.MouseClick += new MouseEventHandler(listView_ChangeSelection); + tableVRAM_TIMING.MouseClick += new MouseEventHandler(listView_ChangeSelection); + tableMEMORY.MouseClick += new MouseEventHandler(listView_ChangeSelection); + tableGPU.MouseClick += new MouseEventHandler(listView_ChangeSelection); + tableFAN.MouseClick += new MouseEventHandler(listView_ChangeSelection); + tablePOWERTUNE.MouseClick += new MouseEventHandler(listView_ChangeSelection); + tablePOWERPLAY.MouseClick += new MouseEventHandler(listView_ChangeSelection); + tableROM.MouseClick += new MouseEventHandler(listView_ChangeSelection); + + } + + private void PolarisBiosEditor_Load(object sender, EventArgs e) + { + + } + + private void editSubItem2_Click(object sender, EventArgs e) + { + MouseEventArgs me = (MouseEventArgs)e; + if (me.Button == MouseButtons.Right) + { + if (editSubItem2.Text.Length == 96) + { + byte[] decode = StringToByteArray(editSubItem2.Text); + MessageBox.Show("Decode Memory Timings " + decode + " / not implemented yet!"); + } + } + } + + private void OpenFileDialog_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Filter = "BIOS (.rom)|*.rom|All Files (*.*)|*.*"; + openFileDialog.FilterIndex = 1; + openFileDialog.Multiselect = false; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + save.Enabled = false; + + tableROM.Items.Clear(); + tablePOWERPLAY.Items.Clear(); + tablePOWERTUNE.Items.Clear(); + tableFAN.Items.Clear(); + tableGPU.Items.Clear(); + tableMEMORY.Items.Clear(); + tableVRAM.Items.Clear(); + tableVRAM_TIMING.Items.Clear(); + + this.Text = this.programTitle + " " + this.version + " - " + "[" + openFileDialog.SafeFileName + "]"; + + System.IO.Stream fileStream = openFileDialog.OpenFile(); + if ((fileStream.Length != 524288) && (fileStream.Length != 524288 / 2)) + { + MessageBox.Show("This BIOS is non standard size.\nFlashing this BIOS may corrupt your graphics card.", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + using (BinaryReader br = new BinaryReader(fileStream)) + { + buffer = br.ReadBytes((int)fileStream.Length); + + atom_rom_header_offset = getValueAtPosition(16, ATOM_ROM_HEADER_PTR); + atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); + string vendorId = atom_rom_header.usVendorID.ToString("X"); + fixChecksum(false); + + String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); + if (!firmwareSignature.Equals("ATOM")) + { + MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); + } + + if (!supportedID.Contains(vendorId)) + { + MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); + + ReadPrintTable(atom_data_table.GPIO_I2C_Info, + (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), + i2c_assigment => Marshal.SizeOf(i2c_assigment) + ); + + atom_powerplay_offset = atom_data_table.PowerPlayInfo; + atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); + + atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; + atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); + atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; + for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + { + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } + + var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; + var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); + for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) + { + Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } + + atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; + atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); + atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; + for (var i = 0; i < atom_sclk_entries.Length; i++) + { + atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); + } + + atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; + atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); + atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; + for (var i = 0; i < atom_mclk_entries.Length; i++) + { + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + } + + var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; + var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); + for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) + { + Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + } + + atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; + atom_fan_table = Reader(atom_fan_offset).ReadPrint(); + + atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; + atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); + Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); + + var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); + + ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + Print("Connectors:"); + ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Encoders:"); + ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Routers:"); + ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + + atom_vram_info_offset = atom_data_table.VRAM_Info; + atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); + atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; + var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); + atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); + } + + atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; + atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; + for (var i = 0; i < MAX_VRAM_ENTRIES; i++) + { + atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + + // atom_vram_timing_entries have an undetermined length + // attempt to determine the last entry in the array + if (atom_vram_timing_entries[i].ulClkRange == 0) + { + Array.Resize(ref atom_vram_timing_entries, i); + break; + } + } + + var used_volt_obffset = 0; + + ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, + (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), + (volt_object_header, reader) => + { + used_volt_obffset += volt_object_header.usSize; + if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) + { + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + while (detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) + { + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); + } + ConsecutiveReader.From(detailed_reader).ReadPrint(); + } + else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) + { + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + var gpio_voltage_fields = specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) + { + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); + } + } + reader.Jump(volt_object_header.usSize); + } + ); + + StringBuilder bios_bootup_builder = new StringBuilder(); + + Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; + while (ptr != -1) + { + Char c = (Char)buffer[ptr]; + if (c == '\0') + { + ptr = -1; + } + else if (c == '\n' || c == '\r') + { + ptr++; + } + else + { + bios_bootup_builder.Append(c); + ptr++; + } + } + + BIOS_BootupMessage = bios_bootup_builder.ToString(); + + txtBIOSBootupMessage.Text = BIOS_BootupMessage; + txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; + tableROM.Items.Add(new ListViewItem(new string[] { "BootupMessageOffset", "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") - } - )); + } + )); tableROM.Items.Add(new ListViewItem(new string[] { "VendorID", "0x" + atom_rom_header.usVendorID.ToString ("X") - } - )); + } + )); tableROM.Items.Add(new ListViewItem(new string[] { "DeviceID", "0x" + atom_rom_header.usDeviceID.ToString ("X") - } - )); + } + )); tableROM.Items.Add(new ListViewItem(new string[] { "Sub ID", "0x" + atom_rom_header.usSubsystemID.ToString ("X") - } - )); + } + )); tableROM.Items.Add(new ListViewItem(new string[] { "Sub VendorID", "0x" + atom_rom_header.usSubsystemVendorID.ToString ("X") - } - )); + } + )); tableROM.Items.Add(new ListViewItem(new string[] { "Firmware Signature", //"0x" + atom_rom_header.uaFirmWareSignature.ToString ("X") new string(atom_rom_header.uaFirmWareSignature) - } - )); - - tablePOWERPLAY.Items.Clear(); + } + )); + + tablePOWERPLAY.Items.Clear(); tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Max GPU Freq. (MHz)", Convert.ToString (atom_powerplay_table.ulMaxODEngineClock / 100) - } - )); + } + )); tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Max Memory Freq. (MHz)", Convert.ToString (atom_powerplay_table.ulMaxODMemoryClock / 100) - } - )); + } + )); tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Power Control Limit (%)", Convert.ToString (atom_powerplay_table.usPowerControlLimit) - } - )); - - tablePOWERTUNE.Items.Clear(); + } + )); + + tablePOWERTUNE.Items.Clear(); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "TDP (W)", Convert.ToString (atom_powertune_table.usTDP) - } - )); + } + )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "TDC (A)", Convert.ToString (atom_powertune_table.usTDC) - } - )); + } + )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Max Power Limit (W)", Convert.ToString (atom_powertune_table.usMaximumPowerDeliveryLimit) - } - )); + } + )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Max Temp. (C)", Convert.ToString (atom_powertune_table.usTjMax) - } - )); + } + )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Shutdown Temp. (C)", Convert.ToString (atom_powertune_table.usSoftwareShutdownTemp) - } - )); + } + )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Hotspot Temp. (C)", Convert.ToString (atom_powertune_table.usTemperatureLimitHotspot) - } - )); + } + )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Clock Stretch Amount", Convert.ToString (atom_powertune_table.usClockStretchAmount) - } - )); - - tableFAN.Items.Clear(); + } + )); + + tableFAN.Items.Clear(); tableFAN.Items.Add(new ListViewItem(new string[] { "Temp. Hysteresis", Convert.ToString (atom_fan_table.ucTHyst) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Min Temp. (C)", Convert.ToString (atom_fan_table.usTMin / 100) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Med Temp. (C)", Convert.ToString (atom_fan_table.usTMed / 100) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "High Temp. (C)", Convert.ToString (atom_fan_table.usTHigh / 100) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Max Temp. (C)", Convert.ToString (atom_fan_table.usTMax / 100) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Target Temp. (C)", Convert.ToString (atom_fan_table.ucTargetTemperature) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Legacy or Fuzzy Fan Mode", Convert.ToString (atom_fan_table.ucFanControlMode) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Min PWM (%)", Convert.ToString (atom_fan_table.usPWMMin / 100) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Med PWM (%)", Convert.ToString (atom_fan_table.usPWMMed / 100) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "High PWM (%)", Convert.ToString (atom_fan_table.usPWMHigh / 100) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Max PWM (%)", Convert.ToString (atom_fan_table.usFanPWMMax) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Max RPM", Convert.ToString (atom_fan_table.usFanRPMMax) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Sensitivity", Convert.ToString (atom_fan_table.usFanOutputSensitivity) - } - )); + } + )); tableFAN.Items.Add(new ListViewItem(new string[] { "Acoustic Limit (MHz)", Convert.ToString (atom_fan_table.ulMinFanSCLKAcousticLimit / 100) - } - )); - - tableGPU.Items.Clear(); - for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) - { - tableGPU.Items.Add(new ListViewItem(new string[] { + } + )); + + tableGPU.Items.Clear(); + for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) + { + tableGPU.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_sclk_entries [i].ulSclk / 100), Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) - } - )); - } - - tableMEMORY.Items.Clear(); - for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) - { - tableMEMORY.Items.Add(new ListViewItem(new string[] { + } + )); + } + + tableMEMORY.Items.Clear(); + for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) + { + tableMEMORY.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_mclk_entries [i].ulMclk / 100), Convert.ToString (atom_mclk_entries [i].usVddci) - } - )); - } - - listVRAM.Items.Clear(); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - if (atom_vram_entries[i].strMemPNString[0] != 0) - { - var mem_id_full = atom_vram_entries[i].FullName; - var mem_id = mem_id_full.Substring(0, 10); - string mem_vendor; - if (rc.ContainsKey(mem_id)) - { - mem_vendor = rc[mem_id]; - } - else - { - mem_vendor = "UNKNOWN"; - } - - listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); - } - } - listVRAM.SelectedIndex = 0; - atom_vram_index = listVRAM.SelectedIndex; - - tableVRAM_TIMING.Items.Clear(); - for (var i = 0; i < atom_vram_timing_entries.Length; i++) - { - uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; - tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { + } + )); + } + + listVRAM.Items.Clear(); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + if (atom_vram_entries[i].strMemPNString[0] != 0) + { + var mem_id_full = atom_vram_entries[i].FullName; + var mem_id = mem_id_full.Substring(0, 10); + string mem_vendor; + if (rc.ContainsKey(mem_id)) + { + mem_vendor = rc[mem_id]; + } + else + { + mem_vendor = "UNKNOWN"; + } + + listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); + } + } + listVRAM.SelectedIndex = 0; + atom_vram_index = listVRAM.SelectedIndex; + + tableVRAM_TIMING.Items.Clear(); + for (var i = 0; i < atom_vram_timing_entries.Length; i++) + { + uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; + tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, atom_vram_timing_entries [i].LatencyString - } - )); - } - - save.Enabled = true; - boxROM.Enabled = true; - boxPOWERPLAY.Enabled = true; - boxPOWERTUNE.Enabled = true; - boxFAN.Enabled = true; - boxGPU.Enabled = true; - boxMEM.Enabled = true; - boxVRAM.Enabled = true; - } - fileStream.Close(); - - } - tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - tableFAN.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tableFAN.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - tablePOWERPLAY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tablePOWERPLAY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - tableGPU.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tableGPU.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - tablePOWERTUNE.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tablePOWERTUNE.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - tableMEMORY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tableMEMORY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - tableVRAM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tableVRAM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - } - - private int PrintAndReturnLen(ATOM_OBJECT o) - { - if (o.usRecordOffset != 0) - { - var reader = Reader(atom_data_table.Object_Header + o.usRecordOffset); - while(true) - { - var first = reader.buffer.First(); - if (first == 0 || first == 255) - { - break; - } - if (reader.buffer.Skip(1).First() < 2) - { - break; - } - var rec = reader.ReadPrint(); - reader.JumpPrintExtra(rec.ucRecordSize); - } - } - return Marshal.SizeOf(o); - } - private void ReadPrintTableDetailed(int offset, Func continue_parse, Action> next_jumper) - { - var table_reader = Reader(offset); - var table = table_reader.ReadPrint(); - table_reader.Jump1Structure(); - var object_reader = ConsecutiveReader.From(table_reader); - for (var i = 0; continue_parse(table, i); i++) - { - var atom_object = object_reader.ReadPrint(); - next_jumper(atom_object, object_reader); - } - } - - private void ReadPrintTable(int offset, Func continue_parse, Func entry_size) - { - ReadPrintTableDetailed(offset, continue_parse, (atom_object, object_reader) => object_reader.Jump(entry_size(atom_object))); - } - - private void ReadPrintObjectTable(UInt16 offset, Func entry_count, Func entry_size) - { - if (offset == 0) - { - Print("Table not present:" + typeof(TTable).Name); - return; - } - ReadPrintTable(atom_data_table.Object_Header + offset, (table, i) => (i < entry_count(table)), entry_size); - } - - ConsecutiveReader Reader(int offset) - { - return new ConsecutiveReader(buffer, offset, this); - } - - public Int32 getValueAtPosition(int bits, int position, bool isFrequency = false) - { - int value = 0; - if (position <= buffer.Length - 4) - { - switch (bits) - { - case 8: - default: - value = buffer[position]; - break; - case 16: - value = (buffer[position + 1] << 8) | buffer[position]; - break; - case 24: - value = (buffer[position + 2] << 16) | (buffer[position + 1] << 8) | buffer[position]; - break; - case 32: - value = (buffer[position + 3] << 24) | (buffer[position + 2] << 16) | (buffer[position + 1] << 8) | buffer[position]; - break; - } - if (isFrequency) - return value / 100; - return value; - } - return -1; - } - - public bool setValueAtPosition(int value, int bits, int position, bool isFrequency = false) - { - if (isFrequency) - value *= 100; - if (position <= buffer.Length - 4) - { - switch (bits) - { - case 8: - default: - buffer[position] = (byte)value; - break; - case 16: - buffer[position] = (byte)value; - buffer[position + 1] = (byte)(value >> 8); - break; - case 24: - buffer[position] = (byte)value; - buffer[position + 1] = (byte)(value >> 8); - buffer[position + 2] = (byte)(value >> 16); - break; - case 32: - buffer[position] = (byte)value; - buffer[position + 1] = (byte)(value >> 8); - buffer[position + 2] = (byte)(value >> 16); - buffer[position + 3] = (byte)(value >> 32); - break; - } - return true; - } - return false; - } - - private bool setValueAtPosition(String text, int bits, int position, bool isFrequency = false) - { - int value = 0; - if (!int.TryParse(text, out value)) - { - return false; - } - return setValueAtPosition(value, bits, position, isFrequency); - } - - private void SaveFileDialog_Click(object sender, EventArgs e) - { - SaveFileDialog SaveFileDialog = new SaveFileDialog(); - SaveFileDialog.Title = "Save As"; - SaveFileDialog.Filter = "BIOS (*.rom)|*.rom"; - - if (SaveFileDialog.ShowDialog() == DialogResult.OK) - { - FileStream fs = new FileStream(SaveFileDialog.FileName, FileMode.Create); - BinaryWriter bw = new BinaryWriter(fs); - - for (var i = 0; i < tableROM.Items.Count; i++) - { - ListViewItem container = tableROM.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - - if (name == "VendorID") - { - var num = (int)int32.ConvertFromString(value); - atom_rom_header.usVendorID = (UInt16)num; - } - else if (name == "DeviceID") - { - var num = (int)int32.ConvertFromString(value); - atom_rom_header.usDeviceID = (UInt16)num; - } - else if (name == "Sub ID") - { - var num = (int)int32.ConvertFromString(value); - atom_rom_header.usSubsystemID = (UInt16)num; - } - else if (name == "Sub VendorID") - { - var num = (int)int32.ConvertFromString(value); - atom_rom_header.usSubsystemVendorID = (UInt16)num; - } - else if (name == "Firmware Signature") - { - atom_rom_header.uaFirmWareSignature = value.ToCharArray(); - } - } - - for (var i = 0; i < tablePOWERPLAY.Items.Count; i++) - { - ListViewItem container = tablePOWERPLAY.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - var num = (int)int32.ConvertFromString(value); - - if (name == "Max GPU Freq. (MHz)") - { - atom_powerplay_table.ulMaxODEngineClock = (UInt32)(num * 100); - } - else if (name == "Max Memory Freq. (MHz)") - { - atom_powerplay_table.ulMaxODMemoryClock = (UInt32)(num * 100); - } - else if (name == "Power Control Limit (%)") - { - atom_powerplay_table.usPowerControlLimit = (UInt16)num; - } - } - - for (var i = 0; i < tablePOWERTUNE.Items.Count; i++) - { - ListViewItem container = tablePOWERTUNE.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - var num = (int)int32.ConvertFromString(value); - - if (name == "TDP (W)") - { - atom_powertune_table.usTDP = (UInt16)num; - } - else if (name == "TDC (A)") - { - atom_powertune_table.usTDC = (UInt16)num; - } - else if (name == "Max Power Limit (W)") - { - atom_powertune_table.usMaximumPowerDeliveryLimit = (UInt16)num; - } - else if (name == "Max Temp. (C)") - { - atom_powertune_table.usTjMax = (UInt16)num; - } - else if (name == "Shutdown Temp. (C)") - { - atom_powertune_table.usSoftwareShutdownTemp = (UInt16)num; - } - else if (name == "Hotspot Temp. (C)") - { - atom_powertune_table.usTemperatureLimitHotspot = (UInt16)num; - } - else if (name == "Clock Stretch Amount") - { - atom_powertune_table.usClockStretchAmount = (UInt16)num; - } - } - - for (var i = 0; i < tableFAN.Items.Count; i++) - { - ListViewItem container = tableFAN.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - var num = (int)int32.ConvertFromString(value); - - if (name == "Temp. Hysteresis") - { - atom_fan_table.ucTHyst = (Byte)num; - } - else if (name == "Min Temp. (C)") - { - atom_fan_table.usTMin = (UInt16)(num * 100); - } - else if (name == "Med Temp. (C)") - { - atom_fan_table.usTMed = (UInt16)(num * 100); - } - else if (name == "High Temp. (C)") - { - atom_fan_table.usTHigh = (UInt16)(num * 100); - } - else if (name == "Max Temp. (C)") - { - atom_fan_table.usTMax = (UInt16)(num * 100); - } - else if (name == "Target Temp. (C)") - { - atom_fan_table.ucTargetTemperature = (Byte)num; - } - else if (name == "Legacy or Fuzzy Fan Mode") - { - atom_fan_table.ucFanControlMode = (Byte)(num); - } - else if (name == "Min PWM (%)") - { - atom_fan_table.usPWMMin = (UInt16)(num * 100); - } - else if (name == "Med PWM (%)") - { - atom_fan_table.usPWMMed = (UInt16)(num * 100); - } - else if (name == "High PWM (%)") - { - atom_fan_table.usPWMHigh = (UInt16)(num * 100); - } - else if (name == "Max PWM (%)") - { - atom_fan_table.usFanPWMMax = (UInt16)num; - } - else if (name == "Max RPM") - { - atom_fan_table.usFanRPMMax = (UInt16)num; - } - else if (name == "Sensitivity") - { - atom_fan_table.usFanOutputSensitivity = (UInt16)num; - } - else if (name == "Acoustic Limit (MHz)") - { - atom_fan_table.ulMinFanSCLKAcousticLimit = (UInt32)(num * 100); - } - } - - for (var i = 0; i < tableGPU.Items.Count; i++) - { - ListViewItem container = tableGPU.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - var mhz = (int)int32.ConvertFromString(name) * 100; - var mv = (int)int32.ConvertFromString(value); - - atom_sclk_entries[i].ulSclk = (UInt32)mhz; - atom_vddc_entries[atom_sclk_entries[i].ucVddInd].usVdd = (UInt16)mv; - if (mv < 0xFF00) - { - atom_sclk_entries[i].usVddcOffset = 0; - } - } - - for (var i = 0; i < tableMEMORY.Items.Count; i++) - { - ListViewItem container = tableMEMORY.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - var mhz = (int)int32.ConvertFromString(name) * 100; - var mv = (int)int32.ConvertFromString(value); - - atom_mclk_entries[i].ulMclk = (UInt32)mhz; - //atom_mclk_entries[i].usVddci = (UInt16)mv;//usVddci assignment requires edits in several places - } - - updateVRAM_entries(); - for (var i = 0; i < tableVRAM_TIMING.Items.Count; i++) - { - ListViewItem container = tableVRAM_TIMING.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - var arr = StringToByteArray(value); - UInt32 mhz; - if (name.IndexOf(':') > 0) - { - mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') + 1)) * 100; - mhz += (UInt32)uint32.ConvertFromString(name.Substring(0, name.IndexOf(':'))) << 24; // table id - } - else - { - mhz = (UInt32)uint32.ConvertFromString(name) * 100; - } - atom_vram_timing_entries[i].ulClkRange = mhz; - atom_vram_timing_entries[i].ucLatency = arr; - } - - setBytesAtPosition(buffer, atom_rom_header_offset, getBytes(atom_rom_header)); - setBytesAtPosition(buffer, atom_powerplay_offset, getBytes(atom_powerplay_table)); - setBytesAtPosition(buffer, atom_powertune_offset, getBytes(atom_powertune_table)); - setBytesAtPosition(buffer, atom_fan_offset, getBytes(atom_fan_table)); - - for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) - { - setBytesAtPosition(buffer, atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i, getBytes(atom_mclk_entries[i])); - } - - for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) - { - setBytesAtPosition(buffer, atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i, getBytes(atom_sclk_entries[i])); - } - - for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) - { - setBytesAtPosition(buffer, atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i, getBytes(atom_vddc_entries[i])); - } - - var atom_vram_entry_offset = atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO)); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - setBytesAtPosition(buffer, atom_vram_entry_offset, getBytes(atom_vram_entries[i])); - atom_vram_entry_offset += atom_vram_entries[i].usModuleSize; - } - - atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; - for (var i = 0; i < atom_vram_timing_entries.Length; i++) - { - setBytesAtPosition(buffer, atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i, getBytes(atom_vram_timing_entries[i])); - } - - BIOS_BootupMessage = txtBIOSBootupMessage.Text.Substring(0, BIOS_BootupMessage.Length); - - setBytesAtPosition(buffer, atom_rom_header.usBIOS_BootupMessageOffset+2, Encoding.ASCII.GetBytes(BIOS_BootupMessage)); - fixChecksum(true); - bw.Write(buffer); - - fs.Close(); - bw.Close(); - } - } - - private void fixChecksum(bool save) - { - Byte checksum = buffer[ATOM_ROM_CHECKSUM_OFFSET]; - int size = buffer[0x02] * 512; - Byte offset = 0; - - for (int i = 0; i < size; i++) - { - offset += buffer[i]; - } - if (checksum == (buffer[ATOM_ROM_CHECKSUM_OFFSET] - offset)) - { - txtChecksum.ForeColor = Color.Green; - } - else if (!save) - { - txtChecksum.ForeColor = Color.Red; - MessageBox.Show("Invalid checksum - Save to fix!", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - if (save) - { - buffer[ATOM_ROM_CHECKSUM_OFFSET] -= offset; - txtChecksum.ForeColor = Color.Green; - } - txtChecksum.Text = "0x" + buffer[ATOM_ROM_CHECKSUM_OFFSET].ToString("X"); - } - - public static string ByteArrayToString(byte[] ba) - { - string hex = BitConverter.ToString(ba); - return hex.Replace("-", ""); - } - - public static byte[] StringToByteArray(String hex) - { - if (hex.Length % 2 != 0) - { - MessageBox.Show("Invalid hex string", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - throw new InvalidDataException(); - } - byte[] bytes = new byte[hex.Length / 2]; - for (int i = 0; i < hex.Length; i += 2) - { - bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); - } - return bytes; - } - - public void updateVRAM_entries() - { - for (var i = 0; i < tableVRAM.Items.Count; i++) - { - ListViewItem container = tableVRAM.Items[i]; - var name = container.Text; - var value = container.SubItems[1].Text; - var num = (int)int32.ConvertFromString(value); - - if (name == "VendorID") - { - atom_vram_entries[atom_vram_index].ucMemoryVenderID = (Byte)num; - } - else if (name == "Size (MB)") - { - atom_vram_entries[atom_vram_index].usMemorySize = (UInt16)num; - } - else if (name == "Density") - { - atom_vram_entries[atom_vram_index].ucDensity = (Byte)num; - } - else if (name == "Type") - { - atom_vram_entries[atom_vram_index].ucMemoryType = (Byte)num; - } - } - } - - private void listVRAM_SelectionChanged(object sender, EventArgs e) - { - updateVRAM_entries(); - tableVRAM.Items.Clear(); - if (listVRAM.SelectedIndex >= 0 && listVRAM.SelectedIndex < listVRAM.Items.Count) - { - atom_vram_index = listVRAM.SelectedIndex; + } + )); + } + + save.Enabled = true; + boxROM.Enabled = true; + boxPOWERPLAY.Enabled = true; + boxPOWERTUNE.Enabled = true; + boxFAN.Enabled = true; + boxGPU.Enabled = true; + boxMEM.Enabled = true; + boxVRAM.Enabled = true; + } + fileStream.Close(); + + } + tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + tableFAN.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tableFAN.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + tablePOWERPLAY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tablePOWERPLAY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + tableGPU.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tableGPU.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + tablePOWERTUNE.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tablePOWERTUNE.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + tableMEMORY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tableMEMORY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + tableVRAM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tableVRAM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + } + + private int PrintAndReturnLen(ATOM_OBJECT o) + { + if (o.usRecordOffset != 0) + { + var reader = Reader(atom_data_table.Object_Header + o.usRecordOffset); + while (true) + { + var first = reader.buffer.First(); + if (first == 0 || first == 255) + { + break; + } + if (reader.buffer.Skip(1).First() < 2) + { + break; + } + var rec = reader.ReadPrint(); + reader.JumpPrintExtra(rec.ucRecordSize); + } + } + return Marshal.SizeOf(o); + } + private void ReadPrintTableDetailed(int offset, Func continue_parse, Action> next_jumper) + { + var table_reader = Reader(offset); + var table = table_reader.ReadPrint(); + table_reader.Jump1Structure(); + var object_reader = ConsecutiveReader.From(table_reader); + for (var i = 0; continue_parse(table, i); i++) + { + var atom_object = object_reader.ReadPrint(); + next_jumper(atom_object, object_reader); + } + } + + private void ReadPrintTable(int offset, Func continue_parse, Func entry_size) + { + ReadPrintTableDetailed(offset, continue_parse, (atom_object, object_reader) => object_reader.Jump(entry_size(atom_object))); + } + + private void ReadPrintObjectTable(UInt16 offset, Func entry_count, Func entry_size) + { + if (offset == 0) + { + Print("Table not present:" + typeof(TTable).Name); + return; + } + ReadPrintTable(atom_data_table.Object_Header + offset, (table, i) => (i < entry_count(table)), entry_size); + } + + ConsecutiveReader Reader(int offset) + { + return new ConsecutiveReader(buffer, offset, this); + } + + public Int32 getValueAtPosition(int bits, int position, bool isFrequency = false) + { + int value = 0; + if (position <= buffer.Length - 4) + { + switch (bits) + { + case 8: + default: + value = buffer[position]; + break; + case 16: + value = (buffer[position + 1] << 8) | buffer[position]; + break; + case 24: + value = (buffer[position + 2] << 16) | (buffer[position + 1] << 8) | buffer[position]; + break; + case 32: + value = (buffer[position + 3] << 24) | (buffer[position + 2] << 16) | (buffer[position + 1] << 8) | buffer[position]; + break; + } + if (isFrequency) + return value / 100; + return value; + } + return -1; + } + + public bool setValueAtPosition(int value, int bits, int position, bool isFrequency = false) + { + if (isFrequency) + value *= 100; + if (position <= buffer.Length - 4) + { + switch (bits) + { + case 8: + default: + buffer[position] = (byte)value; + break; + case 16: + buffer[position] = (byte)value; + buffer[position + 1] = (byte)(value >> 8); + break; + case 24: + buffer[position] = (byte)value; + buffer[position + 1] = (byte)(value >> 8); + buffer[position + 2] = (byte)(value >> 16); + break; + case 32: + buffer[position] = (byte)value; + buffer[position + 1] = (byte)(value >> 8); + buffer[position + 2] = (byte)(value >> 16); + buffer[position + 3] = (byte)(value >> 32); + break; + } + return true; + } + return false; + } + + private bool setValueAtPosition(String text, int bits, int position, bool isFrequency = false) + { + int value = 0; + if (!int.TryParse(text, out value)) + { + return false; + } + return setValueAtPosition(value, bits, position, isFrequency); + } + + private void SaveFileDialog_Click(object sender, EventArgs e) + { + SaveFileDialog SaveFileDialog = new SaveFileDialog(); + SaveFileDialog.Title = "Save As"; + SaveFileDialog.Filter = "BIOS (*.rom)|*.rom"; + + if (SaveFileDialog.ShowDialog() == DialogResult.OK) + { + FileStream fs = new FileStream(SaveFileDialog.FileName, FileMode.Create); + BinaryWriter bw = new BinaryWriter(fs); + + for (var i = 0; i < tableROM.Items.Count; i++) + { + ListViewItem container = tableROM.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + + if (name == "VendorID") + { + var num = (int)int32.ConvertFromString(value); + atom_rom_header.usVendorID = (UInt16)num; + } + else if (name == "DeviceID") + { + var num = (int)int32.ConvertFromString(value); + atom_rom_header.usDeviceID = (UInt16)num; + } + else if (name == "Sub ID") + { + var num = (int)int32.ConvertFromString(value); + atom_rom_header.usSubsystemID = (UInt16)num; + } + else if (name == "Sub VendorID") + { + var num = (int)int32.ConvertFromString(value); + atom_rom_header.usSubsystemVendorID = (UInt16)num; + } + else if (name == "Firmware Signature") + { + atom_rom_header.uaFirmWareSignature = value.ToCharArray(); + } + } + + for (var i = 0; i < tablePOWERPLAY.Items.Count; i++) + { + ListViewItem container = tablePOWERPLAY.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + var num = (int)int32.ConvertFromString(value); + + if (name == "Max GPU Freq. (MHz)") + { + atom_powerplay_table.ulMaxODEngineClock = (UInt32)(num * 100); + } + else if (name == "Max Memory Freq. (MHz)") + { + atom_powerplay_table.ulMaxODMemoryClock = (UInt32)(num * 100); + } + else if (name == "Power Control Limit (%)") + { + atom_powerplay_table.usPowerControlLimit = (UInt16)num; + } + } + + for (var i = 0; i < tablePOWERTUNE.Items.Count; i++) + { + ListViewItem container = tablePOWERTUNE.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + var num = (int)int32.ConvertFromString(value); + + if (name == "TDP (W)") + { + atom_powertune_table.usTDP = (UInt16)num; + } + else if (name == "TDC (A)") + { + atom_powertune_table.usTDC = (UInt16)num; + } + else if (name == "Max Power Limit (W)") + { + atom_powertune_table.usMaximumPowerDeliveryLimit = (UInt16)num; + } + else if (name == "Max Temp. (C)") + { + atom_powertune_table.usTjMax = (UInt16)num; + } + else if (name == "Shutdown Temp. (C)") + { + atom_powertune_table.usSoftwareShutdownTemp = (UInt16)num; + } + else if (name == "Hotspot Temp. (C)") + { + atom_powertune_table.usTemperatureLimitHotspot = (UInt16)num; + } + else if (name == "Clock Stretch Amount") + { + atom_powertune_table.usClockStretchAmount = (UInt16)num; + } + } + + for (var i = 0; i < tableFAN.Items.Count; i++) + { + ListViewItem container = tableFAN.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + var num = (int)int32.ConvertFromString(value); + + if (name == "Temp. Hysteresis") + { + atom_fan_table.ucTHyst = (Byte)num; + } + else if (name == "Min Temp. (C)") + { + atom_fan_table.usTMin = (UInt16)(num * 100); + } + else if (name == "Med Temp. (C)") + { + atom_fan_table.usTMed = (UInt16)(num * 100); + } + else if (name == "High Temp. (C)") + { + atom_fan_table.usTHigh = (UInt16)(num * 100); + } + else if (name == "Max Temp. (C)") + { + atom_fan_table.usTMax = (UInt16)(num * 100); + } + else if (name == "Target Temp. (C)") + { + atom_fan_table.ucTargetTemperature = (Byte)num; + } + else if (name == "Legacy or Fuzzy Fan Mode") + { + atom_fan_table.ucFanControlMode = (Byte)(num); + } + else if (name == "Min PWM (%)") + { + atom_fan_table.usPWMMin = (UInt16)(num * 100); + } + else if (name == "Med PWM (%)") + { + atom_fan_table.usPWMMed = (UInt16)(num * 100); + } + else if (name == "High PWM (%)") + { + atom_fan_table.usPWMHigh = (UInt16)(num * 100); + } + else if (name == "Max PWM (%)") + { + atom_fan_table.usFanPWMMax = (UInt16)num; + } + else if (name == "Max RPM") + { + atom_fan_table.usFanRPMMax = (UInt16)num; + } + else if (name == "Sensitivity") + { + atom_fan_table.usFanOutputSensitivity = (UInt16)num; + } + else if (name == "Acoustic Limit (MHz)") + { + atom_fan_table.ulMinFanSCLKAcousticLimit = (UInt32)(num * 100); + } + } + + for (var i = 0; i < tableGPU.Items.Count; i++) + { + ListViewItem container = tableGPU.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + var mhz = (int)int32.ConvertFromString(name) * 100; + var mv = (int)int32.ConvertFromString(value); + + atom_sclk_entries[i].ulSclk = (UInt32)mhz; + atom_vddc_entries[atom_sclk_entries[i].ucVddInd].usVdd = (UInt16)mv; + if (mv < 0xFF00) + { + atom_sclk_entries[i].usVddcOffset = 0; + } + } + + for (var i = 0; i < tableMEMORY.Items.Count; i++) + { + ListViewItem container = tableMEMORY.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + var mhz = (int)int32.ConvertFromString(name) * 100; + var mv = (int)int32.ConvertFromString(value); + + atom_mclk_entries[i].ulMclk = (UInt32)mhz; + //atom_mclk_entries[i].usVddci = (UInt16)mv;//usVddci assignment requires edits in several places + } + + updateVRAM_entries(); + for (var i = 0; i < tableVRAM_TIMING.Items.Count; i++) + { + ListViewItem container = tableVRAM_TIMING.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + var arr = StringToByteArray(value); + UInt32 mhz; + if (name.IndexOf(':') > 0) + { + mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') + 1)) * 100; + mhz += (UInt32)uint32.ConvertFromString(name.Substring(0, name.IndexOf(':'))) << 24; // table id + } + else + { + mhz = (UInt32)uint32.ConvertFromString(name) * 100; + } + atom_vram_timing_entries[i].ulClkRange = mhz; + atom_vram_timing_entries[i].ucLatency = arr; + } + + setBytesAtPosition(buffer, atom_rom_header_offset, getBytes(atom_rom_header)); + setBytesAtPosition(buffer, atom_powerplay_offset, getBytes(atom_powerplay_table)); + setBytesAtPosition(buffer, atom_powertune_offset, getBytes(atom_powertune_table)); + setBytesAtPosition(buffer, atom_fan_offset, getBytes(atom_fan_table)); + + for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) + { + setBytesAtPosition(buffer, atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i, getBytes(atom_mclk_entries[i])); + } + + for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) + { + setBytesAtPosition(buffer, atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i, getBytes(atom_sclk_entries[i])); + } + + for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + { + setBytesAtPosition(buffer, atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i, getBytes(atom_vddc_entries[i])); + } + + var atom_vram_entry_offset = atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO)); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + setBytesAtPosition(buffer, atom_vram_entry_offset, getBytes(atom_vram_entries[i])); + atom_vram_entry_offset += atom_vram_entries[i].usModuleSize; + } + + atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; + for (var i = 0; i < atom_vram_timing_entries.Length; i++) + { + setBytesAtPosition(buffer, atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i, getBytes(atom_vram_timing_entries[i])); + } + + BIOS_BootupMessage = txtBIOSBootupMessage.Text.Substring(0, BIOS_BootupMessage.Length); + + setBytesAtPosition(buffer, atom_rom_header.usBIOS_BootupMessageOffset + 2, Encoding.ASCII.GetBytes(BIOS_BootupMessage)); + fixChecksum(true); + bw.Write(buffer); + + fs.Close(); + bw.Close(); + } + } + + private void fixChecksum(bool save) + { + Byte checksum = buffer[ATOM_ROM_CHECKSUM_OFFSET]; + int size = buffer[0x02] * 512; + Byte offset = 0; + + for (int i = 0; i < size; i++) + { + offset += buffer[i]; + } + if (checksum == (buffer[ATOM_ROM_CHECKSUM_OFFSET] - offset)) + { + txtChecksum.ForeColor = Color.Green; + } + else if (!save) + { + txtChecksum.ForeColor = Color.Red; + MessageBox.Show("Invalid checksum - Save to fix!", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + if (save) + { + buffer[ATOM_ROM_CHECKSUM_OFFSET] -= offset; + txtChecksum.ForeColor = Color.Green; + } + txtChecksum.Text = "0x" + buffer[ATOM_ROM_CHECKSUM_OFFSET].ToString("X"); + } + + public static string ByteArrayToString(byte[] ba) + { + string hex = BitConverter.ToString(ba); + return hex.Replace("-", ""); + } + + public static byte[] StringToByteArray(String hex) + { + if (hex.Length % 2 != 0) + { + MessageBox.Show("Invalid hex string", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw new InvalidDataException(); + } + byte[] bytes = new byte[hex.Length / 2]; + for (int i = 0; i < hex.Length; i += 2) + { + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); + } + return bytes; + } + + public void updateVRAM_entries() + { + for (var i = 0; i < tableVRAM.Items.Count; i++) + { + ListViewItem container = tableVRAM.Items[i]; + var name = container.Text; + var value = container.SubItems[1].Text; + var num = (int)int32.ConvertFromString(value); + + if (name == "VendorID") + { + atom_vram_entries[atom_vram_index].ucMemoryVenderID = (Byte)num; + } + else if (name == "Size (MB)") + { + atom_vram_entries[atom_vram_index].usMemorySize = (UInt16)num; + } + else if (name == "Density") + { + atom_vram_entries[atom_vram_index].ucDensity = (Byte)num; + } + else if (name == "Type") + { + atom_vram_entries[atom_vram_index].ucMemoryType = (Byte)num; + } + } + } + + private void listVRAM_SelectionChanged(object sender, EventArgs e) + { + updateVRAM_entries(); + tableVRAM.Items.Clear(); + if (listVRAM.SelectedIndex >= 0 && listVRAM.SelectedIndex < listVRAM.Items.Count) + { + atom_vram_index = listVRAM.SelectedIndex; tableVRAM.Items.Add(new ListViewItem(new string[] { "VendorID", "0x" + atom_vram_entries [atom_vram_index].ucMemoryVenderID.ToString ("X") - } - )); + } + )); tableVRAM.Items.Add(new ListViewItem(new string[] { "Size (MB)", Convert.ToString (atom_vram_entries [atom_vram_index].usMemorySize) - } - )); + } + )); tableVRAM.Items.Add(new ListViewItem(new string[] { "Density", "0x" + atom_vram_entries [atom_vram_index].ucDensity.ToString ("X") - } - )); + } + )); tableVRAM.Items.Add(new ListViewItem(new string[] { "Type", "0x" + atom_vram_entries [atom_vram_index].ucMemoryType.ToString ("X") - } - )); + } + )); tableVRAM.Items.Add(new ListViewItem(new string[] { "Num Of VRAM Module", atom_vram_info.ucNumOfVRAMModule.ToString ("X") - } - )); - } - } - - private void listVRAM_SelectedIndexChanged(object sender, EventArgs e) - { - - } - - private void apply_timings(int vendor_index, int timing_index) - { - for (var i = 0; i < tableVRAM_TIMING.Items.Count; i++) - { - ListViewItem container = tableVRAM_TIMING.Items[i]; - var name = container.Text; - UInt32 real_mhz = 0; - int mem_index = -1; - - if (name.IndexOf(':') > 0) - { - // get mem index - mem_index = (Int32)int32.ConvertFromString(name.Substring(0, 1)); - } - else - { - mem_index = 32768; - } - - real_mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') + 1)); - - if (real_mhz >= 1500 && (mem_index == vendor_index || mem_index == 32768)) - { - // set the timings - container.SubItems[1].Text = timings[timing_index]; - } - } - } - - private void apply_timings1(int vendor_index, int timing_index) - { - for (var i = 0; i < tableVRAM_TIMING.Items.Count; i++) - { - ListViewItem container = tableVRAM_TIMING.Items[i]; - var name = container.Text; - UInt32 real_mhz = 0; - int mem_index = -1; - - if (name.IndexOf(':') > 0) - { - // get mem index - mem_index = (Int32)int32.ConvertFromString(name.Substring(0, 1)); - } - else - { - mem_index = 32768; - } - - real_mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') + 1)); - - if (real_mhz >= 1750 && (mem_index == vendor_index || mem_index == 32768)) - { - // set the timings - container.SubItems[1].Text = timings[timing_index]; - } - } - } - - private void button1_Click(object sender, EventArgs e) - { - /* - int samsung_index = -1; - int micron_index = -1; - int elpida_index = -1; - int hynix_1_index = -1; - int hynix_2_index = -1; - int hynix_3_index = -1; - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - string mem_vendor; - if (atom_vram_entries[i].strMemPNString[0] != 0) - { - var mem_id = Encoding.UTF8.GetString(atom_vram_entries[i].strMemPNString).Substring(0, 10); - - if (rc.ContainsKey(mem_id)) - { - mem_vendor = rc[mem_id]; - } - else - { - mem_vendor = "UNKNOWN"; - } - - switch (mem_vendor) - { - case "SAMSUNG": - samsung_index = i; - break; - case "MICRON": - micron_index = i; - break; - case "ELPIDA": - elpida_index = i; - break; - case "HYNIX_1": - hynix_1_index = i; - break; - case "HYNIX_2": - hynix_2_index = i; - break; - case "HYNIX_3": - hynix_3_index = i; - break; - } - } - } - */ - int samsung_index = -1; - int samsung4_index = -1; - int micron_index = -1; - int elpida_index = -1; - int hynix_1_index = -1; - int hynix_2_index = -1; - int hynix_3_index = -1; - int hynix_4_index = -1; - for (int index = 0; index < (int)this.atom_vram_info.ucNumOfVRAMModule; ++index) - { - if ((int)this.atom_vram_entries[index].strMemPNString[0] != 0) - { - string key = Encoding.UTF8.GetString(this.atom_vram_entries[index].strMemPNString).Substring(0, 10); - string str = !this.rc.ContainsKey(key) ? "[ UNKNOWN ]" : this.rc[key]; - if (!(str == "SAMSUNG")) - { - if (!(str == "MICRON")) - { - if (!(str == "ELPIDA")) - { - if (!(str == "HYNIX_1")) - { - if (!(str == "HYNIX_2")) - { - if (!(str == "HYNIX_3")) - { - if (!(str == "HYNIX_4")) - { - if (str == "SAMSUNG4") - samsung4_index = index; - } - else - hynix_4_index = index; - } - else - hynix_3_index = index; - } - else - hynix_2_index = index; - } - else - hynix_1_index = index; - } - else - elpida_index = index; - } - else - micron_index = index; - } - else - samsung_index = index; - } - } - - if (samsung_index != -1) - { - if (MessageBox.Show("Do you want faster Uber-mix 3.1?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) - { - int num = (int)MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.1 timings to 1750+ strap(s)"); - this.apply_timings1(samsung_index, 0); - } - else - { - int num = (int)MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.2 timings to 1750+ strap(s)"); - this.apply_timings1(samsung_index, 1); - } - } - - if (samsung4_index != -1) - { - if (MessageBox.Show("Do you want pro Samsung timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) - { - MessageBox.Show("Samsung4 Memory found at index #" + (object)samsung4_index + ", now applying pro Samsung 30Mh/s timings to 1750+ strap(s)"); - this.apply_timings1(samsung4_index, 10); - MessageBox.Show("Little help for testing timing, set Core clock to 1150mhz and Memory clock to 2100mhz", "Hint!"); - } - else - { - MessageBox.Show("Samsung4 Memory found at index #" + (object)samsung4_index + ", now applying Samsung4 basic 29Mh/s timings to 1750+ strap(s)"); - this.apply_timings1(samsung4_index, 11); - } - } - - if (hynix_3_index != -1) - { - if (MessageBox.Show("Do you want Universal Hynix Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) - { - MessageBox.Show("Hynix (3) Memory found at index #" + hynix_3_index + ", now applying Universal HYNIX MINING timings to 1500+ strap(s)"); - apply_timings(hynix_3_index, 8); - } - else - { - MessageBox.Show("Hynix (3) Memory found at index #" + hynix_3_index + ", now applying GOOD HYNIX MINING timings to 1500+ strap(s)"); - apply_timings(hynix_3_index, 2); - } - } - - if (hynix_2_index != -1) - { - if (MessageBox.Show("Do you want Universal Hynix Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) - { - MessageBox.Show("Hynix (2) Memory found at index #" + hynix_2_index + ", now applying Universal HYNIX MINING timings to 1500+ strap(s)"); - apply_timings(hynix_2_index, 8); - } - else - { - int num = (int)MessageBox.Show("Hynix (2) Memory found at index #" + (object)hynix_2_index + ", now applying GOOD Hynix timings to 1500+ strap(s)"); - this.apply_timings(hynix_2_index, 3); - } - } - - if (hynix_4_index != -1) - { - if (MessageBox.Show("Do you want Universal Hynix Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) - { - MessageBox.Show("Hynix (2) Memory found at index #" + hynix_4_index + ", now applying Universal HYNIX MINING timings to 1500+ strap(s)"); - apply_timings(hynix_4_index, 8); - } - else - { - int num = (int)MessageBox.Show("Hynix (4) Memory found at index #" + (object)hynix_4_index + ", now applying Hynix timings to 1500+ strap(s)"); - this.apply_timings(hynix_4_index, 9); - } - } - - if (micron_index != -1) - { - if (MessageBox.Show("Do you want Good Micron Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) - { - int num = (int)MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying Good Micron timings to 1500+ strap(s)"); - this.apply_timings(micron_index, 4); - } - else - { - int num = (int)MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying S Micron timings to 1500+ strap(s)"); - this.apply_timings(micron_index, 5); - } - } - - if (hynix_1_index != -1) - { - MessageBox.Show("Hynix (1) Memory found at index #" + hynix_1_index + ", now applying GOOD HYNIX MINING timings to 1500+ strap(s)"); - apply_timings(hynix_1_index, 6); - } - - if (elpida_index != -1) - { - MessageBox.Show("Elpida Memory found at index #" + elpida_index + ", now applying GOOD ELPIDA MINING timings to 1500+ strap(s)"); - apply_timings(elpida_index, 7); - } - if (samsung4_index == -1 && samsung_index == -1 && hynix_2_index == -1 && hynix_3_index == -1 && hynix_1_index == -1 && elpida_index == -1 && micron_index == -1) - { - MessageBox.Show("Sorry, no supported memory found"); - } - - this.tablePOWERPLAY.Items[1].SubItems[1].Text = "2300"; - - } - - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - System.Diagnostics.Process.Start("https://www.miningbios.com/product/polaris-bios-editor-3-4-1-srbpolaris-style/"); - } + } + )); + } + } + + private void listVRAM_SelectedIndexChanged(object sender, EventArgs e) + { + + } + + private void apply_timings(int vendor_index, int timing_index) + { + for (var i = 0; i < tableVRAM_TIMING.Items.Count; i++) + { + ListViewItem container = tableVRAM_TIMING.Items[i]; + var name = container.Text; + UInt32 real_mhz = 0; + int mem_index = -1; + + if (name.IndexOf(':') > 0) + { + // get mem index + mem_index = (Int32)int32.ConvertFromString(name.Substring(0, 1)); + } + else + { + mem_index = 32768; + } + + real_mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') + 1)); + + if (real_mhz >= 1500 && (mem_index == vendor_index || mem_index == 32768)) + { + // set the timings + container.SubItems[1].Text = timings[timing_index]; + } + } + } + + private void apply_timings1(int vendor_index, int timing_index) + { + for (var i = 0; i < tableVRAM_TIMING.Items.Count; i++) + { + ListViewItem container = tableVRAM_TIMING.Items[i]; + var name = container.Text; + UInt32 real_mhz = 0; + int mem_index = -1; + + if (name.IndexOf(':') > 0) + { + // get mem index + mem_index = (Int32)int32.ConvertFromString(name.Substring(0, 1)); + } + else + { + mem_index = 32768; + } + + real_mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') + 1)); + + if (real_mhz >= 1750 && (mem_index == vendor_index || mem_index == 32768)) + { + // set the timings + container.SubItems[1].Text = timings[timing_index]; + } + } + } + + private void button1_Click(object sender, EventArgs e) + { + /* + int samsung_index = -1; + int micron_index = -1; + int elpida_index = -1; + int hynix_1_index = -1; + int hynix_2_index = -1; + int hynix_3_index = -1; + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + string mem_vendor; + if (atom_vram_entries[i].strMemPNString[0] != 0) + { + var mem_id = Encoding.UTF8.GetString(atom_vram_entries[i].strMemPNString).Substring(0, 10); + + if (rc.ContainsKey(mem_id)) + { + mem_vendor = rc[mem_id]; + } + else + { + mem_vendor = "UNKNOWN"; + } + + switch (mem_vendor) + { + case "SAMSUNG": + samsung_index = i; + break; + case "MICRON": + micron_index = i; + break; + case "ELPIDA": + elpida_index = i; + break; + case "HYNIX_1": + hynix_1_index = i; + break; + case "HYNIX_2": + hynix_2_index = i; + break; + case "HYNIX_3": + hynix_3_index = i; + break; + } + } + } + */ + int samsung_index = -1; + int samsung4_index = -1; + int micron_index = -1; + int elpida_index = -1; + int hynix_1_index = -1; + int hynix_2_index = -1; + int hynix_3_index = -1; + int hynix_4_index = -1; + for (int index = 0; index < (int)this.atom_vram_info.ucNumOfVRAMModule; ++index) + { + if ((int)this.atom_vram_entries[index].strMemPNString[0] != 0) + { + string key = Encoding.UTF8.GetString(this.atom_vram_entries[index].strMemPNString).Substring(0, 10); + string str = !this.rc.ContainsKey(key) ? "[ UNKNOWN ]" : this.rc[key]; + if (!(str == "SAMSUNG")) + { + if (!(str == "MICRON")) + { + if (!(str == "ELPIDA")) + { + if (!(str == "HYNIX_1")) + { + if (!(str == "HYNIX_2")) + { + if (!(str == "HYNIX_3")) + { + if (!(str == "HYNIX_4")) + { + if (str == "SAMSUNG4") + samsung4_index = index; + } + else + hynix_4_index = index; + } + else + hynix_3_index = index; + } + else + hynix_2_index = index; + } + else + hynix_1_index = index; + } + else + elpida_index = index; + } + else + micron_index = index; + } + else + samsung_index = index; + } + } + + if (samsung_index != -1) + { + if (MessageBox.Show("Do you want faster Uber-mix 3.1?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + int num = (int)MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.1 timings to 1750+ strap(s)"); + this.apply_timings1(samsung_index, 0); + } + else + { + int num = (int)MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.2 timings to 1750+ strap(s)"); + this.apply_timings1(samsung_index, 1); + } + } + + if (samsung4_index != -1) + { + if (MessageBox.Show("Do you want pro Samsung timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + MessageBox.Show("Samsung4 Memory found at index #" + (object)samsung4_index + ", now applying pro Samsung 30Mh/s timings to 1750+ strap(s)"); + this.apply_timings1(samsung4_index, 10); + MessageBox.Show("Little help for testing timing, set Core clock to 1150mhz and Memory clock to 2100mhz", "Hint!"); + } + else + { + MessageBox.Show("Samsung4 Memory found at index #" + (object)samsung4_index + ", now applying Samsung4 basic 29Mh/s timings to 1750+ strap(s)"); + this.apply_timings1(samsung4_index, 11); + } + } + + if (hynix_3_index != -1) + { + if (MessageBox.Show("Do you want Universal Hynix Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + MessageBox.Show("Hynix (3) Memory found at index #" + hynix_3_index + ", now applying Universal HYNIX MINING timings to 1500+ strap(s)"); + apply_timings(hynix_3_index, 8); + } + else + { + MessageBox.Show("Hynix (3) Memory found at index #" + hynix_3_index + ", now applying GOOD HYNIX MINING timings to 1500+ strap(s)"); + apply_timings(hynix_3_index, 2); + } + } + + if (hynix_2_index != -1) + { + if (MessageBox.Show("Do you want Universal Hynix Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + MessageBox.Show("Hynix (2) Memory found at index #" + hynix_2_index + ", now applying Universal HYNIX MINING timings to 1500+ strap(s)"); + apply_timings(hynix_2_index, 8); + } + else + { + int num = (int)MessageBox.Show("Hynix (2) Memory found at index #" + (object)hynix_2_index + ", now applying GOOD Hynix timings to 1500+ strap(s)"); + this.apply_timings(hynix_2_index, 3); + } + } + + if (hynix_4_index != -1) + { + if (MessageBox.Show("Do you want Universal Hynix Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + MessageBox.Show("Hynix (2) Memory found at index #" + hynix_4_index + ", now applying Universal HYNIX MINING timings to 1500+ strap(s)"); + apply_timings(hynix_4_index, 8); + } + else + { + int num = (int)MessageBox.Show("Hynix (4) Memory found at index #" + (object)hynix_4_index + ", now applying Hynix timings to 1500+ strap(s)"); + this.apply_timings(hynix_4_index, 9); + } + } + + if (micron_index != -1) + { + if (MessageBox.Show("Do you want Good Micron Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + int num = (int)MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying Good Micron timings to 1500+ strap(s)"); + this.apply_timings(micron_index, 4); + } + else + { + int num = (int)MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying S Micron timings to 1500+ strap(s)"); + this.apply_timings(micron_index, 5); + } + } + + if (hynix_1_index != -1) + { + MessageBox.Show("Hynix (1) Memory found at index #" + hynix_1_index + ", now applying GOOD HYNIX MINING timings to 1500+ strap(s)"); + apply_timings(hynix_1_index, 6); + } + + if (elpida_index != -1) + { + MessageBox.Show("Elpida Memory found at index #" + elpida_index + ", now applying GOOD ELPIDA MINING timings to 1500+ strap(s)"); + apply_timings(elpida_index, 7); + } + if (samsung4_index == -1 && samsung_index == -1 && hynix_2_index == -1 && hynix_3_index == -1 && hynix_1_index == -1 && elpida_index == -1 && micron_index == -1) + { + MessageBox.Show("Sorry, no supported memory found"); + } + + this.tablePOWERPLAY.Items[1].SubItems[1].Text = "2300"; + + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start("https://www.miningbios.com/product/polaris-bios-editor-3-4-1-srbpolaris-style/"); + } } } diff --git a/PolarisBiosEditor.csproj b/PolarisBiosEditor.csproj index 3fc1e82..4910978 100644 --- a/PolarisBiosEditor.csproj +++ b/PolarisBiosEditor.csproj @@ -65,5 +65,8 @@ + + + \ No newline at end of file diff --git a/PolarisBiosEditor.sln b/PolarisBiosEditor.sln index 33c6503..68c9ad8 100644 --- a/PolarisBiosEditor.sln +++ b/PolarisBiosEditor.sln @@ -1,9 +1,14 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2026 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31025.194 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolarisBiosEditor", "PolarisBiosEditor.csproj", "{7D2BA443-2896-4CCE-89B6-5B39C49F2289}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7AA3656A-A6CE-47D0-9F89-358922B30FC1}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 From 481de2ab97ec589d03fb95fd155d85e22b21aa61 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 12 Jul 2021 22:24:16 +0300 Subject: [PATCH 19/39] Allow opening file from a cmdline argument --- PolarisBiosEditor.cs | 572 +++++++++++++++++++++++-------------------- 1 file changed, 302 insertions(+), 270 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 9c3a13f..71f0c3a 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -926,10 +926,26 @@ public void JumpPrintExtra(int relative_offset) public ArraySegment buffer; public PolarisBiosEditor editor; } + [STAThread] static void Main(string[] args) { PolarisBiosEditor pbe = new PolarisBiosEditor(); + if (args.Length == 1) + { + try + { + pbe.OpenFileFromCommandLine(args[0]); + } + catch(Exception e) + { + Console.WriteLine("Exception during opening file passed from cmdline: " + e); + } + } + else + { + Console.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console (or pass single filename as argument)"); + } Application.Run(pbe); } @@ -1083,7 +1099,6 @@ public PolarisBiosEditor() #else Console.WriteLine("This is a debug build, skipping update check."); #endif - Console.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console"); rc.Add("MT51J256M3", "MICRON-8G"); rc.Add("EDW4032BAB", "ELPIDA-4G"); @@ -1136,6 +1151,13 @@ private void editSubItem2_Click(object sender, EventArgs e) } } + public void OpenFileFromCommandLine(string path) + { + Stream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); + ParseVbiosAndClose(fileStream); + UpdateGui(path); + } + private void OpenFileDialog_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); @@ -1145,422 +1167,431 @@ private void OpenFileDialog_Click(object sender, EventArgs e) if (openFileDialog.ShowDialog() == DialogResult.OK) { - save.Enabled = false; + Stream fileStream = openFileDialog.OpenFile(); + ParseVbiosAndClose(fileStream); + UpdateGui(openFileDialog.SafeFileName); + } + } - tableROM.Items.Clear(); - tablePOWERPLAY.Items.Clear(); - tablePOWERTUNE.Items.Clear(); - tableFAN.Items.Clear(); - tableGPU.Items.Clear(); - tableMEMORY.Items.Clear(); - tableVRAM.Items.Clear(); - tableVRAM_TIMING.Items.Clear(); + private void ParseVbiosAndClose(Stream fileStream) + { + if ((fileStream.Length != 524288) && (fileStream.Length != 524288 / 2)) + { + MessageBox.Show("This BIOS is non standard size.\nFlashing this BIOS may corrupt your graphics card.", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + using (BinaryReader br = new BinaryReader(fileStream)) + { + buffer = br.ReadBytes((int)fileStream.Length); - this.Text = this.programTitle + " " + this.version + " - " + "[" + openFileDialog.SafeFileName + "]"; + atom_rom_header_offset = getValueAtPosition(16, ATOM_ROM_HEADER_PTR); + atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); + string vendorId = atom_rom_header.usVendorID.ToString("X"); + fixChecksum(false); - System.IO.Stream fileStream = openFileDialog.OpenFile(); - if ((fileStream.Length != 524288) && (fileStream.Length != 524288 / 2)) + String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); + if (!firmwareSignature.Equals("ATOM")) { - MessageBox.Show("This BIOS is non standard size.\nFlashing this BIOS may corrupt your graphics card.", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); } - using (BinaryReader br = new BinaryReader(fileStream)) - { - buffer = br.ReadBytes((int)fileStream.Length); - - atom_rom_header_offset = getValueAtPosition(16, ATOM_ROM_HEADER_PTR); - atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); - string vendorId = atom_rom_header.usVendorID.ToString("X"); - fixChecksum(false); - String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); - if (!firmwareSignature.Equals("ATOM")) - { - MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); - } + if (!supportedID.Contains(vendorId)) + { + MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } - if (!supportedID.Contains(vendorId)) - { - MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } + atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); - atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); + ReadPrintTable(atom_data_table.GPIO_I2C_Info, + (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), + i2c_assigment => Marshal.SizeOf(i2c_assigment) + ); - ReadPrintTable(atom_data_table.GPIO_I2C_Info, - (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), - i2c_assigment => Marshal.SizeOf(i2c_assigment) - ); + atom_powerplay_offset = atom_data_table.PowerPlayInfo; + atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); - atom_powerplay_offset = atom_data_table.PowerPlayInfo; - atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); + atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; + atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); + atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; + for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + { + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; - atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); - atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; - for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) - { - atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } + var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; + var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); + for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) + { + Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; - var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); - for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) - { - Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } + atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; + atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); + atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; + for (var i = 0; i < atom_sclk_entries.Length; i++) + { + atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); + } - atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; - atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); - atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; - for (var i = 0; i < atom_sclk_entries.Length; i++) - { - atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); - } + atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; + atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); + atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; + for (var i = 0; i < atom_mclk_entries.Length; i++) + { + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + } - atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; - atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); - atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; - for (var i = 0; i < atom_mclk_entries.Length; i++) - { - atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); - } + var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; + var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); + for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) + { + Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + } - var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; - var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); - for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) - { - Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); - } + atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; + atom_fan_table = Reader(atom_fan_offset).ReadPrint(); - atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; - atom_fan_table = Reader(atom_fan_offset).ReadPrint(); + atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; + atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); + Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); - atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; - atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); - Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); + var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); + ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + Print("Connectors:"); + ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Encoders:"); + ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + Print("Routers:"); + ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); - Print("Connectors:"); - ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Encoders:"); - ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Routers:"); - ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + atom_vram_info_offset = atom_data_table.VRAM_Info; + atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); + atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; + var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); + atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); + } - atom_vram_info_offset = atom_data_table.VRAM_Info; - atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); - atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; - var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); - atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); - } + atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; + atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; + for (var i = 0; i < MAX_VRAM_ENTRIES; i++) + { + atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); - atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; - atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; - for (var i = 0; i < MAX_VRAM_ENTRIES; i++) + // atom_vram_timing_entries have an undetermined length + // attempt to determine the last entry in the array + if (atom_vram_timing_entries[i].ulClkRange == 0) { - atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); - - // atom_vram_timing_entries have an undetermined length - // attempt to determine the last entry in the array - if (atom_vram_timing_entries[i].ulClkRange == 0) - { - Array.Resize(ref atom_vram_timing_entries, i); - break; - } + Array.Resize(ref atom_vram_timing_entries, i); + break; } + } - var used_volt_obffset = 0; + var used_volt_obffset = 0; - ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, - (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), - (volt_object_header, reader) => + ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, + (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), + (volt_object_header, reader) => + { + used_volt_obffset += volt_object_header.usSize; + if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) { - used_volt_obffset += volt_object_header.usSize; - if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + while (detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - while (detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) - { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); - } - ConsecutiveReader.From(detailed_reader).ReadPrint(); + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); } - else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) + ConsecutiveReader.From(detailed_reader).ReadPrint(); + } + else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) + { + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + var gpio_voltage_fields = specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - var gpio_voltage_fields = specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) - { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); - } + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); } - reader.Jump(volt_object_header.usSize); } - ); + reader.Jump(volt_object_header.usSize); + } + ); - StringBuilder bios_bootup_builder = new StringBuilder(); + } + fileStream.Close(); + } - Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; - while (ptr != -1) - { - Char c = (Char)buffer[ptr]; - if (c == '\0') - { - ptr = -1; - } - else if (c == '\n' || c == '\r') - { - ptr++; - } - else - { - bios_bootup_builder.Append(c); - ptr++; - } - } + private void UpdateGui(string file_title) + { + save.Enabled = false; + + tableROM.Items.Clear(); + tablePOWERPLAY.Items.Clear(); + tablePOWERTUNE.Items.Clear(); + tableFAN.Items.Clear(); + tableGPU.Items.Clear(); + tableMEMORY.Items.Clear(); + tableVRAM.Items.Clear(); + tableVRAM_TIMING.Items.Clear(); + + this.Text = this.programTitle + " " + this.version + " - " + "[" + file_title + "]"; + + StringBuilder bios_bootup_builder = new StringBuilder(); + + Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; + while (ptr != -1) + { + Char c = (Char)buffer[ptr]; + if (c == '\0') + { + ptr = -1; + } + else if (c == '\n' || c == '\r') + { + ptr++; + } + else + { + bios_bootup_builder.Append(c); + ptr++; + } + } - BIOS_BootupMessage = bios_bootup_builder.ToString(); + BIOS_BootupMessage = bios_bootup_builder.ToString(); - txtBIOSBootupMessage.Text = BIOS_BootupMessage; - txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; + txtBIOSBootupMessage.Text = BIOS_BootupMessage; + txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; - tableROM.Items.Add(new ListViewItem(new string[] { + tableROM.Items.Add(new ListViewItem(new string[] { "BootupMessageOffset", "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") } - )); - tableROM.Items.Add(new ListViewItem(new string[] { + )); + tableROM.Items.Add(new ListViewItem(new string[] { "VendorID", "0x" + atom_rom_header.usVendorID.ToString ("X") } - )); - tableROM.Items.Add(new ListViewItem(new string[] { + )); + tableROM.Items.Add(new ListViewItem(new string[] { "DeviceID", "0x" + atom_rom_header.usDeviceID.ToString ("X") } - )); - tableROM.Items.Add(new ListViewItem(new string[] { + )); + tableROM.Items.Add(new ListViewItem(new string[] { "Sub ID", "0x" + atom_rom_header.usSubsystemID.ToString ("X") } - )); - tableROM.Items.Add(new ListViewItem(new string[] { + )); + tableROM.Items.Add(new ListViewItem(new string[] { "Sub VendorID", "0x" + atom_rom_header.usSubsystemVendorID.ToString ("X") } - )); - tableROM.Items.Add(new ListViewItem(new string[] { + )); + tableROM.Items.Add(new ListViewItem(new string[] { "Firmware Signature", //"0x" + atom_rom_header.uaFirmWareSignature.ToString ("X") new string(atom_rom_header.uaFirmWareSignature) } - )); + )); - tablePOWERPLAY.Items.Clear(); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + tablePOWERPLAY.Items.Clear(); + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Max GPU Freq. (MHz)", Convert.ToString (atom_powerplay_table.ulMaxODEngineClock / 100) } - )); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Max Memory Freq. (MHz)", Convert.ToString (atom_powerplay_table.ulMaxODMemoryClock / 100) } - )); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Power Control Limit (%)", Convert.ToString (atom_powerplay_table.usPowerControlLimit) } - )); + )); - tablePOWERTUNE.Items.Clear(); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + tablePOWERTUNE.Items.Clear(); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "TDP (W)", Convert.ToString (atom_powertune_table.usTDP) } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "TDC (A)", Convert.ToString (atom_powertune_table.usTDC) } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Max Power Limit (W)", Convert.ToString (atom_powertune_table.usMaximumPowerDeliveryLimit) } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Max Temp. (C)", Convert.ToString (atom_powertune_table.usTjMax) } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Shutdown Temp. (C)", Convert.ToString (atom_powertune_table.usSoftwareShutdownTemp) } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Hotspot Temp. (C)", Convert.ToString (atom_powertune_table.usTemperatureLimitHotspot) } - )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + )); + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Clock Stretch Amount", Convert.ToString (atom_powertune_table.usClockStretchAmount) } - )); + )); - tableFAN.Items.Clear(); - tableFAN.Items.Add(new ListViewItem(new string[] { + tableFAN.Items.Clear(); + tableFAN.Items.Add(new ListViewItem(new string[] { "Temp. Hysteresis", Convert.ToString (atom_fan_table.ucTHyst) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Min Temp. (C)", Convert.ToString (atom_fan_table.usTMin / 100) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Med Temp. (C)", Convert.ToString (atom_fan_table.usTMed / 100) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "High Temp. (C)", Convert.ToString (atom_fan_table.usTHigh / 100) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Max Temp. (C)", Convert.ToString (atom_fan_table.usTMax / 100) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Target Temp. (C)", Convert.ToString (atom_fan_table.ucTargetTemperature) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Legacy or Fuzzy Fan Mode", Convert.ToString (atom_fan_table.ucFanControlMode) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Min PWM (%)", Convert.ToString (atom_fan_table.usPWMMin / 100) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Med PWM (%)", Convert.ToString (atom_fan_table.usPWMMed / 100) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "High PWM (%)", Convert.ToString (atom_fan_table.usPWMHigh / 100) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Max PWM (%)", Convert.ToString (atom_fan_table.usFanPWMMax) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Max RPM", Convert.ToString (atom_fan_table.usFanRPMMax) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Sensitivity", Convert.ToString (atom_fan_table.usFanOutputSensitivity) } - )); - tableFAN.Items.Add(new ListViewItem(new string[] { + )); + tableFAN.Items.Add(new ListViewItem(new string[] { "Acoustic Limit (MHz)", Convert.ToString (atom_fan_table.ulMinFanSCLKAcousticLimit / 100) } - )); + )); - tableGPU.Items.Clear(); - for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) - { - tableGPU.Items.Add(new ListViewItem(new string[] { + tableGPU.Items.Clear(); + for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) + { + tableGPU.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_sclk_entries [i].ulSclk / 100), Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) } - )); - } + )); + } - tableMEMORY.Items.Clear(); - for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) - { - tableMEMORY.Items.Add(new ListViewItem(new string[] { + tableMEMORY.Items.Clear(); + for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) + { + tableMEMORY.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_mclk_entries [i].ulMclk / 100), Convert.ToString (atom_mclk_entries [i].usVddci) } - )); - } + )); + } - listVRAM.Items.Clear(); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + listVRAM.Items.Clear(); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + if (atom_vram_entries[i].strMemPNString[0] != 0) + { + var mem_id_full = atom_vram_entries[i].FullName; + var mem_id = mem_id_full.Substring(0, 10); + string mem_vendor; + if (rc.ContainsKey(mem_id)) { - if (atom_vram_entries[i].strMemPNString[0] != 0) - { - var mem_id_full = atom_vram_entries[i].FullName; - var mem_id = mem_id_full.Substring(0, 10); - string mem_vendor; - if (rc.ContainsKey(mem_id)) - { - mem_vendor = rc[mem_id]; - } - else - { - mem_vendor = "UNKNOWN"; - } - - listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); - } + mem_vendor = rc[mem_id]; } - listVRAM.SelectedIndex = 0; - atom_vram_index = listVRAM.SelectedIndex; - - tableVRAM_TIMING.Items.Clear(); - for (var i = 0; i < atom_vram_timing_entries.Length; i++) + else { - uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; - tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { - tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, - atom_vram_timing_entries [i].LatencyString - } - )); + mem_vendor = "UNKNOWN"; } - save.Enabled = true; - boxROM.Enabled = true; - boxPOWERPLAY.Enabled = true; - boxPOWERTUNE.Enabled = true; - boxFAN.Enabled = true; - boxGPU.Enabled = true; - boxMEM.Enabled = true; - boxVRAM.Enabled = true; + listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); } - fileStream.Close(); + } + listVRAM.SelectedIndex = 0; + atom_vram_index = listVRAM.SelectedIndex; + tableVRAM_TIMING.Items.Clear(); + for (var i = 0; i < atom_vram_timing_entries.Length; i++) + { + uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; + tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { + tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, + atom_vram_timing_entries [i].LatencyString + } + )); } + + save.Enabled = true; + boxROM.Enabled = true; + boxPOWERPLAY.Enabled = true; + boxPOWERTUNE.Enabled = true; + boxFAN.Enabled = true; + boxGPU.Enabled = true; + boxMEM.Enabled = true; + boxVRAM.Enabled = true; tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); @@ -1584,6 +1615,7 @@ atom_vram_timing_entries [i].LatencyString tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + } private int PrintAndReturnLen(ATOM_OBJECT o) From d2a15f5c7969a341cbb7565343871ab0b05765a3 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 12 Jul 2021 22:55:06 +0300 Subject: [PATCH 20/39] Show vddci index and disable direct editing of vddci values --- PolarisBiosEditor.Designer.cs | 882 +++++++++++++++++----------------- PolarisBiosEditor.cs | 11 +- 2 files changed, 454 insertions(+), 439 deletions(-) diff --git a/PolarisBiosEditor.Designer.cs b/PolarisBiosEditor.Designer.cs index 46b2193..54f9ac1 100644 --- a/PolarisBiosEditor.Designer.cs +++ b/PolarisBiosEditor.Designer.cs @@ -28,464 +28,479 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.open = new System.Windows.Forms.Button(); - this.save = new System.Windows.Forms.Button(); - this.txtChecksum = new System.Windows.Forms.TextBox(); - this.txtBIOSBootupMessage = new System.Windows.Forms.TextBox(); - this.boxROM = new System.Windows.Forms.GroupBox(); - this.tableROM = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxPOWERPLAY = new System.Windows.Forms.GroupBox(); - this.tablePOWERPLAY = new System.Windows.Forms.ListView(); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxPOWERTUNE = new System.Windows.Forms.GroupBox(); - this.tablePOWERTUNE = new System.Windows.Forms.ListView(); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxFAN = new System.Windows.Forms.GroupBox(); - this.tableFAN = new System.Windows.Forms.ListView(); - this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader10 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxGPU = new System.Windows.Forms.GroupBox(); - this.tableGPU = new System.Windows.Forms.ListView(); - this.columnHeader11 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader12 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxMEM = new System.Windows.Forms.GroupBox(); - this.tableMEMORY = new System.Windows.Forms.ListView(); - this.columnHeader13 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader14 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.boxVRAM = new System.Windows.Forms.GroupBox(); - this.tableVRAM_TIMING = new System.Windows.Forms.ListView(); - this.columnHeader15 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader16 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.listVRAM = new System.Windows.Forms.ComboBox(); - this.tableVRAM = new System.Windows.Forms.ListView(); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.editSubItem1 = new System.Windows.Forms.TextBox(); - this.editSubItem2 = new System.Windows.Forms.TextBox(); - this.apply = new System.Windows.Forms.Button(); - this.button1 = new System.Windows.Forms.Button(); - this.linkLabel1 = new System.Windows.Forms.LinkLabel(); - this.boxROM.SuspendLayout(); - this.boxPOWERPLAY.SuspendLayout(); - this.boxPOWERTUNE.SuspendLayout(); - this.boxFAN.SuspendLayout(); - this.boxGPU.SuspendLayout(); - this.boxMEM.SuspendLayout(); - this.boxVRAM.SuspendLayout(); - this.SuspendLayout(); - // - // open - // - this.open.Location = new System.Drawing.Point(12, 12); - this.open.Name = "open"; - this.open.Size = new System.Drawing.Size(75, 23); - this.open.TabIndex = 0; - this.open.Text = "OPEN BIOS"; - this.open.UseVisualStyleBackColor = true; - this.open.Click += new System.EventHandler(this.OpenFileDialog_Click); - // - // save - // - this.save.Location = new System.Drawing.Point(93, 12); - this.save.Name = "save"; - this.save.Size = new System.Drawing.Size(75, 23); - this.save.TabIndex = 1; - this.save.Text = "SAVE AS"; - this.save.UseVisualStyleBackColor = true; - this.save.Click += new System.EventHandler(this.SaveFileDialog_Click); - // - // txtChecksum - // - this.txtChecksum.Font = new System.Drawing.Font("Courier New", 8.25F); - this.txtChecksum.Location = new System.Drawing.Point(174, 14); - this.txtChecksum.Name = "txtChecksum"; - this.txtChecksum.Size = new System.Drawing.Size(100, 20); - this.txtChecksum.TabIndex = 2; - // - // txtBIOSBootupMessage - // - this.txtBIOSBootupMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + System.Windows.Forms.ColumnHeader VddciFakeIgnoredColumnToForbidEdits; + this.open = new System.Windows.Forms.Button(); + this.save = new System.Windows.Forms.Button(); + this.txtChecksum = new System.Windows.Forms.TextBox(); + this.txtBIOSBootupMessage = new System.Windows.Forms.TextBox(); + this.boxROM = new System.Windows.Forms.GroupBox(); + this.tableROM = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxPOWERPLAY = new System.Windows.Forms.GroupBox(); + this.tablePOWERPLAY = new System.Windows.Forms.ListView(); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxPOWERTUNE = new System.Windows.Forms.GroupBox(); + this.tablePOWERTUNE = new System.Windows.Forms.ListView(); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxFAN = new System.Windows.Forms.GroupBox(); + this.tableFAN = new System.Windows.Forms.ListView(); + this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader10 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxGPU = new System.Windows.Forms.GroupBox(); + this.tableGPU = new System.Windows.Forms.ListView(); + this.columnHeader11 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader12 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxMEM = new System.Windows.Forms.GroupBox(); + this.tableMEMORY = new System.Windows.Forms.ListView(); + this.VddciMhz = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.VddcimV = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxVRAM = new System.Windows.Forms.GroupBox(); + this.tableVRAM_TIMING = new System.Windows.Forms.ListView(); + this.columnHeader15 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader16 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.listVRAM = new System.Windows.Forms.ComboBox(); + this.tableVRAM = new System.Windows.Forms.ListView(); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.editSubItem1 = new System.Windows.Forms.TextBox(); + this.editSubItem2 = new System.Windows.Forms.TextBox(); + this.apply = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.vddciIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + VddciFakeIgnoredColumnToForbidEdits = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.boxROM.SuspendLayout(); + this.boxPOWERPLAY.SuspendLayout(); + this.boxPOWERTUNE.SuspendLayout(); + this.boxFAN.SuspendLayout(); + this.boxGPU.SuspendLayout(); + this.boxMEM.SuspendLayout(); + this.boxVRAM.SuspendLayout(); + this.SuspendLayout(); + // + // open + // + this.open.Location = new System.Drawing.Point(12, 12); + this.open.Name = "open"; + this.open.Size = new System.Drawing.Size(75, 23); + this.open.TabIndex = 0; + this.open.Text = "OPEN BIOS"; + this.open.UseVisualStyleBackColor = true; + this.open.Click += new System.EventHandler(this.OpenFileDialog_Click); + // + // save + // + this.save.Location = new System.Drawing.Point(93, 12); + this.save.Name = "save"; + this.save.Size = new System.Drawing.Size(75, 23); + this.save.TabIndex = 1; + this.save.Text = "SAVE AS"; + this.save.UseVisualStyleBackColor = true; + this.save.Click += new System.EventHandler(this.SaveFileDialog_Click); + // + // txtChecksum + // + this.txtChecksum.Font = new System.Drawing.Font("Courier New", 8.25F); + this.txtChecksum.Location = new System.Drawing.Point(174, 14); + this.txtChecksum.Name = "txtChecksum"; + this.txtChecksum.Size = new System.Drawing.Size(100, 20); + this.txtChecksum.TabIndex = 2; + // + // txtBIOSBootupMessage + // + this.txtBIOSBootupMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.txtBIOSBootupMessage.Font = new System.Drawing.Font("Courier New", 8.25F); - this.txtBIOSBootupMessage.Location = new System.Drawing.Point(277, 15); - this.txtBIOSBootupMessage.Name = "txtBIOSBootupMessage"; - this.txtBIOSBootupMessage.Size = new System.Drawing.Size(531, 20); - this.txtBIOSBootupMessage.TabIndex = 5; - // - // boxROM - // - this.boxROM.Controls.Add(this.tableROM); - this.boxROM.Location = new System.Drawing.Point(9, 41); - this.boxROM.Name = "boxROM"; - this.boxROM.Size = new System.Drawing.Size(265, 140); - this.boxROM.TabIndex = 3; - this.boxROM.TabStop = false; - this.boxROM.Text = "ROM"; - // - // tableROM - // - this.tableROM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.txtBIOSBootupMessage.Font = new System.Drawing.Font("Courier New", 8.25F); + this.txtBIOSBootupMessage.Location = new System.Drawing.Point(277, 15); + this.txtBIOSBootupMessage.Name = "txtBIOSBootupMessage"; + this.txtBIOSBootupMessage.Size = new System.Drawing.Size(531, 20); + this.txtBIOSBootupMessage.TabIndex = 5; + // + // boxROM + // + this.boxROM.Controls.Add(this.tableROM); + this.boxROM.Location = new System.Drawing.Point(9, 41); + this.boxROM.Name = "boxROM"; + this.boxROM.Size = new System.Drawing.Size(265, 140); + this.boxROM.TabIndex = 3; + this.boxROM.TabStop = false; + this.boxROM.Text = "ROM"; + // + // tableROM + // + this.tableROM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, this.columnHeader2}); - this.tableROM.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableROM.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableROM.HideSelection = false; - this.tableROM.Location = new System.Drawing.Point(3, 16); - this.tableROM.Name = "tableROM"; - this.tableROM.Size = new System.Drawing.Size(259, 121); - this.tableROM.TabIndex = 4; - this.tableROM.UseCompatibleStateImageBehavior = false; - this.tableROM.View = System.Windows.Forms.View.Details; - // - // columnHeader1 - // - this.columnHeader1.Text = "Name"; - this.columnHeader1.Width = 40; - // - // columnHeader2 - // - this.columnHeader2.Text = "Value"; - // - // boxPOWERPLAY - // - this.boxPOWERPLAY.Controls.Add(this.tablePOWERPLAY); - this.boxPOWERPLAY.Location = new System.Drawing.Point(9, 184); - this.boxPOWERPLAY.Name = "boxPOWERPLAY"; - this.boxPOWERPLAY.Size = new System.Drawing.Size(265, 157); - this.boxPOWERPLAY.TabIndex = 0; - this.boxPOWERPLAY.TabStop = false; - this.boxPOWERPLAY.Text = "POWERPLAY"; - // - // tablePOWERPLAY - // - this.tablePOWERPLAY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.tableROM.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableROM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableROM.HideSelection = false; + this.tableROM.Location = new System.Drawing.Point(3, 16); + this.tableROM.Name = "tableROM"; + this.tableROM.Size = new System.Drawing.Size(259, 121); + this.tableROM.TabIndex = 4; + this.tableROM.UseCompatibleStateImageBehavior = false; + this.tableROM.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "Name"; + this.columnHeader1.Width = 40; + // + // columnHeader2 + // + this.columnHeader2.Text = "Value"; + // + // boxPOWERPLAY + // + this.boxPOWERPLAY.Controls.Add(this.tablePOWERPLAY); + this.boxPOWERPLAY.Location = new System.Drawing.Point(9, 184); + this.boxPOWERPLAY.Name = "boxPOWERPLAY"; + this.boxPOWERPLAY.Size = new System.Drawing.Size(265, 157); + this.boxPOWERPLAY.TabIndex = 0; + this.boxPOWERPLAY.TabStop = false; + this.boxPOWERPLAY.Text = "POWERPLAY"; + // + // tablePOWERPLAY + // + this.tablePOWERPLAY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader3, this.columnHeader4}); - this.tablePOWERPLAY.Dock = System.Windows.Forms.DockStyle.Fill; - this.tablePOWERPLAY.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tablePOWERPLAY.HideSelection = false; - this.tablePOWERPLAY.Location = new System.Drawing.Point(3, 16); - this.tablePOWERPLAY.Name = "tablePOWERPLAY"; - this.tablePOWERPLAY.Size = new System.Drawing.Size(259, 138); - this.tablePOWERPLAY.TabIndex = 5; - this.tablePOWERPLAY.UseCompatibleStateImageBehavior = false; - this.tablePOWERPLAY.View = System.Windows.Forms.View.Details; - // - // columnHeader3 - // - this.columnHeader3.Text = "Name"; - // - // columnHeader4 - // - this.columnHeader4.Text = "Value"; - // - // boxPOWERTUNE - // - this.boxPOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.tablePOWERPLAY.Dock = System.Windows.Forms.DockStyle.Fill; + this.tablePOWERPLAY.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tablePOWERPLAY.HideSelection = false; + this.tablePOWERPLAY.Location = new System.Drawing.Point(3, 16); + this.tablePOWERPLAY.Name = "tablePOWERPLAY"; + this.tablePOWERPLAY.Size = new System.Drawing.Size(259, 138); + this.tablePOWERPLAY.TabIndex = 5; + this.tablePOWERPLAY.UseCompatibleStateImageBehavior = false; + this.tablePOWERPLAY.View = System.Windows.Forms.View.Details; + // + // columnHeader3 + // + this.columnHeader3.Text = "Name"; + // + // columnHeader4 + // + this.columnHeader4.Text = "Value"; + // + // boxPOWERTUNE + // + this.boxPOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - this.boxPOWERTUNE.Controls.Add(this.tablePOWERTUNE); - this.boxPOWERTUNE.Location = new System.Drawing.Point(277, 374); - this.boxPOWERTUNE.Name = "boxPOWERTUNE"; - this.boxPOWERTUNE.Size = new System.Drawing.Size(260, 252); - this.boxPOWERTUNE.TabIndex = 0; - this.boxPOWERTUNE.TabStop = false; - this.boxPOWERTUNE.Text = "POWERTUNE"; - // - // tablePOWERTUNE - // - this.tablePOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.boxPOWERTUNE.Controls.Add(this.tablePOWERTUNE); + this.boxPOWERTUNE.Location = new System.Drawing.Point(277, 374); + this.boxPOWERTUNE.Name = "boxPOWERTUNE"; + this.boxPOWERTUNE.Size = new System.Drawing.Size(260, 252); + this.boxPOWERTUNE.TabIndex = 0; + this.boxPOWERTUNE.TabStop = false; + this.boxPOWERTUNE.Text = "POWERTUNE"; + // + // tablePOWERTUNE + // + this.tablePOWERTUNE.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - this.tablePOWERTUNE.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.tablePOWERTUNE.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader5, this.columnHeader6}); - this.tablePOWERTUNE.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tablePOWERTUNE.HideSelection = false; - this.tablePOWERTUNE.Location = new System.Drawing.Point(3, 16); - this.tablePOWERTUNE.Name = "tablePOWERTUNE"; - this.tablePOWERTUNE.Size = new System.Drawing.Size(254, 233); - this.tablePOWERTUNE.TabIndex = 6; - this.tablePOWERTUNE.UseCompatibleStateImageBehavior = false; - this.tablePOWERTUNE.View = System.Windows.Forms.View.Details; - // - // columnHeader5 - // - this.columnHeader5.Text = "Name"; - // - // columnHeader6 - // - this.columnHeader6.Text = "Value"; - // - // boxFAN - // - this.boxFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.tablePOWERTUNE.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tablePOWERTUNE.HideSelection = false; + this.tablePOWERTUNE.Location = new System.Drawing.Point(3, 16); + this.tablePOWERTUNE.Name = "tablePOWERTUNE"; + this.tablePOWERTUNE.Size = new System.Drawing.Size(254, 233); + this.tablePOWERTUNE.TabIndex = 6; + this.tablePOWERTUNE.UseCompatibleStateImageBehavior = false; + this.tablePOWERTUNE.View = System.Windows.Forms.View.Details; + // + // columnHeader5 + // + this.columnHeader5.Text = "Name"; + // + // columnHeader6 + // + this.columnHeader6.Text = "Value"; + // + // boxFAN + // + this.boxFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - this.boxFAN.Controls.Add(this.tableFAN); - this.boxFAN.Location = new System.Drawing.Point(9, 344); - this.boxFAN.Name = "boxFAN"; - this.boxFAN.Size = new System.Drawing.Size(265, 282); - this.boxFAN.TabIndex = 0; - this.boxFAN.TabStop = false; - this.boxFAN.Text = "FAN"; - // - // tableFAN - // - this.tableFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.boxFAN.Controls.Add(this.tableFAN); + this.boxFAN.Location = new System.Drawing.Point(9, 344); + this.boxFAN.Name = "boxFAN"; + this.boxFAN.Size = new System.Drawing.Size(265, 282); + this.boxFAN.TabIndex = 0; + this.boxFAN.TabStop = false; + this.boxFAN.Text = "FAN"; + // + // tableFAN + // + this.tableFAN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - this.tableFAN.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.tableFAN.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader9, this.columnHeader10}); - this.tableFAN.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableFAN.HideSelection = false; - this.tableFAN.Location = new System.Drawing.Point(3, 16); - this.tableFAN.Name = "tableFAN"; - this.tableFAN.Size = new System.Drawing.Size(259, 263); - this.tableFAN.TabIndex = 7; - this.tableFAN.UseCompatibleStateImageBehavior = false; - this.tableFAN.View = System.Windows.Forms.View.Details; - // - // columnHeader9 - // - this.columnHeader9.Text = "Name"; - // - // columnHeader10 - // - this.columnHeader10.Text = "Value"; - // - // boxGPU - // - this.boxGPU.Controls.Add(this.tableGPU); - this.boxGPU.Location = new System.Drawing.Point(277, 41); - this.boxGPU.Name = "boxGPU"; - this.boxGPU.Size = new System.Drawing.Size(260, 203); - this.boxGPU.TabIndex = 0; - this.boxGPU.TabStop = false; - this.boxGPU.Text = "GPU"; - // - // tableGPU - // - this.tableGPU.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.tableFAN.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableFAN.HideSelection = false; + this.tableFAN.Location = new System.Drawing.Point(3, 16); + this.tableFAN.Name = "tableFAN"; + this.tableFAN.Size = new System.Drawing.Size(259, 263); + this.tableFAN.TabIndex = 7; + this.tableFAN.UseCompatibleStateImageBehavior = false; + this.tableFAN.View = System.Windows.Forms.View.Details; + // + // columnHeader9 + // + this.columnHeader9.Text = "Name"; + // + // columnHeader10 + // + this.columnHeader10.Text = "Value"; + // + // boxGPU + // + this.boxGPU.Controls.Add(this.tableGPU); + this.boxGPU.Location = new System.Drawing.Point(277, 41); + this.boxGPU.Name = "boxGPU"; + this.boxGPU.Size = new System.Drawing.Size(260, 203); + this.boxGPU.TabIndex = 0; + this.boxGPU.TabStop = false; + this.boxGPU.Text = "GPU"; + // + // tableGPU + // + this.tableGPU.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader11, this.columnHeader12}); - this.tableGPU.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableGPU.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableGPU.HideSelection = false; - this.tableGPU.Location = new System.Drawing.Point(3, 16); - this.tableGPU.Name = "tableGPU"; - this.tableGPU.Size = new System.Drawing.Size(254, 184); - this.tableGPU.TabIndex = 8; - this.tableGPU.UseCompatibleStateImageBehavior = false; - this.tableGPU.View = System.Windows.Forms.View.Details; - // - // columnHeader11 - // - this.columnHeader11.Text = "MHz"; - // - // columnHeader12 - // - this.columnHeader12.Text = "mV"; - // - // boxMEM - // - this.boxMEM.Controls.Add(this.tableMEMORY); - this.boxMEM.Location = new System.Drawing.Point(277, 247); - this.boxMEM.Name = "boxMEM"; - this.boxMEM.Size = new System.Drawing.Size(260, 124); - this.boxMEM.TabIndex = 0; - this.boxMEM.TabStop = false; - this.boxMEM.Text = "MEMORY(Vddci)"; - // - // tableMEMORY - // - this.tableMEMORY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader13, - this.columnHeader14}); - this.tableMEMORY.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableMEMORY.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableMEMORY.HideSelection = false; - this.tableMEMORY.Location = new System.Drawing.Point(3, 16); - this.tableMEMORY.Name = "tableMEMORY"; - this.tableMEMORY.Size = new System.Drawing.Size(254, 105); - this.tableMEMORY.TabIndex = 9; - this.tableMEMORY.UseCompatibleStateImageBehavior = false; - this.tableMEMORY.View = System.Windows.Forms.View.Details; - // - // columnHeader13 - // - this.columnHeader13.Text = "MHz"; - // - // columnHeader14 - // - this.columnHeader14.Text = "mV(Edits will be ignored, use hexedit to edit in two places)"; - // - // boxVRAM - // - this.boxVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.tableGPU.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableGPU.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableGPU.HideSelection = false; + this.tableGPU.Location = new System.Drawing.Point(3, 16); + this.tableGPU.Name = "tableGPU"; + this.tableGPU.Size = new System.Drawing.Size(254, 184); + this.tableGPU.TabIndex = 8; + this.tableGPU.UseCompatibleStateImageBehavior = false; + this.tableGPU.View = System.Windows.Forms.View.Details; + // + // columnHeader11 + // + this.columnHeader11.Text = "MHz"; + // + // columnHeader12 + // + this.columnHeader12.Text = "mV"; + // + // boxMEM + // + this.boxMEM.Controls.Add(this.tableMEMORY); + this.boxMEM.Location = new System.Drawing.Point(277, 247); + this.boxMEM.Name = "boxMEM"; + this.boxMEM.Size = new System.Drawing.Size(260, 124); + this.boxMEM.TabIndex = 0; + this.boxMEM.TabStop = false; + this.boxMEM.Text = "VDDCI Edit by hex editor: adjust mV AND index"; + // + // tableMEMORY + // + this.tableMEMORY.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.VddciMhz, + VddciFakeIgnoredColumnToForbidEdits, + this.VddcimV, + this.vddciIndex}); + this.tableMEMORY.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableMEMORY.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableMEMORY.HideSelection = false; + this.tableMEMORY.Location = new System.Drawing.Point(3, 16); + this.tableMEMORY.Name = "tableMEMORY"; + this.tableMEMORY.Size = new System.Drawing.Size(254, 105); + this.tableMEMORY.TabIndex = 9; + this.tableMEMORY.UseCompatibleStateImageBehavior = false; + this.tableMEMORY.View = System.Windows.Forms.View.Details; + // + // VddciMhz + // + this.VddciMhz.Text = "MHz"; + // + // VddcimV + // + this.VddcimV.Text = "mV"; + // + // boxVRAM + // + this.boxVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.boxVRAM.Controls.Add(this.tableVRAM_TIMING); - this.boxVRAM.Controls.Add(this.listVRAM); - this.boxVRAM.Controls.Add(this.tableVRAM); - this.boxVRAM.Location = new System.Drawing.Point(540, 41); - this.boxVRAM.Name = "boxVRAM"; - this.boxVRAM.Size = new System.Drawing.Size(268, 585); - this.boxVRAM.TabIndex = 0; - this.boxVRAM.TabStop = false; - this.boxVRAM.Text = "VRAM"; - // - // tableVRAM_TIMING - // - this.tableVRAM_TIMING.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.boxVRAM.Controls.Add(this.tableVRAM_TIMING); + this.boxVRAM.Controls.Add(this.listVRAM); + this.boxVRAM.Controls.Add(this.tableVRAM); + this.boxVRAM.Location = new System.Drawing.Point(540, 41); + this.boxVRAM.Name = "boxVRAM"; + this.boxVRAM.Size = new System.Drawing.Size(268, 585); + this.boxVRAM.TabIndex = 0; + this.boxVRAM.TabStop = false; + this.boxVRAM.Text = "VRAM"; + // + // tableVRAM_TIMING + // + this.tableVRAM_TIMING.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.tableVRAM_TIMING.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.tableVRAM_TIMING.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader15, this.columnHeader16}); - this.tableVRAM_TIMING.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableVRAM_TIMING.HideSelection = false; - this.tableVRAM_TIMING.Location = new System.Drawing.Point(3, 209); - this.tableVRAM_TIMING.Name = "tableVRAM_TIMING"; - this.tableVRAM_TIMING.Size = new System.Drawing.Size(262, 373); - this.tableVRAM_TIMING.TabIndex = 11; - this.tableVRAM_TIMING.UseCompatibleStateImageBehavior = false; - this.tableVRAM_TIMING.View = System.Windows.Forms.View.Details; - // - // columnHeader15 - // - this.columnHeader15.Text = "MHz"; - // - // columnHeader16 - // - this.columnHeader16.Text = "Timing Strap"; - this.columnHeader16.Width = 110; - // - // listVRAM - // - this.listVRAM.Dock = System.Windows.Forms.DockStyle.Top; - this.listVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); - this.listVRAM.FormattingEnabled = true; - this.listVRAM.Location = new System.Drawing.Point(3, 16); - this.listVRAM.Name = "listVRAM"; - this.listVRAM.Size = new System.Drawing.Size(262, 22); - this.listVRAM.TabIndex = 12; - this.listVRAM.SelectedIndexChanged += new System.EventHandler(this.listVRAM_SelectedIndexChanged); - this.listVRAM.SelectedValueChanged += new System.EventHandler(this.listVRAM_SelectionChanged); - // - // tableVRAM - // - this.tableVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.tableVRAM_TIMING.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableVRAM_TIMING.HideSelection = false; + this.tableVRAM_TIMING.Location = new System.Drawing.Point(3, 209); + this.tableVRAM_TIMING.Name = "tableVRAM_TIMING"; + this.tableVRAM_TIMING.Size = new System.Drawing.Size(262, 373); + this.tableVRAM_TIMING.TabIndex = 11; + this.tableVRAM_TIMING.UseCompatibleStateImageBehavior = false; + this.tableVRAM_TIMING.View = System.Windows.Forms.View.Details; + // + // columnHeader15 + // + this.columnHeader15.Text = "MHz"; + // + // columnHeader16 + // + this.columnHeader16.Text = "Timing Strap"; + this.columnHeader16.Width = 110; + // + // listVRAM + // + this.listVRAM.Dock = System.Windows.Forms.DockStyle.Top; + this.listVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.listVRAM.FormattingEnabled = true; + this.listVRAM.Location = new System.Drawing.Point(3, 16); + this.listVRAM.Name = "listVRAM"; + this.listVRAM.Size = new System.Drawing.Size(262, 22); + this.listVRAM.TabIndex = 12; + this.listVRAM.SelectedIndexChanged += new System.EventHandler(this.listVRAM_SelectedIndexChanged); + this.listVRAM.SelectedValueChanged += new System.EventHandler(this.listVRAM_SelectionChanged); + // + // tableVRAM + // + this.tableVRAM.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.tableVRAM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.tableVRAM.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader7, this.columnHeader8}); - this.tableVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); - this.tableVRAM.HideSelection = false; - this.tableVRAM.Location = new System.Drawing.Point(3, 43); - this.tableVRAM.Name = "tableVRAM"; - this.tableVRAM.Size = new System.Drawing.Size(262, 160); - this.tableVRAM.TabIndex = 10; - this.tableVRAM.UseCompatibleStateImageBehavior = false; - this.tableVRAM.View = System.Windows.Forms.View.Details; - // - // columnHeader7 - // - this.columnHeader7.Text = "Name"; - // - // columnHeader8 - // - this.columnHeader8.Text = "Value"; - // - // editSubItem1 - // - this.editSubItem1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.tableVRAM.Font = new System.Drawing.Font("Courier New", 8.25F); + this.tableVRAM.HideSelection = false; + this.tableVRAM.Location = new System.Drawing.Point(3, 43); + this.tableVRAM.Name = "tableVRAM"; + this.tableVRAM.Size = new System.Drawing.Size(262, 160); + this.tableVRAM.TabIndex = 10; + this.tableVRAM.UseCompatibleStateImageBehavior = false; + this.tableVRAM.View = System.Windows.Forms.View.Details; + // + // columnHeader7 + // + this.columnHeader7.Text = "Name"; + // + // columnHeader8 + // + this.columnHeader8.Text = "Value"; + // + // editSubItem1 + // + this.editSubItem1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.editSubItem1.Font = new System.Drawing.Font("Courier New", 8.25F); - this.editSubItem1.Location = new System.Drawing.Point(100, 644); - this.editSubItem1.Name = "editSubItem1"; - this.editSubItem1.Size = new System.Drawing.Size(220, 20); - this.editSubItem1.TabIndex = 2; - // - // editSubItem2 - // - this.editSubItem2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.editSubItem1.Font = new System.Drawing.Font("Courier New", 8.25F); + this.editSubItem1.Location = new System.Drawing.Point(100, 644); + this.editSubItem1.Name = "editSubItem1"; + this.editSubItem1.Size = new System.Drawing.Size(220, 20); + this.editSubItem1.TabIndex = 2; + // + // editSubItem2 + // + this.editSubItem2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.editSubItem2.Font = new System.Drawing.Font("Courier New", 8.25F); - this.editSubItem2.Location = new System.Drawing.Point(9, 688); - this.editSubItem2.Name = "editSubItem2"; - this.editSubItem2.Size = new System.Drawing.Size(799, 20); - this.editSubItem2.TabIndex = 2; - this.editSubItem2.Click += new System.EventHandler(this.editSubItem2_Click); - // - // apply - // - this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.apply.Location = new System.Drawing.Point(10, 642); - this.apply.Name = "apply"; - this.apply.Size = new System.Drawing.Size(84, 23); - this.apply.TabIndex = 0; - this.apply.Text = "APPLY CHG"; - this.apply.UseVisualStyleBackColor = true; - this.apply.Click += new System.EventHandler(this.apply_Click); - // - // button1 - // - this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button1.Location = new System.Drawing.Point(558, 642); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(241, 23); - this.button1.TabIndex = 4; - this.button1.Text = "ONE CLICK TIMING PATCH"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // linkLabel1 - // - this.linkLabel1.AutoSize = true; - this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.linkLabel1.LinkColor = System.Drawing.Color.Red; - this.linkLabel1.Location = new System.Drawing.Point(12, 669); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(516, 16); - this.linkLabel1.TabIndex = 6; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "(Link kept from upstream vesrsion) BUY PolariBiosEditor Pro performance"; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); - // - // PolarisBiosEditor - // - this.ClientSize = new System.Drawing.Size(820, 733); - this.Controls.Add(this.linkLabel1); - this.Controls.Add(this.button1); - this.Controls.Add(this.boxFAN); - this.Controls.Add(this.boxVRAM); - this.Controls.Add(this.boxMEM); - this.Controls.Add(this.boxGPU); - this.Controls.Add(this.boxPOWERTUNE); - this.Controls.Add(this.boxPOWERPLAY); - this.Controls.Add(this.boxROM); - this.Controls.Add(this.txtChecksum); - this.Controls.Add(this.txtBIOSBootupMessage); - this.Controls.Add(this.save); - this.Controls.Add(this.open); - this.Controls.Add(this.editSubItem1); - this.Controls.Add(this.editSubItem2); - this.Controls.Add(this.apply); - this.Name = "PolarisBiosEditor"; - this.Text = "PBE"; - this.Load += new System.EventHandler(this.PolarisBiosEditor_Load); - this.boxROM.ResumeLayout(false); - this.boxPOWERPLAY.ResumeLayout(false); - this.boxPOWERTUNE.ResumeLayout(false); - this.boxFAN.ResumeLayout(false); - this.boxGPU.ResumeLayout(false); - this.boxMEM.ResumeLayout(false); - this.boxVRAM.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); + this.editSubItem2.Font = new System.Drawing.Font("Courier New", 8.25F); + this.editSubItem2.Location = new System.Drawing.Point(9, 688); + this.editSubItem2.Name = "editSubItem2"; + this.editSubItem2.Size = new System.Drawing.Size(799, 20); + this.editSubItem2.TabIndex = 2; + this.editSubItem2.Click += new System.EventHandler(this.editSubItem2_Click); + // + // apply + // + this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.apply.Location = new System.Drawing.Point(10, 642); + this.apply.Name = "apply"; + this.apply.Size = new System.Drawing.Size(84, 23); + this.apply.TabIndex = 0; + this.apply.Text = "APPLY CHG"; + this.apply.UseVisualStyleBackColor = true; + this.apply.Click += new System.EventHandler(this.apply_Click); + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.Location = new System.Drawing.Point(558, 642); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(241, 23); + this.button1.TabIndex = 4; + this.button1.Text = "ONE CLICK TIMING PATCH"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // linkLabel1 + // + this.linkLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.linkLabel1.AutoSize = true; + this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.linkLabel1.LinkColor = System.Drawing.Color.Red; + this.linkLabel1.Location = new System.Drawing.Point(12, 669); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(516, 16); + this.linkLabel1.TabIndex = 6; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "(Link kept from upstream vesrsion) BUY PolariBiosEditor Pro performance"; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // + // VddciFakeIgnoredColumnToForbidEdits + // + VddciFakeIgnoredColumnToForbidEdits.Text = ""; + VddciFakeIgnoredColumnToForbidEdits.Width = 0; + // + // vddciIndex + // + this.vddciIndex.Text = "VddcIndex"; + // + // PolarisBiosEditor + // + this.ClientSize = new System.Drawing.Size(820, 733); + this.Controls.Add(this.linkLabel1); + this.Controls.Add(this.button1); + this.Controls.Add(this.boxFAN); + this.Controls.Add(this.boxVRAM); + this.Controls.Add(this.boxMEM); + this.Controls.Add(this.boxGPU); + this.Controls.Add(this.boxPOWERTUNE); + this.Controls.Add(this.boxPOWERPLAY); + this.Controls.Add(this.boxROM); + this.Controls.Add(this.txtChecksum); + this.Controls.Add(this.txtBIOSBootupMessage); + this.Controls.Add(this.save); + this.Controls.Add(this.open); + this.Controls.Add(this.editSubItem1); + this.Controls.Add(this.editSubItem2); + this.Controls.Add(this.apply); + this.Name = "PolarisBiosEditor"; + this.Text = "PBE"; + this.Load += new System.EventHandler(this.PolarisBiosEditor_Load); + this.boxROM.ResumeLayout(false); + this.boxPOWERPLAY.ResumeLayout(false); + this.boxPOWERTUNE.ResumeLayout(false); + this.boxFAN.ResumeLayout(false); + this.boxGPU.ResumeLayout(false); + this.boxMEM.ResumeLayout(false); + this.boxVRAM.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -521,8 +536,8 @@ private void InitializeComponent() private System.Windows.Forms.ColumnHeader columnHeader10; private System.Windows.Forms.ColumnHeader columnHeader11; private System.Windows.Forms.ColumnHeader columnHeader12; - private System.Windows.Forms.ColumnHeader columnHeader13; - private System.Windows.Forms.ColumnHeader columnHeader14; + private System.Windows.Forms.ColumnHeader VddciMhz; + private System.Windows.Forms.ColumnHeader VddcimV; private System.Windows.Forms.ColumnHeader columnHeader15; private System.Windows.Forms.ColumnHeader columnHeader16; private System.Windows.Forms.ColumnHeader columnHeader7; @@ -532,5 +547,6 @@ private void InitializeComponent() private System.Windows.Forms.Button apply; private System.Windows.Forms.Button button1; private System.Windows.Forms.LinkLabel linkLabel1; + private System.Windows.Forms.ColumnHeader vddciIndex; } } diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 71f0c3a..4baa428 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -98,7 +98,7 @@ public partial class PolarisBiosEditor : Form /* DATA */ - string version = "1.7xml-2021.05"; + string version = "1.7xml-2021.07"; string programTitle = "PolarisBiosEditor"; @@ -1544,8 +1544,10 @@ private void UpdateGui(string file_title) for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) { tableMEMORY.Items.Add(new ListViewItem(new string[] { - Convert.ToString (atom_mclk_entries [i].ulMclk / 100), - Convert.ToString (atom_mclk_entries [i].usVddci) + Convert.ToString (atom_mclk_entries [i].ulMclk / 100), + "", + Convert.ToString (atom_mclk_entries [i].usVddci), + Convert.ToString (atom_mclk_entries [i].ucVddcInd) } )); } @@ -1930,12 +1932,9 @@ private void SaveFileDialog_Click(object sender, EventArgs e) { ListViewItem container = tableMEMORY.Items[i]; var name = container.Text; - var value = container.SubItems[1].Text; var mhz = (int)int32.ConvertFromString(name) * 100; - var mv = (int)int32.ConvertFromString(value); atom_mclk_entries[i].ulMclk = (UInt32)mhz; - //atom_mclk_entries[i].usVddci = (UInt16)mv;//usVddci assignment requires edits in several places } updateVRAM_entries(); From 0eadf337659ed888b1291cadb49cd3bf9ceab2b4 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 12 Jul 2021 23:05:59 +0300 Subject: [PATCH 21/39] utf8 & lf line endings --- PolarisBiosEditor.cs | 422 +++++++++++++++++++++---------------------- 1 file changed, 211 insertions(+), 211 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 4baa428..73bd859 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1,17 +1,17 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows.Forms; -using System.Xml.Linq; -using System.Xml.Serialization; - -namespace PolarisBiosEditor +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.Xml.Serialization; + +namespace PolarisBiosEditor { public enum KIND_CONNECTOR { @@ -103,53 +103,53 @@ public partial class PolarisBiosEditor : Form string[] manufacturers = new string[] - { - "SAMSUNG", - "ELPIDA", - "HYNIX", + { + "SAMSUNG", + "ELPIDA", + "HYNIX", "MICRON" }; string[] supportedID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; string[] timings = new string[] - { - - // UberMix 3.1 - "777000000000000022CC1C00AD615C41C0590E152ECCA60B006007000B031420FA8900A00300000010122F3FBA354019", // new, please test - //"777000000000000022CC1C00AD615C41C0590E152ECC8608006007000B031420FA8900A00300000010122F3FBA354019", //old - - // FIXME Try UberMix 3.2 Timing - "777000000000000022CC1C00CEE55C46C0590E1532CD66090060070014051420FA8900A00300000012123442C3353C19", - - // Good HYNIX_3 BY VASKE - "999000000000000022CC1C00ADDD5B44A0551315B74C450A00400600750414206A8900A00200312010112D34C5303F17", - - // Good HYNIX_2 - "777000000000000022AA1C00B56A6D46C0551017BE8E060C006AE6000C081420EA8900AB030000001B162C31C0313F17", - - // Good Micron - //"777000000000000022AA1C0073626C41B0551016BA0D260B006AE60004061420EA8940AA030000001914292EB22E3B16", old - "777000000000000022AA1C0073626C41B0551016BA0D260B0060060004061420EA8940AA030000001914292EB22E3B16", // new tested timings (much better xmr performance @ rx560 sapphire pulse) - "777000000000000022AA1C00B56A6D4690551014BE8E060C0060060074081420EA8900AB020000001B162C31C02E3F15",// new Micron timing it's actually from Samsung - - // Good Hynix_1 - "999000000000000022559D0010DE5B4480551312B74C450A00400600750414206A8900A00200312010112D34A42A3816", - - // Good Elpida (fixed by VASKE) - "777000000000000022AA1C00EF595B36A0550F15B68C1506004082007C041420CA8980A9020004C01712262B612B3715", - //"777000000000000022AA1C00AC615B3CA0550F142C8C1506006004007C041420CA8980A9020004C01712262B612B3715" // new, please test - - // Universal Hynix - "777000000000000022AA1C00B56A6D46C0551017BE8E060C006006000C081420EA8900AB030000001B162C31C0313F17", - - //Hynix 4 by vaske - "999000000000000022559D0031626C46905F1015BC0D060C004004007D0714204A8900A0020071241B12312CC02D3C17", //new, please test - - //Samsung K4G80325FC // let's call it samsung4 pro timing - "777000000000000022CC1C00106A5D4DD0571016B90D060C0060070014051420FA8900A0030000001011333DC0303A17", //new, please test - - //Samsung K4G80325FC // let's call it samsung4 basic timing + { + + // UberMix 3.1 + "777000000000000022CC1C00AD615C41C0590E152ECCA60B006007000B031420FA8900A00300000010122F3FBA354019", // new, please test + //"777000000000000022CC1C00AD615C41C0590E152ECC8608006007000B031420FA8900A00300000010122F3FBA354019", //old + + // FIXME Try UberMix 3.2 Timing + "777000000000000022CC1C00CEE55C46C0590E1532CD66090060070014051420FA8900A00300000012123442C3353C19", + + // Good HYNIX_3 BY VASKE + "999000000000000022CC1C00ADDD5B44A0551315B74C450A00400600750414206A8900A00200312010112D34C5303F17", + + // Good HYNIX_2 + "777000000000000022AA1C00B56A6D46C0551017BE8E060C006AE6000C081420EA8900AB030000001B162C31C0313F17", + + // Good Micron + //"777000000000000022AA1C0073626C41B0551016BA0D260B006AE60004061420EA8940AA030000001914292EB22E3B16", old + "777000000000000022AA1C0073626C41B0551016BA0D260B0060060004061420EA8940AA030000001914292EB22E3B16", // new tested timings (much better xmr performance @ rx560 sapphire pulse) + "777000000000000022AA1C00B56A6D4690551014BE8E060C0060060074081420EA8900AB020000001B162C31C02E3F15",// new Micron timing it's actually from Samsung + + // Good Hynix_1 + "999000000000000022559D0010DE5B4480551312B74C450A00400600750414206A8900A00200312010112D34A42A3816", + + // Good Elpida (fixed by VASKE) + "777000000000000022AA1C00EF595B36A0550F15B68C1506004082007C041420CA8980A9020004C01712262B612B3715", + //"777000000000000022AA1C00AC615B3CA0550F142C8C1506006004007C041420CA8980A9020004C01712262B612B3715" // new, please test + + // Universal Hynix + "777000000000000022AA1C00B56A6D46C0551017BE8E060C006006000C081420EA8900AB030000001B162C31C0313F17", + + //Hynix 4 by vaske + "999000000000000022559D0031626C46905F1015BC0D060C004004007D0714204A8900A0020071241B12312CC02D3C17", //new, please test + + //Samsung K4G80325FC // let's call it samsung4 pro timing + "777000000000000022CC1C00106A5D4DD0571016B90D060C0060070014051420FA8900A0030000001011333DC0303A17", //new, please test + + //Samsung K4G80325FC // let's call it samsung4 basic timing "777000000000000022CC1C00106A6D4DD0571016B90D060C0060070014051420FA8900A0030000001B11333DC0303A17" //new, please test }; @@ -168,7 +168,7 @@ public class VRAM_TIMING_RX const int ATOM_ROM_CHECKSUM_OFFSET = 0x21; const int ATOM_ROM_HEADER_PTR = 0x48; - #region VBIOS-fields-kept-for-later-saving + #region VBIOS-fields-kept-for-later-saving int atom_rom_header_offset; ATOM_ROM_HEADER atom_rom_header; @@ -199,7 +199,7 @@ public class VRAM_TIMING_RX ATOM_VRAM_INFO atom_vram_info; ATOM_VRAM_ENTRY[] atom_vram_entries; ATOM_VRAM_TIMING_ENTRY[] atom_vram_timing_entries; - #endregion VBIOS-fields-kept-for-later-saving + #endregion VBIOS-fields-kept-for-later-saving int atom_vram_index = 0; // index selected in supported memory list const int MAX_VRAM_ENTRIES = 48; // e.g. MSI-Armor-RX-580-4GB has 36 entries @@ -1061,44 +1061,44 @@ public PolarisBiosEditor() InitializeComponent(); this.Text = this.programTitle + " " + this.version; -#if !DEBUG - try - { - - WebClient myWebClient = new WebClient(); - Stream myStream = myWebClient.OpenRead("https://raw.githubusercontent.com/vvaske/PolarisBiosEditor/master/version"); - StreamReader sr = new StreamReader(myStream); - string newVersion = sr.ReadToEnd().Trim(); - if (!newVersion.Equals(version)) { - MessageBox.Show("There is a new version available! " + version + " -> " + newVersion); - } - myStream.Close(); - - myStream = myWebClient.OpenRead("https://raw.githubusercontent.com/vvaske/PolarisBiosEditor/master/notice"); - sr = new StreamReader(myStream); - string notice = sr.ReadToEnd().Trim(); - - MessageBoxButtons buttons = MessageBoxButtons.YesNo; - DialogResult result; - - result = MessageBox.Show(notice + "\n\nClick Yes button to copy to clipboard", "A message from the developer", buttons); - - if (result == System.Windows.Forms.DialogResult.OK) - { - - Clipboard.SetText(notice); - - } - - myStream.Close(); - - - } catch (System.Net.WebException) { - this.Text += " (offline mode)"; - } -#else +#if !DEBUG + try + { + + WebClient myWebClient = new WebClient(); + Stream myStream = myWebClient.OpenRead("https://raw.githubusercontent.com/vvaske/PolarisBiosEditor/master/version"); + StreamReader sr = new StreamReader(myStream); + string newVersion = sr.ReadToEnd().Trim(); + if (!newVersion.Equals(version)) { + MessageBox.Show("There is a new version available! " + version + " -> " + newVersion); + } + myStream.Close(); + + myStream = myWebClient.OpenRead("https://raw.githubusercontent.com/vvaske/PolarisBiosEditor/master/notice"); + sr = new StreamReader(myStream); + string notice = sr.ReadToEnd().Trim(); + + MessageBoxButtons buttons = MessageBoxButtons.YesNo; + DialogResult result; + + result = MessageBox.Show(notice + "\n\nClick Yes button to copy to clipboard", "A message from the developer", buttons); + + if (result == System.Windows.Forms.DialogResult.OK) + { + + Clipboard.SetText(notice); + + } + + myStream.Close(); + + + } catch (System.Net.WebException) { + this.Text += " (offline mode)"; + } +#else Console.WriteLine("This is a debug build, skipping update check."); -#endif +#endif rc.Add("MT51J256M3", "MICRON-8G"); rc.Add("EDW4032BAB", "ELPIDA-4G"); @@ -1372,170 +1372,170 @@ private void UpdateGui(string file_title) txtBIOSBootupMessage.Text = BIOS_BootupMessage; txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; - tableROM.Items.Add(new ListViewItem(new string[] { - "BootupMessageOffset", - "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") + tableROM.Items.Add(new ListViewItem(new string[] { + "BootupMessageOffset", + "0x" + atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") } )); - tableROM.Items.Add(new ListViewItem(new string[] { - "VendorID", - "0x" + atom_rom_header.usVendorID.ToString ("X") + tableROM.Items.Add(new ListViewItem(new string[] { + "VendorID", + "0x" + atom_rom_header.usVendorID.ToString ("X") } )); - tableROM.Items.Add(new ListViewItem(new string[] { - "DeviceID", - "0x" + atom_rom_header.usDeviceID.ToString ("X") + tableROM.Items.Add(new ListViewItem(new string[] { + "DeviceID", + "0x" + atom_rom_header.usDeviceID.ToString ("X") } )); - tableROM.Items.Add(new ListViewItem(new string[] { - "Sub ID", - "0x" + atom_rom_header.usSubsystemID.ToString ("X") + tableROM.Items.Add(new ListViewItem(new string[] { + "Sub ID", + "0x" + atom_rom_header.usSubsystemID.ToString ("X") } )); - tableROM.Items.Add(new ListViewItem(new string[] { - "Sub VendorID", - "0x" + atom_rom_header.usSubsystemVendorID.ToString ("X") + tableROM.Items.Add(new ListViewItem(new string[] { + "Sub VendorID", + "0x" + atom_rom_header.usSubsystemVendorID.ToString ("X") } )); - tableROM.Items.Add(new ListViewItem(new string[] { - "Firmware Signature", - //"0x" + atom_rom_header.uaFirmWareSignature.ToString ("X") - new string(atom_rom_header.uaFirmWareSignature) + tableROM.Items.Add(new ListViewItem(new string[] { + "Firmware Signature", + //"0x" + atom_rom_header.uaFirmWareSignature.ToString ("X") + new string(atom_rom_header.uaFirmWareSignature) } )); tablePOWERPLAY.Items.Clear(); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { - "Max GPU Freq. (MHz)", - Convert.ToString (atom_powerplay_table.ulMaxODEngineClock / 100) + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + "Max GPU Freq. (MHz)", + Convert.ToString (atom_powerplay_table.ulMaxODEngineClock / 100) } )); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { - "Max Memory Freq. (MHz)", - Convert.ToString (atom_powerplay_table.ulMaxODMemoryClock / 100) + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + "Max Memory Freq. (MHz)", + Convert.ToString (atom_powerplay_table.ulMaxODMemoryClock / 100) } )); - tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { - "Power Control Limit (%)", - Convert.ToString (atom_powerplay_table.usPowerControlLimit) + tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { + "Power Control Limit (%)", + Convert.ToString (atom_powerplay_table.usPowerControlLimit) } )); tablePOWERTUNE.Items.Clear(); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "TDP (W)", - Convert.ToString (atom_powertune_table.usTDP) + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "TDP (W)", + Convert.ToString (atom_powertune_table.usTDP) } )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "TDC (A)", - Convert.ToString (atom_powertune_table.usTDC) + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "TDC (A)", + Convert.ToString (atom_powertune_table.usTDC) } )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Max Power Limit (W)", - Convert.ToString (atom_powertune_table.usMaximumPowerDeliveryLimit) + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Max Power Limit (W)", + Convert.ToString (atom_powertune_table.usMaximumPowerDeliveryLimit) } )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Max Temp. (C)", - Convert.ToString (atom_powertune_table.usTjMax) + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Max Temp. (C)", + Convert.ToString (atom_powertune_table.usTjMax) } )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Shutdown Temp. (C)", - Convert.ToString (atom_powertune_table.usSoftwareShutdownTemp) + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Shutdown Temp. (C)", + Convert.ToString (atom_powertune_table.usSoftwareShutdownTemp) } )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Hotspot Temp. (C)", - Convert.ToString (atom_powertune_table.usTemperatureLimitHotspot) + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Hotspot Temp. (C)", + Convert.ToString (atom_powertune_table.usTemperatureLimitHotspot) } )); - tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { - "Clock Stretch Amount", - Convert.ToString (atom_powertune_table.usClockStretchAmount) + tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { + "Clock Stretch Amount", + Convert.ToString (atom_powertune_table.usClockStretchAmount) } )); tableFAN.Items.Clear(); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Temp. Hysteresis", - Convert.ToString (atom_fan_table.ucTHyst) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Temp. Hysteresis", + Convert.ToString (atom_fan_table.ucTHyst) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Min Temp. (C)", - Convert.ToString (atom_fan_table.usTMin / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Min Temp. (C)", + Convert.ToString (atom_fan_table.usTMin / 100) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Med Temp. (C)", - Convert.ToString (atom_fan_table.usTMed / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Med Temp. (C)", + Convert.ToString (atom_fan_table.usTMed / 100) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "High Temp. (C)", - Convert.ToString (atom_fan_table.usTHigh / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "High Temp. (C)", + Convert.ToString (atom_fan_table.usTHigh / 100) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Max Temp. (C)", - Convert.ToString (atom_fan_table.usTMax / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Max Temp. (C)", + Convert.ToString (atom_fan_table.usTMax / 100) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Target Temp. (C)", - Convert.ToString (atom_fan_table.ucTargetTemperature) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Target Temp. (C)", + Convert.ToString (atom_fan_table.ucTargetTemperature) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Legacy or Fuzzy Fan Mode", - Convert.ToString (atom_fan_table.ucFanControlMode) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Legacy or Fuzzy Fan Mode", + Convert.ToString (atom_fan_table.ucFanControlMode) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Min PWM (%)", - Convert.ToString (atom_fan_table.usPWMMin / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Min PWM (%)", + Convert.ToString (atom_fan_table.usPWMMin / 100) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Med PWM (%)", - Convert.ToString (atom_fan_table.usPWMMed / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Med PWM (%)", + Convert.ToString (atom_fan_table.usPWMMed / 100) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "High PWM (%)", - Convert.ToString (atom_fan_table.usPWMHigh / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "High PWM (%)", + Convert.ToString (atom_fan_table.usPWMHigh / 100) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Max PWM (%)", - Convert.ToString (atom_fan_table.usFanPWMMax) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Max PWM (%)", + Convert.ToString (atom_fan_table.usFanPWMMax) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Max RPM", - Convert.ToString (atom_fan_table.usFanRPMMax) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Max RPM", + Convert.ToString (atom_fan_table.usFanRPMMax) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Sensitivity", - Convert.ToString (atom_fan_table.usFanOutputSensitivity) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Sensitivity", + Convert.ToString (atom_fan_table.usFanOutputSensitivity) } )); - tableFAN.Items.Add(new ListViewItem(new string[] { - "Acoustic Limit (MHz)", - Convert.ToString (atom_fan_table.ulMinFanSCLKAcousticLimit / 100) + tableFAN.Items.Add(new ListViewItem(new string[] { + "Acoustic Limit (MHz)", + Convert.ToString (atom_fan_table.ulMinFanSCLKAcousticLimit / 100) } )); tableGPU.Items.Clear(); for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) { - tableGPU.Items.Add(new ListViewItem(new string[] { - Convert.ToString (atom_sclk_entries [i].ulSclk / 100), - Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) + tableGPU.Items.Add(new ListViewItem(new string[] { + Convert.ToString (atom_sclk_entries [i].ulSclk / 100), + Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) } )); } @@ -1543,11 +1543,11 @@ private void UpdateGui(string file_title) tableMEMORY.Items.Clear(); for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) { - tableMEMORY.Items.Add(new ListViewItem(new string[] { + tableMEMORY.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_mclk_entries [i].ulMclk / 100), - "", + "", Convert.ToString (atom_mclk_entries [i].usVddci), - Convert.ToString (atom_mclk_entries [i].ucVddcInd) + Convert.ToString (atom_mclk_entries [i].ucVddcInd) } )); } @@ -1579,9 +1579,9 @@ private void UpdateGui(string file_title) for (var i = 0; i < atom_vram_timing_entries.Length; i++) { uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; - tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { - tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, - atom_vram_timing_entries [i].LatencyString + tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { + tbl.ToString () + ":" + (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, + atom_vram_timing_entries [i].LatencyString } )); } @@ -2085,29 +2085,29 @@ private void listVRAM_SelectionChanged(object sender, EventArgs e) if (listVRAM.SelectedIndex >= 0 && listVRAM.SelectedIndex < listVRAM.Items.Count) { atom_vram_index = listVRAM.SelectedIndex; - tableVRAM.Items.Add(new ListViewItem(new string[] { - "VendorID", - "0x" + atom_vram_entries [atom_vram_index].ucMemoryVenderID.ToString ("X") + tableVRAM.Items.Add(new ListViewItem(new string[] { + "VendorID", + "0x" + atom_vram_entries [atom_vram_index].ucMemoryVenderID.ToString ("X") } )); - tableVRAM.Items.Add(new ListViewItem(new string[] { - "Size (MB)", - Convert.ToString (atom_vram_entries [atom_vram_index].usMemorySize) + tableVRAM.Items.Add(new ListViewItem(new string[] { + "Size (MB)", + Convert.ToString (atom_vram_entries [atom_vram_index].usMemorySize) } )); - tableVRAM.Items.Add(new ListViewItem(new string[] { - "Density", - "0x" + atom_vram_entries [atom_vram_index].ucDensity.ToString ("X") + tableVRAM.Items.Add(new ListViewItem(new string[] { + "Density", + "0x" + atom_vram_entries [atom_vram_index].ucDensity.ToString ("X") } )); - tableVRAM.Items.Add(new ListViewItem(new string[] { - "Type", - "0x" + atom_vram_entries [atom_vram_index].ucMemoryType.ToString ("X") + tableVRAM.Items.Add(new ListViewItem(new string[] { + "Type", + "0x" + atom_vram_entries [atom_vram_index].ucMemoryType.ToString ("X") } )); - tableVRAM.Items.Add(new ListViewItem(new string[] { - "Num Of VRAM Module", - atom_vram_info.ucNumOfVRAMModule.ToString ("X") + tableVRAM.Items.Add(new ListViewItem(new string[] { + "Num Of VRAM Module", + atom_vram_info.ucNumOfVRAMModule.ToString ("X") } )); } @@ -2388,5 +2388,5 @@ private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs { System.Diagnostics.Process.Start("https://www.miningbios.com/product/polaris-bios-editor-3-4-1-srbpolaris-style/"); } - } -} + } +} From 83dde8ade50f958681f488d5a4028870bb29283d Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 12 Jul 2021 23:43:54 +0300 Subject: [PATCH 22/39] fix vendor id VS device id fix build warnings --- PolarisBiosEditor.Designer.cs | 2 +- PolarisBiosEditor.cs | 28 ++++++++++------------------ build.sh | 2 +- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/PolarisBiosEditor.Designer.cs b/PolarisBiosEditor.Designer.cs index 54f9ac1..033690e 100644 --- a/PolarisBiosEditor.Designer.cs +++ b/PolarisBiosEditor.Designer.cs @@ -300,7 +300,7 @@ private void InitializeComponent() this.boxMEM.Size = new System.Drawing.Size(260, 124); this.boxMEM.TabIndex = 0; this.boxMEM.TabStop = false; - this.boxMEM.Text = "VDDCI Edit by hex editor: adjust mV AND index"; + this.boxMEM.Text = "vddci:edit by hex editor-adjust mV AND index"; // // tableMEMORY // diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 73bd859..24d3467 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -102,14 +102,6 @@ public partial class PolarisBiosEditor : Form string programTitle = "PolarisBiosEditor"; - string[] manufacturers = new string[] - { - "SAMSUNG", - "ELPIDA", - "HYNIX", - "MICRON" - }; - string[] supportedID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; string[] timings = new string[] @@ -236,8 +228,8 @@ public struct ATOM_ROM_HEADER public Byte ucExtendedFunctionCode; public Byte ucReserved; public UInt32 ulPSPDirTableOffset; - public UInt16 usDeviceID; public UInt16 usVendorID; + public UInt16 usDeviceID; } String BIOS_BootupMessage; @@ -1185,7 +1177,7 @@ private void ParseVbiosAndClose(Stream fileStream) atom_rom_header_offset = getValueAtPosition(16, ATOM_ROM_HEADER_PTR); atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); - string vendorId = atom_rom_header.usVendorID.ToString("X"); + string deviceId = atom_rom_header.usDeviceID.ToString("X"); fixChecksum(false); String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); @@ -1194,9 +1186,9 @@ private void ParseVbiosAndClose(Stream fileStream) MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); } - if (!supportedID.Contains(vendorId)) + if (!supportedID.Contains(deviceId)) { - MessageBox.Show("Unsupported DeviceID 0x" + vendorId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + MessageBox.Show("Unsupported DeviceID 0x" + deviceId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); @@ -2283,12 +2275,12 @@ private void button1_Click(object sender, EventArgs e) { if (MessageBox.Show("Do you want faster Uber-mix 3.1?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) { - int num = (int)MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.1 timings to 1750+ strap(s)"); + MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.1 timings to 1750+ strap(s)"); this.apply_timings1(samsung_index, 0); } else { - int num = (int)MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.2 timings to 1750+ strap(s)"); + MessageBox.Show("Samsung Memory found at index #" + (object)samsung_index + ", now applying UBERMIX 3.2 timings to 1750+ strap(s)"); this.apply_timings1(samsung_index, 1); } } @@ -2331,7 +2323,7 @@ private void button1_Click(object sender, EventArgs e) } else { - int num = (int)MessageBox.Show("Hynix (2) Memory found at index #" + (object)hynix_2_index + ", now applying GOOD Hynix timings to 1500+ strap(s)"); + MessageBox.Show("Hynix (2) Memory found at index #" + (object)hynix_2_index + ", now applying GOOD Hynix timings to 1500+ strap(s)"); this.apply_timings(hynix_2_index, 3); } } @@ -2345,7 +2337,7 @@ private void button1_Click(object sender, EventArgs e) } else { - int num = (int)MessageBox.Show("Hynix (4) Memory found at index #" + (object)hynix_4_index + ", now applying Hynix timings to 1500+ strap(s)"); + MessageBox.Show("Hynix (4) Memory found at index #" + (object)hynix_4_index + ", now applying Hynix timings to 1500+ strap(s)"); this.apply_timings(hynix_4_index, 9); } } @@ -2354,12 +2346,12 @@ private void button1_Click(object sender, EventArgs e) { if (MessageBox.Show("Do you want Good Micron Timing?", "Important Question", MessageBoxButtons.YesNo) == DialogResult.Yes) { - int num = (int)MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying Good Micron timings to 1500+ strap(s)"); + MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying Good Micron timings to 1500+ strap(s)"); this.apply_timings(micron_index, 4); } else { - int num = (int)MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying S Micron timings to 1500+ strap(s)"); + MessageBox.Show("Micron Memory found at index #" + (object)micron_index + ", now applying S Micron timings to 1500+ strap(s)"); this.apply_timings(micron_index, 5); } } diff --git a/build.sh b/build.sh index dd1bf16..64e47dc 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ #!/bin/bash mkdir -p bin/Debug #mono-mcs is required for building -mcs -debug -define:DEBUG -unsafe -lib:/usr/lib/mono/4.0 -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:System.Xml.Linq.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs -out:bin/Debug/PolarisBiosEditor.exe +mcs --mcs-debug 1 -debug -define:DEBUG -unsafe -lib:/usr/lib/mono/4.0 -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:System.Xml.Linq.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs -out:bin/Debug/PolarisBiosEditor.exe From bca67411848ef205c4b52693aa552baa32cef54a Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 13 Jul 2021 04:08:37 +0300 Subject: [PATCH 23/39] Dump command tables --- PolarisBiosEditor.cs | 208 +++++ README.md | 1742 ++++++++++++++++++++++++------------------ 2 files changed, 1203 insertions(+), 747 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 24d3467..ed6bf6b 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -234,6 +234,110 @@ public struct ATOM_ROM_HEADER String BIOS_BootupMessage; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_CMD_TABLES_LIST + { + public UInt16 ASIC_Init; + public UInt16 GetDisplaySurfaceSize; + public UInt16 ASIC_RegistersInit_For_ASIC_Init; + public UInt16 VRAM_BlockVenderDetection; + public UInt16 DIGxEncoderControl; + public UInt16 MemoryControllerInit_For_ASIC_Init; + public UInt16 EnableCRTCMemReq; + public UInt16 MemoryParamAdjust; + public UInt16 DVOEncoderControl; + public UInt16 GPIOPinControl; + public UInt16 SetEngineClock; + public UInt16 SetMemoryClock; + public UInt16 SetPixelClock; + public UInt16 EnableDispPowerGating_For_ASIC_Init; + public UInt16 ResetMemoryDLL; + public UInt16 ResetMemoryDevice; + public UInt16 MemoryPLLInit; + public UInt16 AdjustDisplayPll; + public UInt16 AdjustMemoryController; + public UInt16 EnableASIC_StaticPwrMgt; + public UInt16 SetUniphyInstance; + public UInt16 DAC_LoadDetection; + public UInt16 LVTMAEncoderControl; + public UInt16 HW_Misc_Operation; + public UInt16 DAC1EncoderControl; + public UInt16 DAC2EncoderControl; + public UInt16 DVOOutputControl; + public UInt16 CV1OutputControl; + public UInt16 GetConditionalGoldenSetting; + public UInt16 SMC_Init; + public UInt16 PatchMCSetting; + public UInt16 MC_SEQ_Control; + public UInt16 Gfx_Harvesting; + public UInt16 EnableScaler; + public UInt16 BlankCRTC; + public UInt16 EnableCRTC; + public UInt16 GetPixelClock; + public UInt16 EnableVGA_Render; + public UInt16 GetSCLKOverMCLKRatio; + public UInt16 SetCRTC_Timing; + public UInt16 SetCRTC_OverScan; + public UInt16 GetSMUClockInfo; + public UInt16 SelectCRTC_Source; + public UInt16 EnableGraphSurfaces; + public UInt16 UpdateCRTC_DoubleBufferRegisters; + public UInt16 LUT_AutoFill; + public UInt16 SetDCEClock; + public UInt16 GetMemoryClock; + public UInt16 GetEngineClock; + public UInt16 SetCRTC_UsingDTDTiming; + public UInt16 ExternalEncoderControl; + public UInt16 LVTMAOutputControl; + public UInt16 VRAM_BlockDetectionByStrap; + public UInt16 MemoryCleanUp; + public UInt16 ProcessI2cChannelTransaction; + public UInt16 WriteOneByteToHWAssistedI2C; + public UInt16 ReadHWAssistedI2CStatus; + public UInt16 SpeedFanControl_For_ASIC_Init; + public UInt16 PowerConnectorDetection; + public UInt16 MC_Synchronization; + public UInt16 ComputeMemoryOREnginePLLORClockParam; + public UInt16 Gfx_Init; + public UInt16 VRAM_GetCurrentInfoBlock; + public UInt16 DynamicMemorySettings; + public UInt16 MemoryTraining; + public UInt16 EnableSpreadSpectrumOnPPLL; + public UInt16 TMDSAOutputControl; + public UInt16 SetVoltage; + public UInt16 DAC1OutputControl; + public UInt16 ReadEfuseValue; + public UInt16 ComputeMemoryClockParam; + public UInt16 ClockSource_For_ASIC_Init; + public UInt16 MemoryDeviceInit; + public UInt16 GetDispObjectInfo; + public UInt16 DIG1EncoderControl; + public UInt16 DIG2EncoderControl; + public UInt16 DIG1TransmitterControl; + public UInt16 DIG2TransmitterControl; + public UInt16 ProcessAuxChannelTransaction; + public UInt16 DPEncoderService; + public UInt16 GetVoltageInfo; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_CMD_TABLES + { + public ATOM_COMMON_TABLE_HEADER sHeader; + [XmlIgnore]public ATOM_CMD_TABLES_LIST cmds; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ATOM_CMD_HEADER + { + public Int16 usStructureSize; + public Byte ucTableFormatRevision; + public Byte ucTableContentRevision; + public Byte work_data_size_in_4bytes; + public Byte params_size_in_1bytes; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_DATA_TABLES { @@ -275,6 +379,47 @@ public struct ATOM_DATA_TABLES public UInt16 ServiceInfo; }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + unsafe public struct ATOM_FIRMWARE_INFO + { + public ATOM_COMMON_TABLE_HEADER sHeader; + public UInt32 ulFirmwareRevision; + public UInt32 ulDefaultEngineClock_in10khz_asic_init_arg0; + public UInt32 ulDefaultMemoryClock_in10khz_asic_init_arg1; + public UInt32 ulSPLL_OutputFreq_in10khz; + public UInt32 ulGPUPLL_OutputFreq_in10khz; + public UInt32 ulReserved1; + public UInt32 ulReserved2; + public UInt32 ulMaxPixelClockPLL_Output_in10khz; + public UInt32 ulBinaryAlteredInfo; + public UInt32 ulDefaultDispEngineClkFreq_in10khz; + public Byte ucReserved3; + public Byte ucMinAllowedBL_Level; + public UInt16 usBootUpVDDCVoltage_in_mV; + public UInt16 usLcdMinPixelClockPLL_Output_inMHz; + public UInt16 usLcdMaxPixelClockPLL_Output_inMHz; + public UInt32 ulReserved4; + public UInt32 ulMinPixelClockPLL_Output_in10khz; + public Byte ucRemoteDisplayConfig; + [XmlIgnore]public fixed Byte ucReserved5[3]; + public UInt32 ulReserved6; + public UInt32 ulReserved7; + public UInt16 usReserved11_usMaxPixelClockDAC_in10khz; + public UInt16 usMinPixelClockPLL_Input_in10khz; + public UInt16 usMaxPixelClockPLL_Input_in10khz; + public UInt16 usBootUpVDDCIVoltage_in_mV; + public UInt16 usFirmwareCapability; + public UInt16 usCoreReferenceClock_in10khz; + public UInt16 usMemoryReferenceClock_in10khz; + public UInt16 usUniphyDPModeExtClkFreq_in10khz; + public Byte ucMemoryModule_ID; + public Byte ucCoolingSolution1IsLiquid; + public Byte ucProductBranding; + public Byte ucReserved9; + public UInt16 usBootUpMVDDCVoltage_in_mV; + public UInt16 usBootUpVDDGFXVoltage_in_mV; + }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe public struct ATOM_POWERPLAY_TABLE { @@ -967,6 +1112,65 @@ public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) } } + public string HexRange(int start, int len) + { + return string.Format("{0,4}bytes (0x{1:X}-{2:X})", len, start, start+ len); + } + + private struct NamedCmd + { + public int Addr; + public int Index; + public string Name; + public ATOM_CMD_HEADER Header; + }; + + public void PrintCmds(ATOM_CMD_TABLES_LIST cmds) + { + Console.WriteLine(""); + const int CODE_OFFSET = 6; + var addr_to_info = new List(); + var fields = cmds.GetType().GetFields(); + for (int index = 0; index < fields.Length; ++index) + { + var fi = fields[index]; + int total_addr = (UInt16)fi.GetValue(cmds); + if (total_addr == 0) + { + Console.WriteLine(string.Format(" <{0} tbindex=\"{1}\"/>", fi.Name, index)); + } + else + { + var header = Reader(total_addr).Read(); + addr_to_info.Add(new NamedCmd{ + Addr = total_addr, + Index = index, + Name = fi.Name, + Header = header}); + } + } + Console.WriteLine(""); + var ordered = addr_to_info.OrderBy(nc => nc.Addr).ToList(); + int prev = ordered[0].Addr; + foreach(var s in ordered) + { + int skept = s.Addr - prev; + if (skept != 0 && skept != 1) //Ignore i-bte skips since they are for alignment + { + Console.WriteLine(""); + } + var info = string.Format("<{0,-36} tbindex=\"{1,2}\" total=\"{2}\" code=\"{3}\" format_content_rev=\"{4}\" work_data_size_in_4bytes=\"{5}\" params_size_in_1bytes=\"{6}\"/>", + s.Name, + s.Index, + HexRange(s.Addr, s.Header.usStructureSize), + HexRange(s.Addr + CODE_OFFSET, s.Header.usStructureSize - CODE_OFFSET), + s.Header.ucTableFormatRevision + "." + s.Header.ucTableContentRevision, + s.Header.work_data_size_in_4bytes, s.Header.params_size_in_1bytes + ); + prev = s.Addr + s.Header.usStructureSize; + Console.WriteLine(info); + } + } public void Print(object output, string desc_name = "", string desc = "") { try @@ -1191,8 +1395,12 @@ private void ParseVbiosAndClose(Stream fileStream) MessageBox.Show("Unsupported DeviceID 0x" + deviceId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } + var atom_code = Reader(atom_rom_header.usMasterCommandTableOffset).ReadPrint(); + PrintCmds(atom_code.cmds); atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); + Reader(atom_data_table.FirmwareInfo).ReadPrint(); + ReadPrintTable(atom_data_table.GPIO_I2C_Info, (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), i2c_assigment => Marshal.SizeOf(i2c_assigment) diff --git a/README.md b/README.md index dedcdf9..74ebf9b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Prebuilt version works on linux with mono, just type `./run.sh`, also see that f
Example XML output (large, ~1k lines)
-<ATOM_ROM_HEADER of="0x224-0x250  len=0x2C=44">
+<ATOM_ROM_HEADER of="0x22C-0x258  len=0x2C=44">
   <sHeader>
     <usStructureSize>36 = 0x24 = 0b100100</usStructureSize>
     <ucTableFormatRevision>1</ucTableFormatRevision>
@@ -23,25 +23,115 @@ Prebuilt version works on linux with mono, just type `./run.sh`, also see that f
     <char>77 = 0x4D = 0b1001101</char>
   </uaFirmWareSignature>
   <usBiosRuntimeSegmentAddress>49152 = 0xC000 = 0b1100000000000000</usBiosRuntimeSegmentAddress>
-  <usProtectedModeInfoOffset>969 = 0x3C9 = 0b1111001001</usProtectedModeInfoOffset>
-  <usConfigFilenameOffset>456 = 0x1C8 = 0b111001000</usConfigFilenameOffset>
-  <usCRC_BlockOffset>621 = 0x26D = 0b1001101101</usCRC_BlockOffset>
-  <usBIOS_BootupMessageOffset>284 = 0x11C = 0b100011100</usBIOS_BootupMessageOffset>
-  <usInt10Offset>1006 = 0x3EE = 0b1111101110</usInt10Offset>
+  <usProtectedModeInfoOffset>977 = 0x3D1 = 0b1111010001</usProtectedModeInfoOffset>
+  <usConfigFilenameOffset>460 = 0x1CC = 0b111001100</usConfigFilenameOffset>
+  <usCRC_BlockOffset>629 = 0x275 = 0b1001110101</usCRC_BlockOffset>
+  <usBIOS_BootupMessageOffset>288 = 0x120 = 0b100100000</usBIOS_BootupMessageOffset>
+  <usInt10Offset>1014 = 0x3F6 = 0b1111110110</usInt10Offset>
   <usPciBusDevInitCode>0</usPciBusDevInitCode>
   <usIoBaseAddress>0</usIoBaseAddress>
-  <usSubsystemVendorID>4098 = 0x1002 = 0b1000000000010</usSubsystemVendorID>
-  <usSubsystemID>2871 = 0xB37 = 0b101100110111</usSubsystemID>
-  <usPCI_InfoOffset>584 = 0x248 = 0b1001001000</usPCI_InfoOffset>
-  <usMasterCommandTableOffset>38742 = 0x9756 = 0b1001011101010110</usMasterCommandTableOffset>
-  <usMasterDataTableOffset>38908 = 0x97FC = 0b1001011111111100</usMasterDataTableOffset>
+  <usSubsystemVendorID>4163 = 0x1043 = 0b1000001000011</usSubsystemVendorID>
+  <usSubsystemID>1313 = 0x521 = 0b10100100001</usSubsystemID>
+  <usPCI_InfoOffset>592 = 0x250 = 0b1001010000</usPCI_InfoOffset>
+  <usMasterCommandTableOffset>38748 = 0x975C = 0b1001011101011100</usMasterCommandTableOffset>
+  <usMasterDataTableOffset>38914 = 0x9802 = 0b1001100000000010</usMasterDataTableOffset>
   <ucExtendedFunctionCode>160 = 0xA0 = 0b10100000</ucExtendedFunctionCode>
   <ucReserved>0</ucReserved>
   <ulPSPDirTableOffset>1380533072 = 0x52494350 = 0b1010010010010010100001101010000</ulPSPDirTableOffset>
-  <usDeviceID>4098 = 0x1002 = 0b1000000000010</usDeviceID>
-  <usVendorID>26591 = 0x67DF = 0b110011111011111</usVendorID>
+  <usVendorID>4098 = 0x1002 = 0b1000000000010</usVendorID>
+  <usDeviceID>26591 = 0x67DF = 0b110011111011111</usDeviceID>
 </ATOM_ROM_HEADER>
-<ATOM_DATA_TABLES of="0x97FC-0x9846  len=0x4A=74">
+<ATOM_CMD_TABLES of="0x975C-0x9802  len=0xA6=166">
+  <sHeader>
+    <usStructureSize>166 = 0xA6 = 0b10100110</usStructureSize>
+    <ucTableFormatRevision>1</ucTableFormatRevision>
+    <ucTableContentRevision>1</ucTableContentRevision>
+  </sHeader>
+</ATOM_CMD_TABLES>
+<CMDS-NOT-IMPLEMENTED>
+    <EnableCRTCMemReq tbindex="6"/>
+    <DVOEncoderControl tbindex="8"/>
+    <DAC_LoadDetection tbindex="21"/>
+    <LVTMAEncoderControl tbindex="22"/>
+    <HW_Misc_Operation tbindex="23"/>
+    <DAC1EncoderControl tbindex="24"/>
+    <DAC2EncoderControl tbindex="25"/>
+    <DVOOutputControl tbindex="26"/>
+    <GetConditionalGoldenSetting tbindex="28"/>
+    <SMC_Init tbindex="29"/>
+    <Gfx_Harvesting tbindex="32"/>
+    <GetPixelClock tbindex="36"/>
+    <SetCRTC_Timing tbindex="39"/>
+    <ExternalEncoderControl tbindex="50"/>
+    <TMDSAOutputControl tbindex="66"/>
+    <DAC1OutputControl tbindex="68"/>
+    <ComputeMemoryClockParam tbindex="70"/>
+    <GetDispObjectInfo tbindex="73"/>
+    <DIG1EncoderControl tbindex="74"/>
+    <DIG2EncoderControl tbindex="75"/>
+</CMDS-NOT-IMPLEMENTED>
+<ASIC_Init                            tbindex=" 0" total=" 149bytes (0xAA90-AB25)" code=" 143bytes (0xAA96-AB25)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
+<GetDisplaySurfaceSize                tbindex=" 1" total="  87bytes (0xAB26-AB7D)" code="  81bytes (0xAB2C-AB7D)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<ASIC_RegistersInit_For_ASIC_Init     tbindex=" 2" total=" 183bytes (0xAB7E-AC35)" code=" 177bytes (0xAB84-AC35)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
+<MemoryControllerInit_For_ASIC_Init   tbindex=" 5" total=" 275bytes (0xAC36-AD49)" code=" 269bytes (0xAC3C-AD49)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
+<GPIOPinControl                       tbindex=" 9" total=" 255bytes (0xAD4A-AE49)" code=" 249bytes (0xAD50-AE49)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<SetEngineClock                       tbindex="10" total=" 428bytes (0xAE4A-AFF6)" code=" 422bytes (0xAE50-AFF6)" format_content_rev="1.2" work_data_size_in_4bytes="20" params_size_in_1bytes="0"/>
+<SetMemoryClock                       tbindex="11" total=" 290bytes (0xAFF6-B118)" code=" 284bytes (0xAFFC-B118)" format_content_rev="2.1" work_data_size_in_4bytes="12" params_size_in_1bytes="4"/>
+<SetPixelClock                        tbindex="12" total="1227bytes (0xB118-B5E3)" code="1221bytes (0xB11E-B5E3)" format_content_rev="1.7" work_data_size_in_4bytes="8" params_size_in_1bytes="8"/>
+<EnableDispPowerGating_For_ASIC_Init  tbindex="13" total=" 391bytes (0xB5E4-B76B)" code=" 385bytes (0xB5EA-B76B)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<ResetMemoryDLL                       tbindex="14" total="   7bytes (0xB76C-B773)" code="   1bytes (0xB772-B773)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<ResetMemoryDevice                    tbindex="15" total=" 138bytes (0xB774-B7FE)" code=" 132bytes (0xB77A-B7FE)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<ClockSource_For_ASIC_Init            tbindex="71" total="1108bytes (0xB7FE-BC52)" code="1102bytes (0xB804-BC52)" format_content_rev="1.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
+<MemoryDeviceInit                     tbindex="72" total="  82bytes (0xBC52-BCA4)" code="  76bytes (0xBC58-BCA4)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<AdjustMemoryController               tbindex="18" total=" 273bytes (0xBCA4-BDB5)" code=" 267bytes (0xBCAA-BDB5)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<EnableASIC_StaticPwrMgt              tbindex="19" total="  33bytes (0xBDB6-BDD7)" code="  27bytes (0xBDBC-BDD7)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<SetUniphyInstance                    tbindex="20" total=" 142bytes (0xBDD8-BE66)" code=" 136bytes (0xBDDE-BE66)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<CV1OutputControl                     tbindex="27" total=" 703bytes (0xBE66-C125)" code=" 697bytes (0xBE6C-C125)" format_content_rev="2.2" work_data_size_in_4bytes="28" params_size_in_1bytes="4"/>
+<EnableScaler                         tbindex="33" total=" 120bytes (0xC126-C19E)" code=" 114bytes (0xC12C-C19E)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<BlankCRTC                            tbindex="34" total=" 116bytes (0xC19E-C212)" code=" 110bytes (0xC1A4-C212)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<EnableCRTC                           tbindex="35" total="  62bytes (0xC212-C250)" code="  56bytes (0xC218-C250)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<EnableVGA_Render                     tbindex="37" total="  44bytes (0xC250-C27C)" code="  38bytes (0xC256-C27C)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<GetSCLKOverMCLKRatio                 tbindex="38" total="  34bytes (0xC27C-C29E)" code="  28bytes (0xC282-C29E)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="4"/>
+<SetCRTC_OverScan                     tbindex="40" total="  25bytes (0xC29E-C2B7)" code="  19bytes (0xC2A4-C2B7)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
+<GetSMUClockInfo                      tbindex="41" total=" 128bytes (0xC2B8-C338)" code=" 122bytes (0xC2BE-C338)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<SelectCRTC_Source                    tbindex="42" total=" 198bytes (0xC338-C3FE)" code=" 192bytes (0xC33E-C3FE)" format_content_rev="1.3" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
+<EnableGraphSurfaces                  tbindex="43" total=" 431bytes (0xC3FE-C5AD)" code=" 425bytes (0xC404-C5AD)" format_content_rev="1.4" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
+<UpdateCRTC_DoubleBufferRegisters     tbindex="44" total="  73bytes (0xC5AE-C5F7)" code="  67bytes (0xC5B4-C5F7)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<LUT_AutoFill                         tbindex="45" total=" 149bytes (0xC5F8-C68D)" code=" 143bytes (0xC5FE-C68D)" format_content_rev="1.3" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<GetMemoryClock                       tbindex="47" total="  61bytes (0xC68E-C6CB)" code="  55bytes (0xC694-C6CB)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<GetEngineClock                       tbindex="48" total=" 216bytes (0xC6CC-C7A4)" code=" 210bytes (0xC6D2-C7A4)" format_content_rev="1.1" work_data_size_in_4bytes="12" params_size_in_1bytes="0"/>
+<SetCRTC_UsingDTDTiming               tbindex="49" total=" 339bytes (0xC7A4-C8F7)" code=" 333bytes (0xC7AA-C8F7)" format_content_rev="2.3" work_data_size_in_4bytes="0" params_size_in_1bytes="24"/>
+<VRAM_BlockDetectionByStrap           tbindex="52" total=" 190bytes (0xC8F8-C9B6)" code=" 184bytes (0xC8FE-C9B6)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<VRAM_BlockVenderDetection            tbindex=" 3" total="  10bytes (0xC9B6-C9C0)" code="   4bytes (0xC9BC-C9C0)" format_content_rev="1.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
+<MemoryParamAdjust                    tbindex=" 7" total="  26bytes (0xC9C0-C9DA)" code="  20bytes (0xC9C6-C9DA)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<ProcessI2cChannelTransaction         tbindex="54" total=" 561bytes (0xC9DA-CC0B)" code=" 555bytes (0xC9E0-CC0B)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
+<ReadHWAssistedI2CStatus              tbindex="56" total="  95bytes (0xCC0C-CC6B)" code="  89bytes (0xCC12-CC6B)" format_content_rev="2.2" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<SpeedFanControl_For_ASIC_Init        tbindex="57" total="  10bytes (0xCC6C-CC76)" code="   4bytes (0xCC72-CC76)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<PowerConnectorDetection              tbindex="58" total="  10bytes (0xCC76-CC80)" code="   4bytes (0xCC7C-CC80)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<MC_Synchronization                   tbindex="59" total="  60bytes (0xCC80-CCBC)" code="  54bytes (0xCC86-CCBC)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<ComputeMemoryOREnginePLLORClockParam tbindex="60" total=" 431bytes (0xCCBC-CE6B)" code=" 425bytes (0xCCC2-CE6B)" format_content_rev="1.6" work_data_size_in_4bytes="4" params_size_in_1bytes="24"/>
+<Gfx_Init                             tbindex="61" total="   7bytes (0xCE6C-CE73)" code="   1bytes (0xCE72-CE73)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<DynamicMemorySettings                tbindex="63" total=" 368bytes (0xCE74-CFE4)" code=" 362bytes (0xCE7A-CFE4)" format_content_rev="2.1" work_data_size_in_4bytes="8" params_size_in_1bytes="4"/>
+<MemoryTraining                       tbindex="64" total=" 256bytes (0xCFE4-D0E4)" code=" 250bytes (0xCFEA-D0E4)" format_content_rev="1.2" work_data_size_in_4bytes="4" params_size_in_1bytes="4"/>
+<EnableSpreadSpectrumOnPPLL           tbindex="65" total=" 140bytes (0xD0E4-D170)" code=" 134bytes (0xD0EA-D170)" format_content_rev="1.4" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<MemoryPLLInit                        tbindex="16" total="  49bytes (0xD170-D1A1)" code="  43bytes (0xD176-D1A1)" format_content_rev="1.3" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
+<AdjustDisplayPll                     tbindex="17" total="  16bytes (0xD1A2-D1B2)" code="  10bytes (0xD1A8-D1B2)" format_content_rev="1.3" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
+<SetVoltage                           tbindex="67" total=" 451bytes (0xD1B2-D375)" code=" 445bytes (0xD1B8-D375)" format_content_rev="1.4" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<GetVoltageInfo                       tbindex="80" total=" 131bytes (0xD376-D3F9)" code=" 125bytes (0xD37C-D3F9)" format_content_rev="1.3" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
+<DIGxEncoderControl                   tbindex=" 4" total=" 615bytes (0xD3FA-D661)" code=" 609bytes (0xD400-D661)" format_content_rev="1.5" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<VRAM_GetCurrentInfoBlock             tbindex="62" total="  41bytes (0xD662-D68B)" code="  35bytes (0xD668-D68B)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<DIG1TransmitterControl               tbindex="76" total=" 326bytes (0xD68C-D7D2)" code=" 320bytes (0xD692-D7D2)" format_content_rev="1.6" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<DIG2TransmitterControl               tbindex="77" total=" 824bytes (0xD7D2-DB0A)" code=" 818bytes (0xD7D8-DB0A)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<ProcessAuxChannelTransaction         tbindex="78" total=" 588bytes (0xDB0A-DD56)" code=" 582bytes (0xDB10-DD56)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
+<DPEncoderService                     tbindex="79" total="  92bytes (0xDD56-DDB2)" code="  86bytes (0xDD5C-DDB2)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
+<PatchMCSetting                       tbindex="30" total=" 159bytes (0xDDB2-DE51)" code=" 153bytes (0xDDB8-DE51)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
+<MC_SEQ_Control                       tbindex="31" total=" 393bytes (0xDE52-DFDB)" code=" 387bytes (0xDE58-DFDB)" format_content_rev="1.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
+<WriteOneByteToHWAssistedI2C          tbindex="55" total=" 229bytes (0xDFDC-E0C1)" code=" 223bytes (0xDFE2-E0C1)" format_content_rev="2.2" work_data_size_in_4bytes="20" params_size_in_1bytes="0"/>
+<LVTMAOutputControl                   tbindex="51" total=" 465bytes (0xE0C2-E293)" code=" 459bytes (0xE0C8-E293)" format_content_rev="2.1" work_data_size_in_4bytes="4" params_size_in_1bytes="4"/>
+<ReadEfuseValue                       tbindex="69" total=" 113bytes (0xE294-E305)" code=" 107bytes (0xE29A-E305)" format_content_rev="3.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
+<MemoryCleanUp                        tbindex="53" total=" 206bytes (0xE306-E3D4)" code=" 200bytes (0xE30C-E3D4)" format_content_rev="3.1" work_data_size_in_4bytes="0" params_size_in_1bytes="16"/>
+<SetDCEClock                          tbindex="46" total=" 761bytes (0xE3D4-E6CD)" code=" 755bytes (0xE3DA-E6CD)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
+<ATOM_DATA_TABLES of="0x9802-0x984C  len=0x4A=74">
   <sHeader>
     <usStructureSize>74 = 0x4A = 0b1001010</usStructureSize>
     <ucTableFormatRevision>1</ucTableFormatRevision>
@@ -50,40 +140,304 @@ Prebuilt version works on linux with mono, just type `./run.sh`, also see that f
   <UtilityPipeLine>0</UtilityPipeLine>
   <MultimediaCapabilityInfo>0</MultimediaCapabilityInfo>
   <MultimediaConfigInfo>0</MultimediaConfigInfo>
-  <StandardVESA_Timing>38982 = 0x9846 = 0b1001100001000110</StandardVESA_Timing>
-  <FirmwareInfo>39210 = 0x992A = 0b1001100100101010</FirmwareInfo>
-  <PaletteData>39318 = 0x9996 = 0b1001100110010110</PaletteData>
-  <LCD_Info>39370 = 0x99CA = 0b1001100111001010</LCD_Info>
+  <StandardVESA_Timing>38988 = 0x984C = 0b1001100001001100</StandardVESA_Timing>
+  <FirmwareInfo>39216 = 0x9930 = 0b1001100100110000</FirmwareInfo>
+  <PaletteData>39324 = 0x999C = 0b1001100110011100</PaletteData>
+  <LCD_Info>39376 = 0x99D0 = 0b1001100111010000</LCD_Info>
   <DIGTransmitterInfo>0</DIGTransmitterInfo>
-  <SMU_Info>43600 = 0xAA50 = 0b1010101001010000</SMU_Info>
+  <SMU_Info>43522 = 0xAA02 = 0b1010101000000010</SMU_Info>
   <SupportedDevicesInfo>0</SupportedDevicesInfo>
-  <GPIO_I2C_Info>39448 = 0x9A18 = 0b1001101000011000</GPIO_I2C_Info>
-  <VRAM_UsageByFirmware>39668 = 0x9AF4 = 0b1001101011110100</VRAM_UsageByFirmware>
-  <GPIO_Pin_LUT>39680 = 0x9B00 = 0b1001101100000000</GPIO_Pin_LUT>
-  <VESA_ToInternalModeLUT>39712 = 0x9B20 = 0b1001101100100000</VESA_ToInternalModeLUT>
-  <GFX_Info>39880 = 0x9BC8 = 0b1001101111001000</GFX_Info>
-  <PowerPlayInfo>39904 = 0x9BE0 = 0b1001101111100000</PowerPlayInfo>
+  <GPIO_I2C_Info>39454 = 0x9A1E = 0b1001101000011110</GPIO_I2C_Info>
+  <VRAM_UsageByFirmware>39674 = 0x9AFA = 0b1001101011111010</VRAM_UsageByFirmware>
+  <GPIO_Pin_LUT>39686 = 0x9B06 = 0b1001101100000110</GPIO_Pin_LUT>
+  <VESA_ToInternalModeLUT>39718 = 0x9B26 = 0b1001101100100110</VESA_ToInternalModeLUT>
+  <GFX_Info>39834 = 0x9B9A = 0b1001101110011010</GFX_Info>
+  <PowerPlayInfo>39858 = 0x9BB2 = 0b1001101110110010</PowerPlayInfo>
   <GPUVirtualizationInfo>0</GPUVirtualizationInfo>
-  <SaveRestoreInfo>43576 = 0xAA38 = 0b1010101000111000</SaveRestoreInfo>
+  <SaveRestoreInfo>43498 = 0xA9EA = 0b1010100111101010</SaveRestoreInfo>
   <PPLL_SS_Info>0</PPLL_SS_Info>
-  <OemInfo>0</OemInfo>
+  <OemInfo>40692 = 0x9EF4 = 0b1001111011110100</OemInfo>
   <XTMDS_Info>0</XTMDS_Info>
   <MclkSS_Info>0</MclkSS_Info>
-  <Object_Header>40744 = 0x9F28 = 0b1001111100101000</Object_Header>
-  <IndirectIOAccess>41818 = 0xA35A = 0b1010001101011010</IndirectIOAccess>
-  <MC_InitParameter>41094 = 0xA086 = 0b1010000010000110</MC_InitParameter>
+  <Object_Header>40698 = 0x9EFA = 0b1001111011111010</Object_Header>
+  <IndirectIOAccess>41772 = 0xA32C = 0b1010001100101100</IndirectIOAccess>
+  <MC_InitParameter>41048 = 0xA058 = 0b1010000001011000</MC_InitParameter>
   <ASIC_VDDC_Info>0</ASIC_VDDC_Info>
-  <ASIC_InternalSS_Info>43436 = 0xA9AC = 0b1010100110101100</ASIC_InternalSS_Info>
-  <TV_VideoMode>43476 = 0xA9D4 = 0b1010100111010100</TV_VideoMode>
-  <VRAM_Info>41944 = 0xA3D8 = 0b1010001111011000</VRAM_Info>
+  <ASIC_InternalSS_Info>43358 = 0xA95E = 0b1010100101011110</ASIC_InternalSS_Info>
+  <TV_VideoMode>43398 = 0xA986 = 0b1010100110000110</TV_VideoMode>
+  <VRAM_Info>41898 = 0xA3AA = 0b1010001110101010</VRAM_Info>
   <MemoryTrainingInfo>0</MemoryTrainingInfo>
   <IntegratedSystemInfo>0</IntegratedSystemInfo>
-  <ASIC_ProfilingInfo>43066 = 0xA83A = 0b1010100000111010</ASIC_ProfilingInfo>
-  <VoltageObjectInfo>43334 = 0xA946 = 0b1010100101000110</VoltageObjectInfo>
+  <ASIC_ProfilingInfo>43020 = 0xA80C = 0b1010100000001100</ASIC_ProfilingInfo>
+  <VoltageObjectInfo>43288 = 0xA918 = 0b1010100100011000</VoltageObjectInfo>
   <PowerSourceInfo>0</PowerSourceInfo>
-  <ServiceInfo>43656 = 0xAA88 = 0b1010101010001000</ServiceInfo>
+  <ServiceInfo>43578 = 0xAA3A = 0b1010101000111010</ServiceInfo>
 </ATOM_DATA_TABLES>
-<ATOM_POWERPLAY_TABLE of="0x9BE0-0x9C2D  len=0x4D=77">
+<ATOM_FIRMWARE_INFO of="0x9930-0x9990  len=0x60=96">
+  <sHeader>
+    <usStructureSize>108 = 0x6C = 0b1101100</usStructureSize>
+    <ucTableFormatRevision>2 = 0x2 = 0b10</ucTableFormatRevision>
+    <ucTableContentRevision>2 = 0x2 = 0b10</ucTableContentRevision>
+  </sHeader>
+  <ulFirmwareRevision>254935553 = 0xF320201 = 0b1111001100100000001000000001</ulFirmwareRevision>
+  <ulDefaultEngineClock_in10khz_asic_init_arg0>30000 = 0x7530 = 0b111010100110000</ulDefaultEngineClock_in10khz_asic_init_arg0>
+  <ulDefaultMemoryClock_in10khz_asic_init_arg1>30000 = 0x7530 = 0b111010100110000</ulDefaultMemoryClock_in10khz_asic_init_arg1>
+  <ulSPLL_OutputFreq_in10khz>0</ulSPLL_OutputFreq_in10khz>
+  <ulGPUPLL_OutputFreq_in10khz>360000 = 0x57E40 = 0b1010111111001000000</ulGPUPLL_OutputFreq_in10khz>
+  <ulReserved1>0</ulReserved1>
+  <ulReserved2>0</ulReserved2>
+  <ulMaxPixelClockPLL_Output_in10khz>600000 = 0x927C0 = 0b10010010011111000000</ulMaxPixelClockPLL_Output_in10khz>
+  <ulBinaryAlteredInfo>0</ulBinaryAlteredInfo>
+  <ulDefaultDispEngineClkFreq_in10khz>62610 = 0xF492 = 0b1111010010010010</ulDefaultDispEngineClkFreq_in10khz>
+  <ucReserved3>0</ucReserved3>
+  <ucMinAllowedBL_Level>0</ucMinAllowedBL_Level>
+  <usBootUpVDDCVoltage_in_mV>900 = 0x384 = 0b1110000100</usBootUpVDDCVoltage_in_mV>
+  <usLcdMinPixelClockPLL_Output_inMHz>2970 = 0xB9A = 0b101110011010</usLcdMinPixelClockPLL_Output_inMHz>
+  <usLcdMaxPixelClockPLL_Output_inMHz>6000 = 0x1770 = 0b1011101110000</usLcdMaxPixelClockPLL_Output_inMHz>
+  <ulReserved4>0</ulReserved4>
+  <ulMinPixelClockPLL_Output_in10khz>297000 = 0x48828 = 0b1001000100000101000</ulMinPixelClockPLL_Output_in10khz>
+  <ucRemoteDisplayConfig>0</ucRemoteDisplayConfig>
+  <ulReserved6>0</ulReserved6>
+  <ulReserved7>0</ulReserved7>
+  <usReserved11_usMaxPixelClockDAC_in10khz>40000 = 0x9C40 = 0b1001110001000000</usReserved11_usMaxPixelClockDAC_in10khz>
+  <usMinPixelClockPLL_Input_in10khz>2500 = 0x9C4 = 0b100111000100</usMinPixelClockPLL_Input_in10khz>
+  <usMaxPixelClockPLL_Input_in10khz>10000 = 0x2710 = 0b10011100010000</usMaxPixelClockPLL_Input_in10khz>
+  <usBootUpVDDCIVoltage_in_mV>850 = 0x352 = 0b1101010010</usBootUpVDDCIVoltage_in_mV>
+  <usFirmwareCapability>16414 = 0x401E = 0b100000000011110</usFirmwareCapability>
+  <usCoreReferenceClock_in10khz>10000 = 0x2710 = 0b10011100010000</usCoreReferenceClock_in10khz>
+  <usMemoryReferenceClock_in10khz>10000 = 0x2710 = 0b10011100010000</usMemoryReferenceClock_in10khz>
+  <usUniphyDPModeExtClkFreq_in10khz>10000 = 0x2710 = 0b10011100010000</usUniphyDPModeExtClkFreq_in10khz>
+  <ucMemoryModule_ID>0</ucMemoryModule_ID>
+  <ucCoolingSolution1IsLiquid>0</ucCoolingSolution1IsLiquid>
+  <ucProductBranding>0</ucProductBranding>
+  <ucReserved9>0</ucReserved9>
+  <usBootUpMVDDCVoltage_in_mV>1550 = 0x60E = 0b11000001110</usBootUpMVDDCVoltage_in_mV>
+  <usBootUpVDDGFXVoltage_in_mV>0</usBootUpVDDGFXVoltage_in_mV>
+</ATOM_FIRMWARE_INFO>
+<ATOM_GPIO_I2C_INFO of="0x9A1E-0x9A22  len=0x4=4">
+  <sHeader>
+    <usStructureSize>220 = 0xDC = 0b11011100</usStructureSize>
+    <ucTableFormatRevision>1</ucTableFormatRevision>
+    <ucTableContentRevision>1</ucTableContentRevision>
+  </sHeader>
+</ATOM_GPIO_I2C_INFO>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A22-0x9A3D  len=0x1B=27">
+  <usClkMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>144 = 0x90 = 0b10010000</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>0</bfI2C_LineMux>
+    <Description>144 = 0x90 = 0b10010000</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A3D-0x9A58  len=0x1B=27">
+  <usClkMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>145 = 0x91 = 0b10010001</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>1</bfI2C_LineMux>
+    <Description>145 = 0x91 = 0b10010001</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A58-0x9A73  len=0x1B=27">
+  <usClkMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>146 = 0x92 = 0b10010010</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>2 = 0x2 = 0b10</bfI2C_LineMux>
+    <Description>146 = 0x92 = 0b10010010</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A73-0x9A8E  len=0x1B=27">
+  <usClkMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>147 = 0x93 = 0b10010011</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>3 = 0x3 = 0b11</bfI2C_LineMux>
+    <Description>147 = 0x93 = 0b10010011</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9A8E-0x9AA9  len=0x1B=27">
+  <usClkMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>148 = 0x94 = 0b10010100</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>4 = 0x4 = 0b100</bfI2C_LineMux>
+    <Description>148 = 0x94 = 0b10010100</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9AA9-0x9AC4  len=0x1B=27">
+  <usClkMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>149 = 0x95 = 0b10010101</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>5 = 0x5 = 0b101</bfI2C_LineMux>
+    <Description>149 = 0x95 = 0b10010101</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9AC4-0x9ADF  len=0x1B=27">
+  <usClkMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>150 = 0x96 = 0b10010110</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>6 = 0x6 = 0b110</bfI2C_LineMux>
+    <Description>150 = 0x96 = 0b10010110</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>1</ucDataMaskShift>
+  <ucDataEnShift>1</ucDataEnShift>
+  <ucDataY_Shift>1</ucDataY_Shift>
+  <ucDataA_Shift>1</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_GPIO_I2C_ASSIGMENT of="0x9ADF-0x9AFA  len=0x1B=27">
+  <usClkMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usClkMaskRegisterIndex>
+  <usClkEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usClkEnRegisterIndex>
+  <usClkY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usClkY_RegisterIndex>
+  <usClkA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usClkA_RegisterIndex>
+  <usDataMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usDataMaskRegisterIndex>
+  <usDataEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usDataEnRegisterIndex>
+  <usDataY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usDataY_RegisterIndex>
+  <usDataA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usDataA_RegisterIndex>
+  <sucI2cId>
+    <gpio_id>151 = 0x97 = 0b10010111</gpio_id>
+    <bfHW_Capable>true</bfHW_Capable>
+    <bfHW_EngineID>1</bfHW_EngineID>
+    <bfI2C_LineMux>7 = 0x7 = 0b111</bfI2C_LineMux>
+    <Description>151 = 0x97 = 0b10010111</Description>
+  </sucI2cId>
+  <ucClkMaskShift>0</ucClkMaskShift>
+  <ucClkEnShift>0</ucClkEnShift>
+  <ucClkY_Shift>0</ucClkY_Shift>
+  <ucClkA_Shift>0</ucClkA_Shift>
+  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
+  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
+  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
+  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
+  <ucReserved1>0</ucReserved1>
+  <ucReserved2>0</ucReserved2>
+</ATOM_GPIO_I2C_ASSIGMENT>
+<ATOM_POWERPLAY_TABLE of="0x9BB2-0x9BFF  len=0x4D=77">
   <sHeader>
     <usStructureSize>833 = 0x341 = 0b1101000001</usStructureSize>
     <ucTableFormatRevision>7 = 0x7 = 0b111</ucTableFormatRevision>
@@ -91,15 +445,15 @@ Prebuilt version works on linux with mono, just type `./run.sh`, also see that f
   </sHeader>
   <ucTableRevision>0</ucTableRevision>
   <usTableSize>77 = 0x4D = 0b1001101</usTableSize>
-  <ulGoldenPPID>1546 = 0x60A = 0b11000001010</ulGoldenPPID>
-  <ulGoldenRevision>9275 = 0x243B = 0b10010000111011</ulGoldenRevision>
+  <ulGoldenPPID>1665 = 0x681 = 0b11010000001</ulGoldenPPID>
+  <ulGoldenRevision>10394 = 0x289A = 0b10100010011010</ulGoldenRevision>
   <usFormatID>25 = 0x19 = 0b11001</usFormatID>
   <usVoltageTime>0</usVoltageTime>
-  <ulPlatformCaps>16941056 = 0x1028000 = 0b1000000101000000000000000</ulPlatformCaps>
+  <ulPlatformCaps>17203200 = 0x1068000 = 0b1000001101000000000000000</ulPlatformCaps>
   <ulMaxODEngineClock>200000 = 0x30D40 = 0b110000110101000000</ulMaxODEngineClock>
   <ulMaxODMemoryClock>225000 = 0x36EE8 = 0b110110111011101000</ulMaxODMemoryClock>
   <usPowerControlLimit>50 = 0x32 = 0b110010</usPowerControlLimit>
-  <usUlvVoltageOffset>50 = 0x32 = 0b110010</usUlvVoltageOffset>
+  <usUlvVoltageOffset>25 = 0x19 = 0b11001</usUlvVoltageOffset>
   <usStateArrayOffset>77 = 0x4D = 0b1001101</usStateArrayOffset>
   <usFanTableOffset>673 = 0x2A1 = 0b1010100001</usFanTableOffset>
   <usThermalControllerOffset>664 = 0x298 = 0b1010011000</usThermalControllerOffset>
@@ -116,370 +470,399 @@ Prebuilt version works on linux with mono, just type `./run.sh`, also see that f
   <usPCIETableOffset>800 = 0x320 = 0b1100100000</usPCIETableOffset>
   <usGPIOTableOffset>826 = 0x33A = 0b1100111010</usGPIOTableOffset>
 </ATOM_POWERPLAY_TABLE>
-<ATOM_Polaris_PowerTune_Table of="0x9EB1-0x9EE6  len=0x35=53">
-  <ucRevId>4 = 0x4 = 0b100</ucRevId>
-  <usTDP>145 = 0x91 = 0b10010001</usTDP>
-  <usConfigurableTDP>0</usConfigurableTDP>
-  <usTDC>132 = 0x84 = 0b10000100</usTDC>
-  <usBatteryPowerLimit>145 = 0x91 = 0b10010001</usBatteryPowerLimit>
-  <usSmallPowerLimit>145 = 0x91 = 0b10010001</usSmallPowerLimit>
-  <usLowCACLeakage>0</usLowCACLeakage>
-  <usHighCACLeakage>0</usHighCACLeakage>
-  <usMaximumPowerDeliveryLimit>145 = 0x91 = 0b10010001</usMaximumPowerDeliveryLimit>
-  <usTjMax>90 = 0x5A = 0b1011010</usTjMax>
-  <usPowerTuneDataSetID>0</usPowerTuneDataSetID>
-  <usEDCLimit>0</usEDCLimit>
-  <usSoftwareShutdownTemp>94 = 0x5E = 0b1011110</usSoftwareShutdownTemp>
-  <usClockStretchAmount>2 = 0x2 = 0b10</usClockStretchAmount>
-  <usTemperatureLimitHotspot>105 = 0x69 = 0b1101001</usTemperatureLimitHotspot>
-  <usTemperatureLimitLiquid1>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid1>
-  <usTemperatureLimitLiquid2>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid2>
-  <usTemperatureLimitVrVddc>115 = 0x73 = 0b1110011</usTemperatureLimitVrVddc>
-  <usTemperatureLimitVrMvdd>115 = 0x73 = 0b1110011</usTemperatureLimitVrMvdd>
-  <usTemperatureLimitPlx>95 = 0x5F = 0b1011111</usTemperatureLimitPlx>
-  <ucLiquid1_I2C_address>0</ucLiquid1_I2C_address>
-  <ucLiquid2_I2C_address>0</ucLiquid2_I2C_address>
-  <ucLiquid_I2C_Line>144 = 0x90 = 0b10010000</ucLiquid_I2C_Line>
-  <ucVr_I2C_address>16 = 0x10 = 0b10000</ucVr_I2C_address>
-  <ucVr_I2C_Line>150 = 0x96 = 0b10010110</ucVr_I2C_Line>
-  <ucPlx_I2C_address>0</ucPlx_I2C_address>
-  <ucPlx_I2C_Line>144 = 0x90 = 0b10010000</ucPlx_I2C_Line>
-  <usBoostPowerLimit>0</usBoostPowerLimit>
-  <ucCKS_LDO_REFSEL>6 = 0x6 = 0b110</ucCKS_LDO_REFSEL>
-  <ucHotSpotOnly>0</ucHotSpotOnly>
-  <ucReserve>0</ucReserve>
-  <usReserve>0</usReserve>
-</ATOM_Polaris_PowerTune_Table>
-<ATOM_FAN_TABLE of="0x9E81-0x9EAE  len=0x2D=45">
-  <ucRevId>9 = 0x9 = 0b1001</ucRevId>
-  <ucTHyst>3 = 0x3 = 0b11</ucTHyst>
-  <usTMin>4000 = 0xFA0 = 0b111110100000</usTMin>
-  <usTMed>6500 = 0x1964 = 0b1100101100100</usTMed>
-  <usTHigh>8500 = 0x2134 = 0b10000100110100</usTHigh>
-  <usPWMMin>2000 = 0x7D0 = 0b11111010000</usPWMMin>
-  <usPWMMed>4000 = 0xFA0 = 0b111110100000</usPWMMed>
-  <usPWMHigh>6000 = 0x1770 = 0b1011101110000</usPWMHigh>
-  <usTMax>10900 = 0x2A94 = 0b10101010010100</usTMax>
-  <ucFanControlMode>1</ucFanControlMode>
-  <usFanPWMMax>100 = 0x64 = 0b1100100</usFanPWMMax>
-  <usFanOutputSensitivity>4836 = 0x12E4 = 0b1001011100100</usFanOutputSensitivity>
-  <usFanRPMMax>2200 = 0x898 = 0b100010011000</usFanRPMMax>
-  <ulMinFanSCLKAcousticLimit>91000 = 0x16378 = 0b10110001101111000</ulMinFanSCLKAcousticLimit>
-  <ucTargetTemperature>80 = 0x50 = 0b1010000</ucTargetTemperature>
-  <ucMinimumPWMLimit>20 = 0x14 = 0b10100</ucMinimumPWMLimit>
-  <usFanGainEdge>100 = 0x64 = 0b1100100</usFanGainEdge>
-  <usFanGainHotspot>100 = 0x64 = 0b1100100</usFanGainHotspot>
-  <usFanGainLiquid>100 = 0x64 = 0b1100100</usFanGainLiquid>
-  <usFanGainVrVddc>100 = 0x64 = 0b1100100</usFanGainVrVddc>
-  <usFanGainVrMvdd>100 = 0x64 = 0b1100100</usFanGainVrMvdd>
-  <usFanGainPlx>100 = 0x64 = 0b1100100</usFanGainPlx>
-  <usFanGainHbm>100 = 0x64 = 0b1100100</usFanGainHbm>
-  <usReserved>10752 = 0x2A00 = 0b10101000000000</usReserved>
-</ATOM_FAN_TABLE>
-<ATOM_MCLK_TABLE of="0x9D95-0x9D97  len=0x2=2">
-  <ucRevId>0</ucRevId>
-  <ucNumEntries>3 = 0x3 = 0b11</ucNumEntries>
-</ATOM_MCLK_TABLE>
-<ATOM_MCLK_ENTRY of="0x9D97-0x9DA4  len=0xD=13">
-  <ucVddcInd>0</ucVddcInd>
-  <usVddci>800 = 0x320 = 0b1100100000</usVddci>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
-  <ulMclk>30000 = 0x7530 = 0b111010100110000</ulMclk>
-  <usReserved>0</usReserved>
-</ATOM_MCLK_ENTRY>
-<ATOM_MCLK_ENTRY of="0x9DA4-0x9DB1  len=0xD=13">
-  <ucVddcInd>9 = 0x9 = 0b1001</ucVddcInd>
-  <usVddci>850 = 0x352 = 0b1101010010</usVddci>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
-  <ulMclk>100000 = 0x186A0 = 0b11000011010100000</ulMclk>
-  <usReserved>0</usReserved>
-</ATOM_MCLK_ENTRY>
-<ATOM_MCLK_ENTRY of="0x9DB1-0x9DBE  len=0xD=13">
-  <ucVddcInd>12 = 0xC = 0b1100</ucVddcInd>
-  <usVddci>950 = 0x3B6 = 0b1110110110</usVddci>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
-  <ulMclk>200000 = 0x30D40 = 0b110000110101000000</ulMclk>
-  <usReserved>0</usReserved>
-</ATOM_MCLK_ENTRY>
-<ATOM_SCLK_TABLE of="0x9D1B-0x9D1D  len=0x2=2">
-  <ucRevId>1</ucRevId>
-  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
-</ATOM_SCLK_TABLE>
-<ATOM_SCLK_ENTRY of="0x9D1D-0x9D2C  len=0xF=15">
-  <ucVddInd>0</ucVddInd>
-  <usVddcOffset>0</usVddcOffset>
-  <ulSclk>30000 = 0x7530 = 0b111010100110000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>128 = 0x80 = 0b10000000</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D2C-0x9D3B  len=0xF=15">
-  <ucVddInd>1</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>60000 = 0xEA60 = 0b1110101001100000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D3B-0x9D4A  len=0xF=15">
-  <ucVddInd>2 = 0x2 = 0b10</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>90000 = 0x15F90 = 0b10101111110010000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D4A-0x9D59  len=0xF=15">
-  <ucVddInd>3 = 0x3 = 0b11</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>114500 = 0x1BF44 = 0b11011111101000100</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D59-0x9D68  len=0xF=15">
-  <ucVddInd>4 = 0x4 = 0b100</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>121500 = 0x1DA9C = 0b11101101010011100</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D68-0x9D77  len=0xF=15">
-  <ucVddInd>5 = 0x5 = 0b101</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>125700 = 0x1EB04 = 0b11110101100000100</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D77-0x9D86  len=0xF=15">
-  <ucVddInd>6 = 0x6 = 0b110</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>130000 = 0x1FBD0 = 0b11111101111010000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D86-0x9D95  len=0xF=15">
-  <ucVddInd>7 = 0x7 = 0b111</ucVddInd>
-  <usVddcOffset>0</usVddcOffset>
-  <ulSclk>134000 = 0x20B70 = 0b100000101101110000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_VOLTAGE_TABLE of="0x9C57-0x9C59  len=0x2=2">
+<ATOM_VOLTAGE_TABLE of="0x9C29-0x9C2B  len=0x2=2 Name=VddcLookupTable">
   <ucRevId>0</ucRevId>
   <ucNumEntries>16 = 0x10 = 0b10000</ucNumEntries>
 </ATOM_VOLTAGE_TABLE>
-<ATOM_VOLTAGE_ENTRY of="0x9C59-0x9C61  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C2B-0x9C33  len=0x8=8">
   <usVdd>750 = 0x2EE = 0b1011101110</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C61-0x9C69  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C33-0x9C3B  len=0x8=8">
   <usVdd>65282 = 0xFF02 = 0b1111111100000010</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C69-0x9C71  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C3B-0x9C43  len=0x8=8">
   <usVdd>65283 = 0xFF03 = 0b1111111100000011</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C71-0x9C79  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C43-0x9C4B  len=0x8=8">
   <usVdd>65284 = 0xFF04 = 0b1111111100000100</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C79-0x9C81  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C4B-0x9C53  len=0x8=8">
   <usVdd>65285 = 0xFF05 = 0b1111111100000101</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C81-0x9C89  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C53-0x9C5B  len=0x8=8">
   <usVdd>65286 = 0xFF06 = 0b1111111100000110</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C89-0x9C91  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C5B-0x9C63  len=0x8=8">
   <usVdd>65287 = 0xFF07 = 0b1111111100000111</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C91-0x9C99  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C63-0x9C6B  len=0x8=8">
   <usVdd>65288 = 0xFF08 = 0b1111111100001000</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C99-0x9CA1  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C6B-0x9C73  len=0x8=8">
   <usVdd>800 = 0x320 = 0b1100100000</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CA1-0x9CA9  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C73-0x9C7B  len=0x8=8">
   <usVdd>850 = 0x352 = 0b1101010010</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CA9-0x9CB1  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C7B-0x9C83  len=0x8=8">
   <usVdd>900 = 0x384 = 0b1110000100</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CB1-0x9CB9  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C83-0x9C8B  len=0x8=8">
   <usVdd>950 = 0x3B6 = 0b1110110110</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CB9-0x9CC1  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C8B-0x9C93  len=0x8=8">
   <usVdd>1000 = 0x3E8 = 0b1111101000</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CC1-0x9CC9  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C93-0x9C9B  len=0x8=8">
   <usVdd>1050 = 0x41A = 0b10000011010</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CC9-0x9CD1  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9C9B-0x9CA3  len=0x8=8">
   <usVdd>1100 = 0x44C = 0b10001001100</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CD1-0x9CD9  len=0x8=8">
+<ATOM_VOLTAGE_ENTRY of="0x9CA3-0x9CAB  len=0x8=8">
   <usVdd>1150 = 0x47E = 0b10001111110</usVdd>
   <usCACLow>0</usCACLow>
   <usCACMid>0</usCACMid>
   <usCACHigh>0</usCACHigh>
 </ATOM_VOLTAGE_ENTRY>
-<ATOM_VRAM_INFO of="0xA3D8-0xA3EC  len=0x14=20">
-  <sHeader>
-    <usStructureSize>1121 = 0x461 = 0b10001100001</usStructureSize>
-    <ucTableFormatRevision>2 = 0x2 = 0b10</ucTableFormatRevision>
-    <ucTableContentRevision>2 = 0x2 = 0b10</ucTableContentRevision>
-  </sHeader>
-  <usMemAdjustTblOffset>75 = 0x4B = 0b1001011</usMemAdjustTblOffset>
-  <usMemClkPatchTblOffset>90 = 0x5A = 0b1011010</usMemClkPatchTblOffset>
-  <usMcAdjustPerTileTblOffset>764 = 0x2FC = 0b1011111100</usMcAdjustPerTileTblOffset>
-  <usMcPhyInitTableOffset>946 = 0x3B2 = 0b1110110010</usMcPhyInitTableOffset>
-  <usDramDataRemapTblOffset>810 = 0x32A = 0b1100101010</usDramDataRemapTblOffset>
-  <usReserved1>0</usReserved1>
-  <ucNumOfVRAMModule>1</ucNumOfVRAMModule>
-  <ucMemoryClkPatchTblVer>1</ucMemoryClkPatchTblVer>
-  <ucVramModuleVer>8 = 0x8 = 0b1000</ucVramModuleVer>
-  <ucMcPhyTileNum>4 = 0x4 = 0b100</ucMcPhyTileNum>
-</ATOM_VRAM_INFO>
-<ATOM_VRAM_ENTRY of="0xA3EC-0xA42C  len=0x40=64">
-  <ulChannelMapCfg>1985220658 = 0x76541032 = 0b1110110010101000001000000110010</ulChannelMapCfg>
-  <usModuleSize>55 = 0x37 = 0b110111</usModuleSize>
-  <usMcRamCfg>24738 = 0x60A2 = 0b110000010100010</usMcRamCfg>
-  <usEnableChannels>255 = 0xFF = 0b11111111</usEnableChannels>
-  <ucExtMemoryID>0</ucExtMemoryID>
-  <ucMemoryType>80 = 0x50 = 0b1010000</ucMemoryType>
-  <ucChannelNum>3 = 0x3 = 0b11</ucChannelNum>
-  <ucChannelWidth>5 = 0x5 = 0b101</ucChannelWidth>
-  <ucDensity>99 = 0x63 = 0b1100011</ucDensity>
-  <ucBankCol>10 = 0xA = 0b1010</ucBankCol>
-  <ucMisc>4 = 0x4 = 0b100</ucMisc>
-  <ucVREFI>0</ucVREFI>
+<ATOM_VOLTAGE_TABLE of="0x9CAB-0x9CAD  len=0x2=2 Name=VddgfxLookupTable">
+  <ucRevId>0</ucRevId>
+  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
+</ATOM_VOLTAGE_TABLE>
+<ATOM_VOLTAGE_ENTRY of="0x9CAD-0x9CB5  len=0x8=8">
+  <usVdd>900 = 0x384 = 0b1110000100</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CB5-0x9CBD  len=0x8=8">
+  <usVdd>65282 = 0xFF02 = 0b1111111100000010</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CBD-0x9CC5  len=0x8=8">
+  <usVdd>65283 = 0xFF03 = 0b1111111100000011</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CC5-0x9CCD  len=0x8=8">
+  <usVdd>65284 = 0xFF04 = 0b1111111100000100</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CCD-0x9CD5  len=0x8=8">
+  <usVdd>65285 = 0xFF05 = 0b1111111100000101</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CD5-0x9CDD  len=0x8=8">
+  <usVdd>65286 = 0xFF06 = 0b1111111100000110</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CDD-0x9CE5  len=0x8=8">
+  <usVdd>65287 = 0xFF07 = 0b1111111100000111</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_VOLTAGE_ENTRY of="0x9CE5-0x9CED  len=0x8=8">
+  <usVdd>65288 = 0xFF08 = 0b1111111100001000</usVdd>
+  <usCACLow>0</usCACLow>
+  <usCACMid>0</usCACMid>
+  <usCACHigh>0</usCACHigh>
+</ATOM_VOLTAGE_ENTRY>
+<ATOM_SCLK_TABLE of="0x9CED-0x9CEF  len=0x2=2 Name=SclkDependencyTable">
+  <ucRevId>1</ucRevId>
+  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
+</ATOM_SCLK_TABLE>
+<ATOM_SCLK_ENTRY of="0x9CEF-0x9CFE  len=0xF=15">
+  <ucVddInd>0</ucVddInd>
+  <usVddcOffset>0</usVddcOffset>
+  <ulSclk>30000 = 0x7530 = 0b111010100110000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>128 = 0x80 = 0b10000000</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9CFE-0x9D0D  len=0xF=15">
+  <ucVddInd>1</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>60000 = 0xEA60 = 0b1110101001100000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D0D-0x9D1C  len=0xF=15">
+  <ucVddInd>2 = 0x2 = 0b10</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>90000 = 0x15F90 = 0b10101111110010000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D1C-0x9D2B  len=0xF=15">
+  <ucVddInd>3 = 0x3 = 0b11</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>116200 = 0x1C5E8 = 0b11100010111101000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D2B-0x9D3A  len=0xF=15">
+  <ucVddInd>4 = 0x4 = 0b100</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>123300 = 0x1E1A4 = 0b11110000110100100</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D3A-0x9D49  len=0xF=15">
+  <ucVddInd>5 = 0x5 = 0b101</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>127500 = 0x1F20C = 0b11111001000001100</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D49-0x9D58  len=0xF=15">
+  <ucVddInd>6 = 0x6 = 0b110</ucVddInd>
+  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
+  <ulSclk>131900 = 0x2033C = 0b100000001100111100</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_SCLK_ENTRY of="0x9D58-0x9D67  len=0xF=15">
+  <ucVddInd>7 = 0x7 = 0b111</ucVddInd>
+  <usVddcOffset>0</usVddcOffset>
+  <ulSclk>136000 = 0x21340 = 0b100001001101000000</ulSclk>
+  <usEdcCurrent>0</usEdcCurrent>
+  <ucReliabilityTemperature>0</ucReliabilityTemperature>
+  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
+  <ulSclkOffset>0</ulSclkOffset>
+</ATOM_SCLK_ENTRY>
+<ATOM_MCLK_TABLE of="0x9D67-0x9D69  len=0x2=2 Name=MclkDependencyTable">
+  <ucRevId>0</ucRevId>
+  <ucNumEntries>3 = 0x3 = 0b11</ucNumEntries>
+</ATOM_MCLK_TABLE>
+<ATOM_MCLK_ENTRY of="0x9D69-0x9D76  len=0xD=13">
+  <ucVddcInd>0</ucVddcInd>
+  <usVddci>800 = 0x320 = 0b1100100000</usVddci>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
+  <ulMclk>30000 = 0x7530 = 0b111010100110000</ulMclk>
   <usReserved>0</usReserved>
-  <usMemorySize>8192 = 0x2000 = 0b10000000000000</usMemorySize>
-  <ucMcTunningSetId>0</ucMcTunningSetId>
-  <ucRowNum>11 = 0xB = 0b1011</ucRowNum>
-  <usEMRS2Value>16384 = 0x4000 = 0b100000000000000</usEMRS2Value>
-  <usEMRS3Value>24832 = 0x6100 = 0b110000100000000</usEMRS3Value>
-  <ucMemoryVenderID>33 = 0x21 = 0b100001</ucMemoryVenderID>
-  <ucRefreshRateFactor>2 = 0x2 = 0b10</ucRefreshRateFactor>
-  <ucFIFODepth>2 = 0x2 = 0b10</ucFIFODepth>
-  <ucCDR_Bandwidth>0</ucCDR_Bandwidth>
-  <ulChannelMapCfg1>0</ulChannelMapCfg1>
-  <ulBankMapCfg>484675 = 0x76543 = 0b1110110010101000011</ulBankMapCfg>
-  <ulReserved>0</ulReserved>
-  <FullName>K4G80325FB</FullName>
-</ATOM_VRAM_ENTRY>
-End of mem
-
-<ATOM_VRAM_TIMING_ENTRY of="0xA460-0xA494  len=0x34=52">
-  <ulClkRange>25000 = 0x61A8 = 0b110000110101000</ulClkRange>
-  <LatencyString>333000000000000022CC1C00628C110B10570A080EC3B00100204100220114209A8800A000000000040308091B0D0F0E</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA494-0xA4C8  len=0x34=52">
-  <ulClkRange>40000 = 0x9C40 = 0b1001110001000000</ulClkRange>
-  <LatencyString>333000000000000022CC1C006394121120570A091144B102002042002A021420AA8800A00000000006040C0E2B10120F</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA4C8-0xA4FC  len=0x34=52">
-  <ulClkRange>60000 = 0xEA60 = 0b1110101001100000</ulClkRange>
-  <LatencyString>333000000000000022CC1C00A520241A40570B0B97051204002264003A051420CA8800A0000000000906121541151810</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA4FC-0xA530  len=0x34=52">
-  <ulClkRange>90000 = 0x15F90 = 0b10101111110010000</ulClkRange>
-  <LatencyString>333000000000000022CC1C00E7B4362780570B0F9F072306002485005A091420DA8800A0000000000E081A20621D2012</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA530-0xA564  len=0x34=52">
-  <ulClkRange>100000 = 0x186A0 = 0b11000011010100000</ulClkRange>
-  <LatencyString>333000000000000022CC1C000839372B90570B102148D30600448600620A14206A8900A0000000000F091D236D1F2213</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA564-0xA598  len=0x34=52">
-  <ulClkRange>112500 = 0x1B774 = 0b11011011101110100</ulClkRange>
-  <LatencyString>333000000000000022CC1C0029414831A0570C1125C9B3070046A6006A0C14206A8900A000000000110A21287B222614</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA598-0xA5CC  len=0x34=52">
-  <ulClkRange>125000 = 0x1E848 = 0b11110100001001000</ulClkRange>
-  <LatencyString>333000000000000022CC1C004A494937B0570C12294A94080046A700720E14207A8900A000000000130B252D89252A14</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA5CC-0xA600  len=0x34=52">
-  <ulClkRange>137500 = 0x2191C = 0b100001100100011100</ulClkRange>
-  <LatencyString>333000000000000022CC1C008C515A3DC0570D132DCB74090048C7007A0014207A8900A002000000150D293197282E15</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA600-0xA634  len=0x34=52">
-  <ulClkRange>150000 = 0x249F0 = 0b100100100111110000</ulClkRange>
-  <LatencyString>555000000000000022CC1C00AD595B41C0570E14B00B450A0068C70003011420FA8900A003000000170E2B34A42A3116</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA634-0xA668  len=0x34=52">
-  <ulClkRange>162500 = 0x27AC4 = 0b100111101011000100</ulClkRange>
-  <LatencyString>555000000000000022CC1C00CE616C47D0570F15B48C250B006AE7000B031420FA8900A003000000190F2F39B22D3517</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA668-0xA69C  len=0x34=52">
-  <ulClkRange>175000 = 0x2AB98 = 0b101010101110011000</ulClkRange>
-  <LatencyString>777000000000000022CC1C00106A6D4DD0571016B90D060C006AE70014051420FA8900A0030000001B11333DC0303A17</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA69C-0xA6D0  len=0x34=52">
-  <ulClkRange>200000 = 0x30D40 = 0b110000110101000000</ulClkRange>
-  <LatencyString>777000000000000022CC1C0031F67E57F05711183FCFB60D006C070124081420FA8900A0030000001E123A46DB354019</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA6D0-0xA704  len=0x34=52">
-  <ulClkRange>0</ulClkRange>
-  <LatencyString>060008000E0044FFFF00FFFFFF001F000000FFFFFF011F000000FFFFFF021F000000FFFFFF031F00000000000000E1B4</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_OBJECT_HEADER_V3 of="0x9F28-0x9F3A  len=0x12=18">
+</ATOM_MCLK_ENTRY>
+<ATOM_MCLK_ENTRY of="0x9D76-0x9D83  len=0xD=13">
+  <ucVddcInd>8 = 0x8 = 0b1000</ucVddcInd>
+  <usVddci>850 = 0x352 = 0b1101010010</usVddci>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
+  <ulMclk>100000 = 0x186A0 = 0b11000011010100000</ulMclk>
+  <usReserved>0</usReserved>
+</ATOM_MCLK_ENTRY>
+<ATOM_MCLK_ENTRY of="0x9D83-0x9D90  len=0xD=13">
+  <ucVddcInd>11 = 0xB = 0b1011</ucVddcInd>
+  <usVddci>950 = 0x3B6 = 0b1110110110</usVddci>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
+  <ulMclk>200000 = 0x30D40 = 0b110000110101000000</ulMclk>
+  <usReserved>0</usReserved>
+</ATOM_MCLK_ENTRY>
+<ATOM_MM_DEPENDENCY_TABLE of="0x9D90-0x9D92  len=0x2=2">
+  <ucRevId>0</ucRevId>
+  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
+</ATOM_MM_DEPENDENCY_TABLE>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9D92-0x9DA9  len=0x17=23">
+  <ucVddcInd>8 = 0x8 = 0b1000</ucVddcInd>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <ulDClk>58000 = 0xE290 = 0b1110001010010000</ulDClk>
+  <ulVClk>75000 = 0x124F8 = 0b10010010011111000</ulVClk>
+  <ulEClk>63000 = 0xF618 = 0b1111011000011000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>57000 = 0xDEA8 = 0b1101111010101000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9DA9-0x9DC0  len=0x17=23">
+  <ucVddcInd>9 = 0x9 = 0b1001</ucVddcInd>
+  <usVddgfxOffset>65460 = 0xFFB4 = 0b1111111110110100</usVddgfxOffset>
+  <ulDClk>63000 = 0xF618 = 0b1111011000011000</ulDClk>
+  <ulVClk>80000 = 0x13880 = 0b10011100010000000</ulVClk>
+  <ulEClk>69000 = 0x10D88 = 0b10000110110001000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>64000 = 0xFA00 = 0b1111101000000000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9DC0-0x9DD7  len=0x17=23">
+  <ucVddcInd>10 = 0xA = 0b1010</ucVddcInd>
+  <usVddgfxOffset>65435 = 0xFF9B = 0b1111111110011011</usVddgfxOffset>
+  <ulDClk>68000 = 0x109A0 = 0b10000100110100000</ulDClk>
+  <ulVClk>85000 = 0x14C08 = 0b10100110000001000</ulVClk>
+  <ulEClk>75000 = 0x124F8 = 0b10010010011111000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>70000 = 0x11170 = 0b10001000101110000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9DD7-0x9DEE  len=0x17=23">
+  <ucVddcInd>11 = 0xB = 0b1011</ucVddcInd>
+  <usVddgfxOffset>65410 = 0xFF82 = 0b1111111110000010</usVddgfxOffset>
+  <ulDClk>73000 = 0x11D28 = 0b10001110100101000</ulDClk>
+  <ulVClk>89000 = 0x15BA8 = 0b10101101110101000</ulVClk>
+  <ulEClk>81000 = 0x13C68 = 0b10011110001101000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>76000 = 0x128E0 = 0b10010100011100000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9DEE-0x9E05  len=0x17=23">
+  <ucVddcInd>12 = 0xC = 0b1100</ucVddcInd>
+  <usVddgfxOffset>65385 = 0xFF69 = 0b1111111101101001</usVddgfxOffset>
+  <ulDClk>77000 = 0x12CC8 = 0b10010110011001000</ulDClk>
+  <ulVClk>92000 = 0x16760 = 0b10110011101100000</ulVClk>
+  <ulEClk>86000 = 0x14FF0 = 0b10100111111110000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>81000 = 0x13C68 = 0b10011110001101000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9E05-0x9E1C  len=0x17=23">
+  <ucVddcInd>13 = 0xD = 0b1101</ucVddcInd>
+  <usVddgfxOffset>65335 = 0xFF37 = 0b1111111100110111</usVddgfxOffset>
+  <ulDClk>80000 = 0x13880 = 0b10011100010000000</ulDClk>
+  <ulVClk>95000 = 0x17318 = 0b10111001100011000</ulVClk>
+  <ulEClk>91000 = 0x16378 = 0b10110001101111000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>85000 = 0x14C08 = 0b10100110000001000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9E1C-0x9E33  len=0x17=23">
+  <ucVddcInd>14 = 0xE = 0b1110</ucVddcInd>
+  <usVddgfxOffset>65285 = 0xFF05 = 0b1111111100000101</usVddgfxOffset>
+  <ulDClk>83000 = 0x14438 = 0b10100010000111000</ulDClk>
+  <ulVClk>98000 = 0x17ED0 = 0b10111111011010000</ulVClk>
+  <ulEClk>96000 = 0x17700 = 0b10111011100000000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>88000 = 0x157C0 = 0b10101011111000000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_MM_DEPENDENCY_RECORD of="0x9E33-0x9E4A  len=0x17=23">
+  <ucVddcInd>15 = 0xF = 0b1111</ucVddcInd>
+  <usVddgfxOffset>0</usVddgfxOffset>
+  <ulDClk>86000 = 0x14FF0 = 0b10100111111110000</ulDClk>
+  <ulVClk>100000 = 0x186A0 = 0b11000011010100000</ulVClk>
+  <ulEClk>100000 = 0x186A0 = 0b11000011010100000</ulEClk>
+  <ulAClk>0</ulAClk>
+  <ulSAMUClk>91000 = 0x16378 = 0b10110001101111000</ulSAMUClk>
+</ATOM_MM_DEPENDENCY_RECORD>
+<ATOM_FAN_TABLE of="0x9E53-0x9E80  len=0x2D=45">
+  <ucRevId>9 = 0x9 = 0b1001</ucRevId>
+  <ucTHyst>3 = 0x3 = 0b11</ucTHyst>
+  <usTMin>4000 = 0xFA0 = 0b111110100000</usTMin>
+  <usTMed>6500 = 0x1964 = 0b1100101100100</usTMed>
+  <usTHigh>8500 = 0x2134 = 0b10000100110100</usTHigh>
+  <usPWMMin>2000 = 0x7D0 = 0b11111010000</usPWMMin>
+  <usPWMMed>4000 = 0xFA0 = 0b111110100000</usPWMMed>
+  <usPWMHigh>6000 = 0x1770 = 0b1011101110000</usPWMHigh>
+  <usTMax>10900 = 0x2A94 = 0b10101010010100</usTMax>
+  <ucFanControlMode>1</ucFanControlMode>
+  <usFanPWMMax>100 = 0x64 = 0b1100100</usFanPWMMax>
+  <usFanOutputSensitivity>4836 = 0x12E4 = 0b1001011100100</usFanOutputSensitivity>
+  <usFanRPMMax>2150 = 0x866 = 0b100001100110</usFanRPMMax>
+  <ulMinFanSCLKAcousticLimit>90000 = 0x15F90 = 0b10101111110010000</ulMinFanSCLKAcousticLimit>
+  <ucTargetTemperature>70 = 0x46 = 0b1000110</ucTargetTemperature>
+  <ucMinimumPWMLimit>44 = 0x2C = 0b101100</ucMinimumPWMLimit>
+  <usFanGainEdge>150 = 0x96 = 0b10010110</usFanGainEdge>
+  <usFanGainHotspot>150 = 0x96 = 0b10010110</usFanGainHotspot>
+  <usFanGainLiquid>100 = 0x64 = 0b1100100</usFanGainLiquid>
+  <usFanGainVrVddc>150 = 0x96 = 0b10010110</usFanGainVrVddc>
+  <usFanGainVrMvdd>150 = 0x96 = 0b10010110</usFanGainVrMvdd>
+  <usFanGainPlx>150 = 0x96 = 0b10010110</usFanGainPlx>
+  <usFanGainHbm>100 = 0x64 = 0b1100100</usFanGainHbm>
+  <usReserved>12801 = 0x3201 = 0b11001000000001</usReserved>
+</ATOM_FAN_TABLE>
+<ATOM_Polaris_PowerTune_Table of="0x9E83-0x9EB8  len=0x35=53">
+  <ucRevId>4 = 0x4 = 0b100</ucRevId>
+  <usTDP>145 = 0x91 = 0b10010001</usTDP>
+  <usConfigurableTDP>0</usConfigurableTDP>
+  <usTDC>132 = 0x84 = 0b10000100</usTDC>
+  <usBatteryPowerLimit>145 = 0x91 = 0b10010001</usBatteryPowerLimit>
+  <usSmallPowerLimit>145 = 0x91 = 0b10010001</usSmallPowerLimit>
+  <usLowCACLeakage>0</usLowCACLeakage>
+  <usHighCACLeakage>0</usHighCACLeakage>
+  <usMaximumPowerDeliveryLimit>145 = 0x91 = 0b10010001</usMaximumPowerDeliveryLimit>
+  <usTjMax>90 = 0x5A = 0b1011010</usTjMax>
+  <usPowerTuneDataSetID>0</usPowerTuneDataSetID>
+  <usEDCLimit>0</usEDCLimit>
+  <usSoftwareShutdownTemp>94 = 0x5E = 0b1011110</usSoftwareShutdownTemp>
+  <usClockStretchAmount>2 = 0x2 = 0b10</usClockStretchAmount>
+  <usTemperatureLimitHotspot>105 = 0x69 = 0b1101001</usTemperatureLimitHotspot>
+  <usTemperatureLimitLiquid1>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid1>
+  <usTemperatureLimitLiquid2>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid2>
+  <usTemperatureLimitVrVddc>115 = 0x73 = 0b1110011</usTemperatureLimitVrVddc>
+  <usTemperatureLimitVrMvdd>115 = 0x73 = 0b1110011</usTemperatureLimitVrMvdd>
+  <usTemperatureLimitPlx>95 = 0x5F = 0b1011111</usTemperatureLimitPlx>
+  <ucLiquid1_I2C_address>0</ucLiquid1_I2C_address>
+  <ucLiquid2_I2C_address>0</ucLiquid2_I2C_address>
+  <ucLiquid_I2C_Line>144 = 0x90 = 0b10010000</ucLiquid_I2C_Line>
+  <ucVr_I2C_address>96 = 0x60 = 0b1100000</ucVr_I2C_address>
+  <ucVr_I2C_Line>150 = 0x96 = 0b10010110</ucVr_I2C_Line>
+  <ucPlx_I2C_address>0</ucPlx_I2C_address>
+  <ucPlx_I2C_Line>144 = 0x90 = 0b10010000</ucPlx_I2C_Line>
+  <usBoostPowerLimit>0</usBoostPowerLimit>
+  <ucCKS_LDO_REFSEL>6 = 0x6 = 0b110</ucCKS_LDO_REFSEL>
+  <ucHotSpotOnly>0</ucHotSpotOnly>
+  <ucReserve>0</ucReserve>
+  <usReserve>0</usReserve>
+</ATOM_Polaris_PowerTune_Table>
+<ATOM_OBJECT_HEADER_V3 of="0x9EFA-0x9F0C  len=0x12=18">
   <sHeader>
     <usStructureSize>350 = 0x15E = 0b101011110</usStructureSize>
     <ucTableFormatRevision>1</ucTableFormatRevision>
@@ -493,12 +876,12 @@ End of mem
   <usDisplayPathTableOffset>18 = 0x12 = 0b10010</usDisplayPathTableOffset>
   <usMiscObjectTableOffset>0</usMiscObjectTableOffset>
 </ATOM_OBJECT_HEADER_V3>
-<ATOM_DISPLAY_OBJECT_PATH_TABLE of="0x9F3A-0x9F3E  len=0x4=4">
+<ATOM_DISPLAY_OBJECT_PATH_TABLE of="0x9F0C-0x9F10  len=0x4=4">
   <ucNumOfDispPath>5 = 0x5 = 0b101</ucNumOfDispPath>
   <ucVersion>1</ucVersion>
   <ucPadding2>0</ucPadding2>
 </ATOM_DISPLAY_OBJECT_PATH_TABLE>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F3E-0x9F48  len=0xA=10">
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F10-0x9F1A  len=0xA=10">
   <usDeviceTag>8 = 0x8 = 0b1000</usDeviceTag>
   <usSize>10 = 0xA = 0b1010</usSize>
   <usConnObjectId>
@@ -512,12 +895,12 @@ End of mem
     <Index>1</Index>
   </usGPUObjectId>
   <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
     <Index>1</Index>
   </usGraphicObjIdsFirst>
 </ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F48-0x9F52  len=0xA=10">
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F1A-0x9F24  len=0xA=10">
   <usDeviceTag>128 = 0x80 = 0b10000000</usDeviceTag>
   <usSize>10 = 0xA = 0b1010</usSize>
   <usConnObjectId>
@@ -531,18 +914,18 @@ End of mem
     <Index>1</Index>
   </usGPUObjectId>
   <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
     <Index>2 = 0x2 = 0b10</Index>
   </usGraphicObjIdsFirst>
 </ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F52-0x9F5C  len=0xA=10">
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F24-0x9F2E  len=0xA=10">
   <usDeviceTag>512 = 0x200 = 0b1000000000</usDeviceTag>
   <usSize>10 = 0xA = 0b1010</usSize>
   <usConnObjectId>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>3 = 0x3 = 0b11</Index>
+    <Index>1</Index>
   </usConnObjectId>
   <usGPUObjectId>
     <KindInNamespace>0</KindInNamespace>
@@ -550,18 +933,18 @@ End of mem
     <Index>1</Index>
   </usGPUObjectId>
   <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
     <Index>1</Index>
   </usGraphicObjIdsFirst>
 </ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F5C-0x9F66  len=0xA=10">
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F2E-0x9F38  len=0xA=10">
   <usDeviceTag>1024 = 0x400 = 0b10000000000</usDeviceTag>
   <usSize>10 = 0xA = 0b1010</usSize>
   <usConnObjectId>
     <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
+    <Index>2 = 0x2 = 0b10</Index>
   </usConnObjectId>
   <usGPUObjectId>
     <KindInNamespace>0</KindInNamespace>
@@ -569,12 +952,12 @@ End of mem
     <Index>1</Index>
   </usGPUObjectId>
   <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
     <Index>2 = 0x2 = 0b10</Index>
   </usGraphicObjIdsFirst>
 </ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F66-0x9F70  len=0xA=10">
+<ATOM_DISPLAY_OBJECT_PATH of="0x9F38-0x9F42  len=0xA=10">
   <usDeviceTag>2048 = 0x800 = 0b100000000000</usDeviceTag>
   <usSize>10 = 0xA = 0b1010</usSize>
   <usConnObjectId>
@@ -593,96 +976,14 @@ End of mem
     <Index>1</Index>
   </usGraphicObjIdsFirst>
 </ATOM_DISPLAY_OBJECT_PATH>
-Encoders:
-<ATOM_OBJECT_TABLE of="0xA023-0xA027  len=0x4=4">
-  <ucNumberOfObjects>5 = 0x5 = 0b101</ucNumberOfObjects>
-  <ucPadding0>0</ucPadding0>
-  <ucPadding1>0</ucPadding1>
-  <ucPadding2>0</ucPadding2>
-</ATOM_OBJECT_TABLE>
-<ATOM_OBJECT of="0xA027-0xA02F  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>295 = 0x127 = 0b100100111</usSrcDstTableOffset>
-  <usRecordOffset>301 = 0x12D = 0b100101101</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA055-0xA057  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa057:0F00
-<ATOM_OBJECT of="0xA02F-0xA037  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>306 = 0x132 = 0b100110010</usSrcDstTableOffset>
-  <usRecordOffset>312 = 0x138 = 0b100111000</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA060-0xA062  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa062:0F00
-<ATOM_OBJECT of="0xA037-0xA03F  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>317 = 0x13D = 0b100111101</usSrcDstTableOffset>
-  <usRecordOffset>323 = 0x143 = 0b101000011</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA06B-0xA06D  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa06d:0F00
-<ATOM_OBJECT of="0xA03F-0xA047  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>328 = 0x148 = 0b101001000</usSrcDstTableOffset>
-  <usRecordOffset>334 = 0x14E = 0b101001110</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA076-0xA078  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa078:0F00
-<ATOM_OBJECT of="0xA047-0xA04F  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>339 = 0x153 = 0b101010011</usSrcDstTableOffset>
-  <usRecordOffset>345 = 0x159 = 0b101011001</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA081-0xA083  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa083:0F00
 Connectors:
-<ATOM_OBJECT_TABLE of="0x9F70-0x9F74  len=0x4=4">
+<ATOM_OBJECT_TABLE of="0x9F42-0x9F46  len=0x4=4">
   <ucNumberOfObjects>5 = 0x5 = 0b101</ucNumberOfObjects>
   <ucPadding0>0</ucPadding0>
   <ucPadding1>0</ucPadding1>
   <ucPadding2>0</ucPadding2>
 </ATOM_OBJECT_TABLE>
-<ATOM_OBJECT of="0x9F74-0x9F7C  len=0x8=8">
+<ATOM_OBJECT of="0x9F46-0x9F4E  len=0x8=8">
   <usObjectID>
     <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
@@ -692,22 +993,22 @@ Connectors:
   <usRecordOffset>122 = 0x7A = 0b1111010</usRecordOffset>
   <usReserved>0</usReserved>
 </ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9FA2-0x9FA4  len=0x2=2">
+<ATOM_COMMON_RECORD_HEADER of="0x9F74-0x9F76  len=0x2=2">
   <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
   <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fa4:01001002000008000000
-<ATOM_COMMON_RECORD_HEADER of="0x9FAE-0x9FB0  len=0x2=2">
+Extra at 0x9f76:01001002000008000000
+<ATOM_COMMON_RECORD_HEADER of="0x9F80-0x9F82  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fb0:9000
-<ATOM_COMMON_RECORD_HEADER of="0x9FB2-0x9FB4  len=0x2=2">
+Extra at 0x9f82:9100
+<ATOM_COMMON_RECORD_HEADER of="0x9F84-0x9F86  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fb4:0600
-<ATOM_OBJECT of="0x9F7C-0x9F84  len=0x8=8">
+Extra at 0x9f86:0100
+<ATOM_OBJECT of="0x9F4E-0x9F56  len=0x8=8">
   <usObjectID>
     <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
@@ -717,72 +1018,72 @@ Extra at 0x9fb4:0600
   <usRecordOffset>149 = 0x95 = 0b10010101</usRecordOffset>
   <usReserved>0</usReserved>
 </ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9FBD-0x9FBF  len=0x2=2">
+<ATOM_COMMON_RECORD_HEADER of="0x9F8F-0x9F91  len=0x2=2">
   <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
   <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fbf:01002002000080000000
-<ATOM_COMMON_RECORD_HEADER of="0x9FC9-0x9FCB  len=0x2=2">
+Extra at 0x9f91:01002002000080000000
+<ATOM_COMMON_RECORD_HEADER of="0x9F9B-0x9F9D  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fcb:9200
-<ATOM_COMMON_RECORD_HEADER of="0x9FCD-0x9FCF  len=0x2=2">
+Extra at 0x9f9d:9300
+<ATOM_COMMON_RECORD_HEADER of="0x9F9F-0x9FA1  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fcf:0400
-<ATOM_OBJECT of="0x9F84-0x9F8C  len=0x8=8">
+Extra at 0x9fa1:0500
+<ATOM_OBJECT of="0x9F56-0x9F5E  len=0x8=8">
   <usObjectID>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
+    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>3 = 0x3 = 0b11</Index>
+    <Index>1</Index>
   </usObjectID>
   <usSrcDstTableOffset>170 = 0xAA = 0b10101010</usSrcDstTableOffset>
   <usRecordOffset>176 = 0xB0 = 0b10110000</usRecordOffset>
   <usReserved>0</usReserved>
 </ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9FD8-0x9FDA  len=0x2=2">
+<ATOM_COMMON_RECORD_HEADER of="0x9FAA-0x9FAC  len=0x2=2">
   <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
   <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fda:01003002000000020000
-<ATOM_COMMON_RECORD_HEADER of="0x9FE4-0x9FE6  len=0x2=2">
+Extra at 0x9fac:01003002000000020000
+<ATOM_COMMON_RECORD_HEADER of="0x9FB6-0x9FB8  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fe6:9100
-<ATOM_COMMON_RECORD_HEADER of="0x9FE8-0x9FEA  len=0x2=2">
+Extra at 0x9fb8:9000
+<ATOM_COMMON_RECORD_HEADER of="0x9FBA-0x9FBC  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fea:0100
-<ATOM_OBJECT of="0x9F8C-0x9F94  len=0x8=8">
+Extra at 0x9fbc:0600
+<ATOM_OBJECT of="0x9F5E-0x9F66  len=0x8=8">
   <usObjectID>
     <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
+    <Index>2 = 0x2 = 0b10</Index>
   </usObjectID>
   <usSrcDstTableOffset>197 = 0xC5 = 0b11000101</usSrcDstTableOffset>
   <usRecordOffset>203 = 0xCB = 0b11001011</usRecordOffset>
   <usReserved>0</usReserved>
 </ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9FF3-0x9FF5  len=0x2=2">
+<ATOM_COMMON_RECORD_HEADER of="0x9FC5-0x9FC7  len=0x2=2">
   <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
   <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9ff5:01004002000000040000
-<ATOM_COMMON_RECORD_HEADER of="0x9FFF-0xA001  len=0x2=2">
+Extra at 0x9fc7:01004002000000040000
+<ATOM_COMMON_RECORD_HEADER of="0x9FD1-0x9FD3  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa001:9300
-<ATOM_COMMON_RECORD_HEADER of="0xA003-0xA005  len=0x2=2">
+Extra at 0x9fd3:9200
+<ATOM_COMMON_RECORD_HEADER of="0x9FD5-0x9FD7  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa005:0500
-<ATOM_OBJECT of="0x9F94-0x9F9C  len=0x8=8">
+Extra at 0x9fd7:0400
+<ATOM_OBJECT of="0x9F66-0x9F6E  len=0x8=8">
   <usObjectID>
     <KindInNamespace>CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x4</KindInNamespace>
     <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
@@ -792,325 +1093,272 @@ Extra at 0xa005:0500
   <usRecordOffset>230 = 0xE6 = 0b11100110</usRecordOffset>
   <usReserved>0</usReserved>
 </ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA00E-0xA010  len=0x2=2">
+<ATOM_COMMON_RECORD_HEADER of="0x9FE0-0x9FE2  len=0x2=2">
   <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
   <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa010:01005002000000080000
-<ATOM_COMMON_RECORD_HEADER of="0xA01A-0xA01C  len=0x2=2">
+Extra at 0x9fe2:01005002000000080000
+<ATOM_COMMON_RECORD_HEADER of="0x9FEC-0x9FEE  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa01c:9500
-<ATOM_COMMON_RECORD_HEADER of="0xA01E-0xA020  len=0x2=2">
+Extra at 0x9fee:9500
+<ATOM_COMMON_RECORD_HEADER of="0x9FF0-0x9FF2  len=0x2=2">
   <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
   <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
 </ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa020:0300
+Extra at 0x9ff2:0300
+Encoders:
+<ATOM_OBJECT_TABLE of="0x9FF5-0x9FF9  len=0x4=4">
+  <ucNumberOfObjects>5 = 0x5 = 0b101</ucNumberOfObjects>
+  <ucPadding0>0</ucPadding0>
+  <ucPadding1>0</ucPadding1>
+  <ucPadding2>0</ucPadding2>
+</ATOM_OBJECT_TABLE>
+<ATOM_OBJECT of="0x9FF9-0xA001  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>295 = 0x127 = 0b100100111</usSrcDstTableOffset>
+  <usRecordOffset>301 = 0x12D = 0b100101101</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA027-0xA029  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa029:0F00
+<ATOM_OBJECT of="0xA001-0xA009  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>306 = 0x132 = 0b100110010</usSrcDstTableOffset>
+  <usRecordOffset>312 = 0x138 = 0b100111000</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA032-0xA034  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa034:0F00
+<ATOM_OBJECT of="0xA009-0xA011  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>317 = 0x13D = 0b100111101</usSrcDstTableOffset>
+  <usRecordOffset>323 = 0x143 = 0b101000011</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA03D-0xA03F  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa03f:0F00
+<ATOM_OBJECT of="0xA011-0xA019  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>2 = 0x2 = 0b10</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>328 = 0x148 = 0b101001000</usSrcDstTableOffset>
+  <usRecordOffset>334 = 0x14E = 0b101001110</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA048-0xA04A  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa04a:0F00
+<ATOM_OBJECT of="0xA019-0xA021  len=0x8=8">
+  <usObjectID>
+    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E</KindInNamespace>
+    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
+    <Index>1</Index>
+  </usObjectID>
+  <usSrcDstTableOffset>339 = 0x153 = 0b101010011</usSrcDstTableOffset>
+  <usRecordOffset>345 = 0x159 = 0b101011001</usRecordOffset>
+  <usReserved>0</usReserved>
+</ATOM_OBJECT>
+<ATOM_COMMON_RECORD_HEADER of="0xA053-0xA055  len=0x2=2">
+  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
+  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
+</ATOM_COMMON_RECORD_HEADER>
+Extra at 0xa055:0F00
 Routers:
 Table not present:ATOM_OBJECT_TABLE
-<ATOM_VOLTAGE_OBJECT_INFO_V3_1 of="0xA946-0xA94A  len=0x4=4">
+<ATOM_VRAM_INFO of="0xA3AA-0xA3BE  len=0x14=20">
   <sHeader>
-    <usStructureSize>102 = 0x66 = 0b1100110</usStructureSize>
-    <ucTableFormatRevision>3 = 0x3 = 0b11</ucTableFormatRevision>
-    <ucTableContentRevision>1</ucTableContentRevision>
+    <usStructureSize>1122 = 0x462 = 0b10001100010</usStructureSize>
+    <ucTableFormatRevision>2 = 0x2 = 0b10</ucTableFormatRevision>
+    <ucTableContentRevision>2 = 0x2 = 0b10</ucTableContentRevision>
   </sHeader>
-</ATOM_VOLTAGE_OBJECT_INFO_V3_1>
-<atom_voltage_object_header_v4 of="0xA94A-0xA956  len=0xC=12">
-  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
-  <ucVoltageMode>VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3</ucVoltageMode>
-  <usSize>50 = 0x32 = 0b110010</usSize>
-  <AsI2c>
-    <regulator_id>8 = 0x8 = 0b1000</regulator_id>
-    <i2c_id>
-      <gpio_id>150 = 0x96 = 0b10010110</gpio_id>
-      <bfHW_Capable>true</bfHW_Capable>
-      <bfHW_EngineID>1</bfHW_EngineID>
-      <bfI2C_LineMux>6 = 0x6 = 0b110</bfI2C_LineMux>
-      <Description>150 = 0x96 = 0b10010110</Description>
-    </i2c_id>
-    <i2c_slave_addr>
-      <shifted_i2c_slave_addr>16 = 0x10 = 0b10000</shifted_i2c_slave_addr>
-    </i2c_slave_addr>
-    <i2c_control_offset>0</i2c_control_offset>
-    <i2c_flag>0</i2c_flag>
-    <i2c_speed>0</i2c_speed>
-    <reserved_0xA>0</reserved_0xA>
-    <reserved_0xB>0</reserved_0xB>
-  </AsI2c>
-</atom_voltage_object_header_v4>
-<atom_i2c_data_entry of="0xA956-0xA95A  len=0x4=4">
-  <i2c_reg_index>41 = 0x29 = 0b101001</i2c_reg_index>
-  <i2c_reg_data>36 = 0x24 = 0b100100</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA95A-0xA95E  len=0x4=4">
-  <i2c_reg_index>43 = 0x2B = 0b101011</i2c_reg_index>
-  <i2c_reg_data>44 = 0x2C = 0b101100</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA95E-0xA962  len=0x4=4">
-  <i2c_reg_index>51 = 0x33 = 0b110011</i2c_reg_index>
-  <i2c_reg_data>114 = 0x72 = 0b1110010</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA962-0xA966  len=0x4=4">
-  <i2c_reg_index>36 = 0x24 = 0b100100</i2c_reg_index>
-  <i2c_reg_data>28 = 0x1C = 0b11100</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA966-0xA96A  len=0x4=4">
-  <i2c_reg_index>20 = 0x14 = 0b10100</i2c_reg_index>
-  <i2c_reg_data>34 = 0x22 = 0b100010</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA96A-0xA96E  len=0x4=4">
-  <i2c_reg_index>57 = 0x39 = 0b111001</i2c_reg_index>
-  <i2c_reg_data>190 = 0xBE = 0b10111110</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA96E-0xA972  len=0x4=4">
-  <i2c_reg_index>97 = 0x61 = 0b1100001</i2c_reg_index>
-  <i2c_reg_data>3 = 0x3 = 0b11</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA972-0xA976  len=0x4=4">
-  <i2c_reg_index>98 = 0x62 = 0b1100010</i2c_reg_index>
-  <i2c_reg_data>126 = 0x7E = 0b1111110</i2c_reg_data>
-</atom_i2c_data_entry>
-<atom_i2c_data_entry of="0xA976-0xA97A  len=0x4=4">
-  <i2c_reg_index>141 = 0x8D = 0b10001101</i2c_reg_index>
-  <i2c_reg_data>0</i2c_reg_data>
-</atom_i2c_data_entry>
-<FINAL_atom_i2c_data_entry of="0xA97A-0xA97C  len=0x2=2">
-  <final_entry_index>255 = 0xFF = 0b11111111</final_entry_index>
-</FINAL_atom_i2c_data_entry>
-<atom_voltage_object_header_v4 of="0xA97C-0xA988  len=0xC=12">
-  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
-  <ucVoltageMode>VOLTAGE_OBJ_SVID2_0x7</ucVoltageMode>
-  <usSize>12 = 0xC = 0b1100</usSize>
-</atom_voltage_object_header_v4>
-<atom_voltage_object_header_v4 of="0xA988-0xA994  len=0xC=12">
-  <ucVoltageType>VOLTAGE_TYPE_VDDCI_0x4</ucVoltageType>
-  <ucVoltageMode>VOLTAGE_OBJ_GPIO_LUT_0x0</ucVoltageMode>
-  <usSize>36 = 0x24 = 0b100100</usSize>
-</atom_voltage_object_header_v4>
-<ATOM_GPIO_I2C_INFO of="0x9A18-0x9A1C  len=0x4=4">
+  <usMemAdjustTblOffset>76 = 0x4C = 0b1001100</usMemAdjustTblOffset>
+  <usMemClkPatchTblOffset>91 = 0x5B = 0b1011011</usMemClkPatchTblOffset>
+  <usMcAdjustPerTileTblOffset>765 = 0x2FD = 0b1011111101</usMcAdjustPerTileTblOffset>
+  <usMcPhyInitTableOffset>947 = 0x3B3 = 0b1110110011</usMcPhyInitTableOffset>
+  <usDramDataRemapTblOffset>811 = 0x32B = 0b1100101011</usDramDataRemapTblOffset>
+  <usReserved1>0</usReserved1>
+  <ucNumOfVRAMModule>1</ucNumOfVRAMModule>
+  <ucMemoryClkPatchTblVer>1</ucMemoryClkPatchTblVer>
+  <ucVramModuleVer>8 = 0x8 = 0b1000</ucVramModuleVer>
+  <ucMcPhyTileNum>4 = 0x4 = 0b100</ucMcPhyTileNum>
+</ATOM_VRAM_INFO>
+<ATOM_VRAM_ENTRY of="0xA3BE-0xA3FE  len=0x40=64">
+  <ulChannelMapCfg>1985220658 = 0x76541032 = 0b1110110010101000001000000110010</ulChannelMapCfg>
+  <usModuleSize>56 = 0x38 = 0b111000</usModuleSize>
+  <usMcRamCfg>24738 = 0x60A2 = 0b110000010100010</usMcRamCfg>
+  <usEnableChannels>255 = 0xFF = 0b11111111</usEnableChannels>
+  <ucExtMemoryID>0</ucExtMemoryID>
+  <ucMemoryType>80 = 0x50 = 0b1010000</ucMemoryType>
+  <ucChannelNum>3 = 0x3 = 0b11</ucChannelNum>
+  <ucChannelWidth>5 = 0x5 = 0b101</ucChannelWidth>
+  <ucDensity>99 = 0x63 = 0b1100011</ucDensity>
+  <ucBankCol>10 = 0xA = 0b1010</ucBankCol>
+  <ucMisc>4 = 0x4 = 0b100</ucMisc>
+  <ucVREFI>0</ucVREFI>
+  <usReserved>0</usReserved>
+  <usMemorySize>8192 = 0x2000 = 0b10000000000000</usMemorySize>
+  <ucMcTunningSetId>0</ucMcTunningSetId>
+  <ucRowNum>11 = 0xB = 0b1011</ucRowNum>
+  <usEMRS2Value>16384 = 0x4000 = 0b100000000000000</usEMRS2Value>
+  <usEMRS3Value>24832 = 0x6100 = 0b110000100000000</usEMRS3Value>
+  <ucMemoryVenderID>118 = 0x76 = 0b1110110</ucMemoryVenderID>
+  <ucRefreshRateFactor>2 = 0x2 = 0b10</ucRefreshRateFactor>
+  <ucFIFODepth>2 = 0x2 = 0b10</ucFIFODepth>
+  <ucCDR_Bandwidth>0</ucCDR_Bandwidth>
+  <ulChannelMapCfg1>0</ulChannelMapCfg1>
+  <ulBankMapCfg>484675 = 0x76543 = 0b1110110010101000011</ulBankMapCfg>
+  <ulReserved>0</ulReserved>
+  <FullName>H5GQ8H24MJR</FullName>
+</ATOM_VRAM_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA433-0xA467  len=0x34=52">
+  <ulClkRange>40000 = 0x9C40 = 0b1001110001000000</ulClkRange>
+  <LatencyString>555000000000000022DD1C008494121120550B0A1444B10200204100330414209A8800A00000712406050C0D2B11150F</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA467-0xA49B  len=0x34=52">
+  <ulClkRange>80000 = 0x13880 = 0b10011100010000000</ulClkRange>
+  <LatencyString>777000000000000022DD1C00E7AC352240550D0D20C77205002481004C0914209A8800A0000071240C08171B571A2111</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA49B-0xA4CF  len=0x34=52">
+  <ulClkRange>90000 = 0x15F90 = 0b10101111110010000</ulClkRange>
+  <LatencyString>777000000000000022DD1C002931462650550E0EA20723060026A200540A1420AA8800A0000071240D0A1A1D621C2312</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA4CF-0xA503  len=0x34=52">
+  <ulClkRange>100000 = 0x186A0 = 0b11000011010100000</ulClkRange>
+  <LatencyString>777000000000000022DD1C0029B5462960550E0F2448D3060026A2005C0B1420AA8800A0000071240E0A1C206D1E2513</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA503-0xA537  len=0x34=52">
+  <ulClkRange>112500 = 0x1B774 = 0b11011011101110100</ulClkRange>
+  <LatencyString>999000000000000022339D006BBD572F5055100F29C9B3070048C4005D0D14204A8900A000007124100C20247B202A13</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA537-0xA56B  len=0x34=52">
+  <ulClkRange>125000 = 0x1E848 = 0b11110100001001000</ulClkRange>
+  <LatencyString>999000000000000022339D008CC558345055110F2D4A94080048C4005D0F14204A8900A000007124120D232889222E14</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA56B-0xA59F  len=0x34=52">
+  <ulClkRange>137500 = 0x2191C = 0b100001100100011100</ulClkRange>
+  <LatencyString>999000000000000022339D00ADCD693A7055111131CB7409004AE4006D0114204A8900A002007124140E272D97263215</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA59F-0xA5D3  len=0x34=52">
+  <ulClkRange>150000 = 0x249F0 = 0b100100100111110000</ulClkRange>
+  <LatencyString>999000000000000022339D00CE516A3E80551212B40B450A004AE400750314204A8900A002007124150F2A30A4283516</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA5D3-0xA607  len=0x34=52">
+  <ulClkRange>162500 = 0x27AC4 = 0b100111101011000100</ulClkRange>
+  <LatencyString>999000000000000022449D00105A7B4480551312B88C250B004C0401750514204A8900A00200712417112E34B22A3916</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA607-0xA63B  len=0x34=52">
+  <ulClkRange>175000 = 0x2AB98 = 0b101010101110011000</ulClkRange>
+  <LatencyString>999000000000000022559D0031627C4990551313BC0D060C004C04017D0714204A8900A00200712419123138C02D3D17</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA63B-0xA66F  len=0x34=52">
+  <ulClkRange>200000 = 0x30D40 = 0b110000110101000000</ulClkRange>
+  <LatencyString>BBB000000000000022889D0073EE8D53A055151743CFB60D004E24010E0A14204A8900A0030071241C143840DB324418</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA66F-0xA6A3  len=0x34=52">
+  <ulClkRange>225000 = 0x36EE8 = 0b110110111011101000</ulClkRange>
+  <LatencyString>BBB000000000000033BB9D00D6FEAF5EC05517174BD1770F005264011E0E14204A8900A00300712420173F48F7384C1A</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VRAM_TIMING_ENTRY of="0xA6A3-0xA6D7  len=0x34=52">
+  <ulClkRange>0</ulClkRange>
+  <LatencyString>060008000E0044FFFF00FFFFFF001F000000FFFFFF011F000000FFFFFF021F000000FFFFFF031F00000000000000E1B4</LatencyString>
+</ATOM_VRAM_TIMING_ENTRY>
+<ATOM_VOLTAGE_OBJECT_INFO_V3_1 of="0xA918-0xA91C  len=0x4=4">
   <sHeader>
-    <usStructureSize>220 = 0xDC = 0b11011100</usStructureSize>
-    <ucTableFormatRevision>1</ucTableFormatRevision>
+    <usStructureSize>70 = 0x46 = 0b1000110</usStructureSize>
+    <ucTableFormatRevision>3 = 0x3 = 0b11</ucTableFormatRevision>
     <ucTableContentRevision>1</ucTableContentRevision>
   </sHeader>
-</ATOM_GPIO_I2C_INFO>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A1C-0x9A37  len=0x1B=27">
-  <usClkMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>144 = 0x90 = 0b10010000</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>0</bfI2C_LineMux>
-    <Description>144 = 0x90 = 0b10010000</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A37-0x9A52  len=0x1B=27">
-  <usClkMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>145 = 0x91 = 0b10010001</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>1</bfI2C_LineMux>
-    <Description>145 = 0x91 = 0b10010001</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A52-0x9A6D  len=0x1B=27">
-  <usClkMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>146 = 0x92 = 0b10010010</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>2 = 0x2 = 0b10</bfI2C_LineMux>
-    <Description>146 = 0x92 = 0b10010010</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A6D-0x9A88  len=0x1B=27">
-  <usClkMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>147 = 0x93 = 0b10010011</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>3 = 0x3 = 0b11</bfI2C_LineMux>
-    <Description>147 = 0x93 = 0b10010011</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A88-0x9AA3  len=0x1B=27">
-  <usClkMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>148 = 0x94 = 0b10010100</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>4 = 0x4 = 0b100</bfI2C_LineMux>
-    <Description>148 = 0x94 = 0b10010100</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9AA3-0x9ABE  len=0x1B=27">
-  <usClkMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>149 = 0x95 = 0b10010101</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>5 = 0x5 = 0b101</bfI2C_LineMux>
-    <Description>149 = 0x95 = 0b10010101</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9ABE-0x9AD9  len=0x1B=27">
-  <usClkMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usDataA_RegisterIndex>
-  <sucI2cId>
+</ATOM_VOLTAGE_OBJECT_INFO_V3_1>
+<atom_voltage_object_header_v4 of="0xA91C-0xA920  len=0x4=4">
+  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
+  <ucVoltageMode>VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3</ucVoltageMode>
+  <usSize>18 = 0x12 = 0b10010</usSize>
+</atom_voltage_object_header_v4>
+<atom_i2c_voltage_object_v4_fields of="0xA920-0xA928  len=0x8=8">
+  <regulator_id>8 = 0x8 = 0b1000</regulator_id>
+  <i2c_id>
     <gpio_id>150 = 0x96 = 0b10010110</gpio_id>
     <bfHW_Capable>true</bfHW_Capable>
     <bfHW_EngineID>1</bfHW_EngineID>
     <bfI2C_LineMux>6 = 0x6 = 0b110</bfI2C_LineMux>
     <Description>150 = 0x96 = 0b10010110</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>1</ucDataMaskShift>
-  <ucDataEnShift>1</ucDataEnShift>
-  <ucDataY_Shift>1</ucDataY_Shift>
-  <ucDataA_Shift>1</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9AD9-0x9AF4  len=0x1B=27">
-  <usClkMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>151 = 0x97 = 0b10010111</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>7 = 0x7 = 0b111</bfI2C_LineMux>
-    <Description>151 = 0x97 = 0b10010111</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
+  </i2c_id>
+  <i2c_slave_addr>
+    <shifted_i2c_slave_addr>96 = 0x60 = 0b1100000</shifted_i2c_slave_addr>
+  </i2c_slave_addr>
+  <i2c_control_offset>0</i2c_control_offset>
+  <i2c_flag>0</i2c_flag>
+  <i2c_speed>0</i2c_speed>
+  <reserved_0xA>0</reserved_0xA>
+  <reserved_0xB>0</reserved_0xB>
+</atom_i2c_voltage_object_v4_fields>
+<atom_i2c_data_entry of="0xA928-0xA92C  len=0x4=4">
+  <i2c_reg_index>50 = 0x32 = 0b110010</i2c_reg_index>
+  <i2c_reg_data>204 = 0xCC = 0b11001100</i2c_reg_data>
+</atom_i2c_data_entry>
+<FINAL_atom_i2c_data_entry of="0xA92C-0xA92E  len=0x2=2">
+  <final_entry_index>255 = 0xFF = 0b11111111</final_entry_index>
+</FINAL_atom_i2c_data_entry>
+<atom_voltage_object_header_v4 of="0xA92E-0xA932  len=0x4=4">
+  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
+  <ucVoltageMode>VOLTAGE_OBJ_SVID2_0x7</ucVoltageMode>
+  <usSize>12 = 0xC = 0b1100</usSize>
+</atom_voltage_object_header_v4>
+<atom_voltage_object_header_v4 of="0xA93A-0xA93E  len=0x4=4">
+  <ucVoltageType>VOLTAGE_TYPE_VDDCI_0x4</ucVoltageType>
+  <ucVoltageMode>VOLTAGE_OBJ_GPIO_LUT_0x0</ucVoltageMode>
+  <usSize>36 = 0x24 = 0b100100</usSize>
+</atom_voltage_object_header_v4>
+<atom_gpio_voltage_object_v4_fields of="0xA93E-0xA946  len=0x8=8">
+  <gpio_control_id>0</gpio_control_id>
+  <gpio_entry_num>4 = 0x4 = 0b100</gpio_entry_num>
+  <phase_delay_us>0</phase_delay_us>
+  <reserved>0</reserved>
+  <gpio_mask_val>1081346 = 0x108002 = 0b100001000000000000010</gpio_mask_val>
+</atom_gpio_voltage_object_v4_fields>
+<atom_voltage_gpio_map_lut of="0xA946-0xA94C  len=0x6=6">
+  <voltage_gpio_reg_val>0</voltage_gpio_reg_val>
+  <voltage_level_mv>800 = 0x320 = 0b1100100000</voltage_level_mv>
+</atom_voltage_gpio_map_lut>
+<atom_voltage_gpio_map_lut of="0xA94C-0xA952  len=0x6=6">
+  <voltage_gpio_reg_val>1048576 = 0x100000 = 0b100000000000000000000</voltage_gpio_reg_val>
+  <voltage_level_mv>850 = 0x352 = 0b1101010010</voltage_level_mv>
+</atom_voltage_gpio_map_lut>
+<atom_voltage_gpio_map_lut of="0xA952-0xA958  len=0x6=6">
+  <voltage_gpio_reg_val>2 = 0x2 = 0b10</voltage_gpio_reg_val>
+  <voltage_level_mv>900 = 0x384 = 0b1110000100</voltage_level_mv>
+</atom_voltage_gpio_map_lut>
+<atom_voltage_gpio_map_lut of="0xA958-0xA95E  len=0x6=6">
+  <voltage_gpio_reg_val>32768 = 0x8000 = 0b1000000000000000</voltage_gpio_reg_val>
+  <voltage_level_mv>950 = 0x3B6 = 0b1110110110</voltage_level_mv>
+</atom_voltage_gpio_map_lut>
 
From 85793cc047f8cda7c69be74b285448a791026d43 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 13 Jul 2021 18:39:43 +0300 Subject: [PATCH 24/39] Update README.md --- README.md | 66 +++++++++++++++++++++---------------------------------- 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 74ebf9b..c6a8753 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,11 @@ -# PolarisBiosEditor 1.7xml: fork with dumping additional data as XML in console. +## 🧾PolarisBiosEditor 1.7xml🧾 +VBIOS editor fork with detailed dumping data as XML in console.
+The intended usage is **viewing** and/or help with **editing by external HEX editor**.
+Editing functionality is 99% identical to the upstream, NO major new GUI features. -Just open vbios file and look in console/stdout for extended xml output. -Editing functionality is identical to the upstream, no new features. - - -Please build the executable yourself if you don't trust - -Prebuilt version works on linux with mono, just type `./run.sh`, also see that file fore dependncies +To get xml - just open vbios file and look in console/stdout
- Example XML output (large, ~1k lines) + Example XML output (large, ~1k lines, click to expand)
 <ATOM_ROM_HEADER of="0x22C-0x258  len=0x2C=44">
   <sHeader>
@@ -1362,39 +1359,26 @@ Table not present:ATOM_OBJECT_TABLE
 
+### 📉Changelog📉 -# Below is readme kept for upstream version. - -BTC donation address: 181dtEjhFWWxvHDmx2R3N41rnRPedSEUf5 - -one click timing feature should be used with care, it maybe not stable for you - - -Contribution from Sebohe: - -### Build Dependencies - -Ubuntu 16.04.2: - -``` -sudo apt-get install mono-complete -``` - -Arch Linux: - -``` -yaourt -Sy mono48 -``` -### Building - -``` -sh build.sh -``` +### 📎Download and run with [prebuilt cross-platform .Net exe file](./bin/Debug/PolarisBiosEditor.exe)📎 +Please see ⛏️Build⛏️ section below and compile yourself if you don't trust prebuilt binary. +| Run on Windows | Run on Linux | +|:--------|:------| +|Requires only .Net 4, so just run exe file. |Contribution from Sebohe:

**Install mono** (and maybe libcanberra-gtk3-module, not sure):
  • _Ubuntu/Debian_ `sudo apt-get install mono-complete`
  • _Arch Linux_ `yaourt -Sy mono48`
With mono installed just change directory to the PolarisBiosEditor and
**execute `./run.sh`**
see inside run.sh file for a bit more detailed dependencies info.
If mono is registered as .Net exe handler, just directly execute:`bin/Debug/PolarisBiosEditor.exe`
| -### Executing +### ⛏️Build⛏️ +| Build on Windows | Build on Linux | +|:--------|:------| +| Install Visual Studio, open .sln file, build Debug configuration. | Install mono and mono-mcs (to get `mcs` executable) and run
`sh build.sh` | -Just change your working directory to the PolarisBiosEditor and execute: -``` -./run.sh -``` +### ⏫Upstream (GUI-only version without XML dumping support)⏫ +>
+> Upstream info +> https://github.com/vvaske/PolarisBiosEditor +> +> BTC donation address: 181dtEjhFWWxvHDmx2R3N41rnRPedSEUf5 +> +> one click timing feature should be used with care, it maybe not stable for you +>
From b4ddca112ace85a8f9cb7d7270c5db0e8299699a Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 13 Jul 2021 19:38:05 +0300 Subject: [PATCH 25/39] pass arguments from run.sh fix crash on link clicking on linux --- PolarisBiosEditor.Designer.cs | 15 +++++++-------- PolarisBiosEditor.cs | 13 ++++++++++++- run.sh | 7 +++---- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/PolarisBiosEditor.Designer.cs b/PolarisBiosEditor.Designer.cs index 033690e..1cbe7c7 100644 --- a/PolarisBiosEditor.Designer.cs +++ b/PolarisBiosEditor.Designer.cs @@ -411,7 +411,7 @@ private void InitializeComponent() this.editSubItem1.Font = new System.Drawing.Font("Courier New", 8.25F); this.editSubItem1.Location = new System.Drawing.Point(100, 644); this.editSubItem1.Name = "editSubItem1"; - this.editSubItem1.Size = new System.Drawing.Size(220, 20); + this.editSubItem1.Size = new System.Drawing.Size(165, 20); this.editSubItem1.TabIndex = 2; // // editSubItem2 @@ -439,9 +439,9 @@ private void InitializeComponent() // button1 // this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button1.Location = new System.Drawing.Point(558, 642); + this.button1.Location = new System.Drawing.Point(608, 642); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(241, 23); + this.button1.Size = new System.Drawing.Size(191, 23); this.button1.TabIndex = 4; this.button1.Text = "ONE CLICK TIMING PATCH"; this.button1.UseVisualStyleBackColor = true; @@ -451,14 +451,13 @@ private void InitializeComponent() // this.linkLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.linkLabel1.AutoSize = true; - this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.linkLabel1.LinkColor = System.Drawing.Color.Red; - this.linkLabel1.Location = new System.Drawing.Point(12, 669); + this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.0F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.linkLabel1.Location = new System.Drawing.Point(280, 644); this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(516, 16); + this.linkLabel1.Size = new System.Drawing.Size(300, 16); this.linkLabel1.TabIndex = 6; this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "(Link kept from upstream vesrsion) BUY PolariBiosEditor Pro performance"; + this.linkLabel1.Text = "BUY PolarisBiosEditor Pro performance GUI for miners\n\n(link kept from upstream vesrsion)"; this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // // VddciFakeIgnoredColumnToForbidEdits diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index ed6bf6b..57ed3e6 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -2586,7 +2586,18 @@ private void button1_Click(object sender, EventArgs e) private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - System.Diagnostics.Process.Start("https://www.miningbios.com/product/polaris-bios-editor-3-4-1-srbpolaris-style/"); + var url = "https://shop.st0rm.pro/product/polarisbioseditor-pro-performance-legacy-style/"; + try + { + if (MessageBox.Show(url, "Open url in external browser?", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + System.Diagnostics.Process.Start(url); + } + } + catch(Exception) + { + Console.WriteLine("Failed opening url: " + url); + } } } } diff --git a/run.sh b/run.sh index 844a2ef..f67bfba 100755 --- a/run.sh +++ b/run.sh @@ -1,10 +1,9 @@ #!/bin/bash -SELF=`realpath "$0"` -SELF_DIR=`dirname "$SELF"` -cd "$SELF_DIR/bin/Debug" +SELF="`realpath "$0"`" +SELF_DIR="`dirname "$SELF"`" # Required mono libs (at least): # libmono-system-windows-forms4.0-cil # libmono-system-xml-linq4.0-cil -mono PolarisBiosEditor.exe +mono "$SELF_DIR/bin/Debug/PolarisBiosEditor.exe" "$@" From 75570fcd72c5ac06cb4a98b7d15e2a0b97b51d6d Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 13 Jul 2021 20:27:10 +0300 Subject: [PATCH 26/39] reorder output of atom cmd tables --- PolarisBiosEditor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 57ed3e6..bcb599a 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1396,7 +1396,7 @@ private void ParseVbiosAndClose(Stream fileStream) } var atom_code = Reader(atom_rom_header.usMasterCommandTableOffset).ReadPrint(); - PrintCmds(atom_code.cmds); + //cmds are placed after tables in VBIOS, so they are print last- see atom_code usages atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); Reader(atom_data_table.FirmwareInfo).ReadPrint(); @@ -1526,7 +1526,7 @@ private void ParseVbiosAndClose(Stream fileStream) reader.Jump(volt_object_header.usSize); } ); - + PrintCmds(atom_code.cmds); //cmds are placed after tables in VBIOS, so they are print last } fileStream.Close(); } From d6c96ee1c3f9c13a8fc2add3d5518e09c268a480 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 13 Jul 2021 20:31:11 +0300 Subject: [PATCH 27/39] cmd formatting --- PolarisBiosEditor.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index bcb599a..b54486a 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1114,7 +1114,7 @@ public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) public string HexRange(int start, int len) { - return string.Format("{0,4}bytes (0x{1:X}-{2:X})", len, start, start+ len); + return string.Format("{0,4}bytes [0x{1:X}-{2:X})", len, start, start+ len); } private struct NamedCmd @@ -1159,10 +1159,10 @@ public void PrintCmds(ATOM_CMD_TABLES_LIST cmds) { Console.WriteLine(""); } - var info = string.Format("<{0,-36} tbindex=\"{1,2}\" total=\"{2}\" code=\"{3}\" format_content_rev=\"{4}\" work_data_size_in_4bytes=\"{5}\" params_size_in_1bytes=\"{6}\"/>", + var info = string.Format("<{0,-36} tbindex=\"{1,2}\" header=\"0x{2:X}\" code=\"{3}\" format_content_rev=\"{4}\" work_data_size_in_4bytes=\"{5}\" params_size_in_1bytes=\"{6}\"/>", s.Name, s.Index, - HexRange(s.Addr, s.Header.usStructureSize), + s.Addr, HexRange(s.Addr + CODE_OFFSET, s.Header.usStructureSize - CODE_OFFSET), s.Header.ucTableFormatRevision + "." + s.Header.ucTableContentRevision, s.Header.work_data_size_in_4bytes, s.Header.params_size_in_1bytes From 059663a375dd01d9e3d9f101788bd32c5e14f030 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Tue, 13 Jul 2021 21:28:10 +0300 Subject: [PATCH 28/39] Output some code bytes --- PolarisBiosEditor.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index b54486a..775a7c2 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1114,7 +1114,20 @@ public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) public string HexRange(int start, int len) { - return string.Format("{0,4}bytes [0x{1:X}-{2:X})", len, start, start+ len); + string values = ""; + for (int i =0; i len-15) + { + values += string.Format("{0:X2}", buffer[start + i]); + } + else if (i == 14) + { + values += ".."; + } + + } + return string.Format("{0,4}bytes [0x{1:X}-{2:X}) values {3,60}", len, start, start+ len, values); } private struct NamedCmd From 0ec6be7a5822576c38f644079fdbf68c76bf05ab Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Wed, 14 Jul 2021 04:40:23 +0300 Subject: [PATCH 29/39] better printing text strings, no unsafe parse & print all standard Option ROM headers --- PolarisBiosEditor.cs | 228 ++++++++++++++++++++++++++++++++++++++----- build.sh | 2 +- 2 files changed, 203 insertions(+), 27 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 775a7c2..854bb63 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -93,6 +93,17 @@ public enum KIND_ENCODER ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO = 0xFF, } + + public class DumpByteArrAsText : XmlElementAttribute + { + public const string HEX_BINARY_BACK_DECODE = "HEX_BINARY_BACK_DECODE"; + public DumpByteArrAsText() + { + DataType = "hexBinary"; + Namespace = HEX_BINARY_BACK_DECODE; + } + } + public partial class PolarisBiosEditor : Form { @@ -158,12 +169,15 @@ public class VRAM_TIMING_RX UInt32Converter uint32 = new UInt32Converter(); const int ATOM_ROM_CHECKSUM_OFFSET = 0x21; - const int ATOM_ROM_HEADER_PTR = 0x48; #region VBIOS-fields-kept-for-later-saving int atom_rom_header_offset; ATOM_ROM_HEADER atom_rom_header; + + int pcir_offset; + PCIR_2_3_DATA_STRUCTURE pcir_header; + ATOM_DATA_TABLES atom_data_table; int atom_powerplay_offset; @@ -197,6 +211,82 @@ public class VRAM_TIMING_RX const int MAX_VRAM_ENTRIES = 48; // e.g. MSI-Armor-RX-580-4GB has 36 entries int atom_vram_timing_offset; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct EFI_LEGACY_EXPANSION_AMD_ROM_HEADER + { + public Byte Signature55; + public Byte SignatureAA; + public Byte Bit8Length_in_512bytes; + public Byte JmpRel16_OpCode_E9; + public UInt16 Jmp_Target_Rel_To_0x6; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)] + [DumpByteArrAsText] + public Byte[] reserved_legacy; + public UInt16 PCIRHeaderOffset; + public UInt16 PnPHeaderOffset; + public UInt16 TextsAfterHeaderNullPadding; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + [DumpByteArrAsText] + public Byte[] TextIBM; + public Byte SimpleChecksum8ToZeroOverRegion_BeforeNextHeader; + public UInt16 Unknown2_1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] + [DumpByteArrAsText] + public Byte[] Zeroes11; + public Byte Unknown1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + [DumpByteArrAsText] + public Byte[] ATIAMDSignature_SP761295520; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + [DumpByteArrAsText] + public Byte[] Zeroes6_1; + public UInt16 Unknown2_2; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + [DumpByteArrAsText] + public Byte[] Zeroes6_2; + public UInt16 AtomRomHeaderOffset; + public string ComputedOffsetToNextHeader + { + get { return string.Format("0x{0:X}",Bit8Length_in_512bytes * 512); } + set { throw new NotImplementedException(); } + } + public string ComputedJmpTarget + { + get { return string.Format("0x{0:X}",Jmp_Target_Rel_To_0x6 + 6); } + set { throw new NotImplementedException(); } + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct EFI_PCI_EXPANSION_ROM_HEADER + { + public Byte Signature55; + public Byte SignatureAA; + public UInt16 Bit16Length_in_512bytes; + public string ComputedOffsetToNextHeader + { + get { return string.Format("0x{0:X}",Bit16Length_in_512bytes * 512); } + set { throw new NotImplementedException(); } + } + public UInt32 EfiSignature_0x00000EF1; + public UInt16 EfiSubsystem_0x000B_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER; + public UInt16 EfiMachineType_0x8664_IMAGE_FILE_MACHINE_X64; + public UInt16 EfiCompressionType_1_for_EFI_compression; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + [DumpByteArrAsText] + public Byte[] reserved_efi; + public UInt16 CompressableEfiImageHeaderOffset; + public UInt16 PCIRHeaderOffset; + public UInt16 PnPHeaderOffset; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct EFI_COMPRESSED_FORMAT_HEADER + { + public UInt32 CompressedLengthAfterHeader; + public UInt32 DeCompressedLength; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ATOM_COMMON_TABLE_HEADER { @@ -209,9 +299,9 @@ public struct ATOM_COMMON_TABLE_HEADER public struct ATOM_ROM_HEADER { public ATOM_COMMON_TABLE_HEADER sHeader; - //public UInt32 uaFirmWareSignature; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x4)] - public Char[] uaFirmWareSignature; + [DumpByteArrAsText] + public Byte[] uaFirmWareSignature; public UInt16 usBiosRuntimeSegmentAddress; public UInt16 usProtectedModeInfoOffset; public UInt16 usConfigFilenameOffset; @@ -227,11 +317,33 @@ public struct ATOM_ROM_HEADER public UInt16 usMasterDataTableOffset; public Byte ucExtendedFunctionCode; public Byte ucReserved; - public UInt32 ulPSPDirTableOffset; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct PCIR_2_3_DATA_STRUCTURE + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x4)] + [DumpByteArrAsText] + public Byte[] Signature_PCIR; public UInt16 usVendorID; public UInt16 usDeviceID; + public UInt16 DeviceListOffset; + public UInt16 HeaderLength; + public Byte Revision; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x3)] + [DumpByteArrAsText] + public Byte[] ClassCode_VGA_Controller_is_003; + public UInt16 ImageLength_in_512bytes; + public UInt16 CodeRevision; + public Byte CodeType_PC_Compatible_is_0__UEFI_is_3; + public Byte Indicator_last_is_0x80; + public UInt16 MaxRuntimeImageLength; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + [DumpByteArrAsText] + public Byte[] SomeTextWithAMD; } + String BIOS_BootupMessage; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -380,7 +492,7 @@ public struct ATOM_DATA_TABLES }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - unsafe public struct ATOM_FIRMWARE_INFO + public struct ATOM_FIRMWARE_INFO { public ATOM_COMMON_TABLE_HEADER sHeader; public UInt32 ulFirmwareRevision; @@ -401,7 +513,9 @@ unsafe public struct ATOM_FIRMWARE_INFO public UInt32 ulReserved4; public UInt32 ulMinPixelClockPLL_Output_in10khz; public Byte ucRemoteDisplayConfig; - [XmlIgnore]public fixed Byte ucReserved5[3]; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] + [DumpByteArrAsText] + public Byte[] ucReserved5; public UInt32 ulReserved6; public UInt32 ulReserved7; public UInt16 usReserved11_usMaxPixelClockDAC_in10khz; @@ -421,7 +535,7 @@ unsafe public struct ATOM_FIRMWARE_INFO }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - unsafe public struct ATOM_POWERPLAY_TABLE + public struct ATOM_POWERPLAY_TABLE { public ATOM_COMMON_TABLE_HEADER sHeader; public Byte ucTableRevision; @@ -450,7 +564,9 @@ unsafe public struct ATOM_POWERPLAY_TABLE public UInt16 usHardLimitTableOffset; public UInt16 usPCIETableOffset; public UInt16 usGPIOTableOffset; - [XmlIgnore] public fixed UInt16 usReserved[6]; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + [DumpByteArrAsText] + public Byte[] usReserved; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -973,8 +1089,9 @@ public struct ATOM_VRAM_ENTRY public UInt32 ulBankMapCfg; public UInt32 ulReserved; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] - [XmlIgnore] + [DumpByteArrAsText] public Byte[] strMemPNString; + [XmlIgnore] public string FullName { get @@ -1038,7 +1155,7 @@ public T ReadPrint(string name = "") { name = " Name=" + name; } - editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len=0x{2:X}={2}{3}", buffer.Offset, buffer.Offset + size, size, name)); + editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len={2}=0x{2:X}{3}", buffer.Offset, buffer.Offset + size, size, name)); return result; } public void Jump1Structure() @@ -1138,7 +1255,7 @@ private struct NamedCmd public ATOM_CMD_HEADER Header; }; - public void PrintCmds(ATOM_CMD_TABLES_LIST cmds) + public void PrintCmds(ATOM_CMD_TABLES_LIST cmds, int final_offset) { Console.WriteLine(""); const int CODE_OFFSET = 6; @@ -1183,6 +1300,49 @@ public void PrintCmds(ATOM_CMD_TABLES_LIST cmds) prev = s.Addr + s.Header.usStructureSize; Console.WriteLine(info); } + int last_cmd = ordered.Last().Addr + ordered.Last().Header.usStructureSize; + PrintCheckFF(last_cmd, final_offset); + } + + public void PrintCheckFF(int start, int after_end) + { + int FF_count = 0; + int NonFF_count = 0; + for (int i = start; i < after_end; ++i) + { + if (buffer[i] == 0xFF) ++FF_count; + else ++NonFF_count; + } + Console.WriteLine("", HexRange(start, after_end - start), FF_count, NonFF_count); + } + + public void PrintCheckText(int start, int after_end) + { + Console.WriteLine("", HexRange(start, after_end - start), SafeDecodeAscii(new ArraySegment(buffer, start, after_end-start).ToArray())); + } + + public static string SafeDecodeAscii(byte[] bytes) + { + var filtered_result = ""; + foreach(var ch in bytes) + { + if (ch < 0x20 || ch > 127) + { + if (ch == 0) + { + filtered_result += "\\0"; + } + else + { + filtered_result += string.Format("\\x{0:X2}", ch); + } + } + else + { + filtered_result += (char)ch; + } + } + return filtered_result; } public void Print(object output, string desc_name = "", string desc = "") { @@ -1211,6 +1371,11 @@ public void Print(object output, string desc_name = "", string desc = "") { xs.Serialize(writer, output, ns); } + foreach (var e in doc.Descendants().Where(e => (string)e.Attribute("xmlns") == DumpByteArrAsText.HEX_BINARY_BACK_DECODE).ToList()) + { + var bytes = StringToByteArray(e.Value); + e.ReplaceWith(new XElement(e.Name.LocalName, string.Format("{0}-bytes text:{1}", bytes.Length, SafeDecodeAscii(bytes)))); + } foreach (var e in doc.Descendants()) { if (e.Elements().Any()) continue; @@ -1392,17 +1557,22 @@ private void ParseVbiosAndClose(Stream fileStream) { buffer = br.ReadBytes((int)fileStream.Length); - atom_rom_header_offset = getValueAtPosition(16, ATOM_ROM_HEADER_PTR); + var option_rom = Reader(0).ReadPrint(); + atom_rom_header_offset = option_rom.AtomRomHeaderOffset; + PrintCheckText(Marshal.SizeOf(option_rom), atom_rom_header_offset); atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); - string deviceId = atom_rom_header.usDeviceID.ToString("X"); + + pcir_offset = option_rom.PCIRHeaderOffset; + pcir_header = Reader(pcir_offset).ReadPrint(); + fixChecksum(false); - String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); - if (!firmwareSignature.Equals("ATOM")) + if (SafeDecodeAscii(atom_rom_header.uaFirmWareSignature) != "ATOM") { MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); } + string deviceId = pcir_header.usDeviceID.ToString("X"); if (!supportedID.Contains(deviceId)) { MessageBox.Show("Unsupported DeviceID 0x" + deviceId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -1539,7 +1709,16 @@ private void ParseVbiosAndClose(Stream fileStream) reader.Jump(volt_object_header.usSize); } ); - PrintCmds(atom_code.cmds); //cmds are placed after tables in VBIOS, so they are print last + int section_end = option_rom.Bit8Length_in_512bytes * 512; + PrintCmds(atom_code.cmds, section_end); //cmds are placed after tables in VBIOS, so they are print last + var efi_option_rom = Reader(section_end).ReadPrint(); + var efi_pcir = Reader(section_end + efi_option_rom.PCIRHeaderOffset).ReadPrint(); + var conmprresed_start = section_end + efi_option_rom.CompressableEfiImageHeaderOffset; + PrintCheckText(section_end + efi_option_rom.PCIRHeaderOffset + Marshal.SizeOf(efi_pcir), conmprresed_start); + var compressed_efi = Reader(conmprresed_start).ReadPrint(); + PrintCheckFF((int)(section_end + efi_option_rom.CompressableEfiImageHeaderOffset + Marshal.SizeOf(compressed_efi) + compressed_efi.CompressedLengthAfterHeader), + section_end + efi_option_rom.Bit16Length_in_512bytes * 512); + } fileStream.Close(); } @@ -1592,12 +1771,12 @@ private void UpdateGui(string file_title) )); tableROM.Items.Add(new ListViewItem(new string[] { "VendorID", - "0x" + atom_rom_header.usVendorID.ToString ("X") + "0x" + pcir_header.usVendorID.ToString ("X") } )); tableROM.Items.Add(new ListViewItem(new string[] { "DeviceID", - "0x" + atom_rom_header.usDeviceID.ToString ("X") + "0x" + pcir_header.usDeviceID.ToString ("X") } )); tableROM.Items.Add(new ListViewItem(new string[] { @@ -1613,7 +1792,7 @@ private void UpdateGui(string file_title) tableROM.Items.Add(new ListViewItem(new string[] { "Firmware Signature", //"0x" + atom_rom_header.uaFirmWareSignature.ToString ("X") - new string(atom_rom_header.uaFirmWareSignature) + SafeDecodeAscii(atom_rom_header.uaFirmWareSignature) } )); @@ -1979,12 +2158,12 @@ private void SaveFileDialog_Click(object sender, EventArgs e) if (name == "VendorID") { var num = (int)int32.ConvertFromString(value); - atom_rom_header.usVendorID = (UInt16)num; + pcir_header.usVendorID = (UInt16)num; } else if (name == "DeviceID") { var num = (int)int32.ConvertFromString(value); - atom_rom_header.usDeviceID = (UInt16)num; + pcir_header.usDeviceID = (UInt16)num; } else if (name == "Sub ID") { @@ -1996,10 +2175,6 @@ private void SaveFileDialog_Click(object sender, EventArgs e) var num = (int)int32.ConvertFromString(value); atom_rom_header.usSubsystemVendorID = (UInt16)num; } - else if (name == "Firmware Signature") - { - atom_rom_header.uaFirmWareSignature = value.ToCharArray(); - } } for (var i = 0; i < tablePOWERPLAY.Items.Count; i++) @@ -2172,6 +2347,7 @@ private void SaveFileDialog_Click(object sender, EventArgs e) } setBytesAtPosition(buffer, atom_rom_header_offset, getBytes(atom_rom_header)); + setBytesAtPosition(buffer, pcir_offset, getBytes(pcir_header)); setBytesAtPosition(buffer, atom_powerplay_offset, getBytes(atom_powerplay_table)); setBytesAtPosition(buffer, atom_powertune_offset, getBytes(atom_powertune_table)); setBytesAtPosition(buffer, atom_fan_offset, getBytes(atom_fan_table)); @@ -2252,7 +2428,7 @@ public static byte[] StringToByteArray(String hex) { if (hex.Length % 2 != 0) { - MessageBox.Show("Invalid hex string", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Invalid hex string:" + hex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); throw new InvalidDataException(); } byte[] bytes = new byte[hex.Length / 2]; diff --git a/build.sh b/build.sh index 64e47dc..e0b88f2 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ #!/bin/bash mkdir -p bin/Debug #mono-mcs is required for building -mcs --mcs-debug 1 -debug -define:DEBUG -unsafe -lib:/usr/lib/mono/4.0 -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:System.Xml.Linq.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs -out:bin/Debug/PolarisBiosEditor.exe +mcs --mcs-debug 1 -debug -define:DEBUG -lib:/usr/lib/mono/4.0 -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:System.Xml.Linq.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs -out:bin/Debug/PolarisBiosEditor.exe From 0f79d602b5903cc5648a37dddf5309b20d20fa9d Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Wed, 14 Jul 2021 19:40:13 +0300 Subject: [PATCH 30/39] make output valid & readable xml --- PolarisBiosEditor.cs | 560 +++++++++++++++++++++++++------------------ 1 file changed, 327 insertions(+), 233 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 854bb63..d8528e5 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -11,6 +11,7 @@ using System.Xml.Linq; using System.Xml.Serialization; +using Attrs = System.Collections.Generic.Dictionary; namespace PolarisBiosEditor { public enum KIND_CONNECTOR @@ -445,8 +446,8 @@ public struct ATOM_CMD_HEADER public Int16 usStructureSize; public Byte ucTableFormatRevision; public Byte ucTableContentRevision; - public Byte work_data_size_in_4bytes; - public Byte params_size_in_1bytes; + public Byte work_data_stack_in_4bytes; + public Byte params_stack_in_1bytes; }; @@ -1155,7 +1156,7 @@ public T ReadPrint(string name = "") { name = " Name=" + name; } - editor.Print(result, "of", string.Format("0x{0:X}-0x{1:X} len={2}=0x{2:X}{3}", buffer.Offset, buffer.Offset + size, size, name)); + editor.Print(result, "addr", string.Format("0x{0:X}-0x{1:X} len={2}=0x{2:X}{3}", buffer.Offset, buffer.Offset + size, size, name)); return result; } public void Jump1Structure() @@ -1173,7 +1174,7 @@ public void JumpPrintExtra(int relative_offset) int done_size = Marshal.SizeOf(); if (done_size < relative_offset) { - editor.Print(string.Format("Extra at 0x{0:x}:", buffer.Offset + done_size) + ByteArrayToString(buffer.Skip(done_size).Take(relative_offset - done_size).ToArray())); + editor.Print("extra", "", editor.HexRange(buffer.Offset + done_size, relative_offset - done_size)); } Jump(relative_offset); } @@ -1181,6 +1182,19 @@ public void JumpPrintExtra(int relative_offset) public PolarisBiosEditor editor; } + class DisposeCallback: IDisposable + { + public DisposeCallback(Action arg) + { + a = arg; + } + void IDisposable.Dispose() + { + a(); + } + private Action a; + } + [STAThread] static void Main(string[] args) { @@ -1193,12 +1207,12 @@ static void Main(string[] args) } catch(Exception e) { - Console.WriteLine("Exception during opening file passed from cmdline: " + e); + Console.Error.WriteLine("Exception during opening file passed from cmdline: " + e); } } else { - Console.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console (or pass single filename as argument)"); + Console.Error.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console (or pass single filename as argument)"); } Application.Run(pbe); } @@ -1257,29 +1271,30 @@ private struct NamedCmd public void PrintCmds(ATOM_CMD_TABLES_LIST cmds, int final_offset) { - Console.WriteLine(""); - const int CODE_OFFSET = 6; var addr_to_info = new List(); - var fields = cmds.GetType().GetFields(); - for (int index = 0; index < fields.Length; ++index) + const int CODE_OFFSET = 6; + using(AutoClosingXml("CMDS-NOT-IMPLEMENTED")) { - var fi = fields[index]; - int total_addr = (UInt16)fi.GetValue(cmds); - if (total_addr == 0) - { - Console.WriteLine(string.Format(" <{0} tbindex=\"{1}\"/>", fi.Name, index)); - } - else + var fields = cmds.GetType().GetFields(); + for (int index = 0; index < fields.Length; ++index) { - var header = Reader(total_addr).Read(); - addr_to_info.Add(new NamedCmd{ - Addr = total_addr, - Index = index, - Name = fi.Name, - Header = header}); + var fi = fields[index]; + int total_addr = (UInt16)fi.GetValue(cmds); + if (total_addr == 0) + { + PrintXml(fi.Name, "", new Attrs{{"tbindex", index}}); + } + else + { + var header = Reader(total_addr).Read(); + addr_to_info.Add(new NamedCmd{ + Addr = total_addr, + Index = index, + Name = fi.Name, + Header = header}); + } } } - Console.WriteLine(""); var ordered = addr_to_info.OrderBy(nc => nc.Addr).ToList(); int prev = ordered[0].Addr; foreach(var s in ordered) @@ -1287,18 +1302,25 @@ public void PrintCmds(ATOM_CMD_TABLES_LIST cmds, int final_offset) int skept = s.Addr - prev; if (skept != 0 && skept != 1) //Ignore i-bte skips since they are for alignment { - Console.WriteLine(""); - } - var info = string.Format("<{0,-36} tbindex=\"{1,2}\" header=\"0x{2:X}\" code=\"{3}\" format_content_rev=\"{4}\" work_data_size_in_4bytes=\"{5}\" params_size_in_1bytes=\"{6}\"/>", - s.Name, - s.Index, - s.Addr, - HexRange(s.Addr + CODE_OFFSET, s.Header.usStructureSize - CODE_OFFSET), - s.Header.ucTableFormatRevision + "." + s.Header.ucTableContentRevision, - s.Header.work_data_size_in_4bytes, s.Header.params_size_in_1bytes - ); + PrintXml("SKEPT", "", new Attrs{{"len", skept}}); + } + var name = string.Format("{0,-36}", s.Name); + var tbindex = string.Format("{0,2}", s.Index); + var header = string.Format("0x{0:X}", s.Addr); + var code = HexRange(s.Addr + CODE_OFFSET, s.Header.usStructureSize - CODE_OFFSET); + var format_content_rev = s.Header.ucTableFormatRevision + "." + s.Header.ucTableContentRevision; + var work_stack_in_4bytes = s.Header.work_data_stack_in_4bytes; + var params_stack_in_1bytes = s.Header.params_stack_in_1bytes; + + PrintXml(name, "", new Attrs{ + {"tbindex", tbindex}, + {"header", header}, + {"code", code}, + {"format_content_rev", format_content_rev}, + {"work_stack_in_4bytes", work_stack_in_4bytes}, + {"params_stack_in_1bytes", params_stack_in_1bytes} + }); prev = s.Addr + s.Header.usStructureSize; - Console.WriteLine(info); } int last_cmd = ordered.Last().Addr + ordered.Last().Header.usStructureSize; PrintCheckFF(last_cmd, final_offset); @@ -1313,12 +1335,19 @@ public void PrintCheckFF(int start, int after_end) if (buffer[i] == 0xFF) ++FF_count; else ++NonFF_count; } - Console.WriteLine("", HexRange(start, after_end - start), FF_count, NonFF_count); + PrintXml("FromLastToSectionEnd", "", new Attrs{ + {"info", HexRange(start, after_end - start)}, + {"FF_count", FF_count}, + {"NonFF_count", NonFF_count}, + }); } public void PrintCheckText(int start, int after_end) { - Console.WriteLine("", HexRange(start, after_end - start), SafeDecodeAscii(new ArraySegment(buffer, start, after_end-start).ToArray())); + PrintXml("MostlyText", "", new Attrs{ + {"info", HexRange(start, after_end - start)}, + {"as_text", SafeDecodeAscii(new ArraySegment(buffer, start, after_end-start).ToArray())}, + }); } public static string SafeDecodeAscii(byte[] bytes) @@ -1344,6 +1373,48 @@ public static string SafeDecodeAscii(byte[] bytes) } return filtered_result; } + public string GetXml(string tag, string name, Attrs attrs) + { + var spaces = tag.Count(c => c == ' '); + var spaceless_tag = tag.Replace(" ", ""); + var e = new XElement(spaceless_tag); + if (!string.IsNullOrWhiteSpace(name)) + { + e.Add(new XAttribute("name", name)); + } + if (attrs != null) + { + foreach(var kv in attrs) + { + e.Add(new XAttribute(kv.Key, kv.Value.ToString())); + } + } + var result = e.ToString(); + result = result.Insert(spaceless_tag.Length + 2, new String(' ', spaces)); + result = result.Replace(" />", "/>"); + return result; + } + public void PrintXml(string tag, string name="", Attrs attrs = null) + { + var s = GetXml(tag, name, attrs); + Console.WriteLine(GetPadding() + s); + } + int extra_padding = 0; + public string GetPadding() + { + return new String(' ', extra_padding); + } + public IDisposable AutoClosingXml(string tag, string name="", Attrs attrs = null) + { + var s = GetXml(tag, name, attrs); + Console.WriteLine(GetPadding() + s.Replace("/>", ">")); + extra_padding += 2; + return new DisposeCallback(()=> + { + extra_padding -= 2; + Console.WriteLine(GetPadding() + ""); + }); + } public void Print(object output, string desc_name = "", string desc = "") { try @@ -1351,11 +1422,12 @@ public void Print(object output, string desc_name = "", string desc = "") if (output.GetType().IsPrimitive || output.GetType() == typeof(string)) { var s = output.ToString(); - if (!string.IsNullOrWhiteSpace(desc_name)) + var attrs = new Attrs(); + if (!string.IsNullOrWhiteSpace(desc)) { - s = desc_name + "=" + desc + " " + s; + attrs.Add("desc", desc); } - Console.WriteLine(s); + PrintXml(s, desc_name, attrs); } else { @@ -1388,15 +1460,72 @@ public void Print(object output, string desc_name = "", string desc = "") { doc.Root.Add(new XAttribute(desc_name, desc)); } - Console.WriteLine(doc); + var doc_as_string = doc.ToString(); + doc_as_string = GetPadding() + doc_as_string.Replace("\n", "\n" + GetPadding()); + Console.WriteLine(doc_as_string); } } catch (Exception ex) { - Console.WriteLine(ex); + PrintXml("InternalPrintError", ex.GetType().Name, new Attrs{{"output", output}, {"details", ex}}); + } + } + + private int PrintAndReturnLen(ATOM_OBJECT o) + { + if (o.usRecordOffset != 0) + { + var reader = Reader(atom_data_table.Object_Header + o.usRecordOffset); + while (true) + { + var first = reader.buffer.First(); + if (first == 0 || first == 255) + { + break; + } + if (reader.buffer.Skip(1).First() < 2) + { + break; + } + var rec = reader.ReadPrint(); + reader.JumpPrintExtra(rec.ucRecordSize); + } + } + return Marshal.SizeOf(o); + } + private void ReadPrintTableDetailed(int offset, Func continue_parse, Action> next_jumper) + { + var table_reader = Reader(offset); + var table = table_reader.ReadPrint(); + table_reader.Jump1Structure(); + var object_reader = ConsecutiveReader.From(table_reader); + for (var i = 0; continue_parse(table, i); i++) + { + var atom_object = object_reader.ReadPrint(); + next_jumper(atom_object, object_reader); } } + private void ReadPrintTable(int offset, Func continue_parse, Func entry_size) + { + ReadPrintTableDetailed(offset, continue_parse, (atom_object, object_reader) => object_reader.Jump(entry_size(atom_object))); + } + + private void ReadPrintObjectTable(UInt16 offset, Func entry_count, Func entry_size) + { + if (offset == 0) + { + Print("Table-not-present", typeof(TTable).Name); + return; + } + ReadPrintTable(atom_data_table.Object_Header + offset, (table, i) => (i < entry_count(table)), entry_size); + } + + ConsecutiveReader Reader(int offset) + { + return new ConsecutiveReader(buffer, offset, this); + } + private ListViewItem handler; private void listView_ChangeSelection(object sender, EventArgs e) @@ -1471,7 +1600,7 @@ public PolarisBiosEditor() this.Text += " (offline mode)"; } #else - Console.WriteLine("This is a debug build, skipping update check."); + Console.Error.WriteLine("This is a debug build, skipping update check."); #endif rc.Add("MT51J256M3", "MICRON-8G"); @@ -1528,7 +1657,7 @@ private void editSubItem2_Click(object sender, EventArgs e) public void OpenFileFromCommandLine(string path) { Stream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); - ParseVbiosAndClose(fileStream); + ParseVbiosAndClose(fileStream, path); UpdateGui(path); } @@ -1542,183 +1671,203 @@ private void OpenFileDialog_Click(object sender, EventArgs e) if (openFileDialog.ShowDialog() == DialogResult.OK) { Stream fileStream = openFileDialog.OpenFile(); - ParseVbiosAndClose(fileStream); + ParseVbiosAndClose(fileStream, openFileDialog.SafeFileName); UpdateGui(openFileDialog.SafeFileName); } } - private void ParseVbiosAndClose(Stream fileStream) + private void ParseVbiosAndClose(Stream fileStream, string filename) { if ((fileStream.Length != 524288) && (fileStream.Length != 524288 / 2)) { MessageBox.Show("This BIOS is non standard size.\nFlashing this BIOS may corrupt your graphics card.", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } using (BinaryReader br = new BinaryReader(fileStream)) + using (AutoClosingXml("root-of-option-rom-dump", filename, new Attrs{{"dump-software-version", programTitle+"-"+version}})) { buffer = br.ReadBytes((int)fileStream.Length); - var option_rom = Reader(0).ReadPrint(); - atom_rom_header_offset = option_rom.AtomRomHeaderOffset; - PrintCheckText(Marshal.SizeOf(option_rom), atom_rom_header_offset); - atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); + ATOM_CMD_TABLES atom_code; + EFI_LEGACY_EXPANSION_AMD_ROM_HEADER option_rom; + using(AutoClosingXml("OptionRomAndAtomHeaders")) + { + option_rom = Reader(0).ReadPrint(); + atom_rom_header_offset = option_rom.AtomRomHeaderOffset; + PrintCheckText(Marshal.SizeOf(option_rom), atom_rom_header_offset); + atom_rom_header = Reader(atom_rom_header_offset).ReadPrint(); - pcir_offset = option_rom.PCIRHeaderOffset; - pcir_header = Reader(pcir_offset).ReadPrint(); + pcir_offset = option_rom.PCIRHeaderOffset; + pcir_header = Reader(pcir_offset).ReadPrint(); - fixChecksum(false); + fixChecksum(false); - if (SafeDecodeAscii(atom_rom_header.uaFirmWareSignature) != "ATOM") - { - MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); - } + if (SafeDecodeAscii(atom_rom_header.uaFirmWareSignature) != "ATOM") + { + MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); + } - string deviceId = pcir_header.usDeviceID.ToString("X"); - if (!supportedID.Contains(deviceId)) - { - MessageBox.Show("Unsupported DeviceID 0x" + deviceId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } + string deviceId = pcir_header.usDeviceID.ToString("X"); + if (!supportedID.Contains(deviceId)) + { + MessageBox.Show("Unsupported DeviceID 0x" + deviceId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } - var atom_code = Reader(atom_rom_header.usMasterCommandTableOffset).ReadPrint(); - //cmds are placed after tables in VBIOS, so they are print last- see atom_code usages - atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); + atom_code = Reader(atom_rom_header.usMasterCommandTableOffset).ReadPrint(); + } + using(AutoClosingXml("AtomMasterDataTables")) + { + //cmds are placed after tables in VBIOS, so they are print last- see atom_code usages + atom_data_table = Reader(atom_rom_header.usMasterDataTableOffset).ReadPrint(); - Reader(atom_data_table.FirmwareInfo).ReadPrint(); + Reader(atom_data_table.FirmwareInfo).ReadPrint(); - ReadPrintTable(atom_data_table.GPIO_I2C_Info, - (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), - i2c_assigment => Marshal.SizeOf(i2c_assigment) - ); + ReadPrintTable(atom_data_table.GPIO_I2C_Info, + (i2c_info_table, i) => i < (i2c_info_table.sHeader.usStructureSize - Marshal.SizeOf(i2c_info_table.sHeader)) / Marshal.SizeOf(), + i2c_assigment => Marshal.SizeOf(i2c_assigment) + ); - atom_powerplay_offset = atom_data_table.PowerPlayInfo; - atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); + atom_powerplay_offset = atom_data_table.PowerPlayInfo; + atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); - atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; - atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); - atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; - for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) - { - atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } - - var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; - var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); - for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) - { - Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } + atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; + atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); + atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; + for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + { + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; - atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); - atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; - for (var i = 0; i < atom_sclk_entries.Length; i++) - { - atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); - } + var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; + var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); + for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) + { + Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; - atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); - atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; - for (var i = 0; i < atom_mclk_entries.Length; i++) - { - atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); - } + atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; + atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); + atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; + for (var i = 0; i < atom_sclk_entries.Length; i++) + { + atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); + } - var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; - var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); - for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) - { - Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); - } + atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; + atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); + atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; + for (var i = 0; i < atom_mclk_entries.Length; i++) + { + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + } - atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; - atom_fan_table = Reader(atom_fan_offset).ReadPrint(); + var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; + var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); + for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) + { + Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + } - atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; - atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); - Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); + atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; + atom_fan_table = Reader(atom_fan_offset).ReadPrint(); - var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); + atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; + atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); + Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); - ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); - Print("Connectors:"); - ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Encoders:"); - ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - Print("Routers:"); - ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - atom_vram_info_offset = atom_data_table.VRAM_Info; - atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); - atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; - var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); - atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); - } + ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + using(AutoClosingXml("Connectors")) + { + ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + } + using(AutoClosingXml("Encoders")) + { + ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + } + using(AutoClosingXml("Routers")) + { + ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + } - atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; - atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; - for (var i = 0; i < MAX_VRAM_ENTRIES; i++) - { - atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + atom_vram_info_offset = atom_data_table.VRAM_Info; + atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); + atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; + var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); + atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); + } - // atom_vram_timing_entries have an undetermined length - // attempt to determine the last entry in the array - if (atom_vram_timing_entries[i].ulClkRange == 0) + atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; + atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; + for (var i = 0; i < MAX_VRAM_ENTRIES; i++) { - Array.Resize(ref atom_vram_timing_entries, i); - break; + atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + + // atom_vram_timing_entries have an undetermined length + // attempt to determine the last entry in the array + if (atom_vram_timing_entries[i].ulClkRange == 0) + { + Array.Resize(ref atom_vram_timing_entries, i); + break; + } } - } - var used_volt_obffset = 0; + var used_volt_obffset = 0; - ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, - (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), - (volt_object_header, reader) => - { - used_volt_obffset += volt_object_header.usSize; - if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) + ReadPrintTableDetailed(atom_data_table.VoltageObjectInfo, + (volt_table, i) => used_volt_obffset < (volt_table.sHeader.usStructureSize - Marshal.SizeOf(volt_table.sHeader)), + (volt_object_header, reader) => { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - while (detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) + used_volt_obffset += volt_object_header.usSize; + if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3) { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + while (detailed_reader.Read().i2c_reg_index != FINAL_atom_i2c_data_entry.ENDING_INDEX_VALUE) + { + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); + } + ConsecutiveReader.From(detailed_reader).ReadPrint(); } - ConsecutiveReader.From(detailed_reader).ReadPrint(); - } - else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) - { - var specialized_reader = ConsecutiveReader.From(reader); - specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); - var gpio_voltage_fields = specialized_reader.ReadPrint(); - specialized_reader.Jump1Structure(); - var detailed_reader = ConsecutiveReader.From(specialized_reader); - for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) + else if (volt_object_header.ucVoltageMode == atom_voltage_object_mode.VOLTAGE_OBJ_GPIO_LUT_0x0) { - detailed_reader.ReadPrint(); - detailed_reader.Jump1Structure(); + var specialized_reader = ConsecutiveReader.From(reader); + specialized_reader.Jump(Marshal.SizeOf(volt_object_header)); + var gpio_voltage_fields = specialized_reader.ReadPrint(); + specialized_reader.Jump1Structure(); + var detailed_reader = ConsecutiveReader.From(specialized_reader); + for (var i = 0; i < gpio_voltage_fields.gpio_entry_num; i++) + { + detailed_reader.ReadPrint(); + detailed_reader.Jump1Structure(); + } } + reader.Jump(volt_object_header.usSize); } - reader.Jump(volt_object_header.usSize); - } ); + } int section_end = option_rom.Bit8Length_in_512bytes * 512; - PrintCmds(atom_code.cmds, section_end); //cmds are placed after tables in VBIOS, so they are print last - var efi_option_rom = Reader(section_end).ReadPrint(); - var efi_pcir = Reader(section_end + efi_option_rom.PCIRHeaderOffset).ReadPrint(); - var conmprresed_start = section_end + efi_option_rom.CompressableEfiImageHeaderOffset; - PrintCheckText(section_end + efi_option_rom.PCIRHeaderOffset + Marshal.SizeOf(efi_pcir), conmprresed_start); - var compressed_efi = Reader(conmprresed_start).ReadPrint(); - PrintCheckFF((int)(section_end + efi_option_rom.CompressableEfiImageHeaderOffset + Marshal.SizeOf(compressed_efi) + compressed_efi.CompressedLengthAfterHeader), - section_end + efi_option_rom.Bit16Length_in_512bytes * 512); - + using(AutoClosingXml("AtomMasterCommands")) + { + PrintCmds(atom_code.cmds, section_end); //cmds are placed after tables in VBIOS, so they are print last + } + using(AutoClosingXml("EfiGopPart")) + { + var efi_option_rom = Reader(section_end).ReadPrint(); + var efi_pcir = Reader(section_end + efi_option_rom.PCIRHeaderOffset).ReadPrint(); + var conmprresed_start = section_end + efi_option_rom.CompressableEfiImageHeaderOffset; + PrintCheckText(section_end + efi_option_rom.PCIRHeaderOffset + Marshal.SizeOf(efi_pcir), conmprresed_start); + var compressed_efi = Reader(conmprresed_start).ReadPrint(); + PrintCheckFF((int)(section_end + efi_option_rom.CompressableEfiImageHeaderOffset + Marshal.SizeOf(compressed_efi) + compressed_efi.CompressedLengthAfterHeader), + section_end + efi_option_rom.Bit16Length_in_512bytes * 512); + } } fileStream.Close(); } @@ -2012,61 +2161,6 @@ atom_vram_timing_entries [i].LatencyString } - private int PrintAndReturnLen(ATOM_OBJECT o) - { - if (o.usRecordOffset != 0) - { - var reader = Reader(atom_data_table.Object_Header + o.usRecordOffset); - while (true) - { - var first = reader.buffer.First(); - if (first == 0 || first == 255) - { - break; - } - if (reader.buffer.Skip(1).First() < 2) - { - break; - } - var rec = reader.ReadPrint(); - reader.JumpPrintExtra(rec.ucRecordSize); - } - } - return Marshal.SizeOf(o); - } - private void ReadPrintTableDetailed(int offset, Func continue_parse, Action> next_jumper) - { - var table_reader = Reader(offset); - var table = table_reader.ReadPrint(); - table_reader.Jump1Structure(); - var object_reader = ConsecutiveReader.From(table_reader); - for (var i = 0; continue_parse(table, i); i++) - { - var atom_object = object_reader.ReadPrint(); - next_jumper(atom_object, object_reader); - } - } - - private void ReadPrintTable(int offset, Func continue_parse, Func entry_size) - { - ReadPrintTableDetailed(offset, continue_parse, (atom_object, object_reader) => object_reader.Jump(entry_size(atom_object))); - } - - private void ReadPrintObjectTable(UInt16 offset, Func entry_count, Func entry_size) - { - if (offset == 0) - { - Print("Table not present:" + typeof(TTable).Name); - return; - } - ReadPrintTable(atom_data_table.Object_Header + offset, (table, i) => (i < entry_count(table)), entry_size); - } - - ConsecutiveReader Reader(int offset) - { - return new ConsecutiveReader(buffer, offset, this); - } - public Int32 getValueAtPosition(int bits, int position, bool isFrequency = false) { int value = 0; @@ -2785,7 +2879,7 @@ private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs } catch(Exception) { - Console.WriteLine("Failed opening url: " + url); + Console.Error.WriteLine("Failed opening url: " + url); } } } From 1adc79d675558276b41c81af16eaa727e3807396 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Wed, 14 Jul 2021 19:53:02 +0300 Subject: [PATCH 31/39] group tables in xml output --- PolarisBiosEditor.cs | 148 ++++++++++++++++++++++++------------------- 1 file changed, 83 insertions(+), 65 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index d8528e5..c9c35e7 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1495,14 +1495,17 @@ private int PrintAndReturnLen(ATOM_OBJECT o) } private void ReadPrintTableDetailed(int offset, Func continue_parse, Action> next_jumper) { - var table_reader = Reader(offset); - var table = table_reader.ReadPrint(); - table_reader.Jump1Structure(); - var object_reader = ConsecutiveReader.From(table_reader); - for (var i = 0; continue_parse(table, i); i++) + using(AutoClosingXml(typeof(TTable).Name)) { - var atom_object = object_reader.ReadPrint(); - next_jumper(atom_object, object_reader); + var table_reader = Reader(offset); + var table = table_reader.ReadPrint(); + table_reader.Jump1Structure(); + var object_reader = ConsecutiveReader.From(table_reader); + for (var i = 0; continue_parse(table, i); i++) + { + var atom_object = object_reader.ReadPrint(); + next_jumper(atom_object, object_reader); + } } } @@ -1729,42 +1732,51 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_powerplay_offset = atom_data_table.PowerPlayInfo; atom_powerplay_table = Reader(atom_powerplay_offset).ReadPrint(); - atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; - atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); - atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; - for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + using(AutoClosingXml("AtomVoltageTables")) { - atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); - } + atom_vddc_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddcLookupTableOffset; + atom_vddc_table = Reader(atom_vddc_table_offset).ReadPrint("VddcLookupTable"); + atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; + for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) + { + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } - var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; - var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); - for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) - { - Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; + var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); + for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) + { + Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + } } - atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; - atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); - atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; - for (var i = 0; i < atom_sclk_entries.Length; i++) + using(AutoClosingXml("AtomClockTables")) { - atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); - } + atom_sclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usSclkDependencyTableOffset; + atom_sclk_table = Reader(atom_sclk_table_offset).ReadPrint("SclkDependencyTable"); + atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; + for (var i = 0; i < atom_sclk_entries.Length; i++) + { + atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); + } - atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; - atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); - atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; - for (var i = 0; i < atom_mclk_entries.Length; i++) - { - atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; + atom_mclk_table = Reader(atom_mclk_table_offset).ReadPrint("MclkDependencyTable"); + atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; + for (var i = 0; i < atom_mclk_entries.Length; i++) + { + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + } } - var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; - var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); - for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) + using(AutoClosingXml("AtomMMDependencyTable")) { - Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + var atom_mm_dependency_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMMDependencyTableOffset; + var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); + for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) + { + Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + } } atom_fan_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usFanTableOffset; @@ -1774,44 +1786,50 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); - var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - - ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); - using(AutoClosingXml("Connectors")) + using(AutoClosingXml("AtomVideoOutTables")) { - ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - } - using(AutoClosingXml("Encoders")) - { - ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - } - using(AutoClosingXml("Routers")) - { - ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); - } + var atom_object_header = Reader(atom_data_table.Object_Header).ReadPrint(); - atom_vram_info_offset = atom_data_table.VRAM_Info; - atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); - atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; - var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); - for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) - { - atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); - atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); + ReadPrintObjectTable(atom_object_header.usDisplayPathTableOffset, tb => tb.ucNumOfDispPath, o => o.usSize); + using(AutoClosingXml("Connectors")) + { + ReadPrintObjectTable(atom_object_header.usConnectorObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + } + using(AutoClosingXml("Encoders")) + { + ReadPrintObjectTable(atom_object_header.usEncoderObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + } + using(AutoClosingXml("Routers")) + { + ReadPrintObjectTable(atom_object_header.usRouterObjectTableOffset, tb => tb.ucNumberOfObjects, PrintAndReturnLen); + } } - atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; - atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; - for (var i = 0; i < MAX_VRAM_ENTRIES; i++) + using(AutoClosingXml("AtomVRamTables")) { - atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + atom_vram_info_offset = atom_data_table.VRAM_Info; + atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); + atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; + var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); + for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) + { + atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); + atom_vram_entry_reader.Jump(atom_vram_entries[i].usModuleSize); + } - // atom_vram_timing_entries have an undetermined length - // attempt to determine the last entry in the array - if (atom_vram_timing_entries[i].ulClkRange == 0) + atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; + atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; + for (var i = 0; i < MAX_VRAM_ENTRIES; i++) { - Array.Resize(ref atom_vram_timing_entries, i); - break; + atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + + // atom_vram_timing_entries have an undetermined length + // attempt to determine the last entry in the array + if (atom_vram_timing_entries[i].ulClkRange == 0) + { + Array.Resize(ref atom_vram_timing_entries, i); + break; + } } } From 7df236f409beba36bedc13e46db435899a626295 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Wed, 14 Jul 2021 19:55:09 +0300 Subject: [PATCH 32/39] example of output --- README.md | 1355 +---------------------------------------- output-example.xml | 1451 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1452 insertions(+), 1354 deletions(-) create mode 100644 output-example.xml diff --git a/README.md b/README.md index c6a8753..df0bedc 100644 --- a/README.md +++ b/README.md @@ -4,1360 +4,7 @@ The intended usage is **viewing** and/or help with **editing by external HEX edi Editing functionality is 99% identical to the upstream, NO major new GUI features. To get xml - just open vbios file and look in console/stdout -
- Example XML output (large, ~1k lines, click to expand) -
-<ATOM_ROM_HEADER of="0x22C-0x258  len=0x2C=44">
-  <sHeader>
-    <usStructureSize>36 = 0x24 = 0b100100</usStructureSize>
-    <ucTableFormatRevision>1</ucTableFormatRevision>
-    <ucTableContentRevision>1</ucTableContentRevision>
-  </sHeader>
-  <uaFirmWareSignature>
-    <char>65 = 0x41 = 0b1000001</char>
-    <char>84 = 0x54 = 0b1010100</char>
-    <char>79 = 0x4F = 0b1001111</char>
-    <char>77 = 0x4D = 0b1001101</char>
-  </uaFirmWareSignature>
-  <usBiosRuntimeSegmentAddress>49152 = 0xC000 = 0b1100000000000000</usBiosRuntimeSegmentAddress>
-  <usProtectedModeInfoOffset>977 = 0x3D1 = 0b1111010001</usProtectedModeInfoOffset>
-  <usConfigFilenameOffset>460 = 0x1CC = 0b111001100</usConfigFilenameOffset>
-  <usCRC_BlockOffset>629 = 0x275 = 0b1001110101</usCRC_BlockOffset>
-  <usBIOS_BootupMessageOffset>288 = 0x120 = 0b100100000</usBIOS_BootupMessageOffset>
-  <usInt10Offset>1014 = 0x3F6 = 0b1111110110</usInt10Offset>
-  <usPciBusDevInitCode>0</usPciBusDevInitCode>
-  <usIoBaseAddress>0</usIoBaseAddress>
-  <usSubsystemVendorID>4163 = 0x1043 = 0b1000001000011</usSubsystemVendorID>
-  <usSubsystemID>1313 = 0x521 = 0b10100100001</usSubsystemID>
-  <usPCI_InfoOffset>592 = 0x250 = 0b1001010000</usPCI_InfoOffset>
-  <usMasterCommandTableOffset>38748 = 0x975C = 0b1001011101011100</usMasterCommandTableOffset>
-  <usMasterDataTableOffset>38914 = 0x9802 = 0b1001100000000010</usMasterDataTableOffset>
-  <ucExtendedFunctionCode>160 = 0xA0 = 0b10100000</ucExtendedFunctionCode>
-  <ucReserved>0</ucReserved>
-  <ulPSPDirTableOffset>1380533072 = 0x52494350 = 0b1010010010010010100001101010000</ulPSPDirTableOffset>
-  <usVendorID>4098 = 0x1002 = 0b1000000000010</usVendorID>
-  <usDeviceID>26591 = 0x67DF = 0b110011111011111</usDeviceID>
-</ATOM_ROM_HEADER>
-<ATOM_CMD_TABLES of="0x975C-0x9802  len=0xA6=166">
-  <sHeader>
-    <usStructureSize>166 = 0xA6 = 0b10100110</usStructureSize>
-    <ucTableFormatRevision>1</ucTableFormatRevision>
-    <ucTableContentRevision>1</ucTableContentRevision>
-  </sHeader>
-</ATOM_CMD_TABLES>
-<CMDS-NOT-IMPLEMENTED>
-    <EnableCRTCMemReq tbindex="6"/>
-    <DVOEncoderControl tbindex="8"/>
-    <DAC_LoadDetection tbindex="21"/>
-    <LVTMAEncoderControl tbindex="22"/>
-    <HW_Misc_Operation tbindex="23"/>
-    <DAC1EncoderControl tbindex="24"/>
-    <DAC2EncoderControl tbindex="25"/>
-    <DVOOutputControl tbindex="26"/>
-    <GetConditionalGoldenSetting tbindex="28"/>
-    <SMC_Init tbindex="29"/>
-    <Gfx_Harvesting tbindex="32"/>
-    <GetPixelClock tbindex="36"/>
-    <SetCRTC_Timing tbindex="39"/>
-    <ExternalEncoderControl tbindex="50"/>
-    <TMDSAOutputControl tbindex="66"/>
-    <DAC1OutputControl tbindex="68"/>
-    <ComputeMemoryClockParam tbindex="70"/>
-    <GetDispObjectInfo tbindex="73"/>
-    <DIG1EncoderControl tbindex="74"/>
-    <DIG2EncoderControl tbindex="75"/>
-</CMDS-NOT-IMPLEMENTED>
-<ASIC_Init                            tbindex=" 0" total=" 149bytes (0xAA90-AB25)" code=" 143bytes (0xAA96-AB25)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
-<GetDisplaySurfaceSize                tbindex=" 1" total="  87bytes (0xAB26-AB7D)" code="  81bytes (0xAB2C-AB7D)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<ASIC_RegistersInit_For_ASIC_Init     tbindex=" 2" total=" 183bytes (0xAB7E-AC35)" code=" 177bytes (0xAB84-AC35)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
-<MemoryControllerInit_For_ASIC_Init   tbindex=" 5" total=" 275bytes (0xAC36-AD49)" code=" 269bytes (0xAC3C-AD49)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
-<GPIOPinControl                       tbindex=" 9" total=" 255bytes (0xAD4A-AE49)" code=" 249bytes (0xAD50-AE49)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<SetEngineClock                       tbindex="10" total=" 428bytes (0xAE4A-AFF6)" code=" 422bytes (0xAE50-AFF6)" format_content_rev="1.2" work_data_size_in_4bytes="20" params_size_in_1bytes="0"/>
-<SetMemoryClock                       tbindex="11" total=" 290bytes (0xAFF6-B118)" code=" 284bytes (0xAFFC-B118)" format_content_rev="2.1" work_data_size_in_4bytes="12" params_size_in_1bytes="4"/>
-<SetPixelClock                        tbindex="12" total="1227bytes (0xB118-B5E3)" code="1221bytes (0xB11E-B5E3)" format_content_rev="1.7" work_data_size_in_4bytes="8" params_size_in_1bytes="8"/>
-<EnableDispPowerGating_For_ASIC_Init  tbindex="13" total=" 391bytes (0xB5E4-B76B)" code=" 385bytes (0xB5EA-B76B)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<ResetMemoryDLL                       tbindex="14" total="   7bytes (0xB76C-B773)" code="   1bytes (0xB772-B773)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<ResetMemoryDevice                    tbindex="15" total=" 138bytes (0xB774-B7FE)" code=" 132bytes (0xB77A-B7FE)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<ClockSource_For_ASIC_Init            tbindex="71" total="1108bytes (0xB7FE-BC52)" code="1102bytes (0xB804-BC52)" format_content_rev="1.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
-<MemoryDeviceInit                     tbindex="72" total="  82bytes (0xBC52-BCA4)" code="  76bytes (0xBC58-BCA4)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<AdjustMemoryController               tbindex="18" total=" 273bytes (0xBCA4-BDB5)" code=" 267bytes (0xBCAA-BDB5)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<EnableASIC_StaticPwrMgt              tbindex="19" total="  33bytes (0xBDB6-BDD7)" code="  27bytes (0xBDBC-BDD7)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<SetUniphyInstance                    tbindex="20" total=" 142bytes (0xBDD8-BE66)" code=" 136bytes (0xBDDE-BE66)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<CV1OutputControl                     tbindex="27" total=" 703bytes (0xBE66-C125)" code=" 697bytes (0xBE6C-C125)" format_content_rev="2.2" work_data_size_in_4bytes="28" params_size_in_1bytes="4"/>
-<EnableScaler                         tbindex="33" total=" 120bytes (0xC126-C19E)" code=" 114bytes (0xC12C-C19E)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<BlankCRTC                            tbindex="34" total=" 116bytes (0xC19E-C212)" code=" 110bytes (0xC1A4-C212)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<EnableCRTC                           tbindex="35" total="  62bytes (0xC212-C250)" code="  56bytes (0xC218-C250)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<EnableVGA_Render                     tbindex="37" total="  44bytes (0xC250-C27C)" code="  38bytes (0xC256-C27C)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<GetSCLKOverMCLKRatio                 tbindex="38" total="  34bytes (0xC27C-C29E)" code="  28bytes (0xC282-C29E)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="4"/>
-<SetCRTC_OverScan                     tbindex="40" total="  25bytes (0xC29E-C2B7)" code="  19bytes (0xC2A4-C2B7)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
-<GetSMUClockInfo                      tbindex="41" total=" 128bytes (0xC2B8-C338)" code=" 122bytes (0xC2BE-C338)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<SelectCRTC_Source                    tbindex="42" total=" 198bytes (0xC338-C3FE)" code=" 192bytes (0xC33E-C3FE)" format_content_rev="1.3" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
-<EnableGraphSurfaces                  tbindex="43" total=" 431bytes (0xC3FE-C5AD)" code=" 425bytes (0xC404-C5AD)" format_content_rev="1.4" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
-<UpdateCRTC_DoubleBufferRegisters     tbindex="44" total="  73bytes (0xC5AE-C5F7)" code="  67bytes (0xC5B4-C5F7)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<LUT_AutoFill                         tbindex="45" total=" 149bytes (0xC5F8-C68D)" code=" 143bytes (0xC5FE-C68D)" format_content_rev="1.3" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<GetMemoryClock                       tbindex="47" total="  61bytes (0xC68E-C6CB)" code="  55bytes (0xC694-C6CB)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<GetEngineClock                       tbindex="48" total=" 216bytes (0xC6CC-C7A4)" code=" 210bytes (0xC6D2-C7A4)" format_content_rev="1.1" work_data_size_in_4bytes="12" params_size_in_1bytes="0"/>
-<SetCRTC_UsingDTDTiming               tbindex="49" total=" 339bytes (0xC7A4-C8F7)" code=" 333bytes (0xC7AA-C8F7)" format_content_rev="2.3" work_data_size_in_4bytes="0" params_size_in_1bytes="24"/>
-<VRAM_BlockDetectionByStrap           tbindex="52" total=" 190bytes (0xC8F8-C9B6)" code=" 184bytes (0xC8FE-C9B6)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<VRAM_BlockVenderDetection            tbindex=" 3" total="  10bytes (0xC9B6-C9C0)" code="   4bytes (0xC9BC-C9C0)" format_content_rev="1.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
-<MemoryParamAdjust                    tbindex=" 7" total="  26bytes (0xC9C0-C9DA)" code="  20bytes (0xC9C6-C9DA)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<ProcessI2cChannelTransaction         tbindex="54" total=" 561bytes (0xC9DA-CC0B)" code=" 555bytes (0xC9E0-CC0B)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
-<ReadHWAssistedI2CStatus              tbindex="56" total="  95bytes (0xCC0C-CC6B)" code="  89bytes (0xCC12-CC6B)" format_content_rev="2.2" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<SpeedFanControl_For_ASIC_Init        tbindex="57" total="  10bytes (0xCC6C-CC76)" code="   4bytes (0xCC72-CC76)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<PowerConnectorDetection              tbindex="58" total="  10bytes (0xCC76-CC80)" code="   4bytes (0xCC7C-CC80)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<MC_Synchronization                   tbindex="59" total="  60bytes (0xCC80-CCBC)" code="  54bytes (0xCC86-CCBC)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<ComputeMemoryOREnginePLLORClockParam tbindex="60" total=" 431bytes (0xCCBC-CE6B)" code=" 425bytes (0xCCC2-CE6B)" format_content_rev="1.6" work_data_size_in_4bytes="4" params_size_in_1bytes="24"/>
-<Gfx_Init                             tbindex="61" total="   7bytes (0xCE6C-CE73)" code="   1bytes (0xCE72-CE73)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<DynamicMemorySettings                tbindex="63" total=" 368bytes (0xCE74-CFE4)" code=" 362bytes (0xCE7A-CFE4)" format_content_rev="2.1" work_data_size_in_4bytes="8" params_size_in_1bytes="4"/>
-<MemoryTraining                       tbindex="64" total=" 256bytes (0xCFE4-D0E4)" code=" 250bytes (0xCFEA-D0E4)" format_content_rev="1.2" work_data_size_in_4bytes="4" params_size_in_1bytes="4"/>
-<EnableSpreadSpectrumOnPPLL           tbindex="65" total=" 140bytes (0xD0E4-D170)" code=" 134bytes (0xD0EA-D170)" format_content_rev="1.4" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<MemoryPLLInit                        tbindex="16" total="  49bytes (0xD170-D1A1)" code="  43bytes (0xD176-D1A1)" format_content_rev="1.3" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
-<AdjustDisplayPll                     tbindex="17" total="  16bytes (0xD1A2-D1B2)" code="  10bytes (0xD1A8-D1B2)" format_content_rev="1.3" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
-<SetVoltage                           tbindex="67" total=" 451bytes (0xD1B2-D375)" code=" 445bytes (0xD1B8-D375)" format_content_rev="1.4" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<GetVoltageInfo                       tbindex="80" total=" 131bytes (0xD376-D3F9)" code=" 125bytes (0xD37C-D3F9)" format_content_rev="1.3" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
-<DIGxEncoderControl                   tbindex=" 4" total=" 615bytes (0xD3FA-D661)" code=" 609bytes (0xD400-D661)" format_content_rev="1.5" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<VRAM_GetCurrentInfoBlock             tbindex="62" total="  41bytes (0xD662-D68B)" code="  35bytes (0xD668-D68B)" format_content_rev="1.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<DIG1TransmitterControl               tbindex="76" total=" 326bytes (0xD68C-D7D2)" code=" 320bytes (0xD692-D7D2)" format_content_rev="1.6" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<DIG2TransmitterControl               tbindex="77" total=" 824bytes (0xD7D2-DB0A)" code=" 818bytes (0xD7D8-DB0A)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<ProcessAuxChannelTransaction         tbindex="78" total=" 588bytes (0xDB0A-DD56)" code=" 582bytes (0xDB10-DD56)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="8"/>
-<DPEncoderService                     tbindex="79" total="  92bytes (0xDD56-DDB2)" code="  86bytes (0xDD5C-DDB2)" format_content_rev="1.2" work_data_size_in_4bytes="0" params_size_in_1bytes="4"/>
-<PatchMCSetting                       tbindex="30" total=" 159bytes (0xDDB2-DE51)" code=" 153bytes (0xDDB8-DE51)" format_content_rev="1.1" work_data_size_in_4bytes="4" params_size_in_1bytes="0"/>
-<MC_SEQ_Control                       tbindex="31" total=" 393bytes (0xDE52-DFDB)" code=" 387bytes (0xDE58-DFDB)" format_content_rev="1.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
-<WriteOneByteToHWAssistedI2C          tbindex="55" total=" 229bytes (0xDFDC-E0C1)" code=" 223bytes (0xDFE2-E0C1)" format_content_rev="2.2" work_data_size_in_4bytes="20" params_size_in_1bytes="0"/>
-<LVTMAOutputControl                   tbindex="51" total=" 465bytes (0xE0C2-E293)" code=" 459bytes (0xE0C8-E293)" format_content_rev="2.1" work_data_size_in_4bytes="4" params_size_in_1bytes="4"/>
-<ReadEfuseValue                       tbindex="69" total=" 113bytes (0xE294-E305)" code=" 107bytes (0xE29A-E305)" format_content_rev="3.1" work_data_size_in_4bytes="8" params_size_in_1bytes="0"/>
-<MemoryCleanUp                        tbindex="53" total=" 206bytes (0xE306-E3D4)" code=" 200bytes (0xE30C-E3D4)" format_content_rev="3.1" work_data_size_in_4bytes="0" params_size_in_1bytes="16"/>
-<SetDCEClock                          tbindex="46" total=" 761bytes (0xE3D4-E6CD)" code=" 755bytes (0xE3DA-E6CD)" format_content_rev="2.1" work_data_size_in_4bytes="0" params_size_in_1bytes="0"/>
-<ATOM_DATA_TABLES of="0x9802-0x984C  len=0x4A=74">
-  <sHeader>
-    <usStructureSize>74 = 0x4A = 0b1001010</usStructureSize>
-    <ucTableFormatRevision>1</ucTableFormatRevision>
-    <ucTableContentRevision>1</ucTableContentRevision>
-  </sHeader>
-  <UtilityPipeLine>0</UtilityPipeLine>
-  <MultimediaCapabilityInfo>0</MultimediaCapabilityInfo>
-  <MultimediaConfigInfo>0</MultimediaConfigInfo>
-  <StandardVESA_Timing>38988 = 0x984C = 0b1001100001001100</StandardVESA_Timing>
-  <FirmwareInfo>39216 = 0x9930 = 0b1001100100110000</FirmwareInfo>
-  <PaletteData>39324 = 0x999C = 0b1001100110011100</PaletteData>
-  <LCD_Info>39376 = 0x99D0 = 0b1001100111010000</LCD_Info>
-  <DIGTransmitterInfo>0</DIGTransmitterInfo>
-  <SMU_Info>43522 = 0xAA02 = 0b1010101000000010</SMU_Info>
-  <SupportedDevicesInfo>0</SupportedDevicesInfo>
-  <GPIO_I2C_Info>39454 = 0x9A1E = 0b1001101000011110</GPIO_I2C_Info>
-  <VRAM_UsageByFirmware>39674 = 0x9AFA = 0b1001101011111010</VRAM_UsageByFirmware>
-  <GPIO_Pin_LUT>39686 = 0x9B06 = 0b1001101100000110</GPIO_Pin_LUT>
-  <VESA_ToInternalModeLUT>39718 = 0x9B26 = 0b1001101100100110</VESA_ToInternalModeLUT>
-  <GFX_Info>39834 = 0x9B9A = 0b1001101110011010</GFX_Info>
-  <PowerPlayInfo>39858 = 0x9BB2 = 0b1001101110110010</PowerPlayInfo>
-  <GPUVirtualizationInfo>0</GPUVirtualizationInfo>
-  <SaveRestoreInfo>43498 = 0xA9EA = 0b1010100111101010</SaveRestoreInfo>
-  <PPLL_SS_Info>0</PPLL_SS_Info>
-  <OemInfo>40692 = 0x9EF4 = 0b1001111011110100</OemInfo>
-  <XTMDS_Info>0</XTMDS_Info>
-  <MclkSS_Info>0</MclkSS_Info>
-  <Object_Header>40698 = 0x9EFA = 0b1001111011111010</Object_Header>
-  <IndirectIOAccess>41772 = 0xA32C = 0b1010001100101100</IndirectIOAccess>
-  <MC_InitParameter>41048 = 0xA058 = 0b1010000001011000</MC_InitParameter>
-  <ASIC_VDDC_Info>0</ASIC_VDDC_Info>
-  <ASIC_InternalSS_Info>43358 = 0xA95E = 0b1010100101011110</ASIC_InternalSS_Info>
-  <TV_VideoMode>43398 = 0xA986 = 0b1010100110000110</TV_VideoMode>
-  <VRAM_Info>41898 = 0xA3AA = 0b1010001110101010</VRAM_Info>
-  <MemoryTrainingInfo>0</MemoryTrainingInfo>
-  <IntegratedSystemInfo>0</IntegratedSystemInfo>
-  <ASIC_ProfilingInfo>43020 = 0xA80C = 0b1010100000001100</ASIC_ProfilingInfo>
-  <VoltageObjectInfo>43288 = 0xA918 = 0b1010100100011000</VoltageObjectInfo>
-  <PowerSourceInfo>0</PowerSourceInfo>
-  <ServiceInfo>43578 = 0xAA3A = 0b1010101000111010</ServiceInfo>
-</ATOM_DATA_TABLES>
-<ATOM_FIRMWARE_INFO of="0x9930-0x9990  len=0x60=96">
-  <sHeader>
-    <usStructureSize>108 = 0x6C = 0b1101100</usStructureSize>
-    <ucTableFormatRevision>2 = 0x2 = 0b10</ucTableFormatRevision>
-    <ucTableContentRevision>2 = 0x2 = 0b10</ucTableContentRevision>
-  </sHeader>
-  <ulFirmwareRevision>254935553 = 0xF320201 = 0b1111001100100000001000000001</ulFirmwareRevision>
-  <ulDefaultEngineClock_in10khz_asic_init_arg0>30000 = 0x7530 = 0b111010100110000</ulDefaultEngineClock_in10khz_asic_init_arg0>
-  <ulDefaultMemoryClock_in10khz_asic_init_arg1>30000 = 0x7530 = 0b111010100110000</ulDefaultMemoryClock_in10khz_asic_init_arg1>
-  <ulSPLL_OutputFreq_in10khz>0</ulSPLL_OutputFreq_in10khz>
-  <ulGPUPLL_OutputFreq_in10khz>360000 = 0x57E40 = 0b1010111111001000000</ulGPUPLL_OutputFreq_in10khz>
-  <ulReserved1>0</ulReserved1>
-  <ulReserved2>0</ulReserved2>
-  <ulMaxPixelClockPLL_Output_in10khz>600000 = 0x927C0 = 0b10010010011111000000</ulMaxPixelClockPLL_Output_in10khz>
-  <ulBinaryAlteredInfo>0</ulBinaryAlteredInfo>
-  <ulDefaultDispEngineClkFreq_in10khz>62610 = 0xF492 = 0b1111010010010010</ulDefaultDispEngineClkFreq_in10khz>
-  <ucReserved3>0</ucReserved3>
-  <ucMinAllowedBL_Level>0</ucMinAllowedBL_Level>
-  <usBootUpVDDCVoltage_in_mV>900 = 0x384 = 0b1110000100</usBootUpVDDCVoltage_in_mV>
-  <usLcdMinPixelClockPLL_Output_inMHz>2970 = 0xB9A = 0b101110011010</usLcdMinPixelClockPLL_Output_inMHz>
-  <usLcdMaxPixelClockPLL_Output_inMHz>6000 = 0x1770 = 0b1011101110000</usLcdMaxPixelClockPLL_Output_inMHz>
-  <ulReserved4>0</ulReserved4>
-  <ulMinPixelClockPLL_Output_in10khz>297000 = 0x48828 = 0b1001000100000101000</ulMinPixelClockPLL_Output_in10khz>
-  <ucRemoteDisplayConfig>0</ucRemoteDisplayConfig>
-  <ulReserved6>0</ulReserved6>
-  <ulReserved7>0</ulReserved7>
-  <usReserved11_usMaxPixelClockDAC_in10khz>40000 = 0x9C40 = 0b1001110001000000</usReserved11_usMaxPixelClockDAC_in10khz>
-  <usMinPixelClockPLL_Input_in10khz>2500 = 0x9C4 = 0b100111000100</usMinPixelClockPLL_Input_in10khz>
-  <usMaxPixelClockPLL_Input_in10khz>10000 = 0x2710 = 0b10011100010000</usMaxPixelClockPLL_Input_in10khz>
-  <usBootUpVDDCIVoltage_in_mV>850 = 0x352 = 0b1101010010</usBootUpVDDCIVoltage_in_mV>
-  <usFirmwareCapability>16414 = 0x401E = 0b100000000011110</usFirmwareCapability>
-  <usCoreReferenceClock_in10khz>10000 = 0x2710 = 0b10011100010000</usCoreReferenceClock_in10khz>
-  <usMemoryReferenceClock_in10khz>10000 = 0x2710 = 0b10011100010000</usMemoryReferenceClock_in10khz>
-  <usUniphyDPModeExtClkFreq_in10khz>10000 = 0x2710 = 0b10011100010000</usUniphyDPModeExtClkFreq_in10khz>
-  <ucMemoryModule_ID>0</ucMemoryModule_ID>
-  <ucCoolingSolution1IsLiquid>0</ucCoolingSolution1IsLiquid>
-  <ucProductBranding>0</ucProductBranding>
-  <ucReserved9>0</ucReserved9>
-  <usBootUpMVDDCVoltage_in_mV>1550 = 0x60E = 0b11000001110</usBootUpMVDDCVoltage_in_mV>
-  <usBootUpVDDGFXVoltage_in_mV>0</usBootUpVDDGFXVoltage_in_mV>
-</ATOM_FIRMWARE_INFO>
-<ATOM_GPIO_I2C_INFO of="0x9A1E-0x9A22  len=0x4=4">
-  <sHeader>
-    <usStructureSize>220 = 0xDC = 0b11011100</usStructureSize>
-    <ucTableFormatRevision>1</ucTableFormatRevision>
-    <ucTableContentRevision>1</ucTableContentRevision>
-  </sHeader>
-</ATOM_GPIO_I2C_INFO>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A22-0x9A3D  len=0x1B=27">
-  <usClkMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18536 = 0x4868 = 0b100100001101000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18538 = 0x486A = 0b100100001101010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18539 = 0x486B = 0b100100001101011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18537 = 0x4869 = 0b100100001101001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>144 = 0x90 = 0b10010000</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>0</bfI2C_LineMux>
-    <Description>144 = 0x90 = 0b10010000</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A3D-0x9A58  len=0x1B=27">
-  <usClkMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18540 = 0x486C = 0b100100001101100</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18542 = 0x486E = 0b100100001101110</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18543 = 0x486F = 0b100100001101111</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18541 = 0x486D = 0b100100001101101</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>145 = 0x91 = 0b10010001</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>1</bfI2C_LineMux>
-    <Description>145 = 0x91 = 0b10010001</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A58-0x9A73  len=0x1B=27">
-  <usClkMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18544 = 0x4870 = 0b100100001110000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18546 = 0x4872 = 0b100100001110010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18547 = 0x4873 = 0b100100001110011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18545 = 0x4871 = 0b100100001110001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>146 = 0x92 = 0b10010010</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>2 = 0x2 = 0b10</bfI2C_LineMux>
-    <Description>146 = 0x92 = 0b10010010</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A73-0x9A8E  len=0x1B=27">
-  <usClkMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18548 = 0x4874 = 0b100100001110100</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18550 = 0x4876 = 0b100100001110110</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18551 = 0x4877 = 0b100100001110111</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18549 = 0x4875 = 0b100100001110101</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>147 = 0x93 = 0b10010011</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>3 = 0x3 = 0b11</bfI2C_LineMux>
-    <Description>147 = 0x93 = 0b10010011</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9A8E-0x9AA9  len=0x1B=27">
-  <usClkMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18552 = 0x4878 = 0b100100001111000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18554 = 0x487A = 0b100100001111010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18555 = 0x487B = 0b100100001111011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18553 = 0x4879 = 0b100100001111001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>148 = 0x94 = 0b10010100</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>4 = 0x4 = 0b100</bfI2C_LineMux>
-    <Description>148 = 0x94 = 0b10010100</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9AA9-0x9AC4  len=0x1B=27">
-  <usClkMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18556 = 0x487C = 0b100100001111100</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18558 = 0x487E = 0b100100001111110</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18559 = 0x487F = 0b100100001111111</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18557 = 0x487D = 0b100100001111101</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>149 = 0x95 = 0b10010101</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>5 = 0x5 = 0b101</bfI2C_LineMux>
-    <Description>149 = 0x95 = 0b10010101</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9AC4-0x9ADF  len=0x1B=27">
-  <usClkMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18584 = 0x4898 = 0b100100010011000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18586 = 0x489A = 0b100100010011010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18587 = 0x489B = 0b100100010011011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18585 = 0x4899 = 0b100100010011001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>150 = 0x96 = 0b10010110</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>6 = 0x6 = 0b110</bfI2C_LineMux>
-    <Description>150 = 0x96 = 0b10010110</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>1</ucDataMaskShift>
-  <ucDataEnShift>1</ucDataEnShift>
-  <ucDataY_Shift>1</ucDataY_Shift>
-  <ucDataA_Shift>1</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_GPIO_I2C_ASSIGMENT of="0x9ADF-0x9AFA  len=0x1B=27">
-  <usClkMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usClkMaskRegisterIndex>
-  <usClkEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usClkEnRegisterIndex>
-  <usClkY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usClkY_RegisterIndex>
-  <usClkA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usClkA_RegisterIndex>
-  <usDataMaskRegisterIndex>18560 = 0x4880 = 0b100100010000000</usDataMaskRegisterIndex>
-  <usDataEnRegisterIndex>18562 = 0x4882 = 0b100100010000010</usDataEnRegisterIndex>
-  <usDataY_RegisterIndex>18563 = 0x4883 = 0b100100010000011</usDataY_RegisterIndex>
-  <usDataA_RegisterIndex>18561 = 0x4881 = 0b100100010000001</usDataA_RegisterIndex>
-  <sucI2cId>
-    <gpio_id>151 = 0x97 = 0b10010111</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>7 = 0x7 = 0b111</bfI2C_LineMux>
-    <Description>151 = 0x97 = 0b10010111</Description>
-  </sucI2cId>
-  <ucClkMaskShift>0</ucClkMaskShift>
-  <ucClkEnShift>0</ucClkEnShift>
-  <ucClkY_Shift>0</ucClkY_Shift>
-  <ucClkA_Shift>0</ucClkA_Shift>
-  <ucDataMaskShift>8 = 0x8 = 0b1000</ucDataMaskShift>
-  <ucDataEnShift>8 = 0x8 = 0b1000</ucDataEnShift>
-  <ucDataY_Shift>8 = 0x8 = 0b1000</ucDataY_Shift>
-  <ucDataA_Shift>8 = 0x8 = 0b1000</ucDataA_Shift>
-  <ucReserved1>0</ucReserved1>
-  <ucReserved2>0</ucReserved2>
-</ATOM_GPIO_I2C_ASSIGMENT>
-<ATOM_POWERPLAY_TABLE of="0x9BB2-0x9BFF  len=0x4D=77">
-  <sHeader>
-    <usStructureSize>833 = 0x341 = 0b1101000001</usStructureSize>
-    <ucTableFormatRevision>7 = 0x7 = 0b111</ucTableFormatRevision>
-    <ucTableContentRevision>1</ucTableContentRevision>
-  </sHeader>
-  <ucTableRevision>0</ucTableRevision>
-  <usTableSize>77 = 0x4D = 0b1001101</usTableSize>
-  <ulGoldenPPID>1665 = 0x681 = 0b11010000001</ulGoldenPPID>
-  <ulGoldenRevision>10394 = 0x289A = 0b10100010011010</ulGoldenRevision>
-  <usFormatID>25 = 0x19 = 0b11001</usFormatID>
-  <usVoltageTime>0</usVoltageTime>
-  <ulPlatformCaps>17203200 = 0x1068000 = 0b1000001101000000000000000</ulPlatformCaps>
-  <ulMaxODEngineClock>200000 = 0x30D40 = 0b110000110101000000</ulMaxODEngineClock>
-  <ulMaxODMemoryClock>225000 = 0x36EE8 = 0b110110111011101000</ulMaxODMemoryClock>
-  <usPowerControlLimit>50 = 0x32 = 0b110010</usPowerControlLimit>
-  <usUlvVoltageOffset>25 = 0x19 = 0b11001</usUlvVoltageOffset>
-  <usStateArrayOffset>77 = 0x4D = 0b1001101</usStateArrayOffset>
-  <usFanTableOffset>673 = 0x2A1 = 0b1010100001</usFanTableOffset>
-  <usThermalControllerOffset>664 = 0x298 = 0b1010011000</usThermalControllerOffset>
-  <usReserv>0</usReserv>
-  <usMclkDependencyTableOffset>437 = 0x1B5 = 0b110110101</usMclkDependencyTableOffset>
-  <usSclkDependencyTableOffset>315 = 0x13B = 0b100111011</usSclkDependencyTableOffset>
-  <usVddcLookupTableOffset>119 = 0x77 = 0b1110111</usVddcLookupTableOffset>
-  <usVddgfxLookupTableOffset>249 = 0xF9 = 0b11111001</usVddgfxLookupTableOffset>
-  <usMMDependencyTableOffset>478 = 0x1DE = 0b111011110</usMMDependencyTableOffset>
-  <usVCEStateTableOffset>774 = 0x306 = 0b1100000110</usVCEStateTableOffset>
-  <usPPMTableOffset>0</usPPMTableOffset>
-  <usPowerTuneTableOffset>721 = 0x2D1 = 0b1011010001</usPowerTuneTableOffset>
-  <usHardLimitTableOffset>0</usHardLimitTableOffset>
-  <usPCIETableOffset>800 = 0x320 = 0b1100100000</usPCIETableOffset>
-  <usGPIOTableOffset>826 = 0x33A = 0b1100111010</usGPIOTableOffset>
-</ATOM_POWERPLAY_TABLE>
-<ATOM_VOLTAGE_TABLE of="0x9C29-0x9C2B  len=0x2=2 Name=VddcLookupTable">
-  <ucRevId>0</ucRevId>
-  <ucNumEntries>16 = 0x10 = 0b10000</ucNumEntries>
-</ATOM_VOLTAGE_TABLE>
-<ATOM_VOLTAGE_ENTRY of="0x9C2B-0x9C33  len=0x8=8">
-  <usVdd>750 = 0x2EE = 0b1011101110</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C33-0x9C3B  len=0x8=8">
-  <usVdd>65282 = 0xFF02 = 0b1111111100000010</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C3B-0x9C43  len=0x8=8">
-  <usVdd>65283 = 0xFF03 = 0b1111111100000011</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C43-0x9C4B  len=0x8=8">
-  <usVdd>65284 = 0xFF04 = 0b1111111100000100</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C4B-0x9C53  len=0x8=8">
-  <usVdd>65285 = 0xFF05 = 0b1111111100000101</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C53-0x9C5B  len=0x8=8">
-  <usVdd>65286 = 0xFF06 = 0b1111111100000110</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C5B-0x9C63  len=0x8=8">
-  <usVdd>65287 = 0xFF07 = 0b1111111100000111</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C63-0x9C6B  len=0x8=8">
-  <usVdd>65288 = 0xFF08 = 0b1111111100001000</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C6B-0x9C73  len=0x8=8">
-  <usVdd>800 = 0x320 = 0b1100100000</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C73-0x9C7B  len=0x8=8">
-  <usVdd>850 = 0x352 = 0b1101010010</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C7B-0x9C83  len=0x8=8">
-  <usVdd>900 = 0x384 = 0b1110000100</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C83-0x9C8B  len=0x8=8">
-  <usVdd>950 = 0x3B6 = 0b1110110110</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C8B-0x9C93  len=0x8=8">
-  <usVdd>1000 = 0x3E8 = 0b1111101000</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C93-0x9C9B  len=0x8=8">
-  <usVdd>1050 = 0x41A = 0b10000011010</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9C9B-0x9CA3  len=0x8=8">
-  <usVdd>1100 = 0x44C = 0b10001001100</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CA3-0x9CAB  len=0x8=8">
-  <usVdd>1150 = 0x47E = 0b10001111110</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_TABLE of="0x9CAB-0x9CAD  len=0x2=2 Name=VddgfxLookupTable">
-  <ucRevId>0</ucRevId>
-  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
-</ATOM_VOLTAGE_TABLE>
-<ATOM_VOLTAGE_ENTRY of="0x9CAD-0x9CB5  len=0x8=8">
-  <usVdd>900 = 0x384 = 0b1110000100</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CB5-0x9CBD  len=0x8=8">
-  <usVdd>65282 = 0xFF02 = 0b1111111100000010</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CBD-0x9CC5  len=0x8=8">
-  <usVdd>65283 = 0xFF03 = 0b1111111100000011</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CC5-0x9CCD  len=0x8=8">
-  <usVdd>65284 = 0xFF04 = 0b1111111100000100</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CCD-0x9CD5  len=0x8=8">
-  <usVdd>65285 = 0xFF05 = 0b1111111100000101</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CD5-0x9CDD  len=0x8=8">
-  <usVdd>65286 = 0xFF06 = 0b1111111100000110</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CDD-0x9CE5  len=0x8=8">
-  <usVdd>65287 = 0xFF07 = 0b1111111100000111</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_VOLTAGE_ENTRY of="0x9CE5-0x9CED  len=0x8=8">
-  <usVdd>65288 = 0xFF08 = 0b1111111100001000</usVdd>
-  <usCACLow>0</usCACLow>
-  <usCACMid>0</usCACMid>
-  <usCACHigh>0</usCACHigh>
-</ATOM_VOLTAGE_ENTRY>
-<ATOM_SCLK_TABLE of="0x9CED-0x9CEF  len=0x2=2 Name=SclkDependencyTable">
-  <ucRevId>1</ucRevId>
-  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
-</ATOM_SCLK_TABLE>
-<ATOM_SCLK_ENTRY of="0x9CEF-0x9CFE  len=0xF=15">
-  <ucVddInd>0</ucVddInd>
-  <usVddcOffset>0</usVddcOffset>
-  <ulSclk>30000 = 0x7530 = 0b111010100110000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>128 = 0x80 = 0b10000000</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9CFE-0x9D0D  len=0xF=15">
-  <ucVddInd>1</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>60000 = 0xEA60 = 0b1110101001100000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D0D-0x9D1C  len=0xF=15">
-  <ucVddInd>2 = 0x2 = 0b10</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>90000 = 0x15F90 = 0b10101111110010000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D1C-0x9D2B  len=0xF=15">
-  <ucVddInd>3 = 0x3 = 0b11</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>116200 = 0x1C5E8 = 0b11100010111101000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D2B-0x9D3A  len=0xF=15">
-  <ucVddInd>4 = 0x4 = 0b100</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>123300 = 0x1E1A4 = 0b11110000110100100</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D3A-0x9D49  len=0xF=15">
-  <ucVddInd>5 = 0x5 = 0b101</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>127500 = 0x1F20C = 0b11111001000001100</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D49-0x9D58  len=0xF=15">
-  <ucVddInd>6 = 0x6 = 0b110</ucVddInd>
-  <usVddcOffset>65510 = 0xFFE6 = 0b1111111111100110</usVddcOffset>
-  <ulSclk>131900 = 0x2033C = 0b100000001100111100</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_SCLK_ENTRY of="0x9D58-0x9D67  len=0xF=15">
-  <ucVddInd>7 = 0x7 = 0b111</ucVddInd>
-  <usVddcOffset>0</usVddcOffset>
-  <ulSclk>136000 = 0x21340 = 0b100001001101000000</ulSclk>
-  <usEdcCurrent>0</usEdcCurrent>
-  <ucReliabilityTemperature>0</ucReliabilityTemperature>
-  <ucCKSVOffsetandDisable>0</ucCKSVOffsetandDisable>
-  <ulSclkOffset>0</ulSclkOffset>
-</ATOM_SCLK_ENTRY>
-<ATOM_MCLK_TABLE of="0x9D67-0x9D69  len=0x2=2 Name=MclkDependencyTable">
-  <ucRevId>0</ucRevId>
-  <ucNumEntries>3 = 0x3 = 0b11</ucNumEntries>
-</ATOM_MCLK_TABLE>
-<ATOM_MCLK_ENTRY of="0x9D69-0x9D76  len=0xD=13">
-  <ucVddcInd>0</ucVddcInd>
-  <usVddci>800 = 0x320 = 0b1100100000</usVddci>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
-  <ulMclk>30000 = 0x7530 = 0b111010100110000</ulMclk>
-  <usReserved>0</usReserved>
-</ATOM_MCLK_ENTRY>
-<ATOM_MCLK_ENTRY of="0x9D76-0x9D83  len=0xD=13">
-  <ucVddcInd>8 = 0x8 = 0b1000</ucVddcInd>
-  <usVddci>850 = 0x352 = 0b1101010010</usVddci>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
-  <ulMclk>100000 = 0x186A0 = 0b11000011010100000</ulMclk>
-  <usReserved>0</usReserved>
-</ATOM_MCLK_ENTRY>
-<ATOM_MCLK_ENTRY of="0x9D83-0x9D90  len=0xD=13">
-  <ucVddcInd>11 = 0xB = 0b1011</ucVddcInd>
-  <usVddci>950 = 0x3B6 = 0b1110110110</usVddci>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <usMvdd>1000 = 0x3E8 = 0b1111101000</usMvdd>
-  <ulMclk>200000 = 0x30D40 = 0b110000110101000000</ulMclk>
-  <usReserved>0</usReserved>
-</ATOM_MCLK_ENTRY>
-<ATOM_MM_DEPENDENCY_TABLE of="0x9D90-0x9D92  len=0x2=2">
-  <ucRevId>0</ucRevId>
-  <ucNumEntries>8 = 0x8 = 0b1000</ucNumEntries>
-</ATOM_MM_DEPENDENCY_TABLE>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9D92-0x9DA9  len=0x17=23">
-  <ucVddcInd>8 = 0x8 = 0b1000</ucVddcInd>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <ulDClk>58000 = 0xE290 = 0b1110001010010000</ulDClk>
-  <ulVClk>75000 = 0x124F8 = 0b10010010011111000</ulVClk>
-  <ulEClk>63000 = 0xF618 = 0b1111011000011000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>57000 = 0xDEA8 = 0b1101111010101000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9DA9-0x9DC0  len=0x17=23">
-  <ucVddcInd>9 = 0x9 = 0b1001</ucVddcInd>
-  <usVddgfxOffset>65460 = 0xFFB4 = 0b1111111110110100</usVddgfxOffset>
-  <ulDClk>63000 = 0xF618 = 0b1111011000011000</ulDClk>
-  <ulVClk>80000 = 0x13880 = 0b10011100010000000</ulVClk>
-  <ulEClk>69000 = 0x10D88 = 0b10000110110001000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>64000 = 0xFA00 = 0b1111101000000000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9DC0-0x9DD7  len=0x17=23">
-  <ucVddcInd>10 = 0xA = 0b1010</ucVddcInd>
-  <usVddgfxOffset>65435 = 0xFF9B = 0b1111111110011011</usVddgfxOffset>
-  <ulDClk>68000 = 0x109A0 = 0b10000100110100000</ulDClk>
-  <ulVClk>85000 = 0x14C08 = 0b10100110000001000</ulVClk>
-  <ulEClk>75000 = 0x124F8 = 0b10010010011111000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>70000 = 0x11170 = 0b10001000101110000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9DD7-0x9DEE  len=0x17=23">
-  <ucVddcInd>11 = 0xB = 0b1011</ucVddcInd>
-  <usVddgfxOffset>65410 = 0xFF82 = 0b1111111110000010</usVddgfxOffset>
-  <ulDClk>73000 = 0x11D28 = 0b10001110100101000</ulDClk>
-  <ulVClk>89000 = 0x15BA8 = 0b10101101110101000</ulVClk>
-  <ulEClk>81000 = 0x13C68 = 0b10011110001101000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>76000 = 0x128E0 = 0b10010100011100000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9DEE-0x9E05  len=0x17=23">
-  <ucVddcInd>12 = 0xC = 0b1100</ucVddcInd>
-  <usVddgfxOffset>65385 = 0xFF69 = 0b1111111101101001</usVddgfxOffset>
-  <ulDClk>77000 = 0x12CC8 = 0b10010110011001000</ulDClk>
-  <ulVClk>92000 = 0x16760 = 0b10110011101100000</ulVClk>
-  <ulEClk>86000 = 0x14FF0 = 0b10100111111110000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>81000 = 0x13C68 = 0b10011110001101000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9E05-0x9E1C  len=0x17=23">
-  <ucVddcInd>13 = 0xD = 0b1101</ucVddcInd>
-  <usVddgfxOffset>65335 = 0xFF37 = 0b1111111100110111</usVddgfxOffset>
-  <ulDClk>80000 = 0x13880 = 0b10011100010000000</ulDClk>
-  <ulVClk>95000 = 0x17318 = 0b10111001100011000</ulVClk>
-  <ulEClk>91000 = 0x16378 = 0b10110001101111000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>85000 = 0x14C08 = 0b10100110000001000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9E1C-0x9E33  len=0x17=23">
-  <ucVddcInd>14 = 0xE = 0b1110</ucVddcInd>
-  <usVddgfxOffset>65285 = 0xFF05 = 0b1111111100000101</usVddgfxOffset>
-  <ulDClk>83000 = 0x14438 = 0b10100010000111000</ulDClk>
-  <ulVClk>98000 = 0x17ED0 = 0b10111111011010000</ulVClk>
-  <ulEClk>96000 = 0x17700 = 0b10111011100000000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>88000 = 0x157C0 = 0b10101011111000000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_MM_DEPENDENCY_RECORD of="0x9E33-0x9E4A  len=0x17=23">
-  <ucVddcInd>15 = 0xF = 0b1111</ucVddcInd>
-  <usVddgfxOffset>0</usVddgfxOffset>
-  <ulDClk>86000 = 0x14FF0 = 0b10100111111110000</ulDClk>
-  <ulVClk>100000 = 0x186A0 = 0b11000011010100000</ulVClk>
-  <ulEClk>100000 = 0x186A0 = 0b11000011010100000</ulEClk>
-  <ulAClk>0</ulAClk>
-  <ulSAMUClk>91000 = 0x16378 = 0b10110001101111000</ulSAMUClk>
-</ATOM_MM_DEPENDENCY_RECORD>
-<ATOM_FAN_TABLE of="0x9E53-0x9E80  len=0x2D=45">
-  <ucRevId>9 = 0x9 = 0b1001</ucRevId>
-  <ucTHyst>3 = 0x3 = 0b11</ucTHyst>
-  <usTMin>4000 = 0xFA0 = 0b111110100000</usTMin>
-  <usTMed>6500 = 0x1964 = 0b1100101100100</usTMed>
-  <usTHigh>8500 = 0x2134 = 0b10000100110100</usTHigh>
-  <usPWMMin>2000 = 0x7D0 = 0b11111010000</usPWMMin>
-  <usPWMMed>4000 = 0xFA0 = 0b111110100000</usPWMMed>
-  <usPWMHigh>6000 = 0x1770 = 0b1011101110000</usPWMHigh>
-  <usTMax>10900 = 0x2A94 = 0b10101010010100</usTMax>
-  <ucFanControlMode>1</ucFanControlMode>
-  <usFanPWMMax>100 = 0x64 = 0b1100100</usFanPWMMax>
-  <usFanOutputSensitivity>4836 = 0x12E4 = 0b1001011100100</usFanOutputSensitivity>
-  <usFanRPMMax>2150 = 0x866 = 0b100001100110</usFanRPMMax>
-  <ulMinFanSCLKAcousticLimit>90000 = 0x15F90 = 0b10101111110010000</ulMinFanSCLKAcousticLimit>
-  <ucTargetTemperature>70 = 0x46 = 0b1000110</ucTargetTemperature>
-  <ucMinimumPWMLimit>44 = 0x2C = 0b101100</ucMinimumPWMLimit>
-  <usFanGainEdge>150 = 0x96 = 0b10010110</usFanGainEdge>
-  <usFanGainHotspot>150 = 0x96 = 0b10010110</usFanGainHotspot>
-  <usFanGainLiquid>100 = 0x64 = 0b1100100</usFanGainLiquid>
-  <usFanGainVrVddc>150 = 0x96 = 0b10010110</usFanGainVrVddc>
-  <usFanGainVrMvdd>150 = 0x96 = 0b10010110</usFanGainVrMvdd>
-  <usFanGainPlx>150 = 0x96 = 0b10010110</usFanGainPlx>
-  <usFanGainHbm>100 = 0x64 = 0b1100100</usFanGainHbm>
-  <usReserved>12801 = 0x3201 = 0b11001000000001</usReserved>
-</ATOM_FAN_TABLE>
-<ATOM_Polaris_PowerTune_Table of="0x9E83-0x9EB8  len=0x35=53">
-  <ucRevId>4 = 0x4 = 0b100</ucRevId>
-  <usTDP>145 = 0x91 = 0b10010001</usTDP>
-  <usConfigurableTDP>0</usConfigurableTDP>
-  <usTDC>132 = 0x84 = 0b10000100</usTDC>
-  <usBatteryPowerLimit>145 = 0x91 = 0b10010001</usBatteryPowerLimit>
-  <usSmallPowerLimit>145 = 0x91 = 0b10010001</usSmallPowerLimit>
-  <usLowCACLeakage>0</usLowCACLeakage>
-  <usHighCACLeakage>0</usHighCACLeakage>
-  <usMaximumPowerDeliveryLimit>145 = 0x91 = 0b10010001</usMaximumPowerDeliveryLimit>
-  <usTjMax>90 = 0x5A = 0b1011010</usTjMax>
-  <usPowerTuneDataSetID>0</usPowerTuneDataSetID>
-  <usEDCLimit>0</usEDCLimit>
-  <usSoftwareShutdownTemp>94 = 0x5E = 0b1011110</usSoftwareShutdownTemp>
-  <usClockStretchAmount>2 = 0x2 = 0b10</usClockStretchAmount>
-  <usTemperatureLimitHotspot>105 = 0x69 = 0b1101001</usTemperatureLimitHotspot>
-  <usTemperatureLimitLiquid1>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid1>
-  <usTemperatureLimitLiquid2>80 = 0x50 = 0b1010000</usTemperatureLimitLiquid2>
-  <usTemperatureLimitVrVddc>115 = 0x73 = 0b1110011</usTemperatureLimitVrVddc>
-  <usTemperatureLimitVrMvdd>115 = 0x73 = 0b1110011</usTemperatureLimitVrMvdd>
-  <usTemperatureLimitPlx>95 = 0x5F = 0b1011111</usTemperatureLimitPlx>
-  <ucLiquid1_I2C_address>0</ucLiquid1_I2C_address>
-  <ucLiquid2_I2C_address>0</ucLiquid2_I2C_address>
-  <ucLiquid_I2C_Line>144 = 0x90 = 0b10010000</ucLiquid_I2C_Line>
-  <ucVr_I2C_address>96 = 0x60 = 0b1100000</ucVr_I2C_address>
-  <ucVr_I2C_Line>150 = 0x96 = 0b10010110</ucVr_I2C_Line>
-  <ucPlx_I2C_address>0</ucPlx_I2C_address>
-  <ucPlx_I2C_Line>144 = 0x90 = 0b10010000</ucPlx_I2C_Line>
-  <usBoostPowerLimit>0</usBoostPowerLimit>
-  <ucCKS_LDO_REFSEL>6 = 0x6 = 0b110</ucCKS_LDO_REFSEL>
-  <ucHotSpotOnly>0</ucHotSpotOnly>
-  <ucReserve>0</ucReserve>
-  <usReserve>0</usReserve>
-</ATOM_Polaris_PowerTune_Table>
-<ATOM_OBJECT_HEADER_V3 of="0x9EFA-0x9F0C  len=0x12=18">
-  <sHeader>
-    <usStructureSize>350 = 0x15E = 0b101011110</usStructureSize>
-    <ucTableFormatRevision>1</ucTableFormatRevision>
-    <ucTableContentRevision>3 = 0x3 = 0b11</ucTableContentRevision>
-  </sHeader>
-  <usDeviceSupport>3720 = 0xE88 = 0b111010001000</usDeviceSupport>
-  <usConnectorObjectTableOffset>72 = 0x48 = 0b1001000</usConnectorObjectTableOffset>
-  <usRouterObjectTableOffset>0</usRouterObjectTableOffset>
-  <usEncoderObjectTableOffset>251 = 0xFB = 0b11111011</usEncoderObjectTableOffset>
-  <usProtectionObjectTableOffset>0</usProtectionObjectTableOffset>
-  <usDisplayPathTableOffset>18 = 0x12 = 0b10010</usDisplayPathTableOffset>
-  <usMiscObjectTableOffset>0</usMiscObjectTableOffset>
-</ATOM_OBJECT_HEADER_V3>
-<ATOM_DISPLAY_OBJECT_PATH_TABLE of="0x9F0C-0x9F10  len=0x4=4">
-  <ucNumOfDispPath>5 = 0x5 = 0b101</ucNumOfDispPath>
-  <ucVersion>1</ucVersion>
-  <ucPadding2>0</ucPadding2>
-</ATOM_DISPLAY_OBJECT_PATH_TABLE>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F10-0x9F1A  len=0xA=10">
-  <usDeviceTag>8 = 0x8 = 0b1000</usDeviceTag>
-  <usSize>10 = 0xA = 0b1010</usSize>
-  <usConnObjectId>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
-  </usConnObjectId>
-  <usGPUObjectId>
-    <KindInNamespace>0</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
-    <Index>1</Index>
-  </usGPUObjectId>
-  <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usGraphicObjIdsFirst>
-</ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F1A-0x9F24  len=0xA=10">
-  <usDeviceTag>128 = 0x80 = 0b10000000</usDeviceTag>
-  <usSize>10 = 0xA = 0b1010</usSize>
-  <usConnObjectId>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usConnObjectId>
-  <usGPUObjectId>
-    <KindInNamespace>0</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
-    <Index>1</Index>
-  </usGPUObjectId>
-  <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usGraphicObjIdsFirst>
-</ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F24-0x9F2E  len=0xA=10">
-  <usDeviceTag>512 = 0x200 = 0b1000000000</usDeviceTag>
-  <usSize>10 = 0xA = 0b1010</usSize>
-  <usConnObjectId>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
-  </usConnObjectId>
-  <usGPUObjectId>
-    <KindInNamespace>0</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
-    <Index>1</Index>
-  </usGPUObjectId>
-  <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usGraphicObjIdsFirst>
-</ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F2E-0x9F38  len=0xA=10">
-  <usDeviceTag>1024 = 0x400 = 0b10000000000</usDeviceTag>
-  <usSize>10 = 0xA = 0b1010</usSize>
-  <usConnObjectId>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usConnObjectId>
-  <usGPUObjectId>
-    <KindInNamespace>0</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
-    <Index>1</Index>
-  </usGPUObjectId>
-  <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usGraphicObjIdsFirst>
-</ATOM_DISPLAY_OBJECT_PATH>
-<ATOM_DISPLAY_OBJECT_PATH of="0x9F38-0x9F42  len=0xA=10">
-  <usDeviceTag>2048 = 0x800 = 0b100000000000</usDeviceTag>
-  <usSize>10 = 0xA = 0b1010</usSize>
-  <usConnObjectId>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x4</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
-  </usConnObjectId>
-  <usGPUObjectId>
-    <KindInNamespace>0</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_GPU</Namespace>
-    <Index>1</Index>
-  </usGPUObjectId>
-  <usGraphicObjIdsFirst>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usGraphicObjIdsFirst>
-</ATOM_DISPLAY_OBJECT_PATH>
-Connectors:
-<ATOM_OBJECT_TABLE of="0x9F42-0x9F46  len=0x4=4">
-  <ucNumberOfObjects>5 = 0x5 = 0b101</ucNumberOfObjects>
-  <ucPadding0>0</ucPadding0>
-  <ucPadding1>0</ucPadding1>
-  <ucPadding2>0</ucPadding2>
-</ATOM_OBJECT_TABLE>
-<ATOM_OBJECT of="0x9F46-0x9F4E  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>116 = 0x74 = 0b1110100</usSrcDstTableOffset>
-  <usRecordOffset>122 = 0x7A = 0b1111010</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9F74-0x9F76  len=0x2=2">
-  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
-  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9f76:01001002000008000000
-<ATOM_COMMON_RECORD_HEADER of="0x9F80-0x9F82  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9f82:9100
-<ATOM_COMMON_RECORD_HEADER of="0x9F84-0x9F86  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9f86:0100
-<ATOM_OBJECT of="0x9F4E-0x9F56  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>143 = 0x8F = 0b10001111</usSrcDstTableOffset>
-  <usRecordOffset>149 = 0x95 = 0b10010101</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9F8F-0x9F91  len=0x2=2">
-  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
-  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9f91:01002002000080000000
-<ATOM_COMMON_RECORD_HEADER of="0x9F9B-0x9F9D  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9f9d:9300
-<ATOM_COMMON_RECORD_HEADER of="0x9F9F-0x9FA1  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fa1:0500
-<ATOM_OBJECT of="0x9F56-0x9F5E  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>170 = 0xAA = 0b10101010</usSrcDstTableOffset>
-  <usRecordOffset>176 = 0xB0 = 0b10110000</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9FAA-0x9FAC  len=0x2=2">
-  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
-  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fac:01003002000000020000
-<ATOM_COMMON_RECORD_HEADER of="0x9FB6-0x9FB8  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fb8:9000
-<ATOM_COMMON_RECORD_HEADER of="0x9FBA-0x9FBC  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fbc:0600
-<ATOM_OBJECT of="0x9F5E-0x9F66  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>197 = 0xC5 = 0b11000101</usSrcDstTableOffset>
-  <usRecordOffset>203 = 0xCB = 0b11001011</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9FC5-0x9FC7  len=0x2=2">
-  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
-  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fc7:01004002000000040000
-<ATOM_COMMON_RECORD_HEADER of="0x9FD1-0x9FD3  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fd3:9200
-<ATOM_COMMON_RECORD_HEADER of="0x9FD5-0x9FD7  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fd7:0400
-<ATOM_OBJECT of="0x9F66-0x9F6E  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x4</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_CONNECTOR</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>224 = 0xE0 = 0b11100000</usSrcDstTableOffset>
-  <usRecordOffset>230 = 0xE6 = 0b11100110</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0x9FE0-0x9FE2  len=0x2=2">
-  <ucRecordSize>12 = 0xC = 0b1100</ucRecordSize>
-  <RecordType>ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fe2:01005002000000080000
-<ATOM_COMMON_RECORD_HEADER of="0x9FEC-0x9FEE  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_I2C_RECORD_TYPE = 0x1</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9fee:9500
-<ATOM_COMMON_RECORD_HEADER of="0x9FF0-0x9FF2  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_HPD_INT_RECORD_TYPE = 0x2</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0x9ff2:0300
-Encoders:
-<ATOM_OBJECT_TABLE of="0x9FF5-0x9FF9  len=0x4=4">
-  <ucNumberOfObjects>5 = 0x5 = 0b101</ucNumberOfObjects>
-  <ucPadding0>0</ucPadding0>
-  <ucPadding1>0</ucPadding1>
-  <ucPadding2>0</ucPadding2>
-</ATOM_OBJECT_TABLE>
-<ATOM_OBJECT of="0x9FF9-0xA001  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>295 = 0x127 = 0b100100111</usSrcDstTableOffset>
-  <usRecordOffset>301 = 0x12D = 0b100101101</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA027-0xA029  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa029:0F00
-<ATOM_OBJECT of="0xA001-0xA009  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>306 = 0x132 = 0b100110010</usSrcDstTableOffset>
-  <usRecordOffset>312 = 0x138 = 0b100111000</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA032-0xA034  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa034:0F00
-<ATOM_OBJECT of="0xA009-0xA011  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>317 = 0x13D = 0b100111101</usSrcDstTableOffset>
-  <usRecordOffset>323 = 0x143 = 0b101000011</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA03D-0xA03F  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa03f:0F00
-<ATOM_OBJECT of="0xA011-0xA019  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>2 = 0x2 = 0b10</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>328 = 0x148 = 0b101001000</usSrcDstTableOffset>
-  <usRecordOffset>334 = 0x14E = 0b101001110</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA048-0xA04A  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa04a:0F00
-<ATOM_OBJECT of="0xA019-0xA021  len=0x8=8">
-  <usObjectID>
-    <KindInNamespace>ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E</KindInNamespace>
-    <Namespace>GRAPH_OBJECT_TYPE_ENCODER</Namespace>
-    <Index>1</Index>
-  </usObjectID>
-  <usSrcDstTableOffset>339 = 0x153 = 0b101010011</usSrcDstTableOffset>
-  <usRecordOffset>345 = 0x159 = 0b101011001</usRecordOffset>
-  <usReserved>0</usReserved>
-</ATOM_OBJECT>
-<ATOM_COMMON_RECORD_HEADER of="0xA053-0xA055  len=0x2=2">
-  <ucRecordSize>4 = 0x4 = 0b100</ucRecordSize>
-  <RecordType>ATOM_ENCODER_CAP_RECORD_TYPE = 0x14</RecordType>
-</ATOM_COMMON_RECORD_HEADER>
-Extra at 0xa055:0F00
-Routers:
-Table not present:ATOM_OBJECT_TABLE
-<ATOM_VRAM_INFO of="0xA3AA-0xA3BE  len=0x14=20">
-  <sHeader>
-    <usStructureSize>1122 = 0x462 = 0b10001100010</usStructureSize>
-    <ucTableFormatRevision>2 = 0x2 = 0b10</ucTableFormatRevision>
-    <ucTableContentRevision>2 = 0x2 = 0b10</ucTableContentRevision>
-  </sHeader>
-  <usMemAdjustTblOffset>76 = 0x4C = 0b1001100</usMemAdjustTblOffset>
-  <usMemClkPatchTblOffset>91 = 0x5B = 0b1011011</usMemClkPatchTblOffset>
-  <usMcAdjustPerTileTblOffset>765 = 0x2FD = 0b1011111101</usMcAdjustPerTileTblOffset>
-  <usMcPhyInitTableOffset>947 = 0x3B3 = 0b1110110011</usMcPhyInitTableOffset>
-  <usDramDataRemapTblOffset>811 = 0x32B = 0b1100101011</usDramDataRemapTblOffset>
-  <usReserved1>0</usReserved1>
-  <ucNumOfVRAMModule>1</ucNumOfVRAMModule>
-  <ucMemoryClkPatchTblVer>1</ucMemoryClkPatchTblVer>
-  <ucVramModuleVer>8 = 0x8 = 0b1000</ucVramModuleVer>
-  <ucMcPhyTileNum>4 = 0x4 = 0b100</ucMcPhyTileNum>
-</ATOM_VRAM_INFO>
-<ATOM_VRAM_ENTRY of="0xA3BE-0xA3FE  len=0x40=64">
-  <ulChannelMapCfg>1985220658 = 0x76541032 = 0b1110110010101000001000000110010</ulChannelMapCfg>
-  <usModuleSize>56 = 0x38 = 0b111000</usModuleSize>
-  <usMcRamCfg>24738 = 0x60A2 = 0b110000010100010</usMcRamCfg>
-  <usEnableChannels>255 = 0xFF = 0b11111111</usEnableChannels>
-  <ucExtMemoryID>0</ucExtMemoryID>
-  <ucMemoryType>80 = 0x50 = 0b1010000</ucMemoryType>
-  <ucChannelNum>3 = 0x3 = 0b11</ucChannelNum>
-  <ucChannelWidth>5 = 0x5 = 0b101</ucChannelWidth>
-  <ucDensity>99 = 0x63 = 0b1100011</ucDensity>
-  <ucBankCol>10 = 0xA = 0b1010</ucBankCol>
-  <ucMisc>4 = 0x4 = 0b100</ucMisc>
-  <ucVREFI>0</ucVREFI>
-  <usReserved>0</usReserved>
-  <usMemorySize>8192 = 0x2000 = 0b10000000000000</usMemorySize>
-  <ucMcTunningSetId>0</ucMcTunningSetId>
-  <ucRowNum>11 = 0xB = 0b1011</ucRowNum>
-  <usEMRS2Value>16384 = 0x4000 = 0b100000000000000</usEMRS2Value>
-  <usEMRS3Value>24832 = 0x6100 = 0b110000100000000</usEMRS3Value>
-  <ucMemoryVenderID>118 = 0x76 = 0b1110110</ucMemoryVenderID>
-  <ucRefreshRateFactor>2 = 0x2 = 0b10</ucRefreshRateFactor>
-  <ucFIFODepth>2 = 0x2 = 0b10</ucFIFODepth>
-  <ucCDR_Bandwidth>0</ucCDR_Bandwidth>
-  <ulChannelMapCfg1>0</ulChannelMapCfg1>
-  <ulBankMapCfg>484675 = 0x76543 = 0b1110110010101000011</ulBankMapCfg>
-  <ulReserved>0</ulReserved>
-  <FullName>H5GQ8H24MJR</FullName>
-</ATOM_VRAM_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA433-0xA467  len=0x34=52">
-  <ulClkRange>40000 = 0x9C40 = 0b1001110001000000</ulClkRange>
-  <LatencyString>555000000000000022DD1C008494121120550B0A1444B10200204100330414209A8800A00000712406050C0D2B11150F</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA467-0xA49B  len=0x34=52">
-  <ulClkRange>80000 = 0x13880 = 0b10011100010000000</ulClkRange>
-  <LatencyString>777000000000000022DD1C00E7AC352240550D0D20C77205002481004C0914209A8800A0000071240C08171B571A2111</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA49B-0xA4CF  len=0x34=52">
-  <ulClkRange>90000 = 0x15F90 = 0b10101111110010000</ulClkRange>
-  <LatencyString>777000000000000022DD1C002931462650550E0EA20723060026A200540A1420AA8800A0000071240D0A1A1D621C2312</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA4CF-0xA503  len=0x34=52">
-  <ulClkRange>100000 = 0x186A0 = 0b11000011010100000</ulClkRange>
-  <LatencyString>777000000000000022DD1C0029B5462960550E0F2448D3060026A2005C0B1420AA8800A0000071240E0A1C206D1E2513</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA503-0xA537  len=0x34=52">
-  <ulClkRange>112500 = 0x1B774 = 0b11011011101110100</ulClkRange>
-  <LatencyString>999000000000000022339D006BBD572F5055100F29C9B3070048C4005D0D14204A8900A000007124100C20247B202A13</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA537-0xA56B  len=0x34=52">
-  <ulClkRange>125000 = 0x1E848 = 0b11110100001001000</ulClkRange>
-  <LatencyString>999000000000000022339D008CC558345055110F2D4A94080048C4005D0F14204A8900A000007124120D232889222E14</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA56B-0xA59F  len=0x34=52">
-  <ulClkRange>137500 = 0x2191C = 0b100001100100011100</ulClkRange>
-  <LatencyString>999000000000000022339D00ADCD693A7055111131CB7409004AE4006D0114204A8900A002007124140E272D97263215</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA59F-0xA5D3  len=0x34=52">
-  <ulClkRange>150000 = 0x249F0 = 0b100100100111110000</ulClkRange>
-  <LatencyString>999000000000000022339D00CE516A3E80551212B40B450A004AE400750314204A8900A002007124150F2A30A4283516</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA5D3-0xA607  len=0x34=52">
-  <ulClkRange>162500 = 0x27AC4 = 0b100111101011000100</ulClkRange>
-  <LatencyString>999000000000000022449D00105A7B4480551312B88C250B004C0401750514204A8900A00200712417112E34B22A3916</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA607-0xA63B  len=0x34=52">
-  <ulClkRange>175000 = 0x2AB98 = 0b101010101110011000</ulClkRange>
-  <LatencyString>999000000000000022559D0031627C4990551313BC0D060C004C04017D0714204A8900A00200712419123138C02D3D17</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA63B-0xA66F  len=0x34=52">
-  <ulClkRange>200000 = 0x30D40 = 0b110000110101000000</ulClkRange>
-  <LatencyString>BBB000000000000022889D0073EE8D53A055151743CFB60D004E24010E0A14204A8900A0030071241C143840DB324418</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA66F-0xA6A3  len=0x34=52">
-  <ulClkRange>225000 = 0x36EE8 = 0b110110111011101000</ulClkRange>
-  <LatencyString>BBB000000000000033BB9D00D6FEAF5EC05517174BD1770F005264011E0E14204A8900A00300712420173F48F7384C1A</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VRAM_TIMING_ENTRY of="0xA6A3-0xA6D7  len=0x34=52">
-  <ulClkRange>0</ulClkRange>
-  <LatencyString>060008000E0044FFFF00FFFFFF001F000000FFFFFF011F000000FFFFFF021F000000FFFFFF031F00000000000000E1B4</LatencyString>
-</ATOM_VRAM_TIMING_ENTRY>
-<ATOM_VOLTAGE_OBJECT_INFO_V3_1 of="0xA918-0xA91C  len=0x4=4">
-  <sHeader>
-    <usStructureSize>70 = 0x46 = 0b1000110</usStructureSize>
-    <ucTableFormatRevision>3 = 0x3 = 0b11</ucTableFormatRevision>
-    <ucTableContentRevision>1</ucTableContentRevision>
-  </sHeader>
-</ATOM_VOLTAGE_OBJECT_INFO_V3_1>
-<atom_voltage_object_header_v4 of="0xA91C-0xA920  len=0x4=4">
-  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
-  <ucVoltageMode>VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3</ucVoltageMode>
-  <usSize>18 = 0x12 = 0b10010</usSize>
-</atom_voltage_object_header_v4>
-<atom_i2c_voltage_object_v4_fields of="0xA920-0xA928  len=0x8=8">
-  <regulator_id>8 = 0x8 = 0b1000</regulator_id>
-  <i2c_id>
-    <gpio_id>150 = 0x96 = 0b10010110</gpio_id>
-    <bfHW_Capable>true</bfHW_Capable>
-    <bfHW_EngineID>1</bfHW_EngineID>
-    <bfI2C_LineMux>6 = 0x6 = 0b110</bfI2C_LineMux>
-    <Description>150 = 0x96 = 0b10010110</Description>
-  </i2c_id>
-  <i2c_slave_addr>
-    <shifted_i2c_slave_addr>96 = 0x60 = 0b1100000</shifted_i2c_slave_addr>
-  </i2c_slave_addr>
-  <i2c_control_offset>0</i2c_control_offset>
-  <i2c_flag>0</i2c_flag>
-  <i2c_speed>0</i2c_speed>
-  <reserved_0xA>0</reserved_0xA>
-  <reserved_0xB>0</reserved_0xB>
-</atom_i2c_voltage_object_v4_fields>
-<atom_i2c_data_entry of="0xA928-0xA92C  len=0x4=4">
-  <i2c_reg_index>50 = 0x32 = 0b110010</i2c_reg_index>
-  <i2c_reg_data>204 = 0xCC = 0b11001100</i2c_reg_data>
-</atom_i2c_data_entry>
-<FINAL_atom_i2c_data_entry of="0xA92C-0xA92E  len=0x2=2">
-  <final_entry_index>255 = 0xFF = 0b11111111</final_entry_index>
-</FINAL_atom_i2c_data_entry>
-<atom_voltage_object_header_v4 of="0xA92E-0xA932  len=0x4=4">
-  <ucVoltageType>VOLTAGE_TYPE_VDDC_0x1</ucVoltageType>
-  <ucVoltageMode>VOLTAGE_OBJ_SVID2_0x7</ucVoltageMode>
-  <usSize>12 = 0xC = 0b1100</usSize>
-</atom_voltage_object_header_v4>
-<atom_voltage_object_header_v4 of="0xA93A-0xA93E  len=0x4=4">
-  <ucVoltageType>VOLTAGE_TYPE_VDDCI_0x4</ucVoltageType>
-  <ucVoltageMode>VOLTAGE_OBJ_GPIO_LUT_0x0</ucVoltageMode>
-  <usSize>36 = 0x24 = 0b100100</usSize>
-</atom_voltage_object_header_v4>
-<atom_gpio_voltage_object_v4_fields of="0xA93E-0xA946  len=0x8=8">
-  <gpio_control_id>0</gpio_control_id>
-  <gpio_entry_num>4 = 0x4 = 0b100</gpio_entry_num>
-  <phase_delay_us>0</phase_delay_us>
-  <reserved>0</reserved>
-  <gpio_mask_val>1081346 = 0x108002 = 0b100001000000000000010</gpio_mask_val>
-</atom_gpio_voltage_object_v4_fields>
-<atom_voltage_gpio_map_lut of="0xA946-0xA94C  len=0x6=6">
-  <voltage_gpio_reg_val>0</voltage_gpio_reg_val>
-  <voltage_level_mv>800 = 0x320 = 0b1100100000</voltage_level_mv>
-</atom_voltage_gpio_map_lut>
-<atom_voltage_gpio_map_lut of="0xA94C-0xA952  len=0x6=6">
-  <voltage_gpio_reg_val>1048576 = 0x100000 = 0b100000000000000000000</voltage_gpio_reg_val>
-  <voltage_level_mv>850 = 0x352 = 0b1101010010</voltage_level_mv>
-</atom_voltage_gpio_map_lut>
-<atom_voltage_gpio_map_lut of="0xA952-0xA958  len=0x6=6">
-  <voltage_gpio_reg_val>2 = 0x2 = 0b10</voltage_gpio_reg_val>
-  <voltage_level_mv>900 = 0x384 = 0b1110000100</voltage_level_mv>
-</atom_voltage_gpio_map_lut>
-<atom_voltage_gpio_map_lut of="0xA958-0xA95E  len=0x6=6">
-  <voltage_gpio_reg_val>32768 = 0x8000 = 0b1000000000000000</voltage_gpio_reg_val>
-  <voltage_level_mv>950 = 0x3B6 = 0b1110110110</voltage_level_mv>
-</atom_voltage_gpio_map_lut>
-
-
+[Example XML output (large, ~1k lines)](./output-example.xml) ### 📉Changelog📉 diff --git a/output-example.xml b/output-example.xml new file mode 100644 index 0000000..83de40f --- /dev/null +++ b/output-example.xml @@ -0,0 +1,1451 @@ + + + + 85 = 0x55 = 0b1010101 + 170 = 0xAA = 0b10101010 + 116 = 0x74 = 0b1110100 + 233 = 0xE9 = 0b11101001 + 685 = 0x2AD = 0b1010101101 + 18-bytes text:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 + 592 = 0x250 = 0b1001010000 + 0 + 0 + 3-bytes text:IBM + 134 = 0x86 = 0b10000110 + 37508 = 0x9284 = 0b1001001010000100 + 11-bytes text:\0\0\0\0\0\0\0\0\0\0\0 + 4 = 0x4 = 0b100 + 10-bytes text: 761295520 + 6-bytes text:\0\0\0\0\0\0 + 677 = 0x2A5 = 0b1010100101 + 6-bytes text:\0\0\0\0\0\0 + 556 = 0x22C = 0b1000101100 + 0xE800 + 0x2B3 + + + + + 36 = 0x24 = 0b100100 + 1 + 1 + + 4-bytes text:ATOM + 49152 = 0xC000 = 0b1100000000000000 + 977 = 0x3D1 = 0b1111010001 + 460 = 0x1CC = 0b111001100 + 629 = 0x275 = 0b1001110101 + 288 = 0x120 = 0b100100000 + 1014 = 0x3F6 = 0b1111110110 + 0 + 0 + 4163 = 0x1043 = 0b1000001000011 + 1313 = 0x521 = 0b10100100001 + 592 = 0x250 = 0b1001010000 + 38748 = 0x975C = 0b1001011101011100 + 38914 = 0x9802 = 0b1001100000000010 + 160 = 0xA0 = 0b10100000 + 0 + + + 4-bytes text:PCIR + 4098 = 0x1002 = 0b1000000000010 + 26591 = 0x67DF = 0b110011111011111 + 0 + 24 = 0x18 = 0b11000 + 0 + 3-bytes text:\0\0\x03 + 116 = 0x74 = 0b1110100 + 3890 = 0xF32 = 0b111100110010 + 0 + 0 + 0 + 12-bytes text:AMD ATOMBIOS + + + + 166 = 0xA6 = 0b10100110 + 1 + 1 + + + + + + + 74 = 0x4A = 0b1001010 + 1 + 1 + + 0 + 0 + 0 + 38988 = 0x984C = 0b1001100001001100 + 39216 = 0x9930 = 0b1001100100110000 + 39324 = 0x999C = 0b1001100110011100 + 39376 = 0x99D0 = 0b1001100111010000 + 0 + 43522 = 0xAA02 = 0b1010101000000010 + 0 + 39454 = 0x9A1E = 0b1001101000011110 + 39674 = 0x9AFA = 0b1001101011111010 + 39686 = 0x9B06 = 0b1001101100000110 + 39718 = 0x9B26 = 0b1001101100100110 + 39834 = 0x9B9A = 0b1001101110011010 + 39858 = 0x9BB2 = 0b1001101110110010 + 0 + 43498 = 0xA9EA = 0b1010100111101010 + 0 + 40692 = 0x9EF4 = 0b1001111011110100 + 0 + 0 + 40698 = 0x9EFA = 0b1001111011111010 + 41772 = 0xA32C = 0b1010001100101100 + 41048 = 0xA058 = 0b1010000001011000 + 0 + 43358 = 0xA95E = 0b1010100101011110 + 43398 = 0xA986 = 0b1010100110000110 + 41898 = 0xA3AA = 0b1010001110101010 + 0 + 0 + 43020 = 0xA80C = 0b1010100000001100 + 43288 = 0xA918 = 0b1010100100011000 + 0 + 43578 = 0xAA3A = 0b1010101000111010 + + + + 108 = 0x6C = 0b1101100 + 2 = 0x2 = 0b10 + 2 = 0x2 = 0b10 + + 254935553 = 0xF320201 = 0b1111001100100000001000000001 + 30000 = 0x7530 = 0b111010100110000 + 30000 = 0x7530 = 0b111010100110000 + 0 + 360000 = 0x57E40 = 0b1010111111001000000 + 0 + 0 + 600000 = 0x927C0 = 0b10010010011111000000 + 0 + 62610 = 0xF492 = 0b1111010010010010 + 0 + 0 + 900 = 0x384 = 0b1110000100 + 2970 = 0xB9A = 0b101110011010 + 6000 = 0x1770 = 0b1011101110000 + 0 + 297000 = 0x48828 = 0b1001000100000101000 + 0 + 5-bytes text:\0\0\0\0\0 + 0 + 2621440000 = 0x9C400000 = 0b10011100010000000000000000000000 + 2500 = 0x9C4 = 0b100111000100 + 10000 = 0x2710 = 0b10011100010000 + 850 = 0x352 = 0b1101010010 + 16414 = 0x401E = 0b100000000011110 + 10000 = 0x2710 = 0b10011100010000 + 10000 = 0x2710 = 0b10011100010000 + 10000 = 0x2710 = 0b10011100010000 + 0 + 0 + 0 + 14 = 0xE = 0b1110 + 6 = 0x6 = 0b110 + 0 + 0 + + + + + 220 = 0xDC = 0b11011100 + 1 + 1 + + + + 18536 = 0x4868 = 0b100100001101000 + 18538 = 0x486A = 0b100100001101010 + 18539 = 0x486B = 0b100100001101011 + 18537 = 0x4869 = 0b100100001101001 + 18536 = 0x4868 = 0b100100001101000 + 18538 = 0x486A = 0b100100001101010 + 18539 = 0x486B = 0b100100001101011 + 18537 = 0x4869 = 0b100100001101001 + + 144 = 0x90 = 0b10010000 + true + 1 + 0 + 144 = 0x90 = 0b10010000 + + 0 + 0 + 0 + 0 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 0 + 0 + + + 18540 = 0x486C = 0b100100001101100 + 18542 = 0x486E = 0b100100001101110 + 18543 = 0x486F = 0b100100001101111 + 18541 = 0x486D = 0b100100001101101 + 18540 = 0x486C = 0b100100001101100 + 18542 = 0x486E = 0b100100001101110 + 18543 = 0x486F = 0b100100001101111 + 18541 = 0x486D = 0b100100001101101 + + 145 = 0x91 = 0b10010001 + true + 1 + 1 + 145 = 0x91 = 0b10010001 + + 0 + 0 + 0 + 0 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 0 + 0 + + + 18544 = 0x4870 = 0b100100001110000 + 18546 = 0x4872 = 0b100100001110010 + 18547 = 0x4873 = 0b100100001110011 + 18545 = 0x4871 = 0b100100001110001 + 18544 = 0x4870 = 0b100100001110000 + 18546 = 0x4872 = 0b100100001110010 + 18547 = 0x4873 = 0b100100001110011 + 18545 = 0x4871 = 0b100100001110001 + + 146 = 0x92 = 0b10010010 + true + 1 + 2 = 0x2 = 0b10 + 146 = 0x92 = 0b10010010 + + 0 + 0 + 0 + 0 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 0 + 0 + + + 18548 = 0x4874 = 0b100100001110100 + 18550 = 0x4876 = 0b100100001110110 + 18551 = 0x4877 = 0b100100001110111 + 18549 = 0x4875 = 0b100100001110101 + 18548 = 0x4874 = 0b100100001110100 + 18550 = 0x4876 = 0b100100001110110 + 18551 = 0x4877 = 0b100100001110111 + 18549 = 0x4875 = 0b100100001110101 + + 147 = 0x93 = 0b10010011 + true + 1 + 3 = 0x3 = 0b11 + 147 = 0x93 = 0b10010011 + + 0 + 0 + 0 + 0 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 0 + 0 + + + 18552 = 0x4878 = 0b100100001111000 + 18554 = 0x487A = 0b100100001111010 + 18555 = 0x487B = 0b100100001111011 + 18553 = 0x4879 = 0b100100001111001 + 18552 = 0x4878 = 0b100100001111000 + 18554 = 0x487A = 0b100100001111010 + 18555 = 0x487B = 0b100100001111011 + 18553 = 0x4879 = 0b100100001111001 + + 148 = 0x94 = 0b10010100 + true + 1 + 4 = 0x4 = 0b100 + 148 = 0x94 = 0b10010100 + + 0 + 0 + 0 + 0 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 0 + 0 + + + 18556 = 0x487C = 0b100100001111100 + 18558 = 0x487E = 0b100100001111110 + 18559 = 0x487F = 0b100100001111111 + 18557 = 0x487D = 0b100100001111101 + 18556 = 0x487C = 0b100100001111100 + 18558 = 0x487E = 0b100100001111110 + 18559 = 0x487F = 0b100100001111111 + 18557 = 0x487D = 0b100100001111101 + + 149 = 0x95 = 0b10010101 + true + 1 + 5 = 0x5 = 0b101 + 149 = 0x95 = 0b10010101 + + 0 + 0 + 0 + 0 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 0 + 0 + + + 18584 = 0x4898 = 0b100100010011000 + 18586 = 0x489A = 0b100100010011010 + 18587 = 0x489B = 0b100100010011011 + 18585 = 0x4899 = 0b100100010011001 + 18584 = 0x4898 = 0b100100010011000 + 18586 = 0x489A = 0b100100010011010 + 18587 = 0x489B = 0b100100010011011 + 18585 = 0x4899 = 0b100100010011001 + + 150 = 0x96 = 0b10010110 + true + 1 + 6 = 0x6 = 0b110 + 150 = 0x96 = 0b10010110 + + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + + + 18560 = 0x4880 = 0b100100010000000 + 18562 = 0x4882 = 0b100100010000010 + 18563 = 0x4883 = 0b100100010000011 + 18561 = 0x4881 = 0b100100010000001 + 18560 = 0x4880 = 0b100100010000000 + 18562 = 0x4882 = 0b100100010000010 + 18563 = 0x4883 = 0b100100010000011 + 18561 = 0x4881 = 0b100100010000001 + + 151 = 0x97 = 0b10010111 + true + 1 + 7 = 0x7 = 0b111 + 151 = 0x97 = 0b10010111 + + 0 + 0 + 0 + 0 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 8 = 0x8 = 0b1000 + 0 + 0 + + + + + 833 = 0x341 = 0b1101000001 + 7 = 0x7 = 0b111 + 1 + + 0 + 77 = 0x4D = 0b1001101 + 1665 = 0x681 = 0b11010000001 + 10394 = 0x289A = 0b10100010011010 + 25 = 0x19 = 0b11001 + 0 + 17203200 = 0x1068000 = 0b1000001101000000000000000 + 200000 = 0x30D40 = 0b110000110101000000 + 225000 = 0x36EE8 = 0b110110111011101000 + 50 = 0x32 = 0b110010 + 25 = 0x19 = 0b11001 + 77 = 0x4D = 0b1001101 + 673 = 0x2A1 = 0b1010100001 + 664 = 0x298 = 0b1010011000 + 0 + 437 = 0x1B5 = 0b110110101 + 315 = 0x13B = 0b100111011 + 119 = 0x77 = 0b1110111 + 249 = 0xF9 = 0b11111001 + 478 = 0x1DE = 0b111011110 + 774 = 0x306 = 0b1100000110 + 0 + 721 = 0x2D1 = 0b1011010001 + 0 + 800 = 0x320 = 0b1100100000 + 826 = 0x33A = 0b1100111010 + 12-bytes text:L\x11\x02\0S\x07\0\0\0\0\0\0 + + + + 0 + 16 = 0x10 = 0b10000 + + + 750 = 0x2EE = 0b1011101110 + 0 + 0 + 0 + + + 65282 = 0xFF02 = 0b1111111100000010 + 0 + 0 + 0 + + + 65283 = 0xFF03 = 0b1111111100000011 + 0 + 0 + 0 + + + 65284 = 0xFF04 = 0b1111111100000100 + 0 + 0 + 0 + + + 65285 = 0xFF05 = 0b1111111100000101 + 0 + 0 + 0 + + + 65286 = 0xFF06 = 0b1111111100000110 + 0 + 0 + 0 + + + 65287 = 0xFF07 = 0b1111111100000111 + 0 + 0 + 0 + + + 65288 = 0xFF08 = 0b1111111100001000 + 0 + 0 + 0 + + + 800 = 0x320 = 0b1100100000 + 0 + 0 + 0 + + + 850 = 0x352 = 0b1101010010 + 0 + 0 + 0 + + + 900 = 0x384 = 0b1110000100 + 0 + 0 + 0 + + + 950 = 0x3B6 = 0b1110110110 + 0 + 0 + 0 + + + 1000 = 0x3E8 = 0b1111101000 + 0 + 0 + 0 + + + 1050 = 0x41A = 0b10000011010 + 0 + 0 + 0 + + + 1100 = 0x44C = 0b10001001100 + 0 + 0 + 0 + + + 1150 = 0x47E = 0b10001111110 + 0 + 0 + 0 + + + 0 + 8 = 0x8 = 0b1000 + + + 900 = 0x384 = 0b1110000100 + 0 + 0 + 0 + + + 65282 = 0xFF02 = 0b1111111100000010 + 0 + 0 + 0 + + + 65283 = 0xFF03 = 0b1111111100000011 + 0 + 0 + 0 + + + 65284 = 0xFF04 = 0b1111111100000100 + 0 + 0 + 0 + + + 65285 = 0xFF05 = 0b1111111100000101 + 0 + 0 + 0 + + + 65286 = 0xFF06 = 0b1111111100000110 + 0 + 0 + 0 + + + 65287 = 0xFF07 = 0b1111111100000111 + 0 + 0 + 0 + + + 65288 = 0xFF08 = 0b1111111100001000 + 0 + 0 + 0 + + + + + 1 + 8 = 0x8 = 0b1000 + + + 0 + 0 + 30000 = 0x7530 = 0b111010100110000 + 0 + 0 + 128 = 0x80 = 0b10000000 + 0 + + + 1 + 65510 = 0xFFE6 = 0b1111111111100110 + 60000 = 0xEA60 = 0b1110101001100000 + 0 + 0 + 0 + 0 + + + 2 = 0x2 = 0b10 + 65510 = 0xFFE6 = 0b1111111111100110 + 90000 = 0x15F90 = 0b10101111110010000 + 0 + 0 + 0 + 0 + + + 3 = 0x3 = 0b11 + 65510 = 0xFFE6 = 0b1111111111100110 + 116200 = 0x1C5E8 = 0b11100010111101000 + 0 + 0 + 0 + 0 + + + 4 = 0x4 = 0b100 + 65510 = 0xFFE6 = 0b1111111111100110 + 123300 = 0x1E1A4 = 0b11110000110100100 + 0 + 0 + 0 + 0 + + + 5 = 0x5 = 0b101 + 65510 = 0xFFE6 = 0b1111111111100110 + 127500 = 0x1F20C = 0b11111001000001100 + 0 + 0 + 0 + 0 + + + 6 = 0x6 = 0b110 + 65510 = 0xFFE6 = 0b1111111111100110 + 131900 = 0x2033C = 0b100000001100111100 + 0 + 0 + 0 + 0 + + + 7 = 0x7 = 0b111 + 0 + 136000 = 0x21340 = 0b100001001101000000 + 0 + 0 + 0 + 0 + + + 0 + 3 = 0x3 = 0b11 + + + 0 + 800 = 0x320 = 0b1100100000 + 0 + 1000 = 0x3E8 = 0b1111101000 + 30000 = 0x7530 = 0b111010100110000 + 0 + + + 8 = 0x8 = 0b1000 + 850 = 0x352 = 0b1101010010 + 0 + 1000 = 0x3E8 = 0b1111101000 + 100000 = 0x186A0 = 0b11000011010100000 + 0 + + + 11 = 0xB = 0b1011 + 950 = 0x3B6 = 0b1110110110 + 0 + 1000 = 0x3E8 = 0b1111101000 + 200000 = 0x30D40 = 0b110000110101000000 + 0 + + + + + 0 + 8 = 0x8 = 0b1000 + + + 8 = 0x8 = 0b1000 + 0 + 58000 = 0xE290 = 0b1110001010010000 + 75000 = 0x124F8 = 0b10010010011111000 + 63000 = 0xF618 = 0b1111011000011000 + 0 + 57000 = 0xDEA8 = 0b1101111010101000 + + + 9 = 0x9 = 0b1001 + 65460 = 0xFFB4 = 0b1111111110110100 + 63000 = 0xF618 = 0b1111011000011000 + 80000 = 0x13880 = 0b10011100010000000 + 69000 = 0x10D88 = 0b10000110110001000 + 0 + 64000 = 0xFA00 = 0b1111101000000000 + + + 10 = 0xA = 0b1010 + 65435 = 0xFF9B = 0b1111111110011011 + 68000 = 0x109A0 = 0b10000100110100000 + 85000 = 0x14C08 = 0b10100110000001000 + 75000 = 0x124F8 = 0b10010010011111000 + 0 + 70000 = 0x11170 = 0b10001000101110000 + + + 11 = 0xB = 0b1011 + 65410 = 0xFF82 = 0b1111111110000010 + 73000 = 0x11D28 = 0b10001110100101000 + 89000 = 0x15BA8 = 0b10101101110101000 + 81000 = 0x13C68 = 0b10011110001101000 + 0 + 76000 = 0x128E0 = 0b10010100011100000 + + + 12 = 0xC = 0b1100 + 65385 = 0xFF69 = 0b1111111101101001 + 77000 = 0x12CC8 = 0b10010110011001000 + 92000 = 0x16760 = 0b10110011101100000 + 86000 = 0x14FF0 = 0b10100111111110000 + 0 + 81000 = 0x13C68 = 0b10011110001101000 + + + 13 = 0xD = 0b1101 + 65335 = 0xFF37 = 0b1111111100110111 + 80000 = 0x13880 = 0b10011100010000000 + 95000 = 0x17318 = 0b10111001100011000 + 91000 = 0x16378 = 0b10110001101111000 + 0 + 85000 = 0x14C08 = 0b10100110000001000 + + + 14 = 0xE = 0b1110 + 65285 = 0xFF05 = 0b1111111100000101 + 83000 = 0x14438 = 0b10100010000111000 + 98000 = 0x17ED0 = 0b10111111011010000 + 96000 = 0x17700 = 0b10111011100000000 + 0 + 88000 = 0x157C0 = 0b10101011111000000 + + + 15 = 0xF = 0b1111 + 0 + 86000 = 0x14FF0 = 0b10100111111110000 + 100000 = 0x186A0 = 0b11000011010100000 + 100000 = 0x186A0 = 0b11000011010100000 + 0 + 91000 = 0x16378 = 0b10110001101111000 + + + + 9 = 0x9 = 0b1001 + 3 = 0x3 = 0b11 + 4000 = 0xFA0 = 0b111110100000 + 6500 = 0x1964 = 0b1100101100100 + 8500 = 0x2134 = 0b10000100110100 + 2000 = 0x7D0 = 0b11111010000 + 4000 = 0xFA0 = 0b111110100000 + 6000 = 0x1770 = 0b1011101110000 + 10900 = 0x2A94 = 0b10101010010100 + 1 + 100 = 0x64 = 0b1100100 + 4836 = 0x12E4 = 0b1001011100100 + 2150 = 0x866 = 0b100001100110 + 90000 = 0x15F90 = 0b10101111110010000 + 70 = 0x46 = 0b1000110 + 44 = 0x2C = 0b101100 + 150 = 0x96 = 0b10010110 + 150 = 0x96 = 0b10010110 + 100 = 0x64 = 0b1100100 + 150 = 0x96 = 0b10010110 + 150 = 0x96 = 0b10010110 + 150 = 0x96 = 0b10010110 + 100 = 0x64 = 0b1100100 + 12801 = 0x3201 = 0b11001000000001 + + + 4 = 0x4 = 0b100 + 145 = 0x91 = 0b10010001 + 0 + 132 = 0x84 = 0b10000100 + 145 = 0x91 = 0b10010001 + 145 = 0x91 = 0b10010001 + 0 + 0 + 145 = 0x91 = 0b10010001 + 90 = 0x5A = 0b1011010 + 0 + 0 + 94 = 0x5E = 0b1011110 + 2 = 0x2 = 0b10 + 105 = 0x69 = 0b1101001 + 80 = 0x50 = 0b1010000 + 80 = 0x50 = 0b1010000 + 115 = 0x73 = 0b1110011 + 115 = 0x73 = 0b1110011 + 95 = 0x5F = 0b1011111 + 0 + 0 + 144 = 0x90 = 0b10010000 + 96 = 0x60 = 0b1100000 + 150 = 0x96 = 0b10010110 + 0 + 144 = 0x90 = 0b10010000 + 0 + 6 = 0x6 = 0b110 + 0 + 0 + 0 + + + + + 350 = 0x15E = 0b101011110 + 1 + 3 = 0x3 = 0b11 + + 3720 = 0xE88 = 0b111010001000 + 72 = 0x48 = 0b1001000 + 0 + 251 = 0xFB = 0b11111011 + 0 + 18 = 0x12 = 0b10010 + 0 + + + + 5 = 0x5 = 0b101 + 1 + 0 + + + 8 = 0x8 = 0b1000 + 10 = 0xA = 0b1010 + + CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13 + GRAPH_OBJECT_TYPE_CONNECTOR + 1 + + + 0 + GRAPH_OBJECT_TYPE_GPU + 1 + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20 + GRAPH_OBJECT_TYPE_ENCODER + 1 + + + + 128 = 0x80 = 0b10000000 + 10 = 0xA = 0b1010 + + CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13 + GRAPH_OBJECT_TYPE_CONNECTOR + 2 = 0x2 = 0b10 + + + 0 + GRAPH_OBJECT_TYPE_GPU + 1 + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20 + GRAPH_OBJECT_TYPE_ENCODER + 2 = 0x2 = 0b10 + + + + 512 = 0x200 = 0b1000000000 + 10 = 0xA = 0b1010 + + CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC + GRAPH_OBJECT_TYPE_CONNECTOR + 1 + + + 0 + GRAPH_OBJECT_TYPE_GPU + 1 + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21 + GRAPH_OBJECT_TYPE_ENCODER + 1 + + + + 1024 = 0x400 = 0b10000000000 + 10 = 0xA = 0b1010 + + CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC + GRAPH_OBJECT_TYPE_CONNECTOR + 2 = 0x2 = 0b10 + + + 0 + GRAPH_OBJECT_TYPE_GPU + 1 + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21 + GRAPH_OBJECT_TYPE_ENCODER + 2 = 0x2 = 0b10 + + + + 2048 = 0x800 = 0b100000000000 + 10 = 0xA = 0b1010 + + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x4 + GRAPH_OBJECT_TYPE_CONNECTOR + 1 + + + 0 + GRAPH_OBJECT_TYPE_GPU + 1 + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E + GRAPH_OBJECT_TYPE_ENCODER + 1 + + + + + + + 5 = 0x5 = 0b101 + 0 + 0 + 0 + + + + CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13 + GRAPH_OBJECT_TYPE_CONNECTOR + 1 + + 116 = 0x74 = 0b1110100 + 122 = 0x7A = 0b1111010 + 0 + + + 12 = 0xC = 0b1100 + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4 + + + + 4 = 0x4 = 0b100 + ATOM_I2C_RECORD_TYPE = 0x1 + + + + 4 = 0x4 = 0b100 + ATOM_HPD_INT_RECORD_TYPE = 0x2 + + + + + CONNECTOR_OBJECT_ID_DISPLAYPORT = 0x13 + GRAPH_OBJECT_TYPE_CONNECTOR + 2 = 0x2 = 0b10 + + 143 = 0x8F = 0b10001111 + 149 = 0x95 = 0b10010101 + 0 + + + 12 = 0xC = 0b1100 + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4 + + + + 4 = 0x4 = 0b100 + ATOM_I2C_RECORD_TYPE = 0x1 + + + + 4 = 0x4 = 0b100 + ATOM_HPD_INT_RECORD_TYPE = 0x2 + + + + + CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC + GRAPH_OBJECT_TYPE_CONNECTOR + 1 + + 170 = 0xAA = 0b10101010 + 176 = 0xB0 = 0b10110000 + 0 + + + 12 = 0xC = 0b1100 + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4 + + + + 4 = 0x4 = 0b100 + ATOM_I2C_RECORD_TYPE = 0x1 + + + + 4 = 0x4 = 0b100 + ATOM_HPD_INT_RECORD_TYPE = 0x2 + + + + + CONNECTOR_OBJECT_ID_HDMI_TYPE_A = 0xC + GRAPH_OBJECT_TYPE_CONNECTOR + 2 = 0x2 = 0b10 + + 197 = 0xC5 = 0b11000101 + 203 = 0xCB = 0b11001011 + 0 + + + 12 = 0xC = 0b1100 + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4 + + + + 4 = 0x4 = 0b100 + ATOM_I2C_RECORD_TYPE = 0x1 + + + + 4 = 0x4 = 0b100 + ATOM_HPD_INT_RECORD_TYPE = 0x2 + + + + + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D = 0x4 + GRAPH_OBJECT_TYPE_CONNECTOR + 1 + + 224 = 0xE0 = 0b11100000 + 230 = 0xE6 = 0b11100110 + 0 + + + 12 = 0xC = 0b1100 + ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE = 0x4 + + + + 4 = 0x4 = 0b100 + ATOM_I2C_RECORD_TYPE = 0x1 + + + + 4 = 0x4 = 0b100 + ATOM_HPD_INT_RECORD_TYPE = 0x2 + + + + + + + + 5 = 0x5 = 0b101 + 0 + 0 + 0 + + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20 + GRAPH_OBJECT_TYPE_ENCODER + 1 + + 295 = 0x127 = 0b100100111 + 301 = 0x12D = 0b100101101 + 0 + + + 4 = 0x4 = 0b100 + ATOM_ENCODER_CAP_RECORD_TYPE = 0x14 + + + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 = 0x20 + GRAPH_OBJECT_TYPE_ENCODER + 2 = 0x2 = 0b10 + + 306 = 0x132 = 0b100110010 + 312 = 0x138 = 0b100111000 + 0 + + + 4 = 0x4 = 0b100 + ATOM_ENCODER_CAP_RECORD_TYPE = 0x14 + + + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21 + GRAPH_OBJECT_TYPE_ENCODER + 1 + + 317 = 0x13D = 0b100111101 + 323 = 0x143 = 0b101000011 + 0 + + + 4 = 0x4 = 0b100 + ATOM_ENCODER_CAP_RECORD_TYPE = 0x14 + + + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 = 0x21 + GRAPH_OBJECT_TYPE_ENCODER + 2 = 0x2 = 0b10 + + 328 = 0x148 = 0b101001000 + 334 = 0x14E = 0b101001110 + 0 + + + 4 = 0x4 = 0b100 + ATOM_ENCODER_CAP_RECORD_TYPE = 0x14 + + + + + ENCODER_OBJECT_ID_INTERNAL_UNIPHY = 0x1E + GRAPH_OBJECT_TYPE_ENCODER + 1 + + 339 = 0x153 = 0b101010011 + 345 = 0x159 = 0b101011001 + 0 + + + 4 = 0x4 = 0b100 + ATOM_ENCODER_CAP_RECORD_TYPE = 0x14 + + + + + + + + + + + + 1122 = 0x462 = 0b10001100010 + 2 = 0x2 = 0b10 + 2 = 0x2 = 0b10 + + 76 = 0x4C = 0b1001100 + 91 = 0x5B = 0b1011011 + 765 = 0x2FD = 0b1011111101 + 947 = 0x3B3 = 0b1110110011 + 811 = 0x32B = 0b1100101011 + 0 + 1 + 1 + 8 = 0x8 = 0b1000 + 4 = 0x4 = 0b100 + + + 1985220658 = 0x76541032 = 0b1110110010101000001000000110010 + 56 = 0x38 = 0b111000 + 24738 = 0x60A2 = 0b110000010100010 + 255 = 0xFF = 0b11111111 + 0 + 80 = 0x50 = 0b1010000 + 3 = 0x3 = 0b11 + 5 = 0x5 = 0b101 + 99 = 0x63 = 0b1100011 + 10 = 0xA = 0b1010 + 4 = 0x4 = 0b100 + 0 + 0 + 8192 = 0x2000 = 0b10000000000000 + 0 + 11 = 0xB = 0b1011 + 16384 = 0x4000 = 0b100000000000000 + 24832 = 0x6100 = 0b110000100000000 + 118 = 0x76 = 0b1110110 + 2 = 0x2 = 0b10 + 2 = 0x2 = 0b10 + 0 + 0 + 484675 = 0x76543 = 0b1110110010101000011 + 0 + 20-bytes text:H5GQ8H24MJR\0\x03\0\x04\0\xFF\xFF\0\xFF + + + 40000 = 0x9C40 = 0b1001110001000000 + 555000000000000022DD1C008494121120550B0A1444B10200204100330414209A8800A00000712406050C0D2B11150F + + + 80000 = 0x13880 = 0b10011100010000000 + 777000000000000022DD1C00E7AC352240550D0D20C77205002481004C0914209A8800A0000071240C08171B571A2111 + + + 90000 = 0x15F90 = 0b10101111110010000 + 777000000000000022DD1C002931462650550E0EA20723060026A200540A1420AA8800A0000071240D0A1A1D621C2312 + + + 100000 = 0x186A0 = 0b11000011010100000 + 777000000000000022DD1C0029B5462960550E0F2448D3060026A2005C0B1420AA8800A0000071240E0A1C206D1E2513 + + + 112500 = 0x1B774 = 0b11011011101110100 + 999000000000000022339D006BBD572F5055100F29C9B3070048C4005D0D14204A8900A000007124100C20247B202A13 + + + 125000 = 0x1E848 = 0b11110100001001000 + 999000000000000022339D008CC558345055110F2D4A94080048C4005D0F14204A8900A000007124120D232889222E14 + + + 137500 = 0x2191C = 0b100001100100011100 + 999000000000000022339D00ADCD693A7055111131CB7409004AE4006D0114204A8900A002007124140E272D97263215 + + + 150000 = 0x249F0 = 0b100100100111110000 + 999000000000000022339D00CE516A3E80551212B40B450A004AE400750314204A8900A002007124150F2A30A4283516 + + + 162500 = 0x27AC4 = 0b100111101011000100 + 999000000000000022449D00105A7B4480551312B88C250B004C0401750514204A8900A00200712417112E34B22A3916 + + + 175000 = 0x2AB98 = 0b101010101110011000 + 999000000000000022559D0031627C4990551313BC0D060C004C04017D0714204A8900A00200712419123138C02D3D17 + + + 200000 = 0x30D40 = 0b110000110101000000 + BBB000000000000022889D0073EE8D53A055151743CFB60D004E24010E0A14204A8900A0030071241C143840DB324418 + + + 225000 = 0x36EE8 = 0b110110111011101000 + BBB000000000000033BB9D00D6FEAF5EC05517174BD1770F005264011E0E14204A8900A00300712420173F48F7384C1A + + + 0 + 060008000E0044FFFF00FFFFFF001F000000FFFFFF011F000000FFFFFF021F000000FFFFFF031F00000000000000E1B4 + + + + + + 70 = 0x46 = 0b1000110 + 3 = 0x3 = 0b11 + 1 + + + + VOLTAGE_TYPE_VDDC_0x1 + VOLTAGE_OBJ_VR_I2C_INIT_SEQ_0x3 + 18 = 0x12 = 0b10010 + + + 8 = 0x8 = 0b1000 + + 150 = 0x96 = 0b10010110 + true + 1 + 6 = 0x6 = 0b110 + 150 = 0x96 = 0b10010110 + + + 96 = 0x60 = 0b1100000 + + 0 + 0 + 0 + 0 + 0 + + + 50 = 0x32 = 0b110010 + 204 = 0xCC = 0b11001100 + + + 255 = 0xFF = 0b11111111 + + + VOLTAGE_TYPE_VDDC_0x1 + VOLTAGE_OBJ_SVID2_0x7 + 12 = 0xC = 0b1100 + + + VOLTAGE_TYPE_VDDCI_0x4 + VOLTAGE_OBJ_GPIO_LUT_0x0 + 36 = 0x24 = 0b100100 + + + 0 + 4 = 0x4 = 0b100 + 0 + 0 + 1081346 = 0x108002 = 0b100001000000000000010 + + + 0 + 800 = 0x320 = 0b1100100000 + + + 1048576 = 0x100000 = 0b100000000000000000000 + 850 = 0x352 = 0b1101010010 + + + 2 = 0x2 = 0b10 + 900 = 0x384 = 0b1110000100 + + + 32768 = 0x8000 = 0b1000000000000000 + 950 = 0x3B6 = 0b1110110110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 85 = 0x55 = 0b1010101 + 170 = 0xAA = 0b10101010 + 114 = 0x72 = 0b1110010 + 3825 = 0xEF1 = 0b111011110001 + 11 = 0xB = 0b1011 + 34404 = 0x8664 = 0b1000011001100100 + 1 + 8-bytes text:\0\0\0\0\0\0\0\0 + 88 = 0x58 = 0b1011000 + 28 = 0x1C = 0b11100 + 0 + 0xE400 + + + 4-bytes text:PCIR + 4098 = 0x1002 = 0b1000000000010 + 26591 = 0x67DF = 0b110011111011111 + 0 + 24 = 0x18 = 0b11000 + 0 + 3-bytes text:\0\0\x03 + 114 = 0x72 = 0b1110010 + 0 + 3 = 0x3 = 0b11 + 128 = 0x80 = 0b10000000 + 0 + 12-bytes text:GOP AMD REV: + + + + 57898 = 0xE22A = 0b1110001000101010 + 105272 = 0x19B38 = 0b11001101100111000 + + + + From b40eefdc945bfdd33b98eb9be92bdb4b3d7c9946 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Thu, 15 Jul 2021 00:00:42 +0300 Subject: [PATCH 33/39] fix running linux-built binary on windows --- PolarisBiosEditor.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index c9c35e7..5f7fa16 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1212,7 +1212,8 @@ static void Main(string[] args) } else { - Console.Error.WriteLine("Open a AMD Polaris VBIOS file to see it's some detalied info as XML in this console (or pass single filename as argument)"); + Console.Error.WriteLine("Open a AMD Polaris VBIOS file to see it's as XML in this console"); + Console.Error.WriteLine("Or close application and open it with a singe file as argument, for example by drag&drop vbios on .exe file"); } Application.Run(pbe); } @@ -1346,11 +1347,11 @@ public void PrintCheckText(int start, int after_end) { PrintXml("MostlyText", "", new Attrs{ {"info", HexRange(start, after_end - start)}, - {"as_text", SafeDecodeAscii(new ArraySegment(buffer, start, after_end-start).ToArray())}, + {"as_text", SafeDecodeAscii(new ArraySegment(buffer, start, after_end-start))}, }); } - public static string SafeDecodeAscii(byte[] bytes) + public static string SafeDecodeAscii(IEnumerable bytes) { var filtered_result = ""; foreach(var ch in bytes) From 892d993bbf1272de2e100efc5e69dd9b10519bb9 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Thu, 15 Jul 2021 00:31:54 +0300 Subject: [PATCH 34/39] Tested binary --- bin/Debug/PolarisBiosEditor.exe | Bin 61952 -> 75264 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index c87723b78a66796111f59b522ece70336fa190cd..ee8fc55acbbcde88492142318fae8e88e06db3cd 100755 GIT binary patch literal 75264 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 From 2a737750324bd9605aee57d2413f58c46a24a616 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Thu, 15 Jul 2021 00:36:49 +0300 Subject: [PATCH 35/39] v1.7xml-2021-07 --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index df0bedc..7a5083d 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,15 @@ To get xml - just open vbios file and look in console/stdout [Example XML output (large, ~1k lines)](./output-example.xml) ### 📉Changelog📉 +v1.7xml-2021-07 + * Fix exceptions while runing linux-built binary on windows + * Dump all parsed data as valid xml + * add dumping for generic option rom & EFI headers + * add dumping of VDCCI-related tables, sligtly extend VDCCI viewing GUI + +v1.7xml-2021-01 + * Introduce xml dump + * Add parsing i2c and video-output realted tables ### 📎Download and run with [prebuilt cross-platform .Net exe file](./bin/Debug/PolarisBiosEditor.exe)📎 Please see ⛏️Build⛏️ section below and compile yourself if you don't trust prebuilt binary. From 428334396b0d3e08c710b64dd1133f596ef05cd9 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Sat, 31 Jul 2021 17:56:44 +0300 Subject: [PATCH 36/39] Instruction for saving to file --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a5083d..32c36d5 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,15 @@ ## 🧾PolarisBiosEditor 1.7xml🧾 VBIOS editor fork with detailed dumping data as XML in console.
The intended usage is **viewing** and/or help with **editing by external HEX editor**.
-Editing functionality is 99% identical to the upstream, NO major new GUI features. +Editing functionality is 99% identical to the upstream, no major new GUI features. + +To view XML just open vbios file via file dialog and look in console/stdout. +To save XML to file: +* open cmd in folder containing PolarisBiosEditor.exe +* start program with stdout redirection, like
+`PolarisBiosEditor.exe path\to\input-file.rom > outfile.xml` +* close gui window to finish application and finalize/flush file writing -To get xml - just open vbios file and look in console/stdout [Example XML output (large, ~1k lines)](./output-example.xml) ### 📉Changelog📉 From 6544e1d95d03bc3c05b54754658b37042585dd6e Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 9 Aug 2021 13:33:08 +0300 Subject: [PATCH 37/39] try not crashing even on unsupported vbioses that can be partially parsed fix building & printing stacktrace on linux bump version to 2021-08 --- PolarisBiosEditor.cs | 111 ++++++++++++++++++++++++++++++------------- build.sh | 2 +- run.sh | 2 +- 3 files changed, 79 insertions(+), 36 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 5f7fa16..87a8d59 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -110,7 +110,7 @@ public partial class PolarisBiosEditor : Form /* DATA */ - string version = "1.7xml-2021.07"; + string version = "1.7xml-2021.08"; string programTitle = "PolarisBiosEditor"; @@ -748,7 +748,7 @@ public string KindInNamespace { get { - var type_name = Namespace.ToString().Split(new[] { '_' }).Last(); + var type_name = Namespace.Split(new[] { '_' }).Last(); var type = Type.GetType("PolarisBiosEditor.KIND_" + type_name); if (type != null) { @@ -758,9 +758,9 @@ public string KindInNamespace } set { throw new NotImplementedException(); } } - public GRAPH_OBJECT_TYPE Namespace + public string Namespace { - get { return (GRAPH_OBJECT_TYPE)(NamespaceAndIndex >> 4); } + get { return EnumOrValue(NamespaceAndIndex >> 4); } set { throw new NotImplementedException(); } } public int Index @@ -1139,7 +1139,7 @@ public ConsecutiveReader(Byte[] entire_buffer, int offset, PolarisBiosEditor a_e public T Read() { T obj = default(T); - int size = Marshal.SizeOf(obj); + int size = Marshal.SizeOf(); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(buffer.Array, buffer.Offset, ptr, size); @@ -1150,8 +1150,13 @@ public T Read() } public T ReadPrint(string name = "") { + int size = Marshal.SizeOf(); + if (buffer.Offset + size > buffer.Array.Length) + { + editor.Print("IGNORED_OUT_OF_RANGE_INSTANCE_OF_"+typeof(T).Name, "addr", string.Format("0x{0:X}-0x{1:X} len={2}=0x{2:X}{3}", buffer.Offset, buffer.Offset + size, size, name)); + return default(T); + } T result = Read(); - int size = Marshal.SizeOf(typeof(T)); if (!string.IsNullOrWhiteSpace(name)) { name = " Name=" + name; @@ -1167,7 +1172,14 @@ public void Jump1Structure() public void Jump(int relative_offset) { int offset = buffer.Offset + relative_offset; - buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); + if (offset < 0 || offset >= buffer.Array.Length) + { + buffer = new ArraySegment(buffer.Array, 0, 0); + } + else + { + buffer = new ArraySegment(buffer.Array, offset, buffer.Array.Length - offset); + } } public void JumpPrintExtra(int relative_offset) { @@ -1244,11 +1256,20 @@ public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) } } + public static string EnumOrValue(int value) + { + return ((TEnum)Enum.ToObject(typeof(TEnum),value)).ToString(); + } public string HexRange(int start, int len) { string values = ""; for (int i =0; i= buffer.Length) + { + values += "!END_OF_INPUT_DATA!"; + break; + } if (i <14 || i > len-15) { values += string.Format("{0:X2}", buffer[start + i]); @@ -1329,25 +1350,38 @@ public void PrintCmds(ATOM_CMD_TABLES_LIST cmds, int final_offset) public void PrintCheckFF(int start, int after_end) { + if (start < 0) + { + PrintXml("INVALID_NEGATIVE_START_PBinaryAreaFastCheck"); + return; + } int FF_count = 0; - int NonFF_count = 0; - for (int i = start; i < after_end; ++i) + int Zero_count = 0; + int Other_count = 0; + for (int i = start; i < Math.Min(after_end, buffer.Length); ++i) { if (buffer[i] == 0xFF) ++FF_count; - else ++NonFF_count; + else if (buffer[i] == 0) ++Zero_count; + else ++Other_count; } - PrintXml("FromLastToSectionEnd", "", new Attrs{ + PrintXml("BinaryAreaFastCheck", "", new Attrs{ {"info", HexRange(start, after_end - start)}, {"FF_count", FF_count}, - {"NonFF_count", NonFF_count}, + {"Zero_count", Zero_count}, + {"Other_count", Other_count}, }); } public void PrintCheckText(int start, int after_end) { + var as_text_segment = new ArraySegment(buffer, 0, 0); + if (start < buffer.Length) + { + as_text_segment = new ArraySegment(buffer, start, Math.Min(after_end, buffer.Length) - start); + } PrintXml("MostlyText", "", new Attrs{ {"info", HexRange(start, after_end - start)}, - {"as_text", SafeDecodeAscii(new ArraySegment(buffer, start, after_end-start))}, + {"as_text", SafeDecodeAscii(as_text_segment)}, }); } @@ -1477,7 +1511,7 @@ private int PrintAndReturnLen(ATOM_OBJECT o) if (o.usRecordOffset != 0) { var reader = Reader(atom_data_table.Object_Header + o.usRecordOffset); - while (true) + while (reader.buffer.Count > 0) { var first = reader.buffer.First(); if (first == 0 || first == 255) @@ -1707,13 +1741,13 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) if (SafeDecodeAscii(atom_rom_header.uaFirmWareSignature) != "ATOM") { - MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); + MessageBox.Show("WARNING! BIOS doesn't look like valid AMD GPU Bios. Results may be garbage.", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } string deviceId = pcir_header.usDeviceID.ToString("X"); if (!supportedID.Contains(deviceId)) { - MessageBox.Show("Unsupported DeviceID 0x" + deviceId + " - Continue?", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); + MessageBox.Show("Unsupported DeviceID 0x" + deviceId + ".\n You can view fileds and XML output, but trying to save will crash or produce corrupted file", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } atom_code = Reader(atom_rom_header.usMasterCommandTableOffset).ReadPrint(); @@ -1740,14 +1774,14 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) { - atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + atom_vddc_entries[i] = Reader(atom_vddc_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i).ReadPrint(); } var atom_vddgfx_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usVddgfxLookupTableOffset; var atom_vddgfx_table = Reader(atom_vddgfx_table_offset).ReadPrint("VddgfxLookupTable"); for (var i = 0; i < atom_vddgfx_table.ucNumEntries; i++) { - Reader(atom_vddgfx_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ReadPrint(); + Reader(atom_vddgfx_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i).ReadPrint(); } } @@ -1758,7 +1792,7 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; for (var i = 0; i < atom_sclk_entries.Length; i++) { - atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ReadPrint(); + atom_sclk_entries[i] = Reader(atom_sclk_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i).ReadPrint(); } atom_mclk_table_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usMclkDependencyTableOffset; @@ -1766,7 +1800,7 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; for (var i = 0; i < atom_mclk_entries.Length; i++) { - atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ReadPrint(); + atom_mclk_entries[i] = Reader(atom_mclk_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i).ReadPrint(); } } @@ -1776,7 +1810,7 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) var atom_mm_dependency_table = Reader(atom_mm_dependency_table_offset).ReadPrint(); for (var i = 0; i < atom_mm_dependency_table.ucNumEntries; i++) { - Reader(atom_mm_dependency_table_offset + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_TABLE)) + Marshal.SizeOf(typeof(ATOM_MM_DEPENDENCY_RECORD)) * i).ReadPrint(); + Reader(atom_mm_dependency_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i).ReadPrint(); } } @@ -1785,7 +1819,7 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_powertune_offset = atom_data_table.PowerPlayInfo + atom_powerplay_table.usPowerTuneTableOffset; atom_powertune_table = Reader(atom_powertune_offset).ReadPrint(); - Debug.Assert(atom_powertune_table.ucRevId == 4, "Unknown version of ATOM_POWERTUNE_TABLE"); + //actually only atom_powertune_table.ucRevId == 4 is supported using(AutoClosingXml("AtomVideoOutTables")) { @@ -1811,7 +1845,7 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_vram_info_offset = atom_data_table.VRAM_Info; atom_vram_info = Reader(atom_vram_info_offset).ReadPrint(); atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; - var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO))); + var atom_vram_entry_reader = Reader(atom_vram_info_offset + Marshal.SizeOf()); for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) { atom_vram_entries[i] = atom_vram_entry_reader.ReadPrint(); @@ -1822,7 +1856,7 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; for (var i = 0; i < MAX_VRAM_ENTRIES; i++) { - atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ReadPrint(); + atom_vram_timing_entries[i] = Reader(atom_vram_timing_offset + Marshal.SizeOf() * i).ReadPrint(); // atom_vram_timing_entries have an undetermined length // attempt to determine the last entry in the array @@ -1909,7 +1943,7 @@ private void UpdateGui(string file_title) StringBuilder bios_bootup_builder = new StringBuilder(); Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset + 2; - while (ptr != -1) + while (ptr >= 0 && ptr < buffer.Length) { Char c = (Char)buffer[ptr]; if (c == '\0') @@ -2093,9 +2127,15 @@ private void UpdateGui(string file_title) tableGPU.Items.Clear(); for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) { + UInt16 usVdd = 0; + var usVddInd = atom_sclk_entries [i].ucVddInd; + if (atom_vddc_entries.Length > usVddInd) + { + usVdd = atom_vddc_entries[usVddInd].usVdd; + } tableGPU.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_sclk_entries [i].ulSclk / 100), - Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) + Convert.ToString (usVdd) } )); } @@ -2118,7 +2158,7 @@ private void UpdateGui(string file_title) if (atom_vram_entries[i].strMemPNString[0] != 0) { var mem_id_full = atom_vram_entries[i].FullName; - var mem_id = mem_id_full.Substring(0, 10); + var mem_id = mem_id_full.Substring(0, Math.Min(10, mem_id_full.Length)); string mem_vendor; if (rc.ContainsKey(mem_id)) { @@ -2132,8 +2172,11 @@ private void UpdateGui(string file_title) listVRAM.Items.Add(mem_id_full + "-" + mem_vendor); } } - listVRAM.SelectedIndex = 0; - atom_vram_index = listVRAM.SelectedIndex; + if (listVRAM.Items.Count > 0) + { + listVRAM.SelectedIndex = 0; + } + atom_vram_index = 0; tableVRAM_TIMING.Items.Clear(); for (var i = 0; i < atom_vram_timing_entries.Length; i++) @@ -2467,20 +2510,20 @@ private void SaveFileDialog_Click(object sender, EventArgs e) for (var i = 0; i < atom_mclk_table.ucNumEntries; i++) { - setBytesAtPosition(buffer, atom_mclk_table_offset + Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i, getBytes(atom_mclk_entries[i])); + setBytesAtPosition(buffer, atom_mclk_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i, getBytes(atom_mclk_entries[i])); } for (var i = 0; i < atom_sclk_table.ucNumEntries; i++) { - setBytesAtPosition(buffer, atom_sclk_table_offset + Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) + Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i, getBytes(atom_sclk_entries[i])); + setBytesAtPosition(buffer, atom_sclk_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i, getBytes(atom_sclk_entries[i])); } for (var i = 0; i < atom_vddc_table.ucNumEntries; i++) { - setBytesAtPosition(buffer, atom_vddc_table_offset + Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) + Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i, getBytes(atom_vddc_entries[i])); + setBytesAtPosition(buffer, atom_vddc_table_offset + Marshal.SizeOf() + Marshal.SizeOf() * i, getBytes(atom_vddc_entries[i])); } - var atom_vram_entry_offset = atom_vram_info_offset + Marshal.SizeOf(typeof(ATOM_VRAM_INFO)); + var atom_vram_entry_offset = atom_vram_info_offset + Marshal.SizeOf(); for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i++) { setBytesAtPosition(buffer, atom_vram_entry_offset, getBytes(atom_vram_entries[i])); @@ -2490,7 +2533,7 @@ private void SaveFileDialog_Click(object sender, EventArgs e) atom_vram_timing_offset = atom_vram_info_offset + atom_vram_info.usMemClkPatchTblOffset + 0x2E; for (var i = 0; i < atom_vram_timing_entries.Length; i++) { - setBytesAtPosition(buffer, atom_vram_timing_offset + Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i, getBytes(atom_vram_timing_entries[i])); + setBytesAtPosition(buffer, atom_vram_timing_offset + Marshal.SizeOf() * i, getBytes(atom_vram_timing_entries[i])); } BIOS_BootupMessage = txtBIOSBootupMessage.Text.Substring(0, BIOS_BootupMessage.Length); diff --git a/build.sh b/build.sh index e0b88f2..1631c24 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ #!/bin/bash mkdir -p bin/Debug #mono-mcs is required for building -mcs --mcs-debug 1 -debug -define:DEBUG -lib:/usr/lib/mono/4.0 -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:System.Xml.Linq.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs -out:bin/Debug/PolarisBiosEditor.exe +mcs -sdk:4.6 --mcs-debug 1 -debug -define:DEBUG -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:System.Xml.Linq.dll PolarisBiosEditor.cs PolarisBiosEditor.Designer.cs -out:bin/Debug/PolarisBiosEditor.exe diff --git a/run.sh b/run.sh index f67bfba..22800d3 100755 --- a/run.sh +++ b/run.sh @@ -6,4 +6,4 @@ SELF_DIR="`dirname "$SELF"`" # libmono-system-windows-forms4.0-cil # libmono-system-xml-linq4.0-cil -mono "$SELF_DIR/bin/Debug/PolarisBiosEditor.exe" "$@" +mono --debug "$SELF_DIR/bin/Debug/PolarisBiosEditor.exe" "$@" From 73549c87448075adeca19eef81e47644a01399ce Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Mon, 9 Aug 2021 14:02:19 +0300 Subject: [PATCH 38/39] v1.7xml-2021-08 --- README.md | 3 +++ bin/Debug/PolarisBiosEditor.exe | Bin 75264 -> 75776 bytes output-example.xml | 6 +++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 32c36d5..1a7f5aa 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ To save XML to file: [Example XML output (large, ~1k lines)](./output-example.xml) ### 📉Changelog📉 +v1.7xml-2021-08 + * Try partially parsing without crashing even unsupported VBIOSes + v1.7xml-2021-07 * Fix exceptions while runing linux-built binary on windows * Dump all parsed data as valid xml diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index ee8fc55acbbcde88492142318fae8e88e06db3cd..a8973d2fe2b5ac45babc58ada2c67142f463364a 100755 GIT binary patch delta 28512 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 + 85 = 0x55 = 0b1010101 @@ -1409,7 +1409,7 @@ - + @@ -1446,6 +1446,6 @@ 57898 = 0xE22A = 0b1110001000101010 105272 = 0x19B38 = 0b11001101100111000
- + From 03bdd5613bfa4b79b9f85b2aa2b7950e3e131ea4 Mon Sep 17 00:00:00 2001 From: Vasily Galkin Date: Thu, 16 Jun 2022 13:39:31 +0300 Subject: [PATCH 39/39] Don't fail on vbios without GOP --- PolarisBiosEditor.cs | 21 ++++++++++++--------- bin/Debug/PolarisBiosEditor.exe | Bin 75776 -> 75776 bytes 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/PolarisBiosEditor.cs b/PolarisBiosEditor.cs index 87a8d59..d204910 100644 --- a/PolarisBiosEditor.cs +++ b/PolarisBiosEditor.cs @@ -1911,15 +1911,18 @@ private void ParseVbiosAndClose(Stream fileStream, string filename) { PrintCmds(atom_code.cmds, section_end); //cmds are placed after tables in VBIOS, so they are print last } - using(AutoClosingXml("EfiGopPart")) - { - var efi_option_rom = Reader(section_end).ReadPrint(); - var efi_pcir = Reader(section_end + efi_option_rom.PCIRHeaderOffset).ReadPrint(); - var conmprresed_start = section_end + efi_option_rom.CompressableEfiImageHeaderOffset; - PrintCheckText(section_end + efi_option_rom.PCIRHeaderOffset + Marshal.SizeOf(efi_pcir), conmprresed_start); - var compressed_efi = Reader(conmprresed_start).ReadPrint(); - PrintCheckFF((int)(section_end + efi_option_rom.CompressableEfiImageHeaderOffset + Marshal.SizeOf(compressed_efi) + compressed_efi.CompressedLengthAfterHeader), - section_end + efi_option_rom.Bit16Length_in_512bytes * 512); + if (pcir_header.Indicator_last_is_0x80 != 0x80) + { + using(AutoClosingXml("EfiGopPart")) + { + var efi_option_rom = Reader(section_end).ReadPrint(); + var efi_pcir = Reader(section_end + efi_option_rom.PCIRHeaderOffset).ReadPrint(); + var conmprresed_start = section_end + efi_option_rom.CompressableEfiImageHeaderOffset; + PrintCheckText(section_end + efi_option_rom.PCIRHeaderOffset + Marshal.SizeOf(efi_pcir), conmprresed_start); + var compressed_efi = Reader(conmprresed_start).ReadPrint(); + PrintCheckFF((int)(section_end + efi_option_rom.CompressableEfiImageHeaderOffset + Marshal.SizeOf(compressed_efi) + compressed_efi.CompressedLengthAfterHeader), + section_end + efi_option_rom.Bit16Length_in_512bytes * 512); + } } } fileStream.Close(); diff --git a/bin/Debug/PolarisBiosEditor.exe b/bin/Debug/PolarisBiosEditor.exe index a8973d2fe2b5ac45babc58ada2c67142f463364a..6955f64f5735bbeb4ddbb311986154b99a389ac8 100755 GIT binary patch delta 1244 zcmY+^eMl5}9LMp`Z=bbh)1DBc*p;I{7O(S`HsOd@9#WPq;0YFtlbj zY3h#(ZA<;5Lc%|KfFQQojtHUzJAz{gTSB-Z3QmqF|1h!O;J&|^FH!?DyRUiwe!m%J zmW^i|@r&lmncE-*xA|Dw-1GSgSA zpGEds{lj`HNZ{Y{G4V6bZj~}HS^jzU3UpOka;rjFh3Gb^1l+2kti^R!p}Kqa26XJR z+D~euYa`lfr20^%mgH>00Bft-tZYU>t!xJB)vVZpO?sVV0!L_>Em+)O=`2Zwk9AYs zl@o$vzttX)DlpC(p^=psKWMd=>LukDR5VKs#{~RXpfXVC}thghLycgSr@eD%CCs9ZfP%+ zeTcJ$Nj134`kPdXbQk3Hje=z>v!V`<&1iV0v{G9gCRhtXW7MWu%R{BMdi-!)-i+Z1 zQL9HWOU`RR4NJ~zK!nvw^Y-I2>jX7=fF~fYZ+I?HJb)si)P|K~;sAG2;J8nJ;dNGCeHWZucLv8Sh^LIq7hVIoZ_9!x}yx=uw6wZ^N%|K-^ zD-L5mYjjn>ei#>7g~5RR2*xex@)F*5Oq+ZwhQnDAgR9$I#{6Bx;5F5atF&kg+IMaH zOv`b_(DY3^is(!$aUDhSo7REL+}u}#K5qv`Q_s7*)LB9ZC;!!I_cy+z`y-8Qi delta 1234 zcmYk+T}V`E7zgnGJEP-q@C;g0giA|$(Zvw0LS>eX#%7)~Giq#ZTKO@is$87u8ZrJB71sk(3nC2SeBpQoBYG5q(_LN-azDyyrYbFT60n`9B|U z&M?tbMl_W%bW;31e5zgy#f31$lXy%Rd6VS=@@RA&$i#z0o}<_6c;il(3l(>Ke95)= z?t*2BUkY+Xw$}}eQ(ZECu5kY1t)$y@RoPC*LARXl3Ht7z#G^uIlQCUEMhwrZX2eQF zs-;Z4t@<}-720cTWobe!MMJGr3|X40uEP*3U#rhqkMMRo`$}tbeT}+CsS&Kzin2E# z%Bt2n)JmX9W+qy+wAhGcMzdrL`)JHYWQJ`WCTUPur?oBF0lZ)(NgL#q{keb3@Yua4jpwUtcZapnFqpn|O!}wAkQ#Yfh->|t{Kc&{;Fo$dPv+B2) zWL4=G)Gc_&3hS5D26zYTzVG!Zbt{TkNA;WPHiTHe>37xb=wwZi8gYpAkko`<2O#&G ziSl!gu ziifO&l(pg+iT0byQ3`j!eb64de)Wvl0Wa%Bz~gK~G3#`|M=E2Tr@nR=tgAG%9Y3?~ z25K{Q;&;~LK$~kPlB~Bha~JMQ8MNLN^buz{Tom*;JMe+!qpSmp^_onjELh^`L@_HA zoDrQUvoxYK24AUNXyB}uD!b6f`iUyL5M_;0){R@13{x4Wup84BhjA`Ar|!mUyOdr` zzVkbHqw>j&pviwFa}Pq6Obo8+a`qs}%Jq+B_TXhqR+^~sr^R0U&zdgvIrn1VM?1^+ z`<(lbvSr8>o?gsad?coVX%WFIJG6cm5zJW{#BmxLLGhq9hO<&jGRt;FQ2kl99}S