From 1b369ef54cd8182654a6e81a59f5b1f5b99c06a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quentin=20=E2=80=9CStorm1er=E2=80=9D=20Decaunes?= Date: Sun, 29 Aug 2021 11:02:37 +0200 Subject: [PATCH] fix: Updated RyzenAdj to version 0.8.2. --- public/bin/RyzenAdjServiceTask.xml.template | 43 ++ public/bin/auto-start-ryzen-controller.bat | 1 - public/bin/demo.bat | 4 +- public/bin/inpoutx64.dll | Bin 0 -> 98304 bytes public/bin/installServiceTask.bat | 39 ++ public/bin/libryzenadj.dll | Bin 16896 -> 30720 bytes public/bin/libryzenadj.exp | Bin 3543 -> 0 bytes public/bin/libryzenadj.lib | Bin 6560 -> 0 bytes public/bin/pmtable-example.py | 59 +++ public/bin/readjust.py | 70 +++ public/bin/readjustService.ps1 | 450 ++++++++++++++++++++ public/bin/ryzenadj.exe | Bin 38400 -> 54272 bytes public/bin/ryzenadj.h | 60 --- public/bin/uninstallServiceTask.bat | 23 + 14 files changed, 686 insertions(+), 63 deletions(-) create mode 100644 public/bin/RyzenAdjServiceTask.xml.template delete mode 100644 public/bin/auto-start-ryzen-controller.bat create mode 100644 public/bin/inpoutx64.dll create mode 100644 public/bin/installServiceTask.bat delete mode 100644 public/bin/libryzenadj.exp delete mode 100644 public/bin/libryzenadj.lib create mode 100644 public/bin/pmtable-example.py create mode 100644 public/bin/readjust.py create mode 100644 public/bin/readjustService.ps1 delete mode 100644 public/bin/ryzenadj.h create mode 100644 public/bin/uninstallServiceTask.bat diff --git a/public/bin/RyzenAdjServiceTask.xml.template b/public/bin/RyzenAdjServiceTask.xml.template new file mode 100644 index 0000000..296dcd5 --- /dev/null +++ b/public/bin/RyzenAdjServiceTask.xml.template @@ -0,0 +1,43 @@ + + + + + true + + + + + InteractiveToken + HighestAvailable + + + + IgnoreNew + false + false + true + false + false + + false + false + + true + true + false + false + false + PT0S + 7 + + PT60M + 10 + + + + + powershell + -WindowStyle hidden -ExecutionPolicy Bypass -file "###SCRIPTPATH###" + + + diff --git a/public/bin/auto-start-ryzen-controller.bat b/public/bin/auto-start-ryzen-controller.bat deleted file mode 100644 index 80fccf5..0000000 --- a/public/bin/auto-start-ryzen-controller.bat +++ /dev/null @@ -1 +0,0 @@ -"%~dp0..\..\..\elevate.exe" "%~dp0..\..\..\..\Ryzen Controller.exe" diff --git a/public/bin/demo.bat b/public/bin/demo.bat index 12a3ecc..5bcf94c 100644 --- a/public/bin/demo.bat +++ b/public/bin/demo.bat @@ -1,2 +1,2 @@ -%~dp0\ryzenadj.exe --stapm-limit=40000 --fast-limit=45000 --slow-limit=45000 --tctl-temp=90 -pause \ No newline at end of file +%~dp0\ryzenadj.exe --stapm-limit=40000 --fast-limit=45000 --slow-limit=45000 --tctl-temp=90 +pause diff --git a/public/bin/inpoutx64.dll b/public/bin/inpoutx64.dll new file mode 100644 index 0000000000000000000000000000000000000000..82c343fe10de5d96cdc86082ca99db9b0be2aebc GIT binary patch literal 98304 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 LV>9qSnt`7HBkO?C literal 0 HcmV?d00001 diff --git a/public/bin/installServiceTask.bat b/public/bin/installServiceTask.bat new file mode 100644 index 0000000..02df30e --- /dev/null +++ b/public/bin/installServiceTask.bat @@ -0,0 +1,39 @@ +@echo off +NET FILE 1>NUL 2>NUL +if %errorlevel% NEQ 0 ( + echo Installation need be run as Administrator to install a Task + pause + exit /B 0 +) + +cd /D "%~dp0" +choice /C YN /M "Do you want to install Service based on directory %~dp0? It can not be changed after installation." +if %ERRORLEVEL% NEQ 1 exit /B 1 + +for %%f in (RyzenAdjServiceTask.xml.template readjustService.ps1 libryzenadj.dll WinRing0x64.dll WinRing0x64.sys inpoutx64.dll) do ( + if not exist %%f echo %%f is missing && goto failed +) + +echo Please configure RyzenAdjService by adding your prefered values in the top section of the powershell script. +timeout /t 2 > NUL +notepad "%~dp0\readjustService.ps1" + +powershell -Command "(gc '%~dp0RyzenAdjServiceTask.xml.template') -replace '###SCRIPTPATH###', '%~dp0readjustService.ps1' | Out-File -encoding ASCII '%~dp0RyzenAdjServiceTask.xml'" + +SCHTASKS /Create /TN "AMD\RyzenAdj" /XML "%~dp0RyzenAdjServiceTask.xml" /F || goto failed + +SCHTASKS /run /TN "AMD\RyzenAdj" || goto failed + +timeout /t 2 > NUL + +SCHTASKS /query /TN "AMD\RyzenAdj" || goto failed + +echo. +echo Installation successfull +pause +exit /B 0 + +:FAILED +echo Installation failed +pause +exit /B 1 diff --git a/public/bin/libryzenadj.dll b/public/bin/libryzenadj.dll index f8fa949815028055f16b39783207571c45f8b0cc..e2d76b2685174464f8bde142bde6cd3330433a30 100644 GIT binary patch literal 30720 zcmeHw3w#tsws++*Aw1$l%s>#(1``cRATUvRMP^Kb9T*_;5U!%hkW64CnHgt#NMLn0 zIAkTXQFd2XysLXr_rdzRtqV%>AG0$Ml3i2KN5G z-}ilY!|!yRI(6#QsZ*z_t4{Ycv#;O4QW#^YfM}GlR;2Xj;Mdb%GLslP=fZ90u&4X) z9o3rT+B<5&a&Jfo1pUi`?mD5$?eqC1VW~$5hJAw9CzQ;cFVy*~J>xPm2IOd>f5{%- z{g%7qejQ#PR(}6$$fwx0Z#=-$mp1-|r#m;Q^tO!$k$+`?TK?T{Tkog*Tkh@mcOhlA zmo~o5)191;**dg*J5T3%tCmw+r|MaGDPz??PGdtZd8kt7Il@K@1C!4g!Cau^snpbK zk!Etd5oS>FWX94sDVDM}5MbQ@7?Z@3StVH2N_ui~UZrfPW2~_s@GxVWNG2{%Q$rgV z6KJsXzb%ZBEd$FK8==#BNjIQ;5?53!tb{0YzDJ#LlBYoet#uYIq%!s0+%B>LW0m8A z)o#hn*rD@5s05G_|`e8_Fdm@p4ZlOAu@!wP-#s%2120 zP>U{9iyXY@%Q;-cRGt}$tER)W(3K@&1%(l`K>#-CU`~ z(hhg$Mk5oG{gq`?!L-Z+=B zPXH$X8ORHO=_arPCpVbbX1E^r3bEOhlP)$d$jNjym*ix-kQL@%w+Ln^5ar`yiv(ezo8lTOVGPWb>d(Cd6W8Fj2BatEr(OL7XRZbjEV zP-ArogX2Fm+e8$bA&+#;Y~G<;z=sZr%>_+SX>cT(6uz-_-GC=jTFQ^L zh#R}DtsDD4k+QAY@1@3Q(nNWn;#3KQ zrU8u{yGFVMe(>mAjNQH8!)fG~qqbBuib3REkfoeSydNF%{B&n4nVBjd2XBq_!nMev z&(z*P;0;ywB+pD2@$$k##!R*L@6U-<ROTQ;TGX}#_hC_$?>U3^-+?#t_Lp>QcnbA;gGAduqG?GMa784RfdI>x(+tpH%BeayKP?12FJh~Jp z6TZb90jaqd+%7B?_C3mNmviTG7;7xXw}`PTS^Z3@wkVZd!0Jax`T0peq>IUgM!|)o z5#%|eN%MRQl?;j~7O7v+*H~Y|%S72p?j_v>rp5QKFPyi^Q1S28J!QH$b)3q1xpdWe{{xF38Lu&wDsVF;uK!Z1+?W0v&r1Jqsa68|zlTjZ*PnM-(_i12 zsiS_n`Nlq0{e2qt?upL#TCGV(Wygk#P_H*I``hW-Z~U9u{tIW&{$Z?U+~2D^HavoQ zy@9!X%`epP{)1jQ-MB%;mEWzG4>HOPf4D{poZg@3QRS2Up;-6KDR4B0Lv!YHq|vG~ z4~H{%TM`)Sudwsx9d9snqkbl?-;*SuFa5-`)^EP1Ut=RVuQ3F1_8qVHA=6;c^|#(} zH|k0CMYJH)i_&741S`WBn(OD#nsE)xXZd>>WNRX=YsX>M((J9oT`We;)~L&gS~P&9 z3@l1Yx`0`mzC#m6?IXxg?T_MWzok)YarRbiVZ9?ln)%i7x{ef@PL~|ITnN>yO}{qF zr72HxH>I1kx?Q8LHBqGi@l~5Ce9>ECrnrblA&TlGc4~G6UHIKNUw5w@;v3OF)}}O= zC^;sIItd;X!9zvtq@ugEB1e`nK5^sc*UC-fduHP|jszGZppV~@xDn9DuR6i;I}}%2 zAHU`Q^!PoHZq`*FzeW>P9luI5g^%B2Glh@eM?^_r{IX3$qK==}(v}ielv_%ccjB>2cE+tBUimJ+$6YOJyy# zz3*WUaOdssj6#l%nme%{NP%l_8;DD{Wm^pr+L-b^gcAJ<+%D`GW);vpS$hwaw%GDY z87ul8cz6iTBbQ9wo}HpJS(u;}vaq zN1=8hbXOLEhYn5JCa7U7x)s@hO%S?1XS zx~L5kFx@(?bG0)(ed_>Jh}s^#iZd%yz}S5*n%Y&2rVby0I_Nr`wrr+0Q%!9aPcl^b z>@r;y>xFE(fHOB>js`kzEY3h^G8)c;yx}k3+z3h9{;-F?v}PpiFAu)U{UtpI!us}? zS7Fy){N>oyW`8;1gjxQKVd>3Z{*ww@sjwG+IYNcMFbd=SrJD+WXcWf$8n!niL74W%J`^#zs&cLh;03-L8 z`$^Fk5Dn_hU)~s_w<#Cn1gLrL9}TL1G-Cum)Ii7e^}W9D{SU0s=l){xS?@2tLhtzg zC(d2ZWdB0~`r7|2Icxpq>-v?Lr_&keH#iafvd>z-ryQF7gtOEyNCNt@--xr;?>t?< zoU_#LH7vG$>X&!c`h`e5R&7VYS?V`25&g!VwSKST_QCZlJWKt4N&@;CU*W9vv+Meu zbUwwRhj>As>&utm>r=m+v)1otB%a21>{;4xULyJxp0$2oVY%n}O*%{co+JT%jqjwh z)^EP9-?TXW96ZdeSVke#dMt7*8cxTJFoIZl$5xTymV|J4LDaVL3c8maXl}?uL>u8H z+At-5!tbQ%wDTHA3)CM7bj0>k|7!sl_5GB5Pzhn1h{riiLz2k~agjD-)7=HtuwP#M2H!+&$w#j5 zP1JhmYTiWAHU~nULWk5%cMiJu%p`Pg1L8k?>tgH&eve^Nce3ghoLCou#JV`f8r4~EC06T6toa73x>@%Sn*w9UH=bs&Ve3vUe@1+5#7A2( zL&?7idViFsJ_KFc$Wx6KG{ARJjc?2~9y4n6*qeQ5hbV1tb{~2HKe?&LUOq2;v9_20 z>qO41_`ql=bFCrTv=^La5TVnXS3;)~A3-Om6zfH{!Bey0X>9NbIyBI6eNRslDwCcs zWz)oSAkaH;9(2$g&wi91Vf|H{{BMr1RjGun@ws4*(&(%&S{po~~ zEIGGjqaVuq@AFfLz3FXh(`r-@yOJh+;y&%hWEhK8yH3%Z( z0Ucd9h65o^m7{qLTm63S;0MNo)9m2SV@buS@_7#uw4|OY<=2(pV%Ss%Ez=BMHzA&* z$>5+zURRP`ABF>Lt%jtiZF&#xMd0QK)G=iC78~)ab0r(Kn=!?eYSez7d`s@=qIi(n zybZ;-Q*kL3)BKP-x|gXZR4V%+m5ni#%~B7jRJNMRGE8OTRhJJE{Xaj5$r}phA}o-~ zAtIs;Y9!g@L&ru^=a=LxrbkMZG=D2P?j6S%!LKyXapQb991m`Ew-BqG81;jENY>MO z)ROVht7zt)H9N?WQ}#zc*oIRn9q{S(4a^L6D4;|9%B5sr*lF=WSDI%Pt~t(c?YBw3 zHOKk00Ee_lZdacM&wG74bx^^Rj+Wd(@COt72 z$e$Qkn`DhE9m;jl`HY0!g8)$1eaNgi&L4JNE0yx5@c>~WHGL6Xv_}besx_19bRweC zT|?Moge@WLPQvC9MxncIk+4hzWxB6|IR1PrpCnyC7c06W4ImCihq4ibl@RY>!d!%< z6P5?e$sO)J(zeBxhQ-CX=Ggbh@#Sm?^2!&7dM;3}!e=2l31}iKp7&(N<{AcLDLmtjpO3%@S>dUpRUyCbFzrK`9)8!D?Phy6+S~7;cj2A@YwQC;3 z!a6&p-5EV(Jmti0lMiYMjb;f(vjn4AK3tihY9op2U0`9n&#uGmkh?}7a%{@?e^qYB$JnZazXMBcAu4g^WWHIzm8sN)2Pg#;a&%+<3vC@ZNy#>nS~b{kfr9 zhY}g9nM$74tJC}XQeCK7J>B0QEISkZhU%gc(Qk&b?%hOuX*=E);G@`^e&2~_qF=o( zDiQtWD9SsD=r>vy+M9kin)EaL{R!^xmNA|5SoNO9jg#oH?!M>;CO0K7H@kW^-M^JZ zszRr5_xo*{p-v;`TrS6|btHVD52~E7d42r` z4{!NxEPj3c$RNk9uX}ZJ36v+eQv)5>*4OWxz4ZS{bw9PMUENQ8i->MQ`>BhSqkle~ z0Ve56nGDd|zD!VlugZxtz=?BuHNb}kInDrkbTal+rRV@biv~Jwb_mTLpE*u#kF9O0 zJqCd%A$#N~A0wiN-R>zIB2U+`4|`mo{8E(@XOBQ+1AFrPF=z2l5$2+)3C1j70$`G|5r?AIjUB^D` zF;sbF-^unkU#}f+j}(I(XOF`OE$Q~iMF$A#G|=&0?2&<|H>a}4LBt&C{CpUDiiGTO zzLKW);}rG~bshV#N0#zOL?L_n#{j){ygj}`bWWY-arSseC&NE3M+XRQ(?G|2vB!5) zPHm4}+f;jei#=*W_P9Vf`U>yIDeN&x*RcE_TUC1ux+Xz;T&R4!_jLBi({=2_9>bJhs&eA&@hPIf zy{z}I8{{~9yr7d|kA*lC5j?1Yj`w1ZcX1>=)qMFK0*N$VM&OK|kbeluU-q2N9@)B% zec0oC6R4APuakRK{ z3hg? z&piUc?Oj>cXZJhhPUo6K45zNh`___yZ7KV~kQzBLR4Ry^7$(s>6n~=z0%)LnE*?~s zhl`voj;H9}!rQsSXa|MoTGu`X(ZI5;YuBroAk`vYDb2xkxl{mw5(&Hz0)cNP{JfL2 zpI}IB#RSJwMy<7BF*=MLqbJ4an4~d!7iG8=xD5s&wtA(2n_~a<(YH<&1oI3q#s`AvY54ckHi&dSji}sgQb}Y1!4P7JAj@f-QyvF!FrZ_d@+KG&P86GUQw`bOTjkEce;p8tn#P(g8UH4(Kq6X>S z^qMp|@@bNkN0%Xy6L?M;(_dMMJ50Alxdw^#*)|w250Aa}QQ8GBVYBg$z`gA}n@vWC zKdQfB6`OC(5uDed0YQ|%bje@XcPSr3$XfhPxf2zYI*jD{1M5n19FFIbB1O;OHi6$^ z{BK-$T7HcTq~U#CFs*Hq<|;e;BXD2mW%wo86# z8&xQiUlHXLmz=R4!kp3lQOl|c+8C=3+v%Mi^@pyv=7_L`;Jm40D}>W8{u#XR}2>fifT6_22lTx zL)}R3k3nbXMhY6Rzvfu~sxlJT(F4QZj(nJ;c)^V~0UlPBm`+M;!28_zN#A0@)$GV_ zF2{=?V)}K9_y9TRhqos%L`|=St&?pJ;92R9`q|sM{*ESEuBN+feJPfu!lAGe%sc>Z z_7~9TbZ13v_2;6c0|-GC&=1g`1Qk}3--OAOO?a9cE4t5IlmYKki|Dt^S3u}QRI|TE z)xMx*v*{?jN_h!C#YMx<)8h^-Z|CSd_`N)u#ZRFvk!VWTVYE2T)S@&7HP@&$!~I(p zC(%mTou%_eZ7(9Wrs~k0W`CPX)t@OhU^E=gn<{Rim(^na%wJY3laI-7;fL9nBw>s4 z3m5@EE2m$T!$AxupjX(s?uP29&)0NJfP?m3QCkNEZ|IlRPXdYB-r?EKZT(Xj%`5&T zgndNgzjKcqp0pJP2j33R(EEN{$rtyIfzv-c9)9pU`u#bz-TOYTG}G<6>T)Two=WVsY%pw zj4o#!&j-EPl`81OBz#BV9i51ZnYbY-Q5wF;4tgumq5e?c0ZT+}!_Pr&`KenK)Ld>f+D?A_YNwQCZ#yDdpU5bLpzz-(s%!n0r0%b^`-HMgt=ms|66;X+Fl8?CST65T$*B|D zy89_D$ZSdC4N`kp^zjp2TJ-N#<>|711U|e`MwJFDK{eA)@dD{SY^tv;0!5jJi$;vi z$y(FPY(klQoE9<6%`T-4iyu~$A(3yA!sqfOLzMT5^3JGjH|$34v>5vbY_#}{t;M9l z+U=lmsOZ{`y4+4b;6kKK7`YH@GIglyMbMPps&tF;3}=O5wSGRX<-2|bM4k86XDy$@ z#!b7PrzvJF=~!oZ4|yes%wn7N*y}0oG0&a`#t+TIZtY)(1;P0Z*aD!NtG3Zfv zT8nKL@_0>e&1CvkQn;dZAQq0A$CR62?_m0^LLAdW@=0We4 z*+-nM`{=H{2xQ7eZ6m=f$`2}F6I<>*fI{38unOY4B(xEMoN4;%*K&xLa;De{h;P`m zC{#deAju>|pc~9Q5+FBqQXy8!a9@TIKhMrgfxe8{KTR8n}s9;?`b{ zrQ3mY0r@P}MaaYsfbK4khuxakQhEe0FcB_Nqn}}SL9IEWwzq)7{RYAG=`CW4@<)FE zejsNbj3utwK{mS)>yW+|62z8~&kd&9MO%>IRXCa6)TVD*&~F>XNJqLj^}S%1I#X$W zs^h?K#i%Q*b=UT&OTVZ*RozVE{nt!;n|+t{;S#yM)c$sf{IYY+5ufC#b*}m18jmkr zBEKddvF~!W6epDq?6f}YT=S*Z=P7GW%_$wY8~Ufp$6@qzoXZA<%f(1W^kUd5_sI09 zwWuvEiAi}ym1)UL8dVga?UO8Pa&J_ygJ0dF4ZQp<*iR)J$gCNT;yV@{e4`FuExC5?Cv^_LW?8pk(TSFit*@ zlyhj>p>Red<8_oenn&(JLZgaz`f2ekzy!^#p#2uV-2t(;O}4xMCfqiN%>SafqtnRB zS^S#Dug5Gz8O(9I4@GnFfi_$l`1NLfy^~+B<5!Vi>3*|k&z7VPv}1_ZT8W*XqK7n6 zTw*HET@5*og;@V#u20v`cF;O=V^;tx#2yn_P;LTc124o||2n_Q{HNnOGma3SigJ<+ z7sb4$F~AFIOYq}Yms}c<7h)eYyHa6bCrJgEN07v8*mtd&1T(Z*?`fCYLB}xsxBT6; zN)@wNOJC5^16o>Mua@7Wr2#E%)Y79G-+CIZ&sHLm5djGEF_h{*} zTB>($yVlO5TDnO~f3Bq;XsOOWUq$F=+Vn@C(BtWKT1wLfe~tW#%ftp1yHrc3X{lcR zhL&&D(p$CkW-VQ!rR7?BSWADdrMjFsWD zH_z)^Rv?rHgHwcszEC(2@CPMNwNPH`mZTbguxWt>0bkspdSV z<*V_BePHWVPS|Hi>9su8j^OtRK95xI53W#~jOP#gR`~q&KEV?V`h%Ro>kIh9Qo|L6 z<4RmEC|K+d*H#;fhW9|7NE7qP+%}r?7t;X%Gh0!Iy069V(7eIyO#bv_P z;gEpuYLXS|gI>wwURvuJD^xA_RILy~o~m%rBP{j%B`#~Bk4j0-GLIxs?YT>D)|msI zV4XJ<^7?&7yYc*Ut|oRWjHk~opCHViy-+VaseGPM81&o{_JpJgiPWfolT^5U)fFM{ zYLDK9n1^93CHi1!jl0fUyGm8*)b+X9SuQt4IOeBXPe8AChlHT#W=|Eo*XUmlx{xm{ z4TsPc=&H$M^|c|W_e#qJ-I0QxP{8jCd4$}CzVs8Sy{cmcJyJO66WqR4=$&s_Z}r^O z)xoo|2h~&U5N{_gFR}K6ZeOSd!@>usZyk(w;_I1hElBm=DvxHz-uZj_lj`4syQ<0) z3h|mjPYrCnTvN+DG;KI(V;d5dmV11Xx5_!Ygz|GR8GzEqW=V!WI98|&hxpfKS9q(d z4ZF{9*X1@WpMn96`5k?OwpPgHPGVm1R6m@8v0kqAhOxQ6+Ev25RjV;~XZx38jtcWV zL9ZtyxH0Ptkp?^4)Tpl4jx}mZkplA{>8^iU79j?fO;Hyw;NJlFo21>K)ZBmHHCxlG zr^F3zRnJXY+OwSRGfyJ^pC@e8^xLeZTeP&{$EyDSlt!719hu1(|K@E@9beCnT+bLq zUv*keK>@q?2F8AB&~W3fRKKA+&P(5{&A}rsa>|@so)Aa7p3BQK(-x?F1#vW$ZxU#WshtM(d%ybk zj>mb_Jbm~0PSRDi?L?sL0nqTKv`(`VZ3}4h9b=6T57n?+#~y1FPB0pchLP|1%8}^b zAuewOA9nWRmWD!9tbbQo|Nbzio#v7>Je3WfH#9J$(pHd!&&Q=+jUyS3foT(y3z87R zA5fUa224x~Bw5p#wYnd(B5$2IFre`SMp=@X1+>ab5r+o^V2@D@2I)ad8jwtK3WnJr zJD6OMHydjN^cr>n$sGi_1DQ2AFksNngD$tj2X(&k6jolC9#314!WQ(TU7NzL?Mb6H zf2y|WK$}U)_=YutM)U`hvvY0f%qI0`HuTR1y=@cEJ@f#)0KH(fa~OLYKy!xvu9}Oz z6+q8xb|^oW+bW$6n3ooyx`=A92>2cb6lrxEfNuj_r{z0INdKObp=%V)xZf_>#%lUb?WrPU2Ryi0D&P$0fC`N0p;14 zzyWBx5PSfJer5uM9MAxjIG?kN(N}=u z67T>T^H4qpE%FEDRKFTml8!;;d%)&OnzRRK46_9r&<|zRjw|p}61Z<%0kt0aF08 z02P2$fOUYM1AYT|2G9X`9q=*WIDkAQnWbRYgC?^nY$}_^ir7_bI&&~5tMx7o(oV@;ee<~L+FDjs>v8+SfeM|- za3ra42f`Jh6<%M3?Mz8hP_hcnfjBBaaAFA-y(1C;3s;a78 zQ9(O>6A!0_JW{~#^{H)EK^Jw?$17DYJB4mN3S!OHxN+2p^?_$&rGb#QpaRFUAU3YN z0V0I_RdKXXeBXFh^46)H=ed}`kmL^3nc7qHF>YQQV^_~$boSz{YezD&Y{*Q|OeR%H zwR}+2GCgN9;L2cKoa&~0JXf8&p(mq>6wlk!9uR6Goy2RB!}V0zO;oLh*XNaDj>mJn z|19pH!Qc+PdZa;*jSi7|ID$IzRA6!h%91`cG0 z$tQG@$+1i%Gb3wUNo%S4NBhWqmFgZ-r>z5x_Wk81zQdqx0xg@$w7;V`9xQjGu8D8R zDinfNVB)(1v_{bOnfMliCVex5islu^e%=S}fhTUsqIwr0NQ3Rlrl>_0{+>RYOwHzX~^s5OxMvkp#>U z?4OJ0Eu6EUY@Ot9+?6ZTbM2f?Lz{S{UIx;o7Dl{JAN?w2*# zF<>$C;N-#T+_n7wR2j+;>*Uy73@!Rd;VT$)@JbRQjo2j^c!dXhgo==7c}0!47KIgL zt89iwd^O%>h+tOu+=$uMSGa@AFca)*O|QEaH!r=&<6G$s`h9hDH^n}L%hovjK2HPI zdv%4!KBmIcfVimSsfa5Wg7%0HlQ7`TuM6eZdwu!neLl?R_2<`4$e)m}8m342a*sP; zEBO2gR$g$F?l=scukR+EC>Q5c>>nUYsc{^F7ijiv{w_Vs&Ri?n$os zOUnWZ5BuDbM<=m6Q_4bG#vh#Fag(m)aAX>Sd8yZiJ;7Dwv3nL`-RMS;jXGI+SvAWw zQ5P%^dfe3@vag6be^m&(!38joGlUL!2xGZPCEgH4kyU1G$`r%nLd>611}9Sof4&QD zE}|rQv1EJV9N{-qz56(P9=zilH3ad!z7L4SrRqzd;q=sGdiOFBvdi;A}V? zscFypTIs)%|3@q!Wa6v|C_((mfz$_Z0pEo5!E-en>8*oRo()L<2B7%e5u`)TQ+WiW z^8gD#44e>N~BGQQxHxui^G6TRCg%O;@OOC22OE@e~eObJ@!C!b8L)aWNm;3 z&?&w4GMwFkQ(B?n6o=?U9D?dnJmScB#7uxw`p!hHEu{5!vg=(9udSmNDjq5 zE<)UcaEgI+XgI|}st^m|Z6QrTOoVVfHbU|#Mv{dX3E>ng$#JN70n$RJic{?54FL6v zVkjRWhC=)lOZi8!ic?G_6)_bq6KNJ=D_kbh9K=`%r&voNVl9MI%%ub|7s4s_vH-Cc z!YKw*Jxj#{NC(Wue*uSfDgIarAiolkJ^~mEdK=RB0h54#gtQPbLgJxxCSrKgKzAYC z2WSLNY0|am4{-WF_nd%A@RuNM0FbXzI&&V%>yStKB47~kHl(%lu`dTs>D>To>uIE~ zYWO~+{THb8K}a1MPU%7oUyQU-!zsO2!#5&525><>rFjcgIh0P*a7vp1q~|)M=Uu1b zSx6rPQgi}hfP{JwQ1o##>rLBMxlKHQ{{}C2Q<-JV8o*eT9E~Ix_r_;T^ zpcgt`FlSgA*y2r$U7v(GtyW;uC|Xdr6c0}u>S}$VqS1IHJ|%>A7V6xg{5o${&>!;G zNclKqOmT`Sa_d(KYVckZ1H&)5aUJ<0~8TO&lk+K5cxQuG7XFoksO(<8^ypRqiZzmXwsu zxn}WV4f$vC6wAoL_-%M-<3pPs+WgR#hsuAu__xY$+2-`kn>TOS+`74KGm8K9_y4H{ F{tN8I4kQ2o literal 16896 zcmeHu3v^T0mG+Ts8To}ou!za?LgeBk;0VN|yj-N%Cf7s;0VZ|GLl&}()yR?}U4cnc z0u`P?+^TiEk~Wj+%p{>*?VmrLNzzPeXxiF14Uj-%NTy?w>C~C@Z?9vTacG7BNvr?c z=iX~ewu@P_W@i15UaxcavwX%_0a7NzSPvjQPX501%VJ<`=JkhW zvKNX@%k$0Da5y3fTLVHY5f*}Bp>F*qp(D~7s4gojwrQ%* z%}p+RzVo*a>*2;a@7|~9jk5VdN#4w> z*nDs(;VD>vmxZId5e5~{W2}&~#vywG3<@rueAWU{wU7=b(<-N>fw42t=XNu$g6(E( zhzvy;+e;0mKi!N`ES}_I4+W?N33X%3kg^^pW4+Z;Rgl*ab>%i! zWC;OkNJV~nCu2Z`aXk{^*Fg)AQXWh#fTwRTn-u856IiH>HnW_F>T!7VXXhS z_8ewRM>!n+01cYOf&AQTc`Um+jvB?jEZQj5s$zm5}_`Pel2&TvR6?e!fS!iJU5V z{w0VDcMs12rF(PyxR|=fW+L-~OCE#=dYNND3Jpf51M#g?t_S19u-p+T^VUkGGj1z-Go~9>??jQKOH@v79Sfa`*ExB zx%{5TiojX-vX~0lJoS!VcdFIaEdSgMvc;Wx$R@Z_>rA5jnk%)v)RkIeQC1;3E;($0 zto)D2P;Tbo>P>GhAnID3qC$#Ur%H)3fJ$$sl0^OP4@8w~)c*qIlJ7LRdZ;ld{|#`= z*E9L&M0_2De7>t!8dZ({IWNpDex9S;T$H2SR)C`xD!YZF<%F&W>XuO}w@meuQCAU| z2LVcyHOQ|}&vD&HE!-ggEMv7)>)lCZ^7vExQQxreMwBl$$fNQG*gP%DMW~E&HEh($ zh4LmCFHy=s0j-nQ6eJJB-xB5H-|HMx@-W;kQHIAjrOCt4RHFRT7{`)4%=P?qj8mRG zjJlL4-{%}t9re%><=ddl*VmyBZQ>dNluH5oH_eeIFjAUV@Ii;pRxx=K4a^$s)^&1QMSQ9YPWS1>l9cUqkc2YAqMcMd2??4#`I&z(D8G0CiK(8u# z*%f0MLUTTOK9jIg_jAKj$8qI)Oc?Ok>FuXs={ZEGWe@$ATjF zkGz>X{TxTMMMS%1Erhgaqe;4YJDZc|4ZCJ0&*vr9VYU_0p4lTsgdDn>``%#THBno} zMvbx%X{quI>Wh+z@~mdrhsHv)i2Xg7G2p+}S`X;#Y?m~DzK88hu0Lk-=Nj_In5*U{ zU5zM@IYo|=PvefIJ!=(<=G#xQd^=OB`KCFc*7{e+ ze^0#p`s*5|vA<5SOkw{_$<+0~eEU!98m6%?D&6R{lj^URo>2eWFTeh}hH31(70VR% z&lFEx|I4@kw60+q`*$ea7pADcUV1|P*Ia)6bq&+lzg@9RVgF3g)b+o7`%mi{rm??X z={`S2{q@ol>W^d9<&J+{!!-6A6w4I$&tQYa=cZiyi!R^()4GOf>^CaiA5Bqzy>zbq z?_ufBt^cI?_!@0KrjtsR>D*~gxkj^@Js+Q+q18EeB7H|^Yp!sh&4<@c@6UCbKb4pC z=S%0*7-aj?t{cwvXM@h3!k={QwDBp|{Gn6sACJ!`|32BDL7X|KSg-nY_7wj79tXl{ z+RLi>bL}Pl2~FXTs2k3W&tjcDg+CqB`*Vfn&sCT7=bt~E9G@QJl<|2|XHVhJFI>~c zXO8C2b(i$VJ%vA2y5ZdT%+lFY_|rJOKUZE>d|vw94tOT^8t3D*;5~POW*%Y@6T15Kl3l?&o|Fbj!&mpQ|;0Zn&gB4}CB>KFzw}-1xY3cD6tKz5+Xb zL1@=nVp%CGHtm*HHNe8*fen18Zwq#$|mO34PTi%ILkNm{pzX-$4SOX^I1Tp_Jbe%vB` z3Kuu&vJe&e=(iJHsT?Z=89T|mK{ALK=6<)0yKBgn`4AOU{+?vO9hdn95xh#!(@Qck zWYqHlSMt)BK&G-AQ+cNHasK`ifBy}C6CdNKs!?_=6XjPMomXEp4u>!YzQkw0Oou)>=r{JSOcm7Gyf7E@$$p(M_TDcrY%UX*p;?!De zI#*}NH%lev7Xgz)qwf5pZU@X9yL%XxCtNV`&eGOqzJ4#V;MdBs4XYSCo47*k>$9|d z)R)PeP2`>J7yFJ`hQEOk2zm0o>y)%S`JO?lqSu_{MT1m4?!U4fOV5Z=xgEg#VlM(# zg&URug2QNP*4Wi+ezcF16%_QbI~I{&LDBV=Aj)Um@&}G%%CDhhZ?AdpQ4~}s83{wr$!4=Ddle-Fm&n1uTXG7B_bAr>%RVj zP{Nd#@$RNLQ(Wl2!|vRFK{gstzN`1)GPST1MeN@G%+Zul!F{%}3DxA05t21wC!9`v zTG@u0DaBO(3vf4Cc_;V`)yRhd$0_Ij*OhC5og2LR?c}=#B?xKU06e8Sv6`IdJ}%0* zVrdrKDQ88>V-ZuLNxOe^(nZ)sG*Q>7gn7BO6+S#X1J@((!$kTvI>+s($Fx&GeH~#g zK7y%&T4$s@V_l6q0^GHLgO0HGd2kUm`Jd=U;|aR)7|Z%bc2*gBpPEJYceg_65)^Zs zqGBJ=+}Cvuy-IlnS8y;aQ&VF4nyJfVtVgkx!TqQ)naNK$$1GN7S(I)>$qj1BL{Ylg zKr`V;xh|Wrc0q;e!$_gyZOWDVsVO_r8cw=3q_I2RpZT3(gM40oOO!vrAW0aNzd{gj z%}lq<=pbXAfM5T91+JsKddH0WGsm%v^|cD>Xt>Hb1SDg9nUhBk6%{ZVSHj)6AnqX^ zzxPg_S$6PB#7wyzJs*{yage&=i5t=9%|SH@jVEj z_O--L8DChYN;-k}Am@nj%ixgJBgTEes40&azoub5=w3{`zn2ErekysSz(AJA`EuFC zPlKOw7YI7jAj)OG(3vRs4q~g|N5c&2wM?A@`Nh2xk;qu{D^Ohi{&{G1;J&_BOgGUb z7Ori-iW*Z(FBg-owqF{4CO(M|t7HX&o(iei}~$xPlu&r#!P z_xwC_vnZcY=OAMpIrzgRPyKSyU)~ICWq(2vlYt6YX{^XtcadqizCujZTQXJ;D7jZ$ zO!z7lPd5rGZ6mr~KrxHhHzbG-;EsBW=;#v<(ybT$Rw~{A!ZB`2G}rYZ{C&5Qk$W&n zd^7;^X(G|`_x95~Or6RiCTsp`E&`J%%vj%@le3Z_t_`bDAXB*&8R(novgM$M-=o7p z+E@de>rrZdO@TMr6hK1qU;`@=*-#EZ7y+Ia5aohO{4N4_MAL{-TzOQ&Ic-!lKUY=& zMTz&9sB`_ZhLMl7bwb&umYtzIk9lZhuCg99rptXQyI@K0$P8rtHq2p?twI}^7ibd0*c?`R zG5KLenUnn3keJ1%3{gHI%11KRuOV*Kotm*vz($IX*bqhy=58mogLn8vl;v^yJXa!F z5aa?()>NV4=fG1AtJ;mq|KOqstX9u&YxM9pfvDr&{G#zE7=vBMen?}?T-U$P`1hcd z7^XiZ0WmECr_l&#$*Qim z6ST#;j}#Z7EUHdkw-J3om8nLQ9c|`_@hqEqyjmA;9dmbM-PE#|+vXF2^=p78dR zVCHCB?y5*MxouWg~lhqeleX^D1)Xz(n*Lw>&xAwK<+w9 znV2L!VycVGkRzPw>UoT;@-?DsANlzYwAN}Ru!gr_W%pRodjXrM%Vw8_AKWcsi0jaZzWR!mWBx_F0S3uGGN)dTeTFh5|!k6!F+6E9SanH*XvU|~?$M!;k zn7%ebYeBlE9bn`N?6N2TnEDi|O0wT1uKZ{n6bi1B_nLfY$6W$i%ChkjFTPJUHoYy#tlm`YjdTDO{a zb$llzu8GH?-Y_8c{i`6B4A4*R0&OjX`TZ;U6Q7lh*FidY)O5sH2823z%2)!-b*^8K zmL-o0M~olhS8FscGR^|)fz&|V4TE(n2NO8?K$C4~)li}=S@s5UovCY&0Z^+}(FR!J zKbc#+G}rNi2M|Z^a^p)7!m>eZ{$wi8nkmY^;_vtQJ8B`$R{n0{?>7E+^7j({w(<8I z{%%33XAS+(ud5wDFJ*>wOW80hzj7mVI5*R5EXwcgZ*AQio+uk+bV&?kin$wSUffx@<@%_+8T+2b7JiRUn(P=jFu_YWj_p~7 zSofMA>681wN7(;Mo-G?xwM#rIbZf9hgAZx&aSi^R1`liSUo?1LgEKXKQ4Lj16k#hbHLhUav}YYVaNnuF&92 z4KfXWsFfFVzGmRZ8vmII`rn&CTP$oh`L4rJyGAe0g}UGWQTW+lcw;cU%`Vi(Vk-oD zXJx39tJ)m)Z4CtkDI#nONP?%fL0G@_bNFQ`m%r{djm_5KOFf^kap!}9umJ9+#?1?b z+Zyn}UIQk~Sewru5bg}97PtXdLTV3$rJ&!{SVsn_JW%@h&mV}#Be8`-M1@>h{%~YRSgYxn)oP&;A0~#f3~ByFTeSA_ zsgQR5*$;{7-wM*DkQ0k-HzLw~ld2%+n>&^DpYpEI{Ff}vjPY*}Z5?6qZph9U*1j>G&2DFN7UR3aF&?_5Q~jo~I!NCT+Wrh# z4Dn!9BxASx+qPli08MjAb?rtR5o$p(wl9~5T`$@%hu6U69?Ru%xhHaX9xnIYTppKu zHiy^5<$7{?T&@?q0rVmLyGrUy)TdP1_TYmLwr)i=*uWaC9x=&pYjAOWgE_n{T;EVO zuSu0ta(JrTD0oq_)2V)csegZ39Z+fd4)sg0tHpK+#b^+`igBKUc%$Go8^+|85>Le3 zxE4DKtt>So{|1znhOzHLTR;?o-Wrbs8~e^x{~na>RzDl%-+kKbXnD}!(Il(!xKG5t z)ML21fL*=u%IKUHtKCpwU~)^G0QsfNxDK=*5s@(7_~cT8mS-p037-vl21fNm7}+eViCLv0W`*BY_-$P>Yp5G}=oTzw zW9)4t8guk~rV>}CNII>>&@+q2(8P*27DlOT0c4YqdkSfhR<;xPA*3}L-4Fa{S@}f2 zo|Rv8RUx}-shM3Bn=@1%o!vru$zS8AF!v&DfgXa~hmCn2Ly>_MZ3T@V%1kk}1q~F} zrA4f4Nuj5R+I>F8xTfdog^Yb0sT+C-@|bu4%T27j6{%?kD@Q!amsp|(s}Zp|#H@xM zR!B0uozccijm&&SNtFDeM~8&ddO`3@YgPVLz$xu(z<5Dw2A`pAok$)e>JI}rp|#Ax zyoc0+1N{(E3kKT|Qp;RGq!uU{LTbVF>?qRiYp~zI{p}M-cKqzxi{!y?9z#e`0XF6_ z_D$IO9@3AHjw8K=G>r5ylKBpNLylxeT7|R@X)96$DT(wIq$iMGK_$@{f!vbGce~Cv0_%jFnZWb{C;F%v+$|-Y*gFI=CCU4ac{8AyFC!&v_G2gw((s83x`@?E}Fg#HuIFnR@H?9)I zB$eRlDx>kB-Rn=pV%T4C8^l0?99}#W*^yN!}6 zF1$U~k)s(j#VOkXuqN79S=oXZKaJGx>O*t>6HfHIEZ*bb?FLT()St((zqY&3SF_{} zfj0oTWm$4>fhR(4FiY+e@D#|=nxj8^Hvn_$)MWUl^Nt#m|LpUQeh%rpbtxaaCg%0l zdgIZ6KiC%Zd)s~C)(}Q4s{}tTwR)wU(SSD?Zi{$Z192%9*@^BNm*`(OIszRStBl=Q zyK(cnriRA)#Y^p6B^>v9eg2r_4Mw(l+Y(_v<`=Fl81ece9UT#jp|)r&7?#>FpJ0p! z7-p3YUx@z)$d?)Hg#GCCw=!4`N;ubauuqTU-T+(8yzxN0w=Eb#rkCcR3I^5Tw&1oz zEZ`0MVlfOmUu@fU+__T=&i%(hEO z;J>tJipUmuqhO;Hs`W)B)V?-?lOX;l=q=*8Ba!uptqM?eyRT8;N!J!hX~OwM0j}ZnE}A;7{}*uUfKVFA1isT6qj z8Hdh3PhWwv1^5JyBZ_9$Pj!9>AS!Q z_968Er~Pmf?T1MZ;Ast~{W1OE#rc4zHJtX#chP>C_z>V-w0|Z(;Ast~{q$Y5 zpC&%wX$`0S^1)Tn`)rCZDR|nXMM16o@Llu0bvVcEA`e)$1 zfT0_)4+Bo{D@bJP1;E!ed;qZMCY4_b=+tn6n>D-{aJPmNd{o0913Zs(O@j)nZdUaW zT&3XzyO7AweSotUs(3lzGe{r8H-ZBipWp=zFI|M4Mm5?8`kMhCL85+6a6rQeK46F6 zkQoI$i{t@rS*)Ian}O3gn9jE%Y!RfhE#U;|d`dV$I%6IOPVl=(Vlh~?y0arB;IJ0Q!e6ssakYJc5D5DtbR%4|U~|)& zMavclIIo0TeIaawY8LDa#22joOj+?N+~x*4wuW{JP!NvSEJ(z{E8_n4K!-2Bs3Yi) zMdFb*X%Y5)D}3>e>g|gc2w32QZP-oXqI%pKR0+Z=DTd4F25dJqZS$wm=9tgRp=2DJ zv{+EusnOuz?3jR+K&vMf+>V{Vwm^I=GdsJU@9$7;cVK%UB!uW)v%nW`2yc(vABZgw z5zsFJjFVKhv}p45rw!PrSA zr9>Y>UTdbm(Nq9Gw5*dgO z?GJkDI7RK}+3_`kNE1w7^%t=J#<7W-DMtHfKOLZh)Ix{oFdd;*YNMlcjM}M#I;o4g zsfT*$IJwSRdH0%K$XFY3%XKO1+L^*uDIGv^3XWgzdA6U| zrgLTcg&JAURU*sG*w6ZI+PCv18N6N2H_VJauT%I2fb{Dt6ds7@ zMtGKlCprM-7du9S&;#Ozpa;bbLkGp(fFhAF?hN##xHq7O#2L^B#NCD-7RR~tpt!f7 zN5pX+^6W8s2g-L5qqES5#Jvk`6E_8YSls*2qvB?ukBIvadQ98}DBoj@K7zK3n}?nf z_bIeP+(qbVai2ju#jQdg756!`OWYOc8F6=@-QrB>W8%Jo_K15P8W;C9v{#%3eO%l( z(BtB+LJe`>Li@zI(1f_}peMwYphNk{&=GMzLhlh*fu_X$1RW4}9XcxRF7#e; zFGI(~{S3WN+$+#=alb(C7q<`k2Yy4SZ@tvSi`9_3cBOGv zY`N$abN=A)@~Of3xy5JbCOz3f*&U0fpD-_ZcG)xia%S7{%(X4Ywalm8-PvNsHE)%By@Z)G665CiOLOxxtLR;xHdl*9*E1JZU=yjt z*j^%@95>80r(j+vdVXarW%AE;3Y&4B6pvw|gNt&c0CgjP;;$8=9#Gy2w1U(J%u5w5 zO#O&(`UH`1HR(c(6Do*FRpApjw*nZhE}e+AgkoG}_|lwXG9HzuUK4pH&a@z+Uz#&6 zh}ACL8iM+zIrV}Q_|m*~oO;X}3LRgW^DhX53l6Vfdo>m+e7xNJcJV3o0@w@6$tW~b z2ze4t$U2vT$dhnRGOia!o`kcKX}Cb10O!oC@^Jm*5GQCg6u$ofgg8&@q40@Q*eRCitC;k#}t|gAIWCFhGqdua~wFl4=$Z zHR=XvKz5eO7SXRYGPG!*C1|)dk0ME$)W`_UY9vLMH8M(9H8MumH8M`GYh;4n)5s)! z+(;4zeW{TIeXo%u-POnl{jQM|{i%^rYQvHOVpZjTPmIw?jf|6_kqLTABa^h)NRkFU zr;!A0Y9vW7YGj0NY9vJ;)Cg`<_FX=5LjaB6-k>SM`)1G-;oTu|fwQIWqQq?I3LwW%@v5pp_0_QIXonP>>oC0t!Y#y*!NVz-w*CwO=UB zr5D5riT@%}CC=O`<;+ z{iWF1jQxFm&epXyul}6NE}Rek-iZOg0zfPaFj@r|+XjelDH*{MCH*Ln_-oWrCJ{rD zPAhqXCCXG;$xAFzrk^XhgeA(%nLs9X07xdYfh1l4kR;y*GX4yJB=stg#BHocNj_1M z!4hSn5Xkrv;!#pf631D-cH{b5!MS|p=J#vMHwxF+oT_`b`P){dUM&9vjzfS&>M#VjR>gB#Ua?WbzSUe0 zq;62_#g@lFOf{HRb>mltVXDA*Zmkki%xhQ%`EmoSWSyY%bmA;TLv4)`$v8W%54Ts zJ-E02uvGooS#MT;@n=ig7}~9OqJ@p2(KoVo_~tf-MnAlU`dt$?hDP7(9iEMaA<>7i zYp=$_km&P4sotIg`p;_7PrFwAXSLY2iv4Lf_7zr-Elj;u`p<`p?R|MP#NY&s!buo| zc;EOTob!EV#$dX8WU_8qkfNb$qM|L(D@6EqVGFDSz&7!Swre`0t1BUfN)JLEM9eLk zdJtlbO}NMGVVp-KYX)S;g|v!H9+j6(bIgo9Sy~l1>YP^0ifQgvt}XU2T?$n(~8E z>3o)zi7$#VabV~@hTU=I%GK)GsGDML{(`zQ-iehT55X>esR7K0n6>DeD_8Dr-kZG{ zXaHC64_?!(FAs@Jb8fll6=$=$0uvzojq;x|3}Kmv`5lEjugsYH0EUoHJ20@j%UdBFlRAkWdLGXPvfS4ee~u*rvp}u?o;F&QhanonFCr<3O#y+ z>b{;4jFcdcFh+i-5F8-%NX|ul6beq-{B(P#S*20>7YyNiA9ETq!efk$Uy3BD(4$BA zP4|8AA&zjEancP*_?CJkSNnJnvq>>CqPg&fb~rI}oG~6&%)}Vy!N<%A#&%dSGs-ys zmzW93+hdB$y0yz7?LTja?81|bkzdOtsnDZ$Mo9LKD^B+85bpPpX+qAX1n2V~E|N~@ z(WA?D&oLR?_v4z4J#~fu{_{-8Y$h$fuEXm;VnSv!rTEOl@4ZJCGMf{MjXx~kn=jXW n^*+PZn>2j= lines - 1: + sys.stdout.write('{:d} More entries ...'.format(pmtable_size - 1 - index)) + break + + if index % table_columns != table_columns - 1: sys.stdout.write('\n') + sys.stdout.flush() + time.sleep(1) diff --git a/public/bin/readjust.py b/public/bin/readjust.py new file mode 100644 index 0000000..856dcc6 --- /dev/null +++ b/public/bin/readjust.py @@ -0,0 +1,70 @@ +import os, sys, time +from ctypes import * +from shutil import copyfile + +lib_path = os.path.dirname(os.path.abspath(__file__)) +os.chdir(lib_path) + +if sys.platform == 'win32' or sys.platform == 'cygwin': + try: + os.add_dll_directory(lib_path) + except AttributeError: + pass #not needed for old python version + + winring0_driver_file_path = os.path.join(os.path.dirname(os.path.abspath(sys.executable)), 'WinRing0x64.sys') + if not os.path.isfile(winring0_driver_file_path): + copyfile(os.path.join(lib_path, 'WinRing0x64.sys'), winring0_driver_file_path) + + lib = cdll.LoadLibrary('libryzenadj') +else: + lib = cdll.LoadLibrary('libryzenadj.so') + +# define ctype mappings for types which can not be mapped automatically +lib.init_ryzenadj.restype = c_void_p +lib.refresh_table.argtypes = [c_void_p] +lib.get_fast_limit.restype = c_float +lib.get_fast_limit.argtypes = [c_void_p] + +ry = lib.init_ryzenadj() + +if not ry: + sys.exit("RyzenAdj could not get initialized") + +error_messages = { + -1: "{:s} is not supported on this family\n", + -3: "{:s} is not supported on this SMU\n", + -4: "{:s} is rejected by SMU\n" +} + +def adjust(field, value): + function_name = "set_" + field + adjust_func = lib.__getattr__(function_name) + adjust_func.argtypes = [c_void_p, c_ulong] + res = adjust_func(ry, value) + if res: + error = error_messages.get(res, "{:s} did fail with {:d}\n") + sys.stderr.write(error.format(function_name, res)); + +def enable(field): + function_name = "set_" + field + adjust_func = lib.__getattr__(function_name) + adjust_func.argtypes = [c_void_p] + res = adjust_func(ry) + if res: + error = error_messages.get(res, "{:s} did fail with {:d}\n") + sys.stderr.write(error.format(function_name, res)); + +print("Monitor if fast limit is not 35W") +while True: + lib.refresh_table(ry) + limit = round(lib.get_fast_limit(ry)) + if limit != 35: + print("reapply limits, because old limit was {:d}".format(limit)) + adjust("fast_limit", 35000) + adjust("slow_limit", 22000) + adjust("slow_time", 30) + adjust("tctl_temp", 97) + adjust("apu_skin_temp_limit", 50) + adjust("vrmmax_current", 100000) + enable("max_performance") + time.sleep(3) diff --git a/public/bin/readjustService.ps1 b/public/bin/readjustService.ps1 new file mode 100644 index 0000000..812cf47 --- /dev/null +++ b/public/bin/readjustService.ps1 @@ -0,0 +1,450 @@ +<# +.SYNOPSIS + Automates ryzenAdj calls based on custom conditions +.DESCRIPTION + This script is designed to provide maximum flexibility to the user. For that reason it does not use parameters. + Instead of parameters, you need to populate the functions in the configuration section with your custom adjustments and additional custom code. +.NOTES + SPDX-License-Identifier: LGPL + Falco Schaffrath +#> + +Param([Parameter(Mandatory=$false)][switch]$noGUI) +$Error.Clear() +################################################################################ +#### Configuration Start +################################################################################ +# WARNING: Use at your own risk! + +$pathToRyzenAdjDlls = Split-Path -Parent $PSCommandPath #script path is DLL path, needs to be absolut path if you define something else + +$showErrorPopupsDuringInit = $true +# debug mode prints adjust success messages too instead of errorss only +$debugMode = $false +# if monitorField is set, this script does only adjust values if something did revert your monitored value. Clear monitorField String to disable monitoring +# This needs to be an value which actually gets overwritten by your device firmware/software if no changes get detected, your settings will not reapplied +$monitorField = "fast_limit" +# Does reapply adjustments if power slider did change position, check $Script:acSlider or $Script:dcSlider to apply slider specific values +$monitorPowerSlider = $true +# HWiNFO needs to be restartet after this script did run the first time with this option +$updateHWINFOSensors = $false +# some Zen3 devices have a locked STAPM limit, this workarround resets the stapm timer to have unlimited stapm. Use max stapm_limit and stapm_time (usually 500) to triger as less resets as possible +$resetSTAPMUsage = $false + +function doAdjust_ACmode { + $Script:repeatWaitTimeSeconds = 1 #only use values below 5s if you are using $monitorField + adjust "fast_limit" 46000 + adjust "slow_limit" 25000 + #adjust "slow_time" 30 + #adjust "tctl_temp" 93 + #adjust "apu_skin_temp_limit" 50 + #adjust "vrmmax_current" 100000 + #replace any_other_field with additional adjustments. Name is equal to RyzenAdj options but it uses _ instead of - + #adjust "any_other_field" 1234 + + #custom code, for example set fan controll back to auto + #values (WriteRegister: 47, FanSpeedResetValue:128) extracted from similar devices at https://github.com/hirschmann/nbfc/blob/master/Configs/ + #Start-Process -NoNewWindow -Wait -filePath "C:\Program Files (x86)\NoteBook FanControl\ec-probe.exe" -ArgumentList("write", "47", "128") + + if($Script:acSlider -eq $Script:betterBattery){ + #put adjustments for energie saving slider position here: + enable "power_saving" #add 10s boost delay for usage on cable to reduce idle power consumtion + } +} + +function doAdjust_BatteryMode { + $Script:repeatWaitTimeSeconds = 10 #do less reapplies and less HWiNFO updates to save power + adjust "fast_limit" 26000 + adjust "slow_limit" 10000 + #adjust "any_other_field" 1234 + + if($Script:dcSlider -eq $Script:betterBattery){ + #put adjustments for energie saving slider position here: for example disable fan to save power + #Start-Process -NoNewWindow -Wait -filePath "C:\Program Files (x86)\NoteBook FanControl\ec-probe.exe" -ArgumentList("write", "47", "0") + } + + if($Script:dcSlider -eq $Script:bestPerformance){ + #put adjustments for highest performance slider position here: + enable "max_performance" #removes 10s boost delay on battery + doAdjust_ACmode #set limits from cable mode on battery + } +} +################################################################################ +#### Configuration End +################################################################################ + +$env:PATH += ";$pathToRyzenAdjDlls" +$NL = $([System.Environment]::NewLine); + +if($noGUI){ $showErrorPopupsDuringInit = $false } + +$apiHeader = @' +[DllImport("libryzenadj.dll")] public static extern IntPtr init_ryzenadj(); +[DllImport("libryzenadj.dll")] public static extern int set_stapm_limit(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_fast_limit(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_slow_limit(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_slow_time(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_stapm_time(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_tctl_temp(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_vrm_current(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_vrmsoc_current(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_vrmmax_current(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_vrmsocmax_current(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_psi0_current(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_psi0soc_current(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_max_gfxclk_freq(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_min_gfxclk_freq(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_max_socclk_freq(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_min_socclk_freq(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_max_fclk_freq(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_min_fclk_freq(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_max_vcn(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_min_vcn(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_max_lclk(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_min_lclk(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_prochot_deassertion_ramp(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_apu_skin_temp_limit(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_dgpu_skin_temp_limit(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_apu_slow_limit(IntPtr ry, [In]uint value); +[DllImport("libryzenadj.dll")] public static extern int set_power_saving(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern int set_max_performance(IntPtr ry); + +[DllImport("libryzenadj.dll")] public static extern int refresh_table(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern IntPtr get_table_values(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_stapm_limit(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_stapm_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_stapm_time(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_fast_limit(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_fast_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_slow_limit(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_slow_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_apu_slow_limit(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_apu_slow_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrm_current(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrm_current_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrmsoc_current(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrmsoc_current_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrmmax_current(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrmmax_current_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrmsocmax_current(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_vrmsocmax_current_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_tctl_temp(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_tctl_temp_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_apu_skin_temp_limit(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_apu_skin_temp_value(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_dgpu_skin_temp_limit(IntPtr ry); +[DllImport("libryzenadj.dll")] public static extern float get_dgpu_skin_temp_value(IntPtr ry); + +[DllImport("kernel32.dll")] public static extern uint GetModuleFileName(IntPtr hModule, [Out]StringBuilder lpFilename, [In]int nSize); +[DllImport("kernel32.dll")] public static extern Boolean GetSystemPowerStatus(out SystemPowerStatus sps); +public struct SystemPowerStatus { + public Byte ACLineStatus; + public Byte BatteryFlag; + public Byte BatteryLifePercent; + public Byte Reserved1; + public Int32 BatteryLifeTime; + public Int32 BatteryFullLifeTime; +} + +public static String getExpectedWinRing0DriverFilepath(){ + StringBuilder fileName = new StringBuilder(255); + GetModuleFileName(IntPtr.Zero, fileName, fileName.Capacity); + return Path.GetDirectoryName(fileName.ToString()) + "\\WinRing0x64.sys"; +} + +public static String getDllImportErrors(){ + try { + Marshal.PrelinkAll(typeof(adj)); + } catch (Exception e) { + return e.Message; + } + return ""; +} +'@ + +if(-not ([System.Management.Automation.PSTypeName]'ryzen.adj').Type){ + Add-Type -MemberDefinition $apiHeader -Namespace 'ryzen' -Name 'adj' -UsingNamespace ('System.Text', 'System.IO') +} + +Add-Type -AssemblyName System.Windows.Forms +function showErrorMsg ([String] $msg){ + if($showErrorPopupsDuringInit){ + [void][System.Windows.Forms.MessageBox]::Show($msg, $PSCommandPath, + [System.Windows.Forms.MessageBoxButtons]::OK, + [System.Windows.Forms.MessageBoxIcon]::Error) + } +} + +$dllImportErrors = [ryzen.adj]::getDllImportErrors(); +if($dllImportErrors -or $Error){ + Write-Error $dllImportErrors + showErrorMsg "Problem with using libryzenadj.dll$NL$NL$($Error -join $NL)" + exit 1 +} + +$winring0DriverFilepath = [ryzen.adj]::getExpectedWinRing0DriverFilepath() +if(!(Test-Path $winring0DriverFilepath)) { Copy-Item -Path $pathToRyzenAdjDlls\WinRing0x64.sys -Destination $winring0DriverFilepath } + +$ry = [ryzen.adj]::init_ryzenadj() +if($ry -eq 0){ + $msg = "RyzenAdj could not get initialized.$($NL)Reason can be found inside Powershell$($NL)" + if($psISE) { $msg += "It is not possible to see the error reason inside ISE, you need to test it in PowerShell Console" } + showErrorMsg "$msg$NL$NL$($Error -join $NL)" + exit 1 +} + +function adjust ([String] $fieldName, [uInt32] $value) { + if($fieldName -eq $Script:monitorField) { + $newTargetValue = [math]::round($value * 0.001, 3, 0) + if($Script:monitorFieldAdjTarget -ne $newTargetValue){ + $Script:monitorFieldAdjTarget = $newTargetValue + Write-Host "set new monitoring target $fieldName to $newTargetValue" + } + } + $res = Invoke-Expression "[ryzen.adj]::set_$fieldName($ry, $value)" + switch ($res) { + 0 { + if($debugMode) { Write-Host "set $fieldName to $value" } + return + } + -1 { Write-Error "set_$fieldName is not supported on this family"} + -3 { Write-Error "set_$fieldName is not supported on this SMU"} + -4 { Write-Error "set_$fieldName is rejected by SMU"} + default { Write-Error "set_$fieldName did fail with $res"} + } +} + +function enable ([String] $fieldName) { + $res = Invoke-Expression "[ryzen.adj]::set_$fieldName($ry)" + switch ($res) { + 0 { + if($debugMode) { Write-Host "enable $fieldName"} + return + } + -1 { Write-Error "set_$fieldName is not supported on this family"} + -3 { Write-Error "set_$fieldName is not supported on this SMU"} + -4 { Write-Error "set_$fieldName is rejected by SMU"} + default { Write-Error "set_$fieldName did fail with $res"} + } +} + +function testMonitorField { + if($monitorField -and $Script:monitorFieldAdjTarget -eq 0){ + Write-Error ("You forgot to set $monitorField in your profile.$NL$NL" + + "If you ignore it, the script will apply values unnessasary often.$NL") + } +} + +function updateMonitorFieldAdjResult { + if($monitorField){ + [void][ryzen.adj]::refresh_table($ry) + $Script:monitorFieldAdjResult = [math]::round((getMonitorValue), 3, 0) + if($Script:monitorFieldAdjTarget -ne $Script:monitorFieldAdjResult){ + Write-Host ("Warning - $monitorField adjust result $Script:monitorFieldAdjResult does not match target value $Script:monitorFieldAdjTarget. Value $Script:monitorFieldAdjResult will be used for monitoring") + } + } +} + +function testConfiguration { + Write-Host "Test Adjustments" + if($Script:systemPowerStatus.ACLineStatus){ + doAdjust_BatteryMode + testMonitorField + $Script:monitorFieldAdjTarget = 0 + doAdjust_ACmode + } else { + doAdjust_ACmode + testMonitorField + $Script:monitorFieldAdjTarget = 0 + doAdjust_BatteryMode + } + testMonitorField + updateMonitorFieldAdjResult + + if($resetSTAPMUsage -and [ryzen.adj]::get_stapm_time($ry) -eq 1) { + Write-Error "resetSTAPMUsage function does only work on devices with active STAPM control and don't do anything on devices with enabled STT control." + } + + if($Error -and $showErrorPopupsDuringInit){ + $answer = [System.Windows.Forms.MessageBox]::Show("Your Adjustment configuration did not work.$NL$NL$($Error -join $NL)", $PSCommandPath, + [System.Windows.Forms.MessageBoxButtons]::AbortRetryIgnore, + [System.Windows.Forms.MessageBoxIcon]::Warning) + $Error.Clear() + if($answer -eq "Abort"){ exit 1 } + if($answer -eq "Retry"){ testConfiguration } + } +} + +function getMonitorValue { + if($monitorField){ + return Invoke-Expression "[ryzen.adj]::get_$monitorField($ry)" + } + return 0 +} + +function createOrDeleteHWINFOSensors { + if($updateHWINFOSensors){ + New-Item -Path HKCU:\Software\HWiNFO64\Sensors\Custom -Name RyzenAdj -Force > $null + 'Key,Name,Value + Power0,STAPM Limit + Power1,STAPM + Power2,PPT FAST Limit + Power3,PPT FAST + Power4,PPT SLOW Limit + Power5,PPT SLOW + Power6,APU SLOW Limit + Power7,APU SLOW + Current0,TDC VRM Limit + Current1,TDC VRM + Current2,TDC VRM SoC Limit + Current3,TDC VRM SoC + Current4,EDC VRM Max Limit + Current5,EDC VRM Max + Current6,EDC VRM SoC Max Limit + Current7,EDC VRM SoC Max + Temp0,TCTL Temp Limit + Temp1,TCTL Temp + Temp2,SST APU Skin Temp Limit + Temp3,SST APU Skin Temp + Temp4,SST dGPU Skin Temp Limit + Temp5,SST dGPU Skin Temp + Usage0,STAPM Limit Usage, ("STAPM" / "STAPM Limit") * 100 + Usage1,PPT FAST Limit Usage, ("PPT FAST" / "PPT FAST Limit") * 100 + Usage2,PPT SLOW Limit Usage, ("PPT SLOW" / "PPT SLOW Limit") * 100 + Usage3,APU SLOW Limit Usage, ("APU SLOW" / "APU SLOW Limit") * 100 + Usage4,TDC VRM Limit Usage, ("TDC VRM" / "TDC VRM Limit") * 100 + Usage5,TDC VRM SoC Limit Usage, ("TDC VRM SoC" / "TDC VRM SoC Limit") * 100 + Usage6,EDC VRM Max Limit Usage, ("EDC VRM Max" / "EDC VRM Max Limit") * 100 + Usage7,EDC VRM SoC Max Limit Usage, ("EDC VRM SoC Max" / "EDC VRM SoC Max Limit") * 100 + Usage8,TCTL Temp Limit Usage, ("TCTL Temp" / "TCTL Temp Limit") * 100 + Usage9,SST APU Skin Temp Limit Usage, ("SST APU Skin Temp" / "SST APU Skin Temp Limit") * 100 + Usage10,SST dGPU Skin Temp Limit Usage, ("SST dGPU Skin Temp" / "SST dGPU Skin Temp Limit") * 100' | ConvertFrom-Csv -outvariable hwinfo_keys > $null + $hwinfo_keys | ForEach-Object {New-item -Path HKCU:\Software\HWiNFO64\Sensors\Custom\RyzenAdj -Name $_.Key -Force} > $null + $hwinfo_keys | ForEach-Object {[Microsoft.Win32.Registry]::SetValue("HKEY_CURRENT_USER\Software\HWiNFO64\Sensors\Custom\RyzenAdj\" + $_.Key,"Name",$_.Name)} > $null + $hwinfo_keys | Where Value -ne $null | ForEach-Object {[Microsoft.Win32.Registry]::SetValue("HKEY_CURRENT_USER\Software\HWiNFO64\Sensors\Custom\RyzenAdj\" + $_.Key,"Value",$_.Value)} > $null + } else { + Remove-Item HKCU:\Software\HWiNFO64\Sensors\Custom\RyzenAdj -Recurse -ErrorAction:Ignore + } +} + +function setHWINFOValue ([String] $name, [float] $value) { + if(![float]::IsNaN($value)){ [Microsoft.Win32.Registry]::SetValue("HKEY_CURRENT_USER\Software\HWiNFO64\Sensors\Custom\RyzenAdj\" + $name,"Value",[String]$value) } +} + +function updateHWINFOSensors { + setHWINFOValue Power0 ([ryzen.adj]::get_stapm_limit($ry)) + setHWINFOValue Power1 ([ryzen.adj]::get_stapm_value($ry)) + setHWINFOValue Power2 ([ryzen.adj]::get_fast_limit($ry)) + setHWINFOValue Power3 ([ryzen.adj]::get_fast_value($ry)) + setHWINFOValue Power4 ([ryzen.adj]::get_slow_limit($ry)) + setHWINFOValue Power5 ([ryzen.adj]::get_slow_value($ry)) + setHWINFOValue Power6 ([ryzen.adj]::get_apu_slow_limit($ry)) + setHWINFOValue Power7 ([ryzen.adj]::get_apu_slow_value($ry)) + setHWINFOValue Current0 ([ryzen.adj]::get_vrm_current($ry)) + setHWINFOValue Current1 ([ryzen.adj]::get_vrm_current_value($ry)) + setHWINFOValue Current2 ([ryzen.adj]::get_vrmsoc_current($ry)) + setHWINFOValue Current3 ([ryzen.adj]::get_vrmsoc_current_value($ry)) + setHWINFOValue Current4 ([ryzen.adj]::get_vrmmax_current($ry)) + setHWINFOValue Current5 ([ryzen.adj]::get_vrmmax_current_value($ry)) + setHWINFOValue Current6 ([ryzen.adj]::get_vrmsocmax_current($ry)) + setHWINFOValue Current7 ([ryzen.adj]::get_vrmsocmax_current_value($ry)) + setHWINFOValue Temp0 ([ryzen.adj]::get_tctl_temp($ry)) + setHWINFOValue Temp1 ([ryzen.adj]::get_tctl_temp_value($ry)) + setHWINFOValue Temp2 ([ryzen.adj]::get_apu_skin_temp_limit($ry)) + setHWINFOValue Temp3 ([ryzen.adj]::get_apu_skin_temp_value($ry)) + setHWINFOValue Temp4 ([ryzen.adj]::get_dgpu_skin_temp_limit($ry)) + setHWINFOValue Temp5 ([ryzen.adj]::get_dgpu_skin_temp_value($ry)) + #setHWINFOValue Usage11 $pmTable[546] +} + +function resetSTAPMIfNeeded { + $stapm_limit = [ryzen.adj]::get_stapm_limit($ry) + $stapm_value = [ryzen.adj]::get_stapm_value($ry) + $stapm_hysteresis = 1 #Throttling starts arround ~0.9W before limit + + if ($stapm_value -gt ($stapm_limit - $stapm_hysteresis)) { + $stapm_time = [ryzen.adj]::get_stapm_time($ry) + $reduced_stapm_limit = ($stapm_limit - 5) #reduce stapm by 5W + Write-Host "[STAPM_RESET] stapm_value ($stapm_value) nearing stapm_limit ($stapm_limit), resetting..." + [void][ryzen.adj]::set_stapm_limit($ry, ($reduced_stapm_limit) * 1000) + [void][ryzen.adj]::set_stapm_time($ry, 0) + [Threading.Thread]::Sleep(10) #10ms is usually enough time + [void][ryzen.adj]::set_stapm_time($ry, $stapm_time) + [void][ryzen.adj]::set_stapm_limit($ry, $stapm_limit * 1250) # add 25% STAPM limit in case we are at battery saving mode where applied values get reduced by 10% or 20% + } +} + +if(-not $Script:repeatWaitTimeSeconds) { $Script:repeatWaitTimeSeconds = 5 } +$Script:monitorFieldAdjResult = 0; #adjust result will be used for monitoring because SMU may only set 90% and 80% of your value +$Script:monitorFieldAdjTarget = 0; +$powerkey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SYSTEM\ControlSet001\Control\Power\User\PowerSchemes\") +$Script:betterBattery = "961cc777-2547-4f9d-8174-7d86181b8a7a" +$Script:betterPerformance = "00000000-0000-0000-0000-000000000000" +$Script:bestPerformance = "ded574b5-45a0-4f42-8737-46345c09c238" +$Script:acSlider = $powerkey.GetValue("ActiveOverlayACPowerScheme") +$Script:dcSlider = $powerkey.GetValue("ActiveOverlayDCPowerScheme") + +$systemPowerStatus = New-Object ryzen.adj+SystemPowerStatus +[void][ryzen.adj]::GetSystemPowerStatus([ref]$systemPowerStatus) + +testConfiguration + +<# Example how to get 560 lines of ptable +$pmTable = [float[]]::new(560) +$tablePtr = [ryzen.adj]::get_table_values($ry); +[System.Runtime.InteropServices.Marshal]::Copy($tablePtr, $pmTable, 0, 560); +#> +createOrDeleteHWINFOSensors + +$mtxtArray = @() +if($monitorField){$mtxtArray += "$monitorField changes"} +if($monitorPowerSlider){$mtxtArray += "PowerSlider changes"} +if($mtxtArray.Length){ + $processType = "Monitor " + ($mtxtArray -join " and ") +} else { + $processType = "Apply Settings" +} +Write-Host "$processType every $Script:repeatWaitTimeSeconds seconds..." +while($true) { + $doAdjust = !$monitorField -and !$monitorPowerSlider + if($monitorField -or $updateHWINFOSensors -or $resetSTAPMUsage) { + [void][ryzen.adj]::refresh_table($ry) + #[System.Runtime.InteropServices.Marshal]::Copy($tablePtr, $pmTable, 0, 560); + } + + if($updateHWINFOSensors){ + updateHWINFOSensors + } + + if($monitorPowerSlider -and ($Script:acSlider -ne $powerkey.GetValue("ActiveOverlayACPowerScheme") -or $Script:dcSlider -ne $powerkey.GetValue("ActiveOverlayDCPowerScheme"))){ + Write-Host "Power Slider changed" + $Script:acSlider = $powerkey.GetValue("ActiveOverlayACPowerScheme") + $Script:dcSlider = $powerkey.GetValue("ActiveOverlayDCPowerScheme") + $doAdjust = $true + } + if($monitorField){ + $monitorValue = getMonitorValue + if($Script:monitorFieldAdjResult -ne [math]::round($monitorValue, 3, 0)){ + Write-Host "$monitorField value unexpectedly changed from $Script:monitorFieldAdjResult to $monitorValue" + $doAdjust = $true + } + } + + if($resetSTAPMUsage){ + resetSTAPMIfNeeded + } + + if($doAdjust){ + [void][ryzen.adj]::GetSystemPowerStatus([ref]$systemPowerStatus) + $oldWait = $Script:repeatWaitTimeSeconds + if($systemPowerStatus.ACLineStatus){ + doAdjust_ACmode + } else { + doAdjust_BatteryMode + } + updateMonitorFieldAdjResult + if($oldWait -ne $Script:repeatWaitTimeSeconds ) { Write-Host "$processType every $Script:repeatWaitTimeSeconds seconds..." } + } + + sleep $Script:repeatWaitTimeSeconds +} diff --git a/public/bin/ryzenadj.exe b/public/bin/ryzenadj.exe index 7eb7071fbdcdda2a2f157ec42aa4bbc2b0f73298..ea689f2eb6a10a288d5c1063255fd1dd886ea159 100644 GIT binary patch literal 54272 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 M`|scXCnE6w0HqF#sQ>@~ literal 38400 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 */ -/* RyzenAdj API */ - -#ifndef RYZENADJ_H -#define RYZENADJ_H -#ifdef __cplusplus -extern "C" { -#endif -#include "nb_smu_ops.h" - -#ifdef _WIN32 -#define EXP __declspec(dllexport) -#define CALL __stdcall -#else -#define EXP -#define CALL -#endif - -#define RYZENADJ_VER 5 - -typedef struct { - nb_t nb; - pci_obj_t pci_obj; - smu_t mp1_smu; - smu_t psmu; -} *ryzen_access; - -EXP ryzen_access CALL init_ryzenadj(); - -EXP void CALL cleanup_ryzenadj(ryzen_access ry); - -EXP int CALL set_stapm_limit(ryzen_access, uint32_t value); -EXP int CALL set_fast_limit(ryzen_access, uint32_t value); -EXP int CALL set_slow_limit(ryzen_access, uint32_t value); -EXP int CALL set_slow_time(ryzen_access, uint32_t value); -EXP int CALL set_stapm_time(ryzen_access, uint32_t value); -EXP int CALL set_tctl_temp(ryzen_access, uint32_t value); -EXP int CALL set_vrm_current(ryzen_access, uint32_t value); -EXP int CALL set_vrmsoc_current(ryzen_access, uint32_t value); -EXP int CALL set_vrmmax_current(ryzen_access, uint32_t value); -EXP int CALL set_vrmsocmax_current(ryzen_access, uint32_t value); -EXP int CALL set_psi0_current(ryzen_access, uint32_t value); -EXP int CALL set_psi0soc_current(ryzen_access, uint32_t value); -EXP int CALL set_max_gfxclk_freq(ryzen_access, uint32_t value); -EXP int CALL set_min_gfxclk_freq(ryzen_access, uint32_t value); -EXP int CALL set_max_socclk_freq(ryzen_access, uint32_t value); -EXP int CALL set_min_socclk_freq(ryzen_access, uint32_t value); -EXP int CALL set_max_fclk_freq(ryzen_access, uint32_t value); -EXP int CALL set_min_fclk_freq(ryzen_access, uint32_t value); -EXP int CALL set_max_vcn(ryzen_access, uint32_t value); -EXP int CALL set_min_vcn(ryzen_access, uint32_t value); -EXP int CALL set_max_lclk(ryzen_access, uint32_t value); -EXP int CALL set_min_lclk(ryzen_access, uint32_t value); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/public/bin/uninstallServiceTask.bat b/public/bin/uninstallServiceTask.bat new file mode 100644 index 0000000..6973e10 --- /dev/null +++ b/public/bin/uninstallServiceTask.bat @@ -0,0 +1,23 @@ +@echo off +NET FILE 1>NUL 2>NUL +if %errorlevel% NEQ 0 ( + echo Deinstallation need to be run as Administrator to delete your Scheduled Task + pause + exit /B 0 +) + +reg query HKCU\Software\HWiNFO64\Sensors\Custom\RyzenAdj 2>NUL +if %errorlevel% EQU 0 reg delete HKCU\Software\HWiNFO64\Sensors\Custom\RyzenAdj + +SCHTASKS /query /TN "AMD\RyzenAdj" 2>NUL + +if %errorlevel% NEQ 0 ( + echo RyzenAdj Service Task is not installed + pause + exit /B 0 +) + +SCHTASKS /delete /TN "AMD\RyzenAdj" 2>NUL + +pause +exit /B 0