Hello,

I’m adjusting pp_table settings to get most out of my GPU (RX 6800 XT) and it works but every time I restart PC the changes revert back to default. Any idea how I could make them persist?

For me pp_table is located in /sys/class/drm/card1/device/pp_table

I have to use chmod to be able to make changes:

sudo chmod o+w /sys/class/drm/card1/device/pp_table

Then I’m able to write in changes with upp:

upp -p /sys/class/drm/card1/device/pp_table set --write smc_pptable/SocketPowerLimitAc/0=312 smc_pptable/SocketPowerLimitDc/0=293 smc_pptable/TdcLimit/0=300 smc_pptable/FreqTableSocclk/1=1350 smc_pptable/FreqTableFclk/1=2000 smc_pptable/FclkBoostFreq=2000

And just in case you’re wondering if the effort even makes sene, yes it does:

Max OC with LACT with max default limits (left) vs max OC with edited pp_table (right) in the picture.

  • vole@lemmy.world
    link
    fedilink
    English
    arrow-up
    4
    ·
    edit-2
    4 hours ago

    I’m not familiar with Radeon PowerPlay, so I don’t know if there is a proper way to solve this, but you should be able to make a systemd system service to run the upp command on boot.

    To do so, I think you can use the following:

    [Unit]
    Description=Run my_user_script
    After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
    
    
    [Service]
    Type=oneshot
    ExecStart=upp -p /sys/class/drm/card1/device/pp_table set --write smc_pptable/SocketPowerLimitAc/0=312 smc_pptable/SocketPowerLimitDc/0=293 smc_pptable/TdcLimit/0=300 smc_pptable/FreqTableSocclk/1=1350 smc_pptable/FreqTableFclk/1=2000 smc_pptable/FclkBoostFreq=2000
    
    [Install]
    WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
    

    To configure this service:

    • Save the text (using sudo/root) to a new .service file in /etc/systemd/service. (e.g. /etc/systemd/system/my_update_pp.service)
    • run sudo systemctl daemon-reload to tell systemd to re-read the service files
    • run sudo systemctl restart my_update_pp.service to manually run the service
    • run sudo systemctl enable my_update_pp.service to tell systemd to run your service automatically on boot/wake (WantedBy tells systemd when it should include the unit/service, After, Wants, Requires, and Before help systemd decide the order to run all the units/services)

    Notes

    • Usually for simple systemd services, you can omit After and set WantedBy to just WantedBy=multi-user.target, but if you also need to run upp after sleep or hibernate, then you probably need something more complex. I copied the After and WantedBy from a stackexchange answer, but I haven’t tried using those targets before. You might have to add multi-user.target to the WantedBy list.
    • I don’t actually know if you need to run upp after sleep/hibernate. Running on boot might be sufficient.
    • I think you can skip the chmod if you run upp as sudo/root. Systemd system services run as root by default.
    • I don’t know how safe it is to mess with PowerPlay during boot. My gut says it’s probably fine, but it also seems like something that could cause graphics to not work. Tread carefully.

    References:

    • WereCat@lemmy.worldOP
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      3 hours ago

      Thanks a lot. I will look into this.

      Reason why I use chmod is because I cant for the life of me figure out why I can’t just use sudo. Even when I set environment variable for the upp.py it refuses to run it. Even when I directly want to run it via sudo it refuses, I can only run it without sudo for whatever reason… but to overwrite pp_table I need sudo privileges and I’ve been only able to get around with chmod.

      Also I’ve tried to make a script that I will just run and will execute the commands… but I get immediately hard lock and black screen and I need to do hard reset. Same when I try to copy and overwrite the pp_table with sudo priviledges with a pre-modified pp_table.

      So I’m kinda hesitant to now run the commands on runtime, it’s possible it will hardlock during boot. I will give it more though tommorrow.

      edit:

      I just found out how to write the pp_table into VBIOS so I will try flashing modified VBIOS on the card and hope it will work. I’ll leave that for tomorrow though.

  • sniggleboots@lemm.ee
    link
    fedilink
    arrow-up
    13
    ·
    7 hours ago

    For how long do you need to have been in the Linux space before pp table stops being funny? Because I’m new, and hehehehe

  • catloaf@lemm.ee
    link
    fedilink
    English
    arrow-up
    5
    ·
    8 hours ago

    Writing udev rules would probably be the best. I’ve never done this so I can’t give you a reference, but I’m sure if you search for info on writing udev rules to set sysfs params you’ll find them. Hopefully the contents of pp_table can be specified in text, not binary.

    • WereCat@lemmy.worldOP
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      5 hours ago

      Yes but you misunderstand the issue here. It’s not about whether LACT or CoreCTRL is better. They only allow you to work within the default limits. For example max power limit is 312W on my card and I can only go up to 312W in those applications. By editing pp_table I can increase it to whatever I want. What I’m doing by editing pp_table is going beyond those limits and whether I use one application or another it does not matter. Also I switched from CoreCtrl to LACT because CoreCtrl on GNOME can’t be minimized into tray so it was just annoying.

      Also I can edit FCLK, SOCclck, TDC limits, etc… those are things that are not available to be edited in CoreCTRL or LACT or even on Windows in MSI Afterburner or AMD Adrenaline Software.

      Basically, I can edit almost all of this to tune my OC as I wish:

      header:
        structuresize: 2470
        format_revision: 15
        content_revision: 0
      table_revision: 2
      table_size: 802
      golden_pp_id: 2466
      golden_revision: 16307
      format_id: 128
      platform_caps: 24
      thermal_controller_type: 28
      small_power_limit1: 0
      small_power_limit2: 0
      boost_power_limit: 0
      software_shutdown_temp: 118
      reserve:
        reserve 0: 0
        reserve 1: 0
        reserve 2: 0
        reserve 3: 0
        reserve 4: 0
        reserve 5: 0
        reserve 6: 1
        reserve 7: 0
      power_saving_clock:
        revision: 1
        reserve:
          reserve 0: 0
          reserve 1: 0
          reserve 2: 0
        count: 13
        max:
          max 0: 2577 (GFXCLK)
          max 1: 1200 (SOCCLK)
          max 2: 1000 (UCLK)
          max 3: 1940 (FCLK)
          max 4: 1225 (DCLK_0)
          max 5: 1400 (VCLK_0)
          max 6: 1225 (DCLK_1)
          max 7: 1400 (VCLK_1)
          max 8: 1200 (DCEFCLK)
          max 9: 1217 (DISPCLK)
          max 10: 1217 (PIXCLK)
          max 11: 810 (PHYCLK)
          max 12: 1217 (DTBCLK)
          max 13: 0
          max 14: 0
          max 15: 0
        min:
          min 0: 500 (GFXCLK)
          min 1: 480 (SOCCLK)
          min 2: 97 (UCLK)
          min 3: 550 (FCLK)
          min 4: 317 (DCLK_0)
          min 5: 363 (VCLK_0)
          min 6: 317 (DCLK_1)
          min 7: 363 (VCLK_1)
          min 8: 418 (DCEFCLK)
          min 9: 487 (DISPCLK)
          min 10: 487 (PIXCLK)
          min 11: 300 (PHYCLK)
          min 12: 487 (DTBCLK)
          min 13: 0
          min 14: 0
          min 15: 0
      overdrive_table:
        revision: 129
        reserve:
          reserve 0: 0
          reserve 1: 0
          reserve 2: 0
        feature_count: 16
        setting_count: 30
        cap:
          cap 0: 1 (GFXCLK_LIMITS)
          cap 1: 1 (GFXCLK_CURVE)
          cap 2: 1 (UCLK_LIMITS)
          cap 3: 1 (POWER_LIMIT)
          cap 4: 1 (FAN_ACOUSTIC_LIMIT)
          cap 5: 1 (FAN_SPEED_MIN)
          cap 6: 1 (TEMPERATURE_FAN)
          cap 7: 1 (TEMPERATURE_SYSTEM)
          cap 8: 1 (MEMORY_TIMING_TUNE)
          cap 9: 1 (FAN_ZERO_RPM_CONTROL)
          cap 10: 1 (AUTO_UV_ENGINE)
          cap 11: 1 (AUTO_OC_ENGINE)
          cap 12: 1 (AUTO_OC_MEMORY)
          cap 13: 1 (FAN_CURVE)
          cap 14: 0 (SMU_11_0_ODCAP_AUTO_FAN_ACOUSTIC_LIMIT)
          cap 15: 1 (POWER_MODE)
          cap 16: 0
          cap 17: 0
          cap 18: 0
          cap 19: 0
          cap 20: 0
          cap 21: 0
          cap 22: 0
          cap 23: 0
          cap 24: 0
          cap 25: 0
          cap 26: 0
          cap 27: 0
          cap 28: 0
          cap 29: 0
          cap 30: 0
          cap 31: 0
        max:
          max 0: 2800 (GFXCLKFMAX)
          max 1: 2800 (GFXCLKFMIN)
          max 2: 0 (CUSTOM_GFX_VF_CURVE_A)
          max 3: 0 (CUSTOM_GFX_VF_CURVE_B)
          max 4: 0 (CUSTOM_GFX_VF_CURVE_C)
          max 5: 2800 (CUSTOM_CURVE_VFT_FMIN)
          max 6: 1075 (UCLKFMIN)
          max 7: 1075 (UCLKFMAX)
          max 8: 15 (POWERPERCENTAGE)
          max 9: 3300 (FANRPMMIN)
          max 10: 3300 (FANRPMACOUSTICLIMIT)
          max 11: 100 (FANTARGETTEMPERATURE)
          max 12: 110 (OPERATINGTEMPMAX)
          max 13: 1 (ACTIMING)
          max 14: 1 (FAN_ZERO_RPM_CONTROL)
          max 15: 1 (AUTOUVENGINE)
          max 16: 1 (AUTOOCENGINE)
          max 17: 1 (AUTOOCMEMORY)
          max 18: 100 (FAN_CURVE_TEMPERATURE_1)
          max 19: 100 (FAN_CURVE_SPEED_1)
          max 20: 100 (FAN_CURVE_TEMPERATURE_2)
          max 21: 100 (FAN_CURVE_SPEED_2)
          max 22: 100 (FAN_CURVE_TEMPERATURE_3)
          max 23: 100 (FAN_CURVE_SPEED_3)
          max 24: 100 (FAN_CURVE_TEMPERATURE_4)
          max 25: 100 (FAN_CURVE_SPEED_4)
          max 26: 100 (FAN_CURVE_TEMPERATURE_5)
          max 27: 100 (FAN_CURVE_SPEED_5)
          max 28: 0 (AUTO_FAN_ACOUSTIC_LIMIT)
          max 29: 1 (POWER_MODE)
          max 30: 0
          max 31: 0
          max 32: 0
          max 33: 0
          max 34: 0
          max 35: 0
          max 36: 0
          max 37: 0
          max 38: 0
          max 39: 0
          max 40: 0
          max 41: 0
          max 42: 0
          max 43: 0
          max 44: 0
          max 45: 0
          max 46: 0
          max 47: 0
          max 48: 0
          max 49: 0
          max 50: 0
          max 51: 0
          max 52: 0
          max 53: 0
          max 54: 0
          max 55: 0
          max 56: 0
          max 57: 0
          max 58: 0
          max 59: 0
          max 60: 0
          max 61: 0
          max 62: 0
          max 63: 0
        min:
          min 0: 500 (GFXCLKFMAX)
          min 1: 500 (GFXCLKFMIN)
          min 2: 0 (CUSTOM_GFX_VF_CURVE_A)
          min 3: 0 (CUSTOM_GFX_VF_CURVE_B)
          min 4: 0 (CUSTOM_GFX_VF_CURVE_C)
          min 5: 500 (CUSTOM_CURVE_VFT_FMIN)
          min 6: 674 (UCLKFMIN)
          min 7: 674 (UCLKFMAX)
          min 8: 6 (POWERPERCENTAGE)
          min 9: 250 (FANRPMMIN)
          min 10: 1000 (FANRPMACOUSTICLIMIT)
          min 11: 25 (FANTARGETTEMPERATURE)
          min 12: 50 (OPERATINGTEMPMAX)
          min 13: 0 (ACTIMING)
          min 14: 0 (FAN_ZERO_RPM_CONTROL)
          min 15: 0 (AUTOUVENGINE)
          min 16: 0 (AUTOOCENGINE)
          min 17: 0 (AUTOOCMEMORY)
          min 18: 25 (FAN_CURVE_TEMPERATURE_1)
          min 19: 10 (FAN_CURVE_SPEED_1)
          min 20: 25 (FAN_CURVE_TEMPERATURE_2)
          min 21: 10 (FAN_CURVE_SPEED_2)
          min 22: 25 (FAN_CURVE_TEMPERATURE_3)
          min 23: 10 (FAN_CURVE_SPEED_3)
          min 24: 25 (FAN_CURVE_TEMPERATURE_4)
          min 25: 10 (FAN_CURVE_SPEED_4)
          min 26: 25 (FAN_CURVE_TEMPERATURE_5)
          min 27: 10 (FAN_CURVE_SPEED_5)
          min 28: 0 (AUTO_FAN_ACOUSTIC_LIMIT)
          min 29: 0 (POWER_MODE)
          min 30: 0
          min 31: 0
          min 32: 0
          min 33: 0
          min 34: 0
          min 35: 0
          min 36: 0
          min 37: 0
          min 38: 0
          min 39: 0
          min 40: 0
          min 41: 0
          min 42: 0
          min 43: 0
          min 44: 0
          min 45: 0
          min 46: 0
          min 47: 0
          min 48: 0
          min 49: 0
          min 50: 0
          min 51: 0
          min 52: 0
          min 53: 0
          min 54: 0
          min 55: 0
          min 56: 0
          min 57: 0
          min 58: 0
          min 59: 0
          min 60: 0
          min 61: 0
          min 62: 0
          min 63: 0
        pm_setting:
          pm_setting 0: 6
          pm_setting 1: 0
          pm_setting 2: 6
          pm_setting 3: 6
          pm_setting 4: 95
          pm_setting 5: 95
          pm_setting 6: 95
          pm_setting 7: 95
          pm_setting 8: 1650
          pm_setting 9: 1650
          pm_setting 10: 1750
          pm_setting 11: 1750
          pm_setting 12: 2000
          pm_setting 13: 2000
          pm_setting 14: 2250
          pm_setting 15: 2250
          pm_setting 16: 0
          pm_setting 17: 0
          pm_setting 18: 0
          pm_setting 19: 0
          pm_setting 20: 0
          pm_setting 21: 0
          pm_setting 22: 0
          pm_setting 23: 0
          pm_setting 24: 0
          pm_setting 25: 0
          pm_setting 26: 0
          pm_setting 27: 0
          pm_setting 28: 0
          pm_setting 29: 0
          pm_setting 30: 0
          pm_setting 31: 0
      smc_pptable:
        Version: 6
        FeaturesToRun:
          FeaturesToRun 0: 2743074303
          FeaturesToRun 1: 14179
        SocketPowerLimitAc:
          SocketPowerLimitAc 0: 312
          SocketPowerLimitAc 1: 0
          SocketPowerLimitAc 2: 0
          SocketPowerLimitAc 3: 0
        SocketPowerLimitAcTau:
          SocketPowerLimitAcTau 0: 0
          SocketPowerLimitAcTau 1: 0
          SocketPowerLimitAcTau 2: 0
          SocketPowerLimitAcTau 3: 0
        SocketPowerLimitDc:
          SocketPowerLimitDc 0: 293
          SocketPowerLimitDc 1: 0
          SocketPowerLimitDc 2: 0
          SocketPowerLimitDc 3: 0
        SocketPowerLimitDcTau:
          SocketPowerLimitDcTau 0: 0
          SocketPowerLimitDcTau 1: 0
          SocketPowerLimitDcTau 2: 0
          SocketPowerLimitDcTau 3: 0
        TdcLimit:
          TdcLimit 0: 300
          TdcLimit 1: 55
        TdcLimitTau:
          TdcLimitTau 0: 0
          TdcLimitTau 1: 0
        TemperatureLimit:
          TemperatureLimit 0: 100
          TemperatureLimit 1: 110
          TemperatureLimit 2: 100
          TemperatureLimit 3: 115
          TemperatureLimit 4: 115
          TemperatureLimit 5: 115
          TemperatureLimit 6: 115
          TemperatureLimit 7: 0
          TemperatureLimit 8: 0
          TemperatureLimit 9: 0
        FitLimit: 0
        TotalPowerConfig: 1
        TotalPowerPadding:
          TotalPowerPadding 0: 0
          TotalPowerPadding 1: 0
          TotalPowerPadding 2: 0
        ApccPlusResidencyLimit: 10
        SmnclkDpmFreq:
          SmnclkDpmFreq 0: 0
          SmnclkDpmFreq 1: 0
        SmnclkDpmVoltage:
          SmnclkDpmVoltage 0: 0
          SmnclkDpmVoltage 1: 0
        PaddingAPCC: 0
        PerPartDroopVsetGfxDfll:
          PerPartDroopVsetGfxDfll 0: 0
          PerPartDroopVsetGfxDfll 1: 0
          PerPartDroopVsetGfxDfll 2: 0
          PerPartDroopVsetGfxDfll 3: 0
          PerPartDroopVsetGfxDfll 4: 0
        PaddingPerPartDroop: 0
        ThrottlerControlMask: 14590
        FwDStateMask: 3955
        UlvVoltageOffsetSoc: 100
        UlvVoltageOffsetGfx: 100
        MinVoltageUlvGfx: 3425
        MinVoltageUlvSoc: 3700
        SocLIVmin: 0
        PaddingLIVmin: 0
        GceaLinkMgrIdleThreshold: 0
        paddingRlcUlvParams:
          paddingRlcUlvParams 0: 0
          paddingRlcUlvParams 1: 0
          paddingRlcUlvParams 2: 0
        MinVoltageGfx: 3525
        MinVoltageSoc: 3800
        MaxVoltageGfx: 4600
        MaxVoltageSoc: 4600
        LoadLineResistanceGfx: 64
        LoadLineResistanceSoc: 256
        VDDGFX_TVmin: 50
        VDDSOC_TVmin: 60
        VDDGFX_Vmin_HiTemp: 3525
        VDDGFX_Vmin_LoTemp: 3525
        VDDSOC_Vmin_HiTemp: 3800
        VDDSOC_Vmin_LoTemp: 3800
        VDDGFX_TVminHystersis: 20
        VDDSOC_TVminHystersis: 20```
      
      (sorry, IDK whats up with Lemmys formatting, everything is supposed to be in separate line).
      • vole@lemmy.world
        link
        fedilink
        English
        arrow-up
        2
        ·
        5 hours ago

        Use triple backticks for blocks of code-type stuff

        ```

        like so

        ```

        example, wrapped in a spoiler tag.
        upp -p /sys/class/drm/card1/device/pp_table dump
        header:
          structuresize: 2470
          format_revision: 15
          content_revision: 0
        table_revision: 2
        table_size: 802
        golden_pp_id: 2466
        golden_revision: 16307
        format_id: 128
        platform_caps: 24
        thermal_controller_type: 28
        small_power_limit1: 0
        small_power_limit2: 0
        boost_power_limit: 0
        software_shutdown_temp: 118
        reserve:
          reserve 0: 0
          reserve 1: 0
          reserve 2: 0
          reserve 3: 0
          reserve 4: 0
          reserve 5: 0
          reserve 6: 1
          reserve 7: 0
        power_saving_clock:
          revision: 1
          reserve:
        ... and so on ...