Files
Horizon-OC/gpu_volt.py
2023-11-15 22:55:12 +09:00

130 lines
4.8 KiB
Python
Executable File

# Copyright 2023 hanai3Bi
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
# This program is distributed in the hope it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import math
gpu_dvfs_table_0 = [
[ 610000, 0 , 0 , 0 , 0 , 0 ],
[ 610000, 0 , 0 , 0 , 0 , 0 ],
[ 610000, 0 , 0 , 0 , 0 , 0 ],
[ 610000, 0 , 0 , 0 , 0 , 0 ],
[ 610000, 0 , 0 , 0 , 0 , 0 ],
[ 610000, 0 , 0 , 0 , 0 , 0 ],
[ 801688, -10900, -163, 298, -10599, 162 ],
[ 824214, -5743, -452, 238, -6325, 81 ],
[ 848830, -3903, -552, 119, -4030, -2 ],
[ 891575, -4409, -584, 0, -2849, 39 ],
[ 940071, -5367, -602, -60, -63, -93 ],
[ 986765, -6637, -614, -179, 1905, -13 ],
[ 1098475, -13529, -497, -179, 3626, 9 ],
[ 1163644, -12688, -648, 0, 1077, 40 ],
[ 1204812, -9908, -830, 0, 1469, 110 ],
[ 1277303, -11675, -859, 0, 3722, 313 ],
[ 1335531, -12567, -867, 0, 3681, 559 ]
]
gpu_dvfs_table_1 = [
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 795089, -11096, -163, 298, -10421, 162 ],
[ 795089, -11096, -163, 298, -10421, 162 ],
[ 820606, -6285, -452, 238, -6182, 81 ],
[ 846289, -4565, -552, 119, -3958, -2 ],
[ 888720, -5110, -584, 0, -2849, 39 ],
[ 936634, -6089, -602, -60, -99, -93 ],
[ 982562, -7373, -614, -179, 1797, -13 ],
[ 1090179, -14125, -497, -179, 3518, 9 ],
[ 1155798, -13465, -648, 0, 1077, 40 ],
[ 1198568, -10904, -830, 0, 1469, 110 ],
[ 1269988, -12707, -859, 0, 3722, 313 ],
[ 1308155, -13694, -867, 0, 3681, 559 ]
]
gpu_dvfs_table_2 = [
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 590000, 0 , 0 , 0 , 0 , 0 ],
[ 838712, -7304, -552, 119, -3750, -2 ],
[ 880210, -7955, -584, 0, -2849, 39 ],
[ 926398, -8892, -602, -60, -384, -93 ],
[ 970060, -10108, -614, -179, 1508, -13 ],
[ 1065665, -16075, -497, -179, 3213, 9 ],
[ 1132576, -16093, -648, 0, 1077, 40 ],
[ 1180029, -14534, -830, 0, 1469, 110 ],
[ 1248293, -16383, -859, 0, 3722, 313 ],
[ 1286399, -17475, -867, 0, 3681, 559 ]
]
gpu_freq_table = [76800, 153600, 230400, 307200, 384000, 460800, 537600, 614400, 691200, 768000, 844800, 921600, 998400, 1075200, 1152000, 1228800, 1267200]
temp_list = [20, 30, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90]
def round_closest(value, scale):
if (value > 0):
return (((value) + ((scale) / 2)) / (scale))
else:
return (((value) - ((scale) / 2)) / (scale))
def round5(number):
return int(math.ceil(number / 5.0)) * 5
speedo = int(input("Enter gpu speedo: "))
table = int(input("Enter gpu table (0~2): "))
if (table == 0):
gpu_dvfs_table = gpu_dvfs_table_0
elif (table == 1):
gpu_dvfs_table = gpu_dvfs_table_1
else:
gpu_dvfs_table = gpu_dvfs_table_2
offset = int(input("Enter gpu offset: "))
for i in range(17):
gpu_dvfs_table[i][0] -= offset*1000
print("\t\t", end="")
for temp in temp_list:
print(temp, "°C\t", end="")
print()
for entry in range(17):
print(float(gpu_freq_table[entry]/1000),end="")
print("\t\t", end="")
mv = round_closest(gpu_dvfs_table[entry][2] * speedo , 100)
mv = round_closest( (mv + gpu_dvfs_table[entry][1]) * speedo , 100) + gpu_dvfs_table[entry][0]
#mv = round5(mv/1000)
for temp in temp_list:
mvt = round_closest(gpu_dvfs_table[entry][3] * speedo , 100) + gpu_dvfs_table[entry][4] + round_closest(gpu_dvfs_table[entry][5] * temp , 10)
mvt = round_closest(mvt * temp , 10)
#mvt = round5(mvt/1000)
final_volt = math.ceil ((mv + mvt) / 1000)
vmin = 610 if table == 0 else 590
final_volt = max(final_volt, vmin)
final_volt = round5(final_volt)
print(final_volt, "\t", end="")
print()
#input("Press enter to exit")