/ryzen_nb_smu

A fight against Ryzen NorthBridge SMU

Primary LanguageCGNU General Public License v2.0GPL-2.0

ryzen_nb_smu

A fight against Ryzen NorthBridge SMU

Further usage and other information is still under research.

PR and discussions are welcomed.

Background

Some how, I deterimined the method of commiunication between processor and SMU on northbridge of Ryzen processor, so it would be possible to change some power and frequency related settings in OS. Especially for Mobile Raven Ridge platform.

Utils

kmod_pp

Kernel Module to dump and modify pptable.

(Not working, under research)

TODO: Determine why we can't dump pptable

smu_test.c

A userspace tool to make smu service request

Communication Protcol

The registers, RAM and ROM of SMU is wrapped by a couple of register in NorthBridge PCI Config Space.

To communicate with SMU, the procossor need send a service request to SMU by write values to SMU registers.

There are 8 32-bit registers related with service register, MSG, 6×ARG and REP.

MSG is the ID of service request, 6*ARGS are arguments, REP is respond of service request.

Progress of a service request

  • Clear the REP register
  • Write the ARGs
  • Write the MSG
  • Poll the REP until it changed, means the request is proceeded
  • Read back ARGs
  • Check the REP if the request proceeded sucessfuly

A table of request ID for MP1

Name ID Note
TestMessage 0x1
GetSmuVersion 0x2
GetBiosIfVersion 0x3
GetNameString 0x4
EnableSmuFeatures 0x5
DisableSmuFeatures 0x6
DramLogSetDramAddrHigh 0x7
DramLogSetDramAddrLow 0x8
DramLogSetDramSize 0x9
DxioTestMessage 0xA
ReadCoreCacWeightRegister 0xB
SleepEntry 0xC
SetGbeStatus 0xD
PowerUpGfx 0xE
PowerUpSata 0xF
PowerDownSata 0x10
DisableSataController 0x11
SetBiosDramAddrHigh 0x12
SetBiosDramAddrLow 0x13
SetToolsDramAddrHigh 0x14
SetToolsDramAddrLow 0x15
TransferTableSmu2Dram 0x16
TransferTableDram2Smu 0x17
PowerSourceAC 0x18
PowerSourceDC 0x19
SetSustainedPowerLimit 0x1A
SetFastPPTLimit 0x1B
SetSlowPPTLimit 0x1C
SetSlowPPTTimeConstant 0x1D
SetStapmTimeConstant 0x1E
SetTctlMax 0x1F
SetVrmCurrentLimit 0x20
SetVrmSocCurrentLimit 0x21
SetVrmMaximumCurrentLimit 0x22
SetVrmSocMaximumCurrentLimit 0x23
SetPSI0CurrentLimit 0x24
SetPSI0SocCurrentLimit 0x25
SetProchotDeassertionRampTime 0x26
UpdateSkinTempError 0x27
SetGpuApertureLow 0x28
SetGpuApertureHigh 0x29
StartGpuLink 0x2A
StopGpuLink 0x2B
UsbD3Entry 0x2C
UsbD3Exit 0x2D
UsbInit 0x2E
AcBtcStartCal 0x2F
AcBtcStopCal 0x30
AcBtcEndCal 0x31
DcBtc 0x32
BtcRestoreOnS3Resume 0x33
SetGpuDeviceId 0x34
SetUlvVidOffset 0x35
DisablePSI 0x36
EnablePostCode 0x37
UsbConfigUpdate 0x38
SetupUSB31ControllerTrap 0x39
SetVddOffVid 0x3A
SetVminFrequency 0x3B
SetFrequencyMax 0x3C
SetGfxclkOverdriveByFreqVid 0x3D
PowerGateXgbe 0x3E
OC_Disable 0x3F
OC_VoltageMax 0x40
OC_FrequencyMax 0x41
EnableCC6Filter 0x42
GetSustainedPowerAndThmLimit 0x43
SetSoftMaxCCLK 0x44
SetSoftMinCCLK 0x45
SetSoftMaxGfxClk 0x46
SetSoftMinGfxClk 0x47
SetSoftMaxSocclkByFreq 0x48
SetSoftMinSocclkByFreq 0x49
SetSoftMaxFclkByFreq 0x4A
SetSoftMinFclkByFreq 0x4B
SetSoftMaxVcn 0x4C
SetSoftMinVcn 0x4D
SetSoftMaxLclk 0x4E
SetSoftMinLclk 0x4F
Message_Count 0x50

About "Get" Commands

You can get SMU answer from reading arguments after command. Then decode them or it will be clear result

A table of REP code

