Edited: with more interesting things
Hi, I found one funny thing, how to lock cores to the r9 380

.
You only have to replace the bolded 6F to 70, in the TV1OutputControl or havesting table:
D1 00 01 01 08 00 37 00 00 66 FF 2D 0D 42 BD 00
56 00 41 03 21 41 00 15 0D 41 02 2D 0A 42 41 03
04 01 00 00 66 FF 2D 0D 42 C9 00 03 05 00 00 00
00 40 56 00 40 54 00 00 00 03 4C 00 00 00 01 02
00 C2 00 01 0A 00 00 01 03 98 41 01 00 56 08 41
03 22 43 41 4C 8A 41 44 49 5F 00 2D 65 41 01 2D
25 41 01 3E 39 41 00 45 50 00 3E 71 41 00 47 A1
00 33 71 41 00 03 39 41 00 33 25 41 01 03 22 43
41 4C 8A 41 44 49 79 00 0F 8A 41 44 33 65 41 01
3E 65 41 00 49 79 00 01 1A 00 00 01 01 9A 01 00
41 2D 0D 42 02 00 2D 25 40 01 3E 25 40 04 49 39
00 01 05 00 C2 00 00 00 E0 5B 7A 14 00
6F 22 70
22 3D 26 DF 26 40 22 41 22 00 00 00 01 00 02 00
03
This is what gpuz shows:

This is what cuinfo17 shows with the stock value:
This is what cuinfo17 shows with the modded value:
You can see that a 4 CUs software lock is added