Name ID
OK 0x1
Failed 0xFF
UnknownCmd 0xFE
CmdRejectedPrereq 0xFD
CmdRejectedBusy 0xFC

A table of SMU Feature ID

Name Bit = args Note
CCLK_CONTROLLER 0 = 1 CPU Clock controller - CPU will always work at 1600MHz
FAN_CONTROLLER 1 = 2 Fan will be always 4400 RPM or more
DATA_CALCULATION 2 = 4 Disable or Enable CPU power states. No more changing powers (besides STAPM) and voltages are static
PPT 3 = 8 Disable or Enable Slow and Fast Power Limits
TDC 4 = 10 Disable or Enable TDC Current limits
THERMAL 5 = 20 CPU, SoC and iGPU temperature controller disabling
FIT 6 = 40 Monitors reliability and failure predictions
EDC 7 = 80 Nothing happens
PLL_POWER_DOWN 8 = 100 Power down state of phase-locked loops to save power
ULV 9 = 200 ULV voltage for power saving mode enablement
VDDOFF 10 = 400 Voltage rail off DEBUG PStates voltage control
VCN_DPM 11 = 800 Locking max VCN clock to 400 MHz while disabled
ACP_DPM 12 = 1000 Locking NB-Azalia (audio over iGPU) to 400 MHz wh disabl
ISP_DPM 13 = 2000 Locking Image Signal Processor to 100 MHz if disabled
FCLK_DPM 14 = 4000 FCLK clock locking? After disabling
SOCCLK_DPM 15 = 8000 Locking max SoC clock to 200 MHz while disabled
MP0CLK_DPM 16 = 10000 MP0 clocks group clock locking? After disabling
LCLK_DPM 17 = 20000 Data Latch clock locking? After disabling
SHUBCLK_DPM 18 = 40000 System hub clock locking? After disabling
DCEFCLK_DPM 19 = 80000 Nothing happens
GFX_DPM 20 = 100000 Locking max iGPU clock to 400 MHz while disabled
DS_GFXCLK 21 = 200000 Allow change GFX_CLK from SMU
DS_SOCCLK 22 = 400000 Allow change SOC_CLK from SMU
DS_LCLK 23 = 800000 Allow change LCLK from SMU
DS_DCEFCLK 24 = 1000000 Allow change DCEFCLK from SMU
DS_SHUBCLK 25 = 2000000 Allow change SystemHUB_CLK from SMU
RM 26 = 4000000 Resource management engine?
S0i2 27 = 8000000 Pstate S0i2 for low power idle
WHISPER_MODE 28 = 10000000 Whisper event start-stop
DS_FCLK 29 = 20000000 Allow change FCLK from SMU
DS_SMNCLK 30 = 40000000 Allow change SystemManagementNetworkCLK from SMU
DS_MP1CLK 31 = 80000000 Allow change MP1 Clocks group from SMU
DS_MP0CLK 32 = 0,1 Allow change MP0 Clocks group from SMU
MGCG 33 = 0,2 MemoryGenericClockGating?
DS_FUSE_SRAM 34 = 0,4 Deep sleep strate for fuse SRAM from SMU
GFX_CKS 35 = 0,8 DISABLING WILL DISABLE THE GPU!
PSI0 36 = 0,10 PSI0 Currents group
PROCHOT 37 = 0,20 Disabling will disable PROCHOT and CPU CAN WORK ON 400 MHZ!
CPUOFF 38 = 0,40 Disabling will disable C-States
STAPM 39 = 0,80 Disabling will disable STAPM
CORE_CSTATES 40 = 0,100 Disabling will disable C-States
GFX_DUTY_CYCLE 41 = 0,200 Duty Cycle for iGPU control
AA_MODE 42 = 0,400 Enabling will give some performance boost
LIVMIN 43 = 0,800 Minimum live voltage for RV2
RLC_PACE 44 = 0,1000 RLC (Run Length Coding) pacing for RV2

-These can be enabled with EnableSmuFeatures (0x5) or disabled with DisableSmuFeatures (0x6)

Example

To enable feature set command to 0x5 and in arguments send value from table args (after "="). For examle to enable STAPM feature you need to send MP1 command 0x5 with arguments 0,80 (send 0 to zero argument and 80 to first, "," is a separator beetwen arguments

PPtable

PowerPlay Table

A table to storage power management information

See AMDGPU Powerplay for more information

Now no way to get RX Vega Mobile Power Play from system

Firmware

Grab from BIOS, reverse engineering in progesss.(Help wanted)

Credit

  • zamaudio/smutool
  • Linux Kernel - amdgpu
  • Internet
  • My ThinkPad E485 with R7-2700U