.
The firestrike score is lowered ~ 700 points, power consumption is 5w less, and temps are 1º less.
I suppose CUs can't be un Unlocked.
Other thing that I know now is the structure of the ASIC_ProfilingInfo info table thanks to this:
[/URL]source:
https://github.com/ipts-linux-org/ip...ude/atombios.h
//Here is parameter to convert Efuse value to Measure value
//Measured = LN((2^Bitsize-1)/EFUSE-1)*(Range)/(-alpha)+(Max+Min)/2
typedef struct _EFUSE_LOGISTIC_FUNC_PARAM
{
USHORT usEfuseIndex; // Efuse Index in DWORD address, for example Index 911, usEuseIndex=112
UCHAR ucEfuseBitLSB; // Efuse bit LSB in DWORD address, for example Index 911, usEfuseBitLSB= 911-112*8=15
UCHAR ucEfuseLength; // Efuse bits length,
ULONG ulEfuseEncodeRange; // Range = Max - Min, bit31 indicate the efuse is negative number
ULONG ulEfuseEncodeAverage; // Average = ( Max + Min )/2
}EFUSE_LOGISTIC_FUNC_PARAM;
//Linear Function: Measured = Round ( Efuse * ( Max-Min )/(2^BitSize -1 ) + Min )
typedef struct _EFUSE_LINEAR_FUNC_PARAM
{
USHORT usEfuseIndex; // Efuse Index in DWORD address, for example Index 911, usEuseIndex=112
UCHAR ucEfuseBitLSB; // Efuse bit LSB in DWORD address, for example Index 911, usEfuseBitLSB= 911-112*8=15
UCHAR ucEfuseLength; // Efuse bits length,
ULONG ulEfuseEncodeRange; // Range = Max - Min, bit31 indicate the efuse is negative number
ULONG ulEfuseMin; // Min
So for this stock table:
E0 00 03 03 55 00 00 00 10 04 00 00 24 13 00 00
10 0E 00 00 09 00 00 00 E8 03 00 00 48 0D 00 00
48 02 08 08 B8 0B 00 00 00 00 00 00 48 02 10 08
10 27 00 00 00 00 00 00 4C 02 00 08 A0 0F 00 00
B8 0B 00 00 4C 02 10 08 AC 0D 00 80 D6 06 00 00
4C 02 18 08 40 9C 00 00 50 C3 00 00 34 00 06 0A
D5 0D 01 00 40 42 0F 00 E8 03 00 00 0D 00 00 00
00 00 76 02 EE 02 5C 03 D4 03 42 04 BA 04 28 05
E3 08 00 00 E3 08 00 00 E3 08 00 00 E3 08 00 00
E3 08 00 00 E3 08 00 00 E3 08 00 00 E3 08 00 00
48 02 18 08 B6 03 00 00
46 05 00 00 BE 2C 00 00
7A 36 00 00 1E 8F 00 00 AF 81 00 00 00 00 00 00
00 00 00 00
37 00 00 00 00 00 00 00
84 00 00 00
00 00 00 00 3C 00 00 00 00 00 00 00 9B 02 00 00
Is like this:
ATOM_COMMON_TABLE_HEADER asHeader;
55 ULONG ulEvvLkgFactor; 85
10 04 ULONG ulBoardCoreTemp; 1040 104º
24 13 ULONG ulMaxVddc; 4900 /4= 1225v
10 E0 ULONG ulMinVddc; 3600 /4= 900v
9 ULONG ulLoadLineSlop;
e8 03 ULONG ulLeakageTemp; 1000
48 D0 ULONG ulLeakageVoltage; 3400 /4=850v
EFUSE_LINEAR_FUNC_PARAM sCACm; (584*3000/255)= 6870 /4 1717.5
48 02 USHORT usEfuseIndex; 584
08 UCHAR ucEfuseBitLSB;
08 UCHAR ucEfuseLength;
B8 0B ULONG ulEfuseEncodeRange;
00 ULONG ulEfuseMin;
EFUSE_LINEAR_FUNC_PARAM sCACb; (584*10000/255) =22901 /4= 5725.25
48 02 USHORT usEfuseIndex;
10 UCHAR ucEfuseBitLSB;
08 UCHAR ucEfuseLength;
10 27 ULONG ulEfuseEncodeRange;
00 ULONG ulEfuseMin;
EFUSE_LOGISTIC_FUNC_PARAM sKt_b; LN((2^8-1)/588-1)*(4000)/(-13)+ 3000 = -0,83154950342 = 46240 /4 11560
4C02 USHORT usEfuseIndex; 588
00 UCHAR ucEfuseBitLSB;
08 UCHAR ucEfuseLength;
A0 0F ULONG ulEfuseEncodeRange; 4000
B8 B0 ULONG ulEfuseEncodeAverage; 3000
EFUSE_LOGISTIC_FUNC_PARAM sKv_m; LN((2^8-1)/588-1)*(2147537068)/(-13)+1645=-0,83154950342* = 137369597 /4 = 34342399.5
4C02 USHORT usEfuseIndex;
10 UCHAR ucEfuseBitLSB;
08 UCHAR ucEfuseLength;
AC 0D 00 80 ULONG ulEfuseEncodeRange; 2147537068
D6 06 ULONG ulEfuseEncodeAverage; 1645
EFUSE_LOGISTIC_FUNC_PARAM sKv_b; LN((2^8-1)/588-1)*(40000)/(-13)+50000 = 50255 /4=12563.75
4C 02 USHORT usEfuseIndex;
18 UCHAR ucEfuseBitLSB;
08 UCHAR ucEfuseLength;
40 9C ULONG ulEfuseEncodeRange; 40000
50 C3 ULONG ulEfuseEncodeAverage; 50000
34 00 USHORT usLkgEuseIndex;
06 UCHAR ucLkgEfuseBitLSB;
0A UCHAR ucLkgEfuseLength;
D5 0D 01 ULONG ulLkgEncodeLn_MaxDivMin;
40 42 0F ULONG ulLkgEncodeMax; 1000000
E8 03 ULONG ulLkgEncodeMin; 1000
D ULONG ulEfuseLogisticAlpha
0000 USHORT usPowerDpm0;
0000 USHORT usParamNegFlag; //bit0 =1 :indicate ulRoBeta is Negative, bit1=1 indicate Kv_m max is postive
76 02USHORT usPowerDpm1; 630
EE 02 USHORT usPowerDpm2; 750
5C 03 USHORT usPowerDpm3; 860
D4 03 USHORT usPowerDpm4; 980
42 04 USHORT usPowerDpm5; 1090
BA 04 USHORT usPowerDpm6; 1204
28 05 USHORT usPowerDpm7; 1320
E3 08 ULONG ulTdpDerateDPM0; 2272
E3 08 ULONG ulTdpDerateDPM1;
E3 08 ULONG ulTdpDerateDPM2;
E3 08 ULONG ulTdpDerateDPM3;
E3 08 ULONG ulTdpDerateDPM4;
E3 08 ULONG ulTdpDerateDPM5;
E3 08 ULONG ulTdpDerateDPM6;
E3 08 ULONG ulTdpDerateDPM7;
EFUSE_LINEAR_FUNC_PARAM sRoFuse; (584*950)/255) + 1350= 3525 /4 = 881.25
48 02 USHORT usEfuseIndex; 584
18 UCHAR ucEfuseBitLSB;
08 UCHAR ucEfuseLength;
B6 03 ULONG ulEfuseEncodeRange; max 2186
46 05 ULONG ulEfuseMin; 1350
BE 2C ULONG ulRoAlpha; 11454
7A 36 ULONG ulRoBeta; 13946
1E 8F ULONG ulRoGamma; 36638
AF 81 ULONG ulRoEpsilon; 33199
00 ULONG ulATermRo;
00 ULONG ulBTermRo;
37 ULONG ulCTermRo; 91
00 ULONG ulSclkMargin;
84 ULONG ulFmaxPercent;
00 ULONG ulCRPercent;
3c ULONG ulSFmaxPercent; 60
00 ULONG ulSCRPercent;
9b 02 ULONG ulSDCMargine; 667
I have tried to calculate what are named "Measured value" for the Efuse values, but I don't see any sense on it or I have done it wrong.
I'm using this values to change voltages:
The value
46 05 = 1350 is ulEfuseMin and is lowering in littel increases the voltages from DPM 1 to 6 in big increase is lowering DPM 1 to 7 voltages. And increasing the voltage if is lowered
EDITED: I MADE TWO MISTAKES ulCTermRo is 37 and is ulFmaxPercent not ulSFmaxPercent, sorry.
The value
37 = 55 is ulCTermRo and
84 =132 that is ulFmaxPercent ulSFmaxPercent are lowering DPM 1 to 7 voltages if are lowerd and incrasing them if are increased.
The values:
BE 2C = 11454 ulRoAlpha;
7A 30 = 13945 ulRoBeta;
1E 8F = 36638 ulRoGamma;
AF 81 =33199 ulRoEpsilon;
Are lowering DPM 1 to 7 voltages if are lowerd and incrasing them if are increased. But I have lower scores changing them.
EDITED:
B6 03 ULONG ulEfuseEncodeRange is like a voltage offset higher values are less volage for DPM 1 to 7, and lower values more moltage. + or -15 or 20 devimal values for the value is ~ + or - 6.25v, but I have to test more. I don't see performance lost.
Thanks for the person who gave me a rep+